diff --git a/LICENSE.txt b/LICENSE.txt
index 30f548aa2e1b64135fe9b2b9a0a8baea1172f9b6..d91b95fe795772203ae9e9b650aafe7774404cba 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -83,7 +83,9 @@ Public domain except as listed below:
    Copyright (C) 2003-2010 Satoshi Konno
    See licenses/LICENSE-UPnP.txt
 
-   GeoIP data free to use, courtesy http://www.maxmind.com/
+   GeoIP: GeoLite databases are licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
+   http://creativecommons.org/licenses/by-sa/3.0/
+   This product includes GeoLite data created by MaxMind, available from http://www.maxmind.com/
 
 
 Installer:
diff --git a/apps/addressbook/java/src/net/i2p/addressbook/Daemon.java b/apps/addressbook/java/src/net/i2p/addressbook/Daemon.java
index 4ce2e4f7141295dde75a3dc218031c23328e455e..578a348e37437c6ccd717288a83a3a7a4ab1a211 100644
--- a/apps/addressbook/java/src/net/i2p/addressbook/Daemon.java
+++ b/apps/addressbook/java/src/net/i2p/addressbook/Daemon.java
@@ -230,7 +230,7 @@ public class Daemon {
      */
     public static void update(Map<String, String> settings, String home) {
         File published = null;
-        boolean should_publish = Boolean.valueOf(settings.get("should_publish")).booleanValue();
+        boolean should_publish = Boolean.parseBoolean(settings.get("should_publish"));
         if (should_publish) 
             published = new File(home, settings
                 .get("published_addressbook"));
@@ -261,7 +261,7 @@ public class Daemon {
 
         // If false, add hosts via naming service; if true, write hosts.txt file directly
         // Default false
-        if (Boolean.valueOf(settings.get("update_direct")).booleanValue()) {
+        if (Boolean.parseBoolean(settings.get("update_direct"))) {
             // Direct hosts.txt access
             File routerFile = new File(home, settings.get("router_addressbook"));
             AddressBook master;
diff --git a/apps/i2psnark/java/src/org/klomp/snark/BitField.java b/apps/i2psnark/java/src/org/klomp/snark/BitField.java
index 4fb6b28151e68a8dcc20ed145038154f4ef23b7e..3f16deb684da1b5100c2affc7bb79917e1eb4c11 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/BitField.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/BitField.java
@@ -39,7 +39,6 @@ public class BitField
     this.size = size;
     int arraysize = ((size-1)/8)+1;
     bitfield = new byte[arraysize];
-    this.count = 0;
   }
 
   /**
@@ -99,9 +98,11 @@ public class BitField
       throw new IndexOutOfBoundsException(Integer.toString(bit));
     int index = bit/8;
     int mask = 128 >> (bit % 8);
-    if ((bitfield[index] & mask) == 0) {
-      count++;
-      bitfield[index] |= mask;
+    synchronized(this) {
+        if ((bitfield[index] & mask) == 0) {
+            count++;
+            bitfield[index] |= mask;
+        }
     }
   }
 
diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
index 38ff07ced2a707ee5abd0206656932d11a171e64..1ef8cd302a5d3a48f65974a79719b4a6f3199f08 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
@@ -78,7 +78,7 @@ public class I2PSnarkUtil {
     public static final int DEFAULT_MAX_UP_BW = 8;  //KBps
     public static final int MAX_CONNECTIONS = 16; // per torrent
     public static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond";
-    public static final boolean DEFAULT_USE_DHT = false;
+    public static final boolean DEFAULT_USE_DHT = true;
 
     public I2PSnarkUtil(I2PAppContext ctx) {
         _context = ctx;
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
index 536865b0b053f387579c91a8a33efe495ed9547e..2869193a0a703344af2867123b60bcb884c26932 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
@@ -649,10 +649,15 @@ class PeerCoordinator implements PeerListener
     if (listener != null)
       listener.peerChange(this, peer);
 
-    synchronized(wantedPieces)
-      {
-        return wantedPieces.contains(new Piece(piece));
-      }
+    synchronized(wantedPieces) {
+        for (Piece pc : wantedPieces) {
+            if (pc.getId() == piece) {
+                pc.addPeer(peer);
+                return true;
+            }
+        }
+        return false;
+    }
   }
 
   /**
@@ -664,20 +669,17 @@ class PeerCoordinator implements PeerListener
     if (listener != null)
       listener.peerChange(this, peer);
 
-    synchronized(wantedPieces)
-      {
-        Iterator<Piece> it = wantedPieces.iterator();
-        while (it.hasNext())
-          {
-            Piece p = it.next();
+    boolean rv = false;
+    synchronized(wantedPieces) {
+        for (Piece p : wantedPieces) {
             int i = p.getId();
             if (bitfield.get(i)) {
               p.addPeer(peer);
-              return true;
+              rv = true;
             }
-          }
-      }
-    return false;
+        }
+    }
+    return rv;
   }
 
   /**
@@ -785,7 +787,8 @@ class PeerCoordinator implements PeerListener
         }
         if (record) {
             if (_log.shouldLog(Log.INFO))
-                _log.info(peer + " is now requesting: piece " + piece + " priority " + piece.getPriority());
+                _log.info("Now requesting from " + peer + ": piece " + piece + " priority " + piece.getPriority() +
+                          " peers " + piece.getPeerCount() + '/' + peers.size());
             piece.setRequested(peer, true);
         }
         return piece;
@@ -1077,8 +1080,7 @@ class PeerCoordinator implements PeerListener
    */
   public void removePeerFromPieces(Peer peer) {
       synchronized(wantedPieces) {
-          for(Iterator<Piece> iter = wantedPieces.iterator(); iter.hasNext(); ) {
-              Piece piece = iter.next();
+          for (Piece piece : wantedPieces) {
               piece.removePeer(peer);
           }
       } 
@@ -1172,11 +1174,24 @@ class PeerCoordinator implements PeerListener
                  for(Piece piece : wantedPieces) {
                      if (piece.getId() == savedPiece) {
                          if (peer.isCompleted() && piece.getPeerCount() > 1) {
-                             // Try to preserve rarest-first when we have only one seeder
-                             // by not preferring a partial piece that others have too
+                             // Try to preserve rarest-first
+                             // by not requesting a partial piece that non-seeders also have
                              // from a seeder
-                             skipped = true;
-                             break;
+                             boolean nonSeeds = false;
+                             for (Peer pr : peers) {
+                                 PeerState state = pr.state;
+                                 if (state == null) continue;
+                                 BitField bf = state.bitfield;
+                                 if (bf == null) continue;
+                                 if (bf.get(savedPiece) && !pr.isCompleted()) {
+                                     nonSeeds = true;
+                                     break;
+                                 }
+                             }
+                             if (nonSeeds) {
+                                 skipped = true;
+                                 break;
+                             }
                          }
                          iter.remove();
                          piece.setRequested(peer, true);
diff --git a/apps/i2psnark/java/src/org/klomp/snark/Piece.java b/apps/i2psnark/java/src/org/klomp/snark/Piece.java
index a9822640bf1bda472abf95c85d5713a83c727d9c..3ca03ad98865bbf976336ecd225ed86bc59bcc73 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Piece.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Piece.java
@@ -18,7 +18,7 @@ class Piece implements Comparable {
     
     public Piece(int id) {
         this.id = id;
-        this.peers = new HashSet(I2PSnarkUtil.MAX_CONNECTIONS);
+        this.peers = new HashSet(I2PSnarkUtil.MAX_CONNECTIONS / 2);
         // defer creating requests to save memory
     }
     
diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java
index c0781d7d8ab5f7adb63116cc0e0f93603dc988e7..f553f54d29f6f3086bd02899c1bbec796c0f1be6 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java
@@ -688,6 +688,22 @@ public class Snark
         starting = true;
     }
 
+    /**
+     *  File checking in progress.
+     *  @since 0.9.3
+     */
+    public boolean isChecking() {
+        return storage != null && storage.isChecking();
+    }
+
+    /**
+     *  Disk allocation (ballooning) in progress.
+     *  @since 0.9.3
+     */
+    public boolean isAllocating() {
+        return storage != null && storage.isAllocating();
+    }
+
     /**
      *  @since 0.8.4
      */
diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
index eed367e7a5fff955cdadffa4916bd88d628daa75..e0b56b140955a019560a10589626021a177bd902 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
@@ -200,11 +200,11 @@ public class SnarkManager implements Snark.CompleteListener {
      *  @since 0.8.9
      */
     public boolean areFilesPublic() {
-        return Boolean.valueOf(_config.getProperty(PROP_FILES_PUBLIC)).booleanValue();
+        return Boolean.parseBoolean(_config.getProperty(PROP_FILES_PUBLIC));
     }
 
     public boolean shouldAutoStart() {
-        return Boolean.valueOf(_config.getProperty(PROP_AUTO_START, DEFAULT_AUTO_START)).booleanValue();
+        return Boolean.parseBoolean(_config.getProperty(PROP_AUTO_START, DEFAULT_AUTO_START));
     }
 
 /****
@@ -384,11 +384,11 @@ public class SnarkManager implements Snark.CompleteListener {
         if (ot != null)
             _util.setOpenTrackers(getOpenTrackers());
         String useOT = _config.getProperty(PROP_USE_OPENTRACKERS);
-        boolean bOT = useOT == null || Boolean.valueOf(useOT).booleanValue();
+        boolean bOT = useOT == null || Boolean.parseBoolean(useOT);
         _util.setUseOpenTrackers(bOT);
         // careful, so we can switch default to true later
-        _util.setUseDHT(Boolean.valueOf(_config.getProperty(PROP_USE_DHT,
-                                          Boolean.toString(I2PSnarkUtil.DEFAULT_USE_DHT))).booleanValue());
+        _util.setUseDHT(Boolean.parseBoolean(_config.getProperty(PROP_USE_DHT,
+                                          Boolean.toString(I2PSnarkUtil.DEFAULT_USE_DHT))));
         getDataDir().mkdirs();
         initTrackerMap();
     }
@@ -707,7 +707,7 @@ public class SnarkManager implements Snark.CompleteListener {
     public Properties getConfig() { return _config; }
     
     /** hardcoded for sanity.  perhaps this should be customizable, for people who increase their ulimit, etc. */
-    private static final int MAX_FILES_PER_TORRENT = 512;
+    public static final int MAX_FILES_PER_TORRENT = 512;
     
     /**
      *  Set of canonical .torrent filenames that we are dealing with.
@@ -1370,6 +1370,8 @@ public class SnarkManager implements Snark.CompleteListener {
                     } catch (Exception e) {
                         _log.error("Error in the DirectoryMonitor", e);
                     }
+                    if (!_snarks.isEmpty())
+                        addMessage(_("Up bandwidth limit is {0} KBps", _util.getMaxUpBW()));
                 }
                 try { Thread.sleep(60*1000); } catch (InterruptedException ie) {}
             }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java
index 5ae23203a003e1367e90ddf09e7c2423401526ae..21e006f5e46b3662c1669ae089479cbbce4601d2 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java
@@ -32,6 +32,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import net.i2p.crypto.SHA1;
 import net.i2p.data.ByteArray;
@@ -45,7 +46,7 @@ import net.i2p.util.SystemVersion;
  */
 public class Storage
 {
-  private MetaInfo metainfo;
+  private final MetaInfo metainfo;
   private long[] lengths;
   private RandomAccessFile[] rafs;
   private String[] names;
@@ -69,6 +70,8 @@ public class Storage
   private final int pieces;
   private final long total_length;
   private boolean changed;
+  private volatile boolean _isChecking;
+  private final AtomicInteger _allocateCount = new AtomicInteger();
 
   /** The default piece size. */
   private static final int MIN_PIECE_SIZE = 256*1024;
@@ -89,17 +92,15 @@ public class Storage
    * Creates a new storage based on the supplied MetaInfo.  This will
    * try to create and/or check all needed files in the MetaInfo.
    *
-   * @exception IOException when creating and/or checking files fails.
+   * Does not check storage. Caller MUST call check()
    */
   public Storage(I2PSnarkUtil util, MetaInfo metainfo, StorageListener listener)
-    throws IOException
   {
     _util = util;
     _log = util.getContext().logManager().getLog(Storage.class);
     this.metainfo = metainfo;
     this.listener = listener;
     needed = metainfo.getPieces();
-    _probablyComplete = false;
     bitfield = new BitField(needed);
     piece_size = metainfo.getPieceLength(0);
     pieces = needed;
@@ -107,12 +108,15 @@ public class Storage
   }
 
   /**
-   * Creates a storage from the existing file or directory together
-   * with an appropriate MetaInfo file as can be announced on the
-   * given announce String location.
+   * Creates a storage from the existing file or directory.
+   * Creates an in-memory metainfo but does not save it to
+   * a file, caller must do that.
+   *
+   * Creates the metainfo, this may take a LONG time. BLOCKING.
    *
    * @param announce may be null
    * @param listener may be null
+   * @throws IOException when creating and/or checking files fails.
    */
   public Storage(I2PSnarkUtil util, File baseFile, String announce,
                  boolean privateTorrent, StorageListener listener)
@@ -135,6 +139,8 @@ public class Storage
 
     if (total <= 0)
         throw new IOException("Torrent contains no data");
+    if (total > MAX_TOTAL_SIZE)
+        throw new IOException("Torrent too big (" + total + " bytes), max is " + MAX_TOTAL_SIZE);
 
     int pc_size = MIN_PIECE_SIZE;
     int pcs = (int) ((total - 1)/pc_size) + 1;
@@ -170,6 +176,7 @@ public class Storage
         lengthsList = null;
       }
 
+    // TODO thread this so we can return and show something on the UI
     byte[] piece_hashes = fast_digestCreate();
     metainfo = new MetaInfo(announce, baseFile.getName(), null, files,
                             lengthsList, piece_size, piece_hashes, total, privateTorrent);
@@ -205,6 +212,8 @@ public class Storage
 
   private void getFiles(File base) throws IOException
   {
+    if (base.getAbsolutePath().equals("/"))
+        throw new IOException("Don't seed root");
     ArrayList files = new ArrayList();
     addFiles(files, base);
 
@@ -233,12 +242,15 @@ public class Storage
       }
   }
 
-  private void addFiles(List l, File f)
-  {
-    if (!f.isDirectory())
-      l.add(f);
-    else
-      {
+  /**
+   *  @throws IOException if too many total files
+   */
+  private void addFiles(List l, File f) throws IOException {
+    if (!f.isDirectory()) {
+        if (l.size() >= SnarkManager.MAX_FILES_PER_TORRENT)
+            throw new IOException("Too many files, limit is " + SnarkManager.MAX_FILES_PER_TORRENT + ", zip them?");
+        l.add(f);
+    } else {
         File[] files = f.listFiles();
         if (files == null)
           {
@@ -284,6 +296,23 @@ public class Storage
       return changed;
   }
 
+  /**
+   *  File checking in progress.
+   *  @since 0.9.3
+   */
+  public boolean isChecking() {
+      return _isChecking;
+  }
+
+  /**
+   *  Disk allocation (ballooning) in progress.
+   *  Always false on Windows.
+   *  @since 0.9.3
+   */
+  public boolean isAllocating() {
+      return _allocateCount.get() > 0;
+  }
+
   /**
    *  @param file canonical path (non-directory)
    *  @return number of bytes remaining; -1 if unknown file
@@ -703,11 +732,25 @@ public class Storage
    * This is called at the beginning, and at presumed completion,
    * so we have to be careful about locking.
    *
+   * TODO thread the checking so we can return and display
+   * something on the UI
+   *
    * @param recheck if true, this is a check after we downloaded the
    *        last piece, and we don't modify the global bitfield unless
    *        the check fails.
    */
-  private void checkCreateFiles(boolean recheck) throws IOException
+  private void checkCreateFiles(boolean recheck) throws IOException {
+      synchronized(this) {
+          _isChecking = true;
+          try {
+              locked_checkCreateFiles(recheck);
+          } finally {
+              _isChecking = false;
+          }
+      }
+  }
+
+  private void locked_checkCreateFiles(boolean recheck) throws IOException
   {
     // Whether we are resuming or not,
     // if any of the files already exists we assume we are resuming.
@@ -867,10 +910,19 @@ public class Storage
     final int ZEROBLOCKSIZE = (int) Math.min(remaining, 32*1024);
     byte[] zeros = new byte[ZEROBLOCKSIZE];
     rafs[nr].seek(0);
-    while (remaining > 0) {
-        int size = (int) Math.min(remaining, ZEROBLOCKSIZE);
-        rafs[nr].write(zeros, 0, size);
-        remaining -= size;
+    // don't bother setting flag for small files
+    if (remaining > 20*1024*1024)
+        _allocateCount.incrementAndGet();
+    try {
+        while (remaining > 0) {
+            int size = (int) Math.min(remaining, ZEROBLOCKSIZE);
+            rafs[nr].write(zeros, 0, size);
+            remaining -= size;
+        }
+    } finally {
+        remaining = lengths[nr];
+        if (remaining > 20*1024*1024)
+            _allocateCount.decrementAndGet();
     }
     isSparse[nr] = false;
   }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
index 731c43727798344f0afcf253caa8dbbb8d9a4325..7283b14be1d5e1da6ee078a02d5a6fd92c65ae6e 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -609,6 +609,7 @@ public class I2PSnarkServlet extends DefaultServlet {
                             MetaInfo meta = snark.getMetaInfo();
                             if (meta == null) {
                                 // magnet - remove and delete are the same thing
+                                // Remove not shown on UI so we shouldn't get here
                                 _manager.deleteMagnet(snark);
                                 _manager.addMessage(_("Magnet deleted: {0}", name));
                                 return;
@@ -637,7 +638,10 @@ public class I2PSnarkServlet extends DefaultServlet {
                             if (meta == null) {
                                 // magnet - remove and delete are the same thing
                                 _manager.deleteMagnet(snark);
-                                _manager.addMessage(_("Magnet deleted: {0}", name));
+                                if (snark instanceof FetchAndAdd)
+                                    _manager.addMessage(_("Download deleted: {0}", name));
+                                else
+                                    _manager.addMessage(_("Magnet deleted: {0}", name));
                                 return;
                             }
                             _manager.stopTorrent(snark, true);
@@ -739,6 +743,7 @@ public class I2PSnarkServlet extends DefaultServlet {
                     try {
                         // This may take a long time to check the storage, but since it already exists,
                         // it shouldn't be THAT bad, so keep it in this thread.
+                        // TODO thread it for big torrents, perhaps a la FetchAndAdd
                         boolean isPrivate = _manager.getPrivateTrackers().contains(announceURL);
                         Storage s = new Storage(_manager.util(), baseFile, announceURL, isPrivate, null);
                         s.close(); // close the files... maybe need a way to pass this Storage to addTorrent rather than starting over
@@ -988,7 +993,13 @@ public class I2PSnarkServlet extends DefaultServlet {
         
         String rowClass = (row % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd");
         String statusString;
-        if (err != null) {
+        if (snark.isChecking()) {
+            statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "stalled.png\" title=\"" + _("Checking") + "\"></td>" +
+                           "<td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Checking");
+        } else if (snark.isAllocating()) {
+            statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "stalled.png\" title=\"" + _("Allocating") + "\"></td>" +
+                           "<td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Allocating");
+        } else if (err != null) {
             if (isRunning && curPeers > 0 && !showPeers)
                 statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "trackererror.png\" title=\"" + err + "\"></td>" +
                                "<td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Tracker Error") +
@@ -1170,7 +1181,9 @@ public class I2PSnarkServlet extends DefaultServlet {
         String b64 = Base64.encode(snark.getInfoHash());
         if (showPeers)
             parameters = parameters + "&p=1";
-        if (isRunning) {
+        if (snark.isChecking()) {
+            // show no buttons
+        } else if (isRunning) {
             // Stop Button
             if (isDegraded)
                 out.write("<a href=\"/i2psnark/?action=Stop_" + b64 + "&amp;nonce=" + _nonce + "\"><img title=\"");
diff --git a/apps/i2psnark/locale/messages_cs.po b/apps/i2psnark/locale/messages_cs.po
index ed8bca2b1fd7ffd84faf1bbbfddcb30ac9b9eae7..3f0f45a7a57ad61dff9bd1e9a0f385715fff4143 100644
--- a/apps/i2psnark/locale/messages_cs.po
+++ b/apps/i2psnark/locale/messages_cs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-02-17 11:41+0000\n"
+"POT-Creation-Date: 2012-09-12 11:58+0000\n"
 "PO-Revision-Date: 2012-02-12 20:06+0000\n"
 "Last-Translator: Waseihou Watashi <waseihou@gmail.com>\n"
 "Language-Team: Czech (http://www.transifex.net/projects/p/I2P/language/cs/)\n"
@@ -18,420 +18,535 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:355
+#: ../java/src/org/klomp/snark/SnarkManager.java:434
 #, java-format
 msgid "Total uploaders limit changed to {0}"
 msgstr "Celkový limit sdílečů změněn na {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:357
+#: ../java/src/org/klomp/snark/SnarkManager.java:436
 #, java-format
 msgid "Minimum total uploaders limit is {0}"
 msgstr "Nejmenší celkový limit sdílečů je {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:369
+#: ../java/src/org/klomp/snark/SnarkManager.java:448
 #, java-format
 msgid "Up BW limit changed to {0}KBps"
 msgstr "Horní BW limit změněn na {0}KBps"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:371
+#: ../java/src/org/klomp/snark/SnarkManager.java:450
 #, java-format
 msgid "Minimum up bandwidth limit is {0}KBps"
 msgstr "Nejmenší horní limit přenosové rychlist je {0}KBps"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:383
+#: ../java/src/org/klomp/snark/SnarkManager.java:462
 #, java-format
 msgid "Startup delay changed to {0}"
 msgstr "Prodleva při startu změněna na {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:394
+#: ../java/src/org/klomp/snark/SnarkManager.java:473
 #, java-format
 msgid "Refresh time changed to {0}"
 msgstr "Doba aktualizace stavu (refresh time) změněna na {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:396
+#: ../java/src/org/klomp/snark/SnarkManager.java:475
 msgid "Refresh disabled"
 msgstr "Aktualizace stavu vypnuta"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:451
+#: ../java/src/org/klomp/snark/SnarkManager.java:530
 msgid "I2CP and tunnel changes will take effect after stopping all torrents"
 msgstr "Změny I2CP a tunelu se projeví až po zastavení všech torrentů"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:455
+#: ../java/src/org/klomp/snark/SnarkManager.java:534
 #, java-format
 msgid "I2CP options changed to {0}"
 msgstr "Nastavení (options) I2CP změněno na {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:460
+#: ../java/src/org/klomp/snark/SnarkManager.java:539
 msgid "Disconnecting old I2CP destination"
 msgstr "Odpojuji se od starého I2CP cíle"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:462
+#: ../java/src/org/klomp/snark/SnarkManager.java:541
 #, java-format
 msgid "I2CP settings changed to {0}"
 msgstr "Nastavení (settings) I2CP změněno na {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:467
+#: ../java/src/org/klomp/snark/SnarkManager.java:546
 msgid ""
 "Unable to connect with the new settings, reverting to the old I2CP settings"
 msgstr "Nemůžu se připojit s novým nastavením I2CP, vracím se k předhozímu."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:471
+#: ../java/src/org/klomp/snark/SnarkManager.java:550
 msgid "Unable to reconnect with the old settings!"
 msgstr "Nemohu se opětovně připojit ani s předchozím nastavením!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:473
+#: ../java/src/org/klomp/snark/SnarkManager.java:552
 msgid "Reconnected on the new I2CP destination"
 msgstr "Opětovně připojeno k novému I2CP cíli"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:480
+#: ../java/src/org/klomp/snark/SnarkManager.java:559
 #, java-format
 msgid "I2CP listener restarted for \"{0}\""
 msgstr "I2CP listener restartován pro \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:492
+#: ../java/src/org/klomp/snark/SnarkManager.java:571
 msgid "New files will be publicly readable"
 msgstr "Nové soubory budou veřejně přístupné"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:494
+#: ../java/src/org/klomp/snark/SnarkManager.java:573
 msgid "New files will not be publicly readable"
 msgstr "Nové soubory nebudou veřejně přístupné"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:501
+#: ../java/src/org/klomp/snark/SnarkManager.java:580
 msgid "Enabled autostart"
 msgstr "Automatické spuštění zapnuto"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:503
+#: ../java/src/org/klomp/snark/SnarkManager.java:582
 msgid "Disabled autostart"
 msgstr "Automatické spuštění vypnuto"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:509
+#: ../java/src/org/klomp/snark/SnarkManager.java:588
 msgid "Enabled open trackers - torrent restart required to take effect."
 msgstr "Zapnuto automatické spuštění"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:511
+#: ../java/src/org/klomp/snark/SnarkManager.java:590
 msgid "Disabled open trackers - torrent restart required to take effect."
 msgstr ""
 "Otevřené trackery vypnuty - aby se změna projevila je nutné restartovat "
 "všechny torrenty"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:519
-msgid "Open Tracker list changed - torrent restart required to take effect."
+#: ../java/src/org/klomp/snark/SnarkManager.java:597
+msgid "Enabled DHT."
 msgstr ""
-"Seznam otevřených trackerů změněn - aby se změna projevila je nutné "
-"restartovat všechny torrenty"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:526
+#: ../java/src/org/klomp/snark/SnarkManager.java:599
+msgid "Disabled DHT."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:601
+msgid "DHT change requires tunnel shutdown and reopen"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:608
 #, java-format
 msgid "{0} theme loaded, return to main i2psnark page to view."
 msgstr "Téma {0} bylo nahráno, přejděte prosím na hlavní stránku i2snark"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:533
+#: ../java/src/org/klomp/snark/SnarkManager.java:615
 msgid "Configuration unchanged."
 msgstr "Nastavení nebylo změněno."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:543
+#: ../java/src/org/klomp/snark/SnarkManager.java:647
+msgid "Open Tracker list changed - torrent restart required to take effect."
+msgstr ""
+"Seznam otevřených trackerů změněn - aby se změna projevila je nutné "
+"restartovat všechny torrenty"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:657
+msgid "Private tracker list changed - affects newly created torrents only."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:703
 #, java-format
 msgid "Unable to save the config to {0}"
 msgstr "Nemůžu uložit soubor s nastavením do souboru {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:608
+#: ../java/src/org/klomp/snark/SnarkManager.java:768
 msgid "Connecting to I2P"
 msgstr "Připojuji se k I2P"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:611
+#: ../java/src/org/klomp/snark/SnarkManager.java:771
 msgid "Error connecting to I2P - check your I2CP settings!"
 msgstr ""
 "Při připojování k I2P nastala chyba, zkontrolujte prosím nastavení I2CP!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:620
+#: ../java/src/org/klomp/snark/SnarkManager.java:780
 #, java-format
 msgid "Error: Could not add the torrent {0}"
 msgstr "Chyba: nepodařilo se přidat torrent {0}"
 
 #. catch this here so we don't try do delete it below
-#: ../java/src/org/klomp/snark/SnarkManager.java:642
+#: ../java/src/org/klomp/snark/SnarkManager.java:802
 #, java-format
 msgid "Cannot open \"{0}\""
 msgstr "Nejde otevřít \"{0}\""
 
 #. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
-#: ../java/src/org/klomp/snark/SnarkManager.java:661
-#: ../java/src/org/klomp/snark/SnarkManager.java:737
-#: ../java/src/org/klomp/snark/SnarkManager.java:792
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2048
+#: ../java/src/org/klomp/snark/SnarkManager.java:821
+#: ../java/src/org/klomp/snark/SnarkManager.java:899
+#: ../java/src/org/klomp/snark/SnarkManager.java:980
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:159
 #, java-format
 msgid "Torrent with this info hash is already running: {0}"
 msgstr "Torrent s tímto infohašišem již běží: {0}"
 
-#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName()));
-#: ../java/src/org/klomp/snark/SnarkManager.java:668
-#, java-format
+#: ../java/src/org/klomp/snark/SnarkManager.java:827
+#, fuzzy, java-format
+msgid "ERROR - No I2P trackers in private torrent \"{0}\""
+msgstr "CHYBA - nedostatek paměti, nemohu vytvořit torrent z {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:829
+#, fuzzy, java-format
 msgid ""
-"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers "
-"only."
+"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and "
+"DHT only."
 msgstr ""
 "Varování - v \"{0}\" nebyly nalezeny žádné I2P trackery, budou použity pouze "
 "otevrené I2P trackery."
 
-#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName()));
-#: ../java/src/org/klomp/snark/SnarkManager.java:673
-#, java-format
+#: ../java/src/org/klomp/snark/SnarkManager.java:832
+#, fuzzy, java-format
+msgid ""
+"Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will "
+"announce to DHT only."
+msgstr ""
+"Varování - v \"{0}\" nebyly nalezeny žádné I2P trackery, budou použity pouze "
+"otevrené I2P trackery."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:834
+#, fuzzy, java-format
 msgid ""
-"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is "
-"enabled before starting this torrent."
+"Warning - No I2P trackers in \"{0}\", and DHT and open trackers are "
+"disabled, you should enable open trackers or DHT before starting the torrent."
 msgstr ""
 "Varování - v \"{0}\" nebyly nalezeny žádné I2P trackery, před spuštěním "
 "tohoto torrentu se ujistěte že otevřené trackery jsou povoleny."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:694
+#: ../java/src/org/klomp/snark/SnarkManager.java:856
 #, java-format
 msgid "Torrent in \"{0}\" is invalid"
 msgstr "Torrent v \"{0}\" je chybný"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:699
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070
+#: ../java/src/org/klomp/snark/SnarkManager.java:861
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:181
 #, java-format
 msgid "ERROR - Out of memory, cannot create torrent from {0}"
 msgstr "CHYBA - nedostatek paměti, nemohu vytvořit torrent z {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:711
+#: ../java/src/org/klomp/snark/SnarkManager.java:873
 #, java-format
 msgid "Torrent added and started: \"{0}\""
 msgstr "Torrent přidán a spuštěn: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:713
+#: ../java/src/org/klomp/snark/SnarkManager.java:875
 #, java-format
 msgid "Torrent added: \"{0}\""
 msgstr "Torrent přidán:  \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:748
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:499
+#: ../java/src/org/klomp/snark/SnarkManager.java:910
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:87
 #, java-format
 msgid "Fetching {0}"
 msgstr "Získávám {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:751
-#, java-format
+#: ../java/src/org/klomp/snark/SnarkManager.java:916
+#, fuzzy, java-format
 msgid ""
-"We have no saved peers and no other torrents are running. Fetch of {0} will "
-"not succeed until you start another torrent."
+"Open trackers are disabled and we have no DHT peers. Fetch of {0} may not "
+"succeed until you start another torrent, enable open trackers, or enable DHT."
 msgstr ""
 "Nejsou uloženi žádní sdíleči a žádné další torrenty neběží. Získání {0} "
 "neuspěje dokud nespustíte nějaký další torrent."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:755
+#: ../java/src/org/klomp/snark/SnarkManager.java:920
 #, java-format
 msgid "Adding {0}"
 msgstr "Přídávám {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:802
-#: ../java/src/org/klomp/snark/SnarkManager.java:825
-#: ../java/src/org/klomp/snark/SnarkManager.java:1260
+#: ../java/src/org/klomp/snark/SnarkManager.java:951
+#, fuzzy, java-format
+msgid "Download already running: {0}"
+msgstr "Torrent s tímto infohašišem již běží: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:990
+#: ../java/src/org/klomp/snark/SnarkManager.java:1013
+#: ../java/src/org/klomp/snark/SnarkManager.java:1449
 #, java-format
 msgid "Failed to copy torrent file to {0}"
 msgstr "Chyba: nepodařilo se zkopírovat soubor torrentu do {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1052
+#: ../java/src/org/klomp/snark/SnarkManager.java:1240
 #, java-format
 msgid "Too many files in \"{0}\" ({1}), deleting it!"
 msgstr "V \"{0}\" ({1}) je příliš mnoho souborů, mažu je!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1054
+#: ../java/src/org/klomp/snark/SnarkManager.java:1242
 #, java-format
 msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
 msgstr "Jméno souboru torrentu \"{0}\" nemůže končit na \".torrent\", mažu ho!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1056
+#: ../java/src/org/klomp/snark/SnarkManager.java:1244
 #, java-format
 msgid "No pieces in \"{0}\",  deleting it!"
 msgstr "\"{0}\" neobsahuje žádné části, mažu to!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1058
+#: ../java/src/org/klomp/snark/SnarkManager.java:1246
 #, java-format
 msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
 msgstr "Příliš mnoho částí v \"{0}\", maximum je {1}, mažu to!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1060
+#: ../java/src/org/klomp/snark/SnarkManager.java:1248
 #, java-format
 msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
 msgstr ""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1061
+#: ../java/src/org/klomp/snark/SnarkManager.java:1249
 #, java-format
 msgid "Limit is {0}B"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1063
+#: ../java/src/org/klomp/snark/SnarkManager.java:1251
 #, java-format
 msgid "Torrent \"{0}\" has no data, deleting it!"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1071
+#: ../java/src/org/klomp/snark/SnarkManager.java:1259
 #, java-format
 msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
 msgstr ""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1087
+#: ../java/src/org/klomp/snark/SnarkManager.java:1275
 #, java-format
 msgid "Error: Could not remove the torrent {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1108
-#: ../java/src/org/klomp/snark/SnarkManager.java:1126
+#: ../java/src/org/klomp/snark/SnarkManager.java:1296
+#: ../java/src/org/klomp/snark/SnarkManager.java:1314
 #, java-format
 msgid "Torrent stopped: \"{0}\""
 msgstr ""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1147
+#: ../java/src/org/klomp/snark/SnarkManager.java:1335
 #, java-format
 msgid "Torrent removed: \"{0}\""
 msgstr ""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1155
+#: ../java/src/org/klomp/snark/SnarkManager.java:1343
 #, java-format
 msgid "Adding torrents in {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1208
+#: ../java/src/org/klomp/snark/SnarkManager.java:1394
 #, java-format
 msgid "Download finished: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1256
+#: ../java/src/org/klomp/snark/SnarkManager.java:1445
 #, java-format
 msgid "Metainfo received for {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1257
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534
+#: ../java/src/org/klomp/snark/SnarkManager.java:1446
+#: ../java/src/org/klomp/snark/SnarkManager.java:1669
 #, java-format
 msgid "Starting up torrent {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1313
+#: ../java/src/org/klomp/snark/SnarkManager.java:1461
+#, fuzzy, java-format
+msgid "Error on torrent {0}"
+msgstr "Chyba: nepodařilo se přidat torrent {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1487
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1792
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1802
+msgid "Magnet"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1518
 msgid "Unable to connect to I2P!"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:1319
+#: ../java/src/org/klomp/snark/SnarkManager.java:1524
 #, java-format
 msgid "Unable to add {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
+#: ../java/src/org/klomp/snark/SnarkManager.java:1668
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:124
+msgid "Opening the I2P tunnel"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1692
+msgid "Opening the I2P tunnel and starting all torrents."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1747
+msgid "Stopping all torrents and closing the I2P tunnel."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1766
+msgid "Closing I2P tunnel after notifying trackers."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1773
+#: ../java/src/org/klomp/snark/SnarkManager.java:1784
+msgid "I2P tunnel closed."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/TrackerClient.java:227
+#, java-format
+msgid "No valid trackers for {0} - enable opentrackers or DHT?"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:75
+#, fuzzy, java-format
+msgid "Download torrent file from {0}"
+msgstr "Chyba: nepodařilo se zkopírovat soubor torrentu do {0}"
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:97
+#, java-format
+msgid "Torrent was not retrieved from {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:150
+#, java-format
+msgid "Torrent fetched from {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:171
+#, java-format
+msgid "Torrent already running: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:173
+#, java-format
+msgid "Torrent already in the queue: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:179
+#, java-format
+msgid "Torrent at {0} was not valid"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:223
 msgid "I2PSnark - Anonymous BitTorrent Client"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:236
+msgid "Router is down"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:251
 msgid "Torrents"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:224
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:231
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1053
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:254
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:261
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1254
 msgid "I2PSnark"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258
 msgid "Refresh page"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:233
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:263
 msgid "Forum"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:251
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:276
 msgid "Click \"Add torrent\" button to fetch torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1791
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
+msgid "clear messages"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:338
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2248
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2250
 msgid "Status"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:296
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:298
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:347
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:349
 msgid "Hide Peers"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:303
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:305
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:354
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:356
 msgid "Show Peers"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1724
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:363
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2118
 msgid "Torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:316
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:370
 msgid "Estimated time remaining"
 msgstr ""
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:373
 msgid "ETA"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:323
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378
 msgid "Downloaded"
 msgstr ""
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381
 msgid "RX"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:330
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:386
 msgid "Uploaded"
 msgstr ""
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:333
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:350
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:389
 msgid "TX"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:338
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:395
 msgid "Down Rate"
 msgstr ""
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:352
-msgid "Rate"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:398
+msgid "RX Rate"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
 msgid "Up Rate"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
+msgid "TX Rate"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:430
 msgid "Stop all torrents and the I2P tunnel"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:374
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:432
 msgid "Stop All"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:383
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:441
 msgid "Start all torrents and the I2P tunnel"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:385
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:443
 msgid "Start All"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:463
 msgid "No torrents loaded."
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:409
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:468
 msgid "Totals"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:411
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470
 #, java-format
 msgid "1 torrent"
 msgid_plural "{0} torrents"
@@ -439,7 +554,7 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:414
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:473
 #, java-format
 msgid "1 connected peer"
 msgid_plural "{0} connected peers"
@@ -447,101 +562,132 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:498
-msgid "Opening the I2P tunnel"
-msgstr ""
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:479
+#, java-format
+msgid "1 DHT peer"
+msgid_plural "{0} DHT peers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:505
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572
 #, java-format
 msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:553
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:640
 #, java-format
 msgid "Magnet deleted: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:561
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:621
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646
 #, java-format
 msgid "Torrent file deleted: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:592
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:603
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:652
 #, java-format
 msgid "Data file deleted: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:594
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:654
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:665
 #, java-format
 msgid "Data file could not be deleted: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:624
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:689
+#, java-format
+msgid "Directory could not be deleted: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687
 #, java-format
-msgid "Data dir deleted: {0}"
+msgid "Directory deleted: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734
 msgid "Error creating torrent - you must select a tracker"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:750
 #, java-format
 msgid "Torrent created for \"{0}\""
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:752
 #, java-format
 msgid ""
 "Many I2P trackers require you to register new torrents before seeding - "
 "please do so before starting \"{0}\""
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:682
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:754
 #, java-format
 msgid "Error creating a torrent for \"{0}\""
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:685
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:757
 #, java-format
 msgid "Cannot create a torrent for the nonexistent data: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:688
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:760
 msgid "Error creating torrent - you must enter a file or directory"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691
-msgid "Stopping all torrents and closing the I2P tunnel."
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
+msgid "Delete selected"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:702
-msgid "I2P tunnel closed."
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759
+msgid "Save tracker configuration"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:705
-msgid "Opening the I2P tunnel and starting all torrents."
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792
+msgid "Removed"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1757
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762
+msgid "Add tracker"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:844
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847
+msgid "Enter valid tracker name and URLs"
+msgstr ""
+
+#. "<input type=\"reset\" class=\"cancel\" value=\"").append(_("Cancel")).append("\">\n" +
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1761
+msgid "Restore defaults"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
+msgid "Restored default trackers"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:827
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:832
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:994
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1000
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1007
 msgid "Tracker Error"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:830
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:846
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:850
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:858
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:867
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:871
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:997
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1002
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1030
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1046
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1051
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062
 #, java-format
 msgid "1 peer"
 msgid_plural "{0} peers"
@@ -549,318 +695,357 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1010
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1011
+msgid "Starting"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019
 msgid "Seeding"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1023
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1038
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2305
 msgid "Complete"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:860
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1048
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049
 msgid "OK"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:864
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:869
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1053
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1059
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1060
 msgid "Stalled"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:873
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1064
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1065
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069
 msgid "No Peers"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:878
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1071
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1072
 msgid "Stopped"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105
 msgid "Torrent details"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1187
-msgid "Info"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134
 msgid "View files"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:940
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1136
 msgid "Open file"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1179
 msgid "Stop the torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:984
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1181
 msgid "Stop"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:994
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193
 msgid "Start the torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:996
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1195
 msgid "Start"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1007
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207
 msgid "Remove the torrent from the active list, deleting the .torrent file"
 msgstr ""
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
-#. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1012
+#. Then the remaining single quote must be escaped
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1212
 #, java-format
 msgid ""
 "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
 "data will not be deleted) ?"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1015
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1215
 msgid "Remove"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1026
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1227
 msgid "Delete the .torrent file and the associated data file(s)"
 msgstr ""
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
-#. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1031
+#. Then the remaining single quote must be escaped
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1232
 #, java-format
 msgid ""
 "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
 "data?"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1725
 msgid "Delete"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270
 msgid "Unknown"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1081
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1282
 msgid "Seed"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1104
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1305
 msgid "Uninteresting (The peer has no pieces we need)"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1106
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1307
 msgid "Choked (The peer is not allowing us to request pieces)"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1126
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1327
 msgid "Uninterested (We have no pieces the peer needs)"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1128
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1329
 msgid "Choking (We are not allowing the peer to request pieces)"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1383
 #, java-format
 msgid "Details at {0} tracker"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1399
+msgid "Info"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1427
 msgid "Add Torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1218
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1429
 msgid "From URL"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1221
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1432
 msgid ""
-"Enter the torrent file download URL (I2P only), magnet link, or maggot link"
+"Enter the torrent file download URL (I2P only), magnet link, maggot link, or "
+"info hash"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1437
 msgid "Add torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1440
 #, java-format
 msgid "You can also copy .torrent files to: {0}."
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1442
 msgid "Removing a .torrent will cause it to stop."
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1254
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1465
 msgid "Create Torrent"
 msgstr ""
 
 #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1468
 msgid "Data to seed"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1472
 msgid "File or directory to seed (must be within the specified path)"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1474
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140
 msgid "Tracker"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1265
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1476
 msgid "Select a tracker"
 msgstr ""
 
 #. out.write(_("Open trackers and DHT only"));
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1481
 msgid "Open trackers only"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285
-msgid "or"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288
-msgid "Specify custom tracker announce URL"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498
 msgid "Create torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1771
 msgid "Configuration"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1316
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526
 msgid "Data directory"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1318
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528
 msgid "Edit i2psnark.config and restart to change"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1322
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532
 msgid "Files readable by all"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536
 msgid "If checked, other users may access the downloaded files"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1330
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1540
 msgid "Auto start"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1334
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544
 msgid "If checked, automatically start torrents that are added"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548
 msgid "Theme"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561
 msgid "Refresh time"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1364
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1574
 msgid "Never"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580
 msgid "Startup delay"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1372
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1582
 msgid "minutes"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1396
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1606
 msgid "Total uploader limit"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1399
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1609
 msgid "peers"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1403
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1613
 msgid "Up bandwidth limit"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1616
 msgid "Half available bandwidth recommended."
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1408
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1618
 msgid "View or change router bandwidth"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1412
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1622
 msgid "Use open trackers also"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1416
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1626
 msgid ""
 "If checked, announce torrents to open trackers as well as the tracker listed "
 "in the torrent file"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
-msgid "Open tracker announce URLs"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1630
+msgid "Enable DHT"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1432
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1634
+msgid "If checked, use DHT"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1650
 msgid "Inbound Settings"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1438
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1656
 msgid "Outbound Settings"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1446
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1664
 msgid "I2CP host"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1451
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669
 msgid "I2CP port"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1466
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
 msgid "I2CP options"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1471
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1689
 msgid "Save configuration"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1496
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1703
+msgid "Trackers"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708
+msgid "Name"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1710
+msgid "Website URL"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2343
+msgid "Open"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
+msgid "Private"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
+msgid "Announce URL"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750
+msgid "Add"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1787
 #, java-format
 msgid "Invalid magnet URL {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1821
 #, java-format
 msgid "Invalid info hash in magnet URL {0}"
 msgstr ""
 
 #. * dummies for translation
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1945
 #, java-format
 msgid "1 hop"
 msgid_plural "{0} hops"
@@ -868,7 +1053,7 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1946
 #, java-format
 msgid "1 tunnel"
 msgid_plural "{0} tunnels"
@@ -876,113 +1061,87 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728
-msgid "Completion"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2127
+msgid "Torrent file"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2162
+msgid "Magnet link"
 msgstr ""
 
-#. else unknown
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1788
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169
+msgid "Private torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2242
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2244
 msgid "Size"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1737
-msgid "Files"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2185
+msgid "Completion"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1739
-msgid "Pieces"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195
+msgid "Remaining"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1740
-msgid "Piece size"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2202
+msgid "Files"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762
-msgid "Magnet link"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2207
+msgid "Pieces"
 msgstr ""
 
-#. We don't have the hash of the torrent file
-#. buf.append("<br>").append(_("Maggot link")).append(": <a href=\"").append(MAGGOT).append(hex).append(':').append(hex).append("\">")
-#. .append(MAGGOT).append(hex).append(':').append(hex).append("</a>");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1768
-msgid "Torrent file"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2211
+msgid "Piece size"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1786
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2234
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2238
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288
 msgid "Directory"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1795
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2255
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2257
 msgid "Priority"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1800
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263
 msgid "Up to higher level directory"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1830
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2293
 msgid "Torrent not found?"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1839
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2302
 msgid "File not found in torrent?"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1852
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2315
 msgid "complete"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853
-msgid "bytes remaining"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2316
+msgid "remaining"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1878
-msgid "Open"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1904
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370
 msgid "High"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1909
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2375
 msgid "Normal"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1914
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2380
 msgid "Skip"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1923
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2389
 msgid "Save priorities"
 msgstr ""
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2039
-#, java-format
-msgid "Torrent fetched from {0}"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2060
-#, java-format
-msgid "Torrent already running: {0}"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062
-#, java-format
-msgid "Torrent already in the queue: {0}"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068
-#, java-format
-msgid "Torrent at {0} was not valid"
-msgstr ""
-
-#. FIXME don't lose peer setting
-#. String peerParam = req.getParameter("p");
-#. if (peerParam != null)
-#. buf.append("<input type=\"hidden\" name=\"p\" value=\"").append(peerParam).append("\" >\n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082
-#, java-format
-msgid "Torrent was not retrieved from {0}"
-msgstr ""
diff --git a/apps/i2psnark/locale/messages_en.po b/apps/i2psnark/locale/messages_en.po
index 414f106c41c23df479d37d72035249d0d0d85fb3..5969bd5bfffc1d81b261ea315e6939093cb1406c 100644
--- a/apps/i2psnark/locale/messages_en.po
+++ b/apps/i2psnark/locale/messages_en.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P i2psnark\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-08-25 19:38+0000\n"
+"POT-Creation-Date: 2012-09-06 09:09+0000\n"
 "PO-Revision-Date: 2010-06-15 14:09+0100\n"
 "Last-Translator: duck <duck@mail.i2p>\n"
 "Language-Team: duck <duck@mail.i2p>\n"
@@ -334,8 +334,8 @@ msgid "Error on torrent {0}"
 msgstr ""
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:1487
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1785
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1795
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1792
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1802
 msgid "Magnet"
 msgstr ""
 
@@ -405,724 +405,724 @@ msgstr ""
 msgid "Torrent at {0} was not valid"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:222
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:223
 msgid "I2PSnark - Anonymous BitTorrent Client"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:236
 msgid "Router is down"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:250
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:251
 msgid "Torrents"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:253
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:260
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:254
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:261
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1254
 msgid "I2PSnark"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:257
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258
 msgid "Refresh page"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:262
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:263
 msgid "Forum"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:276
 msgid "Click \"Add torrent\" button to fetch torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
 msgid "clear messages"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:339
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2243
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:338
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2248
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2250
 msgid "Status"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:347
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:349
 msgid "Hide Peers"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:355
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:354
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:356
 msgid "Show Peers"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:362
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:364
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2111
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:363
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2118
 msgid "Torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:369
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:370
 msgid "Estimated time remaining"
 msgstr ""
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:373
 msgid "ETA"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378
 msgid "Downloaded"
 msgstr ""
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:380
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381
 msgid "RX"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:385
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:386
 msgid "Uploaded"
 msgstr ""
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:388
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:389
 msgid "TX"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:395
 msgid "Down Rate"
 msgstr ""
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:398
 msgid "RX Rate"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:403
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
 msgid "Up Rate"
 msgstr ""
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:406
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
 msgid "TX Rate"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:429
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:430
 msgid "Stop all torrents and the I2P tunnel"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:431
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:432
 msgid "Stop All"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:440
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:441
 msgid "Start all torrents and the I2P tunnel"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:442
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:443
 msgid "Start All"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:462
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:463
 msgid "No torrents loaded."
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:468
 msgid "Totals"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:469
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470
 #, java-format
 msgid "1 torrent"
 msgid_plural "{0} torrents"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:472
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:473
 #, java-format
 msgid "1 connected peer"
 msgid_plural "{0} connected peers"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:478
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:479
 #, java-format
 msgid "1 DHT peer"
 msgid_plural "{0} DHT peers"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572
 #, java-format
 msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:612
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:639
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:640
 #, java-format
 msgid "Magnet deleted: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:620
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:621
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646
 #, java-format
 msgid "Torrent file deleted: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:651
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:652
 #, java-format
 msgid "Data file deleted: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:664
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:654
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:665
 #, java-format
 msgid "Data file could not be deleted: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:679
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:688
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:689
 #, java-format
 msgid "Directory could not be deleted: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:686
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687
 #, java-format
 msgid "Directory deleted: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:733
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734
 msgid "Error creating torrent - you must select a tracker"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:749
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:750
 #, java-format
 msgid "Torrent created for \"{0}\""
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:751
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:752
 #, java-format
 msgid ""
 "Many I2P trackers require you to register new torrents before seeding - "
 "please do so before starting \"{0}\""
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:753
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:754
 #, java-format
 msgid "Error creating a torrent for \"{0}\""
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:756
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:757
 #, java-format
 msgid "Cannot create a torrent for the nonexistent data: {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:760
 msgid "Error creating torrent - you must enter a file or directory"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:774
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1751
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
 msgid "Delete selected"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:774
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1752
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759
 msgid "Save tracker configuration"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:791
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792
 msgid "Removed"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:820
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1757
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762
 msgid "Add tracker"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:846
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:844
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847
 msgid "Enter valid tracker name and URLs"
 msgstr ""
 
 #. "<input type=\"reset\" class=\"cancel\" value=\"").append(_("Cancel")).append("\">\n" +
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1761
 msgid "Restore defaults"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:851
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
 msgid "Restored default trackers"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:994
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1000
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1007
 msgid "Tracker Error"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:995
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1023
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1039
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1044
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1050
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:997
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1002
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1030
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1046
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1051
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062
 #, java-format
 msgid "1 peer"
 msgid_plural "{0} peers"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1003
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1004
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1010
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1011
 msgid "Starting"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1012
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019
 msgid "Seeding"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1016
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1030
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1031
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2183
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2298
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1023
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1038
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2305
 msgid "Complete"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1036
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1048
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049
 msgid "OK"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1046
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1047
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1052
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1053
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1059
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1060
 msgid "Stalled"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1058
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1064
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1065
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069
 msgid "No Peers"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1064
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1065
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1071
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1072
 msgid "Stopped"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1098
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105
 msgid "Torrent details"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1127
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134
 msgid "View files"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1129
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1136
 msgid "Open file"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1172
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1179
 msgid "Stop the torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1174
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1181
 msgid "Stop"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193
 msgid "Start the torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1195
 msgid "Start"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1200
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207
 msgid "Remove the torrent from the active list, deleting the .torrent file"
 msgstr ""
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quote must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1205
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1212
 #, java-format
 msgid ""
 "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
 "data will not be deleted) ?"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1208
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1215
 msgid "Remove"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1220
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1227
 msgid "Delete the .torrent file and the associated data file(s)"
 msgstr ""
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quote must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1225
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1232
 #, java-format
 msgid ""
 "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
 "data?"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1228
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1718
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1725
 msgid "Delete"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270
 msgid "Unknown"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1275
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1282
 msgid "Seed"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1298
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1305
 msgid "Uninteresting (The peer has no pieces we need)"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1300
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1307
 msgid "Choked (The peer is not allowing us to request pieces)"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1327
 msgid "Uninterested (We have no pieces the peer needs)"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1322
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1329
 msgid "Choking (We are not allowing the peer to request pieces)"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1376
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1383
 #, java-format
 msgid "Details at {0} tracker"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1392
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1399
 msgid "Info"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1427
 msgid "Add Torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1422
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1429
 msgid "From URL"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1425
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1432
 msgid ""
 "Enter the torrent file download URL (I2P only), magnet link, maggot link, or "
 "info hash"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1430
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1437
 msgid "Add torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1433
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1440
 #, java-format
 msgid "You can also copy .torrent files to: {0}."
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1435
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1442
 msgid "Removing a .torrent will cause it to stop."
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1458
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1465
 msgid "Create Torrent"
 msgstr ""
 
 #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1461
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1468
 msgid "Data to seed"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1465
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1472
 msgid "File or directory to seed (must be within the specified path)"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1467
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2133
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1474
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140
 msgid "Tracker"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1469
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1476
 msgid "Select a tracker"
 msgstr ""
 
 #. out.write(_("Open trackers and DHT only"));
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1474
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1481
 msgid "Open trackers only"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1491
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498
 msgid "Create torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1515
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1771
 msgid "Configuration"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1519
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526
 msgid "Data directory"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528
 msgid "Edit i2psnark.config and restart to change"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532
 msgid "Files readable by all"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1529
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536
 msgid "If checked, other users may access the downloaded files"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1540
 msgid "Auto start"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544
 msgid "If checked, automatically start torrents that are added"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548
 msgid "Theme"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1554
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561
 msgid "Refresh time"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1574
 msgid "Never"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1573
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580
 msgid "Startup delay"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1582
 msgid "minutes"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1599
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1606
 msgid "Total uploader limit"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1602
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1609
 msgid "peers"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1606
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1613
 msgid "Up bandwidth limit"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1609
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1616
 msgid "Half available bandwidth recommended."
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1611
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1618
 msgid "View or change router bandwidth"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1622
 msgid "Use open trackers also"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1619
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1626
 msgid ""
 "If checked, announce torrents to open trackers as well as the tracker listed "
 "in the torrent file"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1623
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1630
 msgid "Enable DHT"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1627
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1634
 msgid "If checked, use DHT"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1650
 msgid "Inbound Settings"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1649
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1656
 msgid "Outbound Settings"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1657
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1664
 msgid "I2CP host"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1662
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669
 msgid "I2CP port"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1677
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
 msgid "I2CP options"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1682
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1689
 msgid "Save configuration"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1696
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1703
 msgid "Trackers"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1701
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708
 msgid "Name"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1703
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1710
 msgid "Website URL"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1705
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2343
 msgid "Open"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1707
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
 msgid "Private"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1709
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
 msgid "Announce URL"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1743
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750
 msgid "Add"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1787
 #, java-format
 msgid "Invalid magnet URL {0}"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1814
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1821
 #, java-format
 msgid "Invalid info hash in magnet URL {0}"
 msgstr ""
 
 #. * dummies for translation
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1938
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1945
 #, java-format
 msgid "1 hop"
 msgid_plural "{0} hops"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1939
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1946
 #, java-format
 msgid "1 tunnel"
 msgid_plural "{0} tunnels"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2120
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2127
 msgid "Torrent file"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2155
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2162
 msgid "Magnet link"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2162
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169
 msgid "Private torrent"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2171
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2242
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2244
 msgid "Size"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2185
 msgid "Completion"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2188
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195
 msgid "Remaining"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2202
 msgid "Files"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2200
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2207
 msgid "Pieces"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2204
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2211
 msgid "Piece size"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2227
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2281
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2234
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2238
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288
 msgid "Directory"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2248
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2250
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2255
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2257
 msgid "Priority"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2256
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263
 msgid "Up to higher level directory"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2286
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2293
 msgid "Torrent not found?"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2295
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2302
 msgid "File not found in torrent?"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2315
 msgid "complete"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2309
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2316
 msgid "remaining"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2363
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370
 msgid "High"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2375
 msgid "Normal"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2373
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2380
 msgid "Skip"
 msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2389
 msgid "Save priorities"
 msgstr ""
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
index 052a211f45faf8cd7f59e9a6186bd882c1d46d55..296691b9dfac9b36a9be6754bc29937f5d1c81e8 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
@@ -694,7 +694,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
     public void runClient(String args[], Logging l) {
         boolean isShared = true;
         if (args.length >= 3)
-            isShared = Boolean.valueOf(args[2].trim()).booleanValue();
+            isShared = Boolean.parseBoolean(args[2].trim());
         if (args.length >= 2) {
             int portNum = -1;
             try {
@@ -717,7 +717,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
                 addtask(task);
                 notifyEvent("clientTaskId", Integer.valueOf(task.getId()));
             } catch (IllegalArgumentException iae) {
-                String msg = "Invalid I2PTunnel configuration to create an HTTP Proxy connecting to the router at " + host + ':'+ port +
+                String msg = "Invalid I2PTunnel configuration to create a standard client tunnel connecting to the router at " + host + ':'+ port +
                              " and listening on " + listenHost + ':' + portNum;
                 _log.error(getPrefix() + msg, iae);
                 l.log(msg);
@@ -766,7 +766,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             String proxy = "";
             boolean isShared = true;
             if (args.length > 1) {
-                if (Boolean.valueOf(args[1].trim()).booleanValue()) {
+                if (Boolean.parseBoolean(args[1].trim())) {
                     isShared = true;
                     if (args.length == 3)
                         proxy = args[2];
@@ -835,7 +835,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             String proxy = "";
             boolean isShared = true;
             if (args.length > 1) {
-                if (Boolean.valueOf(args[1].trim()).booleanValue()) {
+                if (Boolean.parseBoolean(args[1].trim())) {
                     isShared = true;
                     if (args.length == 3)
                         proxy = args[2];
@@ -906,7 +906,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             
             boolean isShared = true;
             if (args.length > 2) {
-                if (Boolean.valueOf(args[2].trim()).booleanValue()) {
+                if (Boolean.parseBoolean(args[2].trim())) {
                     isShared = true;
                 } else if ("false".equalsIgnoreCase(args[2].trim())) {
                     _log.warn("args[2] == [" + args[2] + "] and rejected explicitly");
@@ -973,7 +973,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
 
             boolean isShared = false;
             if (args.length > 1)
-                isShared = Boolean.valueOf(args[1].trim()).booleanValue();
+                isShared = Boolean.parseBoolean(args[1].trim());
 
             ownDest = !isShared;
             try {
@@ -1017,7 +1017,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
 
             boolean isShared = false;
             if (args.length == 2)
-                isShared = Boolean.valueOf(args[1].trim()).booleanValue();
+                isShared = Boolean.parseBoolean(args[1].trim());
 
             ownDest = !isShared;
             String privateKeyFile = null;
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java
index d9fea97433b4d8381baa8701e3c5c8ba52341843..24bc2d2f7ef9428ed50bcb0bf008491a75ff58d7 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java
@@ -190,11 +190,11 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
         // no need to load the netDb with leaseSets for destinations that will never 
         // be looked up
         boolean dccEnabled = (this instanceof I2PTunnelIRCClient) &&
-                      Boolean.valueOf(tunnel.getClientOptions().getProperty(I2PTunnelIRCClient.PROP_DCC)).booleanValue();
+                      Boolean.parseBoolean(tunnel.getClientOptions().getProperty(I2PTunnelIRCClient.PROP_DCC));
         if (!dccEnabled)
             tunnel.getClientOptions().setProperty("i2cp.dontPublishLeaseSet", "true");
         
-        boolean openNow = !Boolean.valueOf(tunnel.getClientOptions().getProperty("i2cp.delayOpen")).booleanValue();
+        boolean openNow = !Boolean.parseBoolean(tunnel.getClientOptions().getProperty("i2cp.delayOpen"));
         if (openNow) {
             while (sockMgr == null) {
                 verifySocketManager();
@@ -258,8 +258,8 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
                 if (sess == null) {
                     newManager = true;
                 } else if (sess.isClosed() &&
-                           Boolean.valueOf(getTunnel().getClientOptions().getProperty("i2cp.closeOnIdle")).booleanValue() &&
-                           Boolean.valueOf(getTunnel().getClientOptions().getProperty("i2cp.newDestOnResume")).booleanValue()) {
+                           Boolean.parseBoolean(getTunnel().getClientOptions().getProperty("i2cp.closeOnIdle")) &&
+                           Boolean.parseBoolean(getTunnel().getClientOptions().getProperty("i2cp.newDestOnResume"))) {
                     // build a new socket manager and a new dest if the session is closed.
                     getTunnel().removeSession(sess);
                     if (_log.shouldLog(Log.WARN))
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
index f8113382d1d247d6a74b2e2714de2088b8f629d0..04ca75e75aa069237266bfa4c2e0215cbe0e1ebd 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
@@ -253,7 +253,7 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
                     line = null;
                 } else {
                     // Add Proxy-Authentication header for next hop (outproxy)
-                    if (usingWWWProxy && Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_AUTH)).booleanValue()) {
+                    if (usingWWWProxy && Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_AUTH))) {
                         // specific for this proxy
                         String user = getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_USER_PREFIX + currentProxy);
                         String pw = getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_PW_PREFIX + currentProxy);
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
index 6487956daa5d829da9e8d73cf409241c25751adb..bc7a474774d1013047a57a236f8b540f2b0e75ea 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
@@ -521,7 +521,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
                             // Try to find an address helper in the query
                             String[] helperStrings = removeHelper(query);
                             if(helperStrings != null &&
-                                    !Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER)).booleanValue()) {
+                                    !Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER))) {
                                 query = helperStrings[0];
                                 if(query.equals("")) {
                                     query = null;
@@ -736,7 +736,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
                     } else if(lowercaseLine.startsWith("user-agent: ")) {
                         // save for deciding whether to offer address book form
                         userAgent = lowercaseLine.substring(12);
-                        if(!Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_USER_AGENT)).booleanValue()) {
+                        if(!Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_USER_AGENT))) {
                             line = null;
                             continue;
                         }
@@ -746,13 +746,13 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
                         line = null;
                         continue;
                     } else if(lowercaseLine.startsWith("referer: ") &&
-                            !Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_REFERER)).booleanValue()) {
+                            !Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_REFERER))) {
                         // Shouldn't we be more specific, like accepting in-site referers ?
                         //line = "Referer: i2p";
                         line = null;
                         continue; // completely strip the line
                     } else if(lowercaseLine.startsWith("via: ") &&
-                            !Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_VIA)).booleanValue()) {
+                            !Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_VIA))) {
                         //line = "Via: i2p";
                         line = null;
                         continue; // completely strip the line
@@ -786,7 +786,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
                     String ok = getTunnel().getClientOptions().getProperty("i2ptunnel.gzip");
                     boolean gzip = DEFAULT_GZIP;
                     if(ok != null) {
-                        gzip = Boolean.valueOf(ok).booleanValue();
+                        gzip = Boolean.parseBoolean(ok);
                     }
                     if(gzip && !usingInternalServer) {
                         // according to rfc2616 s14.3, this *should* force identity, even if
@@ -796,7 +796,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
                         newRequest.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n");
                     }
                     if(!shout) {
-                        if(!Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_USER_AGENT)).booleanValue()) {
+                        if(!Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_USER_AGENT))) {
                             // let's not advertise to external sites that we are from I2P
                             if(usingWWWProxy) {
                                 newRequest.append("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6\r\n");
@@ -806,7 +806,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
                         }
                     }
                     // Add Proxy-Authentication header for next hop (outproxy)
-                    if(usingWWWProxy && Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_AUTH)).booleanValue()) {
+                    if(usingWWWProxy && Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_AUTH))) {
                         // specific for this proxy
                         String user = getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_USER_PREFIX + currentProxy);
                         String pw = getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_PW_PREFIX + currentProxy);
@@ -869,7 +869,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
             if(usingInternalServer) {
                 // disable the add form if address helper is disabled
                 if(internalPath.equals("/add") &&
-                        Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER)).booleanValue()) {
+                        Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER))) {
                     out.write(ERR_HELPER_DISABLED);
                 } else {
                     LocalHTTPServer.serveLocalFile(out, method, internalPath, internalRawQuery, _proxyNonce);
@@ -949,7 +949,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
             // Don't do this for eepget, which uses a user-agent of "Wget"
             if(ahelperNew && "GET".equals(method) &&
                     (userAgent == null || !userAgent.startsWith("Wget")) &&
-                    !Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER)).booleanValue()) {
+                    !Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER))) {
                 writeHelperSaveForm(out, destination, ahelperKey, targetRequest);
                 s.close();
                 return;
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java
index 331c786f13331bd72900d8c229d00b63af208778..f14de68b4b1550d7ed26ae0ef8e384255a13e4d3 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java
@@ -100,7 +100,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
         // Ref: RFC 2617
         // If the socket is an InternalSocket, no auth required.
         String authRequired = getTunnel().getClientOptions().getProperty(PROP_AUTH);
-        if (Boolean.valueOf(authRequired).booleanValue() ||
+        if (Boolean.parseBoolean(authRequired) ||
             (authRequired != null && "basic".equals(authRequired.toLowerCase(Locale.US)))) {
             if (s instanceof InternalSocket) {
                 if (_log.shouldLog(Log.INFO))
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
index 5c69959adee60df464c1a72ced733e1a01b9aadf..d1dec5248e008e5b5f10ef03756896d1ca454667 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
@@ -45,7 +45,8 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
     private static final String[] CLIENT_SKIPHEADERS = {HASH_HEADER, DEST64_HEADER, DEST32_HEADER};
     private static final String SERVER_HEADER = "Server";
     private static final String[] SERVER_SKIPHEADERS = {SERVER_HEADER};
-    private static final long HEADER_TIMEOUT = 60*1000;
+    private static final long HEADER_TIMEOUT = 15*1000;
+    private static final long TOTAL_HEADER_TIMEOUT = 2 * HEADER_TIMEOUT;
     private static final long START_INTERVAL = (60 * 1000) * 3;
     private long _startedOn = 0L;
 
@@ -154,7 +155,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
             boolean allowGZIP = true;
             if (opts != null) {
                 String val = opts.getProperty("i2ptunnel.gzip");
-                if ( (val != null) && (!Boolean.valueOf(val).booleanValue()) ) 
+                if ( (val != null) && (!Boolean.parseBoolean(val)) ) 
                     allowGZIP = false;
             }
             if (_log.shouldLog(Log.INFO))
@@ -492,7 +493,8 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
     	}
     }
 
-    protected static Map<String, List<String>> readHeaders(InputStream in, StringBuilder command, String[] skipHeaders, I2PAppContext ctx) throws IOException {
+    protected static Map<String, List<String>> readHeaders(InputStream in, StringBuilder command,
+                                                           String[] skipHeaders, I2PAppContext ctx) throws IOException {
     	HashMap<String, List<String>> headers = new HashMap<String, List<String>>();
         StringBuilder buf = new StringBuilder(128);
         
@@ -516,6 +518,8 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
         if (trimmed > 0)
             ctx.statManager().addRateData("i2ptunnel.httpNullWorkaround", trimmed, 0);
         
+        // slowloris / darkloris
+        long expire = ctx.clock().now() + TOTAL_HEADER_TIMEOUT;
         int i = 0;
         while (true) {
             if (++i > MAX_HEADERS)
@@ -528,6 +532,8 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
                 // end of headers reached
                 return headers;
             } else {
+                if (ctx.clock().now() > expire)
+                    throw new IOException("Headers took too long [" + buf.toString() + "]");
                 int split = buf.indexOf(":");
                 if (split <= 0) throw new IOException("Invalid HTTP header, missing colon [" + buf.toString() + "]");
                 String name = buf.substring(0, split).trim();
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java
index 60d8dc0dbff058c5a20adc14c24dfb15469cf5d3..fdba9af6300a0f7ec917c91f2dfc82aeec448063 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java
@@ -87,7 +87,7 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase {
         
         setName("IRC Client on " + tunnel.listenHost + ':' + localPort);
 
-        _dccEnabled = Boolean.valueOf(tunnel.getClientOptions().getProperty(PROP_DCC)).booleanValue();
+        _dccEnabled = Boolean.parseBoolean(tunnel.getClientOptions().getProperty(PROP_DCC));
         // TODO add some prudent tunnel options (or is it too late?)
 
         startRunning();
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java
index b592ebcf82dcc267f90ddbbb621329b6207403f1..31cc4c26c2ffe43f780ad1ba0497ea3efc968489 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java
@@ -62,7 +62,8 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable {
 	public static final String PROP_WEBIRC_SPOOF_IP_DEFAULT="127.0.0.1";
     public static final String PROP_HOSTNAME="ircserver.fakeHostname";
     public static final String PROP_HOSTNAME_DEFAULT="%f.b32.i2p";
-    private static final long HEADER_TIMEOUT = 60*1000;
+    private static final long HEADER_TIMEOUT = 15*1000;
+    private static final long TOTAL_HEADER_TIMEOUT = 2 * HEADER_TIMEOUT;
     
     private final static byte[] ERR_UNAVAILABLE =
         (":ircserver.i2p 499 you :" +
@@ -188,12 +189,16 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable {
         StringBuilder buf = new StringBuilder(128);
         int lineCount = 0;
         
+        // slowloris / darkloris
+        long expire = System.currentTimeMillis() + TOTAL_HEADER_TIMEOUT;
         while (true) {
             String s = DataHelper.readLine(in);
             if (s == null)
                 throw new IOException("EOF reached before the end of the headers [" + buf.toString() + "]");
             if (++lineCount > 10)
                 throw new IOException("Too many lines before USER or SERVER, giving up");
+            if (System.currentTimeMillis() > expire)
+                throw new IOException("Headers took too long [" + buf.toString() + "]");
             s = s.trim();
             //if (_log.shouldLog(Log.DEBUG))
             //    _log.debug("Got line: " + s);
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java
index 49b44f1c92e732f0e3f04ee75347220c4882a008..24e2c58eab5b04ca6abcd058218ebf34cc600d23 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java
@@ -49,8 +49,8 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
 
     protected Logging l;
 
-    private static final long DEFAULT_READ_TIMEOUT = -1; // 3*60*1000;
-    /** default timeout to 3 minutes - override if desired */
+    private static final long DEFAULT_READ_TIMEOUT = 5*60*1000;
+    /** default timeout to 5 minutes - override if desired */
     protected long readTimeout = DEFAULT_READ_TIMEOUT;
 
     /** do we use threads? default true (ignored for standard servers, always false) */
@@ -191,7 +191,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
         if (_usePool) {
             String usePool = getTunnel().getClientOptions().getProperty(PROP_USE_POOL);
             if (usePool != null)
-                _usePool = Boolean.valueOf(usePool).booleanValue();
+                _usePool = Boolean.parseBoolean(usePool);
             else
                 _usePool = DEFAULT_USE_POOL;
         }
@@ -207,7 +207,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
             if (sockMgr == null) {
                 // try to make this error sensible as it will happen...
                 String msg = "Unable to connect to the router at " + getTunnel().host + ':' + portNum +
-                             " and build tunnels for the server at " + getTunnel().listenHost + ':' + port;
+                             " and build tunnels for the server at " + host.getHostAddress() + ':' + port;
                 if (++retries < MAX_RETRIES) {
                     this.l.log(msg + ", retrying in " + (RETRY_DELAY / 1000) + " seconds");
                     _log.error(msg + ", retrying in " + (RETRY_DELAY / 1000) + " seconds");
@@ -223,7 +223,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
 
         sockMgr.setName("Server");
         getTunnel().addSession(sockMgr.getSession());
-        l.log("Tunnels ready for server at " + getTunnel().listenHost + ':' + port);
+        l.log("Tunnels ready for server at " + host.getHostAddress() + ':' + port);
         notifyEvent("openServerResult", "ok");
         open = true;
     }
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
index 61b7c6432426c38a5c78eb7bfdf13b1bb724cf8b..8420604c9a56afc20b554046fb38dcdeaedfb2fb 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
@@ -536,8 +536,8 @@ public class TunnelController implements Logging {
     /** default true */
     public String getSharedClient() { return _config.getProperty("sharedClient", "true"); }
     /** default true */
-    public boolean getStartOnLoad() { return Boolean.valueOf(_config.getProperty("startOnLoad", "true")).booleanValue(); }
-    public boolean getPersistentClientKey() { return Boolean.valueOf(_config.getProperty("option.persistentClientKey")).booleanValue(); }
+    public boolean getStartOnLoad() { return Boolean.parseBoolean(_config.getProperty("startOnLoad", "true")); }
+    public boolean getPersistentClientKey() { return Boolean.parseBoolean(_config.getProperty("option.persistentClientKey")); }
 
     public String getMyDestination() {
         if (_tunnel != null) {
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java
index 0854c799351062cee9d65eebe507bc2523e7b094..912dd6b603a3ddf48160a96fc588635ae69f0fca 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java
@@ -61,7 +61,7 @@ public class SOCKS5Server extends SOCKSServer {
         this.clientSock = clientSock;
         this.props = props;
         this.authRequired =
-                    Boolean.valueOf(props.getProperty(I2PTunnelHTTPClientBase.PROP_AUTH)).booleanValue() &&
+                    Boolean.parseBoolean(props.getProperty(I2PTunnelHTTPClientBase.PROP_AUTH)) &&
                     props.containsKey(I2PTunnelHTTPClientBase.PROP_USER) &&
                     props.containsKey(I2PTunnelHTTPClientBase.PROP_PW);
     }
@@ -181,7 +181,7 @@ public class SOCKS5Server extends SOCKSServer {
             sendRequestReply(Reply.COMMAND_NOT_SUPPORTED, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
             throw new SOCKSException("BIND command not supported");
         case Command.UDP_ASSOCIATE:
-          /*** if(!Boolean.valueOf(tunnel.getOptions().getProperty("i2ptunnel.socks.allowUDP")).booleanValue()) {
+          /*** if(!Boolean.parseBoolean(tunnel.getOptions().getProperty("i2ptunnel.socks.allowUDP"))) {
             _log.debug("UDP ASSOCIATE command is not supported!");
             sendRequestReply(Reply.COMMAND_NOT_SUPPORTED, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
             throw new SOCKSException("UDP ASSOCIATE command not supported");
@@ -463,7 +463,7 @@ public class SOCKS5Server extends SOCKSServer {
         I2PSocket destSock = tun.createI2PSocket(I2PAppContext.getGlobalContext().namingService().lookup(proxy), proxyOpts);
         try {
             DataOutputStream out = new DataOutputStream(destSock.getOutputStream());
-            boolean authAvail = Boolean.valueOf(props.getProperty(I2PTunnelHTTPClientBase.PROP_OUTPROXY_AUTH)).booleanValue();
+            boolean authAvail = Boolean.parseBoolean(props.getProperty(I2PTunnelHTTPClientBase.PROP_OUTPROXY_AUTH));
             String configUser =  null;
             String configPW = null;
             if (authAvail) {
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java
index 8a373b6794ddeb8671f155018af7655b05e030ec..971f3be0402a591bf27bf98791418c2cdc7e30aa 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java
@@ -49,7 +49,7 @@ public class SOCKSServerFactory {
             switch (socksVer) {
             case 0x04:
                 // SOCKS version 4/4a
-                if (Boolean.valueOf(props.getProperty(I2PTunnelHTTPClientBase.PROP_AUTH)).booleanValue() &&
+                if (Boolean.parseBoolean(props.getProperty(I2PTunnelHTTPClientBase.PROP_AUTH)) &&
                     props.containsKey(I2PTunnelHTTPClientBase.PROP_USER) &&
                     props.containsKey(I2PTunnelHTTPClientBase.PROP_PW)) {
                     throw new SOCKSException("SOCKS 4/4a not supported when authorization is required");
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
index 172e3eb57632b3cb032d3a6be9c4961f0586dad8..a0c38616e80b536f8bce34b6e4f4bc480ad5de3b 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
@@ -114,7 +114,7 @@ public class EditBean extends IndexBean {
     public boolean isSharedClient(int tunnel) {
         TunnelController tun = getController(tunnel);
         if (tun != null)
-            return Boolean.valueOf(tun.getSharedClient()).booleanValue();
+            return Boolean.parseBoolean(tun.getSharedClient());
         else
             return false;
     }
@@ -312,7 +312,7 @@ public class EditBean extends IndexBean {
         if (tun != null) {
             Properties opts = getOptions(tun);
             if (opts != null)
-                return Boolean.valueOf(opts.getProperty(prop)).booleanValue();
+                return Boolean.parseBoolean(opts.getProperty(prop));
         }
         return false;
     }
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
index e4609593cf9dc339695524fa3e43cd854d1f11d4..363c9a60b132ae907d229a9e7256f84ff378790c 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
@@ -32,6 +32,7 @@ import net.i2p.i2ptunnel.I2PTunnelHTTPClientBase;
 import net.i2p.i2ptunnel.I2PTunnelIRCClient;
 import net.i2p.i2ptunnel.TunnelController;
 import net.i2p.i2ptunnel.TunnelControllerGroup;
+import net.i2p.util.Addresses;
 import net.i2p.util.ConcurrentHashSet;
 import net.i2p.util.FileUtil;
 import net.i2p.util.Log;
@@ -265,7 +266,7 @@ public class IndexBean {
         }
         // Only modify other shared tunnels
         // if the current tunnel is shared, and of supported type
-        if (Boolean.valueOf(cur.getSharedClient()).booleanValue() && isClient(cur.getType())) {
+        if (Boolean.parseBoolean(cur.getSharedClient()) && isClient(cur.getType())) {
             // all clients use the same I2CP session, and as such, use the same I2CP options
             List controllers = _group.getControllers();
 
@@ -277,7 +278,7 @@ public class IndexBean {
 
                 // Only modify this non-current tunnel
                 // if it belongs to a shared destination, and is of supported type
-                if (Boolean.valueOf(c.getSharedClient()).booleanValue() && isClient(c.getType())) {
+                if (Boolean.parseBoolean(c.getSharedClient()) && isClient(c.getType())) {
                     Properties cOpt = c.getConfig("");
                     if (_tunnelQuantity != null) {
                         cOpt.setProperty("option.inbound.quantity", _tunnelQuantity);
@@ -436,6 +437,9 @@ public class IndexBean {
             return _("New Tunnel");
     }
     
+    /**
+     *  No validation
+     */
     public String getClientPort(int tunnel) {
         TunnelController tun = getController(tunnel);
         if (tun != null && tun.getListenPort() != null)
@@ -444,6 +448,28 @@ public class IndexBean {
             return "";
     }
     
+    /**
+     *  Returns error message if blank or invalid
+     *  @since 0.9.3
+     */
+    public String getClientPort2(int tunnel) {
+        TunnelController tun = getController(tunnel);
+        if (tun != null && tun.getListenPort() != null) {
+            String port = tun.getListenPort();
+            if (port.length() == 0)
+                return "<font color=\"red\">" + _("Port not set") + "</font>";
+            int iport = Addresses.getPort(port);
+            if (iport == 0)
+                return "<font color=\"red\">" + _("Invalid port") + ' ' + port + "</font>";
+            if (iport < 1024)
+                return "<font color=\"red\">" +
+                       _("Warning - ports less than 1024 are not recommended") +
+                       ": " + port + "</font>";
+            return port;
+        }
+        return "<font color=\"red\">" + _("Port not set") + "</font>";
+    }
+    
     public String getTunnelType(int tunnel) {
         TunnelController tun = getController(tunnel);
         if (tun != null)
@@ -551,12 +577,16 @@ public class IndexBean {
             else
                 host = tun.getTargetHost();
             String port = tun.getTargetPort();
-            if (host == null)
+            if (host == null || host.length() == 0)
                 host = "<font color=\"red\">" + _("Host not set") + "</font>";
+            else if (Addresses.getIP(host) == null)
+                host = "<font color=\"red\">" + _("Invalid address") + ' ' + host + "</font>";
             else if (host.indexOf(':') >= 0)
                 host = '[' + host + ']';
-            if (port == null)
+            if (port == null || port.length() == 0)
                 port = "<font color=\"red\">" + _("Port not set") + "</font>";
+            else if (Addresses.getPort(port) == 0)
+                port = "<font color=\"red\">" + _("Invalid port") + ' ' + port + "</font>";
             return host + ':' + port;
        }  else
             return "";
diff --git a/apps/i2ptunnel/jsp/index.jsp b/apps/i2ptunnel/jsp/index.jsp
index 5fad2c9ad45c1257dbed449d8735bef73547d7bf..6494430e4ea742d637ca89226677d3b2902edbc3 100644
--- a/apps/i2ptunnel/jsp/index.jsp
+++ b/apps/i2ptunnel/jsp/index.jsp
@@ -222,14 +222,8 @@
             <label><%=intl._("Port")%>:</label>
             <span class="text">
          <%
-               String cPort= indexBean.getClientPort(curClient);
-               if ("".equals(cPort)) {
-                   out.write("<font color=\"red\">");
-                   out.write(intl._("Port not set"));
-                   out.write("</font>");
-               } else {
-                   out.write(cPort);
-               }
+               String cPort= indexBean.getClientPort2(curClient);
+               out.write(cPort);
           %>
             </span>
         </div>
diff --git a/apps/i2ptunnel/locale/messages_cs.po b/apps/i2ptunnel/locale/messages_cs.po
index dc7d455de1d8981219563e10461e0f33bf7b8207..a1601bf67d0e5d4199506825e7b5971768430a04 100644
--- a/apps/i2ptunnel/locale/messages_cs.po
+++ b/apps/i2ptunnel/locale/messages_cs.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-02-17 11:41+0000\n"
+"POT-Creation-Date: 2012-09-12 11:58+0000\n"
 "PO-Revision-Date: 2012-02-17 11:26+0000\n"
 "Last-Translator: kytv <killyourtv@i2pmail.org>\n"
 "Language-Team: Czech (http://www.transifex.net/projects/p/I2P/language/cs/)\n"
@@ -19,15 +19,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:554
 msgid "This seems to be a bad destination:"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:554
 msgid "i2paddresshelper cannot help you with a destination like that!"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:561
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:621
 #, java-format
 msgid ""
 "To visit the destination in your host database, click <a href=\"{0}\">here</"
@@ -35,85 +35,95 @@ msgid ""
 "\"{1}\">here</a>."
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:937
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:391
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1023
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:403
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:407
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:410
 msgid "Host"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:938
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:372
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1027
+msgid "Base 32"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1031
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:380
 msgid "Destination"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:943
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1037
 #, java-format
 msgid "Continue to {0} without saving"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:948
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1042
 #, java-format
 msgid "Save {0} to router address book and continue to eepsite"
 msgstr ""
 
 #. only blockfile supports multiple books
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:951
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1045
 #, java-format
 msgid "Save {0} to master address book and continue to eepsite"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:952
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1046
 #, java-format
 msgid "Save {0} to private address book and continue to eepsite"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1107
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1211
 msgid "HTTP Outproxy"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1112
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1216
 msgid ""
 "Click a link below to look for an address helper by using a \"jump\" service:"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1330
+#. Translators: parameter is a host name
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1252
+#, java-format
+msgid "{0} jump service"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:159
 msgid "Added via address helper"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1354
+#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:183
 #, java-format
 msgid "Redirecting to {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1360
+#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:189
 msgid "Router Console"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
+#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:190
 msgid "Addressbook"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
+#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:190
 msgid "Configuration"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361
+#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:190
 msgid "Help"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1366
+#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:195
 #, java-format
 msgid "Saved {0} to the {1} addressbook, redirecting now."
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1367
+#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:196
 #, java-format
 msgid "Failed to save {0} to the {1} addressbook, redirecting now."
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1369
+#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:198
 msgid "Click here if you are not redirected automatically."
 msgstr ""
 
@@ -122,7 +132,7 @@ msgstr ""
 msgid "internal"
 msgstr "vnitřní"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:175
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:174
 msgid ""
 "Invalid form submission, probably because you used the 'back' or 'reload' "
 "button on your browser. Please resubmit."
@@ -130,25 +140,25 @@ msgstr ""
 "Neplatně odeslaný formulář, nejspíše jste použili tlačítka 'Zpět' nebo "
 "'Znovu načíst' ve vašem prohlížeči. Prosím odešlete formulář znovu."
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:222
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:221
 msgid "Configuration reloaded for all tunnels"
 msgstr "Nastavení pro všechny tunely bylo opětovně nahráno."
 
 #. and give them something to look at in any case
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:234
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:233
 msgid "Starting tunnel"
 msgstr "Startuji tunel"
 
 #. and give them something to look at in any case
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:247
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:246
 msgid "Stopping tunnel"
 msgstr "Zastavuji tunel"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:315
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
 msgid "Configuration changes saved"
 msgstr "Změny nastavení byly uloženy"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:318
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:317
 msgid "Failed to save configuration"
 msgstr "Nepodařilo se uložit nastavení"
 
@@ -205,103 +215,103 @@ msgid "HTTP bidir"
 msgstr "HTTP bidir"
 
 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:555
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305
 msgid "Host not set"
 msgstr "Host není nastaven"
 
 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:559
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:277
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:287
 msgid "Port not set"
 msgstr "Port není nastaven"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:82
 msgid "I2P Tunnel Manager - Edit Client Tunnel"
 msgstr "Správce I2P tunelů - editovat klientský tunel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:104
 msgid "Edit proxy settings"
 msgstr "Editovat nastavení proxy"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
 msgid "New proxy settings"
 msgstr "Nové nastavení proxy"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:126
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:123
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:123
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:123
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:137
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:257
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:326
 msgid "Name"
 msgstr "Jméno"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:127
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:127
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:261
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294
 msgid "Type"
 msgstr "Typ"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:391
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:131
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:131
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:330
 msgid "Description"
 msgstr "Popis"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:126
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:136
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:147
 msgid "Target"
 msgstr "Cíl"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:141
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:143
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:173
 msgid "Access Point"
 msgstr "Přístupové místo (access point)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:161
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:164
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223
 msgid "required"
 msgstr "požadováno"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:169
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:188
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:479
 msgid "Reachable by"
 msgstr "Dosažitelné (kým)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:190
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:358
 msgid "Outproxies"
 msgstr "Výstupní proxy (Outproxies)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:197
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:378
 msgid "Tunnel Destination"
 msgstr "Cíl tunelu"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:209
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:382
 msgid "name or destination"
 msgstr "jméno nebo cíl"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:385
 msgid "b32 not recommended"
 msgstr "není doporučeno b32"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:217
 msgid "Shared Client"
 msgstr "Sdílený klient"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:221
 msgid ""
 "(Share tunnels with other clients and irc/httpclients? Change requires "
 "restart of client proxy)"
@@ -309,29 +319,29 @@ msgstr ""
 "(Sdílet tunely s ostatními klienty a klienty irc/http? Změny vyžadují "
 "restart proxy klienta)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:500
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:225
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:135
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:519
 msgid "Auto Start"
 msgstr "Automatické spuštění"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:504
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:229
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:523
 msgid "(Check the Box for 'YES')"
 msgstr "Zašrtněte zaškrtávací políčko pro 'ANO'"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:233
 msgid "Enable DCC"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:232
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:253
 msgid "Advanced networking options"
 msgstr "Rozšířená síťová nastavení"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
 msgid ""
 "(NOTE: when this client proxy is configured to share tunnels, then these "
 "options are for all the shared proxy clients!)"
@@ -339,900 +349,893 @@ msgstr ""
 "(POZN.: když je klientská proxy nastavena aby sdílela tunely, tak tyto "
 "nastavení platí pro všechny sdílené klienty proxy!)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:255
 msgid "Tunnel Options"
 msgstr "Nastavení možností tunelu"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:238
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:257
 msgid "Length"
 msgstr "Délka"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:245
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:264
 msgid "0 hop tunnel (low anonymity, low latency)"
 msgstr ""
 "Tunel s 0 skoky (nízká/žádná anonymita, rychlá odezva) - jen pro spolehlivé "
 "kámoše kteří se určitě nedostanou do \"potíží\" třeba za sdílení na DC++ či "
 "používání normálních torrentů."
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:249
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:258
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:268
 msgid "1 hop tunnel (medium anonymity, medium latency)"
 msgstr ""
 "Tunel s 1 skokem (střední anonymita, středně rychlá odezva) - pro přístup ke "
 "kámošům vašich spolehlivých kámošů."
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:253
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:262
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:272
 msgid "2 hop tunnel (high anonymity, high latency)"
 msgstr ""
 "Tunel se 2 skoky (vysoká anonymita, pomalá odezva) - pro kohokoliv koho "
 "neznáte osobně vy ani vaši kámoši."
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:257
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:276
 msgid "3 hop tunnel (very high anonymity, poor performance)"
 msgstr ""
 "Tunel se 3 skoky (velmi vysoká anonymita, velmi pomalé) - pro kohokoliv komu "
 "naprosto nedůvěřujete ale chcete s ním vyměňovat data."
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:274
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:284
 msgid "hop tunnel (very poor performance)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:279
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:289
 msgid "Variance"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:278
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:296
 msgid "0 hop variance (no randomisation, consistant performance)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:282
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:290
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:300
 msgid ""
 "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:294
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:304
 msgid ""
 "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:290
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:298
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:308
 msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:294
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:312
 msgid "+/- 0-2 hop variance (not recommended)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:306
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:323
 msgid "hop variance"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:328
 msgid "Count"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
 msgid "1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:322
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:339
 msgid ""
 "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
 "reliability)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:326
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:333
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:343
 msgid ""
 "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:351
 msgid "tunnels"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
 msgid "Backup Count"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:353
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:363
 msgid "0 backup tunnels (0 redundancy, no added resource usage)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:367
 msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:355
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:371
 msgid ""
 "2 backup tunnels each direction (medium redundancy, medium resource usage)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:375
 msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:373
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:383
 msgid "backup tunnels"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:375
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:380
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:390
 msgid "Profile"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:387
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:397
 msgid "interactive connection"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:391
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
 msgid "bulk connection (downloads/websites/BT)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:393
 msgid "Delay Connect"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:392
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:397
 msgid "for request/response connections"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:401
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:405
 msgid "Router I2CP Address"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:271
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:412
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:411
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:159
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:415
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:259
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:281
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:431
 msgid "Port"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:421
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
 msgid "Reduce tunnel quantity when idle"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:418
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:432
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:462
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:496
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:423
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:437
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:445
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:457
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:467
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:500
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:425
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:487
 msgid "Enable"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:427
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:491
 msgid "Reduced tunnel count"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:446
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:451
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
 msgid "Idle minutes"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:435
 msgid "Close tunnels when idle"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:441
 msgid "New Keys on Reopen"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:444
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:449
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:441
 msgid "Disable"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:455
 msgid "Delay tunnel open until required"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:465
 msgid "Persistent private key"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:466
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:471
 msgid "File"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:475
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
 msgid "Local destination"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:474
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:479
 msgid "(if known)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
 msgid "Local Authorization"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:500
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:504
 msgid "Username"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:504
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
 msgid "Password"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:498
 msgid "Outproxy Authorization"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:515
 msgid "Jump URL List"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:521
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
 msgid "Custom options"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:522
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
-msgid ""
-"NOTE: If tunnel is currently running, most changes will not take effect "
-"until tunnel is stopped and restarted."
-msgstr ""
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:678
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:525
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:699
 msgid "Cancel"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:528
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:529
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:539
 msgid "Delete"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:530
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:531
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:541
 msgid "Save"
 msgstr "Uložit"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:82
 msgid "I2P Tunnel Manager - Edit Server Tunnel"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:104
 msgid "Edit server settings"
 msgstr "Změnit nastavení serveru"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
 msgid "New server settings"
 msgstr "Nové nastavení serveru"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:209
 msgid "Website name"
 msgstr "Jméno webové stránky"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213
 msgid "(leave blank for outproxies)"
 msgstr "(nechejte prázdné pro výstupní proxiny)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:218
 msgid "Private key file"
 msgstr "Soubor s privátním klíčem"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:240
 msgid "Add to local addressbook"
 msgstr "Přidat do lokální knihy kontaktů (addressbook)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
 msgid "Hostname Signature"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423
 msgid "Encrypt Leaseset"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
 msgid "Encryption Key"
 msgstr "Šifrovací klíč"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
 msgid "Generate New Key"
 msgstr "Vygenerovat nový klíč"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
 msgid "Generate"
 msgstr "Generovat"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:437
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
 msgid "(Tunnel must be stopped first)"
 msgstr "(nejdříve je třeba zastavit tunel)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
 msgid "Restricted Access List"
 msgstr "Seznam těch s omezeným přístupem"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:445
 msgid "Whitelist"
 msgstr "Seznam povolených (whitelist)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:449
 msgid "Blacklist"
 msgstr "Seznam zakázaných (blacklist)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453
 msgid "Access List"
 msgstr "Seznam přístupů"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:457
 msgid "Inbound connection limits (0=unlimited)"
 msgstr "Limit příchozích spojení (0 = bez omezení)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
 msgid "Per client"
 msgstr "Na klienta"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:461
 msgid "Per minute"
 msgstr "Během minuty"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:465
 msgid "Per hour"
 msgstr "Během hodiny"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:469
 msgid "Per day"
 msgstr "Během dne"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:473
 msgid "Total"
 msgstr "Celkově"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
 msgid "Max concurrent connections (0=unlimited)"
 msgstr "Maximální počet současných spojení (0 = bez omezení)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499
 msgid "New Certificate type"
 msgstr "Nový typ certifikátu"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:501
 msgid "None"
 msgstr "Žádný"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505
 msgid "Hashcash (effort)"
 msgstr "Hashcash (složitost)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:511
 msgid "Hashcash Calc Time"
 msgstr "Doba pro výpočet hashcash"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513
 msgid "Estimate"
 msgstr "Předpoklad"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:515
 msgid "Hidden"
 msgstr "Skryté"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519
 msgid "Signed (signed by)"
 msgstr "Podepsáno (kým)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
 msgid "Modify Certificate"
 msgstr "Změnit certifikát"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:527
 msgid "Modify"
 msgstr "Změnit"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:74
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83
 msgid "I2P Tunnel Manager - List"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:86
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:97
 msgid "Status Messages"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:90
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:101
 msgid "Refresh"
 msgstr "Obnovit"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:92
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:103
 msgid "Tunnel Wizard"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:96
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:107
 msgid "Stop All"
 msgstr "Zastavit vše"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:100
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:111
 msgid "Start All"
 msgstr "Spustit vše"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:104
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:115
 msgid "Restart All"
 msgstr "Spustit vše znovu (restartovat)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:119
 msgid "Reload Config"
 msgstr "Opětovně načíst nastavení"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:121
 msgid "I2P Server Tunnels"
 msgstr "Tunely I2P serveru"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:135
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:125
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:146
 msgid "Points at"
 msgstr "Ukazuje na"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:158
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:162
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:127
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:168
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:172
 msgid "Preview"
 msgstr "Náhled"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:118
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:182
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:255
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:129
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:265
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:312
 msgid "Status"
 msgstr "Stav"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:168
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:178
 msgid "Base32 Address"
 msgstr "Base32 adresa"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:176
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:186
 msgid "No Preview"
 msgstr "Bez náhledu"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:189
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:199
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:319
 msgid "Starting..."
 msgstr "Spouštím"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:196
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:210
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:330
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:206
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354
 msgid "Stop"
 msgstr "Zastaveno"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:347
 msgid "Running"
 msgstr "Běží"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:361
 msgid "Stopped"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:368
 msgid "Start"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
 msgid "New server tunnel"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:204
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:246
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:276
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:282
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:554
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:265
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:573
 msgid "Standard"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:403
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:411
 msgid "Create"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:255
 msgid "I2P Client Tunnels"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:288
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:263
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:298
 msgid "Interface"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:333
 msgid "Standby"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:368
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:377
 msgid "Outproxy"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394
 msgid "none"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:407
 msgid "New client tunnel"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:102
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:119
 msgid "I2P Tunnel Manager - Tunnel Creation Wizard"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:120
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:545
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:564
 msgid "Server or client tunnel?"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:126
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:549
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:145
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:568
 msgid "Tunnel type"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:132
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:579
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:151
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:598
 msgid "Tunnel name and description"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:138
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:588
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:157
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:607
 msgid "Tunnel destination"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:144
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:163
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:623
 msgid "Binding address and port"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:150
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:630
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:169
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:649
 msgid "Tunnel auto-start"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:156
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:175
 msgid "Wizard completed"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:170
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:189
 msgid ""
 "This wizard will take you through the various options available for creating "
 "tunnels in I2P."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:172
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:191
 msgid ""
 "The first thing to decide is whether you want to create a server or a client "
 "tunnel."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:174
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:193
 msgid ""
 "If you need to connect to a remote service, such as an IRC server inside I2P "
 "or a code repository, then you will require a CLIENT tunnel."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:176
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:195
 msgid ""
 "On the other hand, if you wish to host a service for others to connect to "
 "you'll need to create a SERVER tunnel."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:178
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:197
 msgid "Server Tunnel"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:180
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:199
 msgid "Client Tunnel"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:198
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:217
 msgid "There are several types of tunnels to choose from:"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:206
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:225
 msgid "Basic tunnel for connecting to a single service inside I2P."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:208
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:269
 msgid ""
 "Try this if none of the tunnel types below fit your requirements, or you "
 "don't know what type of tunnel you need."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:210
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:229
 msgid "Tunnel that acts as an HTTP proxy for reaching eepsites inside I2P."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:231
 msgid ""
 "Set your browser to use this tunnel as an http proxy, or set your "
 "\"http_proxy\" environment variable for command-line applications in GNU/"
 "Linux."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:214
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:233
 msgid ""
 "Websites outside I2P can also be reached if an HTTP proxy within I2P is "
 "known."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:235
 msgid "Customised client tunnel specific for IRC connections."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:218
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:237
 msgid ""
 "With this tunnel type, your IRC client will be able to connect to an IRC "
 "network inside I2P."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:239
 msgid ""
 "Each IRC network in I2P that you wish to connect to will require its own "
 "tunnel. (See Also, SOCKS IRC)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:241
 msgid "A tunnel that implements the SOCKS protocol."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:243
 msgid ""
 "This enables both TCP and UDP connections to be made through a SOCKS "
 "outproxy within I2P."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:245
 msgid ""
 "A client tunnel implementing the SOCKS protocol, which is customised for "
 "connecting to IRC networks."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:247
 msgid ""
 "With this tunnel type, IRC networks in I2P can be reached by typing the I2P "
 "address into your IRC client, and configuring the IRC client to use this "
 "SOCKS tunnel."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:230
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:249
 msgid ""
 "This means that only one I2P tunnel is required rather than a separate "
 "tunnel per IRC network."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:232
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:251
 msgid ""
 "IRC networks outside I2P can also be reached if a SOCKS outproxy within I2P "
 "is known, though it depends on whether or not the outproxy has been blocked "
 "by the IRC network."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:253
 msgid "A client tunnel that implements the HTTP CONNECT command."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:255
 msgid ""
 "This enables TCP connections to be made through an HTTP outproxy, assuming "
 "the proxy supports the CONNECT command."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:238
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:257
 msgid "A customised client tunnel for Streamr."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:267
 msgid "A basic server tunnel for hosting a generic service inside I2P."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:252
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:271
 msgid "A server tunnel that is customised for HTTP connections."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:273
 msgid "Use this tunnel type if you want to host an eepsite."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:275
 msgid ""
 "A customised server tunnel that can both serve HTTP data and connect to "
 "other server tunnels."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:258
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:277
 msgid "This tunnel type is predominantly used when running a Seedless server."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:260
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:279
 msgid "A customised server tunnel for hosting IRC networks inside I2P."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:262
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:281
 msgid ""
 "Usually, a separate tunnel needs to be created for each IRC server that is "
 "to be accessible inside I2P."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:264
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:283
 msgid "A customised server tunnel for Streamr."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:322
 msgid "Choose a name and description for your tunnel."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:324
 msgid ""
 "These can be anything you want - they are just for ease of identifying the "
 "tunnel in the routerconsole."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:354
 msgid ""
 "If you know of any outproxies for this type of tunnel (either HTTP or "
 "SOCKS), fill them in below."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:356
 msgid "Separate multiple proxies with commas."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:355
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:374
 msgid ""
 "Type in the I2P destination of the service that this client tunnel should "
 "connect to."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:376
 msgid ""
 "This could be the full base 64 destination key, or an I2P URL from your "
 "address book."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:387
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:406
 msgid ""
 "This is the IP that your service is running on, this is usually on the same "
 "machine so 127.0.0.1 is autofilled."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:410
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:429
 msgid "This is the port that the service is accepting connections on."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:450
 msgid "This is the port that the client tunnel will be accessed from locally."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:433
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:452
 msgid "This is also the client port for the HTTPBidir server tunnel."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:471
 msgid ""
 "How do you want this tunnel to be accessed? By just this machine, your "
 "entire subnet, or external internet?"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:454
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:473
 msgid "You will most likely want to just allow 127.0.0.1"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:496
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:515
 msgid ""
 "The I2P router can automatically start this tunnel for you when the router "
 "is started."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:498
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:517
 msgid ""
 "This can be useful for frequently-used tunnels (especially server tunnels), "
 "but for tunnels that are only used occassionally it would mean that the I2P "
 "router is creating and maintaining unnecessary tunnels."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:524
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:543
 msgid "The wizard has now collected enough information to create your tunnel."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:526
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:545
 msgid ""
 "Upon clicking the Save button below, the wizard will set up the tunnel, and "
 "take you back to the main I2PTunnel page."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:531
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:550
 msgid ""
 "Because you chose to automatically start the tunnel when the router starts, "
 "you don't have to do anything further."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:533
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:552
 msgid "The router will start the tunnel once it has been set up."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:537
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:556
 msgid ""
 "Because you chose not to automatically start the tunnel, you will have to "
 "manually start it."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:539
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:558
 msgid ""
 "You can do this by clicking the Start button on the main page which "
 "corresponds to the new tunnel."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:543
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:562
 msgid "Below is a summary of the options you chose:"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:641
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:660
 msgid ""
 "Alongside these basic settings, there are a number of advanced options for "
 "tunnel configuration."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:643
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:662
 msgid ""
 "The wizard will set reasonably sensible default values for these, but you "
 "can view and/or edit these by clicking on the tunnel's name in the main "
 "I2PTunnel page."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:683
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:704
 msgid "Previous"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:691
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:712
 msgid "Save Tunnel"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:697
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:718
 msgid "Finish"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:703
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:724
 msgid "Next"
 msgstr ""
diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptions.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptions.java
index c20a89a591e6983cd75456f1c17d0979c839c334..1095a9334ef0cafd1266fecc78e327777d507f7d 100644
--- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptions.java
+++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptions.java
@@ -17,6 +17,9 @@ public interface I2PSocketOptions {
     /**
      * How long we will wait for the ACK from a SYN, in milliseconds.
      *
+     * Default 60 seconds. Max of 2 minutes enforced in Connection.java,
+     * and it also interprets <= 0 as default.
+     *
      * @return milliseconds to wait, or -1 if we will wait indefinitely
      */
     public long getConnectTimeout();
@@ -24,6 +27,9 @@ public interface I2PSocketOptions {
     /**
      * Define how long we will wait for the ACK from a SYN, in milliseconds.
      *
+     * Default 60 seconds. Max of 2 minutes enforced in Connection.java,
+     * and it also interprets <= 0 as default.
+     *
      * @param ms timeout in ms
      */
     public void setConnectTimeout(long ms);
@@ -32,6 +38,9 @@ public interface I2PSocketOptions {
      * What is the longest we'll block on the input stream while waiting
      * for more data.  If this value is exceeded, the read() throws 
      * InterruptedIOException
+     *
+     * WARNING: Default -1 (unlimited), which is probably not what you want.
+     *
      * @return timeout in ms
      */
     public long getReadTimeout();
@@ -40,6 +49,9 @@ public interface I2PSocketOptions {
      * What is the longest we'll block on the input stream while waiting
      * for more data.  If this value is exceeded, the read() throws 
      * InterruptedIOException
+     *
+     * WARNING: Default -1 (unlimited), which is probably not what you want.
+     *
      * @param ms timeout in ms
      */
     public void setReadTimeout(long ms);
@@ -50,6 +62,8 @@ public interface I2PSocketOptions {
      * either some data is removed or the connection is closed.  If this is 
      * less than or equal to zero, there is no limit (warning: can eat ram)
      *
+     * Default 64 KB
+     *
      * @return buffer size limit, in bytes
      */
     public int getMaxBufferSize();
@@ -60,6 +74,8 @@ public interface I2PSocketOptions {
      * either some data is removed or the connection is closed.  If this is 
      * less than or equal to zero, there is no limit (warning: can eat ram)
      *
+     * Default 64 KB
+     *
      * @param numBytes How much data will we accept that hasn't been written out yet.
      */
     public void setMaxBufferSize(int numBytes);
@@ -69,6 +85,9 @@ public interface I2PSocketOptions {
      * for the data to flush.  If this value is exceeded, the write() throws 
      * InterruptedIOException.  If this is less than or equal to zero, there 
      * is no timeout.
+     *
+     * Default -1 (unlimited)
+     *
      * @return wait time to block on the output stream while waiting for the data to flush.
      */
     public long getWriteTimeout();
@@ -78,6 +97,9 @@ public interface I2PSocketOptions {
      * for the data to flush.  If this value is exceeded, the write() throws 
      * InterruptedIOException.  If this is less than or equal to zero, there 
      * is no timeout.
+     *
+     * Default -1 (unlimited)
+     *
      * @param ms wait time to block on the output stream while waiting for the data to flush.
      */
     public void setWriteTimeout(long ms);
diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java
index 5d0636676be05648a04f407e6d0c58c0a8a5865a..3a1722dfb31942c1ffa174b71be64894139d843c 100644
--- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java
+++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java
@@ -96,6 +96,9 @@ class I2PSocketOptionsImpl implements I2PSocketOptions {
     /**
      * How long we will wait for the ACK from a SYN, in milliseconds.
      *
+     * Default 60 seconds. Max of 2 minutes enforced in Connection.java,
+     * and it also interprets <= 0 as default.
+     *
      * @return milliseconds to wait, or -1 if we will wait indefinitely
      */
     public long getConnectTimeout() {
@@ -105,6 +108,9 @@ class I2PSocketOptionsImpl implements I2PSocketOptions {
     /**
      * Define how long we will wait for the ACK from a SYN, in milliseconds.
      *
+     * Default 60 seconds. Max of 2 minutes enforced in Connection.java,
+     * and it also interprets <= 0 as default.
+     *
      */
     public void setConnectTimeout(long ms) {
         _connectTimeout = ms;
@@ -114,6 +120,8 @@ class I2PSocketOptionsImpl implements I2PSocketOptions {
      * What is the longest we'll block on the input stream while waiting
      * for more data.  If this value is exceeded, the read() throws 
      * InterruptedIOException
+     *
+     * WARNING: Default -1 (unlimited), which is probably not what you want.
      */
     public long getReadTimeout() {
         return _readTimeout;
@@ -123,6 +131,8 @@ class I2PSocketOptionsImpl implements I2PSocketOptions {
      * What is the longest we'll block on the input stream while waiting
      * for more data.  If this value is exceeded, the read() throws 
      * InterruptedIOException
+     *
+     * WARNING: Default -1 (unlimited), which is probably not what you want.
      */
     public void setReadTimeout(long ms) {
         _readTimeout = ms;
@@ -134,6 +144,8 @@ class I2PSocketOptionsImpl implements I2PSocketOptions {
      * either some data is removed or the connection is closed.  If this is 
      * less than or equal to zero, there is no limit (warning: can eat ram)
      *
+     * Default 64 KB
+     *
      * @return buffer size limit, in bytes
      */
     public int getMaxBufferSize() {
@@ -146,6 +158,8 @@ class I2PSocketOptionsImpl implements I2PSocketOptions {
      * either some data is removed or the connection is closed.  If this is 
      * less than or equal to zero, there is no limit (warning: can eat ram)
      *
+     * Default 64 KB
+     *
      */
     public void setMaxBufferSize(int numBytes) {
         _maxBufferSize = numBytes; 
@@ -156,6 +170,8 @@ class I2PSocketOptionsImpl implements I2PSocketOptions {
      * for the data to flush.  If this value is exceeded, the write() throws 
      * InterruptedIOException.  If this is less than or equal to zero, there 
      * is no timeout.
+     *
+     * Default -1 (unlimited)
      */
     public long getWriteTimeout() {
         return _writeTimeout;
@@ -166,6 +182,8 @@ class I2PSocketOptionsImpl implements I2PSocketOptions {
      * for the data to flush.  If this value is exceeded, the write() throws 
      * InterruptedIOException.  If this is less than or equal to zero, there 
      * is no timeout.
+     *
+     * Default -1 (unlimited)
      */
     public void setWriteTimeout(long ms) {
         _writeTimeout = ms;
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java
index f94f4b9c77287ae366901f13925e9d13c4193875..c3816570157cca83bff05c4b550e5be514f0866a 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java
@@ -218,7 +218,7 @@ public class ConfigClientsHelper extends HelperBase {
                         .append("<a href=\"").append(updateURL).append("\">").append(_("Update link")).append("</a><td>&nbsp;");
                 }
                 desc.append("</table>");
-                boolean enableStop = !Boolean.valueOf(appProps.getProperty("disableStop")).booleanValue();
+                boolean enableStop = !Boolean.parseBoolean(appProps.getProperty("disableStop"));
                 enableStop &= PluginStarter.isPluginRunning(app, _context);
                 boolean enableStart = !PluginStarter.isPluginRunning(app, _context);
                 renderForm(buf, app, app, false,
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java
index a2298c7f71506c4bd19d78a02acb67e40fadcfd7..cd1f103caf3cc9d109c708681c269301e8b67e76 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java
@@ -1,7 +1,5 @@
 package net.i2p.router.web;
 
-import java.net.InetAddress;
-import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -13,6 +11,7 @@ import net.i2p.router.transport.TransportImpl;
 import net.i2p.router.transport.TransportManager;
 import net.i2p.router.transport.udp.UDPTransport;
 import net.i2p.router.web.ConfigServiceHandler;
+import net.i2p.util.Addresses;
 
 /**
  * Handler to deal with form submissions from the main config form and act
@@ -143,6 +142,7 @@ public class ConfigNetHandler extends FormHandler {
      */
     private void saveChanges() {
         boolean restartRequired = false;
+        boolean error = false;
         List<String> removes = new ArrayList();
         
         if (!_ratesOnly) {
@@ -166,6 +166,8 @@ public class ConfigNetHandler extends FormHandler {
                     valid = verifyAddress(uhost);
                     if (valid) {
                         changes.put(UDPTransport.PROP_EXTERNAL_HOST, uhost);
+                    } else {
+                        error = true;
                     }
                 } else {
                     removes.add(UDPTransport.PROP_EXTERNAL_HOST);
@@ -182,7 +184,7 @@ public class ConfigNetHandler extends FormHandler {
             String oldNPort = _context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_PORT, "");
             String oldAutoHost = _context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_AUTO_IP, "true");
             String sAutoPort = _context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_AUTO_PORT, "true");
-            boolean oldAutoPort = Boolean.valueOf(sAutoPort).booleanValue();
+            boolean oldAutoPort = Boolean.parseBoolean(sAutoPort);
             if (_ntcpHostname == null) _ntcpHostname = "";
             if (_ntcpPort == null) _ntcpPort = "";
             if (_ntcpAutoIP == null) _ntcpAutoIP = "true";
@@ -195,7 +197,9 @@ public class ConfigNetHandler extends FormHandler {
                     valid = verifyAddress(_ntcpHostname);
                     if (valid) {
                         changes.put(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME, _ntcpHostname);
-                        addFormNotice(_("Updating inbound TCP address to") + " " + _ntcpHostname);
+                        addFormNotice(_("Updating TCP address to {0}", _ntcpHostname));
+                    } else {
+                        error = true;
                     }
                 } else {
                     removes.add(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME);
@@ -212,8 +216,18 @@ public class ConfigNetHandler extends FormHandler {
             }
             if (oldAutoPort != _ntcpAutoPort || ! oldNPort.equals(_ntcpPort)) {
                 if (_ntcpPort.length() > 0 && !_ntcpAutoPort) {
-                    changes.put(ConfigNetHelper.PROP_I2NP_NTCP_PORT, _ntcpPort);
-                    addFormNotice(_("Updating inbound TCP port to") + " " + _ntcpPort);
+                    int port = Addresses.getPort(_ntcpPort);
+                    if (port != 0) {
+                        changes.put(ConfigNetHelper.PROP_I2NP_NTCP_PORT, _ntcpPort);
+                        addFormNotice(_("Updating TCP port to {0}", _ntcpPort));
+                        if (port < 1024) {
+                            addFormError(_("Warning - ports less than 1024 are not recommended"));
+                            error = true;
+                        }
+                    } else {
+                        addFormError(_("Invalid port") + ": " + _ntcpPort);
+                        error = true;
+                    }
                 } else {
                     removes.add(ConfigNetHelper.PROP_I2NP_NTCP_PORT);
                     addFormNotice(_("Updating inbound TCP port to auto"));
@@ -226,10 +240,21 @@ public class ConfigNetHandler extends FormHandler {
             if ( (_udpPort != null) && (_udpPort.length() > 0) ) {
                 String oldPort = _context.getProperty(UDPTransport.PROP_INTERNAL_PORT, "unset");
                 if (!oldPort.equals(_udpPort)) {
-                    changes.put(UDPTransport.PROP_INTERNAL_PORT, _udpPort);
-                    changes.put(UDPTransport.PROP_EXTERNAL_PORT, _udpPort);
-                    addFormNotice(_("Updating UDP port from") + " " + oldPort + " " + _("to") + " " + _udpPort);
-                    restartRequired = true;
+                    int port = Addresses.getPort(_udpPort);
+                    if (port != 0) {
+                        changes.put(UDPTransport.PROP_INTERNAL_PORT, _udpPort);
+                        changes.put(UDPTransport.PROP_EXTERNAL_PORT, _udpPort);
+                        addFormNotice(_("Updating UDP port to {0}", _udpPort));
+                        if (port < 1024) {
+                            addFormError(_("Warning - ports less than 1024 are not recommended"));
+                            error = true;
+                        } else {
+                            restartRequired = true;
+                        }
+                    } else {
+                        addFormError(_("Invalid port") + ": " + _udpPort);
+                        error = true;
+                    }
                 }
             }
 
@@ -251,7 +276,7 @@ public class ConfigNetHandler extends FormHandler {
 
             changes.put(Router.PROP_DYNAMIC_KEYS, "" + _dynamicKeys);
 
-            if (Boolean.valueOf(_context.getProperty(TransportManager.PROP_ENABLE_UPNP)).booleanValue() !=
+            if (Boolean.parseBoolean(_context.getProperty(TransportManager.PROP_ENABLE_UPNP)) !=
                 _upnp) {
                 // This is minor, don't set restartRequired
                 if (_upnp)
@@ -261,7 +286,7 @@ public class ConfigNetHandler extends FormHandler {
             }
             changes.put(TransportManager.PROP_ENABLE_UPNP, "" + _upnp);
 
-            if (Boolean.valueOf(_context.getProperty(UDPTransport.PROP_LAPTOP_MODE)).booleanValue() !=
+            if (Boolean.parseBoolean(_context.getProperty(UDPTransport.PROP_LAPTOP_MODE)) !=
                 _laptop) {
                 // This is minor, don't set restartRequired
                 if (_laptop)
@@ -302,10 +327,11 @@ public class ConfigNetHandler extends FormHandler {
         if (ratesUpdated)
             _context.bandwidthLimiter().reinitialize();
         
-        if (switchRequired) {
-            hiddenSwitch();
-        } else if (restartRequired) {
-            //if (_context.hasWrapper()) {
+        if (saved && !error) {
+            if (switchRequired) {
+                hiddenSwitch();
+            } else if (restartRequired) {
+              //if (_context.hasWrapper()) {
                 // Wow this dumps all conns immediately and really isn't nice
                 addFormNotice("Performing a soft restart");
                 _context.router().restart();
@@ -320,12 +346,13 @@ public class ConfigNetHandler extends FormHandler {
                 // So don't do this...
                 //_context.router().rebuildRouterInfo();
                 //addFormNotice("Router Info rebuilt");
-            //} else {
+              //} else {
                 // There's a few changes that don't really require restart (e.g. enabling inbound TCP)
                 // But it would be hard to get right, so just do a restart.
                 //addFormError(_("Gracefully restarting I2P to change published router address"));
                 //_context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
-            //}
+              //}
+            }
         }
     }
 
@@ -337,17 +364,15 @@ public class ConfigNetHandler extends FormHandler {
     private boolean verifyAddress(String addr) {
         if (addr == null || addr.length() <= 0)
             return false;
-        try {
-            InetAddress ia = InetAddress.getByName(addr);
-            byte[] iab = ia.getAddress();
-            boolean rv = TransportImpl.isPubliclyRoutable(iab);
-            if (!rv)
-                addFormError(_("The hostname or IP {0} is not publicly routable", addr));
-            return rv;
-        } catch (UnknownHostException uhe) {
-            addFormError(_("The hostname or IP {0} is invalid", addr) + ": " + uhe);
+        byte[] iab = Addresses.getIP(addr);
+        if (iab == null) {
+            addFormError(_("Invalid address") + ": " + addr);
             return false;
         }
+        boolean rv = TransportImpl.isPubliclyRoutable(iab);
+        if (!rv)
+            addFormError(_("The hostname or IP {0} is not publicly routable", addr));
+        return rv;
     }
 
     private void hiddenSwitch() {
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java
index 6b79c40617f8bb381c00dadfe7d37481fefece23..3419ba2146c125cacb03a170a7e36032bed2bc06 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java
@@ -218,6 +218,9 @@ public class ConfigServiceHandler extends FormHandler {
         } else if (_("Do not view console on startup").equals(_action)) {
             browseOnStartup(false);
             addFormNotice(_("Console is not to be shown on startup"));
+        } else if (_("Force GC").equals(_action)) {
+            Runtime.getRuntime().gc();
+            addFormNotice(_("Full garbage collection requested"));
         } else {
             //addFormNotice("Blah blah blah.  whatever.  I'm not going to " + _action);
         }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java
index 8ef110c396564c89989a09682f6b08e3249f5735..07fad31975da21d62aec17baab9a651054686cf4 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java
@@ -74,15 +74,14 @@ public class ConfigUpdateHelper extends HelperBase {
     
     public String getUpdateThroughProxy() {
         String proxy = _context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY);
-        if (Boolean.valueOf(proxy).booleanValue()) 
+        if (Boolean.parseBoolean(proxy)) 
             return "<input type=\"checkbox\" class=\"optbox\" value=\"true\" name=\"updateThroughProxy\" checked=\"checked\" >";
         else
             return "<input type=\"checkbox\" class=\"optbox\" value=\"true\" name=\"updateThroughProxy\" >";
     }
     
     public String getUpdateUnsigned() {
-        String foo = _context.getProperty(ConfigUpdateHandler.PROP_UPDATE_UNSIGNED);
-        if (Boolean.valueOf(foo).booleanValue()) 
+        if (_context.getBooleanProperty(ConfigUpdateHandler.PROP_UPDATE_UNSIGNED))
             return "<input type=\"checkbox\" class=\"optbox\" value=\"true\" name=\"updateUnsigned\" checked=\"checked\" >";
         else
             return "<input type=\"checkbox\" class=\"optbox\" value=\"true\" name=\"updateUnsigned\" >";
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java
index b56108be389334f60af91d52016b17b6cc3c5d5c..2200b9af6d3f850397f7c7690be567aa5fb2f6f3 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java
@@ -16,7 +16,7 @@ public class ContentHelper extends HelperBase {
      */
     public void setPage(String page) { _page = page; }
     public void setStartAtBeginning(String moo) { 
-        _startAtBeginning = Boolean.valueOf(""+moo).booleanValue(); 
+        _startAtBeginning = Boolean.parseBoolean(moo); 
     }
     public void setLang(String l) {
 /*****
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java
index aa6596a2047a5a5d36ef4a772185295e32d40aec..de9d427eeabe0c16803b3e5ee68ba228c33bccef 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java
@@ -24,12 +24,19 @@ public class LogsHelper extends HelperBase {
         return Server.getVersion();
     }
 
+    /**
+     *  Does not call logManager.flush(); call getCriticalLogs() first to flush
+     */
     public String getLogs() {
         String str = formatMessages(_context.logManager().getBuffer().getMostRecentMessages());
         return _("File location") + ": <b><code>" + _context.logManager().currentFile() + "</code></b><br><br>" + str;
     }
     
+    /**
+     *  Side effect - calls logManager.flush()
+     */
     public String getCriticalLogs() {
+        _context.logManager().flush();
         return formatMessages(_context.logManager().getBuffer().getMostRecentCriticalMessages());
     }
     
@@ -91,6 +98,7 @@ public class LogsHelper extends HelperBase {
         for (int i = msgs.size() - 1; i >= 0; i--) { 
             String msg = msgs.get(i);
             msg = msg.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;");
+            msg = msg.replace("&amp;darr;", "&darr;");  // hack - undo the damage (LogWriter)
             // remove  last \n that LogRecordFormatter added
             if (msg.endsWith(NL))
                 msg = msg.substring(0, msg.length() - NL.length());
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
index 23210dced01222ecc4c5daecf21c8b9c519a7775..84b5a75ee56227815c51464b1dcd628206e8c12d 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
@@ -172,7 +172,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
     boolean dontInstall() {
         File test = new File(_context.getBaseDir(), "history.txt");
         boolean readonly = ((test.exists() && !test.canWrite()) || (!_context.getBaseDir().canWrite()));
-        boolean disabled = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_UPDATE_DISABLED)).booleanValue();
+        boolean disabled = _context.getBooleanProperty(ConfigUpdateHandler.PROP_UPDATE_DISABLED);
         return readonly || disabled;
     }
 
@@ -220,7 +220,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
 
     public void fetchNews() {
         String newsURL = ConfigUpdateHelper.getNewsURL(_context);
-        boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
+        boolean shouldProxy = Boolean.parseBoolean(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY));
         String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST);
         int proxyPort = ConfigUpdateHandler.proxyPort(_context);
         if (_tempFile.exists())
@@ -252,7 +252,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
     public boolean shouldFetchUnsigned() {
         String url = _context.getProperty(ConfigUpdateHandler.PROP_ZIP_URL);
         return url != null && url.length() > 0 &&
-               Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_UPDATE_UNSIGNED)).booleanValue() &&
+               _context.getBooleanProperty(ConfigUpdateHandler.PROP_UPDATE_UNSIGNED) &&
                !dontInstall();
     }
 
@@ -265,7 +265,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
         if (url == null || url.length() <= 0)
             return;
         // assume always proxied for now
-        //boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
+        //boolean shouldProxy = Boolean.parseBoolean(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY));
         String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST);
         int proxyPort = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT, ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT);
 
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java
index 06f2e019ca610c5a5a99156d4c76159870e4166c..60e9dd8c3a3f4f51a283f0c885f817e09a143f2d 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java
@@ -61,12 +61,12 @@ public class PluginStarter implements Runnable {
     }
 
     static boolean pluginsEnabled(I2PAppContext ctx) {
-         return Boolean.valueOf(ctx.getProperty("router.enablePlugins", "true")).booleanValue();
+         return ctx.getBooleanPropertyDefaultTrue("router.enablePlugins");
     }
 
     public void run() {
         if (_context.getBooleanPropertyDefaultTrue("plugins.autoUpdate") &&
-            (!Boolean.valueOf(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS)).booleanValue()) &&
+            (!Boolean.parseBoolean(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS))) &&
             (!RouterVersion.VERSION.equals(_context.getProperty("router.previousVersion"))))
             updateAll(_context, true);
         startPlugins(_context);
@@ -169,7 +169,7 @@ public class PluginStarter implements Runnable {
         for (Iterator iter = props.keySet().iterator(); iter.hasNext(); ) {
             String name = (String)iter.next();
             if (name.startsWith(PREFIX) && name.endsWith(ENABLED)) {
-                if (Boolean.valueOf(props.getProperty(name)).booleanValue()) {
+                if (Boolean.parseBoolean(props.getProperty(name))) {
                     String app = name.substring(PREFIX.length(), name.lastIndexOf(ENABLED));
                     // plugins could have been started after update
                     if (isPluginRunning(app, ctx))
@@ -508,7 +508,7 @@ public class PluginStarter implements Runnable {
     public static boolean isPluginEnabled(String appName) {
         Properties props = pluginProperties();
         String prop = PREFIX + appName + ENABLED;
-        return Boolean.valueOf(props.getProperty(prop, "true")).booleanValue();
+        return Boolean.parseBoolean(props.getProperty(prop, "true"));
     }
 
     /**
@@ -519,7 +519,7 @@ public class PluginStarter implements Runnable {
     public static void disablePlugin(String appName) {
         Properties props = pluginProperties();
         String prop = PREFIX + appName + ENABLED;
-        if (Boolean.valueOf(props.getProperty(prop, "true")).booleanValue()) {
+        if (Boolean.parseBoolean(props.getProperty(prop, "true"))) {
             props.setProperty(prop, "false");
             storePluginProperties(props);
         }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java
index 621c0d898bd74559e0c7acfbf3754311aa681bbf..8e895702409bf193107f855d2dac3dc9332ad702 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java
@@ -139,7 +139,7 @@ public class PluginUpdateHandler extends UpdateHandler {
             } else {
                 updateStatus("<b>" + _("Downloading plugin from {0}", _xpi2pURL) + "</b>");
                 // use the same settings as for updater
-                boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
+                boolean shouldProxy = Boolean.parseBoolean(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY));
                 String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST);
                 int proxyPort = ConfigUpdateHandler.proxyPort(_context);
                 try {
@@ -313,7 +313,7 @@ public class PluginUpdateHandler extends UpdateHandler {
             boolean wasRunning = false;
             File destDir = new SecureDirectory(appDir, appName);
             if (destDir.exists()) {
-                if (Boolean.valueOf(props.getProperty("install-only")).booleanValue()) {
+                if (Boolean.parseBoolean(props.getProperty("install-only"))) {
                     to.delete();
                     statusDone("<b>" + _("Downloaded plugin is for new installs only, but the plugin is already installed", url) + "</b>");
                     return;
@@ -374,7 +374,7 @@ public class PluginUpdateHandler extends UpdateHandler {
                     return;
                 }
                 // do we defer extraction and installation?
-                if (Boolean.valueOf(props.getProperty("router-restart-required")).booleanValue()) {
+                if (Boolean.parseBoolean(props.getProperty("router-restart-required"))) {
                     // Yup!
                     try {
                         if(!FileUtil.copy(to, (new SecureFile( new SecureFile(appDir.getCanonicalPath() +"/" + appName +"/"+ ZIP).getCanonicalPath())) , true, true)) {
@@ -405,7 +405,7 @@ public class PluginUpdateHandler extends UpdateHandler {
                 }
                 update = true;
             } else {
-                if (Boolean.valueOf(props.getProperty("update-only")).booleanValue()) {
+                if (Boolean.parseBoolean(props.getProperty("update-only"))) {
                     to.delete();
                     statusDone("<b>" + _("Plugin is for upgrades only, but the plugin is not installed") + "</b>");
                     return;
@@ -426,7 +426,7 @@ public class PluginUpdateHandler extends UpdateHandler {
             _updated = true;
             to.delete();
             // install != update. Changing the user's settings like this is probabbly a bad idea.
-            if (Boolean.valueOf( props.getProperty("dont-start-at-install")).booleanValue()) {
+            if (Boolean.parseBoolean( props.getProperty("dont-start-at-install"))) {
                 statusDone("<b>" + _("Plugin {0} installed", appName) + "</b>");
                 if(!update) {
                     Properties pluginProps = PluginStarter.pluginProperties();
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 cc8a26f14c2c0c077183a7d5dbb96e9ac126b6f9..c520a2bb5635dc943cdafe7d2f86a87f7031ff6e 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
@@ -120,8 +120,8 @@ public class SummaryHelper extends HelperBase {
     
     public boolean allowReseed() {
         return _context.netDb().isInitialized() &&
-               ((_context.netDb().getKnownRouters() < 30) ||
-                Boolean.valueOf(_context.getProperty("i2p.alwaysAllowReseed")).booleanValue());
+               (_context.netDb().getKnownRouters() < 30) ||
+                _context.getBooleanProperty("i2p.alwaysAllowReseed");
     }
     
     /** subtract one for ourselves, so if we know no other peers it displays zero */
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java
index 1492f3bb1f319f620daf69eb6e7f530f88695e6a..2b87231bb6ccc2d39a20bb279e56c7292b49cc84 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java
@@ -169,7 +169,7 @@ public class UpdateHandler {
             // Alternative: In bytesTransferred(), Check the data in the output file after
             // we've received at least 56 bytes. Need a cancel() method in EepGet ?
 
-            boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
+            boolean shouldProxy = Boolean.parseBoolean(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY));
             String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST);
             int proxyPort = ConfigUpdateHandler.proxyPort(_context);
 
diff --git a/apps/routerconsole/jsp/configservice.jsp b/apps/routerconsole/jsp/configservice.jsp
index 628010685d9f255dcaa3837dbf03d2c629ea35b3..303fa4d31cb370be4a1f332d6129ce00fa585902 100644
--- a/apps/routerconsole/jsp/configservice.jsp
+++ b/apps/routerconsole/jsp/configservice.jsp
@@ -62,17 +62,21 @@
 
  <h3><%=intl._("Debugging")%></h3>
  <p><a href="/jobs"><%=intl._("View the job queue")%></a>
- <% if (System.getProperty("wrapper.version") != null) { %>
+<% if (System.getProperty("wrapper.version") != null) { %>
  <p><%=intl._("At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to <a href=\"logs.jsp#servicelogs\">wrapper.log</a>.")%></p>
-  <hr><div class="formaction">
- <input type="submit" name="action" value="<%=intl._("Dump threads")%>" >
- </div>
+  <hr>
 <% } %>
+ <div class="formaction">
+ <input type="submit" class="reload" name="action" value="<%=intl._("Force GC")%>" >
+<% if (System.getProperty("wrapper.version") != null) { %>
+ <input type="submit" class="download" name="action" value="<%=intl._("Dump threads")%>" >
+<% } %>
+ </div>
 
  <h3><%=intl._("Launch browser on router startup?")%></h3>
  <p><%=intl._("I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at")%>
  <a href="http://127.0.0.1:7657/">http://127.0.0.1:7657/</a> .</p>
  <hr><div class="formaction">
- <input type="submit" name="action" value="<%=intl._("View console on startup")%>" >
- <input type="submit" name="action" value="<%=intl._("Do not view console on startup")%>" >
+ <input type="submit" class="check" name="action" value="<%=intl._("View console on startup")%>" >
+ <input type="submit" class="delete" name="action" value="<%=intl._("Do not view console on startup")%>" >
 </div></form></div></div></body></html>
diff --git a/apps/routerconsole/jsp/error500.jsp b/apps/routerconsole/jsp/error500.jsp
index 2b420e4f6d13b49d60a7e1abd536068130d98fca..2ffeadff87f4e87ee3c070a0d27b00b1ba52b7a5 100644
--- a/apps/routerconsole/jsp/error500.jsp
+++ b/apps/routerconsole/jsp/error500.jsp
@@ -1,5 +1,4 @@
 <%@page contentType="text/html"%>
-<%@page trimDirectiveWhitespaces="true"%>
 <%@page pageEncoding="UTF-8"%>
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <%
diff --git a/apps/routerconsole/locale/messages_cs.po b/apps/routerconsole/locale/messages_cs.po
index c3e3f1216c3568d4b68e258b3db53a39f6ea2329..78e1d98081a5a7eea74c6792df666443f8bcac80 100644
--- a/apps/routerconsole/locale/messages_cs.po
+++ b/apps/routerconsole/locale/messages_cs.po
@@ -9,15 +9,15 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-02-17 11:43+0000\n"
-"PO-Revision-Date: 2012-02-17 11:34+0000\n"
-"Last-Translator: kytv <killyourtv@i2pmail.org>\n"
-"Language-Team: Czech (http://www.transifex.net/projects/p/I2P/language/cs/)\n"
+"POT-Creation-Date: 2012-09-12 11:58+0000\n"
+"PO-Revision-Date: 2012-09-08 21:09+0000\n"
+"Last-Translator: Waseihou Watashi <waseihou@gmail.com>\n"
+"Language-Team: Czech (http://www.transifex.com/projects/p/I2P/language/cs/)\n"
 "Language: cs\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #. NOTE TO TRANSLATORS: Feel free to translate all these as you see fit, there are several options...
 #. spaces or not, '.' or not, plural or not. Try not to make it too long, it is used in
@@ -27,7 +27,7 @@ msgstr ""
 #. {0,number,####} prevents 1234 from being output as 1,234 in the English locale.
 #. If you want the digit separator in your locale, translate as {0}.
 #. alternates: msec, msecs
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1361
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1396
 #, java-format
 msgid "1 ms"
 msgid_plural "{0,number,####} ms"
@@ -37,7 +37,7 @@ msgstr[2] "{0,number,####} ms"
 
 #. seconds
 #. alternates: secs, sec. 'seconds' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1365
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1400
 #, java-format
 msgid "1 sec"
 msgid_plural "{0} sec"
@@ -47,7 +47,7 @@ msgstr[2] "{0} sek."
 
 #. minutes
 #. alternates: mins, min. 'minutes' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1369
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1404
 #, java-format
 msgid "1 min"
 msgid_plural "{0} min"
@@ -57,7 +57,7 @@ msgstr[2] "{0} minut"
 
 #. hours
 #. alternates: hrs, hr., hrs.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1373
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1408
 #, java-format
 msgid "1 hour"
 msgid_plural "{0} hours"
@@ -65,13 +65,13 @@ msgstr[0] "{0} hodina"
 msgstr[1] "{0} hodiny"
 msgstr[2] "{0} hodin"
 
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1375
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:315
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1410
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:341
 msgid "n/a"
 msgstr "neaplikovatelné"
 
 #. days
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1378
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1413
 #, java-format
 msgid "1 day"
 msgid_plural "{0} days"
@@ -79,43 +79,44 @@ msgstr[0] "{0} den"
 msgstr[1] "{0} dny"
 msgstr[2] "{0} dnů"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:128
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:127
 #, java-format
 msgid "Banned by router hash: {0}"
 msgstr "Zakázáno hašišem routeru: {0}"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:130
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:129
 msgid "Banned by router hash"
 msgstr "Zakázáno hašišem routeru"
 
 #. Temporary reason, until the job finishes
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:679
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:752
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:672
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:745
 #, java-format
 msgid "IP banned by blocklist.txt entry {0}"
 msgstr "IP adresa zakázána v souboru blocklist.txt, záznam {0}"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:791
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:784
 msgid "IPs Banned Until Restart"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:815
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:808
 msgid "IPs Permanently Banned"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:817
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:810
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:66
 msgid "From"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:819
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:75
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:812
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:67
 msgid "To"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:855
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:848
 #: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:415
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:647
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:451
 msgid "none"
 msgstr ""
 
@@ -123,63 +124,63 @@ msgstr ""
 #. if (_context.router().getRouterInfo().getBandwidthTier().equals("K"))
 #. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low");
 #. else
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:82
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:124
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:526
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:73
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:115
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:517
 msgid "Rejecting tunnels: Starting up"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:177
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:168
 msgid "Rejecting tunnels: High message delay"
 msgstr "Odmítám tunely: velké spoždění zprávy"
 
 #. hard to do {0} from here
 #. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of tunnels: High number of requests");
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:216
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:207
 msgid "Rejecting most tunnels: High number of requests"
 msgstr "Odmítám tunely: velké množství požadavků"
 
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:271
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:262
 msgid "Rejecting tunnels: Limit reached"
 msgstr "Odmítám tunely: limit dosažen"
 
 #. .067KBps
 #. * also limited to 90% - see below
 #. always leave at least 4KBps free when allowing
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:339
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:330
 msgid "Rejecting tunnels: Bandwidth limit"
 msgstr "Odmítnutí tunelů: limit rychlosti"
 
 #. hard to do {0} from here
 #. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels: Bandwidth limit");
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:409
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:400
 msgid "Rejecting most tunnels: Bandwidth limit"
 msgstr "Odmítnutí většiny tunelů: limit rychlost"
 
 #. hard to do {0} from here
 #. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of tunnels");
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:413
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:404
 msgid "Accepting most tunnels"
 msgstr "Přijetí většiny tunelů"
 
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:415
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:406
 msgid "Accepting tunnels"
 msgstr "Přijetí tunelů"
 
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:531
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:522
 msgid "Rejecting tunnels: Shutting down"
 msgstr "Odmítám tunely: vypínání"
 
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:536
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:527
 msgid "Rejecting tunnels"
 msgstr "Odmítnutí tunelů"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:155
-#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:151
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:22
 msgid "Reseeding"
 msgstr "Opětovné sdílení (reseeding)"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:171
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:163
 #, java-format
 msgid "Reseed fetched only 1 router."
 msgid_plural "Reseed fetched only {0} routers."
@@ -187,24 +188,24 @@ msgstr[0] "Reseed získán pouze pro 1 router."
 msgstr[1] "Reseed získán pouze pro {0} routerů."
 msgstr[2] "Reseed získán pouze pro {0} routerů."
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:178
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:170
 msgid "Reseed failed."
 msgstr "Reseed selhal."
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:179
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:171
 #, java-format
 msgid "See {0} for help."
 msgstr "Další informace viz. {0}."
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:180
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:172
 msgid "reseed configuration page"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:323
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:313
 msgid "Reseeding: fetching seed URL."
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:373
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:371
 #, java-format
 msgid ""
 "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
@@ -237,7 +238,7 @@ msgstr ""
 msgid "Known fast peers"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:526
+#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:529
 msgid "NetDb entry"
 msgstr "Záznam NetDB"
 
@@ -246,25 +247,26 @@ msgstr "Záznam NetDB"
 msgid "No transports (hidden or starting up?)"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:445
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:453
 msgid "Unreachable on any transport"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:494
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:502
 msgid "Router Transport Addresses"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:507
 #, java-format
 msgid "{0} is used for outbound connections only"
-msgstr ""
+msgstr "{0} je použito pouze pro odchozí spojení"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:513
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:137
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521
+#: ../java/src/net/i2p/router/web/HomeHelper.java:32
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:152
 msgid "Help"
 msgstr "Nápověda"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:514
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:522
 msgid ""
 "Your transport connection limits are automatically set based on your "
 "configured bandwidth."
@@ -272,7 +274,7 @@ msgstr ""
 "Vaše limity spojení pro přeneos jsou automaticky nastaveny v závislosti na "
 "nastavení přenosové rychlosti."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:516
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
 msgid ""
 "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and "
 "i2np.udp.maxConnections=nnn on the advanced configuration page."
@@ -280,270 +282,271 @@ msgstr ""
 "Pro nastavení těchto limitů přidejte nastavení i2np.ntcp.maxConnections=nnn "
 "a i2np.udp.maxConnections=nnn na stránce pokročilá nastavení."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:279
 msgid "Definitions"
 msgstr "Definice"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:751
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1976
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:753
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2063
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:91
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204
 msgid "Peer"
 msgstr "Sdíleč"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527
 msgid "The remote peer, identified by router hash"
 msgstr "Vzdálený sdíleč určený hašišem routru."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:752
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1980
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:754
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2067
 msgid "Dir"
 msgstr "Adresář"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529
 msgid "Inbound connection"
 msgstr "Příchozí spojení"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531
 msgid "Outbound connection"
 msgstr "Odchozí spojení"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
 msgid "They offered to introduce us (help other peers traverse our firewall)"
 msgstr ""
 "Nabídli nám že nás představí (pomoc ostatním sdílečům překonat náš firewall)."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
 msgid "We offered to introduce them (help other peers traverse their firewall)"
 msgstr ""
 "Nabídli jsme jim že je představíme (pomoc ostatním sdílečům překonat "
 "firewall za kterým jsou)."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
 msgid "How long since a packet has been received / sent"
 msgstr "Doba od posledního přijetí / odeslání paketu."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:753
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1981
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:755
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2068
 msgid "Idle"
 msgstr "Nečinný"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:754
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1986
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:164
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:756
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2073
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:157
 msgid "In/Out"
 msgstr "příchozí/odchozí"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)"
 msgstr "Průměrná příchozí / odchozí přenosová rychlost."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
 msgid "How long ago this connection was established"
 msgstr "Před jak dlouhou dobou bylo toto spojení navázáno"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:755
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1991
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:757
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2078
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:835
 msgid "Up"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:756
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1993
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2080
 msgid "Skew"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
 msgid "The difference between the peer's clock and your own"
 msgstr "Rozdíl mezi vašim časem a časem sdíleče."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
 msgid ""
 "The congestion window, which is how many bytes can be sent without an "
 "acknowledgement"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
 msgid "The number of sent messages awaiting acknowledgement"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
 msgid "The maximum number of concurrent messages to send"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
 msgid "The number of pending sends which exceed congestion window"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
 msgid "The slow start threshold"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
 msgid "The round trip time in milliseconds"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2003
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2090
 msgid "Dev"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
 msgid "The standard deviation of the round trip time in milliseconds"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
 msgid "The retransmit timeout in milliseconds"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
 msgid ""
 "Current maximum send packet size / estimated maximum receive packet size "
 "(bytes)"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:757
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2010
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:759
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2097
 msgid "TX"
 msgstr "TX"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
 msgid "The total number of packets sent to the peer"
-msgstr ""
+msgstr "Celkový počet paketů odeslaných "
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2012
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2099
 msgid "RX"
 msgstr "RX"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550
 msgid "The total number of packets received from the peer"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2015
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2102
 msgid "Dup TX"
 msgstr "Dup TX"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551
 msgid "The total number of packets retransmitted to the peer"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2017
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:552
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2104
 msgid "Dup RX"
 msgstr "Dup RX"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:552
 msgid "The total number of duplicate packets received from the peer"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:437
-#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:448
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
 msgid "Service"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:439
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:450
 msgid "WAN Common Interface Configuration"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:440
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:446
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:456
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:461
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:86
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:451
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:457
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:467
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:472
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:96
 msgid "Status"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:441
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:447
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:457
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:452
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:458
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:468
 msgid "Type"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:442
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:448
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:453
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:459
 msgid "Upstream"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:443
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:449
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:454
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:460
 msgid "Downstream"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:445
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:456
 msgid "WAN PPP Connection"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:450
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:458
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:461
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:469
 msgid "External IP"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:452
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:463
 msgid "Layer 3 Forwarding"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:453
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:464
 msgid "Default Connection Service"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:455
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:466
 msgid "WAN IP Connection"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:460
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:471
 msgid "WAN Ethernet Link Configuration"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:473
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:484
 msgid "Found Device"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:475
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:486
 msgid "Subdevice"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:496
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:507
 msgid "UPnP Status"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:499
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:510
 msgid ""
 "UPnP has been disabled; Do you have more than one UPnP Internet Gateway "
 "Device on your LAN ?"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:502
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:513
 msgid "UPnP has not found any UPnP-aware, compatible device on your LAN."
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:510
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:521
 #, java-format
 msgid "The current external IP address reported by UPnP is {0}"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:512
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:523
 msgid "The current external IP address is not available."
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:516
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:527
 #, java-format
 msgid "UPnP reports the maximum downstream bit rate is {0}bits/sec"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:518
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:529
 #, java-format
 msgid "UPnP reports the maximum upstream bit rate is {0}bits/sec"
 msgstr ""
@@ -551,1396 +554,1473 @@ msgstr ""
 #. {0} is TCP or UDP
 #. {1,number,#####} prevents 12345 from being output as 12,345 in the English locale.
 #. If you want the digit separator in your locale, translate as {1}.
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:527
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:538
 #, java-format
 msgid "{0} port {1,number,#####} was successfully forwarded by UPnP."
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:529
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:540
 #, java-format
 msgid "{0} port {1,number,#####} was not forwarded by UPnP."
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/UPnPManager.java:163
+#: ../../../router/java/src/net/i2p/router/transport/UPnPManager.java:162
 msgid "UPnP is not enabled"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:416
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:633
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:401
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:618
 #, java-format
 msgid "Excessive clock skew: {0}"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:746
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:748
 msgid "NTCP connections"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:747
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1972
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:749
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2059
 msgid "Limit"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:748
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1973
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:750
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2060
 msgid "Timeout"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:759
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:761
 msgid "Out Queue"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:762
 msgid "Backlogged?"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:774
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2035
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:776
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2122
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:88
 msgid "Inbound"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:776
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2037
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:778
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2124
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:88
 msgid "Outbound"
 msgstr ""
 
 #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:825
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:827
 msgid "peers"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1971
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2058
 msgid "UDP connections"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1978
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2065
 msgid "Sort by peer hash"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1980
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2067
 msgid "Direction/Introduction"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1982
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2069
 msgid "Sort by idle inbound"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1984
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2071
 msgid "Sort by idle outbound"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1987
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2074
 msgid "Sort by inbound rate"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1989
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2076
 msgid "Sort by outbound rate"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1992
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2079
 msgid "Sort by connection uptime"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1994
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2081
 msgid "Sort by clock skew"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1997
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2084
 msgid "Sort by congestion window"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1999
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2086
 msgid "Sort by slow start threshold"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2002
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2089
 msgid "Sort by round trip time"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2004
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2091
 msgid "Sort by round trip time deviation"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2006
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2093
 msgid "Sort by retransmission timeout"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2009
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2096
 msgid "Sort by outbound maximum transmit unit"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2011
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2098
 msgid "Sort by packets sent"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2013
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2100
 msgid "Sort by packets received"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2016
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2103
 msgid "Sort by packets retransmitted"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2018
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2105
 msgid "Sort by packets received more than once"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2039
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2126
 msgid "We offered to introduce them"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2041
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2128
 msgid "They offered to introduce us"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2045
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2132
 msgid "Choked"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2053
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2140
 msgid "1 fail"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2055
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2142
 #, java-format
 msgid "{0} fails"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2061
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162
+#. 1
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2148
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171
+#: ../java/src/net/i2p/router/web/ProfilesHelper.java:13
 msgid "Banned"
 msgstr ""
 
 #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2192
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2278
 msgid "SUMMARY"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:159
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:187
 msgid "Dropping tunnel requests: Too slow"
 msgstr ""
 
 #. don't even bother, since we are so overloaded locally
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:304
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:330
 msgid "Dropping tunnel requests: Overloaded"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:513
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:539
 msgid "Rejecting tunnels: Request overload"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:544
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:570
 msgid "Rejecting tunnels: Connection limit"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:747
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:768
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:773
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:794
 msgid "Dropping tunnel requests: High load"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:760
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:786
 msgid "Dropping tunnel requests: Queue time"
 msgstr ""
 
-#. geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
-#: ../java/build/Countries.java:8
-msgid " -f3-5 < GeoIPCountryWhois.csv|sed 's/"
-msgstr ""
-
-#. geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
-#. g' > geoip.txt");
-#: ../java/build/Countries.java:9
-msgid " -f5,6 < GeoIPCountryWhois.csv |sed 's/"
-msgstr ""
-
-#. geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
-#. g' > geoip.txt");
-#. g' | sort | uniq > countries.txt");
-#: ../java/build/Countries.java:10
+#. Automatically generated pseudo-java for xgettext - do not edit
+#. Translators may wish to translate a few of these, do not bother to translate all of them!!
+#: ../java/build/Countries.java:3
 msgid "Anonymous Proxy"
 msgstr ""
 
-#: ../java/build/Countries.java:11
+#: ../java/build/Countries.java:4
 msgid "Satellite Provider"
 msgstr ""
 
-#: ../java/build/Countries.java:12
+#: ../java/build/Countries.java:5
 msgid "Andorra"
 msgstr ""
 
-#: ../java/build/Countries.java:13
+#: ../java/build/Countries.java:6
 msgid "United Arab Emirates"
 msgstr ""
 
-#: ../java/build/Countries.java:14
+#: ../java/build/Countries.java:7
 msgid "Afghanistan"
 msgstr ""
 
-#: ../java/build/Countries.java:15
+#: ../java/build/Countries.java:8
 msgid "Antigua and Barbuda"
 msgstr ""
 
-#: ../java/build/Countries.java:16
+#: ../java/build/Countries.java:9
 msgid "Anguilla"
 msgstr ""
 
-#: ../java/build/Countries.java:17
+#: ../java/build/Countries.java:10
 msgid "Albania"
 msgstr ""
 
-#: ../java/build/Countries.java:18
+#: ../java/build/Countries.java:11
 msgid "Armenia"
 msgstr ""
 
-#: ../java/build/Countries.java:19
+#: ../java/build/Countries.java:12
 msgid "Netherlands Antilles"
 msgstr ""
 
-#: ../java/build/Countries.java:20
+#: ../java/build/Countries.java:13
 msgid "Angola"
 msgstr ""
 
-#: ../java/build/Countries.java:21
+#: ../java/build/Countries.java:14
 msgid "Antarctica"
 msgstr ""
 
-#: ../java/build/Countries.java:22
+#: ../java/build/Countries.java:15
 msgid "Argentina"
 msgstr ""
 
-#: ../java/build/Countries.java:23
+#: ../java/build/Countries.java:16
 msgid "American Samoa"
 msgstr ""
 
-#: ../java/build/Countries.java:24
+#: ../java/build/Countries.java:17
 msgid "Austria"
 msgstr ""
 
-#: ../java/build/Countries.java:25
+#: ../java/build/Countries.java:18
 msgid "Australia"
 msgstr ""
 
-#: ../java/build/Countries.java:26
+#: ../java/build/Countries.java:19
 msgid "Aruba"
 msgstr ""
 
-#: ../java/build/Countries.java:27
+#: ../java/build/Countries.java:20
 msgid "Åland Islands"
 msgstr ""
 
-#: ../java/build/Countries.java:28
+#: ../java/build/Countries.java:21
 msgid "Azerbaijan"
 msgstr ""
 
-#: ../java/build/Countries.java:29
+#: ../java/build/Countries.java:22
 msgid "Bosnia and Herzegovina"
 msgstr ""
 
-#: ../java/build/Countries.java:30
+#: ../java/build/Countries.java:23
 msgid "Barbados"
 msgstr ""
 
-#: ../java/build/Countries.java:31
+#: ../java/build/Countries.java:24
 msgid "Bangladesh"
 msgstr ""
 
-#: ../java/build/Countries.java:32
+#: ../java/build/Countries.java:25
 msgid "Belgium"
 msgstr ""
 
-#: ../java/build/Countries.java:33
+#: ../java/build/Countries.java:26
 msgid "Burkina Faso"
 msgstr ""
 
-#: ../java/build/Countries.java:34
+#: ../java/build/Countries.java:27
 msgid "Bulgaria"
 msgstr ""
 
-#: ../java/build/Countries.java:35
+#: ../java/build/Countries.java:28
 msgid "Bahrain"
 msgstr ""
 
-#: ../java/build/Countries.java:36
+#: ../java/build/Countries.java:29
 msgid "Burundi"
 msgstr ""
 
-#: ../java/build/Countries.java:37
+#: ../java/build/Countries.java:30
 msgid "Benin"
 msgstr ""
 
-#: ../java/build/Countries.java:38
+#: ../java/build/Countries.java:31
 msgid "Bermuda"
 msgstr ""
 
-#: ../java/build/Countries.java:39
+#: ../java/build/Countries.java:32
 msgid "Brunei Darussalam"
 msgstr ""
 
-#: ../java/build/Countries.java:40
+#: ../java/build/Countries.java:33
 msgid "Bolivia"
 msgstr ""
 
-#: ../java/build/Countries.java:41
+#: ../java/build/Countries.java:34
 msgid "Brazil"
 msgstr ""
 
-#: ../java/build/Countries.java:42
+#: ../java/build/Countries.java:35
 msgid "Bahamas"
 msgstr ""
 
-#: ../java/build/Countries.java:43
+#: ../java/build/Countries.java:36
 msgid "Bhutan"
 msgstr ""
 
-#: ../java/build/Countries.java:44
+#: ../java/build/Countries.java:37
 msgid "Bouvet Island"
 msgstr ""
 
-#: ../java/build/Countries.java:45
+#: ../java/build/Countries.java:38
 msgid "Botswana"
 msgstr ""
 
-#: ../java/build/Countries.java:46
+#: ../java/build/Countries.java:39
 msgid "Belarus"
 msgstr ""
 
-#: ../java/build/Countries.java:47
+#: ../java/build/Countries.java:40
 msgid "Belize"
 msgstr ""
 
-#: ../java/build/Countries.java:48
+#: ../java/build/Countries.java:41
 msgid "Canada"
 msgstr ""
 
-#: ../java/build/Countries.java:49
+#: ../java/build/Countries.java:42
 msgid "Cocos (Keeling) Islands"
 msgstr ""
 
-#: ../java/build/Countries.java:50
+#: ../java/build/Countries.java:43
 msgid "The Democratic Republic of the Congo"
 msgstr ""
 
-#: ../java/build/Countries.java:51
+#: ../java/build/Countries.java:44
 msgid "Central African Republic"
 msgstr ""
 
-#: ../java/build/Countries.java:52
+#: ../java/build/Countries.java:45
 msgid "Congo"
 msgstr ""
 
-#: ../java/build/Countries.java:53
+#: ../java/build/Countries.java:46
 msgid "Switzerland"
 msgstr ""
 
-#: ../java/build/Countries.java:54
+#: ../java/build/Countries.java:47
 msgid "Cote D'Ivoire"
 msgstr ""
 
-#: ../java/build/Countries.java:55
+#: ../java/build/Countries.java:48
 msgid "Cook Islands"
 msgstr ""
 
-#: ../java/build/Countries.java:56
+#: ../java/build/Countries.java:49
 msgid "Chile"
 msgstr ""
 
-#: ../java/build/Countries.java:57
+#: ../java/build/Countries.java:50
 msgid "Cameroon"
 msgstr ""
 
-#: ../java/build/Countries.java:58
+#: ../java/build/Countries.java:51
 msgid "China"
 msgstr ""
 
-#: ../java/build/Countries.java:59
+#: ../java/build/Countries.java:52
 msgid "Colombia"
 msgstr ""
 
-#: ../java/build/Countries.java:60
+#: ../java/build/Countries.java:53
 msgid "Costa Rica"
 msgstr ""
 
-#: ../java/build/Countries.java:61
+#: ../java/build/Countries.java:54
 msgid "Serbia and Montenegro"
 msgstr ""
 
-#: ../java/build/Countries.java:62
+#: ../java/build/Countries.java:55
 msgid "Cuba"
 msgstr ""
 
-#: ../java/build/Countries.java:63
+#: ../java/build/Countries.java:56
 msgid "Cape Verde"
 msgstr ""
 
-#: ../java/build/Countries.java:64
+#: ../java/build/Countries.java:57
 msgid "Christmas Island"
 msgstr ""
 
-#: ../java/build/Countries.java:65
+#: ../java/build/Countries.java:58
 msgid "Cyprus"
 msgstr ""
 
-#: ../java/build/Countries.java:66
+#: ../java/build/Countries.java:59
 msgid "Czech Republic"
 msgstr ""
 
-#: ../java/build/Countries.java:67
+#: ../java/build/Countries.java:60
 msgid "Germany"
 msgstr ""
 
-#: ../java/build/Countries.java:68
+#: ../java/build/Countries.java:61
 msgid "Djibouti"
 msgstr ""
 
-#: ../java/build/Countries.java:69
+#: ../java/build/Countries.java:62
 msgid "Denmark"
 msgstr ""
 
-#: ../java/build/Countries.java:70
+#: ../java/build/Countries.java:63
 msgid "Dominica"
 msgstr ""
 
-#: ../java/build/Countries.java:71
+#: ../java/build/Countries.java:64
 msgid "Dominican Republic"
 msgstr ""
 
-#: ../java/build/Countries.java:72
+#: ../java/build/Countries.java:65
 msgid "Algeria"
 msgstr ""
 
-#: ../java/build/Countries.java:73
+#: ../java/build/Countries.java:66
 msgid "Ecuador"
 msgstr ""
 
-#: ../java/build/Countries.java:74
+#: ../java/build/Countries.java:67
 msgid "Estonia"
 msgstr ""
 
-#: ../java/build/Countries.java:75
+#: ../java/build/Countries.java:68
 msgid "Egypt"
 msgstr ""
 
-#: ../java/build/Countries.java:76
+#: ../java/build/Countries.java:69
 msgid "Western Sahara"
 msgstr ""
 
-#: ../java/build/Countries.java:77
+#: ../java/build/Countries.java:70
 msgid "Eritrea"
 msgstr ""
 
-#: ../java/build/Countries.java:78
+#: ../java/build/Countries.java:71
 msgid "Spain"
 msgstr ""
 
-#: ../java/build/Countries.java:79
+#: ../java/build/Countries.java:72
 msgid "Ethiopia"
 msgstr ""
 
-#: ../java/build/Countries.java:80
+#: ../java/build/Countries.java:73
 msgid "European Union"
 msgstr ""
 
-#: ../java/build/Countries.java:81
+#: ../java/build/Countries.java:74
 msgid "Finland"
 msgstr ""
 
-#: ../java/build/Countries.java:82
+#: ../java/build/Countries.java:75
 msgid "Fiji"
 msgstr ""
 
-#: ../java/build/Countries.java:83
+#: ../java/build/Countries.java:76
 msgid "Falkland Islands (Malvinas)"
 msgstr ""
 
-#: ../java/build/Countries.java:84
+#: ../java/build/Countries.java:77
 msgid "Federated States of Micronesia"
 msgstr ""
 
-#: ../java/build/Countries.java:85
+#: ../java/build/Countries.java:78
 msgid "Faroe Islands"
 msgstr ""
 
-#: ../java/build/Countries.java:86
+#: ../java/build/Countries.java:79
 msgid "France"
 msgstr ""
 
-#: ../java/build/Countries.java:87
+#: ../java/build/Countries.java:80
 msgid "Gabon"
 msgstr ""
 
-#: ../java/build/Countries.java:88
+#: ../java/build/Countries.java:81
 msgid "United Kingdom"
 msgstr ""
 
-#: ../java/build/Countries.java:89
+#: ../java/build/Countries.java:82
 msgid "Grenada"
 msgstr ""
 
-#: ../java/build/Countries.java:90
+#: ../java/build/Countries.java:83
 msgid "Georgia"
 msgstr ""
 
-#: ../java/build/Countries.java:91
+#: ../java/build/Countries.java:84
 msgid "French Guiana"
 msgstr ""
 
-#: ../java/build/Countries.java:92
+#: ../java/build/Countries.java:85
 msgid "Guernsey"
 msgstr ""
 
-#: ../java/build/Countries.java:93
+#: ../java/build/Countries.java:86
 msgid "Ghana"
 msgstr ""
 
-#: ../java/build/Countries.java:94
+#: ../java/build/Countries.java:87
 msgid "Gibraltar"
 msgstr ""
 
-#: ../java/build/Countries.java:95
+#: ../java/build/Countries.java:88
 msgid "Greenland"
 msgstr ""
 
-#: ../java/build/Countries.java:96
+#: ../java/build/Countries.java:89
 msgid "Gambia"
 msgstr ""
 
-#: ../java/build/Countries.java:97
+#: ../java/build/Countries.java:90
 msgid "Guinea"
 msgstr ""
 
-#: ../java/build/Countries.java:98
+#: ../java/build/Countries.java:91
 msgid "Guadeloupe"
 msgstr ""
 
-#: ../java/build/Countries.java:99
+#: ../java/build/Countries.java:92
 msgid "Equatorial Guinea"
 msgstr ""
 
-#: ../java/build/Countries.java:100
+#: ../java/build/Countries.java:93
 msgid "Greece"
 msgstr ""
 
-#: ../java/build/Countries.java:101
+#: ../java/build/Countries.java:94
 msgid "South Georgia and the South Sandwich Islands"
 msgstr ""
 
-#: ../java/build/Countries.java:102
+#: ../java/build/Countries.java:95
 msgid "Guatemala"
 msgstr ""
 
-#: ../java/build/Countries.java:103
+#: ../java/build/Countries.java:96
 msgid "Guam"
 msgstr ""
 
-#: ../java/build/Countries.java:104
+#: ../java/build/Countries.java:97
 msgid "Guinea-Bissau"
 msgstr ""
 
-#: ../java/build/Countries.java:105
+#: ../java/build/Countries.java:98
 msgid "Guyana"
 msgstr ""
 
-#: ../java/build/Countries.java:106
+#: ../java/build/Countries.java:99
 msgid "Hong Kong"
 msgstr ""
 
-#: ../java/build/Countries.java:107
+#: ../java/build/Countries.java:100
 msgid "Honduras"
 msgstr ""
 
-#: ../java/build/Countries.java:108
+#: ../java/build/Countries.java:101
 msgid "Croatia"
 msgstr ""
 
-#: ../java/build/Countries.java:109
+#: ../java/build/Countries.java:102
 msgid "Haiti"
 msgstr ""
 
-#: ../java/build/Countries.java:110
+#: ../java/build/Countries.java:103
 msgid "Hungary"
 msgstr ""
 
-#: ../java/build/Countries.java:111
+#: ../java/build/Countries.java:104
 msgid "Indonesia"
 msgstr ""
 
-#: ../java/build/Countries.java:112
+#: ../java/build/Countries.java:105
 msgid "Ireland"
 msgstr ""
 
-#: ../java/build/Countries.java:113
+#: ../java/build/Countries.java:106
 msgid "Israel"
 msgstr ""
 
-#: ../java/build/Countries.java:114
+#: ../java/build/Countries.java:107
 msgid "Isle of Man"
 msgstr ""
 
-#: ../java/build/Countries.java:115
+#: ../java/build/Countries.java:108
 msgid "India"
 msgstr ""
 
-#: ../java/build/Countries.java:116
+#: ../java/build/Countries.java:109
 msgid "British Indian Ocean Territory"
 msgstr ""
 
-#: ../java/build/Countries.java:117
+#: ../java/build/Countries.java:110
 msgid "Iraq"
 msgstr ""
 
-#: ../java/build/Countries.java:118
+#: ../java/build/Countries.java:111
 msgid "Islamic Republic of Iran"
 msgstr ""
 
-#: ../java/build/Countries.java:119
+#: ../java/build/Countries.java:112
 msgid "Iceland"
 msgstr ""
 
-#: ../java/build/Countries.java:120
+#: ../java/build/Countries.java:113
 msgid "Italy"
 msgstr ""
 
-#: ../java/build/Countries.java:121
+#: ../java/build/Countries.java:114
 msgid "Jersey"
 msgstr ""
 
-#: ../java/build/Countries.java:122
+#: ../java/build/Countries.java:115
 msgid "Jamaica"
 msgstr ""
 
-#: ../java/build/Countries.java:123
+#: ../java/build/Countries.java:116
 msgid "Jordan"
 msgstr ""
 
-#: ../java/build/Countries.java:124
+#: ../java/build/Countries.java:117
 msgid "Japan"
 msgstr ""
 
-#: ../java/build/Countries.java:125
+#: ../java/build/Countries.java:118
 msgid "Kenya"
 msgstr ""
 
-#: ../java/build/Countries.java:126
+#: ../java/build/Countries.java:119
 msgid "Kyrgyzstan"
 msgstr ""
 
-#: ../java/build/Countries.java:127
+#: ../java/build/Countries.java:120
 msgid "Cambodia"
 msgstr ""
 
-#: ../java/build/Countries.java:128
+#: ../java/build/Countries.java:121
 msgid "Kiribati"
 msgstr ""
 
-#: ../java/build/Countries.java:129
+#: ../java/build/Countries.java:122
 msgid "Comoros"
 msgstr ""
 
-#: ../java/build/Countries.java:130
+#: ../java/build/Countries.java:123
 msgid "Saint Kitts and Nevis"
 msgstr ""
 
-#: ../java/build/Countries.java:131
+#: ../java/build/Countries.java:124
 msgid "The Democratic People's Republic of Korea"
 msgstr ""
 
-#: ../java/build/Countries.java:132
+#: ../java/build/Countries.java:125
 msgid "Republic of Korea"
 msgstr ""
 
-#: ../java/build/Countries.java:133
+#: ../java/build/Countries.java:126
 msgid "Kuwait"
 msgstr ""
 
-#: ../java/build/Countries.java:134
+#: ../java/build/Countries.java:127
 msgid "Cayman Islands"
 msgstr ""
 
-#: ../java/build/Countries.java:135
+#: ../java/build/Countries.java:128
 msgid "Kazakhstan"
 msgstr ""
 
-#: ../java/build/Countries.java:136
+#: ../java/build/Countries.java:129
 msgid "Lao People's Democratic Republic"
 msgstr ""
 
-#: ../java/build/Countries.java:137
+#: ../java/build/Countries.java:130
 msgid "Lebanon"
 msgstr ""
 
-#: ../java/build/Countries.java:138
+#: ../java/build/Countries.java:131
 msgid "Saint Lucia"
 msgstr ""
 
-#: ../java/build/Countries.java:139
+#: ../java/build/Countries.java:132
 msgid "Liechtenstein"
 msgstr ""
 
-#: ../java/build/Countries.java:140
+#: ../java/build/Countries.java:133
 msgid "Sri Lanka"
 msgstr ""
 
-#: ../java/build/Countries.java:141
+#: ../java/build/Countries.java:134
 msgid "Liberia"
 msgstr ""
 
-#: ../java/build/Countries.java:142
+#: ../java/build/Countries.java:135
 msgid "Lesotho"
 msgstr ""
 
-#: ../java/build/Countries.java:143
+#: ../java/build/Countries.java:136
 msgid "Lithuania"
 msgstr ""
 
-#: ../java/build/Countries.java:144
+#: ../java/build/Countries.java:137
 msgid "Luxembourg"
 msgstr ""
 
-#: ../java/build/Countries.java:145
+#: ../java/build/Countries.java:138
 msgid "Latvia"
 msgstr ""
 
-#: ../java/build/Countries.java:146
+#: ../java/build/Countries.java:139
 msgid "Libyan Arab Jamahiriya"
 msgstr ""
 
-#: ../java/build/Countries.java:147
+#: ../java/build/Countries.java:140
 msgid "Morocco"
 msgstr ""
 
-#: ../java/build/Countries.java:148
+#: ../java/build/Countries.java:141
 msgid "Monaco"
 msgstr ""
 
-#: ../java/build/Countries.java:149
+#: ../java/build/Countries.java:142
 msgid "Republic of Moldova"
 msgstr ""
 
-#: ../java/build/Countries.java:150
+#: ../java/build/Countries.java:143
 msgid "Montenegro"
 msgstr ""
 
-#: ../java/build/Countries.java:151
+#: ../java/build/Countries.java:144
 msgid "Saint Martin"
 msgstr ""
 
-#: ../java/build/Countries.java:152
+#: ../java/build/Countries.java:145
 msgid "Madagascar"
 msgstr ""
 
-#: ../java/build/Countries.java:153
+#: ../java/build/Countries.java:146
 msgid "Marshall Islands"
 msgstr ""
 
-#: ../java/build/Countries.java:154
+#: ../java/build/Countries.java:147
 msgid "The Former Yugoslav Republic of Macedonia"
 msgstr ""
 
-#: ../java/build/Countries.java:155
+#: ../java/build/Countries.java:148
 msgid "Mali"
 msgstr ""
 
-#: ../java/build/Countries.java:156
+#: ../java/build/Countries.java:149
 msgid "Myanmar"
 msgstr ""
 
-#: ../java/build/Countries.java:157
+#: ../java/build/Countries.java:150
 msgid "Mongolia"
 msgstr ""
 
-#: ../java/build/Countries.java:158
+#: ../java/build/Countries.java:151
 msgid "Macao"
 msgstr ""
 
-#: ../java/build/Countries.java:159
+#: ../java/build/Countries.java:152
 msgid "Northern Mariana Islands"
 msgstr ""
 
-#: ../java/build/Countries.java:160
+#: ../java/build/Countries.java:153
 msgid "Martinique"
 msgstr ""
 
-#: ../java/build/Countries.java:161
+#: ../java/build/Countries.java:154
 msgid "Mauritania"
 msgstr ""
 
-#: ../java/build/Countries.java:162
+#: ../java/build/Countries.java:155
 msgid "Montserrat"
 msgstr ""
 
-#: ../java/build/Countries.java:163
+#: ../java/build/Countries.java:156
 msgid "Malta"
 msgstr ""
 
-#: ../java/build/Countries.java:164
+#: ../java/build/Countries.java:157
 msgid "Mauritius"
 msgstr ""
 
-#: ../java/build/Countries.java:165
+#: ../java/build/Countries.java:158
 msgid "Maldives"
 msgstr ""
 
-#: ../java/build/Countries.java:166
+#: ../java/build/Countries.java:159
 msgid "Malawi"
 msgstr ""
 
-#: ../java/build/Countries.java:167
+#: ../java/build/Countries.java:160
 msgid "Mexico"
 msgstr ""
 
-#: ../java/build/Countries.java:168
+#: ../java/build/Countries.java:161
 msgid "Malaysia"
 msgstr ""
 
-#: ../java/build/Countries.java:169
+#: ../java/build/Countries.java:162
 msgid "Mozambique"
 msgstr ""
 
-#: ../java/build/Countries.java:170
+#: ../java/build/Countries.java:163
 msgid "Namibia"
 msgstr ""
 
-#: ../java/build/Countries.java:171
+#: ../java/build/Countries.java:164
 msgid "New Caledonia"
 msgstr ""
 
-#: ../java/build/Countries.java:172
+#: ../java/build/Countries.java:165
 msgid "Niger"
 msgstr ""
 
-#: ../java/build/Countries.java:173
+#: ../java/build/Countries.java:166
 msgid "Norfolk Island"
 msgstr ""
 
-#: ../java/build/Countries.java:174
+#: ../java/build/Countries.java:167
 msgid "Nigeria"
 msgstr ""
 
-#: ../java/build/Countries.java:175
+#: ../java/build/Countries.java:168
 msgid "Nicaragua"
 msgstr ""
 
-#: ../java/build/Countries.java:176
+#: ../java/build/Countries.java:169
 msgid "Netherlands"
 msgstr ""
 
-#: ../java/build/Countries.java:177
+#: ../java/build/Countries.java:170
 msgid "Norway"
 msgstr ""
 
-#: ../java/build/Countries.java:178
+#: ../java/build/Countries.java:171
 msgid "Nepal"
 msgstr ""
 
-#: ../java/build/Countries.java:179
+#: ../java/build/Countries.java:172
 msgid "Nauru"
 msgstr ""
 
-#: ../java/build/Countries.java:180
+#: ../java/build/Countries.java:173
 msgid "Niue"
 msgstr ""
 
-#: ../java/build/Countries.java:181
+#: ../java/build/Countries.java:174
 msgid "New Zealand"
 msgstr ""
 
-#: ../java/build/Countries.java:182
+#: ../java/build/Countries.java:175
 msgid "Oman"
 msgstr ""
 
-#: ../java/build/Countries.java:183
+#: ../java/build/Countries.java:176
 msgid "Panama"
 msgstr ""
 
-#: ../java/build/Countries.java:184
+#: ../java/build/Countries.java:177
 msgid "Peru"
 msgstr ""
 
-#: ../java/build/Countries.java:185
+#: ../java/build/Countries.java:178
 msgid "French Polynesia"
 msgstr ""
 
-#: ../java/build/Countries.java:186
+#: ../java/build/Countries.java:179
 msgid "Papua New Guinea"
 msgstr ""
 
-#: ../java/build/Countries.java:187
+#: ../java/build/Countries.java:180
 msgid "Philippines"
 msgstr ""
 
-#: ../java/build/Countries.java:188
+#: ../java/build/Countries.java:181
 msgid "Pakistan"
 msgstr ""
 
-#: ../java/build/Countries.java:189
+#: ../java/build/Countries.java:182
 msgid "Poland"
 msgstr ""
 
-#: ../java/build/Countries.java:190
+#: ../java/build/Countries.java:183
 msgid "Saint Pierre and Miquelon"
 msgstr ""
 
-#: ../java/build/Countries.java:191
+#: ../java/build/Countries.java:184
 msgid "Pitcairn Islands"
 msgstr ""
 
-#: ../java/build/Countries.java:192
+#: ../java/build/Countries.java:185
 msgid "Puerto Rico"
 msgstr ""
 
-#: ../java/build/Countries.java:193
+#: ../java/build/Countries.java:186
 msgid "Palestinian Territory"
 msgstr ""
 
-#: ../java/build/Countries.java:194
+#: ../java/build/Countries.java:187
 msgid "Portugal"
 msgstr ""
 
-#: ../java/build/Countries.java:195
+#: ../java/build/Countries.java:188
 msgid "Palau"
 msgstr ""
 
-#: ../java/build/Countries.java:196
+#: ../java/build/Countries.java:189
 msgid "Paraguay"
 msgstr ""
 
-#: ../java/build/Countries.java:197
+#: ../java/build/Countries.java:190
 msgid "Qatar"
 msgstr ""
 
-#: ../java/build/Countries.java:198
+#: ../java/build/Countries.java:191
 msgid "Réunion"
 msgstr ""
 
-#: ../java/build/Countries.java:199
+#: ../java/build/Countries.java:192
 msgid "Romania"
 msgstr ""
 
-#: ../java/build/Countries.java:200
+#: ../java/build/Countries.java:193
 msgid "Serbia"
 msgstr ""
 
-#: ../java/build/Countries.java:201
+#: ../java/build/Countries.java:194
 msgid "Russian Federation"
 msgstr ""
 
-#: ../java/build/Countries.java:202
+#: ../java/build/Countries.java:195
 msgid "Rwanda"
 msgstr ""
 
-#: ../java/build/Countries.java:203
+#: ../java/build/Countries.java:196
 msgid "Saudi Arabia"
 msgstr ""
 
-#: ../java/build/Countries.java:204
+#: ../java/build/Countries.java:197
 msgid "Solomon Islands"
 msgstr ""
 
-#: ../java/build/Countries.java:205
+#: ../java/build/Countries.java:198
 msgid "Seychelles"
 msgstr ""
 
-#: ../java/build/Countries.java:206
+#: ../java/build/Countries.java:199
 msgid "Sudan"
 msgstr ""
 
-#: ../java/build/Countries.java:207
+#: ../java/build/Countries.java:200
 msgid "Sweden"
 msgstr ""
 
-#: ../java/build/Countries.java:208
+#: ../java/build/Countries.java:201
 msgid "Singapore"
 msgstr ""
 
-#: ../java/build/Countries.java:209
+#: ../java/build/Countries.java:202
 msgid "Saint Helena"
 msgstr ""
 
-#: ../java/build/Countries.java:210
+#: ../java/build/Countries.java:203
 msgid "Slovenia"
 msgstr ""
 
-#: ../java/build/Countries.java:211
+#: ../java/build/Countries.java:204
 msgid "Svalbard and Jan Mayen"
 msgstr ""
 
-#: ../java/build/Countries.java:212
+#: ../java/build/Countries.java:205
 msgid "Slovakia"
 msgstr ""
 
-#: ../java/build/Countries.java:213
+#: ../java/build/Countries.java:206
 msgid "Sierra Leone"
 msgstr ""
 
-#: ../java/build/Countries.java:214
+#: ../java/build/Countries.java:207
 msgid "San Marino"
 msgstr ""
 
-#: ../java/build/Countries.java:215
+#: ../java/build/Countries.java:208
 msgid "Senegal"
 msgstr ""
 
-#: ../java/build/Countries.java:216
+#: ../java/build/Countries.java:209
 msgid "Somalia"
 msgstr ""
 
-#: ../java/build/Countries.java:217
+#: ../java/build/Countries.java:210
 msgid "Suriname"
 msgstr ""
 
-#: ../java/build/Countries.java:218
+#: ../java/build/Countries.java:211
 msgid "Sao Tome and Principe"
 msgstr ""
 
-#: ../java/build/Countries.java:219
+#: ../java/build/Countries.java:212
 msgid "El Salvador"
 msgstr ""
 
-#: ../java/build/Countries.java:220
+#: ../java/build/Countries.java:213
 msgid "Syrian Arab Republic"
 msgstr ""
 
-#: ../java/build/Countries.java:221
+#: ../java/build/Countries.java:214
 msgid "Swaziland"
 msgstr ""
 
-#: ../java/build/Countries.java:222
+#: ../java/build/Countries.java:215
 msgid "Turks and Caicos Islands"
 msgstr ""
 
-#: ../java/build/Countries.java:223
+#: ../java/build/Countries.java:216
 msgid "Chad"
 msgstr ""
 
-#: ../java/build/Countries.java:224
+#: ../java/build/Countries.java:217
 msgid "French Southern Territories"
 msgstr ""
 
-#: ../java/build/Countries.java:225
+#: ../java/build/Countries.java:218
 msgid "Togo"
 msgstr ""
 
-#: ../java/build/Countries.java:226
+#: ../java/build/Countries.java:219
 msgid "Thailand"
 msgstr ""
 
-#: ../java/build/Countries.java:227
+#: ../java/build/Countries.java:220
 msgid "Tajikistan"
 msgstr ""
 
-#: ../java/build/Countries.java:228
+#: ../java/build/Countries.java:221
 msgid "Tokelau"
 msgstr ""
 
-#: ../java/build/Countries.java:229
+#: ../java/build/Countries.java:222
 msgid "Timor-Leste"
 msgstr ""
 
-#: ../java/build/Countries.java:230
+#: ../java/build/Countries.java:223
 msgid "Turkmenistan"
 msgstr ""
 
-#: ../java/build/Countries.java:231
+#: ../java/build/Countries.java:224
 msgid "Tunisia"
 msgstr ""
 
-#: ../java/build/Countries.java:232
+#: ../java/build/Countries.java:225
 msgid "Tonga"
 msgstr ""
 
-#: ../java/build/Countries.java:233
+#: ../java/build/Countries.java:226
 msgid "Turkey"
 msgstr ""
 
-#: ../java/build/Countries.java:234
+#: ../java/build/Countries.java:227
 msgid "Trinidad and Tobago"
 msgstr ""
 
-#: ../java/build/Countries.java:235
+#: ../java/build/Countries.java:228
 msgid "Tuvalu"
 msgstr ""
 
-#: ../java/build/Countries.java:236
+#: ../java/build/Countries.java:229
 msgid "Taiwan"
 msgstr ""
 
-#: ../java/build/Countries.java:237
+#: ../java/build/Countries.java:230
 msgid "United Republic of Tanzania"
 msgstr ""
 
-#: ../java/build/Countries.java:238
+#: ../java/build/Countries.java:231
 msgid "Ukraine"
 msgstr ""
 
-#: ../java/build/Countries.java:239
+#: ../java/build/Countries.java:232
 msgid "Uganda"
 msgstr ""
 
-#: ../java/build/Countries.java:240
+#: ../java/build/Countries.java:233
 msgid "United States Minor Outlying Islands"
 msgstr ""
 
-#: ../java/build/Countries.java:241
+#: ../java/build/Countries.java:234
 msgid "United States"
 msgstr ""
 
-#: ../java/build/Countries.java:242
+#: ../java/build/Countries.java:235
 msgid "Uruguay"
 msgstr ""
 
-#: ../java/build/Countries.java:243
+#: ../java/build/Countries.java:236
 msgid "Uzbekistan"
 msgstr ""
 
-#: ../java/build/Countries.java:244
+#: ../java/build/Countries.java:237
 msgid "Holy See (Vatican City State)"
 msgstr ""
 
-#: ../java/build/Countries.java:245
+#: ../java/build/Countries.java:238
 msgid "Saint Vincent and the Grenadines"
 msgstr ""
 
-#: ../java/build/Countries.java:246
+#: ../java/build/Countries.java:239
 msgid "Venezuela"
 msgstr ""
 
-#: ../java/build/Countries.java:247 ../java/build/Countries.java:248
+#: ../java/build/Countries.java:240 ../java/build/Countries.java:241
 msgid "Virgin Islands"
 msgstr ""
 
-#: ../java/build/Countries.java:249
+#: ../java/build/Countries.java:242
 msgid "Viet Nam"
 msgstr ""
 
-#: ../java/build/Countries.java:250
+#: ../java/build/Countries.java:243
 msgid "Vanuatu"
 msgstr ""
 
-#: ../java/build/Countries.java:251
+#: ../java/build/Countries.java:244
 msgid "Wallis and Futuna"
 msgstr ""
 
-#: ../java/build/Countries.java:252
+#: ../java/build/Countries.java:245
 msgid "Samoa"
 msgstr ""
 
-#: ../java/build/Countries.java:253
+#: ../java/build/Countries.java:246
 msgid "Yemen"
 msgstr ""
 
-#: ../java/build/Countries.java:254
+#: ../java/build/Countries.java:247
 msgid "Mayotte"
 msgstr ""
 
-#: ../java/build/Countries.java:255
+#: ../java/build/Countries.java:248
 msgid "South Africa"
 msgstr ""
 
-#: ../java/build/Countries.java:256
+#: ../java/build/Countries.java:249
 msgid "Zambia"
 msgstr ""
 
-#: ../java/build/Countries.java:257
+#: ../java/build/Countries.java:250
 msgid "Zimbabwe"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/CSSHelper.java:75
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:39
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:41
+#: ../java/src/net/i2p/router/web/CSSHelper.java:118
+#: ../java/src/net/i2p/router/web/HomeHelper.java:33
 #: ../java/strings/Strings.java:29
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:133
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:265
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:203
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:205
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:203
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:205
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:210
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:210
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:210
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:213
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:210
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:210
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:210
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:210
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:210
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:203
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:205
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:210
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:203
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:205
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:203
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:205
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:209
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:211
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:207
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:209
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:214
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:232
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:225
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:207
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:209
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:207
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:209
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:207
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:209
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:207
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:209
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:207
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:209
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:195
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:197
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:209
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:211
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:202
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:204
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:209
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:211
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:202
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:204
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:213
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:207
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:209
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:202
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:204
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:202
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:204
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:202
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:204
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:211
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:213
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:202
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:204
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:202
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:204
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:222
 msgid "I2P Router Console"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:52
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:51
 msgid "Error updating the configuration - please see the error logs"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:62
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:306
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:61
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:297
 msgid "Configuration saved successfully"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:64
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:421
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:308
-#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:91
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:63
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:427
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:299
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:96
 msgid ""
 "Error saving the configuration (applied but not saved) - please see the "
 "error logs"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:36
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:364
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:437
 msgid "Save Client Configuration"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:40
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:434
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:438
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:507
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:511
 msgid "Save Interface Configuration"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:44
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:454
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:527
 msgid "Save WebApp Configuration"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:48
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:468
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:541
 msgid "Save Plugin Configuration"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:52
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:476
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:480
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:549
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:553
 msgid "Install Plugin"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:56
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:482
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:55
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:555
 msgid "Update All Installed Plugins"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:92
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:95
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124
 #, java-format
-msgid "Deleted plugin {0}"
+msgid "Error stopping plugin {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:94
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:100
 #, java-format
-msgid "Error deleting plugin {0}"
+msgid "Deleted plugin {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:114
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:102
 #, java-format
-msgid "Stopped plugin {0}"
+msgid "Error deleting plugin {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:116
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:122
 #, java-format
-msgid "Error stopping plugin {0}"
+msgid "Stopped plugin {0}"
 msgstr ""
 
 #. label (IE)
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:138
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:146
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:264
 msgid "Start"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:157
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:165
+#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:106
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61
-#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:37
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:35
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:143
 msgid "Unsupported"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:203
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:211
 msgid "New client added"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:215
 msgid ""
 "Client configuration saved successfully - restart required to take effect."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:222
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:235
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:246
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:230
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:243
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:254
 msgid "Bad client index."
 msgstr ""
 
 #.
 #. What do we do here?
 #.
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:229
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:251
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:237
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:248
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:259
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:103
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:362
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:389
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:508
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:425
 msgid "Client"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:229
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:237
 msgid "stopped"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:299
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:248
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:305
 msgid "started"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:251
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:259
 msgid "deleted"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:268
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:275
 msgid "WebApp configuration saved."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:290
 msgid "Plugin configuration saved."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:299
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:305
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:130
 msgid "WebApp"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:301
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307
 msgid "Failed to start"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:306
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:312
 msgid "Failed to find server."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:312
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:318
 msgid "No plugin URL specified."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:322
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:328
 #, java-format
 msgid "No update URL specified for {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:331
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:344
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:349
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:362
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:367
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:337
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:350
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:355
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:368
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:373
 msgid "Plugin or update download already in progress."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:334
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:340
 msgid "Updating all plugins"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:353
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:126
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:359
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:140
 #, java-format
 msgid "Downloading plugin from {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:371
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:377
 #, java-format
 msgid "Checking plugin {0} for updates"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:381
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:387
 #, java-format
 msgid "Started plugin {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:383
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:389
 #, java-format
 msgid "Error starting plugin {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:419
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:425
 msgid ""
 "Interface configuration saved successfully - restart required to take effect."
 msgstr ""
@@ -1951,7 +2031,7 @@ msgid "Edit"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:95
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433
 msgid "Add Client"
 msgstr ""
 
@@ -1982,8 +2062,9 @@ msgid "Plugin"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:167
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:191
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:290
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:319
 msgid "Version"
 msgstr ""
 
@@ -2004,7 +2085,8 @@ msgid "License"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:213
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:81
+#: ../java/src/net/i2p/router/web/HomeHelper.java:35
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:174
 msgid "Website"
 msgstr ""
 
@@ -2018,12 +2100,12 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:271
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:96
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:381
 msgid "Check for updates"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:272
-#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
 msgid "Update"
 msgstr ""
 
@@ -2036,13 +2118,75 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
+#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:25
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:26
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:855
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:419
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:439
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:455
+msgid "Delete selected"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:26
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:27
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:874
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:425
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:437
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:445
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:453
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:461
+msgid "Add item"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:27
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:423
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:443
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:459
+msgid "Restore defaults"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:28
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:30
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:405
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:439
+msgid "Save"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:33
+msgid "Home page changed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:53
+msgid "Restored default settings"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:65
+msgid "No name entered"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:70
+msgid "No URL entered"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:83
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:85
+msgid "Added"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:100
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:111
+msgid "Removed"
+msgstr ""
+
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:352
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:425
 msgid "Add key"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:423
 msgid "Delete key"
 msgstr ""
 
@@ -2084,7 +2228,7 @@ msgstr ""
 msgid "Log overrides updated"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:160
+#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:161
 msgid "Log configuration saved"
 msgstr ""
 
@@ -2107,7 +2251,7 @@ msgstr ""
 #. http://www.dhs.gov/xinfoshare/programs/Copy_of_press_release_0046.shtm
 #. but pink instead of yellow for WARN
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
-#: ../java/src/net/i2p/router/web/LogsHelper.java:103
+#: ../java/src/net/i2p/router/web/LogsHelper.java:106
 msgid "CRIT"
 msgstr ""
 
@@ -2116,21 +2260,23 @@ msgid "DEBUG"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
-#: ../java/src/net/i2p/router/web/LogsHelper.java:105
+#: ../java/src/net/i2p/router/web/LogsHelper.java:108
 msgid "ERROR"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
-#: ../java/src/net/i2p/router/web/LogsHelper.java:109
+#: ../java/src/net/i2p/router/web/LogsHelper.java:112
 msgid "INFO"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
-#: ../java/src/net/i2p/router/web/LogsHelper.java:107
+#: ../java/src/net/i2p/router/web/LogsHelper.java:110
 msgid "WARN"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88
+#: ../java/src/net/i2p/router/web/HomeHelper.java:192
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:809
 msgid "Remove"
 msgstr ""
 
@@ -2145,15 +2291,56 @@ msgid "Bandwidth"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:210
+msgid "Home Page"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:343
 msgid "Network"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:351
-#: ../java/strings/Strings.java:72
-msgid "Tunnels"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:278
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:278
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:288
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:278
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:278
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:278
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:282
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:289
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:326
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:298
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:282
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:282
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:282
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:282
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:282
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:296
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:277
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:277
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:282
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:277
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:277
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:277
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:277
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:277
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:295
+msgid "Summary Bar"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
@@ -2161,161 +2348,168 @@ msgid "UI"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:196
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:491
+#: ../java/strings/Strings.java:72
+msgid "Tunnels"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21
 msgid "Clients"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:324
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:397
 msgid "Keyring"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21
 msgid "Logging"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:225
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:377
 #: ../java/strings/Strings.java:67
 msgid "Peers"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:388
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:410
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240
 msgid "Stats"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:22
 msgid "Advanced"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:58
-#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:54
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:31
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:388
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:334
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:368
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:472
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:409
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:406
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:371
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:545
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:482
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:478
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:444
 msgid "Save changes"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:141
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:136
 msgid "Rechecking router reachability..."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:179
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:174
 msgid "Updating IP address"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:198
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:193
 msgid "Disabling TCP completely"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:203
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:198
 msgid "Updating inbound TCP address to"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:208
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:203
 msgid "Disabling inbound TCP"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:210
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205
 msgid "Updating inbound TCP address to auto"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:221
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:216
 msgid "Updating inbound TCP port to"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:224
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:219
 msgid "Updating inbound TCP port to auto"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:236
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:231
 msgid "Updating UDP port from"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:236
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:231
 msgid "to"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:252
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:247
 msgid "Gracefully restarting into Hidden Router Mode"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:254
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:249
 msgid "Gracefully restarting to exit Hidden Router Mode"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:263
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:258
 msgid "Enabling UPnP, restart required to take effect"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:265
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:260
 msgid "Disabling UPnP, restart required to take effect"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:273
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:268
 msgid "Enabling laptop mode"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:275
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:270
 msgid "Disabling laptop mode"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:282
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:277
 msgid "Disabling UDP"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:284
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:279
 msgid "Enabling UDP"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:291
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:286
 msgid "Requiring SSU introducers"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:354
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:345
 #, java-format
 msgid "The hostname or IP {0} is not publicly routable"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:357
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:348
 #, java-format
 msgid "The hostname or IP {0} is invalid"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:383
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:374
 msgid "Updating bandwidth share percentage"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:413
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:404
 msgid "Updated bandwidth limits"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:38
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:46
 #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:56
 #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62
 msgid "unknown"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:182
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:171
 msgid "bits per second"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:183
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172
 #, java-format
 msgid "or {0} bytes per month maximum"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:415
 msgid "Ban peer until restart"
 msgstr ""
 
@@ -2335,7 +2529,7 @@ msgid "Invalid peer"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:417
 msgid "Unban peer"
 msgstr ""
 
@@ -2348,7 +2542,7 @@ msgid "is not currently banned"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:443
 msgid "Adjust peer bonuses"
 msgstr ""
 
@@ -2361,27 +2555,27 @@ msgid "Bad capacity value"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:407
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:480
 msgid "Save changes and reseed now"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:25
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24
 msgid "Reseeding is already in progress"
 msgstr ""
 
 #. skip the nonce checking in ReseedHandler
-#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:28
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:27
 msgid "Starting reseed process"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:89
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:94
 msgid "Configuration saved successfully."
 msgstr ""
 
 #. Normal browsers send value, IE sends button label
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:34
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:174
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:393
 msgid "Shutdown immediately"
 msgstr ""
 
@@ -2402,7 +2596,7 @@ msgstr ""
 #. ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns
 #. give the UI time to respond
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:47
-#: ../java/src/net/i2p/router/web/SummaryRenderer.java:134
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:142
 msgid "Restart"
 msgstr ""
 
@@ -2429,7 +2623,7 @@ msgid "Restart in {0}"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:169
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:391
 msgid "Shutdown gracefully"
 msgstr ""
 
@@ -2442,7 +2636,7 @@ msgid "Shutdown immediately!  boom bye bye bad bwoy"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:179
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:322
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:395
 msgid "Cancel graceful shutdown"
 msgstr ""
 
@@ -2451,7 +2645,7 @@ msgid "Graceful shutdown cancelled"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:182
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:407
 msgid "Graceful restart"
 msgstr ""
 
@@ -2460,7 +2654,7 @@ msgid "Graceful restart requested"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:188
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:336
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:409
 msgid "Hard restart"
 msgstr ""
 
@@ -2485,51 +2679,56 @@ msgid "Rekeying after graceful shutdown"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:202
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:362
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:435
 msgid "Run I2P on startup"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:204
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:364
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:437
 msgid "Don't run I2P on startup"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:206
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:382
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:455
 msgid "Dump threads"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:213
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:390
+#, java-format
+msgid "Threads dumped to {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:214
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:463
 msgid "View console on startup"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:215
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:216
 msgid "Console is to be shown on startup"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:392
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:465
 msgid "Do not view console on startup"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:218
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:219
 msgid "Console is not to be shown on startup"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:227
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:228
 msgid "Service installed"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:229
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:230
 msgid "Warning: unable to install the service"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:236
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:237
 msgid "Service removed"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:238
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:239
 msgid "Warning: unable to remove the service"
 msgstr ""
 
@@ -2551,6 +2750,69 @@ msgid ""
 "href=\"graphs.jsp\">Graphs Page</a>"
 msgstr ""
 
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:28
+msgid "Save order"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:35
+msgid "Refresh interval changed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:37
+#, java-format
+msgid "Refresh interval must be at least {0} seconds"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:39
+msgid "Refresh interval must be a number"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:42
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:417
+msgid "Restore full default"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:44
+msgid "Full summary bar default restored."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:45
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:49
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:141
+msgid "Summary bar will refresh shortly."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:46
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:419
+msgid "Restore minimal default"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:48
+msgid "Minimal summary bar default restored."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:65
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:87
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:135
+msgid "Order must be an integer"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:72
+msgid "No section selected"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:77
+msgid "No order entered"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:133
+msgid "Moved"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:140
+msgid "Saved order of sections."
+msgstr ""
+
 #. the count isn't really correct anyway, since we don't check for actual changes
 #. addFormNotice("Updated settings for " + updated + " pools.");
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:136
@@ -2562,7 +2824,7 @@ msgid "Exploratory tunnel configuration saved successfully."
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:143
-#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:37
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:51
 msgid ""
 "Error saving the configuration (applied but not saved) - please see the "
 "error logs."
@@ -2586,7 +2848,7 @@ msgstr[1] ""
 msgstr[2] ""
 
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:43
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:35
 msgid "Exploratory tunnels"
 msgstr ""
 
@@ -2640,83 +2902,95 @@ msgstr ""
 msgid "Outbound options"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:32
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:46
 msgid "Theme change saved."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:34
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:48
 msgid "Refresh the page to view."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:62
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:25
+msgid "Set theme universally across all apps"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:69
 msgid "Arabic"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:62
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:69
 msgid "Czech"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:62
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:69
 msgid "Danish"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:63
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:70
 msgid "English"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:63
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:70
 msgid "Estonian"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:63
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:70
 msgid "Finnish"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:63
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:70
 msgid "German"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:63
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:70
+msgid "Greek"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:70
 msgid "Spanish"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:64
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:71
 msgid "Dutch"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:64
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:71
 msgid "French"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:64
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:71
+msgid "Hungarian"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:71
 msgid "Italian"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:64
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:71
 msgid "Polish"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:65
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:72
 msgid "Portuguese"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:65
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:72
 msgid "Russian"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:65
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:72
 msgid "Swedish"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:66
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:73
 msgid "Chinese"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:66
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:73
 msgid "Ukrainian"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:66
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:73
 msgid "Vietnamese"
 msgstr ""
 
@@ -2761,7 +3035,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:151
 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:112
-#: ../java/src/net/i2p/router/web/GraphHelper.java:190
+#: ../java/src/net/i2p/router/web/GraphHelper.java:361
 msgid "Never"
 msgstr ""
 
@@ -2805,278 +3079,558 @@ msgid ""
 "button on your browser. Please resubmit."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:117
+#: ../java/src/net/i2p/router/web/GraphHelper.java:159
 msgid "Combined bandwidth graph"
 msgstr ""
 
 #. e.g. "statname for 60m"
-#: ../java/src/net/i2p/router/web/GraphHelper.java:130
+#: ../java/src/net/i2p/router/web/GraphHelper.java:172
+#: ../java/src/net/i2p/router/web/GraphHelper.java:221
 #, java-format
 msgid "{0} for {1}"
 msgstr ""
 
-#. FIXME jrobin doesn't support setting the timezone, will have to mod TimeAxis.java
-#: ../java/src/net/i2p/router/web/GraphHelper.java:152
-msgid "All times are UTC."
+#: ../java/src/net/i2p/router/web/GraphHelper.java:223
+#, java-format
+msgid "ending {0} ago"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:169
-msgid "Configure Graph Display"
+#: ../java/src/net/i2p/router/web/GraphHelper.java:238
+msgid "Larger"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:169
-msgid "Select Stats"
+#: ../java/src/net/i2p/router/web/GraphHelper.java:244
+msgid "Smaller"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:173
-msgid "Periods"
+#: ../java/src/net/i2p/router/web/GraphHelper.java:250
+msgid "Taller"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:174
-msgid "Plot averages"
+#: ../java/src/net/i2p/router/web/GraphHelper.java:256
+msgid "Shorter"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:175
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:367
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:360
-msgid "or"
+#: ../java/src/net/i2p/router/web/GraphHelper.java:262
+msgid "Wider"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:175
+#: ../java/src/net/i2p/router/web/GraphHelper.java:268
+msgid "Narrower"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:275
+msgid "Larger interval"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:281
+msgid "Smaller interval"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:288
+msgid "Previous interval"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:299
+msgid "Next interval"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:305
+#: ../java/src/net/i2p/router/web/GraphHelper.java:345
+msgid "Plot averages"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:305
+#: ../java/src/net/i2p/router/web/GraphHelper.java:346
 msgid "plot events"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:176
+#: ../java/src/net/i2p/router/web/GraphHelper.java:308
+msgid "All times are UTC."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:340
+msgid "Configure Graph Display"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:340
+msgid "Select Stats"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:344
+msgid "Periods"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:440
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:433
+msgid "or"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:347
 msgid "Image sizes"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:176
+#: ../java/src/net/i2p/router/web/GraphHelper.java:347
 msgid "width"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:177
+#: ../java/src/net/i2p/router/web/GraphHelper.java:348
 msgid "height"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:177
-#: ../java/src/net/i2p/router/web/GraphHelper.java:178
+#: ../java/src/net/i2p/router/web/GraphHelper.java:348
+#: ../java/src/net/i2p/router/web/GraphHelper.java:349
 msgid "pixels"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:179
+#: ../java/src/net/i2p/router/web/GraphHelper.java:350
 msgid "Refresh delay"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:194
+#: ../java/src/net/i2p/router/web/GraphHelper.java:365
 msgid "Store graph data on disk?"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:200
+#: ../java/src/net/i2p/router/web/GraphHelper.java:371
 msgid "Save settings and redraw graphs"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:255
+#: ../java/src/net/i2p/router/web/GraphHelper.java:426
 msgid "Graph settings saved"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/LogsHelper.java:35
-#: ../java/src/net/i2p/router/web/LogsHelper.java:69
+#: ../java/src/net/i2p/router/web/HomeHelper.java:27
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:252
+msgid "Addressbook"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:27
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:250
+msgid "Manage your I2P hosts file here (I2P domain name resolution)"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:28
+msgid "Configure Bandwidth"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:28
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:314
+msgid "I2P Bandwidth Configuration"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:29
+msgid "Configure Language"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:29
+msgid "Console Language Selection"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:30
+msgid "Customize Home Page"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:30
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:330
+msgid "I2P Home Page Configuration"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:31
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:160
+msgid "Anonymous webmail client"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:31
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:162
+msgid "Email"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:32
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266
+msgid "I2P Router Help"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:33
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:146
+msgid "Router Console"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:34
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166
+msgid "Built-in anonymous BitTorrent Client"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:34
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:168
+msgid "Torrents"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:35
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:172
+msgid "Local web server"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:39
+msgid "Bug Reports"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:39
+msgid "Bug tracker"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:40
+msgid "The Italian Bittorrent Resource"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:41
+msgid "Dev Forum"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:41
+msgid "Development forum"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:42
+#: ../java/src/net/i2p/router/web/HomeHelper.java:54
+msgid "Bittorrent tracker"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:42
+msgid "diftracker"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:43
+msgid "I2P Applications"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:44
+msgid "FAQ"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:44
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:45
+msgid "Community forum"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:45
+msgid "Forum"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:46
+msgid ""
+"A public anonymous Git hosting site - supports pulling via Git and HTTP and "
+"pushing via SSH"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:46
+msgid "Anonymous Git Hosting"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:47
+msgid "Microblog"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:47
+msgid "Your premier microblogging service on I2P"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:48
+msgid "Javadocs"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:48
+#: ../java/src/net/i2p/router/web/HomeHelper.java:57
+msgid "Technical documentation"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:50
+msgid "Debian and Tahoe-LAFS repositories"
+msgstr ""
+
+#. _x("Key Server") + S + _x("OpenPGP Keyserver") + S + "http://keys.i2p/" + S + I + "education.png" + S +
+#: ../java/src/net/i2p/router/web/HomeHelper.java:50
+msgid "killyourtv.i2p"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:51
+msgid "I2P Pastebin"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:51
+msgid "Pastebin"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:52
+msgid "I2P News"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:53
+msgid "Add-on directory"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:53
+msgid "Plugins"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:54
+msgid "Postman's Tracker"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:55
+msgid "I2P home page"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:55
+msgid "Project Website"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:56
+msgid "I2P Network Statistics"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:57
+msgid "Technical Docs"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:58
+msgid "Trac Wiki"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:59
+msgid "Ugha's Wiki"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:60
+msgid "Seedless and the Robert BitTorrent applications"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:60
+msgid "Sponge's main site"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:101
+msgid "The HTTP proxy is not up"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:103
+#, java-format
+msgid "Your browser is not properly configured to use the HTTP proxy at {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:194
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:811
+msgid "Name"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:196
+msgid "URL"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/HomeHelper.java:214
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:857
+msgid "Add"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/LogsHelper.java:29
+#: ../java/src/net/i2p/router/web/LogsHelper.java:72
 msgid "File location"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/LogsHelper.java:66
+#: ../java/src/net/i2p/router/web/LogsHelper.java:69
 msgid "File not found"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/LogsHelper.java:84
+#: ../java/src/net/i2p/router/web/LogsHelper.java:87
 msgid "No log messages"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:79
-msgid "Network Database RouterInfo Lookup"
+#: ../java/src/net/i2p/router/web/NetDbHelper.java:19
+msgid "Summary"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94
-#: ../java/strings/Strings.java:68
-msgid "Router"
+#. 0
+#: ../java/src/net/i2p/router/web/NetDbHelper.java:20
+msgid "Local Router"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94
-msgid "not found in network database"
+#. 1
+#: ../java/src/net/i2p/router/web/NetDbHelper.java:21
+msgid "Router Lookup"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:106
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215
-msgid "Network Database Contents"
+#. 2
+#: ../java/src/net/i2p/router/web/NetDbHelper.java:22
+msgid "All Routers"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107
-msgid "View RouterInfo"
+#. 3
+#: ../java/src/net/i2p/router/web/NetDbHelper.java:23
+msgid "All Routers with Full Stats"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108
+#. 4
+#. 5
+#: ../java/src/net/i2p/router/web/NetDbHelper.java:25
 msgid "LeaseSets"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:130
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:92
+#: ../java/strings/Strings.java:68
+msgid "Router"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:92
+msgid "not found in network database"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135
 msgid "LeaseSet"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:132
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:137
 msgid "Local"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:134
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:139
 msgid "Unpublished"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:142
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:140
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:147
 msgid "Destination"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:152
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:157
 #, java-format
 msgid "Expires in {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:154
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:159
 #, java-format
 msgid "Expired {0} ago"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:164
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:174
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:157
 msgid "Gateway"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:174
 msgid "Lease"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:168
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:176
 msgid "Tunnel"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215
-msgid "View LeaseSets"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:217
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:232
 msgid "Not initialized"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:226
-msgid "Routers"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:228
-msgid "Show all routers"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:230
-msgid "Show all routers with full stats"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:283
 msgid "Network Database Router Statistics"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:290
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:304
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:322
 msgid "Count"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:304
 msgid "Transports"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:322
 msgid "Country"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:367
 msgid "Our info"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:369
 msgid "Peer info for"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:371
 msgid "Full entry"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:119
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:557
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:152
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:630
 msgid "Hidden"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378
 msgid "Updated"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:379
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:382
 #, java-format
 msgid "{0} ago"
 msgstr ""
 
 #. shouldnt happen
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:381
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:385
 msgid "Published"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387
 msgid "Address(es)"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:400
 msgid "cost"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:425
 msgid "Hidden or starting up"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:425
 msgid "SSU"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:425
 msgid "SSU with introducers"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:426
 msgid "NTCP"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:426
 msgid "NTCP and SSU"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:426
 msgid "NTCP and SSU with introducers"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:133
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:131
 #, java-format
 msgid "News last updated {0} ago."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:139
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:137
 #, java-format
 msgid "News last checked {0} ago."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:148
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:146
 msgid "Hide news"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:151
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:149
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:642
 msgid "Show news"
 msgstr ""
 
@@ -3096,184 +3650,200 @@ msgstr[2] ""
 msgid "Plugin update check complete"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:85
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:81
 #, java-format
 msgid "Cannot check, plugin {0} is not installed"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:155
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:151
 #, java-format
 msgid "Checking for update of plugin {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:185
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:181
 #, java-format
 msgid "New plugin version {0} is available"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:188
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:184
 #, java-format
 msgid "No new version is available for plugin {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:198
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:194
 #, java-format
 msgid "Update check failed for plugin {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:147
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:125
+#, java-format
+msgid "Attempting to install from file {0}"
+msgstr ""
+
+#. This is actually what String.isEmpty() does, so it should be safe.
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:129
+#, java-format
+msgid "No file specified {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:136
+#, java-format
+msgid "Failed to install from file {0}, copy failed."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:162
 msgid "Downloading plugin"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:154
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:244
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:169
 #, java-format
 msgid "{0}B transferred"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:161
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177
 msgid "Plugin downloaded"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:166
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:382
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:182
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:415
 #, java-format
 msgid "Cannot create plugin directory {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:175
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:297
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:191
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:302
 #, java-format
 msgid "from {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:185
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201
 #, java-format
 msgid "Plugin from {0} is corrupt"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:196
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:212
 #, java-format
 msgid "Plugin from {0} does not contain the required configuration file"
 msgstr ""
 
 #. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:209
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225
 #, java-format
 msgid "Plugin from {0} contains an invalid key"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:233
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:243
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:257
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:259
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:273
 #, java-format
 msgid "Plugin signature verification of {0} failed"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:272
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:288
 #, java-format
 msgid "Plugin from {0} has invalid name or version"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
 #, java-format
 msgid "Plugin {0} has mismatched versions"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:301
 #, java-format
 msgid "This plugin requires I2P version {0} or higher"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:309
 #, java-format
 msgid "This plugin requires Java version {0} or higher"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:302
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:318
 msgid ""
 "Downloaded plugin is for new installs only, but the plugin is already "
 "installed"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:314
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:329
 msgid "Installed plugin does not contain the required configuration file"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:322
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:337
 msgid "Signature of downloaded plugin does not match installed plugin"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:329
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:344
 #, java-format
 msgid "Downloaded plugin version {0} is not newer than installed plugin"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:336
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or higher"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:343
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:358
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or lower"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:366
 #, java-format
 msgid "Plugin requires Jetty version {0} or higher"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:358
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373
 #, java-format
 msgid "Plugin requires Jetty version {0} or lower"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:377
-msgid "Plugin is for upgrades only, but the plugin is not installed"
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:382
+#, java-format
+msgid "Cannot copy plugin to directory {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:390
-#, java-format
-msgid "Failed to install plugin in {0}"
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:392
+msgid "Plugin will be installed on next restart."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:398
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:410
+msgid "Plugin is for upgrades only, but the plugin is not installed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:423
 #, java-format
-msgid "Plugin {0} installed, router restart required"
+msgid "Failed to install plugin in {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:400
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:427
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:430
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:458
 #, java-format
 msgid "Plugin {0} installed"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:418
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:449
 #, java-format
 msgid "Plugin {0} installed and started"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:421
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:452
 #, java-format
 msgid "Plugin {0} installed but failed to start, check logs"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:423
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:454
 #, java-format
 msgid "Plugin {0} installed but failed to start"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:435
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:466
 #, java-format
 msgid "Failed to download plugin from {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:72
-msgid "Peer Profiles"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73
+#. buf.append("<h2>").append(_("Peer Profiles")).append("</h2>\n<p>");
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83
 #, java-format
 msgid "Showing 1 recent profile."
 msgid_plural "Showing {0} recent profiles."
@@ -3281,7 +3851,7 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85
 #, java-format
 msgid "Hiding 1 older profile."
 msgid_plural "Hiding {0} older profiles."
@@ -3289,7 +3859,7 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:87
 #, java-format
 msgid "Hiding 1 standard profile."
 msgid_plural "Hiding {0} standard profiles."
@@ -3297,194 +3867,205 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:92
 msgid "Groups (Caps)"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:362
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:93
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:273
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:435
 msgid "Speed"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:94
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:275
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:439
 msgid "Capacity"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:95
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:277
 msgid "Integration"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:126
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:135
 msgid "Fast, High Capacity"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:127
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:136
+#: ../java/src/net/i2p/router/web/ProfilesHelper.java:11
 msgid "High Capacity"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:128
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:137
 msgid "Standard"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:129
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:163
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:138
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:172
 msgid "Failing"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:252
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:140
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:416
 msgid "Integrated"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:164
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:173
 msgid "Unreachable"
 msgstr ""
 
 #. hide if < 10%
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:180
 msgid "Test Fails"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177
-msgid "profile"
-msgstr ""
-
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186
-msgid "Floodfill and Integrated Peers"
+msgid "profile"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:205
 msgid "Caps"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:206
 msgid "Integ. Value"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:207
 msgid "Last Heard About"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:208
 msgid "Last Heard From"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:209
 msgid "Last Good Send"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:210
 msgid "Last Bad Send"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:211
 msgid "10m Resp. Time"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:212
 msgid "1h Resp. Time"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:213
 msgid "1d Resp. Time"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:214
 msgid "Last Good Lookup"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:215
 msgid "Last Bad Lookup"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:216
 msgid "Last Good Store"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:217
 msgid "Last Bad Store"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:218
 msgid "1h Fail Rate"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:205
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:219
 msgid "1d Fail Rate"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:272
 msgid "Thresholds"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:274
 msgid "fast peers"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:276
 msgid "high capacity peers"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:278
 msgid " well integrated peers"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:280
 msgid "as determined by the profile organizer"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:280
 msgid "groups"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:281
 msgid "capabilities in the netDb, not used to determine profiles"
 msgstr ""
 
 #. capabilities
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:281
 #: ../java/strings/Strings.java:81
 msgid "caps"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:282
 msgid ""
 "peak throughput (bytes per second) over a 1 minute period that the peer has "
 "sustained in a single tunnel"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:282
 msgid "speed"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:283
 msgid "capacity"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:283
 msgid "how many tunnels can we ask them to join in an hour?"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:284
 msgid "how many new peers have they told us about lately?"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:284
 msgid "integration"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:265
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:285
 msgid "is the peer banned, or unreachable, or failing tunnel tests?"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:265
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:285
 msgid "status"
 msgstr ""
 
+#. 0
+#: ../java/src/net/i2p/router/web/ProfilesHelper.java:12
+msgid "Floodfill "
+msgstr ""
+
+#. 2
+#: ../java/src/net/i2p/router/web/ProfilesHelper.java:14
+msgid "All"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SearchHelper.java:74
+msgid "Select search engine"
+msgstr ""
+
 #: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64
 #, java-format
 msgid "Temporary ban expiring in {0}"
@@ -3499,37 +4080,37 @@ msgstr ""
 msgid "unban now"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:303
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:313
 msgid "Bandwidth usage"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:313
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:323
 msgid "Outbound Bytes/sec"
 msgstr ""
 
 #. def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3);
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:315
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:325
 msgid "Inbound Bytes/sec"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:318
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:319
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:320
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:321
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:328
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:329
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:330
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:331
 msgid "Bps"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:318
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:328
 msgid "Out average"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:319
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:321
-#: ../java/src/net/i2p/router/web/SummaryRenderer.java:142
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:329
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:331
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:150
 msgid "max"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:320
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:330
 msgid "In average"
 msgstr ""
 
@@ -3585,7 +4166,7 @@ msgid "Lifetime average frequency"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:144
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:234
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:233
 #, java-format
 msgid "1 event"
 msgid_plural "{0} events"
@@ -3622,355 +4203,398 @@ msgstr ""
 msgid "No events"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:211
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:210
 msgid "Average event count"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:213
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:212
 msgid "Events in peak period"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:221
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:220
 msgid "Graph Data"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:223
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:222
 msgid "Graph Event Count"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:226
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:225
 msgid "Export Data as XML"
 msgstr ""
 
 #. Display the strict average
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:231
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:230
 msgid "Lifetime average value"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:45
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:142
 msgid "I2P Router Help &amp; FAQ"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:47
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:144
 msgid "Help &amp; FAQ"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:59
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:152
 msgid ""
 "Configure startup of clients and webapps (services); manually start dormant "
 "services"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:61
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:154
 msgid "I2P Services"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:67
-msgid "Anonymous webmail client"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:69
-msgid "Email"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:73
-msgid "Built-in anonymous BitTorrent Client"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:75
-msgid "Torrents"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:79
-msgid "Local web server"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:89
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:186
 msgid "Configure I2P Router"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:91
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:188
 msgid "I2P Internals"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:97
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:194
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:489
 msgid "View existing tunnels and tunnel build status"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:103
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:223
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:200
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:375
 msgid "Show all current peer connections"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:109
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:206
 msgid "Show recent peer performance profiles"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:111
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:208
 msgid "Profiles"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:115
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:212
 msgid "Show list of all known I2P routers"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:117
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:214
 msgid "NetDB"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:121
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:218
 msgid "Health Report"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:220
 msgid "Logs"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:134
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231
 msgid "Graph router performance"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:136
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:233
 msgid "Graphs"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:238
 msgid "Textual router performance statistics"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:375
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:244
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:411
 msgid "Local Destinations"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:246
 #: ../java/strings/Strings.java:62
 msgid "I2PTunnel"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:153
-msgid "Manage your I2P hosts file here (I2P domain name resolution)"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:155
-msgid "Addressbook"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:268
+msgid "General"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:170
-msgid "I2P Router Help"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:273
+msgid ""
+"Your Local Identity is your unique I2P router identity, similar to an ip "
+"address but tailored to I2P. "
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:172
-msgid "General"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:274
+msgid "Never disclose this to anyone, as it can reveal your real world ip."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:177
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276
 msgid "Local Identity"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:181
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:280
 msgid "Your unique I2P router identity is"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:284
 msgid "never reveal it to anyone"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:187
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:286
 msgid "show"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:198
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:290
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:316
+msgid "The version of the I2P software we are running"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:300
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:326
 msgid "How long we've been running for this session"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:201
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:329
 msgid "Uptime"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:208
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:341
 msgid ""
 "Help with configuring your firewall and router for optimal I2P performance"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:356
+msgid "Configure I2P Updates"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:358
+msgid "I2P Update"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:383
+msgid "Peers we've been talking to in the last few minutes/last hour"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386
 msgid "Active"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:395
+msgid "The number of peers available for building client tunnels"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398
 msgid "Fast"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:246
-msgid "High capacity"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404
+msgid "The number of peers available for building exploratory tunnels"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258
-msgid "Known"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:407
+msgid "High capacity"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:273
-msgid "Help with firewall configuration"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:413
+msgid "The number of peers available for network database inquiries"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275
-msgid "Check network connection and NAT/firewall"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422
+msgid "The total number of peers in our network database"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:295
-msgid "Reseed"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:425
+msgid "Known"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:312
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:445
 msgid "Configure router bandwidth allocation"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:314
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:447
 msgid "Bandwidth in/out"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:334
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:467
 msgid "Total"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:341
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:474
 msgid "Used"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:356
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:496
+msgid ""
+"Used for building and testing tunnels, and communicating with floodfill peers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:499
 msgid "Exploratory"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:368
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:505
+msgid "Tunnels we are using to provide or access services on the network"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:514
+msgid ""
+"Tunnels we are participating in, directly contributing bandwith to the "
+"network"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:517
 msgid "Participating"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:374
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:523
+msgid ""
+"The ratio of tunnel hops we provide to tunnel hops we use - a value greater "
+"than 1.00 indicates a positive contribution to the network"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:526
 msgid "Share ratio"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:380
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:539
 msgid "What's in the router's job queue?"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:382
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:541
 msgid "Congestion"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:387
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:546
+msgid "Indicates router performance"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:549
 msgid "Job lag"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:393
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:555
+msgid "Indicates how quickly outbound messages to other I2P routers are sent"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:558
 msgid "Message delay"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:400
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:565
+msgid "Round trip time for a tunnel test"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:568
 msgid "Tunnel lag"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:407
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:575
+msgid "Queued requests from other routers to participate in tunnels"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:578
 msgid "Backlog"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:110
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:613
+msgid "News &amp; Updates"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:143
 msgid "ERR-Client Manager I2CP Error - check logs"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:117
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:150
 #, java-format
 msgid "ERR-Clock Skew of {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:126
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:533
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:155
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:188
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:626
+msgid "Testing"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:162
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:606
 msgid "OK"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:127
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:163
 msgid "ERR-Private TCP Address"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:129
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:165
 msgid "ERR-SymmetricNAT"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:132
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:168
 msgid "WARN-Firewalled with Inbound TCP Enabled"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:134
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:170
 msgid "WARN-Firewalled and Floodfill"
 msgstr ""
 
 #. if (_context.router().getRouterInfo().getCapabilities().indexOf('O') >= 0)
 #. return _("WARN-Firewalled and Fast");
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:137
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:537
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:173
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:610
 msgid "Firewalled"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:139
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:175
 msgid ""
 "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and "
 "restart"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:145
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:181
 msgid "ERR-No Active Peers, Check Network Connection and Firewall"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:148
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:184
 msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:150
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:186
 msgid "WARN-Firewalled with UDP Disabled"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:152
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:553
-msgid "Testing"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:375
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:411
 msgid "Add/remove/edit &amp; control your client and server tunnels"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:387
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:423
 msgid "Server"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:391
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:427
 msgid "Show tunnels"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:402
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:438
 msgid "Leases expired"
 msgstr ""
 
 #. red or yellow light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:402
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:403
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:438
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:439
 msgid "Rebuilding"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:403
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:439
 msgid "ago"
 msgstr ""
 
 #. green light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:406
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:442
 msgid "Ready"
 msgstr ""
 
 #. yellow light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:410
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:446
 msgid "Building"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:410
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:446
 msgid "Building tunnels"
 msgstr ""
 
@@ -3978,13 +4602,13 @@ msgstr ""
 #. nicely under 'local destinations' in the summary bar
 #. note that if the wording changes in i2ptunnel.config, we have to
 #. keep the old string here as well for existing installs
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:426
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:462
 #: ../java/strings/Strings.java:36
 msgid "shared clients"
 msgstr ""
 
 #. Note to translators: parameter is a version, e.g. "0.8.4"
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:640
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:676
 #, java-format
 msgid "Download {0} Update"
 msgstr ""
@@ -3992,147 +4616,178 @@ msgstr ""
 #. Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC"
 #. <br> is optional, to help the browser make the lines even in the button
 #. If the translation is shorter than the English, you should probably not include <br>
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:648
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:684
 #, java-format
 msgid "Download Unsigned<br>Update {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryRenderer.java:110
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:709
+msgid "Help with firewall configuration"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:711
+msgid "Check network connection and NAT/firewall"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:730
+msgid "Reseed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:813
+msgid "Order"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:830
+msgid "Top"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:843
+msgid "Down"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:848
+msgid "Bottom"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:860
+msgid "Select a section to add"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:118
 #, java-format
 msgid "events in {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryRenderer.java:112
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:120
 #, java-format
 msgid "averaged for {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryRenderer.java:122
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:130
 msgid "Events per period"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryRenderer.java:141
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:149
 msgid "avg"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryRenderer.java:143
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:151
 msgid "now"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:43
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:65
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:323
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:35
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:57
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:398
 msgid "configure"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:63
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:55
 msgid "Client tunnels for"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:67
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:59
 msgid "dead"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:65
 msgid "Participating tunnels"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:66
 msgid "Receive on"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:75
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:67
 msgid "Expiration"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:75
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:67
 msgid "Send on"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:76
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:68
 msgid "Rate"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:76
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:68
 msgid "Role"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:76
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:164
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:68
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:157
 msgid "Usage"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:114
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:106
 msgid "grace period"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:124
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:116
 msgid "Outbound Endpoint"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:126
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:118
 msgid "Inbound Gateway"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:128
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:170
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:120
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:163
 msgid "Participant"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:133
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:125
 #, java-format
 msgid "Limited display to the {0} tunnels with the highest usage"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:134
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:126
 msgid "Inactive participating tunnels"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:135
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:226
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:127
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:219
 msgid "Lifetime bandwidth usage"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:164
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:157
 msgid "Expiry"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:167
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:160
 msgid "Participants"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:173
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:166
 msgid "Endpoint"
 msgstr ""
 
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:206
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:213
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:220
 msgid "Build in progress"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:213
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:206
 msgid "inbound"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:220
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:213
 msgid "outbound"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:225
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:218
 msgid "No tunnels; waiting for the grace period to end."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:227
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:220
 msgid "in"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:228
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:221
 msgid "out"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:143
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:237
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:146
 msgid "Updating"
 msgstr ""
 
@@ -4140,8 +4795,8 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:261
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:285
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:266
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:290
 msgid "Update downloaded"
 msgstr ""
 
@@ -4151,22 +4806,22 @@ msgid "Unsigned update file from {0} is corrupt"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:280
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:285
 msgid "Restarting"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:287
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:292
 msgid "Click Restart to install"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:289
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:294
 msgid "Click Shutdown and restart to install"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:291
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:296
 #, java-format
 msgid "Version {0}"
 msgstr ""
@@ -4176,27 +4831,33 @@ msgstr ""
 msgid "Failed copy to {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:184
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:187
 #, java-format
 msgid "Updating from {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:253
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:243
+#, java-format
+msgid "{0} downloaded"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:258
 #, java-format
 msgid "No new version found at {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:280
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:285
 msgid "Update verified"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:306
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:311
 #, java-format
 msgid "Transfer failed from {0}"
 msgstr ""
 
 #. wars for ConfigClientsHelper
 #: ../java/strings/Strings.java:12
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:154
 msgid "addressbook"
 msgstr ""
 
@@ -4421,314 +5082,335 @@ msgstr ""
 msgid "itag2"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:137
 msgid "configure bandwidth"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:232
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:245
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:232
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:269
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:239
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:230
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:230
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:230
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:230
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:230
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:230
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:230
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:230
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:230
-msgid "Summary Bar"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:140
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:140
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:140
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:140
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:140
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:140
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:144
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:157
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:151
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:164
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:160
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:144
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:144
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:144
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:144
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:144
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:157
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:141
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:141
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:145
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:144
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:157
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:157
+msgid "Router is down"
 msgstr ""
 
 #. We have intl defined when this is included, but not when compiled standalone.
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:244
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:245
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:244
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:244
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:258
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:244
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:244
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:244
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:244
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:245
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:244
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:244
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:244
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:255
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:282
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:252
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:243
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:243
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:243
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:243
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:243
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:243
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:243
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:297
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:290
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:290
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:290
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:290
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:290
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:288
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:290
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:290
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:308
 msgid "Refresh (s)"
 msgstr ""
 
 #. ditto
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:249
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:262
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:249
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:259
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:286
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:256
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:254
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:294
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:294
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:324
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:294
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:294
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:294
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:294
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:294
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:312
 msgid "Enable"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:270
-msgid "I2P Bandwidth Configuration"
-msgstr ""
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:355
 msgid "Bandwidth limiter"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:357
 msgid ""
 "I2P will work best if you configure your rates to match the speed of your "
 "internet connection."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361
 msgid "KBps In"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375
 msgid "KBps Out"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:390
 msgid "Share"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:368
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:336
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:408
 msgid "NOTE"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
 #, java-format
 msgid "You have configured I2P to share only {0} KBps."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:373
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:402
 msgid "I2P requires at least 12KBps to enable sharing. "
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:374
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403
 msgid ""
 "Please enable sharing (participating in tunnels) by configuring more "
 "bandwidth. "
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:404
 msgid ""
 "It improves your anonymity by creating cover traffic, and helps the network."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:406
 #, java-format
 msgid "You have configured I2P to share {0} KBps."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:380
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409
 msgid ""
 "The higher the share bandwidth the more you improve your anonymity and help "
 "the network."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:384
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413
 msgid "Advanced network configuration page"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:386
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:332
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:356
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:436
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:452
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:466
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:478
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:348
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:366
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:470
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:405
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:404
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:369
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:360
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:415
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:509
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:525
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:539
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:551
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:421
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:441
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:457
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:421
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:393
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:543
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:478
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:476
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:387
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:437
 msgid "Cancel"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:121
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:137
 msgid "config advanced"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:271
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:314
 msgid "I2P Advanced Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:328
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:355
 msgid "Advanced I2P Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:338
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:365
 msgid "Some changes may require a restart to take effect."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:139
 msgid "config clients"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:273
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:346
 msgid "I2P Client Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:412
 msgid "Client Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:414
 msgid ""
 "The Java clients listed below are started by the router and run in the same "
 "JVM."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:420
 msgid "To change other client options, edit the file"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:354
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:432
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:450
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:505
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:523
 msgid "All changes require restart to take effect."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439
 msgid "Advanced Client Interface Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:443
 msgid "External I2CP (I2P Client Protocol) Interface Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:449
 msgid "Enabled without SSL"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:382
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455
 msgid "Enabled with SSL required"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461
 msgid "Disabled - Clients outside this Java process may not connect"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:390
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:463
 msgid "I2CP Port"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:394
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:467
 msgid "I2CP Interface"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:410
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:483
 msgid "Authorization"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:489
 msgid "Require username and password"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:418
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:491
 msgid "Username"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:422
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:495
 msgid "Password"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:426
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:327
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:333
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:499
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:400
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:406
 msgid "The default settings will work for most people."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:428
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:501
 msgid "Any changes made here must also be configured in the external client."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:503
 msgid "Many clients do not support SSL or authorization."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:440
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:513
 msgid "WebApp Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:515
 msgid ""
 "The Java web applications listed below are started by the webConsole client "
 "and run in the same JVM as the router. They are usually web applications "
@@ -4738,7 +5420,7 @@ msgid ""
 "all (e.g. addressbook)."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:444
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:517
 msgid ""
 "A web app may also be disabled by removing the .war file from the webapps "
 "directory; however the .war file and web app will reappear when you update "
@@ -4746,658 +5428,683 @@ msgid ""
 "preferred method."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:458
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:531
 msgid "Plugin Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:533
 msgid "The plugins listed below are started by the webConsole client."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:470
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:543
 msgid "Plugin Installation"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:545
 msgid "To install a plugin, enter the download URL:"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:139
+msgid "config home"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:397
+msgid "Default Home Page"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:403
+msgid "Use old home page"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:411
+msgid "Search Engines"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:431
+msgid "Recommended Eepsites"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:447
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:386
+msgid "Local Services"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:139
 msgid "config keyring"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:257
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:330
 msgid "I2P Keyring Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:399
 msgid "The router keyring is used to decrypt encrypted leaseSets."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:402
 msgid ""
 "The keyring may contain keys for local or remote encrypted destinations."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:408
 msgid "Manual Keyring Addition"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:410
 msgid "Enter keys for encrypted remote destinations here."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:413
 msgid "Keys for local destinations must be entered on the"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:415
 msgid "I2PTunnel page"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:417
 msgid "Dest. name, hash, or full key"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:419
 msgid "Encryption Key"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:121
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:137
 msgid "config logging"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:271
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:314
 msgid "I2P Logging Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:328
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:355
 msgid "Configure I2P Logging Options"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357
 msgid "Log file"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:361
 msgid "(the symbol '@' will be replaced during log rotation)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:336
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:363
 msgid "Log record format"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:367
 msgid ""
 "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:369
 msgid "Log date format"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:373
 msgid ""
 "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' "
 "= millisecond)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:375
 msgid "Max log file size"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:352
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:379
 msgid "Default log level"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:356
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:383
 msgid ""
 "(DEBUG and INFO are not recommended defaults, as they will drastically slow "
 "down your router)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:385
 msgid "Log level overrides"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:362
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:389
 msgid "New override"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:139
 msgid "config networking"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:270
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:343
 msgid "I2P Network Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:398
 msgid "IP and Transport Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:402
 msgid "There is help below."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:404
 msgid "UPnP Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:408
 msgid "Enable UPnP to open firewall ports"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:410
 msgid "UPnP status"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:412
 msgid "IP Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:341
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:414
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:490
 msgid "Externally reachable hostname or IP address"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:418
 msgid "Use all auto-detect methods"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:422
 msgid "Disable UPnP IP address detection"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:353
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:426
 msgid "Ignore local interface IP address"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:430
 msgid "Use SSU IP address detection only"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:361
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:435
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:508
 msgid "Specify hostname or IP"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:367
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:440
 msgid "Select Interface"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:381
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:454
 msgid "Hidden mode - do not publish IP"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:383
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:456
 msgid "(prevents participating traffic)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:385
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:458
 msgid "Action when IP changes"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:389
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:462
 msgid ""
 "Laptop mode - Change router identity and UDP port when IP changes for "
 "enhanced anonymity"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:391
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:464
 msgid "Experimental"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:393
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:466
 msgid "UDP Configuration:"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:468
 msgid "UDP port:"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:401
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:445
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:474
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:518
 msgid "Completely disable"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:403
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:476
 msgid "(select only if behind a firewall that blocks outbound UDP)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:415
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:488
 msgid "TCP Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:421
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:494
 msgid "Use auto-detected IP address"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:423
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:455
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:496
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:528
 msgid "currently"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:427
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:500
 msgid "if we are not firewalled"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:504
 msgid "Always use auto-detected IP address (Not firewalled)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:441
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:514
 msgid "Disable inbound (Firewalled)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:447
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:520
 msgid ""
 "(select only if behind a firewall that throttles or blocks outbound TCP)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:449
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:522
 msgid "Externally reachable TCP port"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:453
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:526
 msgid "Use the same port configured for UDP"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:461
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:534
 msgid "Specify Port"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:465
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:538
 msgid "Notes"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:468
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:541
 msgid ""
 "a) Do not reveal your port numbers to anyone!   b) Changing these settings "
 "will restart your router."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:474
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:547
 msgid "Configuration Help"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:476
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:525
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:549
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:598
 msgid ""
 "While I2P will work fine behind most firewalls, your speeds and network "
 "integration will generally improve if the I2P port is forwarded for both UDP "
 "and TCP."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:478
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:551
 msgid ""
 "If you can, please poke a hole in your firewall to allow unsolicited UDP and "
 "TCP packets to reach you."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:553
 msgid ""
 "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole "
 "punching with \"SSU introductions\" to relay traffic."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:482
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:555
 msgid ""
 "Most of the options above are for special situations, for example where UPnP "
 "does not work correctly, or a firewall not under your control is doing harm."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:484
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:557
 msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:493
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:566
 msgid ""
 "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect "
 "the external IP address and forward ports."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:495
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:568
 msgid "UPnP support is beta, and may not work for any number of reasons"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:497
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:570
 msgid "No UPnP-compatible device present"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:499
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:572
 msgid "UPnP disabled on the device"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:501
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:574
 msgid "Software firewall interference with UPnP"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:503
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:576
 msgid "Bugs in the device's UPnP implementation"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:505
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:578
 msgid "Multiple firewall/routers in the internet connection path"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:507
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:580
 msgid "UPnP device change, reset, or address change"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:509
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:582
 msgid "Review the UPnP status here."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:511
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:584
 msgid ""
 "UPnP may be enabled or disabled above, but a change requires a router "
 "restart to take effect."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:513
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:586
 msgid "Hostnames entered above will be published in the network database."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:515
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:588
 msgid "They are <b>not private</b>."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:517
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:590
 msgid ""
 "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:519
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:592
 msgid ""
 "If you specify the wrong IP address or hostname, or do not properly "
 "configure your NAT or firewall, your network performance will degrade "
 "substantially."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:521
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:594
 msgid "When in doubt, leave the settings at the defaults."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:523
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:596
 msgid "Reachability Help"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:528
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:601
 msgid ""
 "If you think you have opened up your firewall and I2P still thinks you are "
 "firewalled, remember that you may have multiple firewalls, for example both "
 "software packages and external hardware routers."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:531
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:604
 msgid ""
 "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help "
 "diagnose the problem."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:535
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:608
 msgid "Your UDP port does not appear to be firewalled."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:539
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:612
 msgid "Your UDP port appears to be firewalled."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:541
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:614
 msgid ""
 "As the firewall detection methods are not 100% reliable, this may "
 "occasionally be displayed in error."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:543
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:616
 msgid ""
 "However, if it appears consistently, you should check whether both your "
 "external and internal firewalls are open for your port."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:545
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:618
 msgid ""
 "I2P will work fine when firewalled, there is no reason for concern. When "
 "firewalled, the router uses \"introducers\" to relay inbound connections."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:547
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:620
 msgid ""
 "However, you will get more participating traffic and help the network more "
 "if you can open your firewall(s)."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:549
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:622
 msgid ""
 "If you think you have already done so, remember that you may have both a "
 "hardware and a software firewall, or be behind an additional, institutional "
 "firewall you cannot control."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:551
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:624
 msgid ""
 "Also, some routers cannot correctly forward both TCP and UDP on a single "
 "port, or may have other limitations or bugs that prevent them from passing "
 "traffic through to I2P."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:555
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:628
 msgid "The router is currently testing whether your UDP port is firewalled."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:559
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:632
 msgid ""
 "The router is not configured to publish its address, therefore it does not "
 "expect incoming connections."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:561
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:634
 msgid ""
 "Hidden mode is automatically enabled for added protection in certain "
 "countries."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:563
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:636
 msgid "WARN - Firewalled and Fast"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:565
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:638
 msgid ""
 "You have configured I2P to share more than 128KBps of bandwidth, but you are "
 "firewalled."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:567
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:640
 msgid ""
 "While I2P will work fine in this configuration, if you really have over "
 "128KBps of bandwidth to share, it will be much more helpful to the network "
 "if you open your firewall."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:569
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:642
 msgid "WARN - Firewalled and Floodfill"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:571
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:644
 msgid ""
 "You have configured I2P to be a floodfill router, but you are firewalled."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:573
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:646
 msgid ""
 "For best participation as a floodfill router, you should open your firewall."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:575
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:648
 msgid "WARN - Firewalled with Inbound TCP Enabled"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:577
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:650
 msgid ""
 "You have configured inbound TCP, however your UDP port is firewalled, and "
 "therefore it is likely that your TCP port is firewalled as well."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:579
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:652
 msgid ""
 "If your TCP port is firewalled with inbound TCP enabled, routers will not be "
 "able to contact you via TCP, which will hurt the network."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:581
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:654
 msgid "Please open your firewall or disable inbound TCP above."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:583
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:656
 msgid "WARN - Firewalled with UDP Disabled"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:585
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:658
 msgid "You have configured inbound TCP, however you have disabled UDP."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:587
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:660
 msgid ""
 "You appear to be firewalled on TCP, therefore your router cannot accept "
 "inbound connections."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:589
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:662
 msgid "Please open your firewall or enable UDP."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:591
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:664
 msgid "ERR - Clock Skew"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:593
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:666
 msgid ""
 "Your system's clock is skewed, which will make it difficult to participate "
 "in the network."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:595
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:668
 msgid "Correct your clock setting if this error persists."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:597
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:670
 msgid "ERR - Private TCP Address"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:599
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:672
 msgid ""
 "You must never advertise an unroutable IP address such as 127.0.0.1 or "
 "192.168.1.1 as your external address."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:601
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:674
 msgid "Correct the address or disable inbound TCP above."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:603
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:676
 msgid "ERR - SymmetricNAT"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:605
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:678
 msgid "I2P detected that you are firewalled by a Symmetric NAT."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:607
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:680
 msgid ""
 "I2P does not work well behind this type of firewall. You will probably not "
 "be able to accept inbound connections, which will limit your participation "
 "in the network."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:609
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:682
 msgid ""
 "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config "
 "and restart"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:611
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:684
 msgid "I2P was unable to bind to port 8887 or other configured port."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:613
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:686
 msgid ""
 "Check to see if another program is using the configured port. If so, stop "
 "that program or configure I2P to use a different port."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:615
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:688
 msgid ""
 "This may be a transient error, if the other program is no longer using the "
 "port."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:617
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:690
 msgid "However, a restart is always required after this error."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:619
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:692
 msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:621
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:694
 msgid ""
 "You have not configured inbound TCP with a hostname and port above, however "
 "you have disabled UDP."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:623
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:696
 msgid "Therefore your router cannot accept inbound connections."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:625
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:698
 msgid "Please configure a TCP host and port above or enable UDP."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:627
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:700
 msgid "ERR - Client Manager I2CP Error - check logs"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:629
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:702
 msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:631
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:704
 msgid ""
 "Do you have another I2P instance running? Stop the conflicting program and "
 "restart I2P."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:139
 msgid "config peers"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:257
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:330
 msgid "I2P Peer Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:332
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:405
 msgid "Manual Peer Controls"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:407
 msgid "Router Hash"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:338
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:411
 msgid "Manually Ban / Unban a Peer"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:413
 msgid ""
 "Banning will prevent the participation of this peer in tunnels you create."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:423
 msgid "Adjust Profile Bonuses"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:352
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:425
 msgid ""
 "Bonuses may be positive or negative, and affect the peer's inclusion in Fast "
 "and High Capacity tiers. Fast peers are used for client tunnels, and High "
@@ -5405,655 +6112,734 @@ msgid ""
 "displayed on the"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:354
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:427
 msgid "profiles page"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:372
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:281
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:445
 msgid "Banned Peers"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:393
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:466
 msgid "Banned IPs"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:139
 msgid "config reseeding"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:270
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:343
 msgid "I2P Reseeding Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:400
 msgid "Reseeding Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:402
 msgid ""
 "Reseeding is the bootstrapping process used to find other routers when you "
 "first install I2P, or when your router has too few router references "
 "remaining."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:404
 msgid ""
 "If reseeding has failed, you should first check your network connection."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:408
 msgid ""
 "Change these only if HTTP is blocked by a restrictive firewall, reseed has "
 "failed, and you have access to an HTTP proxy."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:410
 #, java-format
 msgid "See {0} for instructions on reseeding manually."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:410
 msgid "the FAQ"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:412
 msgid "Reseed URL Selection"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:416
 msgid "Try SSL first then non-SSL"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:420
 msgid "Use SSL only"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:424
 msgid "Use non-SSL only"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:353
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:426
 msgid "Reseed URLs"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:430
 msgid "Enable HTTP Proxy?"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:434
 msgid "HTTP Proxy Host"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:438
 msgid "HTTP Proxy Port"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:369
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:442
 msgid "Use HTTP Proxy Authorization?"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:373
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:446
 msgid "HTTP Proxy Username"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:377
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:450
 msgid "HTTP Proxy Password"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:381
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:454
 msgid "Enable HTTPS Proxy?"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:385
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:458
 msgid "HTTPS Proxy Host"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:389
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:462
 msgid "HTTPS Proxy Port"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:393
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:466
 msgid "Use HTTPS Proxy Authorization?"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:397
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:470
 msgid "HTTPS Proxy Username"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:401
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:474
 msgid "HTTPS Proxy Password"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:139
 msgid "config service"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:257
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:330
 msgid "I2P Service Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:385
 msgid "Shutdown the router"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:314
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:387
 msgid ""
 "Graceful shutdown lets the router satisfy the agreements it has already made "
 "before shutting down, but may take a few minutes."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:389
 msgid ""
 "If you need to kill the router immediately, that option is available as well."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:326
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:399
 msgid ""
 "If you want the router to restart itself after shutting down, you can choose "
 "one of the following."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:328
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:401
 msgid ""
 "This is useful in some situations - for example, if you changed some "
 "settings that client applications only read at startup, such as the "
 "routerconsole password or the interface it listens on."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:403
 msgid ""
 "A graceful restart will take a few minutes (but your peers will appreciate "
 "your patience), while a hard restart does so immediately."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:332
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:405
 msgid ""
 "After tearing down the router, it will wait 1 minute before starting back up "
 "again."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:415
 msgid "Systray integration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:417
 msgid ""
 "On the windows platform, there is a small application to sit in the system "
 "tray, allowing you to view the router's status"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:419
 msgid ""
 "(later on, I2P client applications will be able to integrate their own "
 "functionality into the system tray as well)."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:421
 msgid "If you are on windows, you can either enable or disable that icon here."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:423
 msgid "Show systray icon"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:352
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:425
 msgid "Hide systray icon"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:354
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:427
 msgid "Run on startup"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:356
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:429
 msgid ""
 "You can control whether I2P is run on startup or not by selecting one of the "
 "following options - I2P will install (or remove) a service accordingly."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:431
 msgid "If you prefer the command line, you can also run the "
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:366
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:439
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:430
 msgid "Note"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:368
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:441
 msgid ""
 "If you are running I2P as service right now, removing it will shut down your "
 "router immediately."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:443
 msgid ""
 "You may want to consider shutting down gracefully, as above, then running "
 "uninstall_i2p_service_winnt.bat."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:374
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:447
 msgid "Debugging"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:449
 msgid "View the job queue"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:380
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:453
 msgid ""
 "At times, it may be helpful to debug I2P by getting a thread dump. To do so, "
 "please select the following option and review the thread dumped to <a href="
 "\"logs.jsp#servicelogs\">wrapper.log</a>."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:386
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:459
 msgid "Launch browser on router startup?"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:461
 msgid ""
 "I2P's main configuration interface is this web console, so for your "
 "convenience I2P can launch a web browser on startup pointing at"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:121
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:139
+msgid "config summary bar"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:330
+msgid "I2P Summary Bar Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:401
+msgid "Refresh Interval"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:407
+msgid "seconds"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:411
+msgid "Customize Summary Bar"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:137
 msgid "config stats"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:258
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304
 msgid "I2P Stats Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:355
 msgid "Configure I2P Stat Collection"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:357
 msgid "Enable full stats?"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:338
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:364
 msgid "change requires restart to take effect"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:373
 msgid "Stat file"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:344
+#. shouldShowLog
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:382
 msgid "Filter"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:346
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:384
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395
 msgid "toggle all"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:403
 msgid "Log"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:411
 msgid "Graph"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:400
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:466
 msgid "Advanced filter"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:139
 msgid "config tunnels"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:270
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:343
 msgid "I2P Tunnel Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:410
 msgid "The default settings work for most people."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:414
 msgid "There is a fundamental tradeoff between anonymity and performance."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:417
 msgid ""
 "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 "
 "hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely "
 "reduce performance or reliability."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:420
 msgid "High CPU and/or high outbound bandwidth usage may result."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:423
 msgid "Change these settings with care, and adjust them if you have problems."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:433
 msgid ""
 "Exploratory tunnel setting changes are stored in the router.config file."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:436
 msgid "Client tunnel changes are temporary and are not saved."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:438
 msgid "To make permanent client tunnel changes see the"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:367
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:440
 msgid "i2ptunnel page"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:137
 msgid "config UI"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:270
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314
 msgid "I2P UI Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353
 msgid "Router Console Theme"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:374
 msgid "Theme selection disabled for Internet Explorer, sorry."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:376
 msgid ""
 "If you're not using IE, it's likely that your browser is pretending to be "
 "IE; please configure your browser (or proxy) to use a different User Agent "
 "string if you'd like to access the console themes."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:354
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:379
 msgid "Router Console Language"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:385
 msgid ""
 "Please contribute to the router console translation project! Contact the "
 "developers in #i2p-dev on IRC to help."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:362
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:389
 msgid "Apply"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:137
 msgid "config update"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:257
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:304
 msgid "I2P Update Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:332
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
 msgid "Check for I2P and news updates"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:363
 msgid "News &amp; I2P Updates"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:338
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367
 msgid "Check for news updates"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369
 msgid "News Updates"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:377
 msgid "Update In Progress"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:354
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385
 msgid "News URL"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:389
 msgid "Refresh frequency"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:364
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:395
 msgid "Update policy"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:401
 msgid "Update through the eepProxy?"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:374
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:405
 msgid "eepProxy host"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:378
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:409
 msgid "eepProxy port"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:384
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:415
 msgid "Update URLs"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:419
 msgid "Trusted keys"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:392
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:423
 msgid "Update with unsigned development builds?"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:396
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:427
 msgid "Unsigned Build URL"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:402
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:433
 msgid "Updates will be dispatched via your package manager."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:408
-msgid "Save"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:136
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:136
+msgid "home"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129
-msgid "Internal Error"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:383
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:354
+msgid "Welcome to I2P"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:131
-msgid "Router Console"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:321
+msgid "I2P Addressbook"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:324
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:323
+msgid "Open in new tab"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:328
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:327
+msgid "Your browser does not support iFrames."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:329
+msgid "Click here to continue."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:144
+msgid "Internal Error"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:150
 msgid "Configuration"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:157
 msgid "Sorry! There has been an internal error."
 msgstr ""
 
 #. note to translators - both parameters are URLs
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:262
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:161
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:335
 #, java-format
 msgid "Please report bugs on {0} or {1}."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:151
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:164
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:339
 msgid ""
 "You may use the username \"guest\" and password \"guest\" if you do not wish "
 "to register."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:153
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:268
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:168
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:341
 msgid "Please include this information in bug reports"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:155
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:170
 msgid "Error Details"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:157
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:172
 #, java-format
 msgid "Error {0}"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:177
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:191
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:331
 msgid "I2P Version and Running Environment"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:232
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:390
 msgid ""
 "Note that system information, log timestamps, and log messages may provide "
 "clues to your location; please review everything you include in a bug report."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:131
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:148
 msgid "Page Not Found"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:272
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:319
 msgid ""
 "Sorry! You appear to be requesting a non-existent Router Console page or "
 "resource."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:274
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:321
 msgid "Error 404"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:279
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:326
 msgid "not found"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:138
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:136
 msgid "graphs"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:352
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:324
 msgid "I2P Performance Graphs"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:119
-msgid "home"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:312
+msgid ""
+"Click a flag to select a language. Click 'configure language' below to "
+"change it later."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:361
-msgid "Welcome to I2P"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:362
+msgid "Search I2P"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:382
+msgid "Eepsites of Interest"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:154
+msgid "i2p tunnel manager"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:322
+msgid "I2P Tunnel Manager"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:119
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:138
 msgid "Jar File Dump"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:119
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:136
 msgid "job queue"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:303
 msgid "I2P Router Job Queue"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:119
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:138
 msgid "logs"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:329
 msgid "I2P Router Logs"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:392
 msgid "Critical Logs"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:396
 msgid "Router Logs"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:402
 msgid "Service (Wrapper) Logs"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:119
-msgid "network database summary"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:136
+msgid "network database"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:256
-msgid "I2P Network Database Summary"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:303
+msgid "I2P Network Database"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:123
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:142
 msgid "WebApp Not Found"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:260
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:333
 msgid "Web Application Not Running"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:262
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:335
 msgid "The requested web application is not running."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:264
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:337
 msgid ""
 "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</"
 "a> to start it."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:119
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:136
 msgid "peer connections"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:303
 msgid "I2P Network Peers"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:119
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:136
 msgid "peer profiles"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:303
 msgid "I2P Network Peer Profiles"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:119
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:136
 msgid "statistics"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:273
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:316
 msgid "I2P Router Statistics"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:264
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:301
 #, java-format
 msgid "Disable {0} Refresh"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:119
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:154
+msgid "torrents"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:321
+msgid "I2P Torrent Downloader"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:136
 msgid "tunnel summary"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:303
 msgid "I2P Tunnel Summary"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:119
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:136
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:303
 msgid "Peer Profile"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:283
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:326
 #, java-format
 msgid "Profile for peer {0}"
 msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:154
+msgid "webmail"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:321
+msgid "I2P Webmail"
+msgstr ""
diff --git a/apps/routerconsole/locale/messages_en.po b/apps/routerconsole/locale/messages_en.po
index 830a7919c4adb90b0a6563550ee27846c4e94967..e482ae5e549c5d5aebc3abf5a7ccc30832ed7eb3 100644
--- a/apps/routerconsole/locale/messages_en.po
+++ b/apps/routerconsole/locale/messages_en.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P routerconsole\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-08-25 19:38+0000\n"
+"POT-Creation-Date: 2012-09-06 09:09+0000\n"
 "PO-Revision-Date: 2010-06-15 14:09+0100\n"
 "Last-Translator: duck <duck@mail.i2p>\n"
 "Language-Team: duck <duck@mail.i2p>\n"
@@ -26,7 +26,7 @@ msgstr ""
 #. {0,number,####} prevents 1234 from being output as 1,234 in the English locale.
 #. If you want the digit separator in your locale, translate as {0}.
 #. alternates: msec, msecs
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1387
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1396
 #, java-format
 msgid "1 ms"
 msgid_plural "{0,number,####} ms"
@@ -35,7 +35,7 @@ msgstr[1] ""
 
 #. seconds
 #. alternates: secs, sec. 'seconds' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1391
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1400
 #, java-format
 msgid "1 sec"
 msgid_plural "{0} sec"
@@ -44,7 +44,7 @@ msgstr[1] ""
 
 #. minutes
 #. alternates: mins, min. 'minutes' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1395
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1404
 #, java-format
 msgid "1 min"
 msgid_plural "{0} min"
@@ -53,20 +53,20 @@ msgstr[1] ""
 
 #. hours
 #. alternates: hrs, hr., hrs.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1399
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1408
 #, java-format
 msgid "1 hour"
 msgid_plural "{0} hours"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1401
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1410
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:341
 msgid "n/a"
 msgstr ""
 
 #. days
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1404
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1413
 #, java-format
 msgid "1 day"
 msgid_plural "{0} days"
@@ -278,7 +278,7 @@ msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:753
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2061
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2063
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
@@ -293,7 +293,7 @@ msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:754
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2065
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2067
 msgid "Dir"
 msgstr ""
 
@@ -319,13 +319,13 @@ msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:755
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2066
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2068
 msgid "Idle"
 msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:756
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2071
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2073
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:157
 msgid "In/Out"
 msgstr ""
@@ -340,14 +340,14 @@ msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:757
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2076
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2078
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:835
 msgid "Up"
 msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2078
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2080
 msgid "Skew"
 msgstr ""
 
@@ -382,7 +382,7 @@ msgid "The round trip time in milliseconds"
 msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2088
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2090
 msgid "Dev"
 msgstr ""
 
@@ -402,7 +402,7 @@ msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:759
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2095
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2097
 msgid "TX"
 msgstr ""
 
@@ -412,7 +412,7 @@ msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2097
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2099
 msgid "RX"
 msgstr ""
 
@@ -421,7 +421,7 @@ msgid "The total number of packets received from the peer"
 msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2100
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2102
 msgid "Dup TX"
 msgstr ""
 
@@ -430,7 +430,7 @@ msgid "The total number of packets retransmitted to the peer"
 msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:552
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2102
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2104
 msgid "Dup RX"
 msgstr ""
 
@@ -565,12 +565,12 @@ msgid "NTCP connections"
 msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:749
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2057
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2059
 msgid "Limit"
 msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:750
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2058
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2060
 msgid "Timeout"
 msgstr ""
 
@@ -583,13 +583,13 @@ msgid "Backlogged?"
 msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:776
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2120
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2122
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:88
 msgid "Inbound"
 msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:778
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2122
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2124
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:88
 msgid "Outbound"
 msgstr ""
@@ -599,112 +599,112 @@ msgstr ""
 msgid "peers"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2056
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2058
 msgid "UDP connections"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2063
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2065
 msgid "Sort by peer hash"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2065
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2067
 msgid "Direction/Introduction"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2067
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2069
 msgid "Sort by idle inbound"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2069
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2071
 msgid "Sort by idle outbound"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2072
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2074
 msgid "Sort by inbound rate"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2074
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2076
 msgid "Sort by outbound rate"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2077
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2079
 msgid "Sort by connection uptime"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2079
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2081
 msgid "Sort by clock skew"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2082
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2084
 msgid "Sort by congestion window"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2084
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2086
 msgid "Sort by slow start threshold"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2087
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2089
 msgid "Sort by round trip time"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2089
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2091
 msgid "Sort by round trip time deviation"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2091
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2093
 msgid "Sort by retransmission timeout"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2094
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2096
 msgid "Sort by outbound maximum transmit unit"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2096
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2098
 msgid "Sort by packets sent"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2098
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2100
 msgid "Sort by packets received"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2101
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2103
 msgid "Sort by packets retransmitted"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2103
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2105
 msgid "Sort by packets received more than once"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2124
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2126
 msgid "We offered to introduce them"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2126
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2128
 msgid "They offered to introduce us"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2130
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2132
 msgid "Choked"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2138
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2140
 msgid "1 fail"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2140
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2142
 #, java-format
 msgid "{0} fails"
 msgstr ""
 
 #. 1
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2146
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2148
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171
 #: ../java/src/net/i2p/router/web/ProfilesHelper.java:13
 msgid "Banned"
 msgstr ""
 
 #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2276
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2278
 msgid "SUMMARY"
 msgstr ""
 
diff --git a/apps/sam/java/src/net/i2p/sam/SAMBridge.java b/apps/sam/java/src/net/i2p/sam/SAMBridge.java
index 114f9dd6015857672328666c7db28f3a4b24e447..aa798b8f3d6940165daaab0a3b4b4f6377ded1f9 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMBridge.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMBridge.java
@@ -252,7 +252,7 @@ public class SAMBridge implements Runnable {
         }
         SAMBridge bridge = new SAMBridge(host, port, opts, keyfile);
         I2PAppThread t = new I2PAppThread(bridge, "SAMListener");
-        if (Boolean.valueOf(System.getProperty("sam.shutdownOnOOM", "false")).booleanValue()) {
+        if (Boolean.parseBoolean(System.getProperty("sam.shutdownOnOOM"))) {
             t.addOOMEventThreadListener(new I2PAppThread.OOMEventListener() {
                 public void outOfMemory(OutOfMemoryError err) {
                     err.printStackTrace();
diff --git a/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java b/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java
index 39836c53f55f93db47d47f5d386b95988245ba4d..6a86a915cd0ca6e04e91328306013ee6ee38f78c 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java
@@ -134,7 +134,7 @@ public class SAMStreamSession {
         
         socketMgr.addDisconnectListener(new DisconnectListener());
 
-        forceFlush = Boolean.valueOf(allprops.getProperty(PROP_FORCE_FLUSH, DEFAULT_FORCE_FLUSH)).booleanValue();
+        forceFlush = Boolean.parseBoolean(allprops.getProperty(PROP_FORCE_FLUSH, DEFAULT_FORCE_FLUSH));
         
         boolean canReceive = false;
         if (dir.equals("BOTH")) {
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnThrottler.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnThrottler.java
index 69f0bb857161d8ca2fc450dbe1347da70375baa1..2b24d090958fc06a28b4b67e76376fc9572b7718 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/ConnThrottler.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnThrottler.java
@@ -15,8 +15,8 @@ import net.i2p.util.SimpleTimer;
  */
 class ConnThrottler {
     private final ObjectCounter<Hash> counter;
-    private final int _max;
-    private final int _totalMax;
+    private volatile int _max;
+    private volatile int _totalMax;
     private final AtomicInteger _currentTotal;
 
     /*
@@ -27,17 +27,21 @@ class ConnThrottler {
     ConnThrottler(int max, int totalMax, long period) {
         _max = max;
         _totalMax = totalMax;
-        if (max > 0)
-            this.counter = new ObjectCounter<Hash>();
-        else
-            this.counter = null;
-        if (totalMax > 0)
-            _currentTotal = new AtomicInteger();
-        else
-            _currentTotal = null;
+        this.counter = new ObjectCounter<Hash>();
+        _currentTotal = new AtomicInteger();
         SimpleScheduler.getInstance().addPeriodicEvent(new Cleaner(), period);
     }
 
+    /*
+     * @param max per-peer, 0 for unlimited
+     * @param totalMax for all peers, 0 for unlimited
+     * @since 0.9.3
+     */
+    public void updateLimits(int max, int totalMax) {
+        _max = max;
+        _totalMax = totalMax;
+    }
+
     /**
      *  Checks both individual and total. Increments before checking.
      */
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/Connection.java b/apps/streaming/java/src/net/i2p/client/streaming/Connection.java
index 29a05512f71737526e42be160bc264582b281042..99909b6b30c49c2f1ebbd5454518215402d1c144 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/Connection.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/Connection.java
@@ -87,7 +87,7 @@ class Connection {
     /** wait up to 5 minutes after disconnection so we can ack/close packets */
     public static final int DISCONNECT_TIMEOUT = 5*60*1000;
     
-    private static final long DEFAULT_CONNECT_TIMEOUT = 60*1000;
+    public static final int DEFAULT_CONNECT_TIMEOUT = 60*1000;
     private static final long MAX_CONNECT_TIMEOUT = 2*60*1000;
 
     public static final int MAX_WINDOW_SIZE = 128;
@@ -549,7 +549,15 @@ class Connection {
     
     public void setInbound() { _isInbound = true; }
     public boolean isInbound() { return _isInbound; }
+
+    /**
+     *  Always true at the start, even if we haven't gotten a reply on an
+     *  outbound connection. Only set to false on disconnect.
+     *  For outbound, use getHighestAckedThrough() >= 0 also,
+     *  to determine if the connection is up.
+     */
     public boolean getIsConnected() { return _connected; }
+
     public boolean getHardDisconnected() { return _hardDisconnected; }
     public boolean getResetSent() { return _resetSent; }
     public long getResetSentOn() { return _resetSentOn; }
@@ -1017,7 +1025,7 @@ class Connection {
 
     @Override
     public String toString() { 
-        StringBuilder buf = new StringBuilder(128);
+        StringBuilder buf = new StringBuilder(256);
         buf.append("[Connection ");
         if (_receiveStreamId > 0)
             buf.append(Packet.toId(_receiveStreamId));
@@ -1075,6 +1083,7 @@ class Connection {
             buf.append(" close received ").append(DataHelper.formatDuration(_context.clock().now() - getCloseReceivedOn())).append(" ago");
         buf.append(" sent: ").append(1 + _lastSendId.get());
         buf.append(" rcvd: ").append(1 + _inputStream.getHighestBlockId() - missing);
+        buf.append(" ackThru ").append(_highestAckedThrough);
         
         buf.append(" maxWin ").append(getOptions().getMaxWindowSize());
         buf.append(" MTU ").append(getOptions().getMaxMessageSize());
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java
index 3547b55440a552747264ff9720395832bcf59fec..7a9529e5e211352026b4798c3c04dce17a31d0d9 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java
@@ -4,6 +4,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.StringTokenizer;
 import java.util.concurrent.ConcurrentHashMap;
 
 import net.i2p.I2PAppContext;
@@ -12,6 +13,8 @@ import net.i2p.client.I2PSession;
 import net.i2p.data.Destination;
 import net.i2p.data.Hash;
 import net.i2p.data.SessionKey;
+import net.i2p.util.ConcurrentHashSet;
+import net.i2p.util.ConvertToHash;
 import net.i2p.util.Log;
 import net.i2p.util.SimpleTimer2;
 
@@ -35,21 +38,28 @@ class ConnectionManager {
     private final ConcurrentHashMap<Long, Connection> _connectionByInboundId;
     /** Ping ID (Long) to PingRequest */
     private final Map<Long, PingRequest> _pendingPings;
-    private boolean _throttlersInitialized;
-    private int _maxConcurrentStreams;
+    private volatile boolean _throttlersInitialized;
     private final ConnectionOptions _defaultOptions;
     private volatile int _numWaiting;
     private long _soTimeout;
-    private ConnThrottler _minuteThrottler;
-    private ConnThrottler _hourThrottler;
-    private ConnThrottler _dayThrottler;
+    private volatile ConnThrottler _minuteThrottler;
+    private volatile ConnThrottler _hourThrottler;
+    private volatile ConnThrottler _dayThrottler;
     /** since 0.9, each manager instantiates its own timer */
     private final SimpleTimer2 _timer;
+    /** cache of the property to detect changes */
+    private static volatile String _currentBlacklist = "";
+    private static final Set<Hash> _globalBlacklist = new ConcurrentHashSet();
     
-    public ConnectionManager(I2PAppContext context, I2PSession session, int maxConcurrent, ConnectionOptions defaultOptions) {
+    /** @since 0.9.3 */
+    public static final String PROP_BLACKLIST = "i2p.streaming.blacklist";
+
+    /**
+     *  Manage all conns for this session
+     */
+    public ConnectionManager(I2PAppContext context, I2PSession session, ConnectionOptions defaultOptions) {
         _context = context;
         _session = session;
-        _maxConcurrentStreams = maxConcurrent;
         _defaultOptions = defaultOptions;
         _log = _context.logManager().getLog(ConnectionManager.class);
         _connectionByInboundId = new ConcurrentHashMap(32);
@@ -128,21 +138,42 @@ class ConnectionManager {
 
     public void setAllowIncomingConnections(boolean allow) { 
         _connectionHandler.setActive(allow);
-        if (allow && !_throttlersInitialized) {
-            _throttlersInitialized = true;
-            if (_defaultOptions.getMaxConnsPerMinute() > 0 || _defaultOptions.getMaxTotalConnsPerMinute() > 0) {
+        if (allow) {
+            synchronized(this) {
+                if (!_throttlersInitialized) {
+                    updateOptions();
+                    _throttlersInitialized = true;
+                }
+            }
+        }
+    }
+
+    /*
+     * Update the throttler options
+     * @since 0.9.3
+     */
+    public synchronized void updateOptions() { 
+            if ((_defaultOptions.getMaxConnsPerMinute() > 0 || _defaultOptions.getMaxTotalConnsPerMinute() > 0) &&
+                _minuteThrottler == null) {
                _context.statManager().createRateStat("stream.con.throttledMinute", "Dropped for conn limit", "Stream", new long[] { 5*60*1000 });
                _minuteThrottler = new ConnThrottler(_defaultOptions.getMaxConnsPerMinute(), _defaultOptions.getMaxTotalConnsPerMinute(), 60*1000);
+            } else if (_minuteThrottler != null) {
+               _minuteThrottler.updateLimits(_defaultOptions.getMaxConnsPerMinute(), _defaultOptions.getMaxTotalConnsPerMinute());
             }
-            if (_defaultOptions.getMaxConnsPerHour() > 0 || _defaultOptions.getMaxTotalConnsPerHour() > 0) {
+            if ((_defaultOptions.getMaxConnsPerHour() > 0 || _defaultOptions.getMaxTotalConnsPerHour() > 0) &&
+                _hourThrottler == null) {
                _context.statManager().createRateStat("stream.con.throttledHour", "Dropped for conn limit", "Stream", new long[] { 5*60*1000 });
                _hourThrottler = new ConnThrottler(_defaultOptions.getMaxConnsPerHour(), _defaultOptions.getMaxTotalConnsPerHour(), 60*60*1000);
+            } else if (_hourThrottler != null) {
+               _hourThrottler.updateLimits(_defaultOptions.getMaxConnsPerHour(), _defaultOptions.getMaxTotalConnsPerHour());
             }
-            if (_defaultOptions.getMaxConnsPerDay() > 0 || _defaultOptions.getMaxTotalConnsPerDay() > 0) {
+            if ((_defaultOptions.getMaxConnsPerDay() > 0 || _defaultOptions.getMaxTotalConnsPerDay() > 0) &&
+                _dayThrottler == null) {
                _context.statManager().createRateStat("stream.con.throttledDay", "Dropped for conn limit", "Stream", new long[] { 5*60*1000 });
                _dayThrottler = new ConnThrottler(_defaultOptions.getMaxConnsPerDay(), _defaultOptions.getMaxTotalConnsPerDay(), 24*60*60*1000);
+            } else if (_dayThrottler != null) {
+               _dayThrottler.updateLimits(_defaultOptions.getMaxConnsPerDay(), _defaultOptions.getMaxTotalConnsPerDay());
             }
-        }
     }
 
     /** @return if we should accept connections */
@@ -177,7 +208,7 @@ class ConnectionManager {
             //}
             if (locked_tooManyStreams()) {
                 _log.logAlways(Log.WARN, "Refusing connection since we have exceeded our max of " 
-                              + _maxConcurrentStreams + " connections");
+                              + _defaultOptions.getMaxConns() + " connections");
                 reject = true;
             } else {
                 // this may not be right if more than one is enabled
@@ -209,6 +240,7 @@ class ConnectionManager {
                 Hash h = from.calculateHash();
                 if ((_hourThrottler != null && _hourThrottler.isThrottled(h)) ||
                     (_dayThrottler != null && _dayThrottler.isThrottled(h)) ||
+                    _globalBlacklist.contains(h) ||
                     (_defaultOptions.isAccessListEnabled() && !_defaultOptions.getAccessList().contains(h)) ||
                     (_defaultOptions.isBlacklistEnabled() && _defaultOptions.getBlacklist().contains(h))) {
                     // A signed RST packet + ElGamal + session tags is fairly expensive, so
@@ -267,16 +299,17 @@ class ConnectionManager {
             long remaining = expiration - _context.clock().now();
             if (remaining <= 0) { 
                 _log.logAlways(Log.WARN, "Refusing to connect since we have exceeded our max of " 
-                          + _maxConcurrentStreams + " connections");
+                          + _defaultOptions.getMaxConns() + " connections");
                 _numWaiting--;
                 return null;
             }
 
                 if (locked_tooManyStreams()) {
+                    int max = _defaultOptions.getMaxConns();
                     // allow a full buffer of pending/waiting streams
-                    if (_numWaiting > _maxConcurrentStreams) {
+                    if (_numWaiting > max) {
                         _log.logAlways(Log.WARN, "Refusing connection since we have exceeded our max of "
-                                      + _maxConcurrentStreams + " and there are " + _numWaiting
+                                      + max + " and there are " + _numWaiting
                                       + " waiting already");
                         _numWaiting--;
                         return null;
@@ -320,8 +353,9 @@ class ConnectionManager {
      *  @return too many
      */
     private boolean locked_tooManyStreams() {
-        if (_maxConcurrentStreams <= 0) return false;
-        if (_connectionByInboundId.size() < _maxConcurrentStreams) return false;
+        int max = _defaultOptions.getMaxConns();
+        if (max <= 0) return false;
+        if (_connectionByInboundId.size() < max) return false;
         int active = 0;
         for (Connection con : _connectionByInboundId.values()) {
             if (con.getIsConnected())
@@ -332,7 +366,7 @@ class ConnectionManager {
             _log.info("More than 100 connections!  " + active
                       + " total: " + _connectionByInboundId.size());
 
-        return (active >= _maxConcurrentStreams);
+        return (active >= max);
     }
     
     /**
@@ -398,6 +432,32 @@ class ConnectionManager {
         if (_defaultOptions.isBlacklistEnabled() &&
             _defaultOptions.getBlacklist().contains(h))
             return "blacklisted";
+        String hashes = _context.getProperty(PROP_BLACKLIST, "");
+        if (!_currentBlacklist.equals(hashes)) {
+            // rebuild _globalBlacklist when property changes
+            synchronized(_globalBlacklist) {
+                if (hashes.length() > 0) {
+                    Set<Hash> newSet = new HashSet();
+                    StringTokenizer tok = new StringTokenizer(hashes, ",; ");
+                    while (tok.hasMoreTokens()) {
+                        String hashstr = tok.nextToken();
+                        Hash hh = ConvertToHash.getHash(hashstr);
+                        if (hh != null)
+                            newSet.add(hh);
+                        else
+                            _log.error("Bad blacklist entry: " + hashstr);
+                    }
+                    _globalBlacklist.addAll(newSet);
+                    _globalBlacklist.retainAll(newSet);
+                    _currentBlacklist = hashes;
+                } else {
+                    _globalBlacklist.clear();
+                    _currentBlacklist = "";
+                }
+            }
+        }
+        if (hashes.length() > 0 && _globalBlacklist.contains(h))
+            return "blacklisted globally";
         return null;
     }
 
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java
index 95eef4687a81f862b87a6faaab32c753c21fd09c..aac78d99369a55e1828dc8c6b388abcd711ac707 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java
@@ -14,6 +14,8 @@ import net.i2p.util.Log;
 /**
  * Define the current options for the con (and allow custom tweaking midstream)
  *
+ * TODO many of these are not per-connection options, and should be migrated
+ * somewhere so they aren't copied for every connection
  */
 class ConnectionOptions extends I2PSocketOptionsImpl {
     private int _connectDelay;
@@ -47,6 +49,7 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
     private int _maxTotalConnsPerMinute;
     private int _maxTotalConnsPerHour;
     private int _maxTotalConnsPerDay;
+    private int _maxConns;
 
     // NOTE - almost all the options are below, but see
     // I2PSocketOptions in ministreaming for a few more
@@ -90,6 +93,12 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
     public static final String PROP_MAX_TOTAL_CONNS_DAY = "i2p.streaming.maxTotalConnsPerDay";
     /** @since 0.9.1 */
     public static final String PROP_ENFORCE_PROTO = "i2p.streaming.enforceProtocol";
+    /**
+     *  how many streams will we allow at once?
+     *  @since 0.9.3 moved from I2PSocketManagerFull
+     */
+    public static final String PROP_MAX_STREAMS = "i2p.streaming.maxConcurrentStreams";
+    
     
     private static final int TREND_COUNT = 3;
     static final int INITIAL_WINDOW_SIZE = 6;
@@ -308,6 +317,7 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
             _maxTotalConnsPerMinute = opts.getMaxTotalConnsPerMinute();
             _maxTotalConnsPerHour = opts.getMaxTotalConnsPerHour();
             _maxTotalConnsPerDay = opts.getMaxTotalConnsPerDay();
+            _maxConns = opts.getMaxConns();
     }
     
     /**
@@ -333,8 +343,8 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
                                                       DEFAULT_CONGESTION_AVOIDANCE_GROWTH_RATE_FACTOR));
         setSlowStartGrowthRateFactor(getInt(opts, PROP_SLOW_START_GROWTH_RATE_FACTOR,
                                             DEFAULT_SLOW_START_GROWTH_RATE_FACTOR));
-        // overrides default in super()
-        setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DISCONNECT_TIMEOUT));
+        // overrides default in super()... why?
+        //setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DISCONNECT_TIMEOUT));
         setAnswerPings(getBool(opts, PROP_ANSWER_PINGS, DEFAULT_ANSWER_PINGS));
         setEnforceProtocol(getBool(opts, PROP_ENFORCE_PROTO, DEFAULT_ENFORCE_PROTO));
         initLists(opts);
@@ -344,6 +354,7 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
         _maxTotalConnsPerMinute = getInt(opts, PROP_MAX_TOTAL_CONNS_MIN, 0);
         _maxTotalConnsPerHour = getInt(opts, PROP_MAX_TOTAL_CONNS_HOUR, 0);
         _maxTotalConnsPerDay = getInt(opts, PROP_MAX_TOTAL_CONNS_DAY, 0);
+        _maxConns = getInt(opts, PROP_MAX_STREAMS, 0);
     }
     
     /**
@@ -388,9 +399,8 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
             setSlowStartGrowthRateFactor(getInt(opts, PROP_SLOW_START_GROWTH_RATE_FACTOR,
                                                 DEFAULT_SLOW_START_GROWTH_RATE_FACTOR));
         if (opts.containsKey(PROP_CONNECT_TIMEOUT))
-            // wow 5 minutes!!! FIXME!!
             // overrides default in super()
-            setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DISCONNECT_TIMEOUT));
+            setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DEFAULT_CONNECT_TIMEOUT));
         if (opts.containsKey(PROP_ANSWER_PINGS))
             setAnswerPings(getBool(opts, PROP_ANSWER_PINGS, DEFAULT_ANSWER_PINGS));
         if (opts.containsKey(PROP_ENFORCE_PROTO))
@@ -408,6 +418,8 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
             _maxTotalConnsPerHour = getInt(opts, PROP_MAX_TOTAL_CONNS_HOUR, 0);
         if (opts.containsKey(PROP_MAX_TOTAL_CONNS_DAY))
             _maxTotalConnsPerDay = getInt(opts, PROP_MAX_TOTAL_CONNS_DAY, 0);
+        if (opts.containsKey(PROP_MAX_STREAMS))
+            _maxConns = getInt(opts, PROP_MAX_STREAMS, 0);
     }
     
     /** 
@@ -660,6 +672,8 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
     public int getMaxTotalConnsPerMinute() { return _maxTotalConnsPerMinute; }
     public int getMaxTotalConnsPerHour() { return _maxTotalConnsPerHour; }
     public int getMaxTotalConnsPerDay() { return _maxTotalConnsPerDay; }
+    /** @since 0.9.3; no public setter */
+    public int getMaxConns() { return _maxConns; }
 
     public boolean isAccessListEnabled() { return _accessListEnabled; }
     public boolean isBlacklistEnabled() { return _blackListEnabled; }
@@ -691,7 +705,7 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
             String hashes = opts.getProperty(PROP_ACCESS_LIST);
             if (hashes == null)
                 return;
-            StringTokenizer tok = new StringTokenizer(hashes, ", ");
+            StringTokenizer tok = new StringTokenizer(hashes, ",; ");
             while (tok.hasMoreTokens()) {
                 String hashstr = tok.nextToken();
                 Hash h = ConvertToHash.getHash(hashstr);
@@ -749,7 +763,7 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
         if (opts == null) return defaultVal;
         String val = opts.getProperty(name);
         if (val == null)  return defaultVal;
-        return Boolean.valueOf(val).booleanValue();
+        return Boolean.parseBoolean(val);
     }
 
 /****
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java
index cfc0bf7838a23bd5a963b6b81f52cd6721c299c8..dc16811913c41acd45c2a4a600ae48fee6fa5a14 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java
@@ -36,7 +36,6 @@ public class I2PSocketManagerFull implements I2PSocketManager {
     private final ConnectionOptions _defaultOptions;
     private long _acceptTimeout;
     private String _name;
-    private int _maxStreams;
     private static int __managerId = 0;
     private final ConnectionManager _connectionManager;
     
@@ -54,9 +53,6 @@ public class I2PSocketManagerFull implements I2PSocketManager {
         throw new UnsupportedOperationException();
     }
     
-    /** how many streams will we allow at once?  */
-    public static final String PROP_MAX_STREAMS = "i2p.streaming.maxConcurrentStreams";
-    
     /**
      * @deprecated use 4-arg constructor
      * @throws UnsupportedOperationException always
@@ -79,19 +75,10 @@ public class I2PSocketManagerFull implements I2PSocketManager {
         _session = session;
         _log = _context.logManager().getLog(I2PSocketManagerFull.class);
         
-        _maxStreams = -1;
-        try {
-            String num = (opts != null ? opts.getProperty(PROP_MAX_STREAMS, "-1") : "-1");
-            _maxStreams = Integer.parseInt(num);
-        } catch (NumberFormatException nfe) {
-            if (_log.shouldLog(Log.WARN))
-                _log.warn("Invalid max # of concurrent streams, defaulting to unlimited", nfe);
-            _maxStreams = -1;
-        }
         _name = name + " " + (++__managerId);
         _acceptTimeout = ACCEPT_TIMEOUT_DEFAULT;
         _defaultOptions = new ConnectionOptions(opts);
-        _connectionManager = new ConnectionManager(_context, _session, _maxStreams, _defaultOptions);
+        _connectionManager = new ConnectionManager(_context, _session, _defaultOptions);
         _serverSocket = new I2PServerSocketFull(this);
         
         if (_log.shouldLog(Log.INFO)) {
@@ -182,6 +169,7 @@ public class I2PSocketManagerFull implements I2PSocketManager {
         if (_log.shouldLog(Log.WARN))
             _log.warn("Changing options from:\n " + _defaultOptions + "\nto:\n " + options);
         _defaultOptions.updateAll((ConnectionOptions) options);
+        _connectionManager.updateOptions();
     }
 
     /**
@@ -244,7 +232,7 @@ public class I2PSocketManagerFull implements I2PSocketManager {
         // the following blocks unless connect delay > 0
         Connection con = _connectionManager.connect(peer, opts);
         if (con == null)
-            throw new TooManyStreamsException("Too many streams (max " + _maxStreams + ")");
+            throw new TooManyStreamsException("Too many streams, max " + _defaultOptions.getMaxConns());
         I2PSocketFull socket = new I2PSocketFull(con);
         con.setSocket(socket);
         if (con.getConnectionError() != null) { 
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/SchedulerChooser.java b/apps/streaming/java/src/net/i2p/client/streaming/SchedulerChooser.java
index 17918a6e129219842da6e374e4b5c2f8dd09c5e2..1dd473907aa165f1e8e63a32c41a76e6722e0458 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/SchedulerChooser.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/SchedulerChooser.java
@@ -29,7 +29,7 @@ class SchedulerChooser {
             TaskScheduler scheduler = _schedulers.get(i);
             if (scheduler.accept(con)) {
                 //if (_log.shouldLog(Log.DEBUG))
-                //    _log.debug("Scheduling for " + con + " with " + scheduler.getClass().getName());
+                //    _log.debug("Scheduling for " + con + " with " + scheduler.getClass().getSimpleName());
                 return scheduler;
             }
         }
diff --git a/apps/susidns/locale/messages_cs.po b/apps/susidns/locale/messages_cs.po
index 973dc4a2a6baff0f2ac523dfe96bc33555f2e307..4bf68cfc8cf9dcd686ac2d3e26aaaeee46463365 100644
--- a/apps/susidns/locale/messages_cs.po
+++ b/apps/susidns/locale/messages_cs.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-02-17 11:41+0000\n"
+"POT-Creation-Date: 2012-09-12 11:58+0000\n"
 "PO-Revision-Date: 2012-02-12 22:15+0000\n"
 "Last-Translator: Waseihou Watashi <waseihou@gmail.com>\n"
 "Language-Team: Czech (http://www.transifex.net/projects/p/I2P/language/cs/)\n"
@@ -19,58 +19,58 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
 
-#: ../src/java/src/i2p/susi/dns/AddressBean.java:131
+#: ../src/java/src/i2p/susi/dns/AddressBean.java:130
 #, java-format
 msgid "Host name \"{0}\" contains illegal character {1}"
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressBean.java:144
-#: ../src/java/src/i2p/susi/dns/AddressBean.java:146
-#: ../src/java/src/i2p/susi/dns/AddressBean.java:153
+#: ../src/java/src/i2p/susi/dns/AddressBean.java:143
+#: ../src/java/src/i2p/susi/dns/AddressBean.java:145
+#: ../src/java/src/i2p/susi/dns/AddressBean.java:152
 #, java-format
 msgid "Host name cannot start with \"{0}\""
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressBean.java:148
-#: ../src/java/src/i2p/susi/dns/AddressBean.java:150
+#: ../src/java/src/i2p/susi/dns/AddressBean.java:147
+#: ../src/java/src/i2p/susi/dns/AddressBean.java:149
 #, java-format
 msgid "Host name cannot end with \"{0}\""
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressBean.java:155
+#: ../src/java/src/i2p/susi/dns/AddressBean.java:154
 #, java-format
 msgid "Host name cannot contain \"{0}\""
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressBean.java:158
+#: ../src/java/src/i2p/susi/dns/AddressBean.java:157
 #, java-format
 msgid ""
 "Host name \"{0}\" requires conversion to ASCII but the conversion library is "
 "unavailable in this JVM"
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressBean.java:210
+#: ../src/java/src/i2p/susi/dns/AddressBean.java:218
 msgid "None"
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressBean.java:218
+#: ../src/java/src/i2p/susi/dns/AddressBean.java:226
 msgid "Hashcash"
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressBean.java:220
+#: ../src/java/src/i2p/susi/dns/AddressBean.java:228
 msgid "Hidden"
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressBean.java:222
+#: ../src/java/src/i2p/susi/dns/AddressBean.java:230
 msgid "Signed"
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressBean.java:224
+#: ../src/java/src/i2p/susi/dns/AddressBean.java:232
 #, java-format
 msgid "Type {0}"
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:233
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:202
 #, java-format
 msgid "One result for search within filtered list."
 msgid_plural "{0} results for search within filtered list."
@@ -78,7 +78,7 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:237
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206
 #, java-format
 msgid "Filtered list contains 1 entry."
 msgid_plural "Fltered list contains {0} entries."
@@ -86,7 +86,7 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:242
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:211
 #, java-format
 msgid "One result for search."
 msgid_plural "{0} results for search."
@@ -94,7 +94,7 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:220
 #, java-format
 msgid "Address book contains 1 entry."
 msgid_plural "Address book contains {0} entries."
@@ -102,97 +102,97 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:267
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:236
 #, java-format
 msgid "Showing {0} of {1}"
 msgstr "Zobrazuji {0} z {1}"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:288
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:231
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:392
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:257
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:227
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:412
 msgid "Add"
 msgstr "Přídat"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:288
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:299
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:231
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:243
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:390
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:257
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:268
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:227
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:239
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:410
 msgid "Replace"
 msgstr "Nahradit"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:298
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:242
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:267
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:238
 #, java-format
 msgid "Host name {0} is already in address book, unchanged."
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:300
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:244
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:269
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:240
 #, java-format
 msgid ""
 "Host name {0} is already in address book with a different destination. Click "
 "\"Replace\" to overwrite."
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:313
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:257
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:282
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:253
 #, java-format
 msgid "Destination added for {0}."
 msgstr "Přídán cíl pro {0}"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:315
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:259
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:284
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:255
 #, java-format
 msgid "Destination changed for {0}."
 msgstr "Cíl pro {0} změněn."
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:317
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:261
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:286
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:257
 msgid "Warning - host name does not end with \".i2p\""
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:322
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:269
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:291
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:265
 msgid "Invalid Base 64 destination."
 msgstr "Neplatný cíl ve formátu Base 64."
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:328
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:275
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:297
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:271
 #, java-format
 msgid "Invalid host name \"{0}\"."
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:331
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:278
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:300
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:274
 msgid "Please enter a host name and destination"
 msgstr "Prosím vložte jméno hostitele a cíl."
 
 #. clear search when deleting
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:335
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:356
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:282
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:307
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:258
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:304
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:325
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:278
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:303
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:274
 msgid "Delete Entry"
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:335
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:282
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:334
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:304
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:278
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:351
 msgid "Delete Selected"
 msgstr "Zvoleno smazání"
 
 #. parameter is a host name
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:349
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:299
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:318
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:295
 #, java-format
 msgid "Destination {0} deleted."
 msgstr "Cíl {0} byl smazán."
 
 #. parameter will always be >= 2
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:352
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:302
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:321
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:298
 #, java-format
 msgid "1 destination deleted."
 msgid_plural "{0} destinations deleted."
@@ -200,35 +200,35 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:354
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:304
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:323
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:300
 msgid "No entries selected to delete."
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:362
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:311
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:331
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:307
 msgid "Address book saved."
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:365
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:334
 msgid "ERROR: Could not write addressbook file."
 msgstr ""
 "Chyba: nepodařilo se zapsat do souboru knihy kontaktů. Zkontrolujte "
 "přístupová práva k souboru a místo na disku."
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:370
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:339
 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:148
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:315
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:156
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:311
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:128
 msgid ""
 "Invalid form submission, probably because you used the \"back\" or \"reload"
 "\" button on your browser. Please resubmit."
 msgstr ""
 
 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:139
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:131
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:132
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:103
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:153
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:145
 msgid "Save"
 msgstr "Uložit"
 
@@ -237,9 +237,9 @@ msgid "Configuration saved."
 msgstr "Nastavení uloženo."
 
 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:142
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:150
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:122
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:151
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:143
 msgid "Reload"
 msgstr ""
 
@@ -247,35 +247,35 @@ msgstr ""
 msgid "Configuration reloaded."
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:105
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:101
 #, java-format
 msgid "{0} address book in {1} database"
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:252
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:248
 msgid "Manually added via SusiDNS"
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:266
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:262
 #, java-format
 msgid "Failed to add Destination for {0} to naming service {1}"
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:290
+#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:286
 #, java-format
 msgid "Failed to delete Destination for {0} from naming service {1}"
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:115
 msgid ""
 "Subscriptions saved, updating addressbook from subscription sources now."
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:148
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:120
 msgid "Subscriptions saved."
 msgstr ""
 
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:152
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:124
 msgid "Subscriptions reloaded."
 msgstr ""
 
@@ -283,415 +283,423 @@ msgstr ""
 msgid "address book"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:127
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:143
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:104
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:120
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:105
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:121
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:107
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:104
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:120
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:131
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:147
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:125
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:141
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:116
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:132
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:130
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:117
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:133
 msgid "Overview"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:129
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:106
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:107
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:93
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:106
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:133
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:127
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:118
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:116
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:119
 msgid "Address books"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:131
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:108
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:109
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:95
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:108
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:135
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:129
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:120
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:118
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:121
 msgid "private"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:133
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:110
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:111
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:97
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:110
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:137
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:131
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:122
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:120
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:123
 msgid "master"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:135
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:112
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:113
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:99
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:112
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:139
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:133
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:124
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:122
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:125
 msgid "router"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:137
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:114
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:115
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:101
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:114
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:141
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:135
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:126
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:124
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:127
 msgid "published"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:139
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:116
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:117
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:103
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:116
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:143
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:137
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:128
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:126
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:129
 msgid "Subscriptions"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:141
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:118
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:119
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:105
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:118
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:145
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:139
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:130
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:128
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:131
 msgid "Configuration"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:145
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:123
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:149
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:134
 msgid "Address book"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:150
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:128
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:154
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:139
 msgid "Storage"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:169
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:172
 msgid "Filter"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:172
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:175
 msgid "other"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:174
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:177
 msgid "all"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:185
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:191
 msgid "Current filter"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:190
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:196
 msgid "clear filter"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:201
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:205
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:209
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:213
 msgid "Search"
 msgstr "Hledat"
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:238
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:246
 msgid "Name"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:240
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:248
 msgid "Links"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:242
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:384
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:250
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:250
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:404
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:266
 msgid "Destination"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:273
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:286
 msgid "Mark for deletion"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:292
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:307
 msgid "Base 32 address"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:296
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:311
 msgid "More information on this entry"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:299
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314
 msgid "details"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:332
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:388
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:349
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:408
 msgid "Cancel"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:365
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:383
 msgid "This address book is empty."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:378
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:398
 msgid "Add new destination"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:380
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:155
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:400
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:165
 msgid "Host Name"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:102
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:119
 msgid "configuration"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:155
 msgid "Hints"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:157
 msgid ""
 "File and directory paths here are relative to the addressbook's working "
 "directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P"
 "\\addressbook\\ (Windows)."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:138
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:159
 msgid ""
 "If you want to manually add lines to an addressbook, add them to the private "
 "or master addressbooks."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160
 msgid ""
 "The router addressbook and the published addressbook are updated by the "
 "addressbook application."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:142
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:162
 msgid ""
 "When you publish your addressbook, ALL destinations from the master and "
 "router addressbooks appear there."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:163
 msgid ""
 "Use the private addressbook for private destinations, these are not "
 "published."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:165
 msgid "Options"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:167
 msgid "File containing the list of subscriptions URLs (no need to change)"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:169
 msgid "Update interval in hours"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:171
 msgid ""
 "Your public hosts.txt file (choose a path within your webserver document "
 "root)"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:154
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:173
 msgid "Your hosts.txt (don't change)"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:156
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:175
 msgid "Your personal addressbook, these hosts will be published"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:158
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:177
 msgid "Your private addressbook, it is never published"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:179
 msgid "Port for your eepProxy (no need to change)"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:162
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:181
 msgid "Hostname for your eepProxy (no need to change)"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:183
 msgid "Whether to update the published addressbook"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:185
 msgid ""
 "File containing the etags header from the fetched subscription URLs (no need "
 "to change)"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:168
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:187
 msgid ""
 "File containing the modification timestamp for each fetched subscription URL "
 "(no need to change)"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:170
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:189
 msgid "File to log activity to (change to /dev/null if you like)"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:103
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:191
+msgid "Name of the theme to use (defaults to 'light')"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:110
 msgid "addressbook"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:171
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:181
 msgid "Encoded Name"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:187
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:197
 msgid "Base 32 Address"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:197
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:207
+msgid "Base 64 Hash"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:213
 msgid "Address Helper"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:204
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:220
 msgid "link"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:208
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:224
 msgid "Public Key"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:210
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:226
 msgid "ElGamal 2048 bit"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:214
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:230
 msgid "Signing Key"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:216
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:232
 msgid "DSA 1024 bit"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:220
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:236
 msgid "Certificate"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:226
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:242
 msgid "Added Date"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:232
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:248
 msgid "Source"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:238
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:254
 msgid "Last Modified"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:244
+#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:260
 msgid "Notes"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:91
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:110
 msgid "Introduction"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:109
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:132
 msgid "What is the addressbook?"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:111
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:134
 msgid "The addressbook application is part of your I2P installation."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:135
 msgid ""
 "It regularly updates your hosts.txt file from distributed sources or "
 "\"subscriptions\"."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:137
 msgid ""
 "In the default configuration, the address book is only subscribed to www."
 "i2p2.i2p."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:117
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:138
 msgid ""
 "Subscribing to additional sites is easy, just add them to your <a href="
 "\"subscriptions\">subscriptions</a> file."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:140
 msgid ""
 "For more information on naming in I2P, see <a href=\"http://www.i2p2.i2p/"
 "naming.html\">the overview on www.i2p2.i2p</a>."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:142
 msgid "How does the addressbook application work?"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:144
 msgid ""
 "The addressbook application regularly polls your subscriptions and merges "
 "their content into your \"router\" address book."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:145
 msgid ""
 "Then it merges your \"master\" address book into the router address book as "
 "well."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:146
 msgid ""
 "If configured, the router address book is now written to the \"published\" "
 "address book, which will be publicly available if you are running an eepsite."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:148
 msgid ""
 "The router also uses a private address book (not shown in the picture), "
 "which is not merged or published."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:149
 msgid ""
 "Hosts in the private address book can be accessed by you but their addresses "
 "are never distributed to others."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:133
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:150
 msgid ""
 "The private address book can also be used for aliases of hosts in your other "
 "address books."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:102
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:111
 msgid "subscriptions"
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:147
 msgid "The subscription file contains a list of i2p URLs."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:148
 msgid ""
 "The addressbook application regularly checks this list for new eepsites."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:149
 msgid "Those URLs refer to published hosts.txt files."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:150
 msgid ""
 "The default subscription is the hosts.txt from www.i2p2.i2p, which is "
 "updated infrequently."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:151
 msgid ""
 "So it is a good idea to add additional subscriptions to sites that have the "
 "latest addresses."
 msgstr ""
 
-#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:144
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:153
 msgid "See the FAQ for a list of subscription URLs."
 msgstr ""
diff --git a/apps/susidns/src/jsp/addressbook.jsp b/apps/susidns/src/jsp/addressbook.jsp
index 61487f8116e4af65f5e08ff6e72f28ef82f881ed..38cc7bf8608ad6c24621120548d8acf8b9cf9696 100644
--- a/apps/susidns/src/jsp/addressbook.jsp
+++ b/apps/susidns/src/jsp/addressbook.jsp
@@ -202,8 +202,8 @@ ${book.loadBookMessages}
 </p>
 </div></form>
 
-<hr>
 <div id="footer">
+<hr>
 <p class="footer">susidns v${version.version} &copy; <a href="${version.url}">susi</a> 2005</p>
 </div>
 </div>
diff --git a/apps/susidns/src/jsp/config.jsp b/apps/susidns/src/jsp/config.jsp
index 95e904c3a3f9b5530d3b30cc7c88490c7afcd6d1..d0978416e587a79de12138b0167c65ab9d55e3b1 100644
--- a/apps/susidns/src/jsp/config.jsp
+++ b/apps/susidns/src/jsp/config.jsp
@@ -134,8 +134,9 @@
 <%=intl._("Name of the theme to use (defaults to 'light')")%>
 </li>
 </ul>
-</div><hr>
+</div>
 <div id="footer">
+<hr>
 <p class="footer">susidns v${version.version} &copy; <a href="${version.url}">susi</a> 2005 </p>
 </div>
 </div>
diff --git a/apps/susidns/src/jsp/details.jsp b/apps/susidns/src/jsp/details.jsp
index 42aa32f86baf056b3367779ea11b75fc0b43a803..59978810e0fec5e5f89f44efd261d5b8842a8b16 100644
--- a/apps/susidns/src/jsp/details.jsp
+++ b/apps/susidns/src/jsp/details.jsp
@@ -143,8 +143,8 @@
         }
     }
 %>
-<hr>
 <div id="footer">
+<hr>
 <p class="footer">susidns v${version.version} &copy; <a href="${version.url}">susi</a> 2005</p>
 </div>
 </div>
diff --git a/apps/susidns/src/jsp/index.jsp b/apps/susidns/src/jsp/index.jsp
index d90a4d76399e3d7590e9f6bd51805675a9cd899a..20bf15104552779f4b81e413058128f671768be8 100644
--- a/apps/susidns/src/jsp/index.jsp
+++ b/apps/susidns/src/jsp/index.jsp
@@ -88,8 +88,8 @@
 </p>
 <center><img src="/themes/susidns/images/how.png" border="0" alt="address book working scheme" title="How the address book works" class="illustrate" /></center>
 </div>
-<hr>
 <div id="footer">
+<hr>
 <p class="footer">susidns v${version.version} &copy; <a href="${version.url}">susi</a> 2005</p>
 </div>
 </div>
diff --git a/apps/susidns/src/jsp/subscriptions.jsp b/apps/susidns/src/jsp/subscriptions.jsp
index e16a6747361ab3567db2478c5b135499493900a0..b0f66ac7b85df71ab5452dbb7cff0a169844132d 100644
--- a/apps/susidns/src/jsp/subscriptions.jsp
+++ b/apps/susidns/src/jsp/subscriptions.jsp
@@ -85,8 +85,9 @@
 <%=intl._("So it is a good idea to add additional subscriptions to sites that have the latest addresses.")%>
 <a href="http://www.i2p2.i2p/faq.html#subscriptions"><%=intl._("See the FAQ for a list of subscription URLs.")%></a>
 </p>
-</div><hr>
+</div>
 <div id="footer">
+<hr>
 <p class="footer">susidns v${version.version} &copy; <a href="${version.url}">susi</a> 2005</p>
 </div>
 </div>
diff --git a/apps/susimail/locale/messages_cs.po b/apps/susimail/locale/messages_cs.po
index c6d7e441a146f86f1c960bbd5f7a2d7ef355ee68..dfcfd60f8d25af60fd2737f04022aeb4b744ce95 100644
--- a/apps/susimail/locale/messages_cs.po
+++ b/apps/susimail/locale/messages_cs.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-02-17 11:41+0000\n"
+"POT-Creation-Date: 2012-09-12 11:58+0000\n"
 "PO-Revision-Date: 2012-02-12 20:53+0000\n"
 "Last-Translator: Waseihou Watashi <waseihou@gmail.com>\n"
 "Language-Team: Czech (http://www.transifex.net/projects/p/I2P/language/cs/)\n"
@@ -19,150 +19,150 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
 
-#: src/src/i2p/susi/webmail/WebMail.java:455
+#: src/src/i2p/susi/webmail/WebMail.java:445
 msgid "unknown"
 msgstr "neznámý"
 
-#: src/src/i2p/susi/webmail/WebMail.java:474
+#: src/src/i2p/susi/webmail/WebMail.java:464
 msgid "Warning: no transfer encoding found, fallback to 7bit."
 msgstr "Upozornění: nebylo nalezeno žádné kódování přenosu, použiji 7 bitové"
 
-#: src/src/i2p/susi/webmail/WebMail.java:479
+#: src/src/i2p/susi/webmail/WebMail.java:469
 #, java-format
 msgid "No encoder found for encoding \\''{0}\\''."
 msgstr "Nebyl nalezen žádný enkodér pro kódování \\''{0}\\''."
 
-#: src/src/i2p/susi/webmail/WebMail.java:485
+#: src/src/i2p/susi/webmail/WebMail.java:475
 msgid "Warning: no charset found, fallback to US-ASCII."
 msgstr "Upozornění: nebyla nalezena žádná znaková sada, použiji US-ASCII"
 
-#: src/src/i2p/susi/webmail/WebMail.java:499
+#: src/src/i2p/susi/webmail/WebMail.java:489
 #, java-format
 msgid "Charset \\''{0}\\'' not supported."
 msgstr "Znaková sada \\''{0}\\'' není podporována."
 
-#: src/src/i2p/susi/webmail/WebMail.java:503
+#: src/src/i2p/susi/webmail/WebMail.java:493
 #, java-format
 msgid "Part ({0}) not shown, because of {1}"
 msgstr "Část ({0}) nemohla být zobrazena, protože {1}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:526
+#: src/src/i2p/susi/webmail/WebMail.java:516
 msgid "Download"
 msgstr "Stáhnout"
 
-#: src/src/i2p/susi/webmail/WebMail.java:526
+#: src/src/i2p/susi/webmail/WebMail.java:516
 msgid "File is packed into a zipfile for security reasons."
 msgstr "Soubor je z bezpečnostních důvodů zazipován."
 
-#: src/src/i2p/susi/webmail/WebMail.java:526
+#: src/src/i2p/susi/webmail/WebMail.java:516
 #, java-format
 msgid "attachment ({0})."
 msgstr "příloha ({0})."
 
-#: src/src/i2p/susi/webmail/WebMail.java:530
+#: src/src/i2p/susi/webmail/WebMail.java:520
 #, java-format
 msgid "Attachment ({0})."
 msgstr "Příloha ({0})."
 
-#: src/src/i2p/susi/webmail/WebMail.java:580
+#: src/src/i2p/susi/webmail/WebMail.java:570
 msgid "Need username for authentication."
 msgstr "K autentizaci je nutno zadat uživatelské jméno (username)."
 
-#: src/src/i2p/susi/webmail/WebMail.java:584
+#: src/src/i2p/susi/webmail/WebMail.java:574
 msgid "Need password for authentication."
 msgstr "K autentizaci je nutno zadat uživatelské jméno (password)."
 
-#: src/src/i2p/susi/webmail/WebMail.java:588
+#: src/src/i2p/susi/webmail/WebMail.java:578
 msgid "Need hostname for connect."
 msgstr "Pro připojení je nutno zadat jméno hosta (hostname)."
 
-#: src/src/i2p/susi/webmail/WebMail.java:593
+#: src/src/i2p/susi/webmail/WebMail.java:583
 msgid "Need port number for pop3 connect."
 msgstr "Zadejte číslo portu pro POP3."
 
-#: src/src/i2p/susi/webmail/WebMail.java:600
+#: src/src/i2p/susi/webmail/WebMail.java:590
 msgid "POP3 port number is not in range 0..65535."
 msgstr "Číslo portu pro POP3 musí být v rozmezí 0 až 65535."
 
-#: src/src/i2p/susi/webmail/WebMail.java:606
+#: src/src/i2p/susi/webmail/WebMail.java:596
 msgid "POP3 port number is invalid."
 msgstr "Číslo POP3 portu je neplatné."
 
-#: src/src/i2p/susi/webmail/WebMail.java:612
+#: src/src/i2p/susi/webmail/WebMail.java:602
 msgid "Need port number for smtp connect."
 msgstr "Zadejte číslo portup pro smtm."
 
-#: src/src/i2p/susi/webmail/WebMail.java:619
+#: src/src/i2p/susi/webmail/WebMail.java:609
 msgid "SMTP port number is not in range 0..65535."
 msgstr "Číslo portu pro SMTP musí být v rozmezí 0 až 65535."
 
-#: src/src/i2p/susi/webmail/WebMail.java:625
+#: src/src/i2p/susi/webmail/WebMail.java:615
 msgid "SMTP port number is invalid."
 msgstr "Číslo SMTP portu je neplatné."
 
-#: src/src/i2p/susi/webmail/WebMail.java:672
+#: src/src/i2p/susi/webmail/WebMail.java:662
 msgid "User logged out."
 msgstr "Uživatel se odhlásil."
 
-#: src/src/i2p/susi/webmail/WebMail.java:676
+#: src/src/i2p/susi/webmail/WebMail.java:666
 msgid "Internal error, lost connection."
 msgstr "Nastala vnitřní chyba, spojení bylo ztraceno."
 
-#: src/src/i2p/susi/webmail/WebMail.java:772
+#: src/src/i2p/susi/webmail/WebMail.java:762
 #, java-format
 msgid "On {0} {1} wrote:"
 msgstr "K {0} {1} napsal:"
 
-#: src/src/i2p/susi/webmail/WebMail.java:819
+#: src/src/i2p/susi/webmail/WebMail.java:809
 msgid "begin forwarded mail"
 msgstr "začátek přeposlaného mailu"
 
-#: src/src/i2p/susi/webmail/WebMail.java:841
+#: src/src/i2p/susi/webmail/WebMail.java:831
 msgid "end forwarded mail"
 msgstr "konec přeposlaného mailu"
 
-#: src/src/i2p/susi/webmail/WebMail.java:848
-#: src/src/i2p/susi/webmail/WebMail.java:1720
+#: src/src/i2p/susi/webmail/WebMail.java:838
+#: src/src/i2p/susi/webmail/WebMail.java:1731
 msgid "Could not fetch mail body."
 msgstr "Nepodařilo se načíst obsah mailu."
 
-#: src/src/i2p/susi/webmail/WebMail.java:876
+#: src/src/i2p/susi/webmail/WebMail.java:866
 msgid "Message id not valid."
 msgstr "Identifikátor zprávy není platný."
 
-#: src/src/i2p/susi/webmail/WebMail.java:959
+#: src/src/i2p/susi/webmail/WebMail.java:949
 #, java-format
 msgid "No Encoding found for {0}"
 msgstr "Nebylo nalezeno kódování pro {0}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:963
+#: src/src/i2p/susi/webmail/WebMail.java:953
 #, java-format
 msgid "Could not encode data: {0}"
 msgstr "Nezdařilo se překódovat data: {0}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:968
+#: src/src/i2p/susi/webmail/WebMail.java:958
 #, java-format
 msgid "Error reading uploaded file: {0}"
 msgstr "Chyba při čtení nahraného souboru: {0}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1046
+#: src/src/i2p/susi/webmail/WebMail.java:1036
 msgid "Error parsing download parameter."
 msgstr "Chyba při zpracování parametru stahování."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1090
+#: src/src/i2p/susi/webmail/WebMail.java:1080
 msgid "Invalid pagesize number, resetting to default value."
 msgstr "Neplatné hodnota velikosti stránky, použiji výchozí hodnotu."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1114
+#: src/src/i2p/susi/webmail/WebMail.java:1104
 msgid "No messages marked for deletion."
 msgstr "Žádné zprávy nebyly označeny k smazání."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1134
+#: src/src/i2p/susi/webmail/WebMail.java:1124
 #, java-format
 msgid "Error deleting message: {0}"
 msgstr "Chyba při mazání zprávy: {0}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1145
+#: src/src/i2p/susi/webmail/WebMail.java:1135
 #, java-format
 msgid "1 message deleted."
 msgid_plural "{0} messages deleted."
@@ -170,12 +170,12 @@ msgstr[0] "Počet smazaných zpráv: 1"
 msgstr[1] "Počet smazaných zpráv: {0}"
 msgstr[2] "Počet smazaných zpráv: {0}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1267
-#: src/src/i2p/susi/webmail/WebMail.java:1604
+#: src/src/i2p/susi/webmail/WebMail.java:1278
+#: src/src/i2p/susi/webmail/WebMail.java:1615
 msgid "Login"
 msgstr "Login"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1269
+#: src/src/i2p/susi/webmail/WebMail.java:1280
 #, java-format
 msgid "1 Message"
 msgid_plural "{0} Messages"
@@ -183,197 +183,197 @@ msgstr[0] "zpráv: 1"
 msgstr[1] "zpráv: {0}"
 msgstr[2] "zpráv: {0}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1271
+#: src/src/i2p/susi/webmail/WebMail.java:1282
 msgid "Show Message"
 msgstr "Ukázat zprávu"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1333
+#: src/src/i2p/susi/webmail/WebMail.java:1344
 #, java-format
 msgid "Error decoding content: {0}"
 msgstr "Chyba při dekódování obsahu: {0}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1338
+#: src/src/i2p/susi/webmail/WebMail.java:1349
 msgid "Error decoding content: No encoder found."
 msgstr "Chyba při dekódování obsahu: nebyl nalezen žádný enkodér."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1385
+#: src/src/i2p/susi/webmail/WebMail.java:1396
 msgid "no subject"
 msgstr "žádný předmět"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1402
+#: src/src/i2p/susi/webmail/WebMail.java:1413
 msgid "Found no valid sender address."
 msgstr "Nebyla nalezena platná adresa odesílatele."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1408
+#: src/src/i2p/susi/webmail/WebMail.java:1419
 #, java-format
 msgid "Found no valid address in \\''{0}\\''."
 msgstr "V \\''{0}\\'' nebyla nalezena platná adresa odesílatele."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1427
+#: src/src/i2p/susi/webmail/WebMail.java:1438
 msgid "No recipients found."
 msgstr "Nebyli nalezeni žádní příjemci."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1434
+#: src/src/i2p/susi/webmail/WebMail.java:1445
 msgid "Quoted printable encoder not available."
 msgstr "Enkodér pro tisk není dostupný."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1439
+#: src/src/i2p/susi/webmail/WebMail.java:1450
 msgid "Header line encoder not available."
 msgstr "Není dostupný enkodér "
 
-#: src/src/i2p/susi/webmail/WebMail.java:1490
+#: src/src/i2p/susi/webmail/WebMail.java:1501
 msgid "Mail sent."
 msgstr "Zpráva odeslána."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1529
+#: src/src/i2p/susi/webmail/WebMail.java:1540
 msgid "Send"
 msgstr "Odeslat"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1530
+#: src/src/i2p/susi/webmail/WebMail.java:1541
 msgid "Cancel"
 msgstr "Zrušit"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1531
+#: src/src/i2p/susi/webmail/WebMail.java:1542
 msgid "Delete Attachment"
 msgstr "Smazat přílohu"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1532
-#: src/src/i2p/susi/webmail/WebMail.java:1626
-#: src/src/i2p/susi/webmail/WebMail.java:1707
+#: src/src/i2p/susi/webmail/WebMail.java:1543
+#: src/src/i2p/susi/webmail/WebMail.java:1637
+#: src/src/i2p/susi/webmail/WebMail.java:1718
 msgid "Reload Config"
 msgstr "Opětovně načíst nastavení"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1533
-#: src/src/i2p/susi/webmail/WebMail.java:1627
-#: src/src/i2p/susi/webmail/WebMail.java:1708
+#: src/src/i2p/susi/webmail/WebMail.java:1544
+#: src/src/i2p/susi/webmail/WebMail.java:1638
+#: src/src/i2p/susi/webmail/WebMail.java:1719
 msgid "Logout"
 msgstr "Odhlásit"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1556
-#: src/src/i2p/susi/webmail/WebMail.java:1712
+#: src/src/i2p/susi/webmail/WebMail.java:1567
+#: src/src/i2p/susi/webmail/WebMail.java:1723
 msgid "From:"
 msgstr "Od:"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1557
+#: src/src/i2p/susi/webmail/WebMail.java:1568
 msgid "To:"
 msgstr "Komu:"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1558
+#: src/src/i2p/susi/webmail/WebMail.java:1569
 msgid "Cc:"
 msgstr "Cc:"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1559
+#: src/src/i2p/susi/webmail/WebMail.java:1570
 msgid "Bcc:"
 msgstr "Bcc:"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1560
-#: src/src/i2p/susi/webmail/WebMail.java:1714
+#: src/src/i2p/susi/webmail/WebMail.java:1571
+#: src/src/i2p/susi/webmail/WebMail.java:1725
 msgid "Subject:"
 msgstr "Předmět:"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1561
+#: src/src/i2p/susi/webmail/WebMail.java:1572
 msgid "Bcc to self"
 msgstr "Bcc sobě"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1564
+#: src/src/i2p/susi/webmail/WebMail.java:1575
 msgid "New Attachment:"
 msgstr "Nová příloha"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1564
+#: src/src/i2p/susi/webmail/WebMail.java:1575
 msgid "Upload File"
 msgstr "Nahrát soubor"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1570
+#: src/src/i2p/susi/webmail/WebMail.java:1581
 msgid "Attachments:"
 msgstr "Přílohy"
 
 #. current postman hq length limits 16/12, new postman version 32/32
-#: src/src/i2p/susi/webmail/WebMail.java:1593
+#: src/src/i2p/susi/webmail/WebMail.java:1604
 msgid "User"
 msgstr "Uživatel"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1594
+#: src/src/i2p/susi/webmail/WebMail.java:1605
 msgid "Password"
 msgstr "Heslo"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1599
+#: src/src/i2p/susi/webmail/WebMail.java:1610
 msgid "Host"
 msgstr "Host"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1600
+#: src/src/i2p/susi/webmail/WebMail.java:1611
 msgid "POP3-Port"
 msgstr "POP3-Port"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1601
+#: src/src/i2p/susi/webmail/WebMail.java:1612
 msgid "SMTP-Port"
 msgstr "SMTP-Port"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1604
+#: src/src/i2p/susi/webmail/WebMail.java:1615
 msgid "Reset"
 msgstr "Restartovat"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1605
+#: src/src/i2p/susi/webmail/WebMail.java:1616
 msgid "Learn about I2P mail"
 msgstr "Více o I2P mailu"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1606
+#: src/src/i2p/susi/webmail/WebMail.java:1617
 msgid "Create Account"
 msgstr "Vytvořit účet"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1618
+#: src/src/i2p/susi/webmail/WebMail.java:1629
 msgid "Really delete the marked messages?"
 msgstr "Opravdu vymazat označené zprávy?"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1618
+#: src/src/i2p/susi/webmail/WebMail.java:1629
 msgid "Yes, really delete them!"
 msgstr "Ano, chci je opravdu vymazat!"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1620
-#: src/src/i2p/susi/webmail/WebMail.java:1699
+#: src/src/i2p/susi/webmail/WebMail.java:1631
+#: src/src/i2p/susi/webmail/WebMail.java:1710
 msgid "New"
 msgstr "Nová"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1621
-#: src/src/i2p/susi/webmail/WebMail.java:1700
+#: src/src/i2p/susi/webmail/WebMail.java:1632
+#: src/src/i2p/susi/webmail/WebMail.java:1711
 msgid "Reply"
 msgstr "Odpovědět"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1622
-#: src/src/i2p/susi/webmail/WebMail.java:1701
+#: src/src/i2p/susi/webmail/WebMail.java:1633
+#: src/src/i2p/susi/webmail/WebMail.java:1712
 msgid "Reply All"
 msgstr "Odpovědět všem"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1623
-#: src/src/i2p/susi/webmail/WebMail.java:1702
+#: src/src/i2p/susi/webmail/WebMail.java:1634
+#: src/src/i2p/susi/webmail/WebMail.java:1713
 msgid "Forward"
 msgstr "Přeposlat"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1624
-#: src/src/i2p/susi/webmail/WebMail.java:1703
+#: src/src/i2p/susi/webmail/WebMail.java:1635
+#: src/src/i2p/susi/webmail/WebMail.java:1714
 msgid "Delete"
 msgstr "Smazat"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1625
+#: src/src/i2p/susi/webmail/WebMail.java:1636
 msgid "Check Mail"
 msgstr "Zkontrolovat mail"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1629
+#: src/src/i2p/susi/webmail/WebMail.java:1640
 msgid "Sender"
 msgstr "Odesílatel"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1630
+#: src/src/i2p/susi/webmail/WebMail.java:1641
 msgid "Subject"
 msgstr "Předmět"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1631
+#: src/src/i2p/susi/webmail/WebMail.java:1642
 msgid "Date"
 msgstr "Datum"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1632
+#: src/src/i2p/susi/webmail/WebMail.java:1643
 msgid "Size"
 msgstr "Velikost"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1658
+#: src/src/i2p/susi/webmail/WebMail.java:1669
 #, java-format
 msgid "1 Byte"
 msgid_plural "{0} Bytes"
@@ -381,69 +381,69 @@ msgstr[0] "bajtů: 1"
 msgstr[1] "bajtů: {0}"
 msgstr[2] "bajtů: {0}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1663
+#: src/src/i2p/susi/webmail/WebMail.java:1674
 msgid "Mark All"
 msgstr "Označit vše"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1664
+#: src/src/i2p/susi/webmail/WebMail.java:1675
 msgid "Invert Selection"
 msgstr "Invertovat výběr"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1665
+#: src/src/i2p/susi/webmail/WebMail.java:1676
 msgid "Clear"
 msgstr "Smazat"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1668
-#: src/src/i2p/susi/webmail/WebMail.java:1669
+#: src/src/i2p/susi/webmail/WebMail.java:1679
+#: src/src/i2p/susi/webmail/WebMail.java:1680
 msgid "First"
 msgstr "První"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1668
-#: src/src/i2p/susi/webmail/WebMail.java:1669
-#: src/src/i2p/susi/webmail/WebMail.java:1704
+#: src/src/i2p/susi/webmail/WebMail.java:1679
+#: src/src/i2p/susi/webmail/WebMail.java:1680
+#: src/src/i2p/susi/webmail/WebMail.java:1715
 msgid "Previous"
 msgstr "Předchozí"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1670
+#: src/src/i2p/susi/webmail/WebMail.java:1681
 #, java-format
 msgid "Page {0} of {1}"
 msgstr "Stránka {0}/{1}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1672
-#: src/src/i2p/susi/webmail/WebMail.java:1673
+#: src/src/i2p/susi/webmail/WebMail.java:1683
+#: src/src/i2p/susi/webmail/WebMail.java:1684
 msgid "Last"
 msgstr "Poslední"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1672
-#: src/src/i2p/susi/webmail/WebMail.java:1673
-#: src/src/i2p/susi/webmail/WebMail.java:1705
+#: src/src/i2p/susi/webmail/WebMail.java:1683
+#: src/src/i2p/susi/webmail/WebMail.java:1684
+#: src/src/i2p/susi/webmail/WebMail.java:1716
 msgid "Next"
 msgstr "Další"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1676
+#: src/src/i2p/susi/webmail/WebMail.java:1687
 msgid "Pagesize:"
 msgstr "Velikost stránky:"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1677
+#: src/src/i2p/susi/webmail/WebMail.java:1688
 msgid "Set"
 msgstr "Nastavit"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1687
+#: src/src/i2p/susi/webmail/WebMail.java:1698
 msgid "Really delete this message?"
 msgstr "Opravdu chcete smazat tuto zprávu?"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1687
+#: src/src/i2p/susi/webmail/WebMail.java:1698
 msgid "Yes, really delete it!"
 msgstr "Ano, opravdu ji chci smazat!"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1706
+#: src/src/i2p/susi/webmail/WebMail.java:1717
 msgid "Back to Folder"
 msgstr "Zpět do složky"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1713
+#: src/src/i2p/susi/webmail/WebMail.java:1724
 msgid "Date:"
 msgstr "Datum:"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1724
+#: src/src/i2p/susi/webmail/WebMail.java:1735
 msgid "Could not fetch mail."
 msgstr "Nepodařilo se stáhnout mail."
diff --git a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
index 1d2b71eea367622873d92fd1ce6860ead7d83255..6760e058768241356c72068faf5c44823bd4088a 100644
--- a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
+++ b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
@@ -1316,7 +1316,7 @@ public class WebMail extends HttpServlet
 				else if( sessionObject.state == STATE_NEW )
 					showCompose( out, sessionObject, request );
 				
-				out.println( "</form><hr><p class=\"footer\">susimail v0." + version +" " + ( RELEASE ? "release" : "development" ) + " &copy; 2004-2005 <a href=\"mailto:susi23@mail.i2p\">susi</a></div></body>\n</html>");				
+				out.println( "</form><div id=\"footer\"><hr><p class=\"footer\">susimail v0." + version +" " + ( RELEASE ? "release" : "development" ) + " &copy; 2004-2005 <a href=\"mailto:susi23@mail.i2p\">susi</a></div></div></body>\n</html>");				
 				out.flush();
 			}
 		}
diff --git a/apps/systray/java/src/net/i2p/apps/systray/SysTray.java b/apps/systray/java/src/net/i2p/apps/systray/SysTray.java
index f966533f3ca5df36ec83a8e539196e030d02e5a6..a6b608d90095d5dd8808b5d7139486b36c8d95b1 100644
--- a/apps/systray/java/src/net/i2p/apps/systray/SysTray.java
+++ b/apps/systray/java/src/net/i2p/apps/systray/SysTray.java
@@ -49,7 +49,7 @@ public class SysTray implements SysTrayMenuListener {
 
         _browserString = _configFile.getProperty("browser", "default");
         _portString = _configFile.getProperty("port", "7657");
-        _showIcon = Boolean.valueOf(_configFile.getProperty("visible", "true")).booleanValue();
+        _showIcon = Boolean.parseBoolean(_configFile.getProperty("visible", "true"));
 
         //if (!(new File("router.config")).exists())
         //    openRouterConsole("http://localhost:" + _portString + "/index.jsp");
diff --git a/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java b/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java
index f93f0876a2cb2479484d33403cc6eeddfa8fa2ea..aeb159aa3baa77c892b217079087f5197c00269b 100644
--- a/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java
+++ b/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java
@@ -43,6 +43,32 @@ public class UrlLauncher {
     private static final int MAX_WAIT_TIME = 5*60*1000;
     private static final int MAX_TRIES = 99;
 
+    /**
+     *  Browsers to try IN-ORDER
+     */
+    private static final String[] BROWSERS = {
+            // This debian script tries everything in $BROWSER, then gnome-www-browser and x-www-browser
+            // if X is running and www-browser otherwise. Those point to the user's preferred
+            // browser using the update-alternatives system.
+            "sensible-browser",
+            // another one that opens a preferred browser
+            "xdg-open",
+            // Try x-www-browser directly
+            "x-www-browser",
+            // general graphical browsers
+            "defaultbrowser",  // puppy linux
+            "opera -newpage",
+            "firefox",
+            "mozilla",
+            "netscape",
+            "konqueror",
+            "galeon",
+            // Text Mode Browsers only below here
+            "www-browser",
+            "links",
+            "lynx"
+    };
+            
     /**
      *  Prevent bad user experience by waiting for the server to be there
      *  before launching the browser.
@@ -156,7 +182,7 @@ public class UrlLauncher {
                     if (bufferedReader != null)
                         try { bufferedReader.close(); } catch (IOException ioe) {}
                 }
-                if (_shellCommand.executeSilentAndWaitTimed(browserString + " " + url, 5))
+                if (_shellCommand.executeSilentAndWaitTimed(browserString + ' ' + url, 5))
                     return true;
 
             } else {
@@ -164,48 +190,10 @@ public class UrlLauncher {
                 // fall through
             }
 
-            // This debian script tries everything in $BROWSER, then gnome-www-browser and x-www-browser
-            // if X is running and www-browser otherwise. Those point to the user's preferred
-            // browser using the update-alternatives system.
-            if (_shellCommand.executeSilentAndWaitTimed("sensible-browser " + url, 5))
-                return true;
-
-            // Try x-www-browser directly
-            if (_shellCommand.executeSilentAndWaitTimed("x-www-browser " + url, 5))
-                return true;
-
-            // puppy linux
-            if (_shellCommand.executeSilentAndWaitTimed("defaultbrowser " + url, 5))
-                return true;
-
-            if (_shellCommand.executeSilentAndWaitTimed("opera -newpage " + url, 5))
-                return true;
-
-            if (_shellCommand.executeSilentAndWaitTimed("firefox " + url, 5))
-                return true;
-
-            if (_shellCommand.executeSilentAndWaitTimed("mozilla " + url, 5))
-                return true;
-
-            if (_shellCommand.executeSilentAndWaitTimed("netscape " + url, 5))
-                return true;
-
-            if (_shellCommand.executeSilentAndWaitTimed("konqueror " + url, 5))
-                return true;
-
-            if (_shellCommand.executeSilentAndWaitTimed("galeon " + url, 5))
-                return true;
-            
-            // Text Mode Browsers only below here
-            if (_shellCommand.executeSilentAndWaitTimed("www-browser " + url, 5))
-                return true;
-
-            if (_shellCommand.executeSilentAndWaitTimed("links " + url, 5))
-                return true;
-
-            if (_shellCommand.executeSilentAndWaitTimed("lynx " + url, 5))
-                return true;
-            
+            for (int i = 0; i < BROWSERS.length; i++) {
+                if (_shellCommand.executeSilentAndWaitTimed(BROWSERS[i] + ' ' + url, 5))
+                    return true;
+            }
         }
         return false;
     }
diff --git a/build.properties b/build.properties
index 68df584f3d23708fa72468c4d6b1fff8884fbecf..1850622730ce722f179f7d263e29a2e41e2d7337 100644
--- a/build.properties
+++ b/build.properties
@@ -30,7 +30,7 @@ build.built-by=unknown
 require.gettext=true
 
 # Additional classpath if required
-#javac.classpathe=/PATH/TO/pack200.jar
+#javac.classpath=/PATH/TO/pack200.jar
 
 # Optional compiler args
 # This one keeps gcj a lot quieter
diff --git a/build.xml b/build.xml
index d0555659aeeca7e1dad1267f83de1ff6039ec86c..c819e242cb4b47d2692801239951b40c246081e9 100644
--- a/build.xml
+++ b/build.xml
@@ -981,18 +981,22 @@
 
     <target name="pack200">
         <!-- pack200 will only pack to a .pack file, and only from a .jar file, so we put another .jar on the end -->
+        <!-- can't pack an empty jar or one without classes, it will fail to unpack on Java 5;
+          -  see http://bugs.sun.com/view_bug.do?bug_id=6712743
+          -->
         <!-- *nix here -->
         <exec executable="sh" osfamily="unix" failonerror="true">
             <arg value="-c" />
-            <arg value="for i in pkg-temp/lib/*.jar pkg-temp/webapps/*war; do echo pack200 $i; mv $i $i.jar; pack200 -g $i.pack $i.jar; rm -f $i.jar; done" />
+            <arg value="for i in pkg-temp/lib/*.jar pkg-temp/webapps/*war; do if [ $i = pkg-temp/lib/jasper-compiler.jar -o $i = pkg-temp/lib/jbigi.jar ]; then continue; fi; echo pack200 $i; mv $i $i.jar; pack200 -g $i.pack $i.jar; rm -f $i.jar; done" />
         </exec>
         <exec executable="sh" osfamily="mac" failonerror="true">
             <arg value="-c" />
-            <arg value="for i in pkg-temp/lib/*.jar pkg-temp/webapps/*war; do echo pack200 $i; mv $i $i.jar; pack200 -g $i.pack $i.jar; rm -f $i.jar; done" />
+            <arg value="for i in pkg-temp/lib/*.jar pkg-temp/webapps/*war; do if [ $i = pkg-temp/lib/jasper-compiler.jar -o $i = pkg-temp/lib/jbigi.jar ]; then continue; fi; echo pack200 $i; mv $i $i.jar; pack200 -g $i.pack $i.jar; rm -f $i.jar; done" />
         </exec>
         <!-- windoz here : i admit, i hate escaped symbols in xml, indeed = =! -->
         <exec executable="cmd" osfamily="windows" failonerror="true">
             <arg value="/c" />
+            <!-- TODO implement fix above -->
             <arg value="for %i in (pkg-temp\webapps\*.war) do move %i %i.jar &amp;&amp; pack200 -g pkg-temp\webapps\%~ni.war.pack %i.jar &amp;&amp; del %i.jar" />
         </exec>
         <exec executable="cmd" osfamily="windows" failonerror="true">
diff --git a/core/java/src/freenet/support/CPUInformation/CPUID.java b/core/java/src/freenet/support/CPUInformation/CPUID.java
index 2c59dcfd1fa4f52df49128cbfbe42af3328e27f4..b295c3ac134cb1e69df0b8d953ca8c800b90f371 100644
--- a/core/java/src/freenet/support/CPUInformation/CPUID.java
+++ b/core/java/src/freenet/support/CPUInformation/CPUID.java
@@ -260,7 +260,7 @@ public class CPUID {
     private static final void loadNative() {
         try{
         String wantedProp = System.getProperty("jcpuid.enable", "true");
-        boolean wantNative = Boolean.valueOf(wantedProp).booleanValue();
+        boolean wantNative = Boolean.parseBoolean(wantedProp);
         if (wantNative) {
             boolean loaded = loadGeneric();
             if (loaded) {
diff --git a/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java b/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java
index 46e994695da8676803e6436d713e6dac58218276..1a2ec48921aa18b2719705609b12896681512ae3 100644
--- a/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java
+++ b/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java
@@ -5,6 +5,7 @@ import java.util.Map;
 import java.util.concurrent.LinkedBlockingQueue;
 
 import net.i2p.I2PAppContext;
+import net.i2p.util.I2PThread;
 import net.i2p.util.Log;
 
 /**
@@ -53,7 +54,7 @@ public class AsyncFortunaStandalone extends FortunaStandalone implements Runnabl
         for (int i = 0; i < _bufferCount; i++)
             _emptyBuffers.offer(new AsyncBuffer(_bufferSize));
         _isRunning = true;
-        _refillThread = new Thread(this, "PRNG");
+        _refillThread = new I2PThread(this, "PRNG");
         _refillThread.setDaemon(true);
         _refillThread.setPriority(Thread.MIN_PRIORITY+1);
         _refillThread.start();
diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java
index 968bed9d39003a7311d875f11ba496e6423601bd..33be4db7098c9b442b1fc746141e09755a599447 100644
--- a/core/java/src/net/i2p/CoreVersion.java
+++ b/core/java/src/net/i2p/CoreVersion.java
@@ -16,7 +16,7 @@ package net.i2p;
 public class CoreVersion {
     /** deprecated */
     public final static String ID = "Monotone";
-    public final static String VERSION = "0.9.1";
+    public final static String VERSION = "0.9.2";
 
     public static void main(String args[]) {
         System.out.println("I2P Core version: " + VERSION);
diff --git a/core/java/src/net/i2p/I2PAppContext.java b/core/java/src/net/i2p/I2PAppContext.java
index be42467f459f7ea4e019ef575beda34f2e252cb1..bd1085f180ab1e02de137ab6867f9468432a1a7e 100644
--- a/core/java/src/net/i2p/I2PAppContext.java
+++ b/core/java/src/net/i2p/I2PAppContext.java
@@ -64,7 +64,7 @@ import net.i2p.util.I2PProperties.I2PPropertyCallback;
  * contexts should build their own context as soon as possible (within the main(..))
  * so that any referenced components will latch on to that context instead of 
  * instantiating a new one.  However, there are situations in which both can be
- * relevent.
+ * relevant.
  *
  */
 public class I2PAppContext {
@@ -113,13 +113,13 @@ public class I2PAppContext {
     private volatile boolean _simpleTimerInitialized;
     private volatile boolean _simpleTimer2Initialized;
     protected final Set<Runnable> _shutdownTasks;
-    private File _baseDir;
-    private File _configDir;
-    private File _routerDir;
-    private File _pidDir;
-    private File _logDir;
-    private File _appDir;
-    private File _tmpDir;
+    private final File _baseDir;
+    private final File _configDir;
+    private final File _routerDir;
+    private final File _pidDir;
+    private final File _logDir;
+    private final File _appDir;
+    private volatile File _tmpDir;
     // split up big lock on this to avoid deadlocks
     private final Object _lock1 = new Object(), _lock2 = new Object(), _lock3 = new Object(), _lock4 = new Object(),
                          _lock5 = new Object(), _lock6 = new Object(), _lock7 = new Object(), _lock8 = new Object(),
@@ -196,25 +196,14 @@ public class I2PAppContext {
      *               Will only apply if there is no global context now.
      */
     private I2PAppContext(boolean doInit, Properties envProps) {
-        if (doInit) {
-            synchronized (I2PAppContext.class) { 
-                if (_globalAppContext == null) {
-                    _globalAppContext = this;
-                } else {
-                    System.out.println("Warning - New context not replacing old one, you now have a second one");
-                    (new Exception("I did it")).printStackTrace();
-                }
-            }
-        }
+      synchronized (I2PAppContext.class) { 
         _overrideProps = new I2PProperties();
         if (envProps != null)
             _overrideProps.putAll(envProps);
         _shutdownTasks = new ConcurrentHashSet(32);
-        initializeDirs();
         _portMapper = new PortMapper(this);
-    }
     
-   /**
+   /*
     *  Directories. These are all set at instantiation and will not be changed by
     *  subsequent property changes.
     *  All properties, if set, should be absolute paths.
@@ -259,7 +248,7 @@ public class I2PAppContext {
     *  All dirs except the base are created if they don't exist, but the creation will fail silently.
     *  @since 0.7.6
     */
-    private void initializeDirs() {
+
         String s = getProperty("i2p.dir.base", System.getProperty("user.dir"));
         _baseDir = new File(s);
 
@@ -321,6 +310,16 @@ public class I2PAppContext {
         System.err.println("PID directory:    " + _pidDir.getAbsolutePath());
         System.err.println("Temp directory:   " + getTempDir().getAbsolutePath());
         ******/
+
+        if (doInit) {
+            if (_globalAppContext == null) {
+                _globalAppContext = this;
+            } else {
+                System.out.println("Warning - New context not replacing old one, you now have a second one");
+                (new Exception("I did it")).printStackTrace();
+            }
+        }
+      } // synch
     }
 
     /**
@@ -707,6 +706,9 @@ public class I2PAppContext {
      * There is absolutely no good reason to make this context specific, 
      * other than for consistency, and perhaps later we'll want to 
      * include some stats.
+     *
+     * DEPRECATED - non-standard and used only by SSU.
+     * To be moved from context to SSU.
      */
     public HMACGenerator hmac() { 
         if (!_hmacInitialized)
diff --git a/core/java/src/net/i2p/client/I2PSession.java b/core/java/src/net/i2p/client/I2PSession.java
index 598ddf1f90f244c9130c7d3455b2ee859c399724..661ea2fff3f935904a3f40b8d0c0209ab205c8e3 100644
--- a/core/java/src/net/i2p/client/I2PSession.java
+++ b/core/java/src/net/i2p/client/I2PSession.java
@@ -278,7 +278,7 @@ public interface I2PSession {
 
     /**
      *  A raw (unsigned) datagram
-     *  @since 0.9.1
+     *  @since 0.9.2
      */
     public static final int PROTO_DATAGRAM_RAW = 18;
 }
diff --git a/core/java/src/net/i2p/client/I2PSessionImpl.java b/core/java/src/net/i2p/client/I2PSessionImpl.java
index c3b993e4af08cf94e65414c1224043d46aee22aa..69fc300788b288bb2bf6608808630bf621234ed9 100644
--- a/core/java/src/net/i2p/client/I2PSessionImpl.java
+++ b/core/java/src/net/i2p/client/I2PSessionImpl.java
@@ -219,7 +219,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
 
         // auto-add auth if required, not set in the options, and we are not in the same JVM
         if ((!_context.isRouterContext()) &&
-            Boolean.valueOf(_context.getProperty("i2cp.auth")).booleanValue() &&
+            _context.getBooleanProperty("i2cp.auth") &&
             ((!options.containsKey("i2cp.username")) || (!options.containsKey("i2cp.password")))) {
             String configUser = _context.getProperty("i2cp.username");
             String configPW = _context.getProperty("i2cp.password");
@@ -349,7 +349,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
                 _queue = mgr.connect();
                 _reader = new QueuedI2CPMessageReader(_queue, this);
             } else {
-                if (Boolean.valueOf(_options.getProperty(PROP_ENABLE_SSL)).booleanValue())
+                if (Boolean.parseBoolean(_options.getProperty(PROP_ENABLE_SSL)))
                     _socket = I2CPSSLSocketFactory.createSocket(_context, _hostname, _portNum);
                 else
                     _socket = new Socket(_hostname, _portNum);
@@ -976,8 +976,8 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
 
     private void startIdleMonitor() {
         _isReduced = false;
-        boolean reduce = Boolean.valueOf(_options.getProperty("i2cp.reduceOnIdle")).booleanValue();
-        boolean close = Boolean.valueOf(_options.getProperty("i2cp.closeOnIdle")).booleanValue();
+        boolean reduce = Boolean.parseBoolean(_options.getProperty("i2cp.reduceOnIdle"));
+        boolean close = Boolean.parseBoolean(_options.getProperty("i2cp.closeOnIdle"));
         if (reduce || close) {
             updateActivity();
             _context.simpleScheduler().addEvent(new SessionIdleTimer(_context, this, reduce, close), SessionIdleTimer.MINIMUM_TIME);
diff --git a/core/java/src/net/i2p/client/I2PSessionImpl2.java b/core/java/src/net/i2p/client/I2PSessionImpl2.java
index 02371eea3478222a513094219990e1f2e84ff98b..a71d7f0997e08fedd4f181a06593017396c77b5d 100644
--- a/core/java/src/net/i2p/client/I2PSessionImpl2.java
+++ b/core/java/src/net/i2p/client/I2PSessionImpl2.java
@@ -111,7 +111,7 @@ class I2PSessionImpl2 extends I2PSessionImpl {
              return false;
          String p = getOptions().getProperty("i2cp.gzip");
          if (p != null)
-             return Boolean.valueOf(p).booleanValue();
+             return Boolean.parseBoolean(p);
          return SHOULD_COMPRESS;
     }
     
diff --git a/core/java/src/net/i2p/client/I2PSimpleSession.java b/core/java/src/net/i2p/client/I2PSimpleSession.java
index 2ada1c26f4c591628ca5de45b171af534b503e78..9962c325d7df13d346416297bfc6443e65e13e5d 100644
--- a/core/java/src/net/i2p/client/I2PSimpleSession.java
+++ b/core/java/src/net/i2p/client/I2PSimpleSession.java
@@ -63,7 +63,7 @@ class I2PSimpleSession extends I2PSessionImpl2 {
                 _queue = mgr.connect();
                 _reader = new QueuedI2CPMessageReader(_queue, this);
             } else {
-                if (Boolean.valueOf(getOptions().getProperty(PROP_ENABLE_SSL)).booleanValue())
+                if (Boolean.parseBoolean(getOptions().getProperty(PROP_ENABLE_SSL)))
                     _socket = I2CPSSLSocketFactory.createSocket(_context, _hostname, _portNum);
                 else
                     _socket = new Socket(_hostname, _portNum);
diff --git a/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java
index cf4dfb604c4688d21a9bcdd85b472e062f39ecf0..30d8e61870a62f8e6e6b13c53a1d321c29dee798 100644
--- a/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java
+++ b/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java
@@ -74,7 +74,7 @@ class RequestLeaseSetMessageHandler extends HandlerImpl {
 
         leaseSet.setEncryptionKey(li.getPublicKey());
         leaseSet.setSigningKey(li.getSigningPublicKey());
-        boolean encrypt = Boolean.valueOf(session.getOptions().getProperty("i2cp.encryptLeaseSet")).booleanValue();
+        boolean encrypt = Boolean.parseBoolean(session.getOptions().getProperty("i2cp.encryptLeaseSet"));
         String sk = session.getOptions().getProperty("i2cp.leaseSetKey");
         if (encrypt && sk != null) {
             SessionKey key = new SessionKey();
diff --git a/core/java/src/net/i2p/crypto/DSAEngine.java b/core/java/src/net/i2p/crypto/DSAEngine.java
index e26031fd761829c2145a0b08f29896ca3f3ed83a..62e2e6384a57322ae58b58088b988ff9bbc0e711 100644
--- a/core/java/src/net/i2p/crypto/DSAEngine.java
+++ b/core/java/src/net/i2p/crypto/DSAEngine.java
@@ -311,6 +311,7 @@ public class DSAEngine {
      *  Reads the stream until EOF. Does not close the stream.
      *
      *  @return hash SHA-1 hash, NOT a SHA-256 hash
+     *  @deprecated unused
      */
     public SHA1Hash calculateHash(InputStream in) {
         MessageDigest digest = SHA1.getInstance();
diff --git a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
index e5f9a346674bb76f103d63594f7536badbbead82..2f9e04b36bfcb217cfed8f84d0cee43adaeab04e 100644
--- a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
+++ b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
@@ -744,7 +744,7 @@ public class TransientSessionKeyManager extends SessionKeyManager {
                 total += size;
                 buf.append("<li><b>ID: ").append(ts.getID())
                    .append(" Received:</b> ").append(DataHelper.formatDuration2(now - ts.getDate())).append(" ago with ");
-                buf.append(size).append(" tags remaining</li>");
+                buf.append(size).append('/').append(ts.getOriginalSize()).append(" tags remaining</li>");
             }
             buf.append("</ul></td></tr>\n");
             out.write(buf.toString());
@@ -774,7 +774,7 @@ public class TransientSessionKeyManager extends SessionKeyManager {
                 total += size;
                 buf.append("<li><b>ID: ").append(ts.getID())
                    .append(" Sent:</b> ").append(DataHelper.formatDuration2(now - ts.getDate())).append(" ago with ");
-                buf.append(size).append(" tags remaining; acked? ").append(ts.getAcked()).append("</li>");
+                buf.append(size).append('/').append(ts.getOriginalSize()).append(" tags remaining; acked? ").append(ts.getAcked()).append("</li>");
             }
             buf.append("</ul></td></tr>\n");
             out.write(buf.toString());
@@ -1084,6 +1084,7 @@ public class TransientSessionKeyManager extends SessionKeyManager {
         private final SessionKey _key;
         private final long _date;
         private final int _id;
+        private final int _origSize;
         //private Exception _createdBy;
         /** did we get an ack for this tagset? Only for outbound tagsets */
         private boolean _acked;
@@ -1095,6 +1096,7 @@ public class TransientSessionKeyManager extends SessionKeyManager {
             _key = key;
             _date = date;
             _id = id;
+            _origSize = tags.size();
             //if (true) {
             //    long now = I2PAppContext.getGlobalContext().clock().now();
             //    _createdBy = new Exception("Created by: key=" + _key.toBase64() + " on " 
@@ -1108,6 +1110,11 @@ public class TransientSessionKeyManager extends SessionKeyManager {
             return _date;
         }
 
+        /** @since 0.9.3 for debugging */
+        public long getOriginalSize() {
+            return _origSize;
+        }
+
         //void setDate(long when) {
         //    _date = when;
         //}
diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java
index 2a6aca2bfd318c23b9aea25bfcc6ad6c98162247..04ec793fd2ba3b00516d8dc09862f7792857a3a8 100644
--- a/core/java/src/net/i2p/data/DataHelper.java
+++ b/core/java/src/net/i2p/data/DataHelper.java
@@ -77,6 +77,7 @@ public class DataHelper {
             "ihost2", "iport2", "ikey2", "itag2",
             // RouterInfo options
             "caps", "coreVersion", "netId", "router.version",
+            "netdb.knownLeaseSets", "netdb.knownRouters",
             "stat_bandwidthReceiveBps.60m",
             "stat_bandwidthSendBps.60m",
             "stat_tunnel.buildClientExpire.60m",
@@ -388,8 +389,6 @@ public class DataHelper {
      * - Leading whitespace is not trimmed
      * - '=' is the only key-termination character (not ':' or whitespace)
      *
-     * Note that the escaping of \r or \n was probably a mistake and should be taken out.
-     *
      */
     public static void loadProps(Properties props, File file) throws IOException {
         loadProps(props, file, false);
@@ -448,20 +447,40 @@ public class DataHelper {
      * Writes the props to the file, unsorted (unless props is an OrderedProperties)
      * Note that this does not escape the \r or \n that are unescaped in loadProps() above.
      * As of 0.8.1, file will be mode 600.
+     *
+     * Leading or trailing whitespace in values is not checked but
+     * will be trimmed by loadProps()
+     *
+     * @throws IllegalArgumentException if a key contains any of "#=\n" or starts with ';',
+     *                                  or a value contains '#' or '\n'
      */
     public static void storeProps(Properties props, File file) throws IOException {
         PrintWriter out = null;
+        IllegalArgumentException iae = null;
         try {
             out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(file), "UTF-8")));
             out.println("# NOTE: This I2P config file must use UTF-8 encoding");
             for (Map.Entry entry : props.entrySet()) {
                 String name = (String) entry.getKey();
                 String val = (String) entry.getValue();
+                if (name.contains("#") ||
+                    name.contains("=") ||
+                    name.contains("\n") ||
+                    name.startsWith(";") ||
+                    val.contains("#") ||
+                    val.contains("\n")) {
+                    if (iae == null)
+                        iae = new IllegalArgumentException("Invalid character (one of \"#;=\\n\") in key or value: \"" +
+                                                           name + "\" = \"" + val + '\"');
+                    continue;
+                }
                 out.println(name + "=" + val);
             }
         } finally {
             if (out != null) out.close();
         }
+        if (iae != null)
+            throw iae;
     }
     
     /**
diff --git a/core/java/src/net/i2p/data/Hash.java b/core/java/src/net/i2p/data/Hash.java
index a0f63459a3380772be333589d525afd95d933522..add8235a6aa8a9456c4b67b62e06e724898109c2 100644
--- a/core/java/src/net/i2p/data/Hash.java
+++ b/core/java/src/net/i2p/data/Hash.java
@@ -30,6 +30,7 @@ public class Hash extends SimpleDataStructure {
 
     /**
      * Pull from cache or return new
+     * @throws IllegalArgumentException if data is not the correct number of bytes
      * @since 0.8.3
      */
     public static Hash create(byte[] data) {
@@ -38,6 +39,7 @@ public class Hash extends SimpleDataStructure {
 
     /**
      * Pull from cache or return new
+     * @throws AIOOBE if not enough bytes
      * @since 0.8.3
      */
     public static Hash create(byte[] data, int off) {
diff --git a/core/java/src/net/i2p/data/RouterInfo.java b/core/java/src/net/i2p/data/RouterInfo.java
index b38d5f6a057802d456a1dd85f60e0a6d7265caad..9f980716f5be68f354be8a91c8661b824673a882 100644
--- a/core/java/src/net/i2p/data/RouterInfo.java
+++ b/core/java/src/net/i2p/data/RouterInfo.java
@@ -637,7 +637,8 @@ public class RouterInfo extends DatabaseEntry {
     }
 
     /**
-     *  Print out routerinfos from files specified on the command line
+     *  Print out routerinfos from files specified on the command line.
+     *  Exits 1 if any RI is invalid, fails signature, etc.
      *  @since 0.8
      */
     public static void main(String[] args) {
@@ -645,23 +646,29 @@ public class RouterInfo extends DatabaseEntry {
             System.err.println("Usage: RouterInfo file ...");
             System.exit(1);
         }
+        boolean fail = false;
         for (int i = 0; i < args.length; i++) {
              RouterInfo ri = new RouterInfo();
              InputStream is = null;
              try {
                  is = new java.io.FileInputStream(args[i]);
                  ri.readBytes(is);
-                 if (ri.isValid())
+                 if (ri.isValid()) {
                      System.out.println(ri.toString());
-                 else
+                  } else {
                      System.err.println("Router info " + args[i] + " is invalid");
+                     fail = true;
+                  }
              } catch (Exception e) {
                  System.err.println("Error reading " + args[i] + ": " + e);
+                 fail = true;
              } finally {
                  if (is != null) {
                      try { is.close(); } catch (IOException ioe) {}
                  }
              }
         }
+        if (fail)
+            System.exit(1);
     }
 }
diff --git a/core/java/src/net/i2p/util/Addresses.java b/core/java/src/net/i2p/util/Addresses.java
index c9c5a5e87cba4b516a236371c529694bce661a59..c824c5f7d063c6f18f54be4f4cb2dc30cad3db04 100644
--- a/core/java/src/net/i2p/util/Addresses.java
+++ b/core/java/src/net/i2p/util/Addresses.java
@@ -10,7 +10,6 @@ import java.net.NetworkInterface;
 import java.net.SocketException;
 import java.net.UnknownHostException;
 import java.util.Enumeration;
-import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
 import java.util.SortedSet;
@@ -154,6 +153,26 @@ public abstract class Addresses {
             return "(bad IP length " + addr.length + "):" + port;
         }
     }
+    
+    /**
+     *  Convenience method to convert and validate a port String
+     *  without throwing an exception.
+     *  Does not trim.
+     *
+     *  @return 1-65535 or 0 if invalid
+     *  @since 0.9.3
+     */
+    public static int getPort(String port) {
+        int rv = 0;
+        if (port != null) {
+            try {
+                int iport = Integer.parseInt(port);
+                if (iport > 0 && iport <= 65535)
+                    rv = iport;
+            } catch (NumberFormatException nfe) {}
+        }
+        return rv;
+    }
 
     /**
      *  Textual IP to bytes, because InetAddress.getByName() is slow.
@@ -184,6 +203,9 @@ public abstract class Addresses {
      *  Caches numeric host names only.
      *  Will resolve but not cache DNS host names.
      *
+     *  Unlike InetAddress.getByName(), we do NOT allow numeric IPs
+     *  of the form d.d.d, d.d, or d, as these are almost certainly mistakes.
+     *
      *  @param host DNS or IPv4 or IPv6 host name; if null returns null
      *  @return IP or null
      *  @since 0.9.3
@@ -197,8 +219,11 @@ public abstract class Addresses {
         }
         if (rv == null) {
             try {
+                boolean isIPv4 = host.replaceAll("[0-9\\.]", "").length() == 0;
+                if (isIPv4 && host.replaceAll("[0-9]", "").length() != 3)
+                    return null;
                 rv = InetAddress.getByName(host).getAddress();
-                if (host.replaceAll("[0-9\\.]", "").length() == 0 ||
+                if (isIPv4 ||
                     host.replaceAll("[0-9a-fA-F:]", "").length() == 0) {
                     synchronized (_IPAddress) {
                         _IPAddress.put(host, rv);
diff --git a/core/java/src/net/i2p/util/ConvertToHash.java b/core/java/src/net/i2p/util/ConvertToHash.java
index 182ae7cfaa3c16f5ca44d8c7bf4a5f4c7d4e3aaf..f1d9d9db6f9d758c71799184d10a171117632fdb 100644
--- a/core/java/src/net/i2p/util/ConvertToHash.java
+++ b/core/java/src/net/i2p/util/ConvertToHash.java
@@ -4,6 +4,7 @@ import java.util.Locale;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.Base32;
+import net.i2p.data.Base64;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Destination;
 import net.i2p.data.Hash;
@@ -14,6 +15,7 @@ import net.i2p.data.Hash;
  *    Base64 dest
  *    Base64 dest.i2p
  *    Base64 Hash
+ *    Base64 Hash.i2p
  *    Base32 Hash
  *    Base32 desthash.b32.i2p
  *    example.i2p
@@ -30,52 +32,54 @@ public class ConvertToHash {
     public static Hash getHash(String peer) {
         if (peer == null)
             return null;
-        Hash h = new Hash();
         String peerLC = peer.toLowerCase(Locale.US);
         // b64 hash
         if (peer.length() == 44 && !peerLC.endsWith(".i2p")) {
-            try {
-                h.fromBase64(peer);
-            } catch (DataFormatException dfe) {}
+            byte[] b = Base64.decode(peer);
+            if (b != null && b.length == Hash.HASH_LENGTH)
+                return Hash.create(b);
+        }
+        // b64 hash.i2p
+        if (peer.length() == 48 && peerLC.endsWith(".i2p")) {
+            byte[] b = Base64.decode(peer.substring(0, 44));
+            if (b != null && b.length == Hash.HASH_LENGTH)
+                return Hash.create(b);
         }
         // b64 dest.i2p
-        if (h.getData() == null && peer.length() >= 520 && peerLC.endsWith(".i2p")) {
+        if (peer.length() >= 520 && peerLC.endsWith(".i2p")) {
             try {
                 Destination d = new Destination();
                 d.fromBase64(peer.substring(0, peer.length() - 4));
-                h = d.calculateHash();
+                return d.calculateHash();
             } catch (DataFormatException dfe) {}
         }
         // b64 dest
-        if (h.getData() == null && peer.length() >= 516 && !peerLC.endsWith(".i2p")) {
+        if (peer.length() >= 516 && !peerLC.endsWith(".i2p")) {
             try {
                 Destination d = new Destination();
                 d.fromBase64(peer);
-                h = d.calculateHash();
+                return d.calculateHash();
             } catch (DataFormatException dfe) {}
         }
         // b32 hash.b32.i2p
         // do this here rather than in naming service so it will work
         // even if the leaseset is not found
-        if (h.getData() == null && peer.length() == 60 && peerLC.endsWith(".b32.i2p")) {
+        if (peer.length() == 60 && peerLC.endsWith(".b32.i2p")) {
             byte[] b = Base32.decode(peer.substring(0, 52));
             if (b != null && b.length == Hash.HASH_LENGTH)
-                h.setData(b);
+                return Hash.create(b);
         }
         // b32 hash
-        if (h.getData() == null && peer.length() == 52 && !peerLC.endsWith(".i2p")) {
+        if (peer.length() == 52 && !peerLC.endsWith(".i2p")) {
             byte[] b = Base32.decode(peer);
             if (b != null && b.length == Hash.HASH_LENGTH)
-                h.setData(b);
+                return Hash.create(b);
         }
         // example.i2p
-        if (h.getData() == null) {
-            Destination d = I2PAppContext.getGlobalContext().namingService().lookup(peer);
-            if (d != null)
-                h = d.calculateHash();
-        }
-        if (h.getData() == null)
-            return null;
-        return h;
+        Destination d = I2PAppContext.getGlobalContext().namingService().lookup(peer);
+        if (d != null)
+            return d.calculateHash();
+
+        return null;
     }
 }
diff --git a/core/java/src/net/i2p/util/LogManager.java b/core/java/src/net/i2p/util/LogManager.java
index 689b046f92832a1aad85c7b7b90e87061e4489c8..f2f3e6dc240ef058e5ad389809e7976de5df8d39 100644
--- a/core/java/src/net/i2p/util/LogManager.java
+++ b/core/java/src/net/i2p/util/LogManager.java
@@ -66,7 +66,7 @@ public class LogManager {
     //public final static String DEFAULT_DATEFORMAT = "HH:mm:ss.SSS";
     /** blank means default short date and medium time for the locale - see DateFormat */
     public final static String DEFAULT_DATEFORMAT = "";
-    public final static String DEFAULT_FILENAME = "logs/log-#.txt";
+    public final static String DEFAULT_FILENAME = "logs/log-@.txt";
     public final static String DEFAULT_FILESIZE = "10m";
     public final static boolean DEFAULT_DISPLAYONSCREEN = true;
     public final static int DEFAULT_CONSOLEBUFFERSIZE = 20;
@@ -159,8 +159,8 @@ public class LogManager {
         if (_writer != null)
             return;
         _writer = new LogWriter(this);
-        // NOT an I2PThread, as it contains logging and we end up with problems
-        Thread t = new Thread(_writer, "LogWriter");
+        // if you enable logging in I2PThread again, you MUST change this back to Thread
+        Thread t = new I2PThread(_writer, "LogWriter");
         t.setDaemon(true);
         t.start();
     }
@@ -349,9 +349,9 @@ public class LogManager {
 
         String filenameOverride = _context.getProperty(FILENAME_OVERRIDE_PROP);
         if (filenameOverride != null)
-            _baseLogfilename = filenameOverride;
+            setBaseLogfilename(filenameOverride);
         else
-            _baseLogfilename = config.getProperty(PROP_FILENAME, DEFAULT_FILENAME);
+            setBaseLogfilename(config.getProperty(PROP_FILENAME, DEFAULT_FILENAME));
 
         _fileSize = getFileSize(config.getProperty(PROP_FILESIZE, DEFAULT_FILESIZE));
         _rotationLimit = -1;
@@ -591,7 +591,8 @@ public class LogManager {
     }
     
     public void setBaseLogfilename(String filenamePattern) {
-        _baseLogfilename = filenamePattern;
+        // '#' is a comment character in loadProps/storeProps
+        _baseLogfilename = filenamePattern.replace('#', '@');
     }
 
     public int getFileSize() {
@@ -692,18 +693,30 @@ public class LogManager {
     }
 *****/
 
-    public void shutdown() {
+    /**
+     *  Flush any pending records to disk.
+     *  Blocking up to 250 ms.
+     *  @since 0.9.3
+     */
+    public void flush() {
         if (_writer != null) {
-            //_log.log(Log.WARN, "Shutting down logger");
-            // try to prevent out-of-order logging at shutdown
-            synchronized (_writer) {
-                _writer.notifyAll();
-            }
-            if (!_records.isEmpty()) {
+            int i = 50;
+            while ((!_records.isEmpty()) && i-- > 0) {
+                synchronized (_writer) {
+                    _writer.notifyAll();
+                }
                 try {
-                    Thread.sleep(250);
+                    Thread.sleep(5);
                 } catch (InterruptedException ie) {}
             }
+        }
+    }
+
+    public void shutdown() {
+        if (_writer != null) {
+            //_log.log(Log.WARN, "Shutting down logger");
+            // try to prevent out-of-order logging at shutdown
+            flush();
             // this could generate out-of-order messages
             _writer.flushRecords(false);
             _writer.stopWriting();
diff --git a/core/java/src/net/i2p/util/LogWriter.java b/core/java/src/net/i2p/util/LogWriter.java
index a8e8329d847106b346c48f85ce212c8fba6c1025..c3cc0170e9c6637aeaddf97ba6b1b7dc45ae2f54 100644
--- a/core/java/src/net/i2p/util/LogWriter.java
+++ b/core/java/src/net/i2p/util/LogWriter.java
@@ -81,15 +81,18 @@ class LogWriter implements Runnable {
                         dupCount++;
                     } else {
                         if (dupCount > 0) {
-                            writeRecord(dupMessage(dupCount, last));
+                            writeRecord(dupMessage(dupCount, last, false));
+                            _manager.getBuffer().add(dupMessage(dupCount, last, true));
                             dupCount = 0;
                         }
                         writeRecord(rec);
                     }
                     last = rec;
                 }
-                if (dupCount > 0)
-                    writeRecord(dupMessage(dupCount, last));
+                if (dupCount > 0) {
+                    writeRecord(dupMessage(dupCount, last, false));
+                    _manager.getBuffer().add(dupMessage(dupCount, last, true));
+                }
                 try {
                     if (_currentOut != null)
                         _currentOut.flush();
@@ -113,12 +116,13 @@ class LogWriter implements Runnable {
     }
 
     /**
-     *  Write a msg with the date stamp of the last duplicate
+     *  Return a msg with the date stamp of the last duplicate
      *  @since 0.9.3
      */
-    private String dupMessage(int dupCount, LogRecord lastRecord) {
-        return LogRecordFormatter.getWhen(_manager, lastRecord) + " ^^^ " +
-               _(dupCount, "1 similar message omitted", "{0} similar messages omitted") + " ^^^\n";
+    private String dupMessage(int dupCount, LogRecord lastRecord, boolean reverse) {
+        String arrows = reverse ? "&darr;&darr;&darr;" : "^^^";
+        return LogRecordFormatter.getWhen(_manager, lastRecord) + ' ' + arrows + ' ' +
+               _(dupCount, "1 similar message omitted", "{0} similar messages omitted") + ' ' + arrows + '\n';
     }
     
     private static final String BUNDLE_NAME = "net.i2p.router.web.messages";
diff --git a/core/java/src/net/i2p/util/NativeBigInteger.java b/core/java/src/net/i2p/util/NativeBigInteger.java
index e1a5c0bbc4c3113bb9018d546cae46ed003d3d58..5b03d687ac4bfe71a8be2667f34f483b6016588c 100644
--- a/core/java/src/net/i2p/util/NativeBigInteger.java
+++ b/core/java/src/net/i2p/util/NativeBigInteger.java
@@ -449,7 +449,7 @@ public class NativeBigInteger extends BigInteger {
     private static final void loadNative() {
         try{
             String wantedProp = System.getProperty("jbigi.enable", "true");
-            boolean wantNative = Boolean.valueOf(wantedProp).booleanValue();
+            boolean wantNative = Boolean.parseBoolean(wantedProp);
             if (wantNative) {
                 debug("trying loadGeneric");
                 boolean loaded = loadGeneric("jbigi");
diff --git a/core/java/src/net/i2p/util/SimpleByteCache.java b/core/java/src/net/i2p/util/SimpleByteCache.java
index b41f9ad9b5bf87acedd4aebd7ad8d591b262732f..1623fcb14840359f0ee1f818dcadb2a27f4541fe 100644
--- a/core/java/src/net/i2p/util/SimpleByteCache.java
+++ b/core/java/src/net/i2p/util/SimpleByteCache.java
@@ -16,7 +16,7 @@ import java.util.concurrent.LinkedBlockingQueue;
  */
 public final class SimpleByteCache {
 
-    private static final Map<Integer, SimpleByteCache> _caches = new ConcurrentHashMap(8);
+    private static final ConcurrentHashMap<Integer, SimpleByteCache> _caches = new ConcurrentHashMap(8);
 
     private static final int DEFAULT_SIZE = 64;
 
@@ -45,7 +45,9 @@ public final class SimpleByteCache {
         SimpleByteCache cache = _caches.get(sz);
         if (cache == null) {
             cache = new SimpleByteCache(cacheSize, size);
-            _caches.put(sz, cache);
+            SimpleByteCache old = _caches.putIfAbsent(sz, cache);
+            if (old != null)
+                cache = old;
         }
         cache.resize(cacheSize);
         return cache;
@@ -86,7 +88,7 @@ public final class SimpleByteCache {
      *  @since 0.9.2
      */
     private Queue<byte[]> createQueue() {
-        if (_maxCached <= MAX_FOR_ABQ)
+        if (_entrySize <= MAX_FOR_ABQ)
             return new ArrayBlockingQueue(_maxCached);
         return new LinkedBlockingQueue(_maxCached);
     }
diff --git a/core/java/src/net/i2p/util/SocketTimeout.java b/core/java/src/net/i2p/util/SocketTimeout.java
index 3a8f57400b3713c028a45c1a3a18ba52857c4ce0..e5c02d5c9713e2cf96f83d895814c5650aa329fd 100644
--- a/core/java/src/net/i2p/util/SocketTimeout.java
+++ b/core/java/src/net/i2p/util/SocketTimeout.java
@@ -7,7 +7,7 @@ import java.util.Date;
 
 /**
  *  This should be deprecated.
- *  It is only used by EepGet, and it uses the inefficient SimpleTimer.
+ *  It is only used by EepGet.
  *  The only advantage seems to be a total timeout period, which is the second
  *  argument to EepGet.fetch(headerTimeout, totalTimeout, inactivityTimeout),
  *  which is most likely always set to -1.
@@ -15,14 +15,16 @@ import java.util.Date;
  *  Use socket.setsotimeout instead?
  */
 public class SocketTimeout extends SimpleTimer2.TimedEvent {
-    private Socket _targetSocket;
-    private long _startTime;
-    private long _inactivityDelay;
-    private long _lastActivity;
-    private long _totalTimeoutTime;
-    private boolean _cancelled;
-    private Runnable _command;
+    private volatile Socket _targetSocket;
+    private final long _startTime;
+    private volatile long _inactivityDelay;
+    private volatile long _lastActivity;
+    private volatile long _totalTimeoutTime;
+    private volatile boolean _cancelled;
+    private volatile Runnable _command;
+
     public SocketTimeout(long delay) { this(null, delay); }
+
     public SocketTimeout(Socket socket, long delay) {
         super(SimpleTimer2.getInstance());
         _inactivityDelay = delay;
@@ -32,6 +34,7 @@ public class SocketTimeout extends SimpleTimer2.TimedEvent {
         _totalTimeoutTime = -1;
         schedule(delay);
     }
+
     public void timeReached() {
         if (_cancelled) return;
         
@@ -53,25 +56,29 @@ public class SocketTimeout extends SimpleTimer2.TimedEvent {
         _cancelled = true;
         return super.cancel();
     }
+
     public void setSocket(Socket s) { _targetSocket = s; }
     public void resetTimer() { _lastActivity = System.currentTimeMillis();  }
     public void setInactivityTimeout(long timeout) { _inactivityDelay = timeout; }
+
     public void setTotalTimeoutPeriod(long timeoutPeriod) { 
         if (timeoutPeriod > 0)
             _totalTimeoutTime = _startTime + timeoutPeriod;
         else
             _totalTimeoutTime = -1;
     }
+
     public void setTimeoutCommand(Runnable job) { _command = job; }
     
     private static final SimpleDateFormat _fmt = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss.SSS");
     private static String ts(long when) { synchronized (_fmt) { return _fmt.format(new Date(when)); } }
+
     @Override
     public String toString() {
         StringBuilder buf = new StringBuilder();
-        buf.append("started on ");
+        buf.append("SocketTimeout started on ");
         buf.append(ts(_startTime));
-        buf.append("idle for ");
+        buf.append(" idle for ");
         buf.append(System.currentTimeMillis() - _lastActivity);
         buf.append("ms ");
         if (_totalTimeoutTime > 0)
diff --git a/core/java/src/net/i2p/util/SystemVersion.java b/core/java/src/net/i2p/util/SystemVersion.java
index 4e965b23fb0d3d81c6f17c13262081c62c20ff8a..d43cddc8987442b48ce84e520cf7f10c22fd2116 100644
--- a/core/java/src/net/i2p/util/SystemVersion.java
+++ b/core/java/src/net/i2p/util/SystemVersion.java
@@ -84,4 +84,12 @@ public abstract class SystemVersion {
     public static int getAndroidVersion() {
         return _androidSDK;
     }
+
+    /**
+     *  Is the wrapper present?
+     *  Same as I2PAppContext.hasWrapper()
+     */
+    public static boolean hasWrapper() {
+        return System.getProperty("wrapper.version") != null;
+    }
 }
diff --git a/debian/patches/0004-oom-listener.patch b/debian/patches/0004-oom-listener.patch
index f803b8d9ef342fe990ab8f6dcaf2fde763d78034..1a29b8b124c99a56fa60b66c76bb0c7eed52d782 100644
--- a/debian/patches/0004-oom-listener.patch
+++ b/debian/patches/0004-oom-listener.patch
@@ -1,11 +1,11 @@
 --- a/router/java/src/net/i2p/router/tasks/OOMListener.java
 +++ b/router/java/src/net/i2p/router/tasks/OOMListener.java
-@@ -33,7 +33,7 @@
-                 // gobble
-             }
-         }
--        log.log(Log.CRIT, "To prevent future shutdowns, increase wrapper.java.maxmemory in $I2P/wrapper.config");
-+        log.log(Log.CRIT, "To prevent future shutdowns, increase wrapper.java.maxmemory in /etc/i2p/wrapper.config");
-         _context.router().shutdown(Router.EXIT_OOM); 
-     }
- }
+@@ -46,7 +46,7 @@
+             log.log(Log.CRIT, "free mem: " + Runtime.getRuntime().freeMemory() + 
+                               " total mem: " + Runtime.getRuntime().totalMemory());
+             if (_context.hasWrapper())
+-                log.log(Log.CRIT, "To prevent future shutdowns, increase wrapper.java.maxmemory in $I2P/wrapper.config");
++                log.log(Log.CRIT, "To prevent future shutdowns, increase wrapper.java.maxmemory in /etc/i2p/wrapper.config");
+         } catch (OutOfMemoryError oome) {}
+         try { 
+             ThreadDump.dump(_context, 1);
diff --git a/history.txt b/history.txt
index dc55406905ce29a3cf4d04056c560fd4041571fe..7beabaf2fe29a73919063b159042230e988d7063 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,220 @@
+2012-10-09 zzz
+ * Console, i2ptunnel: Warn on low ports
+ * NetDB: Increase floodfills again
+ * RouterInfo: Exit 1 on error in main()
+ * SSU:
+   - Add peer test throttling
+   - Peer test packet count fixes
+   - Adjust peer test timeouts and add backoff
+   - Reject relays and peer tests from same /16
+   - More peer test cleanup and log tweaks
+ * Transports:
+   - Enforce minimum peer port
+   - Warn on low router ports
+
+2012-10-08 zzz
+ * SSU:
+   - Fix relay request handling bug from -10
+   - Fix peer test reply handling bug from -10
+   - Fix NPE from -6
+
+2012-10-07 zzz
+ * I2PAppContext: Improved synching in constructor
+ * i2ptunnel:
+   - Set default read timeout in standard server
+   - Reduce header timeout, enforce total header timeout
+     in IRC and HTTP servers (ticket #723)
+ * Logs:
+   - Flush buffers in logs.jsp
+   - Add dup message to buffers, was in file only
+ * Streaming: Don't ignore option or force connect timeout to 5 minutes
+ * UPnP: Workaround NPE (ticket #728)
+
+2012-10-06 zzz
+ * configlogging.jsp: Fix IAE
+ * error500.jsp: Fix whitespace
+ * i2psnark:
+   - Add allocating and checking indications
+   - Add bandwidth message at startup
+   - More checks at torrent creation
+ * SSU:
+   - Throttle outbound destroys on shutdown
+   - Limit outbound introduction offers
+   - Validate port/IP in received peer tests
+
+2012-10-05 zzz
+ * configservice.jsp: Add GC button
+ * DataHelper: Sanity checks in storeProps(), use
+               storeProps() for router config again
+ * SSU:
+   - More synchronization fixes
+   - Reduce chance of dup acks in a single message
+   - Reduce max unsent acks to 50
+   - Use last ack time in ping decision too
+   - Reduce ack delay
+ * TunnelPoolManager: Fix early NPE (ticket #724)
+
+2012-10-03 zzz
+ * NTCP: Reduce conLock contention
+ * SSU:
+   - Increase max outbound establishments based on bandwidth
+   - Synchronization fix for Java 5
+   - Use multiple buffer sizes in OutboundMessageState to
+     reduce memory usage
+   - Adjust skew calculation, synchronize too
+   - Ping loop improvements
+
+2012-10-02 zzz
+ * I2CP: Delay after sending disconnect message to
+         help it get through
+ * i2psnark: Fix delete download message
+ * i2ptunnel: Fix log message
+ * NTCP: Only set keepalive if firewalled
+ * OOMListener: Dump threads on OOM
+ * PRNG, LogWriter: Use I2PThread to catch OOM
+ * SimpleByteCache: Fix ABQ/LBQ selection
+ * SSU:
+   - Fix memory leak in _peersByRemoteHost map caused by not
+     removing peers that change IP or port
+   - Send keepalives if firewalled
+   - Handle peers that change ports on an established session
+   - Synchronize adds and drops
+   - Don't use peers with high RTTs in clock skew calculation
+   - Reduce initial RTT/RTO
+
+2012-09-28 zzz
+ * i2psnark:
+   - Fix bugs in rarest-first tracking
+   - Fix requesting of partial piece when there are multiple seeds
+   - Synch fix in BitField
+ * i2ptunnel: Fix wrong server IP in log message
+ * peers.jsp: Remove SSU "Dev" column
+ * SessionKeyManager: Store original tagset size for debugging
+ * Streaming: Don't send RST on globally-blackisted conns
+
+2012-09-26 zzz
+ * Addresses: Reject numeric IPs of the form n, n.n, and n.n.n
+ * Console, i2ptunnel: More validation of address and port in forms
+ * ConvertToHash:
+   - Add support for b64hash.i2p
+   - Cleanup and use cache
+ * i2psnark: Enable DHT by default
+ * RFC822Date: Synchronization fix
+ * Streaming:
+   - Implement changing connection limits on a running session
+   - Implement global blacklist
+
+2012-09-25 zzz
+ * Context: Make files final
+ * EventLog: Fix IAE on portable
+ * Jetty: Add non-NIO selector option (ticket #715)
+ * OutboundEstablishState: Cleanup (ticket #671)
+ * SimpleByteCache: Concurrent fix
+ * UPnP: Cleanup & final
+ * URLLauncher: Add xdg-open (ticket #717)
+
+2012-09-21 zzz
+ * BuildHandler: Use CoDel for inbound queue
+ * ByteCache:
+   - Prevent release of wrong size
+   - Move all 16/32 byte users to SimpleByteCache
+   - Increase SimpleByteCache default size.
+ * ClientConnectionRunner:
+   - Run HandleJob and MessageReceivedJob inline for speed
+   - Remove payload from message map if availability announce fails
+   - Cleanups
+ * ClientManager:
+   - Concurrent client map for faster lookup
+   - Add by-hash client map for faster lookup by hash
+ * ClientWriterRunner: Limit queue size
+ * Clock: Synchronization, log large shifts to event log
+ * Console: Mark all restarts on graphs using the event log.
+ * FortunaRandomSource:
+   - Fix bug that wasted entropy in nextInt()
+   - Improved synchronization
+ * GarlicMessage:
+   - Add notes about GarlicMessageHandler and HandleGarlicMessageJob
+     being unused in practice
+ * I2CP:
+   - Limit router/client queue sizes and queue wait times
+   - Buffer output streams
+ * i2psnark:
+   - Implement blacklist for unreachable DHT peers
+   - Reduce threshold for unreachable
+   - Use ByteCache for chunks in/out
+ * IP Lookup:
+   - Add caching in RouterAddress with secondary caching
+     in Addresses; use caches to speed up transport bids,
+     blocklist checks, geoip lookups, and profile organizer
+     checks (ticket #707)
+   - Limit IP cache size in TransportImpl
+   - Clear caches at shutdown
+ * JobQueue: Reduce lock contention
+ * LHMCache: New util, replacing several private versions
+ * LogWriter:
+   -  Duplicate log message removal
+   -  Increase buffer time
+ * NTCP: Move NTCPConnection outbound queue to CoDelPriority
+ * OutNetMessage:
+   - Centralize priority definitions
+   - Raise netdb store and reply priority
+ * Router:
+   - Boost priority of shutdown thread
+   - Replace ident log with new, general-purpose event log;
+     use for stops, starts, and updates, and others.
+   - New AQM CoDel queue utilities
+   - Startup/shutdown synchronization fixes
+ * RouterAddress: Remove unused expiration field to save space
+ * SimpleTimer (ticket #653):
+   - Move all remaining uses to SimpleTimer2
+   - Deprecate
+ * SSU:
+   - Move MessageReceiver, UDPSender and UDPReceiver queues to CoDel
+   - Separate PeerState outbound message list into a queue for unsent messages
+     and a list for sent messages awaiting ack
+   - Implement PeerState outbound queue as CoDelPriority
+   - Implement backlogged indication like in NTCP
+   - Increase initial and max RTO
+   - Don't count ack-only packets in bandwidth allocation
+ * Streaming: Don't send a RST to an hour/day limited peer,
+   or blacklisted, or non-whitelisted, to not waste outbound bandwidth
+ * SystemVersion: New util, to consolidate duplicate code,
+   and determine Java version on Android
+ * TunnelGateway:
+   - Refactor TunnelGateway.Pending to its own file PendingGatewayMesasge
+   - Move OBGW queue to CoDelPriority
+   - Move IBGW queue to CoDel
+   - Limit queue sizes
+   - Add stat for overflow
+   - Remove some stats
+   - Change pumper to LinkedHashSet for efficiency
+     (like NTCP Reader/Writer)
+   - Limit messages pumped per cycle to increase
+     round-robin fairness
+   - Implement pushback from a backlogged transport
+     queue to the pre-fragmentation queue
+   - Comment out some unused code
+
+* 2012-09-21 0.9.2 released
+
+2012-09-15 zzz
+ * Build: Fix unpack problem on Java 5: http://forum.i2p/viewtopic.php?t=7334
+
+2012-09-14 zzz
+ * SSU: Fix shutdown NPE (ticket #709)
+
+2012-09-13 kytv
+ * Update geoip.txt based on Maxmind GeoLite Country database from 2012-09-05
+
+2012-09-12 kytv
+ * Czech translation updates from Transifex
+
+2012-09-10 meeh
+ * Added fix for startup issues on newer versions of launchd (osx startup scripts)
+
+2012-09-05 meeh
+ * Added startup scripts for osx
+
 2012-09-04 zzz
  * I2PTunnelServer: Clean shutdown after session exception
  * OutNetMessage: Speedup after profiling (ticket #707 - thx dg, kytv, zab)
diff --git a/installer/install.xml b/installer/install.xml
index 8d5bfac0f13af3647ca5be5c257a17e031e3acaa..5bdb2e4ad807e3db967633d73c488157f5b10c10 100644
--- a/installer/install.xml
+++ b/installer/install.xml
@@ -4,7 +4,7 @@
 
     <info>
         <appname>i2p</appname>
-        <appversion>0.9.1</appversion>
+        <appversion>0.9.2</appversion>
         <authors>
             <author name="I2P" email="http://forum.i2p2.de/"/>
         </authors>
@@ -137,10 +137,7 @@
             <parsable targetfile="$INSTALL_PATH/eepget.bat" type="shell" os="windows" />
             <parsable targetfile="$INSTALL_PATH/runplain.sh" type="shell"> <os family="unix" /> </parsable>
             <parsable targetfile="$INSTALL_PATH/Start I2P Router.app/Contents/MacOS/i2prouter" type="shell" os="mac" />
-            <parsable targetfile="$INSTALL_PATH/net.i2p.router.plist.template" type="shell" os="mac" />
-            <parsable targetfile="$INSTALL_PATH/install_i2p_service_osx.command" type="shell" os="mac" />
-            <parsable targetfile="$INSTALL_PATH/uninstall_i2p_service_osx.command" type="shell" os="mac" />
-            
+
 	    <conditions>
 	        <condition type="variable" id="is64bit">
 	            <name>SYSTEM_sun_arch_data_model</name>
@@ -190,7 +187,7 @@
 	    <executable targetfile="$INSTALL_PATH/installer/delete.jar" type="jar" stage="postinstall" keep="true" failure="warn"> <os family="windows" />
 	        <args><arg value="$INSTALL_PATH/Start I2P Router.app" /></args></executable>
 	    <executable targetfile="$INSTALL_PATH/installer/delete.jar" type="jar" stage="postinstall" keep="true" failure="warn"> <os family="windows" />
-	        <args><arg value="$INSTALL_PATH/net.i2p.router.plist" /></args></executable>
+	        <args><arg value="$INSTALL_PATH/net.i2p.router.plist.template" /></args></executable>
 	    <executable targetfile="$INSTALL_PATH/installer/delete.jar" type="jar" stage="postinstall" keep="true" failure="warn"> <os family="windows" />
 	        <args><arg value="$INSTALL_PATH/install_i2p_service_osx.command" /></args></executable>
 	    <executable targetfile="$INSTALL_PATH/installer/delete.jar" type="jar" stage="postinstall" keep="true" failure="warn"> <os family="windows" />
diff --git a/installer/resources/eepsite/jetty.xml b/installer/resources/eepsite/jetty.xml
index 51af5537980d98079877d1f5bdb029d6a99f8b05..ba30a55ebd8264e540799807a8eeaf874ad8fb1d 100644
--- a/installer/resources/eepsite/jetty.xml
+++ b/installer/resources/eepsite/jetty.xml
@@ -12,7 +12,7 @@
 <!--   * port: Default 7658 in the addConnector section                         -->
 <!--   * docroot: Change the ResourceBase in the contexts/base-context.xml file -->
 <!--           to serve files from a different location.                       -->
-<!--   * threads: Raise MinThreads and/or MaxThreads in the addListener section -->
+<!--   * threads: Raise maximumPoolSize in the ThreadPool section              -->
 <!--           if you have a high-traffic site and get a lot of warnings.      -->
 <!--   * Uncomment the addWebApplications section to use to enable             -->
 <!--           war files placed in the webapps/ dir.                           -->
@@ -65,7 +65,8 @@
      -->
 
       <!-- Optional Java 5 bounded threadpool with job queue 
-           Requests above the max will be rejected
+           Requests above the max will be rejected and logged.
+           High-traffic sites should increase maximumPoolSize.
            TODO: would be nice to use the 5-arg constructor but
                  how do you use an Enum as the TimeUnit argument?
            Alternatively, make a custom class where we can
@@ -75,7 +76,7 @@
       <New class="org.mortbay.thread.concurrent.ThreadPool">
         <Arg type="int">0</Arg>
         <Set name="corePoolSize">1</Set>
-        <Set name="maximumPoolSize">16</Set>
+        <Set name="maximumPoolSize">24</Set>
       </New>
     </Set>
 
@@ -89,6 +90,8 @@
 
     <!-- Use this connector for many frequently idle connections
          and for threadless continuations.
+         Not recommended on Java 5 - comment out and uncomment the
+         SocketConnector below.
     -->    
     <Call name="addConnector">
       <Arg>
@@ -106,6 +109,24 @@
       </Arg>
     </Call>
 
+    <!-- Recommended to use this connector on Java 5, as
+         Jetty 6 and Java 5 NIO don't play well together.
+    -->
+    <!--
+    <Call name="addConnector">
+      <Arg>
+          <New class="org.mortbay.jetty.bio.SocketConnector">
+            <Set name="host">127.0.0.1</Set>
+            <Set name="port">7658</Set>
+            <Set name="maxIdleTime">60000</Set>
+            <Set name="Acceptors">1</Set>
+            <Set name="statsOn">false</Set>
+            <Set name="confidentialPort">8443</Set>
+          </New>
+      </Arg>
+    </Call>
+    -->
+
     <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
     <!-- To add a HTTPS SSL listener                                     -->
     <!-- see jetty-ssl.xml to add an ssl connector. use                  -->
diff --git a/installer/resources/geoip.txt b/installer/resources/geoip.txt
index f7ecfe073a54cc2ef6af998f3a5f365104000b4c..e68f00da836aa68b4bed665e4f0662d769f7d92c 100644
--- a/installer/resources/geoip.txt
+++ b/installer/resources/geoip.txt
@@ -1,5 +1,5 @@
 # Last updated based on Maxmind GeoLite Country
-# dated 2012-07-04
+# dated 2012-09-05
 # Script borrowed from Tor
 #
 # wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
@@ -296,11 +296,16 @@
 84459520,84471807,RU
 84471808,84473855,IQ
 84473856,84475903,HU
-84475904,84541439,DE
+84475904,84545535,DE
+84545536,84549631,GB
+84549632,84551679,GE
+84551680,84557823,DE
 84557824,84574207,GB
 84574208,84576255,FR
 84576256,84582399,GB
 84582400,84590591,DE
+84590592,84592639,NL
+84592640,84594687,ES
 84594688,84598783,DE
 84598784,84600831,IQ
 84600832,84602879,GB
@@ -312,7 +317,7 @@
 84619264,84621311,DE
 84621312,84623359,GR
 84623360,84627455,RU
-84627456,84629503,GB
+84627456,84631551,GB
 84631552,84639743,IT
 84639744,84672511,TR
 84672512,84934655,RO
@@ -375,9 +380,11 @@
 86177792,86179839,LI
 86179840,86220799,RU
 86220800,86222847,JE
-86222848,86224895,RU
+86222848,86223871,NL
+86223872,86224895,RU
 86224896,86226943,NL
 86226944,86228991,SE
+86228992,86231039,BE
 86231040,86233087,ES
 86233088,86235135,RO
 86235136,86237183,ES
@@ -385,17 +392,35 @@
 86245376,86376447,OM
 86376448,86409215,AE
 86409216,86441983,HU
-86441984,86442723,FR
+86441984,86442700,FR
+86442701,86442702,CH
+86442703,86442723,FR
 86442724,86442724,PL
 86442725,86444319,FR
 86444320,86444323,ES
 86444324,86446427,FR
 86446428,86446431,DE
-86446432,86454335,FR
-86454336,86454339,DE
-86454340,86456195,FR
+86446432,86447095,FR
+86447096,86447103,ES
+86447104,86449363,FR
+86449364,86449367,DE
+86449368,86454335,FR
+86454336,86454343,DE
+86454344,86456195,FR
 86456196,86456211,DE
-86456212,86474751,FR
+86456212,86456351,FR
+86456352,86456367,CH
+86456368,86457087,FR
+86457088,86457091,DE
+86457092,86469691,FR
+86469692,86469695,DE
+86469696,86474307,FR
+86474308,86474311,DE
+86474312,86474475,FR
+86474476,86474479,DE
+86474480,86474527,FR
+86474528,86474531,DE
+86474532,86474751,FR
 86474752,86482943,HR
 86482944,86484991,RU
 86484992,86487039,NL
@@ -487,7 +512,9 @@
 87568384,87570431,GB
 87570432,87572479,ES
 87572480,87588863,MD
-87588864,87590911,GB
+87588864,87590143,GB
+87590144,87590399,US
+87590400,87590911,GB
 87590912,87592959,RU
 87592960,87597055,DK
 87597056,87599103,ES
@@ -591,6 +618,7 @@
 90478592,90480639,GB
 90480640,90482687,YE
 90482688,90484735,GB
+90484736,90488831,NO
 90488832,90497023,BY
 90497024,90499071,NL
 90499072,90501119,IT
@@ -622,6 +650,7 @@
 90720256,90722303,IQ
 90722304,90724351,FI
 90724352,90726399,CH
+90726400,90728447,FR
 90728448,90730495,DE
 90730496,90734591,NL
 90734592,90736639,SY
@@ -630,12 +659,267 @@
 90740736,90742783,NL
 90742784,90750975,BG
 90750976,90753023,FR
+90753024,90755071,RU
+90755072,90757119,PL
+90757120,90759167,AT
+90759168,90761215,NL
+90761216,90763263,KZ
+90763264,90765311,IL
+90765312,90767359,PL
 90767360,90832895,UA
 90832896,90898431,EU
 90898432,90963967,RO
 90963968,91226111,SA
 91226112,92274687,IR
 92274688,92536831,RU
+92536832,92602367,NL
+92602368,92604415,BA
+92604416,92606463,PL
+92606464,92608511,GB
+92608512,92610559,PS
+92610560,92612607,CH
+92612608,92614655,GB
+92614656,92618751,IT
+92618752,92635135,NL
+92635136,92643327,BA
+92643328,92645375,GE
+92645376,92651519,GB
+92651520,92659711,SE
+92659712,92663807,AZ
+92663808,92665855,GB
+92665856,92667903,PL
+92667904,92669951,BE
+92669952,92671999,GB
+92672000,92674047,DE
+92674048,92676095,CH
+92676096,92680191,ES
+92680192,92684287,AZ
+92684288,92688383,PL
+92688384,92690431,AM
+92690432,92692479,IE
+92692480,92694527,FR
+92694528,92696575,RS
+92696576,92698623,ES
+92698624,92700671,IT
+92700672,92717055,IR
+92717056,92719103,SE
+92719104,92721151,SY
+92721152,92723199,PL
+92723200,92725247,RU
+92725248,92733439,SY
+92733440,92734735,FR
+92734736,92734739,DE
+92734740,92798975,FR
+92798976,93323263,RU
+93323264,93335551,CH
+93335552,93339647,IL
+93339648,93343743,RU
+93343744,93347839,GB
+93347840,93356031,RU
+93356032,93358079,IR
+93358080,93360127,FR
+93360128,93362175,ES
+93362176,93364223,GB
+93364224,93368319,IT
+93368320,93370367,GB
+93370368,93372415,IT
+93372416,93388799,GR
+93388800,93415423,CH
+93415424,93417471,CZ
+93417472,93419519,IR
+93419520,93421567,IT
+93421568,93425663,DE
+93425664,93427711,GI
+93427712,93429759,NO
+93429760,93431807,RU
+93431808,93433855,ES
+93433856,93437951,DE
+93437952,93454335,RU
+93454336,93585407,DE
+93585408,93626367,GB
+93626368,93634559,CH
+93634560,93650943,HU
+93650944,93652991,CH
+93652992,93655039,GB
+93655040,93667327,CH
+93667328,93675519,BA
+93675520,93679615,IQ
+93679616,93681663,LU
+93681664,93683711,UA
+93683712,93685759,AT
+93685760,93687807,BE
+93687808,93690367,RU
+93690368,93691903,GB
+93691904,93693951,PL
+93693952,93695999,IE
+93696000,93700095,FR
+93700096,93702143,PL
+93702144,93704191,RU
+93704192,93708287,UA
+93708288,93712383,DE
+93712384,93714431,HU
+93714432,93749247,GB
+93749248,93753343,IT
+93753344,93755391,IE
+93755392,93765631,GB
+93765632,93782015,SE
+93782016,93847551,GB
+93847552,93880319,GE
+93880320,93888511,IT
+93888512,93890559,PL
+93890560,93892607,ES
+93892608,93894655,GB
+93894656,93896703,US
+93896704,93904895,GB
+93904896,93906943,LV
+93906944,93908991,BA
+93908992,93911039,IT
+93911040,93913087,AE
+93913088,93929471,NL
+93929472,93939711,GB
+93939712,93941759,NO
+93941760,93945855,CH
+93945856,93962239,UA
+93962240,93972479,GB
+93972480,93974527,EE
+93974528,93976575,CH
+93976576,93978623,GB
+93978624,94175231,RO
+94175232,94191615,EE
+94191616,94193663,GB
+94193664,94195711,SI
+94195712,94199807,NL
+94199808,94207999,IT
+94208000,94240767,RO
+94240768,94257151,PT
+94257152,94261247,IT
+94261248,94263295,ES
+94263296,94265343,GB
+94265344,94273535,RU
+94273536,94289919,DE
+94289920,94291967,NO
+94291968,94294015,FR
+94294016,94296063,EU
+94296064,94298111,ES
+94298112,94300159,GB
+94300160,94302207,RU
+94302208,94306303,FR
+94306304,94308351,AT
+94308352,94310399,ES
+94310400,94312447,GE
+94312448,94314495,DE
+94314496,94316543,NL
+94316544,94318591,IE
+94318592,94320639,IR
+94320640,94330879,DE
+94330880,94337023,RU
+94337024,94339071,GB
+94339072,94355455,ES
+94355456,94357503,NL
+94357504,94361599,GB
+94361600,94363647,PT
+94363648,94365695,GB
+94365696,94367743,HU
+94367744,94369791,ES
+94369792,94371839,TR
+94371840,94502911,IR
+94502912,94568447,OM
+94568448,94633983,RO
+94633984,94896127,RU
+94896128,95158271,IT
+95158272,95166463,RU
+95166464,95168511,RS
+95168512,95170559,NL
+95170560,95174655,GB
+95174656,95191039,IT
+95191040,95195135,CH
+95195136,95197183,PT
+95197184,95203327,GB
+95203328,95205375,FR
+95205376,95207423,PL
+95207424,95211519,GR
+95211520,95213567,IT
+95213568,95215615,NL
+95215616,95354879,PL
+95354880,95363071,DE
+95363072,95365119,IT
+95365120,95367167,ES
+95367168,95369215,IT
+95369216,95371263,GB
+95371264,95375359,IT
+95375360,95377407,NL
+95377408,95387647,RU
+95387648,95420415,DE
+95420416,95551487,TR
+95551488,95555583,AZ
+95555584,95557631,GB
+95557632,95559679,RU
+95559680,95561727,NL
+95561728,95563775,IT
+95563776,95567871,SK
+95567872,95569919,NL
+95569920,95571967,SE
+95571968,95574015,RU
+95574016,95576063,IT
+95576064,95580159,GB
+95580160,95582207,NL
+95582208,95584255,IT
+95584256,95617023,GE
+95617024,95625215,LV
+95625216,95635455,IE
+95635456,95637503,GB
+95637504,95641599,DK
+95641600,95645695,GB
+95645696,95647743,SE
+95647744,95649791,FR
+95649792,95666175,IT
+95666176,95668223,FR
+95668224,95682559,DE
+95682560,95944703,UA
+95944704,96075775,PL
+96075776,96143359,DE
+96143360,96145407,GE
+96145408,96149503,GB
+96149504,96151551,ES
+96151552,96153599,RU
+96153600,96155647,PL
+96155648,96157695,CH
+96157696,96165887,RU
+96165888,96174079,FR
+96174080,96206847,HU
+96206848,96337919,RU
+96337920,96403455,IR
+96403456,96468991,AZ
+96468992,96731135,RO
+96731136,96796671,DE
+96796672,96862207,AZ
+96862208,96894975,GB
+96894976,96897023,CZ
+96897024,96899071,GB
+96899072,96903167,AT
+96903168,96911359,IR
+96919552,96923647,IT
+96923648,96925695,JO
+96925696,96927743,MT
+96927744,96960511,GB
+96960512,96964607,DE
+96964608,96968703,NL
+96968704,96972799,LT
+96972800,96974847,DE
+96974848,96985087,RU
+96985088,96987135,ES
+96987136,96989183,UA
+96989184,96993279,DE
+96993280,97001471,NL
+97001472,97009663,RU
+97009664,97058815,IR
+97058816,97091583,PL
+97091584,97189887,IR
+97189888,97255423,GR
+97255424,97320959,HU
+97320960,97386495,ES
+97386496,97419263,RU
+97419264,97435647,HU
 100663296,121195295,US
 121195296,121195327,IT
 121195328,134693119,US
@@ -1192,9 +1476,9 @@
 332132120,332132127,IL
 332132128,344260607,US
 344260608,344261119,GB
-344261120,344261631,US
-344261632,344261887,EU
-344261888,344262655,US
+344261120,344261778,US
+344261779,344261779,EU
+344261780,344262655,US
 344262656,344262911,GB
 344262912,344268817,US
 344268818,344268818,EU
@@ -1708,7 +1992,8 @@
 520488960,520489983,IT
 520489984,520491007,RU
 520491008,520493567,GB
-520493568,520494335,FR
+520493568,520494079,A1
+520494080,520494335,FR
 520494336,520494591,TR
 520494592,520495103,CH
 520495104,520496383,DE
@@ -2166,6 +2451,7 @@
 531169280,531177471,KZ
 531177472,531179519,GB
 531179520,531181567,FR
+531181568,531183615,NO
 531183616,531185663,NL
 531185664,531193855,TR
 531193856,531194303,IE
@@ -2286,7 +2572,8 @@
 531695616,531697663,LT
 531697664,531699711,GB
 531699712,531701759,CZ
-531701760,531703807,NL
+531701760,531703551,NL
+531703552,531703807,IQ
 531703808,531705855,IT
 531705856,531707903,ES
 531707904,531709951,GR
@@ -2897,7 +3184,9 @@
 533837824,533839871,DE
 533839872,533856255,IS
 533856256,533858303,FR
-533858304,533859583,HU
+533858304,533859231,HU
+533859232,533859263,TR
+533859264,533859583,HU
 533859584,533859839,BG
 533859840,533860095,HU
 533860096,533860351,AT
@@ -3468,9 +3757,7 @@
 623052800,623054847,RS
 623054848,623058943,FI
 623058944,623067135,RO
-623067136,623067136,RS
-623067137,623069182,AL
-623069183,623069183,RS
+623067136,623069183,AL
 623069184,623071231,GB
 623071232,623073279,FI
 623073280,623075327,GB
@@ -5317,7 +5604,9 @@
 624658384,624658387,DE
 624658388,624658391,FR
 624658392,624658399,PL
-624658400,624658527,FR
+624658400,624658479,FR
+624658480,624658483,DE
+624658484,624658527,FR
 624658528,624658535,GB
 624658536,624658539,ES
 624658540,624658543,IE
@@ -5682,7 +5971,7 @@
 624665556,624665559,FR
 624665560,624665567,IE
 624665568,624665587,FR
-624665588,624665591,ES
+624665588,624665591,DE
 624665592,624665595,FR
 624665596,624665599,PL
 624665600,624665607,FR
@@ -6509,9 +6798,12 @@
 624683728,624683743,ES
 624683744,624683759,FR
 624683760,624683775,PL
-624683776,624683783,FR
-624683784,624683787,CZ
-624683788,624683799,FR
+624683776,624683777,FR
+624683778,624683781,DE
+624683782,624683783,FR
+624683784,624683785,CZ
+624683786,624683789,DE
+624683790,624683799,FR
 624683800,624683803,FI
 624683804,624683807,IT
 624683808,624683811,ES
@@ -6682,7 +6974,9 @@
 624686000,624686003,LT
 624686004,624686007,PL
 624686008,624686015,ES
-624686016,624689151,FR
+624686016,624689076,FR
+624689077,624689078,BE
+624689079,624689151,FR
 624689152,624691199,DE
 624691200,624693247,FR
 624693248,624695295,RU
@@ -6918,7 +7212,10 @@
 629882890,629882890,A1
 629882891,629883135,GB
 629883136,629883391,AU
-629883392,629884927,GB
+629883392,629883903,GB
+629883904,629884159,AU
+629884160,629884671,GB
+629884672,629884927,AU
 629884928,629886975,PL
 629886976,629889023,RU
 629889024,629891071,IT
@@ -7124,7 +7421,9 @@
 635105280,635107327,NL
 635107328,635109375,DE
 635109376,635174911,FI
-635174912,635183103,GB
+635174912,635179713,GB
+635179714,635179714,A1
+635179715,635183103,GB
 635183104,635185151,NL
 635185152,635187199,IT
 635187200,635191295,FR
@@ -7167,7 +7466,9 @@
 635240448,635256831,IR
 635256832,635273215,GB
 635273216,635281407,UA
-635281408,635285503,RO
+635281408,635283455,RO
+635283456,635284479,DE
+635284480,635285503,US
 635285504,635287551,ME
 635287552,635289599,RU
 635289600,635291647,DE
@@ -7505,6 +7806,7 @@
 635717632,635719679,NL
 635719680,635723775,RU
 635723776,635725823,ES
+635725824,635727871,NO
 635727872,635729919,RU
 635729920,635748351,DE
 635748352,635764735,IE
@@ -7593,7 +7895,9 @@
 637329408,637337599,AT
 637337600,637403135,NO
 637403136,637534207,IR
-637534208,642695167,US
+637534208,641765375,US
+641765376,641765887,CA
+641765888,642695167,US
 642695168,642696191,A1
 642696192,642795519,US
 642795520,642796031,A1
@@ -7794,6 +8098,7 @@
 692961280,692963327,TZ
 692963328,692965375,ZA
 692965376,692967423,CM
+692967424,692968447,KE
 692968448,692969471,CD
 692969472,692971519,TZ
 692973568,692975615,MZ
@@ -7826,7 +8131,6 @@
 693007360,693008383,NE
 693008384,693009407,CF
 693009408,693010431,GH
-693010432,693011455,ZA
 693011456,693012479,SZ
 693012480,693013503,TG
 693013504,693014527,ZA
@@ -7956,7 +8260,6 @@
 696928256,696930303,BW
 696930304,696932351,RW
 696932352,696933375,BJ
-696933376,696934399,TZ
 696934400,696942591,BF
 696942592,696950783,MR
 696950784,696958975,NG
@@ -7997,9 +8300,8 @@
 700284928,700293119,GH
 700293120,700301311,EG
 700301312,700309503,CD
-700309504,700314367,DJ
-700314368,700314623,US
-700314624,700317695,DJ
+700309504,700313599,DJ
+700313600,700317695,US
 700317696,700325887,NG
 700325888,700334079,ZW
 700334080,700335103,BJ
@@ -8015,7 +8317,6 @@
 700366848,700375039,UG
 700375040,700376063,CM
 700376064,700377087,NE
-700377088,700378111,KE
 700378112,700379135,MG
 700379136,700380159,NG
 700380160,700381183,BW
@@ -8040,8 +8341,7 @@
 700414976,700432383,ZA
 700432384,700434431,KE
 700434432,700436479,LS
-700436480,700438527,UG
-700438528,700442623,KE
+700440576,700442623,KE
 700442624,700444671,ZW
 700444672,700446719,GH
 700446720,700447743,SL
@@ -8474,8 +8774,9 @@
 772886528,772888575,FR
 772888576,772890623,GB
 772890624,772892671,RU
-772892672,772892927,DE
-772892928,772892959,GB
+772892672,772892672,GB
+772892673,772892926,DE
+772892927,772894719,GB
 772894720,772896767,PL
 772896768,772898815,RS
 772898816,772900863,TR
@@ -8715,7 +9016,9 @@
 773304320,773308415,RU
 773308416,773312511,IT
 773312512,773316607,DE
-773316608,773320703,RU
+773316608,773318399,RU
+773318400,773318655,GB
+773318656,773320703,RU
 773320704,773324799,FR
 773324800,773586943,ES
 773586944,773588991,IT
@@ -8884,7 +9187,9 @@
 773834752,773836799,GB
 773836800,773838847,FR
 773838848,773840895,DE
-773840896,773847039,GB
+773840896,773843967,GB
+773843968,773844991,EU
+773844992,773847039,GB
 773847040,773849087,IT
 773849088,773857279,IR
 773857280,773865471,DK
@@ -9317,9 +9622,10 @@
 775094272,775127039,RO
 775127040,775149566,IE
 775149567,775149567,NL
-775149568,775157759,IE
-775157760,775159551,JP
-775159552,775159807,IE
+775149568,775149764,IE
+775149765,775149765,SG
+775149766,775151615,IE
+775151616,775159807,JP
 775159808,775192575,SA
 775192576,775225343,RU
 775225344,775258111,SY
@@ -10135,7 +10441,9 @@
 778679104,778679123,PL
 778679124,778679127,FR
 778679128,778679151,DE
-778679152,778679215,FR
+778679152,778679212,FR
+778679213,778679213,FI
+778679214,778679215,FR
 778679216,778679231,PT
 778679232,778679263,ES
 778679264,778679267,IT
@@ -11132,7 +11440,9 @@
 780729600,780729855,JM
 780729856,780730111,JO
 780730112,780730367,JP
-780730368,780779519,IE
+780730368,780756724,IE
+780756725,780756725,EU
+780756726,780779519,IE
 780779520,780783615,NL
 780783616,780785663,GB
 780785664,780787711,DE
@@ -11582,6 +11892,7 @@
 783775744,783777791,AL
 783777792,783779839,RU
 783779840,783781887,DK
+783781888,783783935,NL
 783783936,783785983,DE
 783785984,783788031,RU
 783788032,783790079,NO
@@ -12140,7 +12451,11 @@
 788523008,788525055,KZ
 788525056,788527103,IT
 788527104,788529151,GB
-788529152,795231487,CA
+788529152,792330239,CA
+792330240,792723455,ES
+792723456,793247743,CA
+793247744,793313279,NZ
+793313280,795231487,CA
 795231488,795231743,US
 795231744,795233023,CA
 795233024,795233279,US
@@ -12403,9 +12718,12 @@
 889192448,897238054,DE
 897238055,897238055,EU
 897238056,905969663,DE
-905969664,922157055,US
+905969664,921204905,US
+921204906,921204906,BR
+921204907,922157055,US
 922157056,922222591,IE
-922222592,956301311,US
+922222592,922353663,JP
+922353664,956301311,US
 956301312,959447039,EU
 959447040,959512575,US
 959512576,960629507,EU
@@ -12771,9 +13089,7 @@
 1024184320,1024188415,MY
 1024188416,1024196607,VN
 1024196608,1024229375,IN
-1024229376,1024255743,JP
-1024255744,1024255999,US
-1024256000,1024262143,JP
+1024229376,1024262143,JP
 1024262144,1024327679,SG
 1024327680,1024344063,US
 1024344064,1024352255,SG
@@ -18729,7 +19045,9 @@
 1049016848,1049016863,FR
 1049016864,1049017983,DE
 1049017984,1049018047,GE
-1049018048,1049020127,DE
+1049018048,1049018367,DE
+1049018368,1049018623,EU
+1049018624,1049020127,DE
 1049020128,1049020135,FR
 1049020136,1049021343,DE
 1049021344,1049021375,US
@@ -18963,7 +19281,9 @@
 1049985024,1050017791,IT
 1050017792,1050041087,KW
 1050041088,1050041599,US
-1050041600,1050083327,KW
+1050041600,1050047994,KW
+1050047995,1050047995,US
+1050047996,1050083327,KW
 1050083328,1050148863,ES
 1050148864,1050157055,CY
 1050157056,1050173439,RU
@@ -21499,9 +21819,7 @@
 1062222976,1062223039,PH
 1062223040,1062244311,US
 1062244312,1062244319,PH
-1062244320,1062250495,US
-1062250496,1062251519,UM
-1062251520,1062262783,US
+1062244320,1062262783,US
 1062262784,1062263039,PH
 1062263040,1062378767,US
 1062378768,1062378783,CA
@@ -21833,7 +22151,9 @@
 1070729472,1070729727,CA
 1070729728,1070805559,US
 1070805560,1070805567,VG
-1070805568,1071100159,US
+1070805568,1070849407,US
+1070849408,1070849423,A1
+1070849424,1071100159,US
 1071100160,1071100415,PR
 1071100416,1071100927,US
 1071100928,1071101951,PR
@@ -21842,7 +22162,9 @@
 1071136768,1071141887,US
 1071141888,1071142911,HK
 1071142912,1071144959,US
-1071144960,1071151103,GB
+1071144960,1071149200,GB
+1071149201,1071149201,LB
+1071149202,1071151103,GB
 1071151104,1071153151,LB
 1071153152,1071157247,US
 1071157248,1071158271,SG
@@ -22134,7 +22456,9 @@
 1072938240,1072938495,VG
 1072938496,1072938751,CA
 1072938752,1072939007,US
-1072939008,1072939519,CA
+1072939008,1072939263,CA
+1072939264,1072939311,US
+1072939312,1072939519,CA
 1072939520,1072940031,US
 1072940032,1072955391,CA
 1072955392,1073022975,US
@@ -25897,9 +26221,7 @@
 1086476608,1086910335,US
 1086910336,1086910463,LB
 1086910464,1086922751,US
-1086922752,1086923007,CA
-1086923008,1086923263,NG
-1086923264,1086930943,CA
+1086922752,1086930943,CA
 1086930944,1086941831,US
 1086941832,1086941835,CA
 1086941836,1086942079,US
@@ -25926,7 +26248,9 @@
 1087444224,1087444479,GB
 1087444480,1087464945,US
 1087464946,1087464949,GB
-1087464950,1087467291,US
+1087464950,1087466489,US
+1087466490,1087466493,GB
+1087466494,1087467291,US
 1087467292,1087467295,BR
 1087467296,1087495519,US
 1087495520,1087495535,TW
@@ -26030,7 +26354,9 @@
 1089058304,1089058439,TW
 1089058440,1089058440,EU
 1089058441,1089058559,TW
-1089058560,1089154847,US
+1089058560,1089153535,US
+1089153536,1089153791,A1
+1089153792,1089154847,US
 1089154848,1089154855,VE
 1089154856,1089154915,US
 1089154916,1089154932,AU
@@ -26200,7 +26526,11 @@
 1090146304,1090150399,CA
 1090150400,1090172495,US
 1090172496,1090172511,GB
-1090172512,1090207743,US
+1090172512,1090195086,US
+1090195087,1090195087,A1
+1090195088,1090197111,US
+1090197112,1090197112,A1
+1090197113,1090207743,US
 1090207744,1090215935,CA
 1090215936,1090355199,US
 1090355200,1090356327,CA
@@ -26238,9 +26568,7 @@
 1090448256,1090453503,CA
 1090453504,1090497903,US
 1090497904,1090497919,AU
-1090497920,1090499583,US
-1090499584,1090499839,A2
-1090499840,1091683357,US
+1090497920,1091683357,US
 1091683358,1091683367,GB
 1091683368,1091683407,US
 1091683408,1091683417,BE
@@ -26786,7 +27114,13 @@
 1094565888,1094568046,CA
 1094568047,1094568061,MO
 1094568062,1094582271,CA
-1094582272,1095314943,US
+1094582272,1094662271,US
+1094662272,1094662303,CN
+1094662304,1094669635,US
+1094669636,1094669639,HK
+1094669640,1094670795,US
+1094670796,1094670799,CN
+1094670800,1095314943,US
 1095314944,1095314944,A1
 1095314945,1095450623,US
 1095450624,1095467007,BS
@@ -27353,7 +27687,7 @@
 1106814976,1107220223,US
 1107220224,1107220239,FI
 1107220240,1107240191,US
-1107240192,1107240447,A1
+1107240192,1107240447,A2
 1107240448,1107241215,US
 1107241216,1107241343,CN
 1107241344,1107241471,US
@@ -27761,7 +28095,9 @@
 1112432640,1112440831,CA
 1112440832,1112530943,US
 1112530944,1112539135,CA
-1112539136,1112900287,US
+1112539136,1112899769,US
+1112899770,1112899770,A1
+1112899771,1112900287,US
 1112900288,1112900351,GB
 1112900352,1112900711,US
 1112900712,1112900719,MV
@@ -28139,7 +28475,9 @@
 1117829376,1117829631,GR
 1117829632,1117831359,US
 1117831360,1117831423,A2
-1117831424,1117978623,US
+1117831424,1117964727,US
+1117964728,1117964735,UM
+1117964736,1117978623,US
 1117978624,1117979503,CA
 1117979504,1117979519,US
 1117979520,1117982639,CA
@@ -28416,9 +28754,7 @@
 1118796544,1118796799,GB
 1118796800,1118797063,US
 1118797064,1118797071,CR
-1118797072,1118819327,US
-1118819328,1118820607,A1
-1118820608,1118961663,US
+1118797072,1118961663,US
 1118961664,1118962831,A2
 1118962832,1118962839,SA
 1118962840,1118962847,NG
@@ -29092,7 +29428,9 @@
 1120380272,1120380415,US
 1120380416,1120380431,VG
 1120380432,1120380447,CA
-1120380448,1120380479,US
+1120380448,1120380453,US
+1120380454,1120380454,CA
+1120380455,1120380479,US
 1120380480,1120380639,CA
 1120380640,1120380655,US
 1120380656,1120380659,CA
@@ -33186,7 +33524,9 @@
 1160974592,1160974623,HK
 1160974624,1161019391,US
 1161019392,1161035775,CA
-1161035776,1161293823,US
+1161035776,1161052671,US
+1161052672,1161052927,GB
+1161052928,1161293823,US
 1161293824,1161297919,CA
 1161297920,1161298303,US
 1161298304,1161298311,IL
@@ -35083,9 +35423,9 @@
 1177164864,1177164895,CA
 1177164896,1177164927,US
 1177164928,1177164943,CA
-1177164944,1177165058,US
-1177165059,1177165059,A1
-1177165060,1177165311,US
+1177164944,1177165055,US
+1177165056,1177165087,CA
+1177165088,1177165311,US
 1177165312,1177165823,CA
 1177165824,1177167743,US
 1177167744,1177167751,LB
@@ -37543,9 +37883,7 @@
 1247072720,1247072735,NL
 1247072736,1247073791,US
 1247073792,1247074303,A2
-1247074304,1247087871,US
-1247087872,1247088127,A1
-1247088128,1247123455,US
+1247074304,1247123455,US
 1247123456,1247123711,GB
 1247123712,1247123967,US
 1247123968,1247124223,LU
@@ -37840,7 +38178,12 @@
 1249460672,1249460687,CA
 1249460688,1249474559,US
 1249474560,1249475583,CA
-1249475584,1249484799,US
+1249475584,1249479167,US
+1249479168,1249479423,FR
+1249479424,1249479679,US
+1249479680,1249479935,CH
+1249479936,1249480191,HK
+1249480192,1249484799,US
 1249484800,1249486847,CA
 1249486848,1249492735,US
 1249492736,1249492991,CA
@@ -39327,7 +39670,19 @@
 1280098304,1280102399,PR
 1280102400,1280131071,US
 1280131072,1280139263,CA
-1280139264,1287611402,US
+1280139264,1286389759,US
+1286389760,1286390271,A1
+1286390272,1286390527,US
+1286390528,1286390783,A1
+1286390784,1286391295,US
+1286391296,1286391807,A1
+1286391808,1286393855,US
+1286393856,1286394623,A1
+1286394624,1286395391,US
+1286395392,1286396159,A1
+1286396160,1286398975,US
+1286398976,1286399487,A1
+1286399488,1287611402,US
 1287611403,1287611403,A1
 1287611404,1287612122,US
 1287612123,1287612136,SE
@@ -39618,8 +39973,22 @@
 1296594944,1296596991,RU
 1296596992,1296599039,DE
 1296599040,1296601087,RU
-1296601088,1296603135,DE
-1296603136,1296605183,NL
+1296601088,1296601247,DE
+1296601248,1296601263,NL
+1296601264,1296601271,DE
+1296601272,1296601343,NL
+1296601344,1296601407,DE
+1296601408,1296601599,NL
+1296601600,1296601615,DE
+1296601616,1296601631,NL
+1296601632,1296601663,DE
+1296601664,1296601727,NL
+1296601728,1296601735,DE
+1296601736,1296601744,NL
+1296601745,1296601751,DE
+1296601752,1296602112,NL
+1296602113,1296602447,DE
+1296602448,1296605183,NL
 1296605184,1296606271,AT
 1296606272,1296606335,DE
 1296606336,1296606367,AT
@@ -40102,7 +40471,10 @@
 1307069696,1307069919,DE
 1307069920,1307074559,EU
 1307074560,1307082751,SA
-1307082752,1307090943,RU
+1307082752,1307092991,RU
+1307092992,1307095039,GB
+1307095040,1307097087,SA
+1307097088,1307099135,RU
 1307099136,1307107327,RO
 1307107328,1307115519,DE
 1307115520,1307123711,RU
@@ -42891,7 +43263,9 @@
 1347210936,1347211111,GB
 1347211112,1347211119,IE
 1347211120,1347215359,GB
-1347215360,1347219967,RU
+1347215360,1347219644,RU
+1347219645,1347219645,KW
+1347219646,1347219967,RU
 1347219968,1347220479,US
 1347220480,1347222015,RU
 1347222016,1347222271,US
@@ -43254,8 +43628,7 @@
 1347452928,1347455930,BG
 1347455931,1347455931,A1
 1347455932,1347461119,BG
-1347461120,1347461375,US
-1347461376,1347462579,AL
+1347461120,1347462579,AL
 1347462580,1347462583,RS
 1347462584,1347462591,AL
 1347462592,1347462607,RS
@@ -43934,7 +44307,9 @@
 1352010240,1352010495,US
 1352010496,1352011447,DE
 1352011448,1352011455,IT
-1352011456,1352038695,DE
+1352011456,1352031618,DE
+1352031619,1352031619,EU
+1352031620,1352038695,DE
 1352038696,1352038699,US
 1352038700,1352041471,DE
 1352041472,1352041727,US
@@ -44504,7 +44879,8 @@
 1357340160,1357340415,DE
 1357340416,1357342719,GB
 1357342720,1357342975,PL
-1357342976,1357344767,EU
+1357342976,1357343231,GB
+1357343232,1357344767,EU
 1357344768,1357346815,CA
 1357346816,1357347839,FR
 1357347840,1357348095,PL
@@ -44812,7 +45188,7 @@
 1357900544,1357900799,NL
 1357900800,1357901823,DE
 1357901824,1357902335,EU
-1357902336,1357902847,A2
+1357902336,1357902847,PL
 1357902848,1357903359,GB
 1357903360,1357903615,DE
 1357903616,1357904383,EU
@@ -45388,9 +45764,10 @@
 1358843904,1358847999,MT
 1358848000,1358856191,RU
 1358856192,1358860287,DE
-1358860288,1358861311,GB
-1358861312,1358861567,EU
-1358861568,1358861823,DE
+1358860288,1358860835,GB
+1358860836,1358860836,EU
+1358860837,1358861311,GB
+1358861312,1358861823,DE
 1358861824,1358862335,FR
 1358862336,1358862847,US
 1358862848,1358863103,DK
@@ -45861,6 +46238,8 @@
 1360576512,1360580607,GB
 1360580608,1360584703,UA
 1360584704,1360588799,IT
+1360588800,1360590847,RS
+1360590848,1360592895,IE
 1360592896,1360596991,RU
 1360596992,1360601087,CZ
 1360601088,1360605183,BY
@@ -46007,7 +46386,8 @@
 1361035264,1361035627,US
 1361035628,1361035631,DZ
 1361035632,1361039359,US
-1361039360,1361043455,PL
+1361039360,1361041407,IE
+1361041408,1361043455,PL
 1361043456,1361051647,IR
 1361051648,1362100223,ES
 1362100224,1362395135,FR
@@ -47197,6 +47577,22 @@
 1368440320,1369440255,GB
 1369440256,1369473023,DE
 1369473024,1369505791,HU
+1369505792,1369509887,RO
+1369509888,1369518079,RU
+1369518080,1369520127,RO
+1369520128,1369520639,LI
+1369520640,1369520895,FR
+1369520896,1369521151,RO
+1369521152,1369521663,SK
+1369521664,1369521919,PL
+1369521920,1369522175,RU
+1369522176,1369530367,CZ
+1369530368,1369530879,DK
+1369530880,1369531391,RU
+1369531392,1369534975,PL
+1369534976,1369535231,RU
+1369535232,1369535487,AT
+1369535488,1369538559,RU
 1369538560,1369554943,DK
 1369554944,1369559039,PL
 1369559040,1369563135,RU
@@ -47305,7 +47701,8 @@
 1371996672,1371996927,GA
 1371996928,1371997183,A2
 1371997184,1371997439,KE
-1371997440,1371998207,NG
+1371997440,1371997695,A2
+1371997696,1371998207,NG
 1371998208,1371998463,CD
 1371998464,1371998719,NG
 1371998720,1372000255,A2
@@ -47531,7 +47928,9 @@
 1375081216,1375207423,BE
 1375207424,1375268095,FR
 1375268096,1375268351,RE
-1375268352,1375731711,FR
+1375268352,1375705984,FR
+1375705985,1375705985,EU
+1375705986,1375731711,FR
 1375731712,1375798335,GB
 1375798336,1375798351,IE
 1375798352,1375852543,GB
@@ -48076,7 +48475,7 @@
 1385275392,1385283583,IT
 1385283584,1385285631,DE
 1385285632,1385287679,GB
-1385287680,1385291775,A2
+1385287680,1385291775,EU
 1385291776,1385299967,TR
 1385299968,1385308159,BG
 1385308160,1385309439,BE
@@ -49760,6 +50159,9 @@
 1406861312,1406869503,RU
 1406869504,1406877695,GB
 1406877696,1406885887,NL
+1406885888,1406887935,RO
+1406887936,1406889983,DE
+1406889984,1406894079,CH
 1406894080,1406902271,RU
 1406902272,1406910463,AT
 1406910464,1406918655,SE
@@ -51337,215 +51739,7 @@
 1410711552,1410719743,BG
 1410719744,1410727935,RU
 1410727936,1410736127,BG
-1410736128,1410736383,AL
-1410736384,1410736384,RS
-1410736385,1410736638,AL
-1410736639,1410736639,RS
-1410736640,1410736751,AL
-1410736752,1410736767,RS
-1410736768,1410736895,AL
-1410736896,1410736896,RS
-1410736897,1410736911,AL
-1410736912,1410736928,RS
-1410736929,1410737407,AL
-1410737408,1410737415,RS
-1410737416,1410737423,AL
-1410737424,1410737431,RS
-1410737432,1410737439,AL
-1410737440,1410737535,RS
-1410737536,1410737663,AL
-1410737664,1410737664,RS
-1410737665,1410737918,AL
-1410737919,1410737920,RS
-1410737921,1410738174,AL
-1410738175,1410738175,RS
-1410738176,1410738215,AL
-1410738216,1410738223,RS
-1410738224,1410738247,AL
-1410738248,1410738263,RS
-1410738264,1410738295,AL
-1410738296,1410738304,RS
-1410738305,1410738310,AL
-1410738311,1410738320,RS
-1410738321,1410738326,AL
-1410738327,1410738328,RS
-1410738329,1410738334,AL
-1410738335,1410738351,RS
-1410738352,1410738359,AL
-1410738360,1410738384,RS
-1410738385,1410738390,AL
-1410738391,1410738431,RS
-1410738432,1410738447,AL
-1410738448,1410738559,RS
-1410738560,1410738718,AL
-1410738719,1410738720,RS
-1410738721,1410738734,AL
-1410738735,1410738735,RS
-1410738736,1410738751,AL
-1410738752,1410738752,RS
-1410738753,1410738766,AL
-1410738767,1410738768,RS
-1410738769,1410738782,AL
-1410738783,1410738800,RS
-1410738801,1410738814,AL
-1410738815,1410738816,RS
-1410738817,1410738830,AL
-1410738831,1410738832,RS
-1410738833,1410738846,AL
-1410738847,1410738864,RS
-1410738865,1410738878,AL
-1410738879,1410738896,RS
-1410738897,1410738902,AL
-1410738903,1410738912,RS
-1410738913,1410738927,AL
-1410738928,1410738943,RS
-1410738944,1410738967,AL
-1410738968,1410739023,RS
-1410739024,1410739031,AL
-1410739032,1410739200,RS
-1410739201,1410739326,AL
-1410739327,1410739328,RS
-1410739329,1410739390,AL
-1410739391,1410739391,RS
-1410739392,1410739471,AL
-1410739472,1410739472,RS
-1410739473,1410739486,AL
-1410739487,1410739520,RS
-1410739521,1410739534,AL
-1410739535,1410739543,RS
-1410739544,1410739550,AL
-1410739551,1410739568,RS
-1410739569,1410739582,AL
-1410739583,1410739583,RS
-1410739584,1410739599,AL
-1410739600,1410739616,RS
-1410739617,1410739630,AL
-1410739631,1410739647,RS
-1410739648,1410739679,AL
-1410739680,1410739696,RS
-1410739697,1410739710,AL
-1410739711,1410739712,RS
-1410739713,1410739719,AL
-1410739720,1410739720,RS
-1410739721,1410739727,AL
-1410739728,1410739728,RS
-1410739729,1410739734,AL
-1410739735,1410739736,RS
-1410739737,1410739742,AL
-1410739743,1410739744,RS
-1410739745,1410739750,AL
-1410739751,1410739752,RS
-1410739753,1410739759,AL
-1410739760,1410739776,RS
-1410739777,1410739783,AL
-1410739784,1410739791,RS
-1410739792,1410739799,AL
-1410739800,1410739807,RS
-1410739808,1410739879,AL
-1410739880,1410739887,RS
-1410739888,1410739919,AL
-1410739920,1410739927,RS
-1410739928,1410739959,AL
-1410739960,1410739967,RS
-1410739968,1410739995,AL
-1410739996,1410739999,RS
-1410740000,1410740003,AL
-1410740004,1410740007,RS
-1410740008,1410740043,AL
-1410740044,1410740047,RS
-1410740048,1410740122,AL
-1410740123,1410740123,RS
-1410740124,1410740171,AL
-1410740172,1410740175,RS
-1410740176,1410740238,AL
-1410740239,1410740239,RS
-1410740240,1410740335,AL
-1410740336,1410740343,RS
-1410740344,1410740471,AL
-1410740472,1410740479,RS
-1410740480,1410740507,AL
-1410740508,1410740511,RS
-1410740512,1410740515,AL
-1410740516,1410740519,RS
-1410740520,1410740591,AL
-1410740592,1410740595,RS
-1410740596,1410740643,AL
-1410740644,1410740647,RS
-1410740648,1410740675,AL
-1410740676,1410740679,RS
-1410740680,1410740695,AL
-1410740696,1410740699,RS
-1410740700,1410740734,AL
-1410740735,1410740735,RS
-1410740736,1410740759,AL
-1410740760,1410740767,RS
-1410740768,1410740871,AL
-1410740872,1410740879,RS
-1410740880,1410740911,AL
-1410740912,1410740919,RS
-1410740920,1410740931,AL
-1410740932,1410740935,RS
-1410740936,1410740943,AL
-1410740944,1410740991,RS
-1410740992,1410741303,AL
-1410741304,1410741304,RS
-1410741305,1410741311,AL
-1410741312,1410741327,RS
-1410741328,1410741343,AL
-1410741344,1410741351,RS
-1410741352,1410741463,AL
-1410741464,1410741471,RS
-1410741472,1410742279,AL
-1410742280,1410742287,RS
-1410742288,1410742303,AL
-1410742304,1410742319,RS
-1410742320,1410742351,AL
-1410742352,1410742359,RS
-1410742360,1410742415,AL
-1410742416,1410742527,RS
-1410742528,1410742907,AL
-1410742908,1410742911,RS
-1410742912,1410742923,AL
-1410742924,1410742927,RS
-1410742928,1410742931,AL
-1410742932,1410742939,RS
-1410742940,1410742952,AL
-1410742953,1410742955,RS
-1410742956,1410742963,AL
-1410742964,1410742971,RS
-1410742972,1410742975,AL
-1410742976,1410742979,RS
-1410742980,1410742996,AL
-1410742997,1410742999,RS
-1410743000,1410743059,AL
-1410743060,1410743063,RS
-1410743064,1410743075,AL
-1410743076,1410743079,RS
-1410743080,1410743095,AL
-1410743096,1410743107,RS
-1410743108,1410743111,AL
-1410743112,1410743119,RS
-1410743120,1410743127,AL
-1410743128,1410743295,RS
-1410743296,1410743551,AL
-1410743552,1410743775,RS
-1410743776,1410743783,AL
-1410743784,1410743807,RS
-1410743808,1410743967,AL
-1410743968,1410744031,RS
-1410744032,1410744063,AL
-1410744064,1410744083,RS
-1410744084,1410744087,AL
-1410744088,1410744107,RS
-1410744108,1410744119,AL
-1410744120,1410744135,RS
-1410744136,1410744139,AL
-1410744140,1410744155,RS
-1410744156,1410744163,AL
-1410744164,1410744167,RS
-1410744168,1410744171,AL
-1410744172,1410744191,RS
-1410744192,1410744319,AL
+1410736128,1410744319,RS
 1410744320,1410744575,FR
 1410744576,1410744831,A2
 1410744832,1410745087,FR
@@ -53597,7 +53791,7 @@
 1432092672,1432100863,RU
 1432100864,1432109055,CZ
 1432109056,1432117247,GB
-1432117248,1432117759,CY
+1432117248,1432125439,CY
 1432125440,1432131607,NL
 1432131608,1432131615,PH
 1432131616,1432131679,NL
@@ -53721,7 +53915,9 @@
 1433608192,1433610239,EU
 1433610240,1433612287,US
 1433612288,1433614335,GB
-1433614336,1433615359,DE
+1433614336,1433615027,DE
+1433615028,1433615028,EU
+1433615029,1433615359,DE
 1433615360,1433615871,FR
 1433615872,1433616383,GB
 1433616384,1433619455,AE
@@ -53770,6 +53966,7 @@
 1433837568,1433839615,DE
 1433839616,1433841663,GB
 1433841664,1433843711,RU
+1433843712,1433845759,HR
 1433845760,1433847807,BG
 1433847808,1433849855,SE
 1433849856,1433851903,BE
@@ -54396,7 +54593,7 @@
 1442791424,1442795519,LV
 1442795520,1442799615,DE
 1442799616,1442803711,LT
-1442803712,1442807807,UA
+1442803712,1442807807,RO
 1442807808,1442811903,BG
 1442811904,1442815999,AT
 1442816000,1442820095,BG
@@ -56267,8 +56464,8 @@
 1490049888,1490049919,CZ
 1490049920,1490049983,PL
 1490049984,1490053375,CZ
-1490053376,1490054400,PL
-1490054401,1490059263,CZ
+1490053376,1490054143,PL
+1490054144,1490059263,CZ
 1490059264,1490075647,DE
 1490075648,1490092031,GB
 1490092032,1490108415,DE
@@ -56770,6 +56967,7 @@
 1500218112,1500218367,CZ
 1500218368,1500219391,DE
 1500219392,1500219647,FR
+1500219648,1500221439,RU
 1500221440,1500223487,SK
 1500223488,1500225535,PL
 1500225536,1500227583,DE
@@ -58375,7 +58573,10 @@
 1533540352,1533542399,AT
 1533542400,1533607935,HU
 1533607936,1533640703,LV
-1533640704,1533657087,RU
+1533640704,1533659135,RU
+1533659136,1533661183,LV
+1533661184,1533663231,SE
+1533663232,1533665279,NL
 1533665280,1533667327,GB
 1533667328,1533669375,RU
 1533669376,1533671423,DE
@@ -59072,24 +59273,9 @@
 1534849024,1534853119,NL
 1534853120,1534918655,UA
 1534918656,1534984191,GB
-1534984192,1534989855,SE
-1534989856,1534990063,ES
-1534990064,1534990079,SE
-1534990080,1534990335,ES
-1534990336,1534999551,SE
-1534999552,1535004671,ES
-1535004672,1535006719,SE
-1535006720,1535007231,ES
-1535007232,1535008767,SE
-1535008768,1535014911,ES
-1535014912,1535017983,SE
-1535017984,1535019519,ES
-1535019520,1535020543,SE
-1535020544,1535021055,ES
-1535021056,1535022079,SE
-1535022080,1535023103,ES
-1535023104,1535024127,SE
-1535024128,1535049727,ES
+1534984192,1534985727,ES
+1534985728,1534986239,SE
+1534986240,1535049727,ES
 1535049728,1535115263,SK
 1535115264,1535197183,AT
 1535197184,1535246335,SE
@@ -60380,7 +60566,9 @@
 1539842048,1539844095,PL
 1539844096,1539846143,UA
 1539846144,1539847167,NL
-1539847168,1539849215,UA
+1539847168,1539849471,UA
+1539849472,1539849727,GB
+1539849728,1539850239,RU
 1539850240,1539851263,LV
 1539851264,1539852287,PL
 1539852288,1539853311,UA
@@ -60398,6 +60586,7 @@
 1539864576,1539865599,RO
 1539865600,1539866623,UA
 1539866624,1539867647,IT
+1539867648,1539868671,RO
 1539868672,1539869695,UA
 1539869696,1539870719,ES
 1539870720,1539871743,IL
@@ -60878,6 +61067,7 @@
 1540339712,1540340735,PL
 1540340736,1540341247,CZ
 1540341248,1540341759,BG
+1540341760,1540342271,GB
 1540342272,1540342783,UA
 1540342784,1540343295,ES
 1540343296,1540343807,GB
@@ -61820,6 +62010,7 @@
 1540714240,1540714495,RO
 1540714496,1540714751,NL
 1540714752,1540715263,RU
+1540715264,1540715519,NL
 1540715520,1540715775,DE
 1540715776,1540716031,UA
 1540716032,1540716287,PL
@@ -62136,6 +62327,7 @@
 1540906752,1540907007,BG
 1540907008,1540907263,RU
 1540907264,1540907519,MD
+1540907520,1540907775,TR
 1540907776,1540908031,PL
 1540908032,1540908287,NL
 1540908288,1540908543,DK
@@ -62828,6 +63020,8 @@
 1541225984,1541226495,LV
 1541226496,1541227007,UA
 1541227008,1541227519,FI
+1541227520,1541227775,RU
+1541227776,1541228031,NL
 1541228032,1541228543,RU
 1541228544,1541229055,CZ
 1541229056,1541229567,UA
@@ -63646,7 +63840,7 @@
 1541706752,1541707263,RU
 1541707264,1541707519,CH
 1541707520,1541707775,NL
-1541707776,1541708799,RU
+1541707776,1541708799,DE
 1541708800,1541709823,PL
 1541709824,1541710335,RU
 1541710336,1541710847,IL
@@ -64110,7 +64304,8 @@
 1541960192,1541960703,NL
 1541960704,1541961727,UA
 1541961728,1541962751,RU
-1541962752,1541963263,GB
+1541962752,1541963007,A1
+1541963008,1541963263,GB
 1541963264,1541963519,RU
 1541963520,1541964031,UA
 1541964032,1541964287,RU
@@ -64263,8 +64458,7 @@
 1542048768,1542049279,PL
 1542049280,1542049791,BE
 1542049792,1542050815,CZ
-1542050816,1542051071,CH
-1542051072,1542051327,RU
+1542050816,1542051327,RU
 1542051328,1542051839,LV
 1542051840,1542053887,RU
 1542053888,1542054399,NL
@@ -64546,6 +64740,7 @@
 1542223360,1542223871,UA
 1542223872,1542224127,RU
 1542224128,1542224383,UA
+1542224384,1542224639,DE
 1542224640,1542224895,DK
 1542224896,1542225151,RU
 1542225152,1542225407,PL
@@ -64683,8 +64878,7 @@
 1542303232,1542303743,EU
 1542303744,1542303999,GB
 1542304000,1542304255,FR
-1542304256,1542304511,RU
-1542304768,1542305279,RU
+1542304256,1542305279,RU
 1542305280,1542305791,UA
 1542305792,1542306047,FR
 1542306048,1542306303,GB
@@ -64797,12 +64991,13 @@
 1542375168,1542375423,BG
 1542375424,1542376447,RU
 1542376448,1542376959,BG
+1542376960,1542377215,DK
 1542377216,1542377471,RU
 1542377472,1542377983,GB
 1542377984,1542378495,RU
 1542378496,1542378751,DK
 1542378752,1542379007,RU
-1542379008,1542379519,GB
+1542379008,1542379519,A1
 1542379520,1542379775,PL
 1542379776,1542380031,RU
 1542380032,1542380287,RO
@@ -64834,6 +65029,7 @@
 1542393088,1542393343,BG
 1542393344,1542393599,IR
 1542393600,1542394879,RU
+1542394880,1542395135,DE
 1542395136,1542395391,ES
 1542395392,1542395647,RU
 1542395648,1542395903,AT
@@ -64852,12 +65048,17 @@
 1542402048,1542403071,RU
 1542403072,1542403327,CH
 1542403328,1542403583,UA
+1542403584,1542404095,IR
 1542404096,1542405375,RU
 1542405376,1542405631,PL
 1542405632,1542405887,GB
 1542405888,1542406143,RU
+1542406144,1542406655,ES
 1542406656,1542407167,PL
 1542407168,1542408191,RU
+1542408192,1542408703,GB
+1542408704,1542408959,UA
+1542408960,1542409215,CH
 1542409216,1542410239,UA
 1542410240,1542411263,RU
 1542411264,1542411519,DE
@@ -64936,6 +65137,7 @@
 1542446080,1542447871,RO
 1542447872,1542448639,RU
 1542448640,1542448895,RO
+1542448896,1542449151,AT
 1542449152,1542450175,UA
 1542450176,1542450687,CZ
 1542450688,1542451199,RU
@@ -64947,6 +65149,7 @@
 1542454272,1542454783,NO
 1542454784,1542455039,PL
 1542455040,1542455295,SE
+1542455296,1542455551,CH
 1542455552,1542455807,RO
 1542455808,1542456319,GB
 1542456320,1542456831,RO
@@ -65020,7 +65223,267 @@
 1542496768,1542497279,RU
 1542497280,1542497535,DE
 1542497536,1542497791,CZ
-1542498304,1542499327,RU
+1542497792,1542498303,IT
+1542498304,1542499583,RU
+1542499584,1542499839,ES
+1542499840,1542500095,GB
+1542500096,1542500351,UA
+1542500352,1542500607,GB
+1542500608,1542500863,RO
+1542500864,1542501119,GB
+1542501120,1542501375,RU
+1542501376,1542502399,IR
+1542502400,1542502655,RO
+1542502656,1542503423,DK
+1542503424,1542503679,RO
+1542503680,1542503935,DK
+1542503936,1542504447,UA
+1542504448,1542504703,GB
+1542504704,1542504959,PL
+1542504960,1542505215,SE
+1542505216,1542505471,NO
+1542505472,1542506495,PL
+1542506496,1542507007,NL
+1542507008,1542507263,RU
+1542507264,1542507519,CY
+1542507520,1542508543,NO
+1542508544,1542509567,RU
+1542509568,1542510079,CY
+1542510080,1542510591,RU
+1542510592,1542510847,SI
+1542510848,1542511103,DE
+1542511104,1542511871,RU
+1542511872,1542512127,GB
+1542512128,1542512383,RU
+1542512384,1542512639,PL
+1542512640,1542512895,GB
+1542512896,1542513151,RU
+1542513152,1542513663,GB
+1542513664,1542513919,FR
+1542513920,1542514175,GB
+1542514176,1542514687,IT
+1542514688,1542515199,RU
+1542515200,1542515711,IL
+1542515712,1542516223,RO
+1542516224,1542516735,PL
+1542516736,1542516991,NL
+1542516992,1542517247,FR
+1542517248,1542517759,RU
+1542517760,1542518015,UA
+1542518016,1542518271,SK
+1542518272,1542518783,LV
+1542518784,1542519807,PL
+1542519808,1542520319,SE
+1542520320,1542520575,PL
+1542520576,1542520831,BG
+1542520832,1542521343,GB
+1542521344,1542521599,PL
+1542521600,1542521855,PT
+1542521856,1542522111,UA
+1542522112,1542522367,PL
+1542522368,1542522879,NL
+1542522880,1542523903,CZ
+1542523904,1542525951,RU
+1542525952,1542526463,IR
+1542526464,1542526719,RU
+1542526720,1542526975,CZ
+1542526976,1542527999,PL
+1542528000,1542528255,LU
+1542528256,1542528511,NL
+1542528512,1542528767,BE
+1542528768,1542531583,PL
+1542531584,1542531839,FR
+1542531840,1542532095,RU
+1542532096,1542532351,DE
+1542532352,1542533119,RU
+1542533120,1542534143,PL
+1542534144,1542534399,DE
+1542534400,1542534655,HR
+1542534656,1542535167,DE
+1542535168,1542535423,GB
+1542535424,1542535679,FR
+1542535680,1542536191,RU
+1542536192,1542537215,PL
+1542537216,1542538239,LV
+1542538240,1542538751,RU
+1542538752,1542539007,GB
+1542539008,1542539263,UA
+1542539264,1542540287,DE
+1542540288,1542540799,IT
+1542540800,1542541055,GB
+1542541056,1542541311,BE
+1542541312,1542542335,UA
+1542542336,1542542847,RU
+1542542848,1542543359,GB
+1542543360,1542544383,RU
+1542544384,1542544639,IR
+1542544640,1542544895,UA
+1542544896,1542545407,GR
+1542545408,1542586367,UA
+1542586368,1542594559,AZ
+1542594560,1542597631,RU
+1542597632,1542598143,IR
+1542598144,1542599679,RO
+1542599680,1542600703,UA
+1542600704,1542602751,PL
+1542602752,1542627327,MD
+1542627328,1542627583,NL
+1542627584,1542627839,RU
+1542627840,1542628095,FR
+1542628096,1542630399,RU
+1542630400,1542630655,GB
+1542630656,1542630911,DE
+1542630912,1542631423,PL
+1542631424,1542635519,RU
+1542635520,1542637567,UA
+1542637568,1542639615,NO
+1542639616,1542640639,UA
+1542640640,1542640895,DE
+1542640896,1542641151,RU
+1542641152,1542641663,IN
+1542641664,1542641919,RO
+1542641920,1542642175,AE
+1542642176,1542642431,PL
+1542642432,1542642687,RU
+1542642688,1542643199,PL
+1542643200,1542643455,UA
+1542643456,1542643711,NL
+1542643712,1542660095,UA
+1542660096,1542668287,RU
+1542668288,1542668799,NL
+1542668800,1542669311,PL
+1542669312,1542669567,RU
+1542669568,1542669823,NO
+1542669824,1542670079,DE
+1542670080,1542670335,CH
+1542670336,1542671359,ES
+1542671360,1542671871,FR
+1542671872,1542672383,RS
+1542672384,1542681087,RU
+1542681088,1542681343,GB
+1542681344,1542683135,RU
+1542683136,1542683391,SK
+1542683392,1542683647,RS
+1542683648,1542684159,RU
+1542684160,1542684671,IR
+1542684672,1542692863,RU
+1542692864,1542696959,IR
+1542696960,1542701055,RU
+1542701056,1542709247,UA
+1542709248,1542717439,RU
+1542717440,1542733823,UA
+1542733824,1542734847,RU
+1542734848,1542735103,GB
+1542735104,1542735359,UA
+1542735360,1542735871,PL
+1542735872,1542742015,RU
+1542742016,1542746111,RO
+1542746112,1542747135,RU
+1542747136,1542747391,TR
+1542747392,1542747647,GB
+1542747648,1542748159,UA
+1542748160,1542749183,SK
+1542749184,1542749439,UA
+1542749440,1542749695,DE
+1542749696,1542749951,GB
+1542749952,1542758399,UA
+1542758400,1542763519,RU
+1542763520,1542763775,DE
+1542763776,1542764031,BG
+1542764032,1542764543,RU
+1542764544,1542766591,PL
+1542766592,1542770687,RU
+1542770688,1542774783,PL
+1542774784,1542775039,NL
+1542775040,1542775295,PL
+1542775296,1542775807,TR
+1542775808,1542776063,RU
+1542776064,1542776319,GB
+1542776320,1542776831,PL
+1542776832,1542777855,UA
+1542777856,1542778367,GB
+1542778368,1542778623,FR
+1542778624,1542778879,GB
+1542778880,1542780159,RU
+1542780416,1542780927,GB
+1542780928,1542781951,PL
+1542781952,1542782975,RU
+1542782976,1542791167,CZ
+1542791168,1542801407,RU
+1542801408,1542803455,UA
+1542803456,1542805503,PL
+1542805504,1542807551,RO
+1542807552,1542815743,UA
+1542815744,1542823935,RU
+1542823936,1542832127,RO
+1542832128,1542832383,BG
+1542832384,1542832639,SI
+1542832640,1542832895,LV
+1542832896,1542833151,GR
+1542833152,1542836735,RO
+1542836736,1542837247,RU
+1542837248,1542837503,GB
+1542837504,1542837759,UA
+1542837760,1542838015,RS
+1542838016,1542838271,DE
+1542838272,1542838783,UA
+1542838784,1542839039,DK
+1542839040,1542839295,PL
+1542839296,1542839551,DE
+1542839552,1542839807,UA
+1542839808,1542840063,CY
+1542840064,1542848511,UA
+1542848512,1542849535,RU
+1542849536,1542850559,UA
+1542850560,1542851583,GB
+1542851584,1542851839,BG
+1542851840,1542852095,LU
+1542852096,1542852351,KW
+1542852352,1542852607,PL
+1542852608,1542855167,RU
+1542855168,1542856191,GB
+1542856192,1542856703,RU
+1542856704,1542864895,UA
+1542864896,1542868991,PL
+1542868992,1542875135,RU
+1542875136,1542877183,PL
+1542877184,1542881279,RU
+1542881280,1542889471,UA
+1542889472,1542891519,RU
+1542891520,1542892543,PL
+1542892544,1542900223,RO
+1542900224,1542900479,DE
+1542900480,1542901759,RO
+1542901760,1542903807,PL
+1542903808,1542904319,RO
+1542904320,1542904575,IL
+1542904576,1542904831,RU
+1542904832,1542914047,UA
+1542914048,1542922239,RU
+1542922240,1542930431,UA
+1542930432,1542930943,CZ
+1542930944,1542931455,IR
+1542931456,1542932479,RU
+1542932480,1542932735,LV
+1542932736,1542932991,GB
+1542932992,1542933247,NO
+1542933248,1542933503,FR
+1542933504,1542938623,UA
+1542938624,1542950911,RU
+1542950912,1542951423,DE
+1542951424,1542951679,RO
+1542951680,1542951935,PL
+1542951936,1542955007,RU
+1542955008,1542963199,UA
+1542963200,1542970623,RU
+1542970624,1542970879,UA
+1542970880,1542971391,RU
+1542971392,1542972415,UA
+1542972416,1542973439,NO
+1542973440,1542975487,RU
+1542975488,1542977535,RO
+1542977536,1542978559,RU
+1542978560,1542978815,PL
 1543503872,1545601023,GB
 1545601024,1545673167,SE
 1545673168,1545673175,FI
@@ -65652,6 +66115,7 @@
 1566312448,1566314495,IE
 1566314496,1566316543,BE
 1566316544,1566317567,NO
+1566317568,1566318591,NL
 1566318592,1566320639,RU
 1566320640,1566321151,DE
 1566321152,1566321407,NL
@@ -66256,6 +66720,7 @@
 1571686400,1571688447,GB
 1571688448,1571690495,CH
 1571690496,1571691519,GE
+1571691520,1571692543,PL
 1571692544,1571694591,FR
 1571694592,1571696639,LU
 1571696640,1571700735,RU
@@ -66619,6 +67084,7 @@
 1572827136,1572829183,NO
 1572829184,1572831231,FI
 1572831232,1572831487,BH
+1572831488,1572833279,NL
 1572833280,1572835327,ES
 1572835328,1572837375,IE
 1572837376,1572839423,DK
@@ -67432,7 +67898,9 @@
 1582153728,1582170111,SA
 1582170112,1582186495,CH
 1582186496,1582194207,TR
-1582194208,1582194431,GB
+1582194208,1582194271,GB
+1582194272,1582194303,CY
+1582194304,1582194431,GB
 1582194432,1582202879,TR
 1582202880,1582219263,PL
 1582219264,1582252031,RU
@@ -67721,8 +68189,8 @@
 1585400064,1585400319,IL
 1585400320,1585400575,GB
 1585400576,1585400831,FR
-1585400832,1585401087,DE
-1585401088,1585401343,NL
+1585400832,1585401088,DE
+1585401089,1585401343,NL
 1585401344,1585401599,DE
 1585401600,1585401855,GB
 1585401856,1585403903,IT
@@ -67827,7 +68295,9 @@
 1586356224,1586372607,RU
 1586372608,1586380799,JO
 1586380800,1586388991,GB
-1586388992,1586397183,ES
+1586388992,1586389518,ES
+1586389519,1586389774,US
+1586389775,1586397183,ES
 1586397184,1586399231,LV
 1586399232,1586401279,RU
 1586401280,1586403327,IT
@@ -68267,7 +68737,9 @@
 1596456960,1596588031,PL
 1596588032,1596719103,BG
 1596719104,1596850175,IE
-1596850176,1596981247,CZ
+1596850176,1596901375,CZ
+1596901376,1596905471,BY
+1596905472,1596981247,CZ
 1596981248,1597243391,PL
 1597243392,1597505535,RU
 1597505536,1597767679,KZ
@@ -68365,8 +68837,8 @@
 1602230271,1602230271,DE
 1602230272,1602232319,DK
 1602232320,1602234367,CH
-1602234368,1602234591,FR
-1602234592,1602234623,GB
+1602234368,1602234607,FR
+1602234608,1602234623,GB
 1602234624,1602234703,FR
 1602234704,1602234848,GB
 1602234849,1602234895,FR
@@ -68455,9 +68927,7 @@
 1602351104,1602353151,CZ
 1602353152,1602355199,ES
 1602355200,1602357247,GB
-1602357248,1602357503,FR
-1602357504,1602357759,A1
-1602357760,1602359295,FR
+1602357248,1602359295,FR
 1602359296,1602361343,DE
 1602361344,1602363391,FI
 1602363392,1602365439,LV
@@ -68545,7 +69015,9 @@
 1602846720,1602879487,GE
 1602879488,1602895871,FR
 1602895872,1602896127,MQ
-1602896128,1602912255,FR
+1602896128,1602896924,FR
+1602896925,1602896925,RE
+1602896926,1602912255,FR
 1602912256,1603010559,RU
 1603010560,1603014655,FR
 1603014656,1603018751,RU
@@ -68554,7 +69026,9 @@
 1603026944,1603031039,SE
 1603031040,1603035135,RU
 1603035136,1603039231,SY
-1603039232,1603043327,RS
+1603039232,1603042559,RS
+1603042560,1603042687,A1
+1603042688,1603043327,RS
 1603043328,1603047423,IT
 1603047424,1603051519,RU
 1603051520,1603055615,JO
@@ -68570,7 +69044,9 @@
 1603080704,1603082751,DE
 1603082752,1603083007,ES
 1603083008,1603083263,UA
-1603083264,1603084031,DE
+1603083264,1603083567,DE
+1603083568,1603083823,LU
+1603083824,1603084031,DE
 1603084032,1603086847,IT
 1603086848,1603087103,DE
 1603087104,1603088383,IT
@@ -68893,7 +69369,9 @@
 1605124960,1605125119,GB
 1605125120,1605125247,US
 1605125248,1605125263,GB
-1605125264,1605125279,DE
+1605125264,1605125267,DE
+1605125268,1605125269,EU
+1605125270,1605125279,DE
 1605125280,1605125335,GB
 1605125336,1605125343,US
 1605125344,1605125375,GB
@@ -68909,7 +69387,9 @@
 1605128704,1605129215,GB
 1605129216,1605129727,US
 1605129728,1605130239,GB
-1605130240,1605130271,US
+1605130240,1605130244,US
+1605130245,1605130245,EU
+1605130246,1605130271,US
 1605130272,1605130295,GB
 1605130296,1605130303,US
 1605130304,1605130367,GB
@@ -69033,7 +69513,7 @@
 1607929856,1607930879,SE
 1607930880,1607933951,PL
 1607933952,1607934975,DE
-1607934976,1607935999,UA
+1607934976,1607937023,UA
 1607937024,1607938047,LV
 1607938048,1607939071,UA
 1607939072,1607940095,PL
@@ -69041,12 +69521,14 @@
 1607941120,1607942143,ES
 1607942144,1607944191,RU
 1607944192,1607945215,FR
+1607945216,1607946239,PL
 1607946240,1607947263,UA
 1607947264,1607948287,RU
 1607948288,1607949311,GB
 1607949312,1607950335,UA
 1607950336,1607952383,RU
 1607952384,1607953407,UA
+1607953408,1607954431,RU
 1607954432,1607956479,UA
 1607956480,1607957503,ES
 1607957504,1607958527,UA
@@ -69056,19 +69538,27 @@
 1607962624,1607963647,UA
 1607963648,1607965695,RU
 1607965696,1607966719,UA
+1607966720,1607967743,IR
 1607967744,1607968767,UA
 1607968768,1607969791,SE
+1607969792,1607970047,RU
+1607970048,1607970303,IR
+1607970304,1607970815,GB
 1607970816,1607972863,RU
 1607972864,1607974911,NL
 1607974912,1607976959,PL
 1607976960,1607980031,RU
 1607980032,1607981055,DE
 1607981056,1607982079,UA
+1607982080,1607982847,RO
+1607982848,1607983103,UA
 1607983104,1607984127,GB
+1607984128,1607985151,RU
 1607985152,1607986175,PL
 1607986176,1607987199,UA
+1607987200,1607988223,CZ
 1607988224,1607989247,KG
-1607990272,1607991295,RU
+1607989248,1607991295,RU
 1607991296,1608122367,UA
 1608122368,1608253439,RO
 1608253440,1608384511,RU
@@ -69204,7 +69694,9 @@
 1632358656,1632358775,CA
 1632358776,1632358783,US
 1632358784,1632362495,CA
-1632362496,1634414591,US
+1632362496,1632587007,US
+1632587008,1632587263,A1
+1632587264,1634414591,US
 1634414592,1634418687,CA
 1634418688,1634447359,US
 1634447360,1634451455,CA
@@ -70248,7 +70740,9 @@
 1728346112,1728346367,AU
 1728346368,1728346623,NZ
 1728346624,1728347135,AU
-1728347136,1728348159,SG
+1728347136,1728347147,SG
+1728347148,1728347148,AP
+1728347149,1728348159,SG
 1728348160,1728349183,VN
 1728349184,1728349951,AU
 1728349952,1728350207,NP
@@ -70662,7 +71156,6 @@
 1728734208,1728735231,SG
 1728735232,1728736255,ID
 1728736256,1728736511,HK
-1728736512,1728736767,IN
 1728736768,1728737023,ID
 1728737024,1728737279,CN
 1728737280,1728738303,JP
@@ -70817,6 +71310,48 @@
 1728869376,1728870399,IN
 1728870400,1728871423,PK
 1728871424,1728872447,IN
+1728872448,1728873471,AU
+1728873472,1728874495,IN
+1728874496,1728875519,CN
+1728875520,1728876543,HK
+1728876544,1728877567,MY
+1728877568,1728878591,HK
+1728878592,1728879615,MY
+1728879616,1728880127,IN
+1728880128,1728880383,JP
+1728880384,1728880639,MY
+1728880640,1728881663,KH
+1728881664,1728881919,ID
+1728881920,1728882175,AU
+1728882176,1728882431,BD
+1728882432,1728882687,ID
+1728882688,1728883711,IN
+1728883712,1728885759,BD
+1728885760,1728886783,JP
+1728886784,1728887807,CN
+1728887808,1728888831,AU
+1728888832,1728889855,IN
+1728889856,1728890879,JP
+1728890880,1728891903,SG
+1728891904,1728892927,BD
+1728892928,1728893439,BN
+1728893440,1728893695,SG
+1728893696,1728893951,IN
+1728893952,1728894975,SG
+1728894976,1728895999,HK
+1728896000,1728897023,ID
+1728897024,1728898047,JP
+1728898048,1728899071,BD
+1728899072,1728900095,CN
+1728900096,1728901119,BD
+1728901120,1728901375,ID
+1728901376,1728901631,AU
+1728901632,1728902143,ID
+1728902144,1728902399,SG
+1728902400,1728902655,IN
+1728902656,1728902911,MY
+1728902912,1728903167,BD
+1728903168,1728905215,KR
 1728905216,1728905471,FJ
 1728905472,1728905727,PK
 1728905728,1728907263,IN
@@ -70832,9 +71367,54 @@
 1728919552,1728920575,AU
 1728920576,1728921599,JP
 1728921600,1728922623,AF
-1728922624,1728924671,AU
+1728922624,1728924415,AU
+1728924416,1728924671,MY
 1728924672,1728925695,VN
-1728925696,1728926719,AU
+1728925696,1728927743,AU
+1728927744,1728928767,LA
+1728928768,1728929791,JP
+1728929792,1728930815,IN
+1728930816,1728931839,AU
+1728931840,1728932863,JP
+1728932864,1728933887,IN
+1728933888,1728934911,JP
+1728934912,1728935935,NZ
+1728935936,1728936959,MY
+1728936960,1728937983,CN
+1728937984,1728939007,SG
+1728939008,1728939519,MY
+1728939520,1728939775,PH
+1728939776,1728940031,IN
+1728940032,1728942079,JP
+1728942080,1728943103,CN
+1728943104,1728944127,BD
+1728944128,1728945151,JP
+1728945152,1728946175,BD
+1728946176,1728947199,KR
+1728947200,1728949247,JP
+1728949248,1728950271,SG
+1728950272,1728950783,HK
+1728950784,1728951551,IN
+1728951552,1728951807,ID
+1728951808,1728952063,SG
+1728952064,1728952319,IN
+1728952320,1728953343,AU
+1728953344,1728954367,HK
+1728954368,1728955391,JP
+1728955392,1728956415,CN
+1728956416,1728957439,ID
+1728957440,1728959487,JP
+1728959488,1728960511,TH
+1728960512,1728961279,AU
+1728961280,1728961535,IN
+1728961536,1728962559,JP
+1728962560,1728963583,BD
+1728963584,1728964607,TH
+1728964608,1728965631,HK
+1728965632,1728966655,BD
+1728966656,1728967679,IN
+1728967680,1728968703,CN
+1728968704,1728970751,JP
 1728970752,1728971007,FJ
 1728971008,1728971263,AU
 1728971264,1728971519,IN
@@ -70856,6 +71436,119 @@
 1728982784,1728985087,AU
 1728985088,1728986111,TW
 1728986112,1728987135,PH
+1728987136,1728988159,AU
+1728988160,1728989183,NZ
+1728989184,1728990207,BD
+1728990208,1728991231,SG
+1728991232,1728992255,BD
+1728992256,1728993279,CN
+1728993280,1728994303,PG
+1728994304,1728995327,AU
+1728995328,1728996095,IN
+1728996096,1728996351,SG
+1728996352,1728997375,HK
+1728997376,1728998399,PH
+1728998400,1728998655,ID
+1728998656,1728998911,BD
+1728998912,1728999423,ID
+1728999424,1729000447,CN
+1729000448,1729001471,HK
+1729001472,1729003519,IN
+1729003520,1729004543,BD
+1729004544,1729006591,CN
+1729006592,1729007615,NZ
+1729007616,1729008639,HK
+1729008640,1729010687,JP
+1729010688,1729011711,CN
+1729011712,1729012735,IN
+1729012736,1729013759,TH
+1729013760,1729014783,NZ
+1729014784,1729015807,AU
+1729015808,1729016831,JP
+1729016832,1729017855,IN
+1729017856,1729018111,MY
+1729018112,1729018367,SG
+1729018368,1729018879,AU
+1729018880,1729019903,IN
+1729019904,1729020159,ID
+1729020160,1729020415,BD
+1729020416,1729020671,PH
+1729020672,1729020927,ID
+1729020928,1729021951,JP
+1729021952,1729022975,AU
+1729022976,1729023999,BD
+1729024000,1729025023,IN
+1729025024,1729026047,SG
+1729026048,1729027071,NZ
+1729027072,1729028095,HK
+1729028096,1729029119,SG
+1729029120,1729029375,AU
+1729029376,1729029631,ID
+1729029632,1729029887,AU
+1729029888,1729030143,PK
+1729030144,1729031167,IN
+1729031168,1729032191,SG
+1729032192,1729033215,CN
+1729033216,1729034239,SG
+1729034240,1729035263,KH
+1729035264,1729036287,AU
+1729036288,1729037311,JP
+1729037312,1729039359,CN
+1729039360,1729040383,JP
+1729040384,1729041407,CN
+1729041408,1729044479,HK
+1729044480,1729045503,JP
+1729045504,1729046015,ID
+1729046016,1729046271,HK
+1729046272,1729046527,JP
+1729046528,1729047551,BD
+1729047552,1729048575,AU
+1729048576,1729049599,VN
+1729049600,1729050623,IN
+1729050624,1729051647,JP
+1729051648,1729053695,IN
+1729053696,1729054719,JP
+1729054720,1729055231,AU
+1729055232,1729055487,IN
+1729055488,1729055743,NZ
+1729055744,1729056767,JP
+1729056768,1729057791,IN
+1729057792,1729058815,HK
+1729058816,1729059839,TH
+1729059840,1729060863,JP
+1729060864,1729061887,CN
+1729061888,1729062911,SG
+1729062912,1729063935,MY
+1729063936,1729064959,JP
+1729064960,1729065983,PG
+1729065984,1729067007,JP
+1729067008,1729068031,HK
+1729068032,1729068287,IN
+1729068288,1729068543,SG
+1729068544,1729069055,NZ
+1729069056,1729070079,AU
+1729070080,1729071103,HK
+1729071104,1729072127,MY
+1729072128,1729072895,BD
+1729072896,1729073151,ID
+1729073152,1729074175,TH
+1729074176,1729075199,AU
+1729075200,1729076223,NZ
+1729076224,1729076735,AU
+1729076736,1729076991,HK
+1729076992,1729077247,IN
+1729077248,1729078271,JP
+1729078272,1729079295,BD
+1729079296,1729080319,AU
+1729080320,1729081343,ID
+1729081344,1729081599,IN
+1729081600,1729082111,AU
+1729082368,1729084415,HK
+1729084416,1729085439,JP
+1729085440,1729087487,HK
+1729087488,1729088511,CN
+1729088512,1729090559,AU
+1729090560,1729091583,JP
 1729495040,1729519615,CN
 1729519616,1729520639,HK
 1729520640,1729527807,CN
@@ -71144,7 +71837,8 @@
 1744218368,1744218623,ID
 1744218624,1744219135,IN
 1744219136,1744220159,PH
-1744220160,1744221183,HK
+1744220160,1744220927,HK
+1744220928,1744221183,JP
 1744221184,1744222207,NZ
 1744222208,1744222719,ID
 1744222720,1744223231,AU
@@ -71166,8 +71860,8 @@
 1744235520,1744236543,KR
 1744236544,1744237567,IN
 1744237568,1744238591,HK
-1744238592,1744239103,US
-1744239104,1744239615,NZ
+1744238592,1744238847,US
+1744238848,1744239615,NZ
 1744239616,1744240639,JP
 1744240640,1744241663,AU
 1744241664,1744242687,JP
@@ -71237,6 +71931,14 @@
 1744304128,1744305151,AU
 1744305152,1744306175,PH
 1769996288,1772093439,MA
+1776680960,1776812031,KE
+1776812032,1776877567,NA
+1776877568,1776943103,ZA
+1777061888,1777063935,SD
+1777063936,1777065983,MZ
+1777065984,1777070079,GQ
+1777070080,1777074175,BW
+1777074176,1777139711,ZA
 1777205248,1777336319,SD
 1777336320,1778384895,ZA
 1778384896,1778385151,CN
@@ -71357,76 +72059,13 @@
 1796325632,1796514244,US
 1796514245,1796514245,A1
 1796514246,1803550719,US
-1807745024,1815805951,US
-1815805952,1815806207,FR
+1807745024,1815806207,US
 1815806208,1815806463,A1
-1815806464,1815806527,US
-1815806528,1815806559,GB
-1815806560,1815806719,US
-1815806720,1815806847,GB
-1815806848,1815806917,US
-1815806918,1815806925,AR
-1815806926,1815807103,US
-1815807104,1815807135,SC
-1815807136,1815807199,US
-1815807200,1815807231,GB
-1815807232,1815807302,US
-1815807303,1815807312,DE
-1815807313,1815807679,US
-1815807680,1815807743,GB
-1815807744,1815807775,SC
-1815807776,1815807776,US
-1815807777,1815807794,GB
-1815807795,1815807839,US
-1815807840,1815807935,GB
-1815807936,1815807999,US
+1815806464,1815807999,US
 1815808000,1815808255,A1
-1815808256,1815808292,US
-1815808293,1815808300,GB
-1815808301,1815808304,US
-1815808305,1815808314,GB
-1815808315,1815808393,US
-1815808394,1815808404,GB
-1815808405,1815808586,US
-1815808587,1815808598,AE
-1815808599,1815808656,US
+1815808256,1815808656,US
 1815808657,1815808657,A1
-1815808658,1815808719,US
-1815808720,1815808731,GB
-1815808732,1815808737,US
-1815808738,1815808758,GB
-1815808759,1815808767,US
-1815808768,1815808831,SC
-1815808832,1815808844,US
-1815808845,1815808857,GB
-1815808858,1815808874,US
-1815808875,1815808883,GB
-1815808884,1815808895,US
-1815808896,1815808959,SC
-1815808960,1815809005,US
-1815809006,1815809015,GB
-1815809016,1815809196,US
-1815809197,1815809205,IE
-1815809206,1815809319,US
-1815809320,1815809327,NL
-1815809328,1815809328,US
-1815809329,1815809337,SE
-1815809338,1815809439,US
-1815809440,1815809471,SC
-1815809472,1815809503,DK
-1815809504,1815809504,US
-1815809505,1815809513,GB
-1815809514,1815809535,US
-1815809536,1815809599,SC
-1815809600,1815809644,US
-1815809645,1815809654,AN
-1815809655,1815809664,US
-1815809665,1815809686,DK
-1815809687,1815809702,US
-1815809703,1815809721,DK
-1815809722,1815809766,US
-1815809767,1815809784,DK
-1815809785,1815822335,US
+1815808658,1815822335,US
 1815822336,1815826431,CA
 1815826432,1815871487,US
 1815871488,1815879679,CA
@@ -71607,6 +72246,8 @@
 1823432704,1823465471,US
 1823465472,1823469567,CA
 1823469568,1823735807,US
+1823735808,1823866879,CA
+1823866880,1823997951,US
 1824522240,1826955551,US
 1826955552,1826955559,AD
 1826955560,1828716543,US
@@ -71625,7 +72266,9 @@
 1832779776,1832812543,FR
 1832812544,1832845311,RU
 1832845312,1832878079,BH
-1832878080,1832910847,RU
+1832878080,1832878412,RU
+1832878413,1832878413,BH
+1832878414,1832910847,RU
 1832910848,1833172991,IL
 1833172992,1833177087,GB
 1833177088,1833179135,RU
@@ -72170,7 +72813,8 @@
 1839794736,1839794751,CH
 1839794752,1839794815,GB
 1839794816,1839794847,MY
-1839794848,1839795151,GB
+1839794848,1839794879,CH
+1839794880,1839795151,GB
 1839795152,1839795167,US
 1839795168,1839796607,GB
 1839796608,1839796671,US
@@ -72599,7 +73243,9 @@
 1844168704,1844169471,SE
 1844169472,1844169487,AF
 1844169488,1844169519,US
-1844169520,1844169599,SE
+1844169520,1844169567,SE
+1844169568,1844169583,US
+1844169584,1844169599,SE
 1844169600,1844169647,US
 1844169648,1844169655,AF
 1844169656,1844169663,SE
@@ -73422,7 +74068,7 @@
 1921861632,1921863679,SG
 1921865728,1921867775,ID
 1921867776,1921871871,AU
-1921871872,1921875967,NZ
+1921871872,1921875967,US
 1921875968,1921892351,CN
 1921892352,1921896447,AU
 1921896448,1921898495,SG
@@ -73471,7 +74117,9 @@
 1932156928,1932161023,JP
 1932161024,1932163071,TW
 1932163072,1932165119,PH
-1932165120,1932197887,SG
+1932165120,1932182523,SG
+1932182524,1932182524,AP
+1932182525,1932197887,SG
 1932197888,1932263423,TW
 1932263424,1933574143,CN
 1933574144,1933639679,AU
@@ -74347,7 +74995,17 @@
 2022313984,2022318079,NZ
 2022318080,2022319135,AU
 2022319136,2022319151,SG
-2022319152,2022326271,AU
+2022319152,2022319359,AU
+2022319360,2022319615,IN
+2022319616,2022320127,AU
+2022320128,2022320383,HK
+2022320384,2022321151,AU
+2022321152,2022321407,SG
+2022321408,2022322175,AU
+2022322176,2022322431,JP
+2022322432,2022323199,AU
+2022323200,2022323455,KR
+2022323456,2022326271,AU
 2022326272,2022330367,VN
 2022330368,2022334463,MY
 2022334464,2022342655,IN
@@ -74584,7 +75242,9 @@
 2056794112,2056796159,BD
 2056796160,2056806399,JP
 2056806400,2056814591,KR
-2056814592,2056818943,JP
+2056814592,2056817727,JP
+2056817728,2056817791,AU
+2056817792,2056818943,JP
 2056818944,2056818993,MY
 2056818994,2056818994,AP
 2056818995,2056819199,MY
@@ -74874,7 +75534,9 @@
 2083471360,2083487743,JP
 2083487744,2083504127,AU
 2083504128,2083520511,JP
-2083520512,2084569087,KR
+2083520512,2083966719,KR
+2083966720,2083966975,JP
+2083966976,2084569087,KR
 2084569088,2084732927,CN
 2084732928,2084741119,SG
 2084741120,2084743167,ID
@@ -74900,8 +75562,7 @@
 2087462912,2087464959,CN
 2087464960,2087467007,KH
 2087467008,2087469055,JP
-2087469056,2087481343,HK
-2087481344,2087485439,SG
+2087469056,2087485439,HK
 2087485440,2087501823,TW
 2087501824,2087518207,JP
 2087518208,2087519231,TH
@@ -75021,7 +75682,9 @@
 2098115072,2098122495,JP
 2098122496,2098122751,US
 2098122752,2098200575,JP
-2098200576,2098724863,IN
+2098200576,2098623239,IN
+2098623240,2098623240,PG
+2098623241,2098724863,IN
 2098724864,2098987007,TH
 2098987008,2099183615,JP
 2099183616,2099199999,MO
@@ -75521,7 +76184,7 @@
 2189164544,2189230079,US
 2189230080,2189295615,CH
 2189295616,2189492223,US
-2189492224,2189557759,CZ
+2189492224,2189557759,CA
 2189557760,2189623295,AU
 2189623296,2189754367,US
 2189754368,2189819903,DE
@@ -75620,7 +76283,9 @@
 2195456000,2195521535,AU
 2195521536,2195652607,US
 2195652608,2195718143,CH
-2195718144,2195783679,US
+2195718144,2195742719,US
+2195742720,2195742743,GB
+2195742744,2195783679,US
 2195783680,2196045823,DK
 2196045824,2196111359,SE
 2196111360,2196439039,FI
@@ -75995,7 +76660,9 @@
 2258594816,2258596095,AU
 2258596096,2258596351,HK
 2258596352,2258596863,AP
-2258596864,2258597375,AU
+2258596864,2258597293,AU
+2258597294,2258597294,PG
+2258597295,2258597375,AU
 2258597376,2258597439,HK
 2258597440,2258598079,AU
 2258598080,2258598087,TW
@@ -76086,7 +76753,9 @@
 2265710848,2265776127,CA
 2265776128,2266169343,US
 2266169344,2266234879,CA
-2266234880,2276786175,US
+2266234880,2266694655,US
+2266694656,2266694911,SG
+2266694912,2276786175,US
 2276786176,2276851711,CA
 2276851712,2277769215,US
 2277769216,2277834751,GB
@@ -76098,7 +76767,9 @@
 2281023488,2281023743,IN
 2281023744,2282226019,US
 2282226020,2282226020,AP
-2282226021,2282226943,US
+2282226021,2282226243,US
+2282226244,2282226245,AP
+2282226246,2282226943,US
 2282226944,2282227199,AP
 2282227200,2282264063,US
 2282264064,2282264319,EU
@@ -76643,7 +77314,10 @@
 2365456384,2365521919,US
 2365521920,2365587455,CN
 2365587456,2365589503,JO
-2365589504,2365591551,A2
+2365589504,2365590527,US
+2365590528,2365591039,NO
+2365591040,2365591455,US
+2365591456,2365591551,NO
 2365591552,2365593599,DE
 2365593600,2365595647,NL
 2365595648,2365603839,GB
@@ -76656,7 +77330,9 @@
 2365638656,2365640703,FR
 2365640704,2365644799,GB
 2365644800,2365652991,NO
-2365652992,2366032895,DE
+2365652992,2365983487,DE
+2365983488,2365983519,EU
+2365983520,2366032895,DE
 2366032896,2366033151,GB
 2366033152,2366111743,DE
 2366111744,2366144511,MT
@@ -76936,7 +77612,9 @@
 2382422016,2382426111,JM
 2382426112,2382430207,US
 2382430208,2382626815,CA
-2382626816,2382659583,US
+2382626816,2382675967,US
+2382675968,2382684159,CA
+2382684160,2382692351,US
 2382692352,2383085567,CA
 2383085568,2383151103,US
 2383151104,2385903615,CA
@@ -76961,7 +77639,12 @@
 2387542016,2387607551,US
 2387607552,2388328447,CA
 2388328448,2388393983,US
-2388393984,2390818815,CA
+2388393984,2389245951,CA
+2389245952,2389311487,US
+2389311488,2389639167,CA
+2389639168,2389704703,US
+2389704704,2390818815,CA
+2390818816,2390884351,US
 2390884352,2390995455,CA
 2390995456,2391015423,US
 2391015424,2394947583,CA
@@ -77190,7 +77873,9 @@
 2429943808,2430009343,HK
 2430009344,2432172031,US
 2432172032,2432237567,BE
-2432237568,2432630783,US
+2432237568,2432616448,US
+2432616449,2432617472,NL
+2432617473,2432630783,US
 2432630784,2432696319,CN
 2432696320,2433247231,NL
 2433247232,2433247487,GB
@@ -77595,7 +78280,9 @@
 2466232320,2466234367,ES
 2466234368,2466242559,RU
 2466242560,2466250751,GE
-2466250752,2466643967,US
+2466316288,2466323475,US
+2466323476,2466323477,IN
+2466323478,2466643967,US
 2466643968,2466709503,KR
 2466709504,2466775039,HU
 2466775040,2466840575,HK
@@ -77863,9 +78550,13 @@
 2500175872,2500175879,RO
 2500175880,2500199471,US
 2500199472,2500199475,IE
-2500199476,2500235775,US
+2500199476,2500225553,US
+2500225554,2500225561,ES
+2500225562,2500235775,US
 2500235776,2500236031,GB
-2500236032,2500238383,US
+2500236032,2500236837,US
+2500236838,2500236838,ES
+2500236839,2500238383,US
 2500238384,2500238399,DE
 2500238400,2500238463,US
 2500238464,2500238527,DE
@@ -77882,8 +78573,8 @@
 2500616704,2500636735,US
 2500636736,2500636799,GB
 2500636800,2500646911,US
-2500646912,2500647167,ES
-2500647168,2500719615,US
+2500646912,2500647935,ES
+2500647936,2500719615,US
 2500719616,2500720639,IE
 2500720640,2501574655,US
 2501574656,2501640191,KZ
@@ -78045,7 +78736,8 @@
 2524315648,2524512255,US
 2524512256,2524643327,CN
 2524643328,2524963071,US
-2524963072,2524963327,GB
+2524963072,2524963311,GB
+2524963312,2524963327,EU
 2524963328,2524971007,US
 2524971008,2525036543,ES
 2525036544,2525102079,EU
@@ -78155,9 +78847,67 @@
 2547187712,2547318783,GB
 2547318784,2547515391,US
 2547515392,2547515399,DK
-2547516416,2547517439,CH
-2547519488,2547523583,CH
-2547523584,2547527679,SE
+2547517440,2547519487,GB
+2548039680,2548563967,GB
+2548563968,2548826111,IR
+2548826112,2548834303,AT
+2548834304,2548842495,GB
+2548842496,2548858879,RU
+2548858880,2548867071,NL
+2548867072,2548875263,IQ
+2548875264,2548877311,KZ
+2548877312,2548879359,SE
+2548879360,2548883455,GB
+2548883456,2548887551,SK
+2548887552,2548891647,MK
+2548891648,2548928511,BG
+2548928512,2548932607,KZ
+2548932608,2548934655,NL
+2548934656,2548936703,RU
+2548936704,2548940799,SE
+2548940800,2548948991,ES
+2548948992,2548951039,CZ
+2548951040,2548953087,GB
+2548953088,2548955135,RU
+2548955136,2548957183,DE
+2548957184,2549612543,IR
+2549612544,2549614591,SE
+2549614592,2549616639,IT
+2549616640,2549618687,BE
+2549618688,2549620735,DE
+2549620736,2549624831,PL
+2549624832,2549626879,BE
+2549626880,2549628927,PL
+2549628928,2549637119,RO
+2549637120,2549641215,BH
+2549641216,2549645311,RU
+2549645312,2549678079,RO
+2549678080,2549698559,GB
+2549698560,2549700607,PL
+2549700608,2549702655,EU
+2549702656,2549704703,UA
+2549704704,2549706751,CZ
+2549706752,2549710847,NO
+2549710848,2549743615,CZ
+2549743616,2549809151,TR
+2549809152,2549874687,BG
+2549874688,2549876735,GB
+2549876736,2549878783,NO
+2549878784,2549880831,DE
+2549880832,2549882879,SE
+2549882880,2549884927,CH
+2549884928,2549891071,DE
+2549891072,2549899263,RU
+2549899264,2549901311,PS
+2549901312,2549903359,RU
+2549903360,2549905407,ES
+2549905408,2549907455,NL
+2549907456,2549923839,DE
+2549923840,2549927935,BG
+2549927936,2549929983,HR
+2549929984,2549932031,DE
+2549932032,2549940223,HR
+2549940224,2550136831,RO
 2550136832,2554227967,US
 2554227968,2554228223,EU
 2554228224,2554462207,US
@@ -78190,7 +78940,17 @@
 2556493824,2556559359,US
 2556559360,2556624895,AU
 2556624896,2556690431,KR
-2556690432,2556755967,US
+2556690432,2556703871,US
+2556703872,2556703935,SG
+2556703936,2556715719,US
+2556715720,2556715727,HK
+2556715728,2556716159,US
+2556716160,2556716175,HK
+2556716176,2556742071,US
+2556742072,2556742079,GB
+2556742080,2556742327,US
+2556742328,2556742335,GB
+2556742336,2556755967,US
 2556755968,2556821503,HK
 2556821504,2556887039,SG
 2556887040,2557018111,HK
@@ -78279,7 +79039,9 @@
 2585853952,2585985023,JP
 2585985024,2587018239,US
 2587018240,2587018495,IE
-2587018496,2587951103,US
+2587018496,2587067647,US
+2587067648,2587067903,GB
+2587067904,2587951103,US
 2600534016,2600665087,US
 2600665088,2600730623,CA
 2600730624,2600796159,NO
@@ -78338,7 +79100,9 @@
 2609381376,2609446911,GB
 2609446912,2609512447,DK
 2609512448,2609643519,US
-2609643520,2609708799,GB
+2609643520,2609677815,GB
+2609677816,2609677817,EU
+2609677818,2609708799,GB
 2609708800,2609709055,AP
 2609709056,2609840127,US
 2609840128,2609971199,AU
@@ -78390,7 +79154,9 @@
 2616770304,2616770559,EU
 2616770560,2616786943,US
 2616786944,2616852479,GB
-2616852480,2616918015,DE
+2616852480,2616885527,DE
+2616885528,2616885529,EU
+2616885530,2616918015,DE
 2616983552,2617049087,US
 2617049088,2617114623,IT
 2617114624,2617180159,US
@@ -78865,7 +79631,9 @@
 2677407744,2677473279,US
 2677473280,2677538815,FR
 2677538816,2677604351,FI
-2677604352,2677669887,US
+2677604352,2677644347,US
+2677644348,2677644348,EU
+2677644349,2677669887,US
 2677669888,2677735423,DE
 2677735424,2677800959,US
 2677800960,2677866495,CH
@@ -79822,7 +80590,9 @@
 2705522688,2705588223,ES
 2705588224,2705596159,US
 2705596160,2705596415,CA
-2705596416,2705784831,US
+2705596416,2705691647,US
+2705691648,2705692671,GB
+2705692672,2705784831,US
 2705784832,2705850367,GB
 2705850368,2705915903,ES
 2705915904,2706046975,GB
@@ -80033,7 +80803,9 @@
 2751660032,2751716351,AT
 2751716352,2751716607,US
 2751716608,2751725567,AT
-2751725568,2751791103,SE
+2751725568,2751729951,SE
+2751729952,2751729953,EU
+2751729954,2751791103,SE
 2751791104,2751856639,FI
 2751856640,2751922175,GB
 2751922176,2751987711,FR
@@ -80556,7 +81328,9 @@
 2817933057,2817933058,CA
 2817933059,2817986303,US
 2817986304,2817986559,AP
-2817986560,2818038537,US
+2817986560,2818003722,US
+2818003723,2818003723,EU
+2818003724,2818038537,US
 2818038538,2818038538,AP
 2818038539,2818310143,US
 2818310144,2818375679,AR
@@ -80735,8 +81509,8 @@
 2853830656,2854617087,US
 2854617088,2854682623,MY
 2854748160,2855469055,US
-2855469056,2855481343,PY
-2855481344,2855485439,AR
+2855469056,2855483391,PY
+2855483392,2855485439,AR
 2855485440,2855501823,UY
 2855501824,2855534591,AR
 2855534592,2855706623,US
@@ -80772,9 +81546,7 @@
 2863857664,2863923199,SG
 2863923200,2864844799,US
 2864844800,2864845055,NL
-2864845056,2864848895,US
-2864848896,2864849151,GB
-2864849152,2865417457,US
+2864845056,2865417457,US
 2865417458,2865417458,GB
 2865417459,2865577983,US
 2865577984,2865610751,BE
@@ -80864,6 +81636,17 @@
 2871001088,2871066623,SE
 2871066624,2871083007,CH
 2871083008,2871099391,RO
+2871099392,2871101439,NL
+2871101440,2871103487,CZ
+2871103488,2871105535,GB
+2871105536,2871107583,FR
+2871107584,2871111679,GB
+2871111680,2871115775,DE
+2871115776,2871123967,GB
+2871123968,2871126015,NL
+2871126016,2871128063,ES
+2871128064,2871130111,BH
+2871130112,2871132159,RU
 2871132160,2872049663,CN
 2872049664,2873098239,IN
 2873098240,2873884671,US
@@ -80881,6 +81664,7 @@
 2882469888,2882535423,SG
 2882535424,2883583999,CN
 2883584000,2885681151,VN
+2885681152,2886729727,US
 2894069760,2894921727,US
 2894921728,2895118335,GB
 2895118336,2895301887,US
@@ -80948,7 +81732,11 @@
 2902492672,2902493183,IN
 2902493184,2902507519,US
 2902507520,2902515711,CA
-2902515712,2904555519,US
+2902515712,2902564399,US
+2902564400,2902564415,CN
+2902564416,2902564687,US
+2902564688,2902564703,AU
+2902564704,2904555519,US
 2904555520,2904817663,CA
 2904817664,2905350729,US
 2905350730,2905350730,A1
@@ -81015,7 +81803,9 @@
 2905473024,2905481215,CA
 2905481216,2913992703,US
 2913992704,2914516991,CA
-2914516992,2915250175,US
+2914516992,2915096014,US
+2915096015,2915096015,A1
+2915096016,2915250175,US
 2915250176,2915254271,CA
 2915254272,2915274751,US
 2915274752,2915274815,PL
@@ -81654,7 +82444,9 @@
 2918287360,2918289407,GB
 2918289408,2918314216,US
 2918314217,2918314217,GB
-2918314218,2918371327,US
+2918314218,2918348114,US
+2918348115,2918348115,A1
+2918348116,2918371327,US
 2918371328,2918375423,CA
 2918375424,2918391807,US
 2918391808,2918395903,CA
@@ -83157,9 +83949,7 @@
 2947598336,2947602431,AU
 2947602432,2947603455,NZ
 2947603456,2947604479,TH
-2947604480,2947609855,HK
-2947609856,2947610111,AF
-2947610112,2947612671,HK
+2947604480,2947612671,HK
 2947612672,2947678207,JP
 2947678208,2947743743,CN
 2947743744,2947809279,JP
@@ -83721,7 +84511,9 @@
 2954829824,2954829827,BE
 2954829828,2954829831,NL
 2954829832,2954829839,DE
-2954829840,2954829875,FR
+2954829840,2954829843,FR
+2954829844,2954829847,DE
+2954829848,2954829875,FR
 2954829876,2954829879,GB
 2954829880,2954829887,FR
 2954829888,2954829903,PL
@@ -84071,7 +84863,9 @@
 2954835408,2954835415,FR
 2954835416,2954835419,CH
 2954835420,2954835423,GB
-2954835424,2954835487,DE
+2954835424,2954835451,DE
+2954835452,2954835455,ES
+2954835456,2954835487,DE
 2954835488,2954835511,FR
 2954835512,2954835519,ES
 2954835520,2954835539,PL
@@ -84632,7 +85426,8 @@
 2954844096,2954844127,IT
 2954844128,2954844143,FR
 2954844144,2954844147,NL
-2954844148,2954844175,FR
+2954844148,2954844151,DE
+2954844152,2954844175,FR
 2954844176,2954844179,DE
 2954844180,2954844183,NL
 2954844184,2954844187,GB
@@ -84826,7 +85621,9 @@
 2954855440,2954855455,LT
 2954855456,2954855479,FR
 2954855480,2954855487,IT
-2954855488,2954855523,GB
+2954855488,2954855507,GB
+2954855508,2954855511,DE
+2954855512,2954855523,GB
 2954855524,2954855527,DE
 2954855528,2954855535,PT
 2954855536,2954855551,FR
@@ -85668,10 +86465,7 @@
 2954897408,2954899455,DE
 2954899456,2954901503,ES
 2954901504,2954903551,IT
-2954903552,2954905599,NL
-2954905600,2954907647,IE
-2954907648,2954909695,GB
-2954909696,2954911743,DE
+2954903552,2954911743,JP
 2954911744,2954919423,NL
 2954919424,2954919935,IE
 2954919936,2954928127,RU
@@ -85687,8 +86481,7 @@
 2954948608,2954950655,RU
 2954950656,2954952703,ES
 2954952704,2955018239,TR
-2955018240,2955026431,FR
-2955026432,2955034623,NL
+2955018240,2955034623,JP
 2955034624,2955051007,IE
 2955051008,2955067391,NL
 2955067392,2955069439,IE
@@ -85944,7 +86737,11 @@
 2957203456,2957205503,FR
 2957205504,2957213695,PS
 2957213696,2957221887,FR
-2957221888,2957228031,GB
+2957221888,2957223365,GB
+2957223366,2957223366,A1
+2957223367,2957223641,GB
+2957223642,2957223642,A1
+2957223643,2957228031,GB
 2957228032,2957230079,DK
 2957230080,2957238271,RS
 2957238272,2957240319,CZ
@@ -86110,8 +86907,8 @@
 2959767552,2959769599,RS
 2959769600,2959777791,RU
 2959777792,2959783935,LV
-2959783936,2959785983,SK
-2959785984,2959794175,UA
+2959783936,2959788031,SK
+2959788032,2959794175,UA
 2959794176,2959796223,IL
 2959796224,2959804415,RU
 2959804416,2959806463,RO
@@ -86151,8 +86948,21 @@
 2959968256,2959970303,RS
 2959970304,2959974399,RU
 2959974400,2959976447,PL
-2959976448,2959998975,UA
-2960031744,2960035839,RU
+2959976448,2960015359,UA
+2960015360,2960023551,RU
+2960023552,2960024575,IT
+2960024576,2960024831,SA
+2960024832,2960025087,RU
+2960025088,2960025599,UA
+2960025600,2960025855,NL
+2960025856,2960026111,FR
+2960026112,2960026623,RO
+2960026624,2960027647,IR
+2960027648,2960028671,RO
+2960028672,2960029183,NO
+2960029184,2960029439,GB
+2960029440,2960029695,KW
+2960029696,2960035839,RU
 2960035840,2960039935,PL
 2960039936,2960054271,RU
 2960054272,2960056319,RO
@@ -86208,8 +87018,7 @@
 2960347136,2960349183,PL
 2960349184,2960351231,RU
 2960351232,2960353279,UA
-2960353280,2960367615,RU
-2960367616,2960369663,DE
+2960353280,2960369663,RU
 2960369664,2960371711,IT
 2960371712,2960383999,RU
 2960384000,2960388095,RO
@@ -86221,7 +87030,11 @@
 2960416768,2960424959,SK
 2960424960,2960427007,RO
 2960427008,2960429055,RU
-2960433152,2960441343,RU
+2960429056,2960429311,BG
+2960429312,2960429567,NL
+2960429568,2960430079,UA
+2960430080,2960431103,PL
+2960431104,2960441343,RU
 2960441344,2960443391,UA
 2960443392,2960445439,PL
 2960445440,2960449535,RU
@@ -86256,7 +87069,7 @@
 2960629760,2960646143,RU
 2960646144,2960648191,KZ
 2960648192,2960650239,UA
-2960650240,2960652287,CZ
+2960650240,2960652287,RU
 2960652288,2960654335,PS
 2960654336,2960658431,RU
 2960658432,2960660479,US
@@ -86275,6 +87088,53 @@
 2960732160,2960736255,RU
 2960736256,2960738303,ES
 2960738304,2960740351,UA
+2960740352,2960742399,PL
+2960742400,2960744447,NO
+2960744448,2960748543,RO
+2960748544,2960752639,PL
+2960752640,2960769023,RU
+2960769024,2960773119,UA
+2960773120,2960777215,RU
+2960777216,2960785407,UA
+2960785408,2960793599,RU
+2960793600,2960797695,CZ
+2960797696,2960805887,RU
+2960805888,2960807935,KZ
+2960807936,2960834559,UA
+2960834560,2960835071,GB
+2960835072,2960835583,CH
+2960835584,2960836351,IT
+2960836352,2960836607,PL
+2960836608,2960839167,RU
+2960839168,2960839679,IR
+2960839680,2960846847,PL
+2960846848,2960847871,UA
+2960847872,2960848383,PL
+2960848384,2960848639,GB
+2960848640,2960850943,RU
+2960850944,2960859135,MD
+2960859136,2960863231,RO
+2960863232,2960863487,DE
+2960863488,2960863743,RU
+2960863744,2960863999,GB
+2960864000,2960864255,DE
+2960864256,2960864767,GB
+2960864768,2960865279,DE
+2960865280,2960865535,RU
+2960865536,2960865791,HR
+2960865792,2960866303,GB
+2960866304,2960866815,PL
+2960866816,2960867071,GB
+2960867072,2960867327,FR
+2960867328,2960883711,IR
+2960883712,2960904191,RU
+2960904192,2960906239,RS
+2960906240,2960907263,RU
+2960907264,2960907775,UA
+2960907776,2960908031,GB
+2960908032,2960908287,PL
+2960908288,2960916479,KG
+2960916480,2960924671,UA
 2961178624,2965372927,FR
 2965372928,2965766143,RU
 2965766144,2965897215,DE
@@ -86323,7 +87183,9 @@
 2967707648,2967709695,PL
 2967709696,2967711743,IT
 2967711744,2967715839,RU
-2967715840,2967724031,GB
+2967715840,2967718721,GB
+2967718722,2967718722,A1
+2967718723,2967724031,GB
 2967724032,2967728127,CY
 2967728128,2967730175,GB
 2967730176,2967732223,CZ
@@ -86728,7 +87590,9 @@
 2988444192,2988444199,FR
 2988444200,2988444203,FI
 2988444204,2988444207,NL
-2988444208,2988444415,FR
+2988444208,2988444208,FR
+2988444209,2988444209,FI
+2988444210,2988444415,FR
 2988444416,2988444679,ES
 2988444680,2988444687,FR
 2988444688,2988444695,LT
@@ -87783,7 +88647,7 @@
 2988484608,2988484775,FR
 2988484776,2988484783,PL
 2988484784,2988484831,FR
-2988484832,2988484847,PL
+2988484832,2988484847,GB
 2988484848,2988484863,FR
 2988484864,2988484879,NL
 2988484880,2988484883,GB
@@ -88338,7 +89202,7 @@
 2988501760,2988502039,FR
 2988502040,2988502047,CZ
 2988502048,2988502051,FR
-2988502052,2988502055,FI
+2988502052,2988502055,PL
 2988502056,2988502059,GB
 2988502060,2988502063,IT
 2988502064,2988502067,FR
@@ -90783,7 +91647,8 @@
 2988555212,2988555215,DE
 2988555216,2988555519,FR
 2988555520,2988555527,IE
-2988555528,2988555531,ES
+2988555528,2988555528,DE
+2988555529,2988555531,ES
 2988555532,2988555535,FR
 2988555536,2988555543,ES
 2988555544,2988555559,FR
@@ -90815,7 +91680,7 @@
 2988556196,2988556199,FR
 2988556200,2988556203,CZ
 2988556204,2988556207,FI
-2988556208,2988556211,PT
+2988556208,2988556211,DE
 2988556212,2988556215,FR
 2988556216,2988556219,LT
 2988556220,2988556223,FI
@@ -91342,7 +92207,9 @@
 2991179264,2991179327,A1
 2991179328,2991182591,SE
 2991182592,2991182847,A1
-2991182848,2991183871,SE
+2991182848,2991183071,SE
+2991183072,2991183103,A1
+2991183104,2991183871,SE
 2991183872,2991185919,A1
 2991185920,2991185951,GB
 2991185952,2991185967,NL
@@ -91602,7 +92469,9 @@
 2995044352,2995046399,ES
 2995046400,2995048447,RU
 2995048448,2995050495,NL
-2995050496,2995052543,AL
+2995050496,2995050561,AL
+2995050562,2995050562,RS
+2995050563,2995052543,AL
 2995052544,2995056639,DK
 2995056640,2995058687,DE
 2995058688,2995060735,SE
@@ -92448,7 +93317,9 @@
 3025637632,3025637887,MY
 3025637888,3025638399,IN
 3025638400,3025638655,SG
-3025638656,3025649151,IN
+3025638656,3025647359,IN
+3025647360,3025647615,AU
+3025647616,3025649151,IN
 3025649152,3025649663,HK
 3025649664,3025666047,IN
 3025666048,3025928191,CN
@@ -92682,14 +93553,20 @@
 3038511104,3038773247,AR
 3039035392,3039166463,DO
 3039297536,3039363071,PY
+3039363072,3039395839,BZ
 3039428608,3039494143,CL
 3039690752,3039821823,AR
 3039821824,3040346111,CO
-3040870400,3041001471,PE
-3041132544,3041263615,CO
+3040870400,3041132543,PE
+3041132544,3041394687,CO
 3041394688,3041656831,CL
 3041918976,3044016127,AR
 3044016128,3044081663,EC
+3044147200,3044155391,GT
+3044163584,3044171775,BO
+3044196352,3044204543,AR
+3044212736,3044245503,HN
+3044278272,3044540415,AR
 3044802560,3045064703,PY
 3045064704,3047161855,CO
 3047161856,3047292927,CL
@@ -92699,9 +93576,14 @@
 3048341504,3048472575,PA
 3048472576,3048734719,VE
 3048996864,3049029631,TT
-3049062400,3049078783,CR
+3049062400,3049078271,CR
+3049078272,3049078527,MX
+3049078528,3049095167,CR
+3049095168,3049103359,GT
 3049119744,3049127935,HN
 3049193472,3049259007,PA
+3049259008,3049521151,CR
+3049783296,3050045439,CL
 3053453312,3054501887,ID
 3054501888,3054534655,HK
 3054534656,3054537727,PH
@@ -92801,7 +93683,9 @@
 3063988224,3064004607,JP
 3064004608,3064012799,LK
 3064020992,3064023039,JP
-3064023040,3064024063,SG
+3064023040,3064023551,SG
+3064023552,3064023807,JP
+3064023808,3064024063,SG
 3064024064,3064025087,JP
 3064025088,3064029183,VN
 3064029184,3064135679,KR
@@ -93126,7 +94010,11 @@
 3094020096,3094085631,CA
 3094085632,3096444927,US
 3096444928,3096969215,CA
-3096969216,3097130139,US
+3096969216,3097124223,US
+3097124224,3097124231,AE
+3097124232,3097124303,US
+3097124304,3097124311,AE
+3097124312,3097130139,US
 3097130140,3097130140,A1
 3097130141,3097493503,US
 3097493504,3097755647,CA
@@ -93325,7 +94213,9 @@
 3120691200,3120693247,CO
 3120693248,3120726015,BO
 3120726016,3120734207,HN
-3120742400,3120758783,PY
+3120742400,3120754687,PY
+3120754688,3120755711,CR
+3120756736,3120757759,PA
 3120758784,3120824319,EC
 3120824320,3120840703,CR
 3120840704,3120857087,AR
@@ -93345,8 +94235,8 @@
 3121872896,3122003967,CL
 3122003968,3122135039,AR
 3122135040,3122282495,VE
-3122282496,3122286591,AR
-3122286592,3122290687,US
+3122282496,3122284543,AR
+3122284544,3122290687,US
 3122290688,3122292735,AR
 3122292736,3122294783,US
 3122294784,3122298879,CR
@@ -93357,10 +94247,12 @@
 3122675712,3122692095,SV
 3122692096,3122700287,HN
 3122700288,3122716671,CR
-3122716672,3122720767,HN
-3122720768,3122722815,GT
+3122716672,3122722815,HN
 3122722816,3122724863,SV
-3122724864,3122741247,AR
+3122724864,3122726911,US
+3122726912,3122732031,AR
+3122732032,3122733055,US
+3122733056,3122741247,AR
 3122741248,3122757631,DO
 3122757632,3122774015,EC
 3122774016,3122790399,AR
@@ -93378,7 +94270,12 @@
 3124760760,3124781055,AR
 3124789248,3124822015,CR
 3124822016,3124838399,EC
-3124838400,3124848639,AR
+3124838400,3124840447,AR
+3124840448,3124842495,CL
+3124842496,3124844543,AR
+3124844544,3124845567,BZ
+3124845568,3124846591,CR
+3124846592,3124848639,AR
 3124848640,3124849663,PA
 3124849664,3124850687,AR
 3124850688,3124854783,HN
@@ -93436,6 +94333,11 @@
 3131834368,3132096511,CL
 3132096512,3132227583,CR
 3132227584,3132293119,EC
+3132293120,3132309503,HN
+3132309504,3132313599,CR
+3132317696,3132321791,CO
+3132321792,3132325887,PA
+3132325888,3132358655,SR
 3132358656,3132489727,CO
 3132489728,3132555263,AR
 3132620800,3132915711,VE
@@ -94230,7 +95132,7 @@
 3163170432,3163170463,DE
 3163170464,3163170495,US
 3163170496,3163170527,BG
-3163170528,3163170559,HR
+3163170528,3163170559,AE
 3163170560,3163170591,DE
 3163170592,3163170623,BR
 3163170624,3163170655,GR
@@ -94429,7 +95331,11 @@
 3163184504,3163184505,DE
 3163184506,3163184506,PL
 3163184507,3163184509,GR
-3163184510,3163188804,DE
+3163184510,3163186534,DE
+3163186535,3163186535,FR
+3163186536,3163186673,DE
+3163186674,3163186674,FR
+3163186675,3163188804,DE
 3163188805,3163188806,AR
 3163188807,3163188807,DE
 3163188808,3163188810,AR
@@ -94525,7 +95431,9 @@
 3164930048,3164932095,IE
 3164932096,3164934143,FR
 3164934144,3164936191,PL
-3164936192,3164938239,LT
+3164936192,3164937749,LT
+3164937750,3164937750,FR
+3164937751,3164938239,LT
 3164938240,3164946431,FR
 3164946432,3164946435,PL
 3164946436,3164946439,PT
@@ -95671,7 +96579,9 @@
 3187910656,3187914751,CL
 3187914752,3187916799,BO
 3187916800,3187933183,CO
-3187933184,3187949567,GT
+3187933184,3187947983,GT
+3187947984,3187947987,HN
+3187947988,3187949567,GT
 3187949568,3187953663,AN
 3187953664,3187955711,CL
 3187955712,3187957759,CR
@@ -95794,7 +96704,17 @@
 3191607808,3191608319,CL
 3191608320,3191611391,CO
 3191611392,3191619583,VE
-3191619584,3191734271,CO
+3191619584,3191676927,CO
+3191676928,3191685119,AR
+3191685120,3191685631,CO
+3191685632,3191685887,US
+3191685888,3191691263,CO
+3191691264,3191693311,US
+3191693312,3191699455,CO
+3191699456,3191701503,US
+3191701504,3191727103,CO
+3191727104,3191727359,AR
+3191727360,3191734271,CO
 3191734272,3191799807,SV
 3191799808,3191865343,EC
 3191865344,3191930879,UY
@@ -95808,10 +96728,25 @@
 3193176064,3193307135,CO
 3193307136,3193438207,SV
 3193438208,3193569279,AN
-3193569280,3193634815,CO
+3193569280,3193622783,CO
+3193622784,3193623039,EC
+3193623040,3193634815,CO
 3193634816,3193700351,CL
-3193700352,3193733119,HN
-3193733120,3193765887,AR
+3193700352,3193724927,HN
+3193729024,3193733119,CU
+3193733120,3193735423,AR
+3193735424,3193735679,US
+3193735680,3193736191,AR
+3193736192,3193736447,US
+3193736448,3193737983,AR
+3193737984,3193738239,US
+3193738240,3193739263,AR
+3193739264,3193739519,US
+3193739520,3193741311,AR
+3193741312,3193741567,US
+3193741568,3193747839,AR
+3193747840,3193747967,US
+3193747968,3193765887,AR
 3193765888,3193774079,TT
 3193774080,3193775103,PA
 3193775104,3193776127,GY
@@ -95847,9 +96782,13 @@
 3194077184,3194085375,CO
 3194085376,3194093567,VE
 3194093568,3194126335,SR
-3194126336,3194130431,AR
+3194126336,3194128383,AR
+3194128384,3194129407,PE
+3194129408,3194130431,AR
 3194130432,3194134527,BR
-3194134528,3194140671,AR
+3194134528,3194135551,AR
+3194135552,3194136575,GT
+3194136576,3194140671,AR
 3194140672,3194142719,CR
 3194142720,3194159103,CL
 3194159104,3194165247,HN
@@ -95867,7 +96806,9 @@
 3194368000,3194370047,BO
 3194370048,3194372095,PA
 3194372096,3194380287,HT
-3194380288,3194388479,BZ
+3194380288,3194381439,BZ
+3194381440,3194381567,US
+3194381568,3194388479,BZ
 3194388480,3194396671,PE
 3194396672,3194413055,CO
 3194413056,3194421247,CL
@@ -95881,7 +96822,8 @@
 3194466304,3194467327,AR
 3194467328,3194468351,DO
 3194468352,3194469375,US
-3194469376,3194470399,CR
+3194469376,3194469631,CA
+3194469632,3194470399,CR
 3194470400,3194486783,AR
 3194486784,3194494975,BO
 3194494976,3194507263,AR
@@ -95942,15 +96884,17 @@
 3194769408,3194773503,PE
 3194781696,3194798079,CL
 3194798080,3194799103,AR
-3194799104,3194802175,GY
+3194799104,3194804223,GY
+3194804224,3194805247,AR
+3194805248,3194806271,CR
 3194806272,3194830847,AR
 3194830848,3194839039,PA
 3194839040,3194863615,CO
 3194863616,3194871807,HN
+3194871808,3194879999,BO
 3194880000,3194896383,DO
 3194896384,3194904575,CO
-3194904576,3194908671,CL
-3194912768,3194925055,CL
+3194904576,3194925055,CL
 3194925056,3194929151,AR
 3194929152,3194937343,EC
 3194937344,3194945535,AR
@@ -95975,10 +96919,12 @@
 3195101184,3195109375,CR
 3195109376,3195125759,AR
 3195125760,3195133951,PE
+3195133952,3195138047,AR
 3195138048,3195139071,DO
 3195139072,3195140095,CL
 3195140096,3195142143,CR
 3195142144,3195150335,VE
+3195150336,3195158527,CL
 3195158528,3195199487,AR
 3195199488,3195201535,PY
 3195203584,3195205631,VE
@@ -96002,6 +96948,7 @@
 3195600896,3195633663,CL
 3195633664,3195641855,CO
 3195641856,3195645951,PY
+3195645952,3195650047,AR
 3195650048,3195654143,GT
 3195658240,3195662335,VE
 3195662336,3195666431,AN
@@ -96011,6 +96958,7 @@
 3195707392,3195711487,PA
 3195715584,3195731967,AR
 3195731968,3195736063,EC
+3195738112,3195740159,HN
 3195740160,3195744255,PA
 3195744256,3195748351,EC
 3195748352,3195752447,CL
@@ -96100,7 +97048,9 @@
 3200614400,3200647167,AR
 3200647168,3201302527,VE
 3201302528,3201433599,CL
-3201433600,3201499135,AR
+3201433600,3201441791,AR
+3201441792,3201442047,US
+3201442048,3201499135,AR
 3201499136,3201515519,CL
 3201515520,3201522687,AR
 3201522688,3201531903,CR
@@ -96119,9 +97069,11 @@
 3201630208,3201695743,TT
 3201695744,3201761279,EC
 3201761280,3201826815,CL
-3201826816,3201884159,AR
-3201884160,3201888255,VE
-3201888256,3201925119,AR
+3201826816,3201875967,AR
+3201875968,3201880063,CO
+3201880064,3201884159,AR
+3201884160,3201888511,VE
+3201888512,3201925119,AR
 3201925120,3201957887,CL
 3201957888,3202088959,PA
 3202088960,3202220031,AR
@@ -96143,7 +97095,8 @@
 3203535872,3203536383,PA
 3203536384,3203537919,CO
 3203537920,3203538431,GT
-3203538432,3203538943,CO
+3203538432,3203538687,PA
+3203538688,3203538943,CO
 3203538944,3203539967,BZ
 3203539968,3203547135,CO
 3203547136,3203549183,PA
@@ -96151,7 +97104,9 @@
 3203661824,3203923967,AR
 3203923968,3204448255,CO
 3221233664,3221237759,US
-3221291008,3221422079,US
+3221291008,3221334269,US
+3221334270,3221334270,DZ
+3221334271,3221422079,US
 3221487616,3221560319,US
 3221560320,3221561343,GB
 3221561344,3221562367,US
@@ -96335,8 +97290,7 @@
 3223227904,3223228159,CA
 3223229184,3223229695,US
 3223229696,3223229951,CA
-3223240448,3223240703,US
-3223242752,3223243007,US
+3223240448,3223243007,US
 3223243264,3223243519,CA
 3223244288,3223245311,US
 3223249408,3223249663,CA
@@ -96399,7 +97353,9 @@
 3223422464,3223422719,US
 3223422720,3223422975,JP
 3223422976,3223424767,US
-3223424768,3223435007,FR
+3223424768,3223432191,FR
+3223432192,3223433215,US
+3223433216,3223435007,FR
 3223435008,3223437311,US
 3223437312,3223447551,CH
 3223447552,3223447807,US
@@ -97015,7 +97971,7 @@
 3225796096,3225796351,US
 3225805824,3225806847,US
 3225807360,3225807615,DE
-3225810688,3225810943,US
+3225808896,3225812991,US
 3225812992,3225827071,FR
 3225827072,3225827327,US
 3225827328,3225843711,FR
@@ -97561,8 +98517,7 @@
 3227794688,3227794943,GB
 3227794944,3227795199,US
 3227795200,3227795455,NO
-3227795456,3227797503,US
-3227798528,3227798783,US
+3227795456,3227798783,US
 3227798784,3227799039,TH
 3227799040,3227799295,GB
 3227799296,3227799551,US
@@ -97847,7 +98802,9 @@
 3228364288,3228364543,AT
 3228364800,3228368895,US
 3228368896,3228404735,DE
-3228404736,3228405247,FR
+3228404736,3228404863,FR
+3228404864,3228404895,EU
+3228404896,3228405247,FR
 3228405248,3228405503,KR
 3228405504,3228405759,SG
 3228405760,3228406015,IN
@@ -98165,7 +99122,7 @@
 3229969408,3229969663,PT
 3229969664,3229969919,AT
 3229969920,3229970431,FI
-3229971456,3229972735,US
+3229970432,3229972735,US
 3229972736,3229972991,SE
 3229972992,3229975295,US
 3229975296,3229975551,GB
@@ -98789,7 +99746,7 @@
 3231507456,3231508479,US
 3231508992,3231509247,US
 3231510272,3231510527,GB
-3231510528,3231511551,US
+3231510528,3231512575,US
 3231512576,3231512831,LU
 3231513088,3231513343,US
 3231513600,3231514623,US
@@ -98828,7 +99785,9 @@
 3231562752,3231563007,US
 3231563008,3231563263,CH
 3231563264,3231563519,ZA
-3231580160,3231588863,US
+3231580160,3231583231,US
+3231583232,3231584255,CA
+3231584256,3231588863,US
 3231588864,3231589119,GB
 3231589120,3231591679,US
 3231591680,3231591935,AU
@@ -99037,7 +99996,9 @@
 3232090624,3232092671,SE
 3232092672,3232093183,GB
 3232093184,3232093439,US
-3232093440,3232093695,GB
+3232093440,3232093675,GB
+3232093676,3232093676,EU
+3232093677,3232093695,GB
 3232093696,3232093951,AP
 3232093952,3232094207,GB
 3232094208,3232094719,CH
@@ -99102,7 +100063,10 @@
 3232567296,3232571391,NZ
 3232571392,3232579583,US
 3232595968,3232598015,GB
-3232628736,3232645119,US
+3232629248,3232629759,US
+3232629760,3232630783,CA
+3232630784,3232634879,US
+3232636928,3232645119,US
 3232645120,3232647167,AT
 3232661504,3232694271,JP
 3232694272,3232702463,US
@@ -99131,6 +100095,7 @@
 3232813056,3232820223,SE
 3232820224,3232820479,IE
 3232820480,3232825343,SE
+3232890880,3233021951,US
 3233285120,3233285375,US
 3233480704,3233484799,US
 3233484800,3233488895,ES
@@ -99360,7 +100325,9 @@
 3233803008,3233803263,CA
 3233803264,3233808383,US
 3233808384,3233873919,TW
-3233873920,3233907711,US
+3233873920,3233903743,US
+3233903744,3233903807,EU
+3233903808,3233907711,US
 3233907712,3233907967,AP
 3233907968,3233914879,US
 3233914880,3233915135,AP
@@ -99455,7 +100422,9 @@
 3234267136,3234271231,US
 3234271232,3234275327,PT
 3234275328,3234279423,AU
-3234283520,3234316287,US
+3234283520,3234310367,US
+3234310368,3234310371,HK
+3234310372,3234312703,US
 3234332672,3234349055,US
 3234349056,3234353151,NZ
 3234365440,3234367487,US
@@ -99498,7 +100467,9 @@
 3234592512,3234592767,TH
 3234592768,3234611199,US
 3234611200,3234615295,A1
-3234615296,3234725887,US
+3234615296,3234645247,US
+3234645248,3234645759,A1
+3234645760,3234725887,US
 3234726144,3234726399,CA
 3234726400,3234726911,US
 3234727936,3234733055,US
@@ -99869,7 +100840,9 @@
 3237622016,3237622271,AP
 3237622272,3237634309,US
 3237634310,3237634310,GB
-3237634311,3237647103,US
+3237634311,3237634602,US
+3237634603,3237634603,EU
+3237634604,3237647103,US
 3237647104,3237647359,AU
 3237647360,3237658623,US
 3237675008,3237681663,US
@@ -99921,8 +100894,8 @@
 3238043648,3238043903,NL
 3238043904,3238044159,DK
 3238044160,3238044671,KZ
-3238044672,3238045695,DE
-3238045696,3238047743,RU
+3238044672,3238045183,FI
+3238045184,3238047743,RU
 3238047744,3238048255,GB
 3238048256,3238048767,RU
 3238048768,3238049791,CH
@@ -100833,10 +101806,29 @@
 3240104704,3240104959,NL
 3240104960,3240105215,RU
 3240105216,3240105471,UA
-3240105472,3240109055,GB
+3240105472,3240107583,GB
+3240107584,3240107599,EU
+3240107600,3240109055,GB
 3240109056,3240109567,PL
 3240109568,3240112639,GB
-3240120320,3240125439,GB
+3240112640,3240112895,PL
+3240112896,3240113151,AT
+3240113152,3240113407,LV
+3240113408,3240113663,TR
+3240113664,3240113919,RU
+3240113920,3240114175,TR
+3240114176,3240114431,CZ
+3240114432,3240114687,UA
+3240114688,3240114943,RO
+3240114944,3240115199,PL
+3240115200,3240116223,RU
+3240116224,3240116479,DE
+3240116480,3240116735,DK
+3240116736,3240117247,RO
+3240117248,3240118271,RU
+3240118272,3240120319,ES
+3240120320,3240120831,IR
+3240120832,3240125439,GB
 3240125440,3240125695,RO
 3240125696,3240165375,GB
 3240165376,3240165887,PL
@@ -100900,6 +101892,7 @@
 3240197632,3240198143,CZ
 3240198144,3240198655,CH
 3240198656,3240199167,RO
+3240199168,3240199679,RU
 3240199680,3240200191,NL
 3240200192,3240200703,RO
 3240200704,3240201215,GB
@@ -101061,6 +102054,7 @@
 3240308736,3240309759,CZ
 3240309760,3240310783,NO
 3240310784,3240311807,GB
+3240311808,3240312063,PL
 3240312064,3240312319,RU
 3240312320,3240312575,IR
 3240312576,3240312831,RU
@@ -101106,6 +102100,7 @@
 3240410368,3240410623,AT
 3240410624,3240410879,PT
 3240410880,3240411135,NO
+3240411136,3240419327,RO
 3240419328,3240419839,GB
 3240419840,3240420095,AT
 3240420096,3240420351,DE
@@ -101333,7 +102328,10 @@
 3240812544,3240813567,IT
 3240813568,3240814591,PL
 3240814592,3240818687,IT
-3240818688,3240820735,NL
+3240818688,3240819715,NL
+3240819716,3240819716,EU
+3240819717,3240820735,NL
+3240820736,3240820799,FR
 3240820800,3240820863,GB
 3240820864,3240820991,PL
 3240820992,3240823807,IT
@@ -101984,7 +102982,7 @@
 3244853760,3244854015,TR
 3244854016,3244854271,NL
 3244854272,3244854527,GB
-3244854784,3244855295,RU
+3244854528,3244855295,RU
 3244855296,3244855551,GB
 3244855552,3244855807,UA
 3244855808,3244856063,DE
@@ -102074,6 +103072,7 @@
 3244879872,3244880127,SI
 3244880128,3244880383,RU
 3244880384,3244880639,UA
+3244880640,3244880895,RU
 3244880896,3244881151,PL
 3244881152,3244881407,RU
 3244881408,3244881663,DK
@@ -102673,7 +103672,9 @@
 3245232640,3245232895,BG
 3245232896,3245233151,IT
 3245233152,3245233407,DK
-3245233408,3245233663,CH
+3245233408,3245233452,CH
+3245233453,3245233453,EU
+3245233454,3245233663,CH
 3245233664,3245233919,GR
 3245233920,3245234175,DK
 3245234176,3245234431,GB
@@ -102988,6 +103989,7 @@
 3247054592,3247054847,DE
 3247054848,3247063039,SI
 3247063040,3247063295,FR
+3247063296,3247063551,PL
 3247063552,3247063807,DE
 3247063808,3247064063,BG
 3247064064,3247064319,DE
@@ -103243,7 +104245,9 @@
 3247286992,3247287895,NL
 3247287896,3247287903,DE
 3247287904,3247288319,NL
-3247288320,3247302655,DE
+3247288320,3247299363,DE
+3247299364,3247299364,EU
+3247299365,3247302655,DE
 3247302656,3247302791,NL
 3247302792,3247302799,DE
 3247302800,3247303343,NL
@@ -103434,7 +104438,9 @@
 3247779648,3247779839,IE
 3247779840,3247783935,DE
 3247783936,3247792127,GB
-3247792128,3247800319,FR
+3247792128,3247794438,FR
+3247794439,3247794439,EU
+3247794440,3247800319,FR
 3247800320,3247816703,DK
 3247816704,3247817471,BE
 3247817472,3247817727,CH
@@ -103454,6 +104460,8 @@
 3247835136,3247836159,GB
 3247836160,3247837183,CZ
 3247837184,3247838207,ES
+3247838208,3247838463,RU
+3247838464,3247838719,PL
 3247838720,3247839231,NO
 3247839232,3247839743,CZ
 3247839744,3247840255,GB
@@ -104058,7 +105066,18 @@
 3250257152,3250257663,AT
 3250257664,3250257919,PL
 3250257920,3250258175,EU
-3250258176,3250323199,AT
+3250258176,3250271231,AT
+3250271232,3250271743,PL
+3250271744,3250271999,LB
+3250272000,3250272255,GB
+3250272256,3250274303,SK
+3250274304,3250276351,PL
+3250276352,3250276607,GB
+3250276608,3250276863,RU
+3250276864,3250277375,IT
+3250277376,3250278399,UA
+3250278400,3250279423,RU
+3250279424,3250323199,AT
 3250323200,3250323455,RU
 3250323456,3250323711,PL
 3250323712,3250324479,SA
@@ -104078,7 +105097,7 @@
 3250357856,3250357871,EE
 3250357872,3250357879,CH
 3250357880,3250357887,SE
-3250357888,3250357895,DK
+3250357888,3250357903,DK
 3250357904,3250357919,FR
 3250357920,3250357927,PL
 3250357952,3250358015,GB
@@ -104244,7 +105263,9 @@
 3250749440,3250749695,GH
 3250749696,3250749951,EU
 3250749952,3250750463,RO
-3250750464,3250751487,FR
+3250750464,3250750537,FR
+3250750538,3250750541,EU
+3250750542,3250751487,FR
 3250751488,3250751999,DE
 3250752000,3250752511,CH
 3250752512,3250753023,BG
@@ -104437,6 +105458,7 @@
 3251169280,3251170047,PL
 3251170048,3251170303,NO
 3251170304,3251170559,CH
+3251170560,3251170815,BG
 3251170816,3251171327,RU
 3251171328,3251171839,DE
 3251171840,3251172095,RO
@@ -105466,7 +106488,9 @@
 3253402368,3253402623,JP
 3253402624,3253403647,SE
 3253403648,3253403903,PL
-3253403904,3253409791,SE
+3253403904,3253405563,SE
+3253405564,3253405564,EU
+3253405565,3253409791,SE
 3253409792,3253410047,GB
 3253410048,3253411327,SE
 3253411328,3253411583,NO
@@ -105521,7 +106545,7 @@
 3253605376,3253606399,UA
 3253606400,3253606655,PL
 3253606656,3253606911,TR
-3253606912,3253607167,DE
+3253606912,3253607423,DE
 3253607424,3253608447,NG
 3253608448,3253610495,UA
 3253610496,3253611519,PL
@@ -105628,6 +106652,8 @@
 3253710848,3253711359,DK
 3253711360,3253712383,UA
 3253712384,3253712895,MD
+3253712896,3253713151,PL
+3253713152,3253713407,DE
 3253713408,3253713919,NL
 3253713920,3253714431,AT
 3253714432,3253714943,RO
@@ -105649,6 +106675,7 @@
 3253723648,3253724159,AT
 3253724160,3253724671,UA
 3253724672,3253725183,RO
+3253725440,3253725695,RU
 3253725696,3253726207,UA
 3253726208,3253726719,RO
 3253726720,3253727231,UA
@@ -105751,7 +106778,9 @@
 3253964800,3253965311,SE
 3253965312,3253966335,PL
 3253966336,3253966847,DE
-3253966848,3253968895,UA
+3253966848,3253967359,UA
+3253967360,3253967871,PL
+3253967872,3253968895,UA
 3253968896,3253969407,DE
 3253969408,3253969919,AT
 3253969920,3253970431,NL
@@ -106428,7 +107457,9 @@
 3255279088,3255279103,LU
 3255279104,3255279639,BE
 3255279640,3255279647,LU
-3255279648,3255280031,BE
+3255279648,3255280018,BE
+3255280019,3255280019,EU
+3255280020,3255280031,BE
 3255280032,3255280039,LU
 3255280040,3255280047,BE
 3255280048,3255280055,LU
@@ -106605,7 +107636,9 @@
 3255426560,3255426815,FR
 3255426816,3255427071,PL
 3255427072,3255431167,RU
-3255431168,3255436543,GB
+3255431168,3255434720,GB
+3255434721,3255434721,EU
+3255434722,3255436543,GB
 3255436544,3255436799,NL
 3255436800,3255437055,DE
 3255437056,3255437311,GB
@@ -107003,6 +108036,7 @@
 3256899584,3256915455,GB
 3256915456,3256915967,SE
 3256915968,3256945663,GB
+3256945664,3256945919,SI
 3256945920,3256946175,GB
 3256946176,3256946431,RO
 3256946432,3256946687,UA
@@ -107031,6 +108065,7 @@
 3256970240,3256970495,AT
 3256970496,3256970751,GB
 3256970752,3256971007,RU
+3256971008,3256971263,PL
 3256971264,3256971775,NL
 3256971776,3256972031,RU
 3256972032,3256972287,DE
@@ -108015,6 +109050,7 @@
 3258021888,3258022911,RU
 3258022912,3258023167,PL
 3258023168,3258023423,DE
+3258023424,3258023679,TR
 3258023680,3258023935,RU
 3258023936,3258056703,DE
 3258056704,3258056959,UA
@@ -108802,7 +109838,9 @@
 3261213204,3261213439,FR
 3261213440,3261213695,AF
 3261213696,3261267967,FR
-3261267968,3261297663,DE
+3261267968,3261280512,DE
+3261280513,3261280513,EU
+3261280514,3261297663,DE
 3261297664,3261297919,RU
 3261297920,3261298175,PL
 3261298176,3261333503,DE
@@ -108835,7 +109873,11 @@
 3261677056,3261685759,GB
 3261685760,3261687807,DE
 3261687808,3261689855,RO
-3261689856,3261691903,GB
+3261689856,3261690351,GB
+3261690352,3261690352,EU
+3261690353,3261690354,SG
+3261690355,3261690355,EU
+3261690356,3261691903,GB
 3261691904,3261692997,EU
 3261692998,3261692998,US
 3261692999,3261693951,EU
@@ -108866,7 +109908,9 @@
 3261767680,3261775871,RS
 3261775872,3261776383,PL
 3261776384,3261777407,RU
-3261777408,3261777663,IR
+3261777408,3261777449,IR
+3261777450,3261777451,NL
+3261777452,3261777663,IR
 3261777664,3261777919,GB
 3261777920,3261778431,PL
 3261778432,3261778943,RU
@@ -111829,6 +112873,7 @@
 3263087104,3263087871,DE
 3263087872,3263088127,SI
 3263088128,3263088383,DE
+3263088384,3263088639,LV
 3263088640,3263089151,CH
 3263089152,3263089407,RO
 3263089408,3263089663,RU
@@ -112347,7 +113392,7 @@
 3264624128,3264624143,GI
 3264624144,3264624383,GB
 3264624384,3264624639,MT
-3264624640,3264624671,NL
+3264624640,3264624671,US
 3264624672,3264624895,GB
 3264624896,3264625151,NL
 3264625152,3264626431,GB
@@ -112427,6 +113472,8 @@
 3264753152,3264753663,PL
 3264753664,3264754175,IT
 3264754176,3264754687,PL
+3264754688,3264754943,LU
+3264754944,3264755199,PL
 3264755200,3264755711,DE
 3264755712,3264756223,PL
 3264756224,3264756735,FI
@@ -112465,6 +113512,7 @@
 3264833024,3264833535,IT
 3264833536,3264834047,DE
 3264834048,3264834303,GB
+3264834304,3264834559,PL
 3264834560,3264835327,FR
 3264835328,3264835583,AT
 3264835584,3264835839,RU
@@ -112908,7 +113956,9 @@
 3267059712,3267060735,NL
 3267060736,3267061759,LV
 3267061760,3267063807,UA
-3267063808,3267064831,BE
+3267063808,3267064576,BE
+3267064577,3267064577,EU
+3267064578,3267064831,BE
 3267064832,3267065855,PL
 3267065856,3267066879,RO
 3267066880,3267067903,IT
@@ -113433,7 +114483,9 @@
 3268017408,3268017663,KE
 3268017664,3268078591,GB
 3268078592,3268078847,EU
-3268078848,3268149247,GB
+3268078848,3268139005,GB
+3268139006,3268139006,EU
+3268139007,3268149247,GB
 3268149248,3268165631,EE
 3268165632,3268173823,CH
 3268173824,3268182015,MT
@@ -114608,7 +115660,9 @@
 3272020992,3272024063,DK
 3272024064,3272032255,IE
 3272032256,3272040447,SE
-3272040448,3272048639,FR
+3272040448,3272041885,FR
+3272041886,3272041886,EU
+3272041887,3272048639,FR
 3272048640,3272056831,NL
 3272056832,3272065023,RU
 3272065024,3272065631,GB
@@ -115292,7 +116346,9 @@
 3273026560,3273028607,UA
 3273028608,3273029631,PL
 3273029632,3273029887,CH
-3273029888,3273030143,GB
+3273029888,3273029897,GB
+3273029898,3273029898,EU
+3273029899,3273030143,GB
 3273030144,3273030655,RU
 3273030656,3273031679,PL
 3273031680,3273032191,GB
@@ -115687,7 +116743,9 @@
 3273727152,3273727999,GB
 3273728000,3273728255,NL
 3273728256,3273728511,GB
-3273728512,3273732095,NL
+3273728512,3273728590,NL
+3273728591,3273728592,EU
+3273728593,3273732095,NL
 3273732096,3273736191,GB
 3273736192,3273743359,FR
 3273743360,3273743615,JO
@@ -115843,7 +116901,9 @@
 3274204096,3274227199,GB
 3274227200,3274227455,A2
 3274227456,3274244095,GB
-3274244096,3274309631,DK
+3274244096,3274255106,DK
+3274255107,3274255107,EU
+3274255108,3274309631,DK
 3274309632,3274326015,FR
 3274326016,3274334719,RU
 3274334720,3274335231,PL
@@ -116221,7 +117281,10 @@
 3274850304,3274866687,GB
 3274866688,3274883071,DE
 3274883072,3274891263,EE
-3274891264,3274892287,CH
+3274891264,3274891775,CH
+3274891776,3274892031,EE
+3274892032,3274892287,CH
+3274892288,3274899455,EE
 3274899456,3274902399,DE
 3274902400,3274902423,AT
 3274902424,3274902527,EU
@@ -120847,7 +121910,9 @@
 3277254728,3277254735,DE
 3277254736,3277258751,NL
 3277258752,3277324287,TR
-3277324288,3277325311,RU
+3277324288,3277324799,RU
+3277324800,3277325055,KZ
+3277325056,3277325311,RU
 3277325312,3277326335,IT
 3277326336,3277326847,GB
 3277326848,3277327359,AT
@@ -125088,6 +126153,7 @@
 3283484672,3283484927,UA
 3283484928,3283485183,NL
 3283485184,3283485439,DE
+3283485440,3283485695,RU
 3283485696,3283485951,GB
 3283485952,3283486128,US
 3283486129,3283486129,SE
@@ -127710,6 +128776,7 @@
 3286326272,3286327295,PL
 3286327296,3286329343,NL
 3286329344,3286330367,DE
+3286330368,3286331391,RU
 3286331392,3286332415,UA
 3286332416,3286333439,CH
 3286333440,3286334463,PL
@@ -128801,7 +129868,6 @@
 3290480640,3290482687,AO
 3290482688,3290484735,CF
 3290484736,3290486783,ZA
-3290486784,3290488831,SC
 3290488832,3290489343,NG
 3290489344,3290489855,KE
 3290489856,3290490367,EG
@@ -128865,6 +129931,12 @@
 3291212800,3291213055,MA
 3291213056,3291213311,EG
 3291213312,3291213567,NG
+3291213568,3291213823,KE
+3291213824,3291214079,CG
+3291214080,3291214335,MZ
+3291214336,3291214591,GH
+3291214592,3291214847,ZA
+3291214848,3291215103,NG
 3291216896,3291217919,MU
 3291217920,3291230207,ZA
 3291230208,3291234303,GH
@@ -129085,6 +130157,9 @@
 3302540288,3302540799,UG
 3302540800,3302541311,AO
 3302541312,3302542335,NG
+3302542336,3302543359,MU
+3302543360,3302544383,NG
+3302550016,3302550527,TZ
 3302550528,3302551039,ZA
 3302551040,3302551551,MU
 3302551552,3302552063,EG
@@ -129143,6 +130218,9 @@
 3302955520,3302955775,ZW
 3302955776,3302956031,MW
 3302956032,3302956287,CD
+3302956544,3302957055,ZA
+3302957056,3302957311,CG
+3304849408,3305111551,ZA
 3305111552,3307208703,TN
 3307208704,3309305855,EG
 3309305856,3312451583,ZA
@@ -129153,18 +130231,28 @@
 3314024448,3314286591,KE
 3314286592,3314548735,DZ
 3314548736,3314810879,MA
+3314810880,3314827263,AO
+3314843648,3314860031,MG
+3314860032,3314868223,CI
+3314868224,3314876415,GH
 3314876416,3314892799,MG
 3314892800,3314909183,NG
 3314909184,3314910207,TD
 3314910208,3314911231,NG
 3314911232,3314912255,CG
 3314912256,3314913279,BI
+3314913280,3314914303,ZA
+3314914304,3314915327,AO
 3314925568,3314941951,GN
 3314941952,3315073023,EG
 3315073024,3315138559,TZ
 3315138560,3315204095,MA
 3315204096,3315269631,ET
-3315335168,3315351551,ZA
+3315269632,3315286015,ZA
+3315318784,3315322879,LS
+3315326976,3315331071,ZW
+3315331072,3315333119,GH
+3315333120,3315351551,ZA
 3315351552,3315367935,ET
 3315367936,3315384319,KE
 3315384320,3315400703,NG
@@ -129243,6 +130331,7 @@
 3321020416,3321022463,TZ
 3321022464,3321024511,ZA
 3321024512,3321028607,KE
+3321028608,3321032703,CI
 3321032704,3321036799,NG
 3321036800,3321069567,RW
 3321069568,3321102335,NA
@@ -129273,9 +130362,10 @@
 3321880576,3321884671,KM
 3321884672,3321885695,ZA
 3321885696,3321886719,NG
-3321954304,3321970687,US
+3321954304,3321987071,US
 3322019840,3322023935,US
 3322023936,3322028031,CL
+3322036224,3322052607,CA
 3322085376,3322167551,US
 3322167552,3322167807,GB
 3322167808,3322202111,US
@@ -129294,14 +130384,17 @@
 3322613760,3322642431,US
 3322675200,3322683391,US
 3322683392,3322691583,BR
+3322691584,3322707967,US
 3322740736,3322773503,US
 3322806272,3322871807,US
 3322873856,3322875903,US
 3322880000,3322888191,AU
+3322888192,3322904575,US
 3322937344,3322938367,US
 3322939392,3322940671,US
 3322940672,3322940927,AP
 3322940928,3322945535,US
+3322953728,3322970111,US
 3323003136,3323003391,JP
 3323003392,3323003647,US
 3323003904,3323013631,US
@@ -129329,9 +130422,11 @@
 3323201536,3323203583,CA
 3323203584,3323207679,US
 3323207680,3323215871,CA
+3323215872,3323232255,US
 3323267072,3323270420,US
 3323270421,3323270421,CH
 3323270422,3323289599,US
+3323297792,3323330559,US
 3323330816,3323331071,US
 3323331072,3323331839,CA
 3323331840,3323342335,US
@@ -129350,14 +130445,16 @@
 3323391232,3323391487,CA
 3323391488,3323394559,US
 3323394560,3323395071,CL
-3323395072,3323412479,US
+3323395072,3323428863,US
 3323461632,3323462655,US
 3323462656,3323463167,BR
 3323463168,3323464191,US
 3323465728,3323469823,US
+3323478016,3323494399,US
 3323527168,3323659263,US
 3323659264,3323660543,NZ
 3323662336,3323674623,US
+3323674624,3323691007,CA
 3323723776,3324011007,US
 3324011008,3324011263,KN
 3324011264,3324030463,US
@@ -129462,14 +130559,15 @@
 3324706560,3324732415,US
 3324732416,3324732671,EU
 3324732672,3324772351,US
-3324837888,3324844543,US
+3324837888,3324843799,US
+3324843800,3324843801,AP
+3324843802,3324844543,US
 3324844544,3324844799,EU
 3324844800,3324870655,US
 3324903424,3325034495,US
 3325034496,3325035519,NZ
 3325035520,3325059071,US
-3325100032,3325116415,US
-3325120512,3325128703,US
+3325100032,3325128703,US
 3325128704,3325129215,TH
 3325129216,3325131775,US
 3325131776,3325132031,AU
@@ -129508,25 +130606,30 @@
 3325285376,3325304831,US
 3325304832,3325307647,CA
 3325307648,3325307903,BB
-3325307904,3325308927,CA
+3325307904,3325313023,CA
 3325313024,3325321215,US
 3325362176,3325427711,CA
-3325427712,3325460479,ZA
+3325427712,3325452287,ZA
+3325452800,3325453311,ZA
+3325456384,3325460479,US
 3325463808,3325464063,ZA
 3325464064,3325465087,NA
 3325465088,3325493247,ZA
 3325493248,3325497343,US
 3325497344,3325501439,PR
 3325501440,3325505535,US
+3325505536,3325509631,CA
 3325509632,3325517823,US
 3325526016,3325591551,US
 3325624320,3325640703,US
 3325640704,3325644799,CA
+3325644800,3325648895,US
+3325657088,3325689855,US
 3325689856,3325690367,JM
 3325690368,3325691903,US
 3325691904,3325693951,BR
-3325693952,3325700095,US
-3325706240,3325708287,US
+3325693952,3325722623,US
+3325722624,3325755391,CA
 3325755392,3325956095,US
 3325956096,3325960191,CA
 3325960192,3325976063,US
@@ -129565,8 +130668,9 @@
 3326492240,3326492255,CA
 3326492256,3326526463,US
 3326526464,3326526719,CA
-3326526720,3326574591,US
-3326607360,3326640127,US
+3326526720,3326631935,US
+3326631936,3326640127,CA
+3326640128,3326676991,US
 3326680832,3326682623,CA
 3326682624,3326682879,US
 3326682880,3326713343,CA
@@ -129598,7 +130702,9 @@
 3327199232,3327200255,BR
 3327200256,3327256831,US
 3327256832,3327257087,GU
-3327257088,3327591237,US
+3327257088,3327410175,US
+3327426560,3327459327,CA
+3327459328,3327591237,US
 3327591238,3327591238,A1
 3327591239,3327723519,US
 3327723520,3327725567,CA
@@ -129608,6 +130714,7 @@
 3327803904,3327805695,US
 3327807488,3327811583,CA
 3327819776,3327885311,US
+3327885312,3327918079,CA
 3327918080,3327995903,US
 3327995904,3327996927,AN
 3327996928,3328028671,US
@@ -129621,7 +130728,11 @@
 3328241664,3328242943,US
 3328242944,3328243199,GB
 3328243200,3328245759,CA
-3328245760,3328394239,US
+3328245760,3328323583,US
+3328323584,3328327679,CA
+3328327680,3328335871,US
+3328344064,3328360447,US
+3328376832,3328394239,US
 3328394240,3328394495,GB
 3328394496,3328414719,US
 3328414720,3328414975,CH
@@ -129633,7 +130744,7 @@
 3328432640,3328433663,CA
 3328433664,3328433919,CH
 3328433920,3328475135,US
-3328475136,3328477183,CA
+3328475136,3328483327,CA
 3328507904,3328617983,US
 3328617984,3328618239,CA
 3328618240,3328629503,US
@@ -129645,11 +130756,10 @@
 3328704512,3328774399,US
 3328774400,3328775935,CA
 3328775936,3328776703,US
-3328778240,3328782335,US
-3328786432,3328788479,US
+3328778240,3328788479,US
 3328788480,3328789503,FR
 3328789504,3328790015,AP
-3328790016,3328790527,US
+3328790016,3328794623,US
 3328802816,3329230335,US
 3329230336,3329230591,JP
 3329230592,3329497343,US
@@ -129733,7 +130843,9 @@
 3331371328,3331371343,SE
 3331371344,3331371375,US
 3331371376,3331371391,SE
-3331371392,3331563519,US
+3331371392,3331527423,US
+3331527424,3331527679,GB
+3331530752,3331563519,US
 3331563520,3331563775,CH
 3331563776,3331633407,US
 3331633408,3331633919,CH
@@ -129832,7 +130944,9 @@
 3333717760,3333718015,NL
 3333718016,3333825791,US
 3333825792,3333826047,EU
-3333826048,3333859839,US
+3333826048,3333829657,US
+3333829658,3333829658,IN
+3333829659,3333859839,US
 3333859840,3333860095,BM
 3333860096,3333988607,US
 3333988608,3333988863,BR
@@ -129894,7 +131008,9 @@
 3337053184,3337053695,CA
 3337053696,3337055231,US
 3337055232,3337060351,CA
-3337060352,3337289727,US
+3337060352,3337069055,US
+3337069056,3337069119,GB
+3337069120,3337289727,US
 3337289728,3337297919,CA
 3337297920,3337302015,US
 3337302016,3337304319,CA
@@ -130147,7 +131263,9 @@
 3340493568,3340493823,HK
 3340493824,3340584703,US
 3340584704,3340584959,KW
-3340584960,3340664831,US
+3340584960,3340648959,US
+3340648960,3340649215,A1
+3340649216,3340664831,US
 3340664832,3340665855,CA
 3340665856,3340677119,US
 3340677120,3340679167,CA
@@ -130484,8 +131602,8 @@
 3343047968,3343055871,US
 3343055872,3343056895,CA
 3343056896,3343108863,US
-3343108864,3343109375,GB
-3343109376,3343153151,US
+3343108864,3343109119,EU
+3343109120,3343153151,US
 3343153152,3343153167,CA
 3343153168,3343153175,US
 3343153176,3343155199,CA
@@ -130505,7 +131623,9 @@
 3343378432,3343378447,BR
 3343378448,3343380479,US
 3343380480,3343384575,CA
-3343384576,3343465471,US
+3343384576,3343460863,US
+3343460864,3343461375,CA
+3343461376,3343465471,US
 3343465472,3343466495,JM
 3343466496,3343858687,US
 3343858688,3343859711,VG
@@ -130513,7 +131633,9 @@
 3343922976,3343923007,PA
 3343923008,3343923071,US
 3343923072,3343923199,HK
-3343923200,3344126975,US
+3343923200,3344116223,US
+3344116224,3344116735,CA
+3344116736,3344126975,US
 3344126976,3344127999,CA
 3344128000,3344138751,US
 3344138752,3344139007,GB
@@ -130529,14 +131651,21 @@
 3344165664,3344166911,US
 3344166912,3344168959,CA
 3344168960,3344171007,US
-3344171008,3344255999,CA
-3344256000,3344261119,US
-3344261120,3344268543,CA
+3344171008,3344236543,CA
+3344236544,3344237055,US
+3344237056,3344242175,CA
+3344242176,3344242687,US
+3344242688,3344255999,CA
+3344256000,3344261631,US
+3344261888,3344266239,CA
+3344266240,3344266751,US
+3344266752,3344268543,CA
 3344268544,3344269311,US
 3344269312,3344288767,CA
 3344288768,3344289791,PR
 3344289792,3344292863,US
 3344292864,3344296447,CA
+3344296448,3344296959,US
 3344296960,3344297983,GD
 3344297984,3344299007,US
 3344299264,3344299519,CA
@@ -130563,7 +131692,9 @@
 3344408576,3344415679,US
 3344415680,3344415743,AR
 3344415744,3344415999,ES
-3344416000,3344429055,US
+3344416000,3344426239,US
+3344426240,3344426495,A1
+3344426496,3344429055,US
 3344429056,3344429343,CA
 3344429344,3344429375,US
 3344429376,3344431103,CA
@@ -130843,9 +131974,14 @@
 3346525184,3346528255,US
 3346528256,3346529279,PR
 3346529280,3346530303,CA
-3346530304,3346691071,US
+3346530304,3346663167,US
+3346663168,3346663423,CA
+3346663424,3346691071,US
 3346691072,3346692095,CA
-3346692096,3346923519,US
+3346692096,3346793215,US
+3346793216,3346793471,CA
+3346793472,3346793983,US
+3346794496,3346923519,US
 3346923520,3346989055,CA
 3346989056,3347014255,US
 3347014256,3347014271,CY
@@ -130874,15 +132010,21 @@
 3349341696,3349341951,CA
 3349341952,3349446911,US
 3349446912,3349447167,CA
-3349447168,3349532671,US
+3349447168,3349463039,US
+3349463040,3349463295,CA
+3349463296,3349479167,US
+3349479168,3349479423,CA
+3349479424,3349532671,US
 3349532672,3349533695,GB
 3349533696,3349544959,US
-3349544960,3349551103,CA
+3349545216,3349545727,CA
+3349545728,3349545983,US
+3349545984,3349551103,CA
 3349551104,3349553663,US
 3349553664,3349608447,CA
 3349608448,3349609215,US
-3349609216,3349610495,CA
-3349610496,3349614591,US
+3349609216,3349610239,CA
+3349610240,3349614591,US
 3349614592,3349617663,CA
 3349617664,3349637119,US
 3349637120,3349639167,CA
@@ -130925,10 +132067,12 @@
 3350043136,3350134783,US
 3350134784,3350146047,CA
 3350146048,3350150143,US
-3350150144,3350181887,CA
-3350181888,3350182911,US
-3350182912,3350200319,CA
-3350200320,3350469119,US
+3350150144,3350160639,CA
+3350160640,3350160895,US
+3350160896,3350181887,CA
+3350181888,3350183167,US
+3350183168,3350200063,CA
+3350200064,3350469119,US
 3350469632,3350470655,CA
 3350470656,3350475775,US
 3350475776,3350476799,CA
@@ -130954,7 +132098,9 @@
 3350514640,3350514655,GB
 3350514656,3350515135,US
 3350515136,3350515167,GB
-3350515168,3350561279,US
+3350515168,3350548735,US
+3350548736,3350548991,CA
+3350548992,3350561279,US
 3350561280,3350561535,AP
 3350561536,3350593535,US
 3350593536,3350605823,CA
@@ -130973,9 +132119,15 @@
 3350646784,3350648831,US
 3350648832,3350650879,CA
 3350650880,3350790399,US
-3350790400,3350825727,CA
+3350790400,3350814975,CA
+3350814976,3350815231,US
+3350815232,3350825727,CA
 3350825728,3350825983,GB
-3350825984,3350855679,CA
+3350825984,3350836223,CA
+3350836736,3350836991,US
+3350836992,3350843391,CA
+3350843392,3350843647,US
+3350843648,3350855679,CA
 3350855680,3350862079,US
 3350862080,3350864639,CL
 3350864640,3350952495,US
@@ -131248,18 +132400,33 @@
 3353753056,3353753059,BR
 3353753060,3353780223,US
 3353780224,3353780479,GB
-3353780480,3353942527,US
+3353780480,3353836543,US
+3353836544,3353837567,CA
+3353837568,3353855999,US
+3353856000,3353858047,CA
+3353858048,3353861119,US
+3353861120,3353862143,CA
+3353862144,3353942527,US
 3353942528,3353943039,CA
-3353943040,3353979647,US
+3353943040,3353960191,US
+3353960192,3353960447,CA
+3353960448,3353979647,US
 3353979648,3353979903,CA
 3353979904,3353982719,US
 3353982720,3353983231,CA
-3353983232,3353993215,US
-3354001408,3354066943,US
+3353983232,3354066943,US
 3354066944,3354132479,CA
-3354132480,3354591231,US
+3354132480,3354492927,US
+3354492928,3354494975,CA
+3354494976,3354501119,US
+3354501120,3354503167,CA
+3354503168,3354591231,US
 3354591232,3354656767,CA
-3354656768,3354731018,US
+3354656768,3354676223,US
+3354676224,3354677247,CA
+3354677248,3354687487,US
+3354687488,3354688511,CA
+3354688512,3354731018,US
 3354731019,3354731019,EU
 3354731020,3354731519,US
 3354731520,3354731775,AP
@@ -131294,8 +132461,9 @@
 3355319296,3355320319,CA
 3355320320,3355324415,US
 3355324416,3355328511,CA
-3355328512,3355336703,US
-3355344896,3355351039,US
+3355328512,3355338751,US
+3355338752,3355340799,BB
+3355340800,3355351039,US
 3355351040,3355351295,CA
 3355351296,3355372287,US
 3355372288,3355372543,CA
@@ -131533,7 +132701,6 @@
 3356070656,3356070911,AR
 3356070912,3356071423,BR
 3356071424,3356072447,CL
-3356072448,3356073215,CR
 3356073216,3356073471,AR
 3356073472,3356075263,BR
 3356075264,3356076287,BO
@@ -131624,7 +132791,7 @@
 3356150528,3356150783,PA
 3356150784,3356151039,AR
 3356151040,3356151295,NI
-3356151296,3356151807,AR
+3356151552,3356151807,AR
 3356151808,3356152063,CL
 3356152064,3356152575,BR
 3356152576,3356152831,CL
@@ -131725,7 +132892,7 @@
 3356299264,3356305663,MX
 3356305664,3356307455,AR
 3356307456,3356316415,MX
-3356316416,3356317695,AR
+3356316416,3356316671,AR
 3356317696,3356328959,MX
 3356328960,3356329983,HN
 3356329984,3356332031,GF
@@ -131736,8 +132903,8 @@
 3356337664,3356337919,SV
 3356337920,3356338175,HN
 3356338176,3356340223,SV
-3356340224,3356340991,HN
-3356340992,3356341759,SV
+3356340224,3356341247,HN
+3356341248,3356341759,SV
 3356341760,3356342015,HN
 3356342016,3356343295,SV
 3356343296,3356343551,HN
@@ -131767,7 +132934,8 @@
 3356390656,3356391167,CL
 3356391168,3356391423,PA
 3356393472,3356426239,CL
-3356426240,3356491775,US
+3356426240,3356427263,BR
+3356427264,3356491775,US
 3356491776,3356493823,PE
 3356493824,3356495871,ZA
 3356495872,3356499967,AR
@@ -131899,7 +133067,9 @@
 3357476000,3357476015,VE
 3357476016,3357476031,AR
 3357476032,3357476047,VE
-3357476048,3357476287,AR
+3357476048,3357476071,AR
+3357476072,3357476079,VE
+3357476080,3357476287,AR
 3357476288,3357476351,VE
 3357476352,3357476479,AR
 3357476480,3357476607,EC
@@ -131939,7 +133109,8 @@
 3357558784,3357559167,AR
 3357559168,3357559295,EC
 3357559296,3357559551,CA
-3357559552,3357559935,AR
+3357559552,3357559807,US
+3357559808,3357559935,AR
 3357559936,3357560063,VE
 3357560064,3357560247,AR
 3357560248,3357560255,VE
@@ -131971,7 +133142,9 @@
 3358131328,3358131455,CO
 3358131456,3358131983,AR
 3358131984,3358131999,CO
-3358132000,3358133439,AR
+3358132000,3358132087,AR
+3358132088,3358132095,CO
+3358132096,3358133439,AR
 3358133440,3358133471,VE
 3358133472,3358133631,AR
 3358133632,3358133759,VE
@@ -132049,8 +133222,8 @@
 3358569472,3358570495,VE
 3358570496,3358570751,MX
 3358570752,3358571263,PE
-3358571264,3358571775,MX
-3358571776,3358577151,AR
+3358571264,3358572031,MX
+3358572032,3358577151,AR
 3358577152,3358577407,PE
 3358577408,3358578431,AR
 3358578432,3358578687,VE
@@ -132224,7 +133397,9 @@
 3360399360,3360403455,BO
 3360407552,3360423935,PA
 3360423936,3360686079,MX
-3360686080,3360710655,AR
+3360686080,3360710271,AR
+3360710272,3360710399,US
+3360710400,3360710655,AR
 3360710656,3360718847,HT
 3360718848,3360760575,AR
 3360760576,3360760831,UY
@@ -132318,7 +133493,6 @@
 3362476544,3362477055,CR
 3362477056,3362478079,AN
 3362478080,3362480127,AR
-3362484224,3362486271,AR
 3362486272,3362488319,HN
 3362488320,3362504703,PE
 3362504704,3362506751,VE
@@ -132362,6 +133536,7 @@
 3362717696,3362815999,CL
 3362816000,3362832383,AR
 3362836480,3362838527,CO
+3362838528,3362840575,EC
 3362840576,3362897919,CL
 3362897920,3362914303,HT
 3362914304,3362930687,CO
@@ -132377,7 +133552,10 @@
 3363025152,3363025407,PA
 3363025408,3363025663,CO
 3363025664,3363025919,AN
-3363025920,3363026175,CO
+3363025920,3363026431,CO
+3363026432,3363026943,HT
+3363026944,3363027199,CL
+3363027968,3363028991,HN
 3363028992,3363045375,AR
 3363045376,3363110911,CO
 3363110912,3363176447,AR
@@ -132392,7 +133570,9 @@
 3363504128,3363512319,PE
 3363512320,3363554047,AR
 3363554048,3363554175,US
-3363554176,3363557375,AR
+3363554176,3363556095,AR
+3363556096,3363556223,US
+3363556224,3363557375,AR
 3363569664,3363577855,PA
 3363577856,3363586047,CL
 3363594240,3363600383,AR
@@ -132409,7 +133589,6 @@
 3363651584,3363667967,AR
 3363667968,3363676159,EC
 3363676160,3363678207,TT
-3363678208,3363680255,NI
 3363680256,3363682303,GT
 3363682304,3363684351,VE
 3363684352,3363708927,EC
@@ -132419,7 +133598,10 @@
 3363831808,3378511871,BR
 3378511872,3383754751,MX
 3383754752,3384147967,AR
-3384147968,3384213503,PA
+3384147968,3384156159,US
+3384156160,3384160255,PA
+3384160256,3384164351,US
+3384164352,3384213503,PA
 3384213504,3384279039,EC
 3384279040,3384410111,CO
 3384410112,3384672255,CL
@@ -132469,6 +133651,7 @@
 3386720256,3386728447,TT
 3386728448,3386732543,AR
 3386732544,3386734591,CL
+3386734592,3386734847,AR
 3386736640,3386753023,CO
 3386753024,3386761215,CL
 3386761216,3386769407,PA
@@ -132483,9 +133666,17 @@
 3387293696,3387359231,PE
 3387359232,3387424767,AR
 3387424768,3387555839,CO
-3387555840,3387572095,AR
+3387555840,3387569351,AR
+3387569352,3387569355,PE
+3387569356,3387569567,AR
+3387569568,3387569583,PE
+3387569584,3387572095,AR
 3387572096,3387572223,PE
-3387572224,3387600895,AR
+3387572224,3387575935,AR
+3387575936,3387576063,CO
+3387576064,3387577727,AR
+3387577728,3387577855,EC
+3387577856,3387600895,AR
 3387600896,3387604991,CO
 3387604992,3387608319,AR
 3387608320,3387608447,EC
@@ -132563,9 +133754,7 @@
 3389036288,3389036543,NZ
 3389037056,3389037567,AU
 3389037568,3389038591,NC
-3389038592,3389042687,HK
-3389042688,3389043711,CN
-3389043712,3389044735,HK
+3389038592,3389044735,HK
 3389044736,3389046783,AU
 3389046784,3389063167,US
 3389063168,3389063679,AU
@@ -133053,7 +134242,8 @@
 3390769408,3390769663,IN
 3390769664,3390770175,TH
 3390770176,3390771199,AU
-3390771200,3390790399,NZ
+3390771200,3390775295,SG
+3390775296,3390790399,NZ
 3390790400,3390790655,AU
 3390790656,3390801919,NZ
 3390801920,3390802431,CN
@@ -133297,7 +134487,7 @@
 3392114432,3392114687,KR
 3392114688,3392118783,GU
 3392118784,3392126975,MY
-3392126976,3392135167,HK
+3392126976,3392135167,ID
 3392135168,3392143359,TH
 3392143360,3392208895,JP
 3392208896,3392286975,NZ
@@ -133677,10 +134867,8 @@
 3393740800,3393741567,US
 3393741568,3393741823,MG
 3393741824,3393742847,US
-3393742848,3393743185,AP
-3393743186,3393743186,AU
-3393743187,3393743615,AP
-3393743616,3393744895,US
+3393742848,3393743871,TL
+3393743872,3393744895,US
 3393744896,3393748991,PH
 3393748992,3393765375,AU
 3393765376,3393773567,ID
@@ -133710,7 +134898,9 @@
 3393855744,3393855999,NZ
 3393856000,3393856255,AU
 3393856256,3393856511,HK
-3393856768,3393857023,SG
+3393856768,3393856896,SG
+3393856897,3393856897,AP
+3393856898,3393857023,SG
 3393857024,3393857535,NZ
 3393857536,3393858047,HK
 3393858048,3393858559,ID
@@ -133850,7 +135040,9 @@
 3394478080,3394482175,PK
 3394482176,3394484223,AU
 3394484224,3394486271,JP
-3394486272,3394494463,HK
+3394486272,3394489599,HK
+3394489600,3394489631,AP
+3394489632,3394494463,HK
 3394494464,3394498559,JP
 3394498560,3394500607,HK
 3394500608,3394501631,SG
@@ -133923,7 +135115,7 @@
 3394835968,3394836223,AP
 3394836224,3394836479,HK
 3394836480,3394838527,BT
-3394838528,3394846719,NZ
+3394838528,3394846719,AU
 3394846720,3394850815,IN
 3394850816,3394854911,JP
 3394855936,3394856959,AU
@@ -134164,7 +135356,8 @@
 3397279744,3397283839,AU
 3397283840,3397285887,KR
 3397285888,3397287935,BD
-3397287936,3397304319,HK
+3397287936,3397296127,SG
+3397296128,3397304319,HK
 3397304320,3397308415,NZ
 3397308416,3397312511,HK
 3397312512,3397320703,JP
@@ -134337,7 +135530,7 @@
 3398207488,3398208511,IN
 3398213632,3398221823,TW
 3398221824,3398230015,JP
-3398230016,3398238207,AU
+3398230016,3398238207,HK
 3398238208,3398279167,IN
 3398279168,3398287359,CN
 3398287360,3398291455,JP
@@ -134391,7 +135584,9 @@
 3398619136,3398621183,AU
 3398621184,3398623231,HK
 3398623232,3398631423,ID
-3398631424,3398637823,JP
+3398631424,3398637119,JP
+3398637120,3398637183,HK
+3398637184,3398637823,JP
 3398637824,3398638079,PH
 3398638080,3398647807,JP
 3398647808,3398668287,AU
@@ -134442,7 +135637,6 @@
 3398902016,3398902271,HK
 3398902272,3398902783,PH
 3398902784,3398903807,AU
-3398903808,3398905855,TH
 3398905856,3398909951,TW
 3398909952,3398918143,GU
 3398918144,3398926335,JP
@@ -134568,7 +135762,7 @@
 3399826432,3399826943,PH
 3399826944,3399827455,IN
 3399827456,3399835647,AU
-3399835648,3399839743,CN
+3399835648,3399839743,AP
 3399839744,3399841791,JP
 3399841792,3399852031,TW
 3399852032,3399856127,JP
@@ -134595,8 +135789,7 @@
 3399942144,3399945983,HK
 3399945984,3399946239,AU
 3399946240,3399950335,HK
-3399950336,3399958527,MY
-3399958528,3399974911,US
+3399950336,3399974911,US
 3399974912,3399995391,MY
 3399995392,3399999487,KR
 3399999488,3400004671,SG
@@ -134733,14 +135926,12 @@
 3400608768,3400609791,IN
 3400609792,3400630271,JP
 3400630272,3400646655,IN
-3400646656,3400650239,SG
+3400646656,3400648815,SG
+3400648816,3400648831,HK
+3400648832,3400650239,SG
 3400650240,3400650495,AU
-3400650496,3400652543,SG
-3400652544,3400652799,AU
-3400652800,3400654103,SG
-3400654104,3400654111,AU
-3400654112,3400654591,SG
-3400654592,3400654847,AU
+3400650496,3400650751,SG
+3400650752,3400654847,AU
 3400654848,3400663039,IN
 3400663040,3400683519,MY
 3400683520,3400691711,JP
@@ -134766,7 +135957,6 @@
 3400839168,3400847359,JP
 3400847360,3400849407,CN
 3400849408,3400851455,MN
-3400851456,3400859647,AU
 3400867840,3400884223,AU
 3400884224,3400888319,JP
 3400888320,3400892415,CN
@@ -134814,11 +136004,7 @@
 3401545728,3401547775,BD
 3401547776,3401580543,IN
 3401580544,3402629119,CN
-3402629120,3403184127,JP
-3403184128,3403186175,US
-3403186176,3403858175,JP
-3403858176,3403859967,US
-3403859968,3404506879,JP
+3402629120,3404506879,JP
 3404506880,3404507135,US
 3404507136,3404694271,JP
 3404694272,3404694527,US
@@ -135158,7 +136344,7 @@
 3406528000,3406528255,CN
 3406528256,3406528511,AU
 3406528512,3406528767,AP
-3406528768,3406530559,AU
+3406528768,3406530559,HK
 3406530560,3406531583,CN
 3406531584,3406531839,AU
 3406531840,3406532607,CN
@@ -135771,7 +136957,9 @@
 3407523072,3407523327,CN
 3407523328,3407523839,AU
 3407523840,3407524095,CN
-3407524096,3407526143,AU
+3407524096,3407524607,AU
+3407524608,3407524863,NZ
+3407524864,3407526143,AU
 3407526144,3407526399,CN
 3407526400,3407530495,AU
 3407530496,3407531007,CN
@@ -136435,7 +137623,7 @@
 3410903040,3410911231,HK
 3410911232,3410915327,TH
 3410915328,3410919423,ID
-3410919424,3410927615,IN
+3410919424,3410923519,IN
 3410927616,3410931711,NP
 3410931712,3410935807,TW
 3410935808,3410939903,MY
@@ -136496,7 +137684,7 @@
 3411165184,3411173375,MY
 3411173376,3411177471,AU
 3411181056,3411181311,US
-3411181568,3411189759,SG
+3411181568,3411189759,JP
 3411189760,3411197951,AU
 3411197952,3411202047,BD
 3411202048,3411204607,AU
@@ -136579,18 +137767,14 @@
 3411615744,3411623935,JP
 3411623936,3411640319,AU
 3411640320,3411641343,JP
-3411641344,3411641599,IN
-3411641600,3411641855,HK
-3411641856,3411642367,IN
+3411641344,3411642367,IN
 3411642368,3411643391,CN
 3411643392,3411644415,VN
 3411644416,3411644927,AU
 3411644928,3411645951,ID
 3411645952,3411646207,SG
 3411646208,3411647487,IN
-3411647488,3411648511,AU
-3411648512,3411656703,NZ
-3411656704,3411673087,AU
+3411647488,3411673087,AU
 3411673088,3411674111,CN
 3411674112,3411674623,IN
 3411674624,3411675135,HK
@@ -137234,7 +138418,6 @@
 3417939968,3417946111,PF
 3417946112,3417947135,AU
 3417947136,3417947391,IN
-3417947392,3417947647,HK
 3417947648,3417947903,AU
 3417947904,3417948159,IN
 3417948160,3417964543,AU
@@ -137327,7 +138510,7 @@
 3418306560,3418308607,MN
 3418308608,3418324991,CN
 3418324992,3418326015,VU
-3418326016,3418326527,AU
+3418326016,3418326271,AU
 3418326528,3418327039,PH
 3418327040,3418329087,JP
 3418329088,3418333183,CN
@@ -137555,7 +138738,11 @@
 3420436480,3420437503,AU
 3420437504,3420438527,IN
 3420438528,3420454911,HK
-3420454912,3422552063,KR
+3420454912,3422000533,KR
+3422000534,3422000535,AP
+3422000536,3422000536,IN
+3422000537,3422000537,AP
+3422000538,3422552063,KR
 3422552064,3422717439,US
 3422717440,3422717695,A1
 3422717696,3422848511,US
@@ -137620,7 +138807,7 @@
 3423265026,3423265026,A2
 3423265027,3423265247,US
 3423265248,3423265263,EC
-3423265264,3423266815,US
+3423265264,3423268863,US
 3423268864,3423269887,CA
 3423269888,3423285247,US
 3423285248,3423285535,CA
@@ -137979,7 +139166,9 @@
 3423554760,3423554767,CA
 3423554768,3423571967,US
 3423571968,3423574015,PR
-3423574016,3423582207,US
+3423574016,3423579135,US
+3423579136,3423580159,CA
+3423580160,3423582207,US
 3423582208,3423584271,CA
 3423584272,3423584279,US
 3423584280,3423584335,CA
@@ -138031,10 +139220,11 @@
 3423602688,3423603711,KN
 3423603712,3423604967,US
 3423604968,3423604975,BZ
-3423604976,3423605759,US
-3423606784,3423626239,US
+3423604976,3423626239,US
 3423626240,3423627263,CA
 3423627264,3423629311,US
+3423629312,3423630335,AG
+3423630336,3423632383,US
 3423632384,3423633407,A2
 3423633408,3423637503,US
 3423637504,3423639551,CA
@@ -138159,7 +139349,9 @@
 3426729472,3426729983,CA
 3426729984,3426744319,US
 3426744320,3426746367,CA
-3426746368,3427117055,US
+3426746368,3427112447,US
+3427112448,3427112703,CN
+3427112704,3427117055,US
 3427117056,3427117311,CA
 3427117312,3427127295,US
 3427127296,3427127551,CA
@@ -138606,7 +139798,15 @@
 3429411584,3429411839,DE
 3429411840,3429500927,US
 3429500928,3429502975,A2
-3429502976,3429774599,US
+3429502976,3429517407,US
+3429517408,3429517411,HK
+3429517412,3429518763,US
+3429518764,3429518767,SG
+3429518768,3429520951,US
+3429520952,3429520955,GB
+3429520956,3429739175,US
+3429739176,3429739179,GB
+3429739180,3429774599,US
 3429774600,3429774607,BD
 3429774608,3429775359,US
 3429775360,3429777407,TC
@@ -138699,7 +139899,9 @@
 3431526923,3431596287,US
 3431596288,3431602687,CA
 3431602688,3431602943,US
-3431602944,3431613439,CA
+3431602944,3431606271,CA
+3431606272,3431609343,US
+3431609344,3431613439,CA
 3431613440,3431613695,US
 3431613696,3431620095,CA
 3431620096,3431620351,US
@@ -139688,9 +140890,9 @@
 3450254080,3450254335,CA
 3450254336,3450272511,US
 3450272512,3450272767,MX
-3450272768,3450275601,US
-3450275602,3450275602,FR
-3450275603,3450345231,US
+3450272768,3450275583,US
+3450275584,3450275839,FR
+3450275840,3450345231,US
 3450345232,3450345247,FR
 3450345248,3450345263,IT
 3450345264,3450345279,US
@@ -140654,7 +141856,17 @@
 3459852992,3459853007,CA
 3459853008,3459873807,US
 3459873808,3459873823,IT
-3459873824,3460104703,US
+3459873824,3460057283,US
+3460057284,3460057287,TH
+3460057288,3460061687,US
+3460061688,3460061691,HK
+3460061692,3460063175,US
+3460063176,3460063179,HK
+3460063180,3460070959,US
+3460070960,3460070963,GB
+3460070964,3460071043,US
+3460071044,3460071047,GB
+3460071048,3460104703,US
 3460104704,3460105215,MX
 3460105216,3460108895,US
 3460108896,3460108903,FI
@@ -140666,7 +141878,9 @@
 3460161536,3460165631,PR
 3460165632,3460374527,US
 3460374528,3460375551,MX
-3460375552,3460453631,US
+3460375552,3460411149,US
+3460411150,3460411150,EU
+3460411151,3460453631,US
 3460453632,3460453887,BS
 3460453888,3460507647,US
 3460507648,3460507903,MX
@@ -141257,8 +142471,8 @@
 3463229328,3463229335,US
 3463229336,3463243775,CA
 3463243776,3463245055,US
-3463245056,3463249919,CA
-3463249920,3463480063,US
+3463245056,3463249663,CA
+3463249664,3463480063,US
 3463480064,3463480319,CA
 3463480320,3463502335,US
 3463502336,3463502399,GB
@@ -141309,7 +142523,7 @@
 3464196184,3464196191,IT
 3464196192,3464196490,US
 3464196491,3464196491,ZA
-3464196492,3464200191,US
+3464196492,3464208383,US
 3464208384,3464216575,CA
 3464216576,3464309903,US
 3464309904,3464309911,CA
@@ -141484,7 +142698,7 @@
 3466627040,3466661887,US
 3466661888,3466663935,TW
 3466663936,3466683135,US
-3466683136,3466683391,A2
+3466683136,3466683391,NG
 3466683392,3466688511,US
 3466688512,3466688767,A2
 3466688768,3466734847,US
@@ -142678,7 +143892,9 @@
 3471572992,3472375807,US
 3472375808,3472392191,PR
 3472392192,3472408575,CA
-3472408576,3472990207,US
+3472408576,3472571647,US
+3472571648,3472571903,GH
+3472571904,3472990207,US
 3472990208,3472990463,AS
 3472990464,3473039359,US
 3473039360,3473040639,BM
@@ -143275,7 +144491,15 @@
 3480907264,3480907775,FR
 3480907776,3480968191,US
 3480968192,3480968447,AU
-3480968448,3481182503,US
+3480968448,3481164801,US
+3481164802,3481164802,A1
+3481164803,3481165057,US
+3481165058,3481165058,A1
+3481165059,3481165313,US
+3481165314,3481165314,A1
+3481165315,3481165569,US
+3481165570,3481165570,A1
+3481165571,3481182503,US
 3481182504,3481182511,CA
 3481182512,3481665535,US
 3481665536,3481731071,CA
@@ -144209,8 +145433,7 @@
 3493903552,3493903567,KW
 3493903568,3493914239,US
 3493914240,3493914367,CA
-3493914368,3493916671,US
-3493918720,3493936127,US
+3493914368,3493936127,US
 3493936128,3493937151,CA
 3493937152,3493980159,US
 3493980160,3493980447,CA
@@ -144606,7 +145829,9 @@
 3494936516,3494938623,US
 3494938624,3494939647,CA
 3494939648,3494949889,US
-3494949890,3494950142,GB
+3494949890,3494949898,GB
+3494949899,3494949899,US
+3494949900,3494950142,GB
 3494950143,3494950655,US
 3494950656,3494950911,PH
 3494950912,3494964223,US
@@ -147584,7 +148809,9 @@
 3513670912,3513671167,A2
 3513671168,3513778175,US
 3513778176,3513794559,CA
-3513794560,3514007551,US
+3513794560,3513840127,US
+3513840128,3513840383,A1
+3513840384,3514007551,US
 3514007552,3514040319,CA
 3514040320,3514367999,US
 3514368000,3514433535,CA
@@ -148981,9 +150208,7 @@
 3523699200,3523699711,US
 3523699712,3523709183,JP
 3523709184,3523709951,CN
-3523709952,3523713279,JP
-3523713280,3523713535,NL
-3523713536,3523739647,JP
+3523709952,3523739647,JP
 3523739648,3524001791,AU
 3524001792,3524132863,CN
 3524132864,3524145151,PH
@@ -149036,10 +150261,7 @@
 3526926336,3526934527,JP
 3526934528,3526942719,CN
 3526942720,3526950911,AU
-3526950912,3526955904,HK
-3526955905,3526955905,JP
-3526955906,3526967295,HK
-3526967296,3526983679,JP
+3526950912,3526983679,JP
 3526983680,3527004159,HK
 3527004160,3527008255,ID
 3527008256,3527016447,KR
@@ -149551,7 +150773,9 @@
 3557826560,3557834751,AT
 3557834752,3557836287,GB
 3557836288,3557836543,IR
-3557836544,3557837055,GB
+3557836544,3557837026,GB
+3557837027,3557837027,IR
+3557837028,3557837055,GB
 3557837056,3557842943,IR
 3557842944,3557851135,FI
 3557851136,3557859327,HU
@@ -153901,7 +155125,9 @@
 3564560464,3564560479,US
 3564560480,3564560511,GB
 3564560512,3564560527,US
-3564560528,3564560575,GB
+3564560528,3564560531,GB
+3564560532,3564560532,EU
+3564560533,3564560575,GB
 3564560576,3564560607,US
 3564560608,3564560895,GB
 3564560896,3564560903,US
@@ -155398,7 +156624,9 @@
 3569123328,3569156095,GB
 3569156096,3569156351,NL
 3569156352,3569156607,EU
-3569156608,3569165311,NL
+3569156608,3569157379,NL
+3569157380,3569157380,EU
+3569157381,3569165311,NL
 3569165312,3569165567,EU
 3569165568,3569167871,NL
 3569167872,3569168127,EU
@@ -157646,7 +158874,11 @@
 3578040320,3578040575,EU
 3578040576,3578049023,DE
 3578049024,3578049055,CH
-3578049056,3578159615,DE
+3578049056,3578064383,DE
+3578064384,3578064508,EU
+3578064509,3578064510,DE
+3578064511,3578064639,EU
+3578064640,3578159615,DE
 3578159616,3578159871,EU
 3578159872,3578208127,DE
 3578208128,3578208191,PK
@@ -158662,9 +159894,7 @@
 3583019376,3583023215,CH
 3583023216,3583023223,DE
 3583023224,3583025151,CH
-3583025152,3583030783,A2
-3583030784,3583031039,DZ
-3583031040,3583031807,A2
+3583025152,3583031807,A2
 3583031808,3583032063,GR
 3583032064,3583033343,A2
 3583033344,3583041535,FR
@@ -159338,11 +160568,7 @@
 3585155072,3585163263,GB
 3585163264,3585171455,BE
 3585171456,3585179647,RU
-3585179648,3585187839,BE
-3585187840,3585188095,DZ
-3585188096,3585188863,BE
-3585188864,3585189119,DZ
-3585189120,3585189887,BE
+3585179648,3585189887,BE
 3585189888,3585190399,DZ
 3585190400,3585190527,BE
 3585190528,3585190655,DZ
@@ -162176,8 +163402,8 @@
 3626382224,3626382227,CN
 3626382228,3626382239,US
 3626382240,3626382243,NL
-3626382244,3626382247,US
-3626382248,3626382251,IN
+3626382244,3626382248,US
+3626382249,3626382251,IN
 3626382252,3626382263,US
 3626382264,3626382267,CA
 3626382268,3626382271,IT
@@ -163528,7 +164754,13 @@
 3631713112,3631713119,MX
 3631713120,3631713135,US
 3631713136,3631713143,UA
-3631713144,3631841279,US
+3631713144,3631822815,US
+3631822816,3631822831,AU
+3631822832,3631825647,US
+3631825648,3631825663,NZ
+3631825664,3631829023,US
+3631829024,3631829039,IN
+3631829040,3631841279,US
 3631841280,3631874047,CA
 3631874048,3631879199,US
 3631879200,3631879231,CA
@@ -165656,7 +166888,9 @@
 3642744832,3642753023,TR
 3642753024,3642830671,GB
 3642830672,3642830687,A2
-3642830688,3643801599,GB
+3642830688,3642858217,GB
+3642858218,3642858218,EU
+3642858219,3643801599,GB
 3643801600,3644063743,DE
 3644063744,3644325887,EG
 3644325888,3644588031,IT
@@ -167653,6 +168887,7 @@
 3650484672,3650486271,PL
 3650486272,3650502655,RU
 3650502656,3650504703,SE
+3650504704,3650506751,RU
 3650506752,3650508799,LB
 3650508800,3650510847,NL
 3650510848,3650519039,GB
@@ -168538,7 +169773,7 @@
 3654607616,3654607871,SE
 3654607872,3654608127,NO
 3654608128,3654608383,SE
-3654608384,3654608895,A2
+3654608384,3654608895,PL
 3654608896,3654609919,NO
 3654609920,3654610431,SE
 3654610432,3654610943,FR
@@ -168583,11 +169818,7 @@
 3659628544,3659661311,JP
 3659661312,3659792383,TW
 3659792384,3660054527,KR
-3660054528,3660096767,JP
-3660096768,3660097791,US
-3660097792,3660102143,JP
-3660102144,3660102399,US
-3660102400,3660578815,JP
+3660054528,3660578815,JP
 3660578816,3661103103,KR
 3661103104,3663986687,CN
 3663986688,3663987711,AU
diff --git a/installer/resources/install_i2p_service_osx.command b/installer/resources/install_i2p_service_osx.command
index 9bfee453c57107a34fd0b8c75b282e98afca7d17..95da7aedc030eddefa81de1a1bf655d5d7d89a2c 100644
--- a/installer/resources/install_i2p_service_osx.command
+++ b/installer/resources/install_i2p_service_osx.command
@@ -5,13 +5,14 @@
 # Author: Meeh
 cd "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 shfile="tmp$$.sh"
-echo -n 'cat `pwd`/net.i2p.router.plist |' > `pwd`/$shfile
+echo -n 'cat `pwd`/net.i2p.router.plist.template |' > `pwd`/$shfile
 echo -n "sed 's#USERNAME#`whoami`#' " >> `pwd`/$shfile
 echo -n '| sed "s#COMMAND#`pwd`/i2prouter#" | sed "s#I2PPATH#`pwd`/#" > /Library/LaunchDaemons/net.i2p.router.plist' >> `pwd`/$shfile
 chmod +x `pwd`/$shfile
 echo "Please enter your password for sudo privileges to install I2P as a launchd service"
 sudo ./$shfile
-sudo launchctl load -F /Library/LaunchDaemons/net.i2p.router.plist
+sudo chown root:wheel /Library/LaunchDaemons/net.i2p.router.plist
+sudo launchctl load -wF /Library/LaunchDaemons/net.i2p.router.plist
 if [ $? == 0 ]; then
 	echo "I2P Router wrapper was successfully installed as a launchd service."
 else
diff --git a/installer/resources/news.xml b/installer/resources/news.xml
index 3bec527ca2baadb97071b7fe230f91081aedc3bc..342dfab93713fb28f79a33bbb6b057a778a97a3f 100644
--- a/installer/resources/news.xml
+++ b/installer/resources/news.xml
@@ -1,14 +1,16 @@
 <!--
-<i2p.news date="$Date: 2012-07-30 00:00:00 $">
-<i2p.release version="0.9.1" date="2012/07/30" minVersion="0.6" />
+<i2p.news date="$Date: 2012-09-21 00:00:00 $">
+<i2p.release version="0.9.2" date="2012/09/21" minVersion="0.6" />
 -->
 <div lang="en">
-<h3>2012-07-30: <b>0.9.1 <a href="http://www.i2p2.i2p/release-0.9.1.html">Released</a></b></h3>
+<h3>2012-09-21: <b>0.9.2 <a href="http://www.i2p2.i2p/release-0.9.2.html">Released</a></b></h3>
 
 <p>
-0.9.1 includes a large number of bug fixes and improvements in i2psnark, streaming, and elsewhere.
-There are also home page changes, new themes, and translation updates.
-Upgrading is recommended.
+0.9.2 includes extensive low-level changes to improve the performance and efficiency of the router.
+We have updated our UPnP library, to hopefully make UPnP work for more people.
+I2PSnark now has DHT support, but it is not yet enabled by default, as we plan to do more
+testing during the upcoming 0.9.3 development cycle.
+As usual, there's also lots of bug fixes in this release, so updating is recommended. 
 </p><p>
 Say hello to the volunteers on the <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help IRC channel</a>.
 <a href="http://www.i2p2.i2p/getinvolved.html">Get involved</a>,
diff --git a/installer/resources/themes/console/light/default.css b/installer/resources/themes/console/light/default.css
index 157548cee22b7a1b1e2f694796c3595b672cd5d1..d7934b1d5ea2ce58b46bfb1a441a434a52c1b09e 100644
--- a/installer/resources/themes/console/light/default.css
+++ b/installer/resources/themes/console/light/default.css
@@ -160,7 +160,7 @@ hr {
      width: 150px;
      height: 24px;
      border: 1px solid #447;
-     padding: 2px;
+     padding: 2px 3px;
      margin: 4px 0 2px 0px;
      font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
      font-weight: bold;
diff --git a/installer/resources/themes/console/light/i2ptunnel.css b/installer/resources/themes/console/light/i2ptunnel.css
index 72a55c737165609ec3d90967c79e5ef7b1564243..dc24b1457b29d2c5091d2a211dd63e41c6c96c34 100644
--- a/installer/resources/themes/console/light/i2ptunnel.css
+++ b/installer/resources/themes/console/light/i2ptunnel.css
@@ -49,14 +49,11 @@
      width: 300px;
 }
 
-#tunnelEditPage #port {
+#tunnelEditPage #port, #tunnelEditPage #targetPort, #tunnelEditPage #clientPort, #tunnelEditPage #tunnelBackupQuantity, #tunnelEditPage #tunnelVariance {
+     text-align: right;
      width: 80px;
 }
 
-#tunnelEditPage #targetPort, #tunnelEditPage #clientPort, #tunnelEditPage #tunnelBackupQuantity, #tunnelEditPage #tunnelVariance {
-     width: 150px;
-}
-
 #tunnelEditPage #shared, #tunnelEditPage #connectDelay, #tunnelEditPage #startOnLoad {
      width: 16px;
 }
diff --git a/installer/resources/themes/susidns/dark/susidns.css b/installer/resources/themes/susidns/dark/susidns.css
index fabec4b5d50f8db14ea9c54e7c622ecef4d70a45..fec7be2a99e9e8b3af970163508f0bf3b5397d87 100644
--- a/installer/resources/themes/susidns/dark/susidns.css
+++ b/installer/resources/themes/susidns/dark/susidns.css
@@ -133,6 +133,9 @@ p.messages {
 p.footer {
      font-size:7pt;
      text-align: center;
+}
+
+.iframed #footer {
      display: none;
 }
 
@@ -314,4 +317,4 @@ textarea {
 
 input:focus, textarea:focus {
      color: #ee9;     
-}
\ No newline at end of file
+}
diff --git a/installer/resources/themes/susidns/light/susidns.css b/installer/resources/themes/susidns/light/susidns.css
index 089b71b829e9fa87620ac4a5f8a823050f9441b3..62e9055fc05155037629f07d16f3bbddaad30311 100644
--- a/installer/resources/themes/susidns/light/susidns.css
+++ b/installer/resources/themes/susidns/light/susidns.css
@@ -102,6 +102,9 @@ p.messages {
 p.footer {
      font-size:7pt;
      text-align: center;
+}
+
+.iframed #footer {
      display: none;
 }
 
diff --git a/installer/resources/themes/susidns/midnight/susidns.css b/installer/resources/themes/susidns/midnight/susidns.css
index 65a1b7f75cb58da21d15194cec07eb2ae50986ef..dbe1941cd40489a15ffef83e968f4a3948c2b5a0 100644
--- a/installer/resources/themes/susidns/midnight/susidns.css
+++ b/installer/resources/themes/susidns/midnight/susidns.css
@@ -133,6 +133,9 @@ p.messages {
 p.footer {
      font-size:7pt;
      text-align: center;
+}
+
+.iframed #footer {
      display: none;
 }
 
diff --git a/installer/resources/themes/susimail/dark/susimail.css b/installer/resources/themes/susimail/dark/susimail.css
index e9d84a80712dcb6c0f6bc411c59b4e527841a20e..0077bb91646590a65968d096529653650dccb44c 100644
--- a/installer/resources/themes/susimail/dark/susimail.css
+++ b/installer/resources/themes/susimail/dark/susimail.css
@@ -76,6 +76,9 @@ p.footer {
      margin-right:10mm;
      font-size:8pt;
      line-height:10pt;
+}
+
+.iframed #footer {
      display: none;
 }
 
@@ -281,4 +284,4 @@ input:disabled, input:disabled:hover, input:disabled:active {
      -moz-box-shadow: none;
      -khtml-box-shadow: none;
      background: #000 !important;
-}
\ No newline at end of file
+}
diff --git a/installer/resources/themes/susimail/light/susimail.css b/installer/resources/themes/susimail/light/susimail.css
index 19920d01b109c443e8673703406d5a0efbdfba9b..33f5585fd384a016fdb368bf521211901f6c4c02 100644
--- a/installer/resources/themes/susimail/light/susimail.css
+++ b/installer/resources/themes/susimail/light/susimail.css
@@ -54,6 +54,9 @@ p.footer {
      margin-right:10mm;
      font-size:8pt;
      line-height:10pt;
+}
+
+.iframed #footer {
      display: none;
 }
 
diff --git a/router/java/src/net/i2p/router/Blocklist.java b/router/java/src/net/i2p/router/Blocklist.java
index 79fba4939ab06ec300ffd22744ccd011809c1735..52cbad199943fd00ebc8aaad0a7489829d51b6e9 100644
--- a/router/java/src/net/i2p/router/Blocklist.java
+++ b/router/java/src/net/i2p/router/Blocklist.java
@@ -91,7 +91,7 @@ public class Blocklist {
     static final String BLOCKLIST_FILE_DEFAULT = "blocklist.txt";
 
     public void startup() {
-        if (! Boolean.valueOf(_context.getProperty(PROP_BLOCKLIST_ENABLED, "true")).booleanValue())
+        if (! _context.getBooleanPropertyDefaultTrue(PROP_BLOCKLIST_ENABLED))
             return;
         String file = _context.getProperty(PROP_BLOCKLIST_FILE, BLOCKLIST_FILE_DEFAULT);
         // Maybe someday we'll read in multiple files and merge them
@@ -849,6 +849,7 @@ public class Blocklist {
         return Translate.getString(key, _context, BUNDLE_NAME);
     }
 
+/****
     public static void main(String args[]) {
         Blocklist b = new Blocklist();
         if ( (args != null) && (args.length == 1) )
@@ -861,4 +862,5 @@ public class Blocklist {
             System.out.println("Testing " + tests[i] + " returns " + b.isBlocklisted(tests[i]));
         }
     }
+****/
 }
diff --git a/router/java/src/net/i2p/router/ClientTunnelSettings.java b/router/java/src/net/i2p/router/ClientTunnelSettings.java
index cc8c74e6cc059c78e7b4ade8a640476c2bfe2fe1..efed48a9d71152102afd338c682991238e84684d 100644
--- a/router/java/src/net/i2p/router/ClientTunnelSettings.java
+++ b/router/java/src/net/i2p/router/ClientTunnelSettings.java
@@ -20,12 +20,8 @@ public class ClientTunnelSettings {
     private TunnelPoolSettings _outboundSettings;
     
     public ClientTunnelSettings() {
-        _inboundSettings = new TunnelPoolSettings();
-        _inboundSettings.setIsInbound(true);
-        _inboundSettings.setIsExploratory(false);
-        _outboundSettings = new TunnelPoolSettings();
-        _outboundSettings.setIsInbound(false);
-        _outboundSettings.setIsExploratory(false);
+        _inboundSettings = new TunnelPoolSettings(false, true);
+        _outboundSettings = new TunnelPoolSettings(false, false);
     }
     
     public TunnelPoolSettings getInboundSettings() { return _inboundSettings; }
diff --git a/router/java/src/net/i2p/router/InNetMessagePool.java b/router/java/src/net/i2p/router/InNetMessagePool.java
index d576ea9fdc5c9e2aa03829208fee0f5b962e17a0..ab3b2323c9b2964b2cbcce5fd5ae266c109d8e96 100644
--- a/router/java/src/net/i2p/router/InNetMessagePool.java
+++ b/router/java/src/net/i2p/router/InNetMessagePool.java
@@ -348,7 +348,7 @@ public class InNetMessagePool implements Service {
         _dispatchThreaded = DEFAULT_DISPATCH_THREADED;
         String threadedStr = _context.getProperty(PROP_DISPATCH_THREADED);
         if (threadedStr != null) {
-            _dispatchThreaded = Boolean.valueOf(threadedStr).booleanValue();
+            _dispatchThreaded = Boolean.parseBoolean(threadedStr);
         }
         if (_dispatchThreaded) {
             _context.statManager().createRateStat("pool.dispatchDataTime", "How long a tunnel dispatch takes", "Tunnels", new long[] { 10*60*1000l, 60*60*1000l, 24*60*60*1000l });
diff --git a/router/java/src/net/i2p/router/MessageHistory.java b/router/java/src/net/i2p/router/MessageHistory.java
index e566462d12ea553f5dcc59a76ac97d4d57cda47e..5563eec2151f9af6b5e75438e81edc8b12d7768b 100644
--- a/router/java/src/net/i2p/router/MessageHistory.java
+++ b/router/java/src/net/i2p/router/MessageHistory.java
@@ -80,7 +80,7 @@ public class MessageHistory {
     String getFilename() { return _historyFile; }
     
     private void updateSettings() {
-        _doLog = Boolean.valueOf(_context.getProperty(PROP_KEEP_MESSAGE_HISTORY)).booleanValue();
+        _doLog = _context.getBooleanProperty(PROP_KEEP_MESSAGE_HISTORY);
         _historyFile = _context.getProperty(PROP_MESSAGE_HISTORY_FILENAME, DEFAULT_MESSAGE_HISTORY_FILENAME);
     }
     
diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java
index d19006843d4d7a6153f24f8350a7c28c713f631a..8b2a414f1d654f624dae838912968c5f7868da4a 100644
--- a/router/java/src/net/i2p/router/Router.java
+++ b/router/java/src/net/i2p/router/Router.java
@@ -49,6 +49,7 @@ import net.i2p.util.FortunaRandomSource;
 import net.i2p.util.I2PAppThread;
 import net.i2p.util.I2PThread;
 import net.i2p.util.Log;
+import net.i2p.util.OrderedProperties;
 import net.i2p.util.SecureFileOutputStream;
 import net.i2p.util.SimpleByteCache;
 import net.i2p.util.SimpleScheduler;
@@ -176,7 +177,7 @@ public class Router implements RouterClock.ClockShiftListener {
 
         // Do we copy all the data files to the new directory? default false
         String migrate = System.getProperty("i2p.dir.migrate");
-        boolean migrateFiles = Boolean.valueOf(migrate).booleanValue();
+        boolean migrateFiles = Boolean.parseBoolean(migrate);
         String userDir = WorkingDir.getWorkingDir(envProps, migrateFiles);
 
         // Use the router.config file specified in the router.configLocation property
@@ -196,7 +197,7 @@ public class Router implements RouterClock.ClockShiftListener {
         envProps.putAll(_config);
 
         // This doesn't work, guess it has to be in the static block above?
-        // if (Boolean.valueOf(envProps.getProperty("router.disableIPv6")).booleanValue())
+        // if (Boolean.parseBoolean(envProps.getProperty("router.disableIPv6")))
         //    System.setProperty("java.net.preferIPv4Stack", "true");
 
         if (envProps.getProperty("i2p.dir.config") == null)
@@ -630,7 +631,7 @@ public class Router implements RouterClock.ClockShiftListener {
             return true;
         String h = _context.getProperty(PROP_HIDDEN_HIDDEN);
         if (h != null)
-            return Boolean.valueOf(h).booleanValue();
+            return Boolean.parseBoolean(h);
         return _context.commSystem().isInBadCountry();
     }
 
@@ -976,44 +977,24 @@ public class Router implements RouterClock.ClockShiftListener {
      * Save the current config options (returning true if save was 
      * successful, false otherwise)
      *
-     * Note that unlike DataHelper.storeProps(),
-     * this does escape the \r or \n that are unescaped in DataHelper.loadProps().
-     * Note that the escaping of \r or \n was probably a mistake and should be taken out.
-     *
      * Synchronized with file read in getConfig()
      */
     public boolean saveConfig() {
-        synchronized(_configFileLock) {
-            FileOutputStream fos = null;
-            try {
-                fos = new SecureFileOutputStream(_configFilename);
-                StringBuilder buf = new StringBuilder(8*1024);
-                buf.append("# NOTE: This I2P config file must use UTF-8 encoding\n");
-                TreeSet ordered = new TreeSet(_config.keySet());
-                for (Iterator iter = ordered.iterator() ; iter.hasNext(); ) {
-                    String key = (String)iter.next();
-                    String val = _config.get(key);
-                        // Escape line breaks before saving.
-                        // Remember: "\" needs escaping both for regex and string.
-                        // NOOO - see comments in DataHelper
-                        //val = val.replaceAll("\\r","\\\\r");
-                        //val = val.replaceAll("\\n","\\\\n");
-                    buf.append(key).append('=').append(val).append('\n');
-                }
-                fos.write(buf.toString().getBytes("UTF-8"));
-            } catch (IOException ioe) {
+        try {
+            Properties ordered = new OrderedProperties();
+            synchronized(_configFileLock) {
+                ordered.putAll(_config);
+                DataHelper.storeProps(ordered, new File(_configFilename));
+            }
+        } catch (Exception ioe) {
                 // warning, _log will be null when called from constructor
                 if (_log != null)
                     _log.error("Error saving the config to " + _configFilename, ioe);
                 else
                     System.err.println("Error saving the config to " + _configFilename + ": " + ioe);
                 return false;
-            } finally {
-                if (fos != null) try { fos.close(); } catch (IOException ioe) {}
-            }
-            
-            return true;
         }
+        return true;
     }
     
     /**
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 02a64e9ea0ffbc538efc8c9fe408ea1f175cc032..7f4edb97520b081fa27255ad38c4da1068327822 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 = "Monotone";
     public final static String VERSION = CoreVersion.VERSION;
-    public final static long BUILD = 23;
+    public final static long BUILD = 13;
 
     /** for example "-test" */
-    public final static String EXTRA = "-rc-test";
+    public final static String EXTRA = "";
     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/TunnelPoolSettings.java b/router/java/src/net/i2p/router/TunnelPoolSettings.java
index afcf1c727f9b6c6c6faaef937d73fbed766cfd39..ff8597882230acbddcd400ccbe27649413cbcbce 100644
--- a/router/java/src/net/i2p/router/TunnelPoolSettings.java
+++ b/router/java/src/net/i2p/router/TunnelPoolSettings.java
@@ -21,8 +21,8 @@ public class TunnelPoolSettings {
     private int _length;
     private int _lengthVariance;
     private int _lengthOverride;
-    private boolean _isInbound;
-    private boolean _isExploratory;
+    private final boolean _isInbound;
+    private final boolean _isExploratory;
     private boolean _allowZeroHop;
     private int _IPRestriction;
     private final Properties _unknownOptions;
@@ -54,7 +54,9 @@ public class TunnelPoolSettings {
     public static final boolean DEFAULT_ALLOW_ZERO_HOP = true;
     public static final int     DEFAULT_IP_RESTRICTION = 2;    // class B (/16)
     
-    public TunnelPoolSettings() {
+    public TunnelPoolSettings(boolean isExploratory, boolean isInbound) {
+        _isExploratory = isExploratory;
+        _isInbound = isInbound;
         _quantity = DEFAULT_QUANTITY;
         _backupQuantity = DEFAULT_BACKUP_QUANTITY;
         // _rebuildPeriod = DEFAULT_REBUILD_PERIOD;
@@ -130,11 +132,9 @@ public class TunnelPoolSettings {
 
     /** is this an inbound tunnel? */
     public boolean isInbound() { return _isInbound; }
-    public void setIsInbound(boolean isInbound) { _isInbound = isInbound; }
     
     /** is this an exploratory tunnel (or a client tunnel) */
     public boolean isExploratory() { return _isExploratory; }
-    public void setIsExploratory(boolean isExploratory) { _isExploratory = isExploratory; }
     
     // Duration is hardcoded
     //public int getDuration() { return _duration; }
@@ -237,7 +237,7 @@ public class TunnelPoolSettings {
     
     private static final boolean getBoolean(String str, boolean defaultValue) { 
         if (str == null) return defaultValue;
-        boolean v = Boolean.valueOf(str).booleanValue() ||
+        boolean v = Boolean.parseBoolean(str) ||
                     (str != null && "YES".equals(str.toUpperCase(Locale.US)));
         return v;
     }
diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
index 15e4dbd71ee67a04eebe83e40c8c62afdb78a0ff..fc046f3e6cce033b44c07b7b92ed20d87fc4998d 100644
--- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
+++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
@@ -308,6 +308,11 @@ class ClientConnectionRunner {
             if (_log.shouldLog(Log.WARN))
                 _log.warn("Error writing out the disconnect message: " + ime);
         }
+        // give it a little time to get sent out...
+        // even better would be to have stopRunning() flush it?
+        try {
+            Thread.sleep(50);
+        } catch (InterruptedException ie) {}
         stopRunning();
     }
     
diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java
index 71f2fc597e324a80aca0249a2f93e750a337d6d8..c1816bfd0287ad95d58f3b64e86a813e1844d764 100644
--- a/router/java/src/net/i2p/router/client/ClientManager.java
+++ b/router/java/src/net/i2p/router/client/ClientManager.java
@@ -326,7 +326,7 @@ class ClientManager {
         if (destHash == null) return true;
         ClientConnectionRunner runner = getRunner(destHash);
         if (runner == null) return true;
-        return !Boolean.valueOf(runner.getConfig().getOptions().getProperty(ClientManagerFacade.PROP_CLIENT_ONLY)).booleanValue();
+        return !Boolean.parseBoolean(runner.getConfig().getOptions().getProperty(ClientManagerFacade.PROP_CLIENT_ONLY));
     }
 
     /**
diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
index fa762ecabe1e9c221586155a2e595a0ae0e7828c..6e7f4a04f0504ac7aeb4057bb050d05a3608a167 100644
--- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
+++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
@@ -169,7 +169,7 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
         }
 
         // Auth, since 0.8.2
-        if (_enforceAuth && Boolean.valueOf(_context.getProperty("i2cp.auth")).booleanValue()) {
+        if (_enforceAuth && _context.getBooleanProperty("i2cp.auth")) {
             String configUser = _context.getProperty("i2cp.username");
             String configPW = _context.getProperty("i2cp.password");
             if (configUser != null && configPW != null) {
diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java
index 349dd7a5499a544e6926bc11c923c62a1e1b525c..f7090eb7ef532ef8f65e100db9979d03656d42cb 100644
--- a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java
+++ b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java
@@ -452,7 +452,7 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
         // Per-message flag == false overrides session option which is default true
         String allow = _clientMessage.getSenderConfig().getOptions().getProperty(BUNDLE_REPLY_LEASESET);
         boolean allowLeaseBundle = SendMessageOptions.getSendLeaseSet(sendFlags) &&
-                                   (allow == null || Boolean.valueOf(allow).booleanValue());
+                                   (allow == null || Boolean.parseBoolean(allow));
         if (allowLeaseBundle) {
             // If we want an ack, bundle a leaseSet...
             //replyLeaseSet = getReplyLeaseSet(wantACK);
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java
index 9e05ff9ae8282f111b66a00515e1f3b5b5e3f25c..f21beb47caf900c4672a55e5883af14f0c1bcc56 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java
@@ -25,7 +25,7 @@ class FloodfillMonitorJob extends JobImpl {
     private static final int REQUEUE_DELAY = 60*60*1000;
     private static final long MIN_UPTIME = 2*60*60*1000;
     private static final long MIN_CHANGE_DELAY = 6*60*60*1000;
-    private static final int MIN_FF = 300;
+    private static final int MIN_FF = 360;
     private static final int MAX_FF = 999999;
     private static final String PROP_FLOODFILL_PARTICIPANT = "router.floodfillParticipant";
     
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java
index 0011b2098d0d0ad7855c57fb0e017e702681d0c3..80f48623fbce0e02bf6ef4da2ef87d03f9d67271 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java
@@ -45,7 +45,7 @@ class HarvesterJob extends JobImpl {
     public static final String PROP_ENABLED = "netDb.shouldHarvest";
 
     private boolean harvestDirectly() { 
-        return Boolean.valueOf(getContext().getProperty("netDb.harvestDirectly", "false")).booleanValue();
+        return getContext().getBooleanProperty("netDb.harvestDirectly");
     }
     
     public HarvesterJob(RouterContext context, KademliaNetworkDatabaseFacade facade) {
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
index b246c3afbdda31fab10dfa82c252151511febaa0..9a4aa09c67e8c7e5c5b7d8fd103ca1e57125c182 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
@@ -220,7 +220,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         }
         String enforce = _context.getProperty(PROP_ENFORCE_NETID);
         if (enforce != null) 
-            _enforceNetId = Boolean.valueOf(enforce).booleanValue();
+            _enforceNetId = Boolean.parseBoolean(enforce);
         else
             _enforceNetId = DEFAULT_ENFORCE_NETID;
         _ds.restart();
@@ -246,7 +246,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         String dbDir = _context.getProperty(PROP_DB_DIR, DEFAULT_DB_DIR);
         String enforce = _context.getProperty(PROP_ENFORCE_NETID);
         if (enforce != null) 
-            _enforceNetId = Boolean.valueOf(enforce).booleanValue();
+            _enforceNetId = Boolean.parseBoolean(enforce);
         else
             _enforceNetId = DEFAULT_ENFORCE_NETID;
         
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
index c21c7cee2edc0caaae64eadc27a9161d7dfef9d8..590880aaeec2ea1824f8d5cc04cb1f1c586d5873 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
@@ -136,7 +136,7 @@ class SearchJob extends JobImpl {
         // Returning false essentially enables kademlia as a backup to floodfill for search responses.
         if (FloodfillNetworkDatabaseFacade.floodfillEnabled(ctx))
             return false;
-        return Boolean.valueOf(ctx.getProperty("netDb.floodfillOnly", DEFAULT_FLOODFILL_ONLY + "")).booleanValue();
+        return ctx.getProperty("netDb.floodfillOnly", DEFAULT_FLOODFILL_ONLY);
     }
     
 /***
diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java
index 7fa12be10149bb398233a78d201204f6b7ed1d83..75b5f12982a5e5285c30989707a22a290dfff0ef 100644
--- a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java
+++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java
@@ -527,7 +527,7 @@ public class Reseeder {
 
 /******
     public static void main(String args[]) {
-        if ( (args != null) && (args.length == 1) && (!Boolean.valueOf(args[0]).booleanValue()) ) {
+        if ( (args != null) && (args.length == 1) && (!Boolean.parseBoolean(args[0])) ) {
             System.out.println("Not reseeding, as requested");
             return; // not reseeding on request
         }
diff --git a/router/java/src/net/i2p/router/startup/BootCommSystemJob.java b/router/java/src/net/i2p/router/startup/BootCommSystemJob.java
index c6bd62c762d3666b545ae80b7f4ebfa020c54dd4..3af4164b5eb8e0f680fca7525dfd7da05e721e4e 100644
--- a/router/java/src/net/i2p/router/startup/BootCommSystemJob.java
+++ b/router/java/src/net/i2p/router/startup/BootCommSystemJob.java
@@ -54,7 +54,7 @@ public class BootCommSystemJob extends JobImpl {
         
     private void startupDb() {
         Job bootDb = new BootNetworkDbJob(getContext());
-        boolean useTrusted = Boolean.valueOf(getContext().getProperty(PROP_USE_TRUSTED_LINKS)).booleanValue();
+        boolean useTrusted = getContext().getBooleanProperty(PROP_USE_TRUSTED_LINKS);
         if (useTrusted) {
             _log.debug("Using trusted links...");
             getContext().jobQueue().addJob(new BuildTrustedLinksJob(getContext(), bootDb));
diff --git a/router/java/src/net/i2p/router/tasks/OOMListener.java b/router/java/src/net/i2p/router/tasks/OOMListener.java
index 6fc9b92cded589b68984105ba2ea98932004b1d8..1662b9ffe8076b1c46773889fb7086184a475e06 100644
--- a/router/java/src/net/i2p/router/tasks/OOMListener.java
+++ b/router/java/src/net/i2p/router/tasks/OOMListener.java
@@ -1,7 +1,10 @@
 package net.i2p.router.tasks;
 
+import java.util.concurrent.atomic.AtomicBoolean;
+
 import net.i2p.router.Router;
 import net.i2p.router.RouterContext;
+import net.i2p.router.util.EventLog;
 import net.i2p.util.I2PThread;
 import net.i2p.util.Log;
 
@@ -12,30 +15,47 @@ import net.i2p.util.Log;
  */
 public class OOMListener implements I2PThread.OOMEventListener { 
     private final RouterContext _context;
+    private final AtomicBoolean _wasCalled = new AtomicBoolean();
 
     public OOMListener(RouterContext ctx) {
         _context = ctx;
     }
 
     public void outOfMemory(OutOfMemoryError oom) { 
-        // boost priority to help us shut down
-        Thread.currentThread().setPriority(Thread.MAX_PRIORITY - 1);
-        Router.clearCaches();
-        Log log = _context.logManager().getLog(Router.class);
-        log.log(Log.CRIT, "Thread ran out of memory, shutting down I2P", oom);
-        // prevent multiple parallel shutdowns (when you OOM, you OOM a lot...)
-        if (_context.router().isFinalShutdownInProgress())
-            return;
-        for (int i = 0; i < 5; i++) { // try this 5 times, in case it OOMs
-            try { 
-                log.log(Log.CRIT, "free mem: " + Runtime.getRuntime().freeMemory() + 
-                                  " total mem: " + Runtime.getRuntime().totalMemory());
-                break; // w00t
-            } catch (OutOfMemoryError oome) {
-                // gobble
-            }
-        }
-        log.log(Log.CRIT, "To prevent future shutdowns, increase wrapper.java.maxmemory in $I2P/wrapper.config");
+        try { 
+            // prevent multiple parallel shutdowns (when you OOM, you OOM a lot...)
+            if (_context.router().isFinalShutdownInProgress())
+                return;
+        } catch (OutOfMemoryError oome) {}
+        try { 
+            // Only do this once
+            if (_wasCalled.getAndSet(true))
+                return;
+        } catch (OutOfMemoryError oome) {}
+
+        try { 
+            // boost priority to help us shut down
+            // this may or may not do anything...
+            Thread.currentThread().setPriority(Thread.MAX_PRIORITY - 1);
+        } catch (OutOfMemoryError oome) {}
+        try { 
+            Router.clearCaches();
+        } catch (OutOfMemoryError oome) {}
+        Log log = null;
+        try { 
+            log = _context.logManager().getLog(Router.class);
+            log.log(Log.CRIT, "Thread ran out of memory, shutting down I2P", oom);
+            log.log(Log.CRIT, "free mem: " + Runtime.getRuntime().freeMemory() + 
+                              " total mem: " + Runtime.getRuntime().totalMemory());
+            if (_context.hasWrapper())
+                log.log(Log.CRIT, "To prevent future shutdowns, increase wrapper.java.maxmemory in $I2P/wrapper.config");
+        } catch (OutOfMemoryError oome) {}
+        try { 
+            ThreadDump.dump(_context, 1);
+        } catch (OutOfMemoryError oome) {}
+        try { 
+            _context.router().eventLog().addEvent(EventLog.OOM);
+        } catch (OutOfMemoryError oome) {}
         _context.router().shutdown(Router.EXIT_OOM); 
     }
 }
diff --git a/router/java/src/net/i2p/router/tasks/Restarter.java b/router/java/src/net/i2p/router/tasks/Restarter.java
index 2d497abb4b4a7fbc54735d7197d77fef79141ad2..c904cad507f6e4f9ac6c92fe1ee4af65a155ff27 100644
--- a/router/java/src/net/i2p/router/tasks/Restarter.java
+++ b/router/java/src/net/i2p/router/tasks/Restarter.java
@@ -3,6 +3,7 @@ package net.i2p.router.tasks;
 import net.i2p.router.Router;
 import net.i2p.router.RouterClock;
 import net.i2p.router.RouterContext;
+import net.i2p.router.util.EventLog;
 import net.i2p.util.Log;
 
 /**
@@ -16,6 +17,7 @@ public class Restarter implements Runnable {
     }
 
     public void run() {
+        _context.router().eventLog().addEvent(EventLog.SOFT_RESTART);
         Log log = _context.logManager().getLog(Router.class);
         log.error("Stopping the router for a restart...");
         log.logAlways(Log.WARN, "Stopping the client manager");
diff --git a/router/java/src/net/i2p/router/tasks/RouterWatchdog.java b/router/java/src/net/i2p/router/tasks/RouterWatchdog.java
index 2cf889162496cd86bd673089de909b9ff418a4db..233c3bd7a055f508b46380df862d9f19b2a90846 100644
--- a/router/java/src/net/i2p/router/tasks/RouterWatchdog.java
+++ b/router/java/src/net/i2p/router/tasks/RouterWatchdog.java
@@ -64,7 +64,7 @@ public class RouterWatchdog implements Runnable {
     
     private boolean shutdownOnHang() {
         // prop default false
-        if (!Boolean.valueOf(_context.getProperty("watchdog.haltOnHang")).booleanValue())
+        if (!_context.getBooleanProperty("watchdog.haltOnHang"))
             return false;
 
         // Client manager starts complaining after 10 minutes, and we run every minute,
@@ -113,16 +113,7 @@ public class RouterWatchdog implements Runnable {
                 // This works on linux...
                 // It won't on windows, and we can't call i2prouter.bat either, it does something
                 // completely different...
-                if (_context.hasWrapper() && !SystemVersion.isWindows()) {
-                    ShellCommand sc = new ShellCommand();
-                    File i2pr = new File(_context.getBaseDir(), "i2prouter");
-                    String[] args = new String[2];
-                    args[0] = i2pr.getAbsolutePath();
-                    args[1] = "dump";
-                    boolean success = sc.executeSilentAndWaitTimed(args, 10);
-                    if (success)
-                        _log.log(Log.CRIT, "Threads dumped to wrapper log");
-                }
+                ThreadDump.dump(_context, 10);
             }
         }
     }
diff --git a/router/java/src/net/i2p/router/tasks/ThreadDump.java b/router/java/src/net/i2p/router/tasks/ThreadDump.java
new file mode 100644
index 0000000000000000000000000000000000000000..c5d0b948165b3354d213cc0095e8c118813354c1
--- /dev/null
+++ b/router/java/src/net/i2p/router/tasks/ThreadDump.java
@@ -0,0 +1,43 @@
+package net.i2p.router.tasks;
+
+import java.io.File;
+
+import net.i2p.I2PAppContext;
+import net.i2p.util.ShellCommand;
+import net.i2p.util.Log;
+import net.i2p.util.SystemVersion;
+
+/**
+ *  Only works with wrapper on non-windows platforms
+ *
+ *  @since 0.9.3 moved from RouterWatchdog
+ */
+abstract class ThreadDump {
+
+    /**
+     *  Signal the wrapper to asynchronously dump threads to wrapper.log.
+     *  It waits for the signal to complete (which should be fast)
+     *  but does not wait for the dump itself.
+     *
+     *  @param secondsToWait if <= 0, don't wait
+     *  @return success, false if windows or no wrapper, true if secondsToWait <= 0,
+                         false if timed out, dump result otherwise
+     */
+    public static boolean dump(I2PAppContext context, int secondsToWait) {
+        if (SystemVersion.isWindows() || !context.hasWrapper())
+            return false;
+        ShellCommand sc = new ShellCommand();
+        File i2pr = new File(context.getBaseDir(), "i2prouter");
+        String[] args = new String[2];
+        args[0] = i2pr.getAbsolutePath();
+        args[1] = "dump";
+        boolean success = sc.executeSilentAndWaitTimed(args, secondsToWait);
+        if (secondsToWait <= 0)
+            success = true;
+        if (success) {
+            Log log = context.logManager().getLog(ThreadDump.class);
+            log.log(Log.CRIT, "Threads dumped to wrapper log");
+        }
+        return success;
+    }
+}
diff --git a/router/java/src/net/i2p/router/time/RouterTimestamper.java b/router/java/src/net/i2p/router/time/RouterTimestamper.java
index 83576fde100678362f0707bafe385a967c3fc41b..d835b66f9c9bb939b114133f64cccf8934634ab2 100644
--- a/router/java/src/net/i2p/router/time/RouterTimestamper.java
+++ b/router/java/src/net/i2p/router/time/RouterTimestamper.java
@@ -72,7 +72,7 @@ public class RouterTimestamper extends Timestamper {
         // so the property must be set at startup.
         // We still need to be instantiated since the router calls clock().getTimestamper().waitForInitialization()
         String disabled = ctx.getProperty(PROP_DISABLED, DEFAULT_DISABLED);
-        if (Boolean.valueOf(disabled).booleanValue()) {
+        if (Boolean.parseBoolean(disabled)) {
             _initialized = true;
             return;
         }
@@ -321,7 +321,7 @@ public class RouterTimestamper extends Timestamper {
                                    _context.getProperty(PROP_QUERY_FREQUENCY, DEFAULT_QUERY_FREQUENCY));
         
         String disabled = _context.getProperty(PROP_DISABLED, DEFAULT_DISABLED);
-        _disabled = Boolean.valueOf(disabled).booleanValue();
+        _disabled = Boolean.parseBoolean(disabled);
         
         _concurringServers = Math.min(4, Math.max(1,
                               _context.getProperty(PROP_CONCURRING_SERVERS, DEFAULT_CONCURRING_SERVERS)));
diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
index e6a24e2eac3bdcf925056edee5699ff6669a786b..29f3a23d4a42dbe026f5e9bc8413552548f8f428 100644
--- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
+++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
@@ -331,7 +331,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
         if (_log.shouldLog(Log.INFO))
             _log.info("old: " + ohost + " config: " + name + " auto: " + enabled + " status: " + status);
         if (enabled.equals("always") ||
-            (Boolean.valueOf(enabled).booleanValue() && status == STATUS_OK)) {
+            (Boolean.parseBoolean(enabled) && status == STATUS_OK)) {
             String nhost = UDPAddr.getOption(UDPAddress.PROP_HOST);
             if (_log.shouldLog(Log.INFO))
                 _log.info("old: " + ohost + " config: " + name + " new: " + nhost);
@@ -354,7 +354,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
             changed = true;
         } else if (ohost == null || ohost.length() <= 0) {
             return;
-        } else if (Boolean.valueOf(enabled).booleanValue() && status != STATUS_OK) {
+        } else if (Boolean.parseBoolean(enabled) && status != STATUS_OK) {
             // UDP transitioned to not-OK, turn off NTCP address
             // This will commonly happen at startup if we were initially OK
             // because UPnP was successful, but a subsequent SSU Peer Test determines
diff --git a/router/java/src/net/i2p/router/transport/GeoIP.java b/router/java/src/net/i2p/router/transport/GeoIP.java
index d4ce79ce2f4251b3f65e62c9edea75bbac085380..5b6cc813f32eaf6a2fece1af31a2476dc5a798fa 100644
--- a/router/java/src/net/i2p/router/transport/GeoIP.java
+++ b/router/java/src/net/i2p/router/transport/GeoIP.java
@@ -91,7 +91,7 @@ class GeoIP {
      */
 /******
     public void lookup() {
-        if (! Boolean.valueOf(_context.getProperty(PROP_GEOIP_ENABLED, "true")).booleanValue()) {
+        if (! _context.getBooleanPropertyDefaultTrue(PROP_GEOIP_ENABLED)) {
             _pendingSearch.clear();
             return;
         }
@@ -105,7 +105,7 @@ class GeoIP {
      * Results will be added to the table and available via get() after completion.
      */
     public void blockingLookup() {
-        if (! Boolean.valueOf(_context.getProperty(PROP_GEOIP_ENABLED, "true")).booleanValue()) {
+        if (! _context.getBooleanPropertyDefaultTrue(PROP_GEOIP_ENABLED)) {
             _pendingSearch.clear();
             return;
         }
diff --git a/router/java/src/net/i2p/router/transport/TransportManager.java b/router/java/src/net/i2p/router/transport/TransportManager.java
index 79e03112090f555b6c76a1bcf4906be18049bc64..fe44032c0f29e3b7e0253a5ea047e0eb54b81df8 100644
--- a/router/java/src/net/i2p/router/transport/TransportManager.java
+++ b/router/java/src/net/i2p/router/transport/TransportManager.java
@@ -362,7 +362,7 @@ public class TransportManager implements TransportEventListener {
             }
             // Use UDP port for NTCP too - see comment in NTCPTransport.getRequestedPort() for why this is here
             if (t.getStyle().equals(NTCPTransport.STYLE) && port <= 0 &&
-                Boolean.valueOf(_context.getProperty(CommSystemFacadeImpl.PROP_I2NP_NTCP_AUTO_PORT)).booleanValue()) {
+                _context.getBooleanProperty(CommSystemFacadeImpl.PROP_I2NP_NTCP_AUTO_PORT)) {
                 Transport udp = getTransport(UDPTransport.STYLE);
                 if (udp != null)
                     port = t.getRequestedPort();
@@ -545,7 +545,7 @@ public class TransportManager implements TransportEventListener {
                    "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ").append(_("The number of pending sends which exceed congestion window")).append("<br>\n" +
                    "<b id=\"def.ssthresh\">SST</b>: ").append(_("The slow start threshold")).append("<br>\n" +
                    "<b id=\"def.rtt\">RTT</b>: ").append(_("The round trip time in milliseconds")).append("<br>\n" +
-                   "<b id=\"def.dev\">").append(_("Dev")).append("</b>: ").append(_("The standard deviation of the round trip time in milliseconds")).append("<br>\n" +
+                   //"<b id=\"def.dev\">").append(_("Dev")).append("</b>: ").append(_("The standard deviation of the round trip time in milliseconds")).append("<br>\n" +
                    "<b id=\"def.rto\">RTO</b>: ").append(_("The retransmit timeout in milliseconds")).append("<br>\n" +
                    "<b id=\"def.mtu\">MTU</b>: ").append(_("Current maximum send packet size / estimated maximum receive packet size (bytes)")).append("<br>\n" +
                    "<b id=\"def.send\">").append(_("TX")).append("</b>: ").append(_("The total number of packets sent to the peer")).append("<br>\n" +
diff --git a/router/java/src/net/i2p/router/transport/UPnP.java b/router/java/src/net/i2p/router/transport/UPnP.java
index 1401b3baab142a89f9571402538fa21519650cd1..abcd8214e7946e0cdf359f29ac7b0a15474f4e8e 100644
--- a/router/java/src/net/i2p/router/transport/UPnP.java
+++ b/router/java/src/net/i2p/router/transport/UPnP.java
@@ -78,7 +78,7 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
 	private volatile boolean thinksWeAreDoubleNatted = false;
 	
 	/** List of ports we want to forward */
-	private Set<ForwardPort> portsToForward;
+	private final Set<ForwardPort> portsToForward;
 	/** List of ports we have actually forwarded */
 	private final Set<ForwardPort> portsForwarded;
 	/** Callback to call when a forward fails or succeeds */
@@ -88,13 +88,14 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
 		super();
 		_context = context;
 		_log = _context.logManager().getLog(UPnP.class);
+		portsToForward = new HashSet<ForwardPort>();
 		portsForwarded = new HashSet<ForwardPort>();
 		addDeviceChangeListener(this);
 	}
 	
-	public boolean runPlugin() {
+	public synchronized boolean runPlugin() {
 		synchronized(lock) {
-			portsToForward = null;
+			portsToForward.clear();
 		}
 		return super.start();
 	}
@@ -102,9 +103,9 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
 	/**
 	 *  WARNING - Blocking up to 2 seconds
 	 */
-	public void terminate() {
+	public synchronized void terminate() {
 		synchronized(lock) {
-			portsToForward = null;
+			portsToForward.clear();
 		}
 		// this gets spun off in a thread...
 		unregisterPortMappings();
@@ -221,9 +222,10 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
 	private void registerPortMappings() {
 		Set ports;
 		synchronized(lock) {
-			ports = portsToForward;
+			ports = new HashSet(portsForwarded);
 		}
-		if(ports == null) return;
+		if (ports.isEmpty())
+			return;
 		registerPorts(ports);
 	}
 
@@ -281,6 +283,8 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
 		synchronized(lock) {
 			ports = new HashSet(portsForwarded);
 		}
+		if (ports.isEmpty())
+			return;
 		this.unregisterPorts(ports);
 	}
 	
@@ -528,17 +532,15 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
 		if(upstreamMaxBitRate > 0)
 			sb.append("<br>").append(_("UPnP reports the maximum upstream bit rate is {0}bits/sec", DataHelper.formatSize2(upstreamMaxBitRate)));
 		synchronized(lock) {
-			if(portsToForward != null) {
-				for(ForwardPort port : portsToForward) {
-					sb.append("<br>");
-					if(portsForwarded.contains(port))
-						// {0} is TCP or UDP
-						// {1,number,#####} prevents 12345 from being output as 12,345 in the English locale.
-						// If you want the digit separator in your locale, translate as {1}.
-						sb.append(_("{0} port {1,number,#####} was successfully forwarded by UPnP.", protoToString(port.protocol), port.portNumber));
-					else
-						sb.append(_("{0} port {1,number,#####} was not forwarded by UPnP.", protoToString(port.protocol), port.portNumber));
-				}
+			for(ForwardPort port : portsToForward) {
+				sb.append("<br>");
+				if(portsForwarded.contains(port))
+					// {0} is TCP or UDP
+					// {1,number,#####} prevents 12345 from being output as 12,345 in the English locale.
+					// If you want the digit separator in your locale, translate as {1}.
+					sb.append(_("{0} port {1,number,#####} was successfully forwarded by UPnP.", protoToString(port.protocol), port.portNumber));
+				else
+					sb.append(_("{0} port {1,number,#####} was not forwarded by UPnP.", protoToString(port.protocol), port.portNumber));
 			}
 		}
 		
@@ -726,13 +728,13 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
 				_log.error("ForwardPortCallback changed from "+forwardCallback+" to "+cb+" - using new value, but this is very strange!");
 			}
 			forwardCallback = cb;
-			if(portsToForward == null || portsToForward.isEmpty()) {
-				portsToForward = ports;
+			if (portsToForward.isEmpty()) {
+				portsToForward.addAll(ports);
 				portsToForwardNow = ports;
 				portsToDumpNow = null;
 			} else if(ports.isEmpty()) {
 				portsToDumpNow = portsToForward;
-				portsToForward = ports;
+				portsToForward.clear();
 				portsToForwardNow = null;
 			} else {
 				// Some ports to keep, some ports to dump
@@ -760,7 +762,8 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
 						portsToDumpNow.add(port);
 					}
 				}
-				portsToForward = ports;
+				portsToForward.clear();
+				portsToForward.addAll(ports);
 			}
 			if(_router == null) {
 				if (_log.shouldLog(Log.WARN))
@@ -768,9 +771,9 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
 				return; // When one is found, we will do the forwards
 			}
 		}
-		if(portsToDumpNow != null)
+		if(portsToDumpNow != null && !portsToDumpNow.isEmpty())
 			unregisterPorts(portsToDumpNow);
-		if(portsToForwardNow != null)
+		if(portsToForwardNow != null && !portsToForwardNow.isEmpty())
 			registerPorts(portsToForwardNow);
 	}
 
diff --git a/router/java/src/net/i2p/router/transport/UPnPManager.java b/router/java/src/net/i2p/router/transport/UPnPManager.java
index a76022f2a56e10c59e673759a0a2fc05f01d14b3..aecd726bd3e80b10624ebdbbc75efc2f2017f260 100644
--- a/router/java/src/net/i2p/router/transport/UPnPManager.java
+++ b/router/java/src/net/i2p/router/transport/UPnPManager.java
@@ -6,10 +6,12 @@ package net.i2p.router.transport;
 
 import java.net.InetAddress;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
 import net.i2p.router.RouterContext;
+import net.i2p.util.Addresses;
 import net.i2p.util.Log;
 import net.i2p.util.Translate;
 
@@ -59,15 +61,42 @@ class UPnPManager {
         _upnpCallback = new UPnPCallback();
     }
     
+    /**
+     *  Blocking, may take a while
+     */
     public synchronized void start() {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("UPnP Start");
-        if (!_isRunning)
-            _isRunning = _upnp.runPlugin();
-        if (!_isRunning)
-            _log.error("UPnP start failed - port conflict?");
+        if (!_isRunning) {
+            long b = _context.clock().now();
+            try {
+                _isRunning = _upnp.runPlugin();
+                if (_log.shouldLog(Log.INFO))
+                    _log.info("UPnP runPlugin took " + (_context.clock().now() - b));
+            } catch (Exception e) {
+                // NPE in UPnP (ticket #728), can't let it bring us down
+                _log.error("UPnP error, please report", e);
+            }
+        }
+        if (!_isRunning) {
+            // Do we have a non-loopback, non-broadcast address?
+            // If not, that's why it failed (HTTPServer won't start)
+            Set<String> addrs = Addresses.getAddresses(true, false);
+            addrs.remove("0.0.0.0");
+            for (Iterator<String> iter = addrs.iterator(); iter.hasNext(); ) {
+                if (iter.next().startsWith("127."))
+                    iter.remove();
+            }
+            if (addrs.isEmpty())
+                _log.logAlways(Log.WARN, "UPnP start failed - no network connection?");
+            else
+                _log.error("UPnP start failed - port conflict?");
+        }
     }
 
+    /**
+     *  Blocking, may take a while
+     */
     public synchronized void stop() {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("UPnP Stop");
@@ -86,8 +115,17 @@ class UPnPManager {
     public void update(Map<String, Integer> ports) {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("UPnP Update with " + ports.size() + " ports");
-        if (!_isRunning)
-            return;
+
+        //synchronized(this) {
+            // TODO
+            // called too often and may block for too long
+            // may not have started if net was disconnected previously
+            //if (!_isRunning && !ports.isEmpty())
+            //    start();
+            if (!_isRunning)
+                return;
+        //}
+
         Set<ForwardPort> forwards = new HashSet(ports.size());
         for (Map.Entry<String, Integer> entry : ports.entrySet()) {
             String style = entry.getKey();
diff --git a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
index bee5a6b764fc5f3e6c7f7c9f41c67130e6fdab36..bbf9e4f1f1b0fe92661c9286940a0ab0220545e1 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
@@ -21,6 +21,7 @@ import java.util.concurrent.LinkedBlockingQueue;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.RouterIdentity;
+import net.i2p.router.CommSystemFacade;
 import net.i2p.router.RouterContext;
 import net.i2p.router.transport.FIFOBandwidthLimiter;
 import net.i2p.util.ConcurrentHashSet;
@@ -499,7 +500,8 @@ class EventPumper implements Runnable {
                 return;
             }
             // BUGFIX for firewalls. --Sponge
-            chan.socket().setKeepAlive(true);
+            if (_context.commSystem().getReachabilityStatus() != CommSystemFacade.STATUS_OK)
+                chan.socket().setKeepAlive(true);
 
             SelectionKey ckey = chan.register(_selector, SelectionKey.OP_READ);
             new NTCPConnection(_context, _transport, chan, ckey);
@@ -519,7 +521,8 @@ class EventPumper implements Runnable {
                 _log.debug("processing connect for " + con + ": connected? " + connected);
             if (connected) {
                 // BUGFIX for firewalls. --Sponge
-                chan.socket().setKeepAlive(true);
+                if (_context.commSystem().getReachabilityStatus() != CommSystemFacade.STATUS_OK)
+                    chan.socket().setKeepAlive(true);
                 con.setKey(key);
                 con.outboundConnected();
                 _context.statManager().addRateData("ntcp.connectSuccessful", 1);
diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java
index c302f7bafe4d558d578054d47ff0f2b643207a7a..f388e1ce70ed1d29b061a5dbe45d264c97b0c52b 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java
@@ -990,9 +990,10 @@ class NTCPConnection {
         if (clearMessage) {
             // see synchronization comments in prepareNextWriteFast()
             synchronized (_outbound) {
-                if (_currentOutbound != null)
+                if (_currentOutbound != null) {
                     msg = _currentOutbound;
-                _currentOutbound = null;
+                    _currentOutbound = null;
+                }
             }
             if (msg != null) {
                 _lastSendTime = System.currentTimeMillis();
@@ -1065,11 +1066,11 @@ class NTCPConnection {
             //_sendBps15s = (0.955f)*_sendBps15s + (0.045f)*((float)sent*1000f)/(float)time;
             //_recvBps15s = (0.955f)*_recvBps15s + (0.045f)*((float)recv*1000)/(float)time;
 
-            if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Rates updated to "
-                           + _sendBps + '/' + _recvBps + "Bps in/out " 
-                           //+ _sendBps15s + "/" + _recvBps15s + "Bps in/out 15s after "
-                           + sent + '/' + recv + " in " + DataHelper.formatDuration(time));
+            //if (_log.shouldLog(Log.DEBUG))
+            //    _log.debug("Rates updated to "
+            //               + _sendBps + '/' + _recvBps + "Bps in/out " 
+            //               //+ _sendBps15s + "/" + _recvBps15s + "Bps in/out 15s after "
+            //               + sent + '/' + recv + " in " + DataHelper.formatDuration(time));
         }
     }
         
diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
index fde13148cf853e10b8c810f47dd5c92796cf96b2..c063326d43545434dc8de5c79216ddc12c09754e 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
@@ -17,6 +17,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.Vector;
+import java.util.concurrent.ConcurrentHashMap;
 
 import net.i2p.data.DataHelper;
 import net.i2p.data.Hash;
@@ -68,6 +69,13 @@ public class NTCPTransport extends TransportImpl {
     private long _lastBadSkew;
     private static final long[] RATES = { 10*60*1000 };
 
+    /**
+     *  To prevent trouble. To be raised to 1024 in 0.9.4.
+     *
+     *  @since 0.9.3
+     */
+    private static final int MIN_PEER_PORT = 500;
+
     // Opera doesn't have the char, TODO check UA
     //private static final String THINSP = "&thinsp;/&thinsp;";
     private static final String THINSP = " / ";
@@ -140,7 +148,7 @@ public class NTCPTransport extends TransportImpl {
         _context.statManager().createRateStat("ntcp.writeError", "", "ntcp", RATES);
         _establishing = new ConcurrentHashSet(16);
         _conLock = new Object();
-        _conByIdent = new HashMap(64);
+        _conByIdent = new ConcurrentHashMap(64);
 
         _finisher = new NTCPSendFinisher(ctx, this);
 
@@ -160,7 +168,7 @@ public class NTCPTransport extends TransportImpl {
         _context.statManager().addRateData("ntcp.inboundEstablished", 1);
         markReachable(con.getRemotePeer().calculateHash(), true);
         //_context.shitlist().unshitlistRouter(con.getRemotePeer().calculateHash());
-        NTCPConnection old = null;
+        NTCPConnection old;
         synchronized (_conLock) {
             old = _conByIdent.put(con.getRemotePeer().calculateHash(), con);
         }
@@ -263,6 +271,7 @@ public class NTCPTransport extends TransportImpl {
     public void afterSend(OutNetMessage msg, boolean sendSuccessful, boolean allowRequeue, long msToSend) {
         super.afterSend(msg, sendSuccessful, allowRequeue, msToSend);
     }
+
     public TransportBid bid(RouterInfo toAddress, long dataSize) {
         if (!isAlive())
             return null;
@@ -299,7 +308,7 @@ public class NTCPTransport extends TransportImpl {
             return null;
         }
         byte[] ip = addr.getIP();
-        if ( (addr.getPort() <= 0) || (ip == null) ) {
+        if ( (addr.getPort() < MIN_PEER_PORT) || (ip == null) ) {
             _context.statManager().addRateData("ntcp.connectFailedInvalidPort", 1);
             markUnreachable(peer);
             //_context.shitlist().shitlistRouter(toAddress.getIdentity().calculateHash(), "Invalid NTCP address", STYLE);
@@ -354,26 +363,23 @@ public class NTCPTransport extends TransportImpl {
 
     @Override
     public boolean isEstablished(Hash dest) {
-        synchronized (_conLock) {
             NTCPConnection con = _conByIdent.get(dest);
             return (con != null) && con.isEstablished() && !con.isClosed();
-        }
     }
 
     @Override
     public boolean isBacklogged(Hash dest) {
-        synchronized (_conLock) {
             NTCPConnection con = _conByIdent.get(dest);
             return (con != null) && con.isEstablished() && con.tooBacklogged();
-        }
     }
 
     void removeCon(NTCPConnection con) {
         NTCPConnection removed = null;
-        synchronized (_conLock) {
-            RouterIdentity ident = con.getRemotePeer();
-            if (ident != null)
+        RouterIdentity ident = con.getRemotePeer();
+        if (ident != null) {
+            synchronized (_conLock) {
                 removed = _conByIdent.remove(ident.calculateHash());
+            }
         }
         if ( (removed != null) && (removed != con) ) {// multiple cons, close 'em both
             if (_log.shouldLog(Log.WARN))
@@ -388,19 +394,17 @@ public class NTCPTransport extends TransportImpl {
      *
      */
     @Override
-    public int countActivePeers() { synchronized (_conLock) { return _conByIdent.size(); } }
+    public int countActivePeers() { return _conByIdent.size(); }
+
     /**
      * How many peers are we actively sending messages to (this minute)
      */
     @Override
     public int countActiveSendPeers() {
         int active = 0;
-        synchronized (_conLock) {
-            for (Iterator iter = _conByIdent.values().iterator(); iter.hasNext(); ) {
-                NTCPConnection con = (NTCPConnection)iter.next();
+        for (NTCPConnection con : _conByIdent.values()) {
                 if ( (con.getTimeSinceSend() <= 60*1000) || (con.getTimeSinceReceive() <= 60*1000) )
                     active++;
-            }
         }
         return active;
     }
@@ -416,16 +420,9 @@ public class NTCPTransport extends TransportImpl {
      */
     @Override
     public Vector<Long> getClockSkews() {
-
-        Vector<NTCPConnection> peers = new Vector();
         Vector<Long> skews = new Vector();
 
-        synchronized (_conLock) {
-            peers.addAll(_conByIdent.values());
-        }
-
-        for (Iterator<NTCPConnection> iter = peers.iterator(); iter.hasNext(); ) {
-            NTCPConnection con = iter.next();
+        for (NTCPConnection con : _conByIdent.values()) {
             if (con.isEstablished())
                 skews.addElement(Long.valueOf(con.getClockSkew()));
         }
@@ -551,11 +548,14 @@ public class NTCPTransport extends TransportImpl {
                 ServerSocketChannel chan = ServerSocketChannel.open();
                 chan.configureBlocking(false);
 
+                int port = _myAddress.getPort();
+                if (port > 0 && port < 1024)
+                    _log.logAlways(Log.WARN, "Specified NTCP port is " + port + ", ports lower than 1024 not recommended");
                 InetSocketAddress addr = null;
                 if(bindToAddr==null) {
-                    addr = new InetSocketAddress(_myAddress.getPort());
+                    addr = new InetSocketAddress(port);
                 } else {
-                    addr = new InetSocketAddress(bindToAddr, _myAddress.getPort());
+                    addr = new InetSocketAddress(bindToAddr, port);
                     if (_log.shouldLog(Log.WARN))
                         _log.warn("Binding only to " + bindToAddr);
                 }
@@ -603,6 +603,7 @@ public class NTCPTransport extends TransportImpl {
     void establishing(NTCPConnection con) {
             _establishing.add(con);
     }
+
     /**
      * called in the EventPumper no more than once a second or so, closing
      * any unconnected/unestablished connections
@@ -694,12 +695,10 @@ public class NTCPTransport extends TransportImpl {
     @Override
     public short getReachabilityStatus() { 
         if (isAlive() && _myAddress != null) {
-            synchronized (_conLock) {
                 for (NTCPConnection con : _conByIdent.values()) {
                     if (con.isInbound())
                         return CommSystemFacade.STATUS_OK;
                 }
-            }
         }
         return CommSystemFacade.STATUS_UNKNOWN;
     }
@@ -727,17 +726,17 @@ public class NTCPTransport extends TransportImpl {
         // will this work?
         replaceAddress(null);
     }
+
     public static final String STYLE = "NTCP";
 
     public void renderStatusHTML(java.io.Writer out, int sortFlags) throws IOException {}
+
     @Override
     public void renderStatusHTML(java.io.Writer out, String urlBase, int sortFlags) throws IOException {
         TreeSet peers = new TreeSet(getComparator(sortFlags));
-        synchronized (_conLock) {
-            peers.addAll(_conByIdent.values());
-        }
-        long offsetTotal = 0;
+        peers.addAll(_conByIdent.values());
 
+        long offsetTotal = 0;
         float bpsSend = 0;
         float bpsRecv = 0;
         long totalUptime = 0;
@@ -838,6 +837,7 @@ public class NTCPTransport extends TransportImpl {
     }
 
     private static final NumberFormat _rateFmt = new DecimalFormat("#,##0.00");
+
     private static String formatRate(float rate) {
         synchronized (_rateFmt) { return _rateFmt.format(rate); }
     }
@@ -858,14 +858,12 @@ public class NTCPTransport extends TransportImpl {
         public static final AlphaComparator instance() { return _instance; }
     }
 
-    private static class PeerComparator implements Comparator {
-        public int compare(Object lhs, Object rhs) {
-            if ( (lhs == null) || (rhs == null) || !(lhs instanceof NTCPConnection) || !(rhs instanceof NTCPConnection))
-                throw new IllegalArgumentException("rhs = " + rhs + " lhs = " + lhs);
-            return compare((NTCPConnection)lhs, (NTCPConnection)rhs);
-        }
-        protected int compare(NTCPConnection l, NTCPConnection r) {
+    private static class PeerComparator implements Comparator<NTCPConnection> {
+        public int compare(NTCPConnection l, NTCPConnection r) {
+            if (l == null || r == null)
+                throw new IllegalArgumentException();
             // base64 retains binary ordering
+            // UM, no it doesn't, but close enough
             return l.getRemotePeer().calculateHash().toBase64().compareTo(r.getRemotePeer().calculateHash().toBase64());
         }
     }
diff --git a/router/java/src/net/i2p/router/transport/ntcp/Writer.java b/router/java/src/net/i2p/router/transport/ntcp/Writer.java
index cba28fbcf454b88a1266805d9d9e1894c5172135..af5bcb0b987ac2afd6ed059d521e76734ba0a204 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/Writer.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/Writer.java
@@ -80,9 +80,12 @@ class Writer {
     }
     
     private class Runner implements Runnable {
-        private boolean _stop;
-        public Runner() { _stop = false; }
+        private volatile boolean _stop;
+
+        public Runner() {}
+
         public void stop() { _stop = true; }
+
         public void run() {
             if (_log.shouldLog(Log.INFO)) _log.info("Starting writer");
             NTCPConnection con = null;
diff --git a/router/java/src/net/i2p/router/transport/udp/ACKSender.java b/router/java/src/net/i2p/router/transport/udp/ACKSender.java
index 312f8d348e764aa9f555b837054610559760ff3b..f1aedda5ae49a90369dc5e605b683e1c4a75eeb3 100644
--- a/router/java/src/net/i2p/router/transport/udp/ACKSender.java
+++ b/router/java/src/net/i2p/router/transport/udp/ACKSender.java
@@ -28,7 +28,7 @@ class ACKSender implements Runnable {
     private static final long POISON_PS = -9999999999l;
     
     /** how frequently do we want to send ACKs to a peer? */
-    static final int ACK_FREQUENCY = 500;
+    static final int ACK_FREQUENCY = 350;
     
     public ACKSender(RouterContext ctx, UDPTransport transport) {
         _context = ctx;
@@ -73,12 +73,12 @@ class ACKSender implements Runnable {
         _peersToACK.clear();
     }
     
-    private long ackFrequency(long timeSinceACK, long rtt) {
+    private static long ackFrequency(long timeSinceACK, long rtt) {
         // if we are actively pumping lots of data to them, we can depend upon
         // the unsentACKThreshold to figure out when to send an ACK instead of
         // using the timer, so we can set the timeout/frequency higher
         if (timeSinceACK < 2*1000)
-            return Math.max(rtt/2, 500);
+            return Math.max(rtt/2, ACK_FREQUENCY);
         else
             return ACK_FREQUENCY;
     }
@@ -162,15 +162,15 @@ class ACKSender implements Runnable {
                 }
                 
                 if (!ackBitfields.isEmpty()) {
-                    _context.statManager().addRateData("udp.sendACKCount", ackBitfields.size(), 0);
+                    _context.statManager().addRateData("udp.sendACKCount", ackBitfields.size());
                     if (remaining > 0)
-                        _context.statManager().addRateData("udp.sendACKRemaining", remaining, 0);
+                        _context.statManager().addRateData("udp.sendACKRemaining", remaining);
                     // set above before the break
                     //now = _context.clock().now();
                     if (lastSend < 0)
                         lastSend = now - 1;
                     _context.statManager().addRateData("udp.ackFrequency", now-lastSend, now-wanted);
-                    //_context.statManager().getStatLog().addData(peer.getRemoteHostId().toString(), "udp.peer.sendACKCount", ackBitfields.size(), 0);
+                    //_context.statManager().getStatLog().addData(peer.getRemoteHostId().toString(), "udp.peer.sendACKCount", ackBitfields.size());
                     UDPPacket ack = _builder.buildACK(peer, ackBitfields);
                     ack.markType(1);
                     ack.setFragmentCount(-1);
@@ -193,7 +193,7 @@ class ACKSender implements Runnable {
                         ackPeer(peer);
                     }
                 } else {
-                    _context.statManager().addRateData("udp.abortACK", 1, 0);
+                    _context.statManager().addRateData("udp.abortACK", 1);
                 }
             }
         }
diff --git a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
index 1e597ab078575e192581b8c392d1938432b13536..88e89131fac6bc9b0e2b9a0d004a1e8cf503f308 100644
--- a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
@@ -10,6 +10,7 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import net.i2p.data.Base64;
+import net.i2p.data.DataHelper;
 import net.i2p.data.Hash;
 import net.i2p.data.RouterAddress;
 import net.i2p.data.RouterIdentity;
@@ -21,7 +22,6 @@ import net.i2p.data.i2np.I2NPMessage;
 import net.i2p.router.OutNetMessage;
 import net.i2p.router.Router;
 import net.i2p.router.RouterContext;
-import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
 import net.i2p.router.transport.crypto.DHSessionKeyBuilder;
 import static net.i2p.router.transport.udp.InboundEstablishState.InboundState.*;
 import static net.i2p.router.transport.udp.OutboundEstablishState.OutboundState.*;
@@ -86,7 +86,9 @@ class EstablishmentManager {
     private int _activity;
     
     /** max outbound in progress - max inbound is half of this */
-    private static final int DEFAULT_MAX_CONCURRENT_ESTABLISH = 30;
+    private final int DEFAULT_MAX_CONCURRENT_ESTABLISH;
+    private static final int DEFAULT_LOW_MAX_CONCURRENT_ESTABLISH = 20;
+    private static final int DEFAULT_HIGH_MAX_CONCURRENT_ESTABLISH = 150;
     private static final String PROP_MAX_CONCURRENT_ESTABLISH = "i2np.udp.maxConcurrentEstablish";
 
     /** max pending outbound connections (waiting because we are at MAX_CONCURRENT_ESTABLISH) */
@@ -132,6 +134,9 @@ class EstablishmentManager {
         _outboundByClaimedAddress = new ConcurrentHashMap();
         _outboundByHash = new ConcurrentHashMap();
         _activityLock = new Object();
+        DEFAULT_MAX_CONCURRENT_ESTABLISH = Math.max(DEFAULT_LOW_MAX_CONCURRENT_ESTABLISH,
+                                                    Math.min(DEFAULT_HIGH_MAX_CONCURRENT_ESTABLISH,
+                                                             ctx.bandwidthLimiter().getOutboundKBytesPerSecond() / 2));
         _context.statManager().createRateStat("udp.inboundEstablishTime", "How long it takes for a new inbound session to be established", "udp", UDPTransport.RATES);
         _context.statManager().createRateStat("udp.outboundEstablishTime", "How long it takes for a new outbound session to be established", "udp", UDPTransport.RATES);
         //_context.statManager().createRateStat("udp.inboundEstablishFailedState", "What state a failed inbound establishment request fails in", "udp", UDPTransport.RATES);
@@ -142,6 +147,7 @@ class EstablishmentManager {
         _context.statManager().createRateStat("udp.establishDropped", "Dropped an inbound establish message", "udp", UDPTransport.RATES);
         _context.statManager().createRateStat("udp.establishRejected", "How many pending outbound connections are there when we refuse to add any more?", "udp", UDPTransport.RATES);
         _context.statManager().createRateStat("udp.establishOverflow", "How many messages were queued up on a pending connection when it was too much?", "udp", UDPTransport.RATES);
+        _context.statManager().createRateStat("udp.establishBadIP", "Received IP or port was bad", "udp", UDPTransport.RATES);
         // following are for PeerState
         _context.statManager().createRateStat("udp.congestionOccurred", "How large the cwin was when congestion occurred (duration == sendBps)", "udp", UDPTransport.RATES);
         _context.statManager().createRateStat("udp.congestedRTO", "retransmission timeout after congestion (duration == rtt dev)", "udp", UDPTransport.RATES);
@@ -247,6 +253,7 @@ class EstablishmentManager {
                 _transport.failed(msg, "Remote peer's IP isn't valid");
                 _transport.markUnreachable(toHash);
                 //_context.shitlist().shitlistRouter(msg.getTarget().getIdentity().calculateHash(), "Invalid SSU address", UDPTransport.STYLE);
+                _context.statManager().addRateData("udp.establishBadIP", 1);
                 return;
             }
 
@@ -413,9 +420,9 @@ class EstablishmentManager {
      *
      */
     void receiveSessionRequest(RemoteHostId from, UDPPacketReader reader) {
-        if (!_transport.isValid(from.getIP())) {
+        if (from.getPort() < UDPTransport.MIN_PEER_PORT || !_transport.isValid(from.getIP())) {
             if (_log.shouldLog(Log.WARN))
-                _log.warn("Receive session request from invalid IP: " + from);
+                _log.warn("Receive session request from invalid: " + from);
             return;
         }
         
@@ -435,6 +442,7 @@ class EstablishmentManager {
                 if (_context.blocklist().isBlocklisted(from.getIP())) {
                     if (_log.shouldLog(Log.WARN))
                         _log.warn("Receive session request from blocklisted IP: " + from);
+                    _context.statManager().addRateData("udp.establishBadIP", 1);
                     return; // drop the packet
                 }
                 if (!_transport.allowConnection())
@@ -450,14 +458,9 @@ class EstablishmentManager {
             }
 
         if (isNew) {
-            // we don't expect inbound connections when hidden, but it could happen
-            // Don't offer if we are approaching max connections. While Relay Intros do not
-            // count as connections, we have to keep the connection to this peer up longer if
-            // we are offering introductions.
             // Don't offer to relay to privileged ports.
-            if ((!_context.router().isHidden()) && (!_transport.introducersRequired()) && _transport.haveCapacity() &&
-                state.getSentPort() >= 1024 &&
-                !((FloodfillNetworkDatabaseFacade)_context.netDb()).floodfillEnabled()) {
+            // TODO if already we have their RI, only offer if they need it (no 'C' cap)
+            if (_transport.canIntroduce() && state.getSentPort() >= 1024) {
                 // ensure > 0
                 long tag = 1 + _context.random().nextLong(MAX_TAG_VALUE);
                 state.setSentRelayTag(tag);
@@ -573,7 +576,14 @@ class EstablishmentManager {
                     }
                 }
                 
+        if (_outboundStates.size() < getMaxConcurrentEstablish() && !_queuedOutbound.isEmpty()) {
+            // in theory shouldn't need locking, but
+            // getting IllegalStateExceptions on old Java 5,
+            // which hoses this state.
+            synchronized(_queuedOutbound) {
                 locked_admitQueued();
+            }
+        }
             //remaining = _queuedOutbound.size();
 
         //if (admitted > 0)
@@ -600,6 +610,7 @@ class EstablishmentManager {
             // ok, active shrunk, lets let some queued in.
 
             Map.Entry<RemoteHostId, List<OutNetMessage>> entry = iter.next();
+            // java 5 IllegalStateException here
             iter.remove();
             RemoteHostId to = entry.getKey();
             List<OutNetMessage> allQueued = entry.getValue();
@@ -709,7 +720,7 @@ class EstablishmentManager {
     private void sendInboundComplete(PeerState peer) {
         // SimpleTimer.getInstance().addEvent(new PublishToNewInbound(peer), 10*1000);
         if (_log.shouldLog(Log.INFO))
-            _log.info("Completing to the peer after confirm: " + peer);
+            _log.info("Completing to the peer after IB confirm: " + peer);
         DeliveryStatusMessage dsm = new DeliveryStatusMessage(_context);
         dsm.setArrival(Router.NETWORK_ID); // overloaded, sure, but future versions can check this
                                            // This causes huge values in the inNetPool.droppedDeliveryStatusDelay stat
@@ -803,29 +814,10 @@ class EstablishmentManager {
     /** the relay tag is a 4-byte field in the protocol */
     public static final long MAX_TAG_VALUE = 0xFFFFFFFFl;
     
+    /**
+     *  This may be called more than once
+     */
     private void sendCreated(InboundEstablishState state) {
-        long now = _context.clock().now();
-        // This is usually handled in receiveSessionRequest() above, except, I guess,
-        // if the session isn't new and we are going through again.
-        // Don't offer if we are approaching max connections (see comments above)
-        // Also don't offer if we are floodfill, as this extends the max idle time
-        // and we will have lots of incoming conns
-        if ((!_context.router().isHidden()) && (!_transport.introducersRequired()) && _transport.haveCapacity() &&
-            !((FloodfillNetworkDatabaseFacade)_context.netDb()).floodfillEnabled()) {
-            // offer to relay
-            // (perhaps we should check our bw usage and/or how many peers we are 
-            //  already offering introducing?)
-            if (state.getSentRelayTag() == 0) {
-                // ensure > 0
-                state.setSentRelayTag(1 + _context.random().nextLong(MAX_TAG_VALUE));
-            } else {
-                // don't change it, since we've already prepared our sig
-            }
-        } else {
-            // don't offer to relay
-            state.setSentRelayTag(0);
-        }
-        
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Send created to: " + state);
         
@@ -901,15 +893,14 @@ class EstablishmentManager {
         byte ip[] = new byte[sz];
         reader.getRelayResponseReader().readCharlieIP(ip, 0);
         int port = reader.getRelayResponseReader().readCharliePort();
+        if ((!isValid(ip, port)) || (!isValid(bob.getIP(), bob.getPort()))) {
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("Bad relay resp from " + bob + " for " + Addresses.toString(ip, port));
+            _context.statManager().addRateData("udp.relayBadIP", 1);
+            return;
+        }
         InetAddress addr = null;
         try {
-            if (!_transport.isValid(ip))
-                throw new UnknownHostException("non-public IP");
-            // let's not relay to a privileged port, sounds like trouble
-            if (port < 1024 || port > 65535)
-                throw new UnknownHostException("bad port " + port);
-            if (Arrays.equals(ip, _transport.getExternalIP()))
-                throw new UnknownHostException("relay myself");
             addr = InetAddress.getByAddress(ip);
         } catch (UnknownHostException uhe) {
             if (_log.shouldLog(Log.WARN))
@@ -943,7 +934,20 @@ class EstablishmentManager {
         }
         notifyActivity();
     }
-    
+
+    /**
+     *  Are IP and port valid?
+     *  Refuse anybody in the same /16
+     *  @since 0.9.3
+     */
+    private boolean isValid(byte[] ip, int port) {
+        return port >= 1024 &&
+               port <= 65535 &&
+               _transport.isValid(ip) &&
+               (!DataHelper.eq(ip, 0, _transport.getExternalIP(), 0, 2)) &&
+               (!_context.blocklist().isBlocklisted(ip));
+    }
+
     /**
      *  Note that while a SessionConfirmed could in theory be fragmented,
      *  in practice a RouterIdentity is 387 bytes and a single fragment is 512 bytes max,
diff --git a/router/java/src/net/i2p/router/transport/udp/IPThrottler.java b/router/java/src/net/i2p/router/transport/udp/IPThrottler.java
new file mode 100644
index 0000000000000000000000000000000000000000..5f94620621e225cbd58e58f96f9af5e5544fdbf0
--- /dev/null
+++ b/router/java/src/net/i2p/router/transport/udp/IPThrottler.java
@@ -0,0 +1,44 @@
+package net.i2p.router.transport.udp;
+
+import net.i2p.util.ObjectCounter;
+import net.i2p.util.SimpleScheduler;
+import net.i2p.util.SimpleTimer;
+
+/**
+ * Count IPs
+ *
+ * @since 0.9.3
+ */
+class IPThrottler {
+    private ObjectCounter<Integer> _counter;
+    private final int _max;
+
+    public IPThrottler(int max, long time) {
+        _max = max;
+        _counter = new ObjectCounter();
+        SimpleScheduler.getInstance().addPeriodicEvent(new Cleaner(), time);
+    }
+
+    /**
+     *  Increments before checking
+     *  @return true if ip.length != 4
+     */
+    public boolean shouldThrottle(byte[] ip) {
+        if (ip.length != 4)
+            return true;
+        return _counter.increment(toInt(ip)) > _max;
+    }
+
+    private static Integer toInt(byte ip[]) {
+        int rv = 0;
+        for (int i = 0; i < 4; i++)
+            rv |= (ip[i] & 0xff) << ((3-i)*8);
+        return Integer.valueOf(rv);
+    }
+
+    private class Cleaner implements SimpleTimer.TimedEvent {
+        public void timeReached() {
+            _counter.clear();
+        }
+    }
+}
diff --git a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
index 5a36fd83898260cb9230149faba2c3e5396a0958..b49cb0d2612799d6a42d95bcd149c3c42161de55 100644
--- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
@@ -3,7 +3,6 @@ package net.i2p.router.transport.udp;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -12,6 +11,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import net.i2p.data.Base64;
+import net.i2p.data.DataHelper;
 import net.i2p.data.RouterAddress;
 import net.i2p.data.RouterInfo;
 import net.i2p.data.SessionKey;
@@ -43,10 +43,10 @@ class IntroductionManager {
     private static final int MAX_INBOUND = 20;
 
     /**
-     * TODO this should be enforced in EstablishmentManager, it isn't now.
+     * This is enforced in EstablishmentManager
      * @since 0.8.11
      */
-    private static final int MAX_OUTBOUND = 100;
+    public static final int MAX_OUTBOUND = 100;
 
     /** Max one per target in this time */
     private static final long PUNCH_CLEAN_TIME = 5*1000;
@@ -64,6 +64,7 @@ class IntroductionManager {
         ctx.statManager().createRateStat("udp.receiveRelayIntro", "How often we get a relayed request for us to talk to someone?", "udp", UDPTransport.RATES);
         ctx.statManager().createRateStat("udp.receiveRelayRequest", "How often we receive a good request to relay to someone else?", "udp", UDPTransport.RATES);
         ctx.statManager().createRateStat("udp.receiveRelayRequestBadTag", "Received relay requests with bad/expired tag", "udp", UDPTransport.RATES);
+        ctx.statManager().createRateStat("udp.relayBadIP", "Received IP or port was bad", "udp", UDPTransport.RATES);
     }
     
     public void reset() {
@@ -160,7 +161,7 @@ class IntroductionManager {
             }
             byte[] ip = cur.getRemoteIP();
             int port = cur.getRemotePort();
-            if (ip == null || !TransportImpl.isPubliclyRoutable(ip) || port < 1024 || port > 65535)
+            if (!isValid(ip, port))
                 continue;
             if (_log.shouldLog(Log.INFO))
                 _log.info("Picking introducer: " + cur);
@@ -185,14 +186,15 @@ class IntroductionManager {
      */
     public void pingIntroducers() {
         // Try to keep the connection up for two hours after we made anybody an introducer
-        long pingCutoff = _context.clock().now() - (105 * 60 * 1000);
-        long inactivityCutoff = _context.clock().now() - UDPTransport.MIN_EXPIRE_TIMEOUT;
+        long now = _context.clock().now();
+        long pingCutoff = now - (105 * 60 * 1000);
+        long inactivityCutoff = now - UDPTransport.MIN_EXPIRE_TIMEOUT;
         for (PeerState cur : _inbound) {
             if (cur.getIntroducerTime() > pingCutoff &&
                 cur.getLastSendTime() < inactivityCutoff) {
                 if (_log.shouldLog(Log.INFO))
                     _log.info("Pinging introducer: " + cur);
-                cur.setLastSendTime(_context.clock().now());
+                cur.setLastSendTime(now);
                 _transport.send(_builder.buildPing(cur));
             }
         }
@@ -207,6 +209,14 @@ class IntroductionManager {
     int introducerCount() {
             return _inbound.size();
     }
+    
+    /**
+     *  @return number of peers we have volunteered to introduce
+     *  @since 0.9.3
+     */
+    int introducedCount() {
+            return _outbound.size();
+    }
 
     /**
      *  We are Charlie and we got this from Bob.
@@ -218,7 +228,7 @@ class IntroductionManager {
     void receiveRelayIntro(RemoteHostId bob, UDPPacketReader reader) {
         if (_context.router().isHidden())
             return;
-        _context.statManager().addRateData("udp.receiveRelayIntro", 1, 0);
+        _context.statManager().addRateData("udp.receiveRelayIntro", 1);
 
         if (!_transport.allowConnection()) {
             if (_log.shouldLog(Log.WARN))
@@ -230,23 +240,25 @@ class IntroductionManager {
         byte ip[] = new byte[ipSize];
         reader.getRelayIntroReader().readIP(ip, 0);
         int port = reader.getRelayIntroReader().readPort();
+
+        if ((!isValid(ip, port)) || (!isValid(bob.getIP(), bob.getPort()))) {
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("Bad relay intro from " + bob + " for " + Addresses.toString(ip, port));
+            _context.statManager().addRateData("udp.relayBadIP", 1);
+            return;
+        }
+
         if (_log.shouldLog(Log.INFO))
             _log.info("Receive relay intro from " + bob + " for " + Addresses.toString(ip, port));
         
         InetAddress to = null;
         try {
-            if (!_transport.isValid(ip))
-                throw new UnknownHostException("non-public IP");
-            // let's not punch to a privileged port, sounds like trouble
-            if (port < 1024 || port > 65535)
-                throw new UnknownHostException("bad port " + port);
-            if (Arrays.equals(ip, _transport.getExternalIP()))
-                throw new UnknownHostException("punch myself");
             to = InetAddress.getByAddress(ip);
         } catch (UnknownHostException uhe) {
             // shitlist Bob?
             if (_log.shouldLog(Log.WARN))
                 _log.warn("IP for alice to hole punch to is invalid", uhe);
+            _context.statManager().addRateData("udp.relayBadIP", 1);
             return;
         }
         
@@ -312,7 +324,23 @@ class IntroductionManager {
     void receiveRelayRequest(RemoteHostId alice, UDPPacketReader reader) {
         if (_context.router().isHidden())
             return;
-        long tag = reader.getRelayRequestReader().readTag();
+        UDPPacketReader.RelayRequestReader rrReader = reader.getRelayRequestReader();
+        long tag = rrReader.readTag();
+        int ipSize = rrReader.readIPSize();
+        int port = rrReader.readPort();
+
+        // ip/port inside message should be 0:0, as it's unimplemented on send -
+        // see PacketBuilder.buildRelayRequest()
+        if (!isValid(alice.getIP(), alice.getPort()) || ipSize != 0 || port != 0) {
+            if (_log.shouldLog(Log.WARN)) {
+                byte ip[] = new byte[ipSize];
+                rrReader.readIP(ip, 0);
+                _log.warn("Bad relay req from " + alice + " for " + Addresses.toString(ip, port));
+            }
+            _context.statManager().addRateData("udp.relayBadIP", 1);
+            return;
+        }
+
         PeerState charlie = get(tag);
         if (charlie == null) {
             if (_log.shouldLog(Log.INFO))
@@ -337,4 +365,17 @@ class IntroductionManager {
         // send alice back charlie's info
         _transport.send(_builder.buildRelayResponse(alice, charlie, reader.getRelayRequestReader().readNonce(), aliceIntroKey));
     }
+
+    /**
+     *  Are IP and port valid?
+     *  Refuse anybody in the same /16
+     *  @since 0.9.3
+     */
+    private boolean isValid(byte[] ip, int port) {
+        return port >= 1024 &&
+               port <= 65535 &&
+               _transport.isValid(ip) &&
+               (!DataHelper.eq(ip, 0, _transport.getExternalIP(), 0, 2)) &&
+               (!_context.blocklist().isBlocklisted(ip));
+    }
 }
diff --git a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java
index 382cab6cbd291ef21ce01bcec1a3a8c606da293c..cb32ac013e3c0264893360c021e6f8c529eddc0e 100644
--- a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java
+++ b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java
@@ -61,10 +61,10 @@ class MessageReceiver {
         //_cache = ByteCache.getInstance(64, I2NPMessage.MAX_SIZE);
         _context.statManager().createRateStat("udp.inboundExpired", "How many messages were expired before reception?", "udp", UDPTransport.RATES);
         //_context.statManager().createRateStat("udp.inboundRemaining", "How many messages were remaining when a message is pulled off the complete queue?", "udp", UDPTransport.RATES);
-        _context.statManager().createRateStat("udp.inboundReady", "How many messages were ready when a message is added to the complete queue?", "udp", UDPTransport.RATES);
+        //_context.statManager().createRateStat("udp.inboundReady", "How many messages were ready when a message is added to the complete queue?", "udp", UDPTransport.RATES);
         //_context.statManager().createRateStat("udp.inboundReadTime", "How long it takes to parse in the completed fragments into a message?", "udp", UDPTransport.RATES);
         //_context.statManager().createRateStat("udp.inboundReceiveProcessTime", "How long it takes to add the message to the transport?", "udp", UDPTransport.RATES);
-        _context.statManager().createRateStat("udp.inboundLag", "How long the oldest ready message has been sitting on the queue (period is the queue size)?", "udp", UDPTransport.RATES);
+        //_context.statManager().createRateStat("udp.inboundLag", "How long the oldest ready message has been sitting on the queue (period is the queue size)?", "udp", UDPTransport.RATES);
         
         _alive = true;
     }
diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java
index 47922180d7ac73b732a717de5a27053276fde48f..797060c5838bfab1fb5a5d5db1103de39934356e 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java
@@ -369,7 +369,7 @@ class OutboundEstablishState {
         off += 4;
         DataHelper.toLong(signed, off, 4, _receivedSignedOnTime);
         boolean valid = _context.dsa().verifySignature(_receivedSignature, signed, _remotePeer.getSigningPublicKey());
-        if (!valid || _log.shouldLog(Log.DEBUG)) {
+        if (_log.shouldLog(Log.DEBUG) || (_log.shouldLog(Log.WARN) && !valid)) {
             StringBuilder buf = new StringBuilder(128);
             buf.append("Signed sessionCreated:");
             buf.append(" Alice: ").append(Addresses.toString(_aliceIP, _alicePort));
diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
index 49a44873e44c1fcabf680ec0a17e2a753cc2e3bd..5e8d9a35b4695427995461b0959b994a896bc819 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
@@ -42,10 +42,20 @@ class OutboundMessageState implements CDPQEntry {
     private long _seqNum;
     
     public static final int MAX_MSG_SIZE = 32 * 1024;
-    /** is this enough for a high-bandwidth router? */
-    private static final int MAX_ENTRIES = 64;
-    /** would two caches, one for small and one for large messages, be better? */
-    private static final ByteCache _cache = ByteCache.getInstance(MAX_ENTRIES, MAX_MSG_SIZE);
+    private static final int CACHE4_BYTES = MAX_MSG_SIZE;
+    private static final int CACHE3_BYTES = CACHE4_BYTES / 4;
+    private static final int CACHE2_BYTES = CACHE3_BYTES / 4;
+    private static final int CACHE1_BYTES = CACHE2_BYTES / 4;
+
+    private static final int CACHE1_MAX = 256;
+    private static final int CACHE2_MAX = CACHE1_MAX / 4;
+    private static final int CACHE3_MAX = CACHE2_MAX / 4;
+    private static final int CACHE4_MAX = CACHE3_MAX / 4;
+
+    private static final ByteCache _cache1 = ByteCache.getInstance(CACHE1_MAX, CACHE1_BYTES);
+    private static final ByteCache _cache2 = ByteCache.getInstance(CACHE2_MAX, CACHE2_BYTES);
+    private static final ByteCache _cache3 = ByteCache.getInstance(CACHE3_MAX, CACHE3_BYTES);
+    private static final ByteCache _cache4 = ByteCache.getInstance(CACHE4_MAX, CACHE4_BYTES);
 
     private static final long EXPIRATION = 10*1000;
     
@@ -72,6 +82,7 @@ class OutboundMessageState implements CDPQEntry {
      *  Called from UDPTransport
      *  TODO make two constructors, remove this, and make more things final
      *  @return success
+     *  @throws IAE if too big
      */
     public boolean initialize(I2NPMessage msg, PeerState peer) {
         if (msg == null) 
@@ -91,6 +102,7 @@ class OutboundMessageState implements CDPQEntry {
      *  Called from OutboundMessageFragments
      *  TODO make two constructors, remove this, and make more things final
      *  @return success
+     *  @throws IAE if too big
      */
     public boolean initialize(OutNetMessage m, I2NPMessage msg) {
         if ( (m == null) || (msg == null) ) 
@@ -110,19 +122,13 @@ class OutboundMessageState implements CDPQEntry {
      *  Called from OutboundMessageFragments
      *  @param m null if msg is "injected"
      *  @return success
+     *  @throws IAE if too big
      */
     private boolean initialize(OutNetMessage m, I2NPMessage msg, PeerState peer) {
         _message = m;
         _peer = peer;
-        if (_messageBuf != null) {
-            _cache.release(_messageBuf);
-            _messageBuf = null;
-        }
-
-        _messageBuf = _cache.acquire();
         int size = msg.getRawMessageSize();
-        if (size > _messageBuf.getData().length)
-            throw new IllegalArgumentException("Size too large!  " + size + " in " + msg);
+        acquireBuf(size);
         try {
             int len = msg.toRawByteArray(_messageBuf.getData());
             _messageBuf.setValid(len);
@@ -137,13 +143,49 @@ class OutboundMessageState implements CDPQEntry {
             //    _log.debug("Raw byte array for " + _messageId + ": " + Base64.encode(_messageBuf.getData(), 0, len));
             return true;
         } catch (IllegalStateException ise) {
-            _cache.release(_messageBuf);
-            _messageBuf = null;
-            _released = true;
+            releaseBuf();
             return false;
         }
     }
     
+    /**
+     *  @throws IAE if too big
+     *  @since 0.9.3
+     */
+    private void acquireBuf(int size) {
+        if (_messageBuf != null)
+            releaseBuf();
+        if (size <= CACHE1_BYTES)
+            _messageBuf =  _cache1.acquire();
+        else if (size <= CACHE2_BYTES)
+            _messageBuf = _cache2.acquire();
+        else if (size <= CACHE3_BYTES)
+            _messageBuf = _cache3.acquire();
+        else if (size <= CACHE4_BYTES)
+            _messageBuf = _cache4.acquire();
+        else
+            throw new IllegalArgumentException("Size too large! " + size);
+    }
+    
+    /**
+     *  @since 0.9.3
+     */
+    private void releaseBuf() {
+        if (_messageBuf == null)
+            return;
+        int size = _messageBuf.getData().length;
+        if (size == CACHE1_BYTES)
+            _cache1.release(_messageBuf);
+        else if (size == CACHE2_BYTES)
+            _cache2.release(_messageBuf);
+        else if (size == CACHE3_BYTES)
+            _cache3.release(_messageBuf);
+        else if (size == CACHE4_BYTES)
+            _cache4.release(_messageBuf);
+        _messageBuf = null;
+        _released = true;
+    }
+
     /**
      *  This is synchronized with writeFragment(),
      *  so we do not release (probably due to an ack) while we are retransmitting.
@@ -151,8 +193,7 @@ class OutboundMessageState implements CDPQEntry {
      */
     public synchronized void releaseResources() { 
         if (_messageBuf != null && !_released) {
-            _cache.release(_messageBuf);
-            _released = true;
+            releaseBuf();
             if (_log.shouldLog(Log.WARN))
                 _releasedBy = new Exception ("Released on " + new Date() + " by:");
         }
diff --git a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
index ff707407bffbcccc92e61ec760406804bf35e3df..96ceec9c0dd21d5631f8d413e10c8fa3d2e4ab0f 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
@@ -1,11 +1,14 @@
 package net.i2p.router.transport.udp;
 
 import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 import net.i2p.router.Router;
 import net.i2p.router.RouterContext;
 import net.i2p.data.DataHelper;
 import net.i2p.util.I2PThread;
+import net.i2p.util.LHMCache;
 import net.i2p.util.Log;
 
 /**
@@ -30,6 +33,8 @@ class PacketHandler {
     private final IntroductionManager _introManager;
     private volatile boolean _keepReading;
     private final Handler[] _handlers;
+    private final Map<RemoteHostId, Object> _failCache;
+    private static final Object DUMMY = new Object();
     
     private static final int MIN_NUM_HANDLERS = 1;  // unless < 32MB
     private static final int MAX_NUM_HANDLERS = 1;
@@ -46,6 +51,7 @@ class PacketHandler {
         _inbound = inbound;
         _testManager = testManager;
         _introManager = introManager;
+        _failCache = new LHMCache(24);
 
         long maxMemory = Runtime.getRuntime().maxMemory();
         if (maxMemory == Long.MAX_VALUE)
@@ -143,8 +149,8 @@ class PacketHandler {
                 if (packet == null) break; // keepReading is probably false, or bind failed...
 
                 packet.received();
-                if (_log.shouldLog(Log.INFO))
-                    _log.info("Received: " + packet);
+                if (_log.shouldLog(Log.DEBUG))
+                    _log.debug("Received: " + packet);
                 _state = 4;
                 long queueTime = packet.getLifetime();
                 long handleStart = _context.clock().now();
@@ -294,7 +300,7 @@ class PacketHandler {
                             receivePacket(reader, packet, est, false);
                         } else {
                             if (_log.shouldLog(Log.WARN))
-                                _log.warn("Validation with existing con failed, and validation as reestablish failed too.  DROP");
+                                _log.warn("Validation with existing con failed, and validation as reestablish failed too.  DROP " + packet);
                             _context.statManager().addRateData("udp.droppedInvalidReestablish", packet.getLifetime(), packet.getExpiration());
                         }
                         return;
@@ -327,8 +333,70 @@ class PacketHandler {
             if (!isValid) {
                 // Note that the vast majority of these are NOT corrupted packets, but
                 // packets for which we don't have the PeerState (i.e. SessionKey)
+                // Case 1: 48 byte destroy packet, we already closed
+                // Case 2: 369 byte session created packet, re-tx of one that failed validation
+                //         (peer probably doesn't know his correct external port, esp. on <= 0.9.1
+
+                // Case 3:
+                // For peers that change ports, look for an existing session with the same IP
+                // If we find it, and the packet validates with its mac key, tell the transport
+                // to change the port, and handle the packet.
+                // All this since 0.9.3.
+                RemoteHostId remoteHost = packet.getRemoteHost();
+                boolean alreadyFailed;
+                synchronized(_failCache) {
+                    alreadyFailed = _failCache.get(remoteHost) != null;
+                }                
+                if (!alreadyFailed) {
+                    // this is slow, that's why we cache it above.
+                    List<PeerState> peers = _transport.getPeerStatesByIP(remoteHost);
+                    if (!peers.isEmpty()) {
+                        StringBuilder buf = new StringBuilder(256);
+                        buf.append("Established peers with this IP: ");
+                        boolean foundSamePort = false;
+                        PeerState state = null;
+                        int newPort = remoteHost.getPort();
+                        for (PeerState ps : peers) {
+                            boolean valid = false;
+                            long now = _context.clock().now();
+                            if (_log.shouldLog(Log.WARN))
+                                buf.append(ps.getRemoteHostId().toString())
+                                   .append(" last sent: ").append(now - ps.getLastSendTime())
+                                   .append(" last rcvd: ").append(now - ps.getLastReceiveTime());
+                            if (ps.getRemotePort() == newPort) {
+                                foundSamePort = true;
+                            } else if (packet.validate(ps.getCurrentMACKey())) {
+                                packet.decrypt(ps.getCurrentCipherKey());
+                                reader.initialize(packet);
+                                if (_log.shouldLog(Log.WARN))
+                                    buf.append(" VALID type ").append(reader.readPayloadType()).append("; ");
+                                valid = true;
+                                if (state == null)
+                                    state = ps;
+                            } else {
+                                if (_log.shouldLog(Log.WARN))
+                                    buf.append(" INVALID; ");
+                            }
+                        }
+                        if (state != null && !foundSamePort) {
+                            _transport.changePeerPort(state, newPort);
+                            if (_log.shouldLog(Log.WARN)) {
+                                buf.append(" CHANGED PORT TO ").append(newPort).append(" AND HANDLED");
+                                _log.warn(buf.toString());
+                            }
+                            handlePacket(reader, packet, state, null, null, true);
+                            return;
+                        }
+                        if (_log.shouldLog(Log.WARN))
+                            _log.warn(buf.toString());
+                    }
+                    synchronized(_failCache) {
+                        _failCache.put(remoteHost, DUMMY);
+                    }                
+                }
                 if (_log.shouldLog(Log.WARN))
-                    _log.warn("Cannot validate rcvd pkt (path): " + packet);
+                    _log.warn("Cannot validate rcvd pkt (path) wasCached? " + alreadyFailed + ": " + packet);
+
                 _context.statManager().addRateData("udp.droppedInvalidEstablish", packet.getLifetime(), packet.getExpiration());
                 switch (peerType) {
                     case INBOUND_FALLBACK:
diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java
index 694a2740a4ccce393205abe75a15d91e2c35ee23..964e79332896f409869890fd9b8ac0f40ff44049 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerState.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java
@@ -72,6 +72,7 @@ class PeerState {
      *  A positive number means our clock is ahead of theirs.
      */
     private long _clockSkew;
+    private final Object _clockSkewLock = new Object();
 
     /** what is the current receive second, for congestion control? */
     private long _currentReceiveSecond;
@@ -79,6 +80,8 @@ class PeerState {
     private long _lastSendTime;
     /** when did we last send them a message that was ACKed */
     private long _lastSendFullyTime;
+    /** when did we last send them a ping? */
+    private long _lastPingTime;
     /** when did we last receive a packet from them? */
     private long _lastReceiveTime;
     /** how many consecutive messages have we sent and not received an ACK to */
@@ -137,11 +140,11 @@ class PeerState {
     /** what IP is the peer sending and receiving packets on? */
     private final byte[] _remoteIP;
     /** cached IP address */
-    private transient InetAddress _remoteIPAddress;
+    private volatile InetAddress _remoteIPAddress;
     /** what port is the peer sending and receiving packets on? */
-    private final int _remotePort;
+    private volatile int _remotePort;
     /** cached RemoteHostId, used to find the peerState by remote info */
-    private final RemoteHostId _remoteHostId;
+    private volatile RemoteHostId _remoteHostId;
 
     /** if we need to contact them, do we need to talk to an introducer? */
     //private boolean _remoteRequiresIntroduction;
@@ -284,9 +287,12 @@ class PeerState {
      */
     public static final int LARGE_MTU = 1484;
     
+    /** 600 */
     private static final int MIN_RTO = 100 + ACKSender.ACK_FREQUENCY;
-    private static final int INIT_RTO = 4*1000;
+    private static final int INIT_RTO = 3*1000;
+    public static final int INIT_RTT = INIT_RTO / 2;
     private static final int MAX_RTO = 15*1000;
+    private static final int CLOCK_SKEW_FUDGE = (ACKSender.ACK_FREQUENCY * 2) / 3;
     
     public PeerState(RouterContext ctx, UDPTransport transport,
                      byte[] remoteIP, int remotePort, Hash remotePeer, boolean isInbound) {
@@ -313,7 +319,7 @@ class PeerState {
         //_mtuLastChecked = -1;
         _lastACKSend = -1;
         _rto = INIT_RTO;
-        _rtt = INIT_RTO / 2;
+        _rtt = INIT_RTT;
         _rttDeviation = _rtt;
         _inboundMessages = new HashMap(8);
         _outboundMessages = new ArrayList(32);
@@ -325,6 +331,17 @@ class PeerState {
         _remoteHostId = new RemoteHostId(remoteIP, remotePort);
     }
     
+    /** 
+     *  Caller should sync; UDPTransport must remove and add to peersByRemoteHost map
+     *  @since 0.9.3
+     */
+    public void changePort(int newPort) {
+        if (newPort != _remotePort) {
+            _remoteHostId = new RemoteHostId(_remoteIP, newPort);
+            _remotePort = newPort;
+        }
+    }
+
     /**
      * The peer are we talking to.  This should be set as soon as this
      * state is created if we are initiating a connection, but if we are
@@ -342,9 +359,12 @@ class PeerState {
      * connection is established.
      */
     public SessionKey getCurrentCipherKey() { return _currentCipherKey; }
+
     /** 
      * The pending AES key for verifying packets if we are rekeying the 
      * connection, or null if we are not in the process of rekeying.
+     *
+     * @return null always, rekeying unimplemented
      */
     public SessionKey getNextMACKey() { return _nextMACKey; }
 
@@ -352,6 +372,8 @@ class PeerState {
      * The pending AES key for encrypting/decrypting packets if we are 
      * rekeying the connection, or null if we are not in the process 
      * of rekeying.
+     *
+     * @return null always, rekeying unimplemented
      */
     public SessionKey getNextCipherKey() { return _nextCipherKey; }
 
@@ -384,13 +406,20 @@ class PeerState {
     public long getLastReceiveTime() { return _lastReceiveTime; }
     /** how many seconds have we sent packets without any ACKs received? */
     public int getConsecutiveFailedSends() { return _consecutiveFailedSends; }
-    /** have we received a packet with the ECN bit set in the current second? */
+
+    /**
+     *  have we received a packet with the ECN bit set in the current second?
+     *  @return false always
+     *  @deprecated unused, ECNs are never sent, always returns false
+     */
     public boolean getCurrentSecondECNReceived() { return _currentSecondECNReceived; }
+
     /** 
      * have all of the packets received in the current second requested that
      * the previous second's ACKs be sent?
      */
     //public boolean getRemoteWantsPreviousACKs() { return _remoteWantsPreviousACKs; }
+
     /** how many bytes should we send to the peer in a second */
     public int getSendWindowBytes() { return _sendWindowBytes; }
     /** how many bytes can we send to the peer in the current second */
@@ -504,7 +533,12 @@ class PeerState {
      *              A positive number means our clock is ahead of theirs.
      */
     public void adjustClockSkew(long skew) { 
-        _clockSkew = (long) (0.9*_clockSkew + 0.1*(skew - (_rtt / 2))); 
+        // the real one-way delay is much less than RTT / 2, due to ack delays,
+        // so add a fudge factor
+        double adj = 0.1 * (skew + CLOCK_SKEW_FUDGE - (_rtt / 2)); 
+        synchronized(_clockSkewLock) {
+            _clockSkew = (long) (0.9*_clockSkew + adj); 
+        }
     }
 
     /** what is the current receive second, for congestion control? */
@@ -513,6 +547,21 @@ class PeerState {
     public void setLastSendTime(long when) { _lastSendTime = when; }
     /** when did we last receive a packet from them? */
     public void setLastReceiveTime(long when) { _lastReceiveTime = when; }
+
+    /**
+     *  Note ping sent. Does not update last send time.
+     *  @since 0.9.3
+     */
+    public void setLastPingTime(long when) { _lastPingTime = when; }
+
+    /**
+     *  Latest of last sent, last ACK, last ping
+     *  @since 0.9.3
+     */
+    public long getLastSendOrPingTime() {
+        return Math.max(Math.max(_lastSendTime, _lastACKSend), _lastPingTime);
+    }
+
     /** return the smoothed send transfer rate */
     public int getSendBps() { return _sendBps; }
     public int getReceiveBps() { return _receiveBps; }
@@ -714,7 +763,8 @@ class PeerState {
     /** 
      * either they told us to back off, or we had to resend to get 
      * the data through.  
-     *
+     *  Caller should synch on this
+     *  @return true if window shrunk, but nobody uses the return value
      */
     private boolean congestionOccurred() {
         long now = _context.clock().now();
@@ -722,8 +772,6 @@ class PeerState {
             return false; // only shrink once every few seconds
         _lastCongestionOccurred = now;
         
-        _context.statManager().addRateData("udp.congestionOccurred", _sendWindowBytes, _sendBps);
-        
         int congestionAt = _sendWindowBytes;
         //if (true)
         //    _sendWindowBytes -= 10000;
@@ -779,7 +827,10 @@ class PeerState {
             return randomResends;
     }
 
-    /** the ack was sent */
+    /**
+     * The ack was sent.
+     * Side effect - sets _lastACKSend
+     */
     public void removeACKMessage(Long messageId) {
             boolean removed = _currentACKs.remove(messageId);
             if (removed) {
@@ -800,15 +851,15 @@ class PeerState {
     /**
      *  The max number of acks we save to send as duplicates
      */
-    private static final int MAX_RESEND_ACKS = 16;
+    private static final int MAX_RESEND_ACKS = 64;
     /**
      *  The max number of duplicate acks sent in each ack-only messge.
      *  Doesn't really matter, we have plenty of room...
      *  @since 0.7.13
      */
-    private static final int MAX_RESEND_ACKS_LARGE = MAX_RESEND_ACKS;
+    private static final int MAX_RESEND_ACKS_LARGE = MAX_RESEND_ACKS / 3;
     /** for small MTU */
-    private static final int MAX_RESEND_ACKS_SMALL = MAX_RESEND_ACKS;
+    private static final int MAX_RESEND_ACKS_SMALL = MAX_RESEND_ACKS / 5;
     
     /** 
      * grab a list of ACKBitfield instances, some of which may fully 
@@ -827,11 +878,11 @@ class PeerState {
      * See above. Only called by ACKSender with alwaysIncludeRetransmissions = false.
      * So this is only for ACK-only packets, so all the size limiting is useless.
      * FIXME.
+     * Side effect - sets _lastACKSend if rv is non-empty
      *
      * @return non-null, possibly empty
      */
     public List<ACKBitfield> retrieveACKBitfields(boolean alwaysIncludeRetransmissions) {
-        List<ACKBitfield> rv = new ArrayList(MAX_RESEND_ACKS);
         int bytesRemaining = countMaxACKData();
 
             // Limit the overhead of all the resent acks when using small MTU
@@ -843,8 +894,10 @@ class PeerState {
                 maxResendAcks = MAX_RESEND_ACKS_SMALL;
             else
                 maxResendAcks = MAX_RESEND_ACKS_LARGE;
-            List<Long> randomResends = new ArrayList(_currentACKsResend);
+            List<ACKBitfield> rv = new ArrayList(maxResendAcks);
 
+            // save to add to currentACKsResend later so we don't include twice
+            List<Long> currentACKsRemoved = new ArrayList(_currentACKs.size());
             // As explained above, we include the acks in any order
             // since we are unlikely to get backed up -
             // just take them using the Set iterator.
@@ -854,12 +907,13 @@ class PeerState {
                 iter.remove();
                 long id = val.longValue();
                 rv.add(new FullACKBitfield(id));
-                _currentACKsResend.offer(val);
+                currentACKsRemoved.add(val);
                 bytesRemaining -= 4;
             }
             if (_currentACKs.isEmpty())
                 _wantACKSendSince = -1;
             if (alwaysIncludeRetransmissions || !rv.isEmpty()) {
+                List<Long> randomResends = new ArrayList(_currentACKsResend);
                 // now repeat by putting in some old ACKs
                 // randomly selected from the Resend queue.
                 // Maybe we should only resend each one a certain number of times...
@@ -880,6 +934,9 @@ class PeerState {
                         bytesRemaining -= 4;
                     //}
                 }
+                for (Long val : currentACKsRemoved) {
+                    _currentACKsResend.offer(val);
+                }
             }
             // trim down the resends
             while (_currentACKsResend.size() > MAX_RESEND_ACKS)
@@ -907,7 +964,8 @@ class PeerState {
             }
         }
 
-        _lastACKSend = _context.clock().now();
+        if (!rv.isEmpty())
+            _lastACKSend = _context.clock().now();
         //if (rv == null)
         //    rv = Collections.EMPTY_LIST;
         if (partialIncluded > 0)
@@ -975,8 +1033,11 @@ class PeerState {
         public String toString() { return "Full ACK of " + _msgId; }
     }
         
-    /** we sent a message which was ACKed containing the given # of bytes */
-    public void messageACKed(int bytesACKed, long lifetime, int numSends) {
+    /**
+     *  We sent a message which was ACKed containing the given # of bytes.
+     *  Caller should synch on this
+     */
+    private void locked_messageACKed(int bytesACKed, long lifetime, int numSends) {
         _concurrentMessagesActive--;
         if (_concurrentMessagesActive < 0)
             _concurrentMessagesActive = 0;
@@ -990,15 +1051,15 @@ class PeerState {
             if (_sendWindowBytes <= _slowStartThreshold) {
                 _sendWindowBytes += bytesACKed;
             } else {
-                if (false) {
-                    _sendWindowBytes += 16; // why 16?
-                } else {
+                //if (false) {
+                //    _sendWindowBytes += 16; // why 16?
+                //} else {
                     float prob = ((float)bytesACKed) / ((float)(_sendWindowBytes<<1));
                     float v = _context.random().nextFloat();
                     if (v < 0) v = 0-v;
                     if (v <= prob)
                         _sendWindowBytes += bytesACKed; //512; // bytesACKed;
-                }
+                //}
             }
         } else {
             int allow = _concurrentMessagesAllowed - 1;
@@ -1011,21 +1072,31 @@ class PeerState {
         _lastReceiveTime = _context.clock().now();
         _lastSendFullyTime = _lastReceiveTime;
         
-        if (true) {
+        //if (true) {
             if (_sendWindowBytesRemaining + bytesACKed <= _sendWindowBytes)
                 _sendWindowBytesRemaining += bytesACKed;
             else
                 _sendWindowBytesRemaining = _sendWindowBytes;
-        }
+        //}
         
         _messagesSent++;
         if (numSends < 2) {
-            synchronized (this) {
+            // caller synchs
+            //synchronized (this) {
                 recalculateTimeouts(lifetime);
                 adjustMTU();
-            }
+            //}
         }
-        else if (_log.shouldLog(Log.INFO))
+    }
+
+    /**
+     *  We sent a message which was ACKed containing the given # of bytes.
+     */
+    private void messageACKed(int bytesACKed, long lifetime, int numSends) {
+        synchronized(this) {
+            locked_messageACKed(bytesACKed, lifetime, numSends);
+        }
+        if (numSends >= 2 && _log.shouldLog(Log.INFO))
             _log.info("acked after numSends=" + numSends + " w/ lifetime=" + lifetime + " and size=" + bytesACKed);
         
         _context.statManager().addRateData("udp.sendBps", _sendBps, lifetime);
@@ -1104,9 +1175,10 @@ class PeerState {
             _packetsRetransmitted = packets;
         }
         *****/
-        congestionOccurred();
+        _context.statManager().addRateData("udp.congestionOccurred", _sendWindowBytes, _sendBps);
         _context.statManager().addRateData("udp.congestedRTO", _rto, _rttDeviation);
         synchronized (this) {
+            congestionOccurred();
             adjustMTU();
         }
         //_rto *= 2; 
@@ -1168,10 +1240,14 @@ class PeerState {
     }
     
     /** 
-     * we received a backoff request, so cut our send window
+     *  We received a backoff request, so cut our send window.
+     *  NOTE: ECN sending is unimplemented, this is never called.
      */
     public void ECNReceived() {
-        congestionOccurred();
+        synchronized(this) {
+            congestionOccurred();
+        }
+        _context.statManager().addRateData("udp.congestionOccurred", _sendWindowBytes, _sendBps);
         _currentSecondECNReceived = true;
         _lastReceiveTime = _context.clock().now();
     }
@@ -1182,17 +1258,33 @@ class PeerState {
     
     /** when did we last send an ACK to the peer? */
     public long getLastACKSend() { return _lastACKSend; }
+
+    /** @deprecated unused */
     public void setLastACKSend(long when) { _lastACKSend = when; }
+
     public long getWantedACKSendSince() { return _wantACKSendSince; }
 
+    /**
+     *  Are we out of room to send all the current unsent acks in a single packet?
+     *  This is a huge threshold (134 for small MTU and 255 for large MTU)
+     *  that is rarely if ever exceeded in practice.
+     *  So just use a fixed threshold of half the resend acks, so that if the
+     *  packet is lost the acks have a decent chance of getting retransmitted.
+     *  Used only by ACKSender.
+     */
     public boolean unsentACKThresholdReached() {
-        int threshold = countMaxACKData() / 4;
-        return _currentACKs.size() >= threshold;
+        //int threshold = countMaxACKData() / 4;
+        //return _currentACKs.size() >= threshold;
+        return _currentACKs.size() >= MAX_RESEND_ACKS / 2;
     }
 
-    /** @return MTU - 83 */
+    /**
+     *  @return how many bytes available for acks in an ack-only packet, == MTU - 83
+     *          Max of 1020
+     */
     private int countMaxACKData() {
-        return _mtu 
+        return Math.min(PacketBuilder.ABSOLUTE_MAX_ACKS * 4,
+                _mtu 
                 - PacketBuilder.IP_HEADER_SIZE
                 - PacketBuilder.UDP_HEADER_SIZE
                 - UDPPacket.IV_SIZE 
@@ -1201,7 +1293,7 @@ class PeerState {
                 - 4 // timestamp
                 - 1 // data flag
                 - 1 // # ACKs
-                - 16; // padding safety
+                - 16); // padding safety
     }
 
     private int minRTO() {
@@ -1213,6 +1305,7 @@ class PeerState {
         //    return MAX_RTO;
     }
     
+    /** @return non-null */
     RemoteHostId getRemoteHostId() { return _remoteHostId; }
     
     /**
@@ -1770,6 +1863,7 @@ class PeerState {
     /**
      * Transfer the basic activity/state from the old peer to the current peer
      *
+     * @param oldPeer non-null
      */
     public void loadFrom(PeerState oldPeer) {
         _rto = oldPeer._rto;
@@ -1875,6 +1969,9 @@ class PeerState {
         buf.append(" consecFail: ").append(_consecutiveFailedSends);
         buf.append(" recv OK/Dup: ").append(_packetsReceived).append('/').append(_packetsReceivedDuplicate);
         buf.append(" send OK/Dup: ").append(_packetsTransmitted).append('/').append(_packetsRetransmitted);
+        buf.append(" IBM: ").append(_inboundMessages.size());
+        buf.append(" OBQ: ").append(_outboundQueue.size());
+        buf.append(" OBL: ").append(_outboundMessages.size());
         return buf.toString();
     }
 }
diff --git a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
index 2623c07cc4139d069aa91dfec0d3b29b97672eb1..9b00962b385052efafb8375bd3c94b188e0a69c2 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
@@ -14,12 +14,16 @@ import net.i2p.data.RouterInfo;
 import net.i2p.data.SessionKey;
 import net.i2p.router.CommSystemFacade;
 import net.i2p.router.RouterContext;
+import static net.i2p.router.transport.udp.PeerTestState.Role.*;
 import net.i2p.util.Addresses;
 import net.i2p.util.Log;
 import net.i2p.util.SimpleScheduler;
 import net.i2p.util.SimpleTimer;
 
 /**
+ *  Entry points are runTest() to start a new test as Alice,
+ *  and receiveTest() for all received test packets.
+ *
  *  From udp.html on the website:
 
 <p>The automation of collaborative reachability testing for peers is
@@ -30,12 +34,27 @@ quite simple:</p>
 
 <pre>
         Alice                  Bob                  Charlie
+
+    runTest()
+    sendTestToBob()     receiveFromAliceAsBob()
     PeerTest -------------------&gt;
+
+                        sendTestToCharlie()       receiveFromBobAsCharlie()
                              PeerTest--------------------&gt;
+
+                        receiveFromCharlieAsBob()
                                 &lt;-------------------PeerTest
+
+    receiveTestReply()
          &lt;-------------------PeerTest
+
+    receiveTestReply()
          &lt;------------------------------------------PeerTest
+
+                                                  receiveFromAliceAsCharlie()
     PeerTest------------------------------------------&gt;
+
+    receiveTestReply()
          &lt;------------------------------------------PeerTest
 </pre>
 
@@ -104,9 +123,27 @@ class PeerTestManager {
     private boolean _currentTestComplete;
     /** as Alice */
     private final Queue<Long> _recentTests;
+    private final IPThrottler _throttle;
+    
+    private static final int MAX_RELAYED_PER_TEST_ALICE = 9;
+    private static final int MAX_RELAYED_PER_TEST_BOB = 6;
+    private static final int MAX_RELAYED_PER_TEST_CHARLIE = 6;
     
     /** longest we will keep track of a Charlie nonce for */
-    private static final int MAX_CHARLIE_LIFETIME = 10*1000;
+    private static final int MAX_CHARLIE_LIFETIME = 15*1000;
+
+    /** as Bob/Charlie */
+    private static final int MAX_ACTIVE_TESTS = 20;
+    private static final int MAX_RECENT_TESTS = 40;
+
+    /** for the throttler */
+    private static final int MAX_PER_IP = 12;
+    private static final long THROTTLE_CLEAN_TIME = 10*60*1000;
+
+    /** initial - ContinueTest adds backoff */
+    private static final int RESEND_TIMEOUT = 4*1000;
+    private static final int MAX_TEST_TIME = 30*1000;
+    private static final long MAX_NONCE = (1l << 32) - 1l;
 
     /**
      *  Have seen peer tests (as Alice) get stuck (_currentTest != null)
@@ -120,15 +157,12 @@ class PeerTestManager {
         _activeTests = new ConcurrentHashMap();
         _recentTests = new LinkedBlockingQueue();
         _packetBuilder = new PacketBuilder(context, transport);
+        _throttle = new IPThrottler(MAX_PER_IP, THROTTLE_CLEAN_TIME);
         _context.statManager().createRateStat("udp.statusKnownCharlie", "How often the bob we pick passes us to a charlie we already have a session with?", "udp", UDPTransport.RATES);
         _context.statManager().createRateStat("udp.receiveTestReply", "How often we get a reply to our peer test?", "udp", UDPTransport.RATES);
         _context.statManager().createRateStat("udp.receiveTest", "How often we get a packet requesting us to participate in a peer test?", "udp", UDPTransport.RATES);
+        _context.statManager().createRateStat("udp.testBadIP", "Received IP or port was bad", "udp", UDPTransport.RATES);
     }
-    
-    private static final int RESEND_TIMEOUT = 5*1000;
-    private static final int MAX_TEST_TIME = 30*1000;
-    private static final long MAX_NONCE = (1l << 32) - 1l;
-    //public void runTest(InetAddress bobIP, int bobPort, SessionKey bobIntroKey) {
 
     /**
      *  The next few methods are for when we are Alice
@@ -136,42 +170,60 @@ class PeerTestManager {
     public synchronized void runTest(InetAddress bobIP, int bobPort, SessionKey bobCipherKey, SessionKey bobMACKey) {
         if (_currentTest != null) {
             if (_log.shouldLog(Log.WARN))
-                _log.warn("We are already running a test with bob = " + _currentTest.getBobIP() + ", aborting test with bob = " + bobIP);
+                _log.warn("We are already running a test: " + _currentTest + ", aborting test with bob = " + bobIP);
             return;
         }
-        PeerTestState test = new PeerTestState();
-        test.setNonce(_context.random().nextLong(MAX_NONCE));
+        if (DataHelper.eq(bobIP.getAddress(), 0, _transport.getExternalIP(), 0, 2)) {
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("Not running test with Bob too close to us " + bobIP);
+            return;
+        }
+        PeerTestState test = new PeerTestState(ALICE,
+                                               _context.random().nextLong(MAX_NONCE),
+                                               _context.clock().now());
         test.setBobIP(bobIP);
         test.setBobPort(bobPort);
         test.setBobCipherKey(bobCipherKey);
         test.setBobMACKey(bobMACKey);
-        test.setBeginTime(_context.clock().now());
         test.setLastSendTime(test.getBeginTime());
-        test.setOurRole(PeerTestState.ALICE);
         _currentTest = test;
         _currentTestComplete = false;
         
         if (_log.shouldLog(Log.DEBUG))
-            _log.debug("Running test with bob = " + bobIP + ":" + bobPort + " " + test.getNonce());
-        while (_recentTests.size() > 16)
+            _log.debug("Start new test: " + test);
+        while (_recentTests.size() > MAX_RECENT_TESTS)
             _recentTests.poll();
         _recentTests.offer(Long.valueOf(test.getNonce()));
         
+        test.incrementPacketsRelayed();
         sendTestToBob();
         
-        _context.simpleScheduler().addEvent(new ContinueTest(), RESEND_TIMEOUT);
+        _context.simpleScheduler().addEvent(new ContinueTest(test.getNonce()), RESEND_TIMEOUT);
     }
     
     private class ContinueTest implements SimpleTimer.TimedEvent {
+        private final long _nonce;
+
+        public ContinueTest(long nonce) {
+            _nonce = nonce;
+        }
+
         public void timeReached() {
             synchronized (PeerTestManager.this) {
                 PeerTestState state = _currentTest;
-                if (state == null) {
-                    // already completed
+                if (state == null || state.getNonce() != _nonce) {
+                    // already completed, possibly on to the next test
                     return;
                 } else if (expired()) {
                     testComplete(true);
                 } else if (_context.clock().now() - state.getLastSendTime() >= RESEND_TIMEOUT) {
+                    int sent = state.incrementPacketsRelayed();
+                    if (sent > MAX_RELAYED_PER_TEST_ALICE) {
+                        testComplete(false);
+                        if (_log.shouldLog(Log.WARN))
+                            _log.warn("Sent too many packets: " + state);
+                        return;
+                    }
                     if (state.getReceiveBobTime() <= 0) {
                         // no message from Bob yet, send it again
                         sendTestToBob();
@@ -184,7 +236,8 @@ class PeerTestManager {
                         // second message from Charlie yet
                         sendTestToCharlie();
                     }
-                    _context.simpleScheduler().addEvent(ContinueTest.this, RESEND_TIMEOUT);
+                    // retx at 4, 10, 17, 25 elapsed time
+                    _context.simpleScheduler().addEvent(ContinueTest.this, RESEND_TIMEOUT + (sent*1000));
                 }
             }
         }
@@ -204,19 +257,20 @@ class PeerTestManager {
         PeerTestState test = _currentTest;
         if (!expired()) {
             if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Sending test to bob: " + test.getBobIP() + ":" + test.getBobPort());
+                _log.debug("Sending test to Bob: " + test);
             _transport.send(_packetBuilder.buildPeerTestFromAlice(test.getBobIP(), test.getBobPort(), test.getBobCipherKey(), test.getBobMACKey(), //_bobIntroKey, 
                             test.getNonce(), _transport.getIntroKey()));
         } else {
             _currentTest = null;
         }
     }
+
     /** call from a synchronized method */
     private void sendTestToCharlie() {
         PeerTestState test = _currentTest;
         if (!expired()) {
             if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Sending test to charlie: " + test.getCharlieIP() + ":" + test.getCharliePort());
+                _log.debug("Sending test to Charlie: " + test);
             _transport.send(_packetBuilder.buildPeerTestFromAlice(test.getCharlieIP(), test.getCharliePort(), test.getCharlieIntroKey(), 
                             test.getNonce(), _transport.getIntroKey()));
         } else {
@@ -240,7 +294,7 @@ class PeerTestManager {
      * test. We are Alice.
      */
     private synchronized void receiveTestReply(RemoteHostId from, UDPPacketReader.PeerTestReader testInfo) {
-        _context.statManager().addRateData("udp.receiveTestReply", 1, 0);
+        _context.statManager().addRateData("udp.receiveTestReply", 1);
         PeerTestState test = _currentTest;
         if (expired())
             return;
@@ -270,16 +324,20 @@ class PeerTestManager {
                 InetAddress addr = InetAddress.getByAddress(ip);
                 test.setAliceIP(addr);
                 test.setReceiveBobTime(_context.clock().now());
-                test.setAlicePort(testInfo.readPort());
+                int testPort = testInfo.readPort();
+                if (testPort == 0)
+                    throw new UnknownHostException("port 0");
+                test.setAlicePort(testPort);
 
                 if (_log.shouldLog(Log.DEBUG))
-                    _log.debug("Receive test reply from bob @ " + from + " via our " + test.getAlicePort() + "/" + test.getAlicePortFromCharlie());
+                    _log.debug("Receive test reply from Bob: " + test);
                 if (test.getAlicePortFromCharlie() > 0)
                     testComplete(false);
             } catch (UnknownHostException uhe) {
                 if (_log.shouldLog(Log.ERROR))
                     _log.error("Unable to get our IP (length " + ipSize +
                                ") from bob's reply: " + from + ", " + testInfo, uhe);
+                _context.statManager().addRateData("udp.testBadIP", 1);
             }
         } else {
             // The reply is from Charlie
@@ -294,7 +352,7 @@ class PeerTestManager {
                               + _currentTest + ", charlie: " + from + ")");
                 // why are we doing this instead of calling testComplete() ?
                 _currentTestComplete = true;
-                _context.statManager().addRateData("udp.statusKnownCharlie", 1, 0);
+                _context.statManager().addRateData("udp.statusKnownCharlie", 1);
                 honorStatus(CommSystemFacade.STATUS_UNKNOWN);
                 _currentTest = null;
                 return;
@@ -302,26 +360,29 @@ class PeerTestManager {
     
             if (test.getReceiveCharlieTime() > 0) {
                 // this is our second charlie, yay!
-                test.setAlicePortFromCharlie(testInfo.readPort());
-                byte ip[] = new byte[testInfo.readIPSize()];
-                testInfo.readIP(ip, 0);
                 try {
+                    int testPort = testInfo.readPort();
+                    if (testPort == 0)
+                        throw new UnknownHostException("port 0");
+                    test.setAlicePortFromCharlie(testPort);
+                    byte ip[] = new byte[testInfo.readIPSize()];
+                    testInfo.readIP(ip, 0);
                     InetAddress addr = InetAddress.getByAddress(ip);
                     test.setAliceIPFromCharlie(addr);
                     if (_log.shouldLog(Log.DEBUG))
-                        _log.debug("Receive test reply from charlie @ " + test.getCharlieIP() + " via our " 
-                                   + test.getAlicePort() + "/" + test.getAlicePortFromCharlie());
+                        _log.debug("Receive test reply from Charlie: " + test);
                     if (test.getReceiveBobTime() > 0)
                         testComplete(true);
                 } catch (UnknownHostException uhe) {
                     if (_log.shouldLog(Log.ERROR))
                         _log.error("Charlie @ " + from + " said we were an invalid IP address: " + uhe.getMessage(), uhe);
+                    _context.statManager().addRateData("udp.testBadIP", 1);
                 }
             } else {
-                if (test.getPacketsRelayed() > MAX_RELAYED_PER_TEST) {
+                if (test.incrementPacketsRelayed() > MAX_RELAYED_PER_TEST_ALICE) {
                     testComplete(false);
                     if (_log.shouldLog(Log.WARN))
-                        _log.warn("Received too many packets on the test: " + test);
+                        _log.warn("Sent too many packets on the test: " + test);
                     return;
                 }
                 
@@ -338,11 +399,12 @@ class PeerTestManager {
                     test.setCharlieIP(InetAddress.getByAddress(from.getIP()));
                     test.setCharliePort(from.getPort());
                     if (_log.shouldLog(Log.DEBUG))
-                        _log.debug("Receive test from charlie @ " + from);
+                        _log.debug("Receive test from Charlie: " + test);
                     sendTestToCharlie();
                 } catch (UnknownHostException uhe) {
                     if (_log.shouldLog(Log.WARN))
                         _log.warn("Charlie's IP is b0rked: " + from + ": " + testInfo);
+                    _context.statManager().addRateData("udp.testBadIP", 1);
                 }
             }
         }
@@ -409,44 +471,119 @@ class PeerTestManager {
     }
     
     /**
+     * Entry point for all incoming packets. Most of the source and dest validation is here.
+     *
      * Receive a test message of some sort from the given peer, queueing up any packet
      * that should be sent in response, or if its a reply to our own current testing,
      * adjusting our test state.
+     *
      * We could be Alice, Bob, or Charlie.
      */
     public void receiveTest(RemoteHostId from, UDPPacketReader reader) {
-        _context.statManager().addRateData("udp.receiveTest", 1, 0);
+        _context.statManager().addRateData("udp.receiveTest", 1);
+        byte[] fromIP = from.getIP();
+        int fromPort = from.getPort();
+        if (fromPort < 1024 || fromPort > 65535 ||
+            (!_transport.isValid(fromIP)) ||
+            DataHelper.eq(fromIP, 0, _transport.getExternalIP(), 0, 2) ||
+            _context.blocklist().isBlocklisted(fromIP)) {
+            // spoof check, and don't respond to privileged ports
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("Invalid PeerTest address: " + Addresses.toString(fromIP, fromPort));
+            _context.statManager().addRateData("udp.testBadIP", 1);
+            return;
+        }
         UDPPacketReader.PeerTestReader testInfo = reader.getPeerTestReader();
         byte testIP[] = null;
         int testPort = testInfo.readPort();
+
+        if (testInfo.readIPSize() > 0) {
+            testIP = new byte[testInfo.readIPSize()];
+            testInfo.readIP(testIP, 0);
+        }
+
+        if ((testPort > 0 && (testPort < 1024 || testPort > 65535)) ||
+            (testIP != null &&
+                               ((!_transport.isValid(testIP)) ||
+                                _context.blocklist().isBlocklisted(testIP)))) {
+            // spoof check, and don't respond to privileged ports
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("Invalid address in PeerTest: " + Addresses.toString(testIP, testPort));
+            _context.statManager().addRateData("udp.testBadIP", 1);
+            return;
+        }
+
+        // The from IP/port and message's IP/port are now validated.
+        // EXCEPT that either the message's IP could be empty or the message's port could be 0.
+        // Both of those cases should be checked in receiveXfromY() as appropriate.
+        // Also, IP could be us, check is below.
+
         long nonce = testInfo.readNonce();
         PeerTestState test = _currentTest;
         if ( (test != null) && (test.getNonce() == nonce) ) {
-            // we are Alice
+            // we are Alice, we initiated the test
             receiveTestReply(from, testInfo);
             return;
         }
 
-        // we are Bob or Charlie
+        // we are Bob or Charlie, we are helping Alice
 
-        if ( (testInfo.readIPSize() > 0) && (testPort > 0) ) {
-            testIP = new byte[testInfo.readIPSize()];
-            testInfo.readIP(testIP, 0);
+        if (_throttle.shouldThrottle(fromIP)) {
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("PeerTest throttle from " + Addresses.toString(fromIP, fromPort));
+            return;
+        }
+
+        // use the same counter for both from and to IPs
+        if (testIP != null && _throttle.shouldThrottle(testIP)) {
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("PeerTest throttle to " + Addresses.toString(testIP, testPort));
+            return;
+        }
+
+        Long lNonce = Long.valueOf(nonce);
+        PeerTestState state = _activeTests.get(lNonce);
+
+        if (testIP != null && DataHelper.eq(testIP, 0, _transport.getExternalIP(), 0, 2)) {
+            // spoof check - have to do this after receiveTestReply(), since
+            // the field should be us there.
+            // Let's also eliminate anybody in the same /16
+            if (_recentTests.contains(lNonce)) {
+                if (_log.shouldLog(Log.INFO))
+                    _log.info("Got delayed reply on nonce " + nonce +
+                              " from: " + Addresses.toString(fromIP, fromPort));
+            } else {
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn("Nearby address in PeerTest: " + Addresses.toString(testIP, testPort) +
+                              " from: " + Addresses.toString(fromIP, fromPort) +
+                              " state? " + state);
+                _context.statManager().addRateData("udp.testBadIP", 1);
+            }
+            return;
         }
-       
-        PeerTestState state = _activeTests.get(Long.valueOf(nonce));
         
         if (state == null) {
+            // NEW TEST
             if ( (testIP == null) || (testPort <= 0) ) {
                 // we are bob, since we haven't seen this nonce before AND its coming from alice
+                if (_activeTests.size() >= MAX_ACTIVE_TESTS) {
+                    if (_log.shouldLog(Log.WARN))
+                        _log.warn("Too many active tests, droppping from Alice " + Addresses.toString(fromIP, fromPort));
+                    return;
+                }
                 if (_log.shouldLog(Log.DEBUG))
                     _log.debug("test IP/port are blank coming from " + from + ", assuming we are Bob and they are alice");
                 receiveFromAliceAsBob(from, testInfo, nonce, null);
             } else {
-                if (_recentTests.contains(Long.valueOf(nonce))) {
+                if (_recentTests.contains(lNonce)) {
                     // ignore the packet, as its a holdover from a recently completed locally
                     // initiated test
                 } else {
+                    if (_activeTests.size() >= MAX_ACTIVE_TESTS) {
+                        if (_log.shouldLog(Log.WARN))
+                            _log.warn("Too many active tests, droppping from Bob " + Addresses.toString(fromIP, fromPort));
+                        return;
+                    }
                     if (_log.shouldLog(Log.DEBUG))
                         _log.debug("We are charlie, as the testIP/port is " + Addresses.toString(testIP, testPort) + " and the state is unknown for " + nonce);
                     // we are charlie, since alice never sends us her IP and port, only bob does (and,
@@ -455,20 +592,21 @@ class PeerTestManager {
                 }
             }
         } else {
-            if (state.getOurRole() == PeerTestState.BOB) {
-                if (DataHelper.eq(from.getIP(), state.getAliceIP().getAddress()) && 
-                    (from.getPort() == state.getAlicePort()) ) {
+            // EXISTING TEST
+            if (state.getOurRole() == BOB) {
+                if (DataHelper.eq(fromIP, state.getAliceIP().getAddress()) && 
+                    (fromPort == state.getAlicePort()) ) {
                     receiveFromAliceAsBob(from, testInfo, nonce, state);
-                } else if (DataHelper.eq(from.getIP(), state.getCharlieIP().getAddress()) && 
-                           (from.getPort() == state.getCharliePort()) ) {
+                } else if (DataHelper.eq(fromIP, state.getCharlieIP().getAddress()) && 
+                           (fromPort == state.getCharliePort()) ) {
                     receiveFromCharlieAsBob(from, state);
                 } else {
                     if (_log.shouldLog(Log.WARN))
                         _log.warn("Received from a fourth party as bob!  alice: " + state.getAliceIP() + ", charlie: " + state.getCharlieIP() + ", dave: " + from);
                 }
-            } else if (state.getOurRole() == PeerTestState.CHARLIE) {
+            } else if (state.getOurRole() == CHARLIE) {
                 if ( (testIP == null) || (testPort <= 0) ) {
-                    receiveFromAliceAsCharlie(from, testInfo, nonce);
+                    receiveFromAliceAsCharlie(from, testInfo, nonce, state);
                 } else {
                     receiveFromBobAsCharlie(from, testInfo, nonce, state);
                 }
@@ -478,29 +616,34 @@ class PeerTestManager {
     
     // Below here are methods for when we are Bob or Charlie
 
-    private static final int MAX_RELAYED_PER_TEST = 5;
-    
     /**
      * The packet's IP/port does not match the IP/port included in the message, 
      * so we must be Charlie receiving a PeerTest from Bob.
      *  
+     * @param state null if new
      */
     private void receiveFromBobAsCharlie(RemoteHostId from, UDPPacketReader.PeerTestReader testInfo, long nonce, PeerTestState state) {
+        long now = _context.clock().now();
         boolean isNew = false;
         if (state == null) {
             isNew = true;
-            state = new PeerTestState();
-            state.setOurRole(PeerTestState.CHARLIE);
+            state = new PeerTestState(CHARLIE, nonce, now);
+        } else {
+            if (state.getReceiveBobTime() > now - (RESEND_TIMEOUT / 2)) {
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn("Too soon, not retransmitting: " + state);
+                return;
+            }
         }
-        
-        if (_log.shouldLog(Log.DEBUG))
-            _log.debug("Receive test as charlie nonce " + nonce);
-            
+
+        // TODO should only do most of this if isNew
         int sz = testInfo.readIPSize();
         byte aliceIPData[] = new byte[sz];
         try {
             testInfo.readIP(aliceIPData, 0);
             int alicePort = testInfo.readPort();
+            if (alicePort == 0)
+                throw new UnknownHostException("port 0");
             InetAddress aliceIP = InetAddress.getByAddress(aliceIPData);
             InetAddress bobIP = InetAddress.getByAddress(from.getIP());
             SessionKey aliceIntroKey = new SessionKey(new byte[SessionKey.KEYSIZE_BYTES]);
@@ -509,12 +652,10 @@ class PeerTestManager {
             state.setAliceIP(aliceIP);
             state.setAlicePort(alicePort);
             state.setAliceIntroKey(aliceIntroKey);
-            state.setNonce(nonce);
             state.setBobIP(bobIP);
             state.setBobPort(from.getPort());
-            state.setLastSendTime(_context.clock().now());
-            state.setOurRole(PeerTestState.CHARLIE);
-            state.setReceiveBobTime(_context.clock().now());
+            state.setLastSendTime(now);
+            state.setReceiveBobTime(now);
             
             PeerState bob = _transport.getPeerState(from);
             if (bob == null) {
@@ -526,16 +667,15 @@ class PeerTestManager {
                 state.setBobMACKey(bob.getCurrentMACKey());
             }
 
-            state.incrementPacketsRelayed();
-            if (state.getPacketsRelayed() > MAX_RELAYED_PER_TEST) {
+            // we send two packets below, but increment just once
+            if (state.incrementPacketsRelayed() > MAX_RELAYED_PER_TEST_CHARLIE) {
                 if (_log.shouldLog(Log.WARN))
-                    _log.warn("Receive from bob (" + from + ") as charlie with alice @ " + aliceIP + ":" + alicePort
-                              + ", but we've already relayed too many packets to that test, so we're dropping it");
+                    _log.warn("Too many, not retransmitting: " + state);
                 return;
             }
             
             if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Receive from bob (" + from + ") as charlie, sending back to bob and sending to alice @ " + aliceIP + ":" + alicePort);
+                _log.debug("Receive from Bob: " + state);
             
             if (isNew) {
                 _activeTests.put(Long.valueOf(nonce), state);
@@ -550,6 +690,7 @@ class PeerTestManager {
         } catch (UnknownHostException uhe) {
             if (_log.shouldLog(Log.WARN))
                 _log.warn("Unable to build the aliceIP from " + from + ", ip size: " + sz + " ip val: " + Base64.encode(aliceIPData), uhe);
+            _context.statManager().addRateData("udp.testBadIP", 1);
         }
     }
 
@@ -557,20 +698,20 @@ class PeerTestManager {
      * The PeerTest message came from the peer referenced in the message (or there wasn't
      * any info in the message), plus we are not acting as Charlie (so we've got to be Bob).
      *
+     * testInfo IP/port ignored
+     * @param state null if new
      */
     private void receiveFromAliceAsBob(RemoteHostId from, UDPPacketReader.PeerTestReader testInfo, long nonce, PeerTestState state) {
         // we are Bob, so pick a (potentially) Charlie and send Charlie Alice's info
-        PeerState charlie = null;
+        PeerState charlie;
         RouterInfo charlieInfo = null;
         if (state == null) { // pick a new charlie
             charlie = _transport.pickTestPeer(from);
-            if (charlie != null)
-                charlieInfo = _context.netDb().lookupRouterInfoLocally(charlie.getRemotePeer());
         } else {
             charlie = _transport.getPeerState(new RemoteHostId(state.getCharlieIP().getAddress(), state.getCharliePort()));
-            if (charlie != null)
-                charlieInfo = _context.netDb().lookupRouterInfoLocally(charlie.getRemotePeer());
         }
+        if (charlie != null)
+            charlieInfo = _context.netDb().lookupRouterInfoLocally(charlie.getRemotePeer());
         
         if ( (charlie == null) || (charlieInfo == null) ) {
             if (_log.shouldLog(Log.WARN))
@@ -578,6 +719,7 @@ class PeerTestManager {
             return;
         }
         
+        // TODO should only do most of this if isNew
         InetAddress aliceIP = null;
         SessionKey aliceIntroKey = null;
         try {
@@ -597,28 +739,30 @@ class PeerTestManager {
             //UDPPacket packet = _packetBuilder.buildPeerTestToAlice(aliceIP, from.getPort(), aliceIntroKey, charlieIntroKey, nonce);
             //_transport.send(packet);
 
+            long now = _context.clock().now();
             boolean isNew = false;
             if (state == null) {
                 isNew = true;
-                state = new PeerTestState();
-                state.setBeginTime(_context.clock().now());
+                state = new PeerTestState(BOB, nonce, now);
+            } else {
+                if (state.getReceiveAliceTime() > now - (RESEND_TIMEOUT / 2)) {
+                    if (_log.shouldLog(Log.WARN))
+                        _log.warn("Too soon, not retransmitting: " + state);
+                    return;
+                }
             }
             state.setAliceIP(aliceIP);
             state.setAlicePort(from.getPort());
             state.setAliceIntroKey(aliceIntroKey);
-            state.setNonce(nonce);
             state.setCharlieIP(charlie.getRemoteIPAddress());
             state.setCharliePort(charlie.getRemotePort());
             state.setCharlieIntroKey(charlieIntroKey);
-            state.setLastSendTime(_context.clock().now());
-            state.setOurRole(PeerTestState.BOB);
-            state.setReceiveAliceTime(_context.clock().now());
+            state.setLastSendTime(now);
+            state.setReceiveAliceTime(now);
             
-            state.incrementPacketsRelayed();
-            if (state.getPacketsRelayed() > MAX_RELAYED_PER_TEST) {
+            if (state.incrementPacketsRelayed() > MAX_RELAYED_PER_TEST_BOB) {
                 if (_log.shouldLog(Log.WARN))
-                    _log.warn("Receive from alice (" + aliceIP + ":" + from.getPort() 
-                              + ") as bob, but we've already relayed too many packets to that test, so we're dropping it");
+                    _log.warn("Too many, not retransmitting: " + state);
                 return;
             }
             
@@ -634,13 +778,13 @@ class PeerTestManager {
                                                                      charlie.getCurrentMACKey());
             
             if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Receive from alice as bob for " + nonce + ", picking charlie @ " + charlie.getRemoteIPAddress() + ":" 
-                           + charlie.getRemotePort() + " for alice @ " + aliceIP + ":" + from.getPort());
+                _log.debug("Receive from Alice: " + state);
             
             _transport.send(packet);
         } catch (UnknownHostException uhe) {
             if (_log.shouldLog(Log.WARN))
                 _log.warn("Unable to build the aliceIP from " + from, uhe);
+            _context.statManager().addRateData("udp.testBadIP", 1);
         }
     }
     
@@ -648,23 +792,30 @@ class PeerTestManager {
      * The PeerTest message came from one of the Charlies picked for an existing test, so send Alice the
      * packet verifying participation.
      *
+     * testInfo IP/port ignored
+     * @param state non-null
      */
     private void receiveFromCharlieAsBob(RemoteHostId from, PeerTestState state) {
-        state.setReceiveCharlieTime(_context.clock().now());
-        
-        state.incrementPacketsRelayed();
-        if (state.getPacketsRelayed() > MAX_RELAYED_PER_TEST) {
+        long now = _context.clock().now();
+        if (state.getReceiveCharlieTime() > now - (RESEND_TIMEOUT / 2)) {
             if (_log.shouldLog(Log.WARN))
-                _log.warn("Received from charlie (" + from + ") as bob (" + state + "), but we've already relayed too many, so drop it");
+                _log.warn("Too soon, not retransmitting: " + state);
             return;
         }
+
+        if (state.incrementPacketsRelayed() > MAX_RELAYED_PER_TEST_BOB) {
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("Too many, not retransmitting: " + state);
+            return;
+        }
+        state.setReceiveCharlieTime(now);
         
         UDPPacket packet = _packetBuilder.buildPeerTestToAlice(state.getAliceIP(), state.getAlicePort(),
                                                                state.getAliceIntroKey(), state.getCharlieIntroKey(), 
                                                                state.getNonce());
 
         if (_log.shouldLog(Log.DEBUG))
-            _log.debug("Receive from charlie @ " + from + " as bob, sending alice back the ok @ " + state.getAliceIP() + ":" + state.getAlicePort());
+            _log.debug("Receive from Charlie, sending Alice back the OK: " + state);
 
         _transport.send(packet);
     }
@@ -672,32 +823,52 @@ class PeerTestManager {
     /** 
      * We are charlie, so send Alice her PeerTest message  
      *
+     * testInfo IP/port ignored
+     * @param state non-null
      */
-    private void receiveFromAliceAsCharlie(RemoteHostId from, UDPPacketReader.PeerTestReader testInfo, long nonce) {
+    private void receiveFromAliceAsCharlie(RemoteHostId from, UDPPacketReader.PeerTestReader testInfo,
+                                           long nonce, PeerTestState state) {
+        long now = _context.clock().now();
+        if (state.getReceiveAliceTime() > now - (RESEND_TIMEOUT / 2)) {
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("Too soon, not retransmitting: " + state);
+            return;
+        }
+
+        if (state.incrementPacketsRelayed() > MAX_RELAYED_PER_TEST_CHARLIE) {
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("Too many, not retransmitting: " + state);
+            return;
+        }
+        state.setReceiveAliceTime(now);
+
         try {
             InetAddress aliceIP = InetAddress.getByAddress(from.getIP());
             SessionKey aliceIntroKey = new SessionKey(new byte[SessionKey.KEYSIZE_BYTES]);
             testInfo.readIntroKey(aliceIntroKey.getData(), 0);
             UDPPacket packet = _packetBuilder.buildPeerTestToAlice(aliceIP, from.getPort(), aliceIntroKey, _transport.getIntroKey(), nonce);
-            
+
             if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Receive from alice as charlie, w/ alice @ " + aliceIP + ":" + from.getPort() + " and nonce " + nonce);
+                _log.debug("Receive from Alice: " + state);
             
             _transport.send(packet);
         } catch (UnknownHostException uhe) {
             if (_log.shouldLog(Log.WARN))
                 _log.warn("Unable to build the aliceIP from " + from, uhe);
+            _context.statManager().addRateData("udp.testBadIP", 1);
         }
     }
     
     /** 
-     * forget about charlie's nonce after 60s.  
+     * forget about charlie's nonce after a short while.
      */
     private class RemoveTest implements SimpleTimer.TimedEvent {
-        private long _nonce;
+        private final long _nonce;
+
         public RemoveTest(long nonce) {
             _nonce = nonce;
         }
+
         public void timeReached() {
                 _activeTests.remove(Long.valueOf(_nonce));
         }
diff --git a/router/java/src/net/i2p/router/transport/udp/PeerTestState.java b/router/java/src/net/i2p/router/transport/udp/PeerTestState.java
index b5219476c2617340d7accc3dd17bfba0f9e62a8d..e700c77eba885cc31a1f994d55b9e629343790b3 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerTestState.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerTestState.java
@@ -1,15 +1,17 @@
 package net.i2p.router.transport.udp;
 
 import java.net.InetAddress;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import net.i2p.data.SessionKey;
 
 /**
- *
+ *  Track the state of a peer test.
+ *  Used only by PeerTestManager.
  */
 class PeerTestState {
-    private long _testNonce;
-    private short _ourRole;
+    private final long _testNonce;
+    private final Role _ourRole;
     private InetAddress _aliceIP;
     private int _alicePort;
     private InetAddress _bobIP;
@@ -22,22 +24,26 @@ class PeerTestState {
     private SessionKey _charlieIntroKey;
     private SessionKey _bobCipherKey;
     private SessionKey _bobMACKey;
-    private long _beginTime;
+    private final long _beginTime;
     private long _lastSendTime;
     private long _receiveAliceTime;
     private long _receiveBobTime;
     private long _receiveCharlieTime;
-    private int _packetsRelayed;
+    private final AtomicInteger _packetsRelayed = new AtomicInteger();
     
-    public static final short ALICE = 1;
-    public static final short BOB = 2;
-    public static final short CHARLIE = 3;
+    public enum Role {ALICE, BOB, CHARLIE};
     
+    public PeerTestState(Role role, long nonce, long now) {
+        _ourRole = role;
+        _testNonce = nonce;
+        _beginTime = now;
+    }
+
     public long getNonce() { return _testNonce; }
-    public void setNonce(long nonce) { _testNonce = nonce; }
+
     /** Are we Alice, bob, or Charlie. */
-    public short getOurRole() { return _ourRole; }
-    public void setOurRole(short role) { _ourRole = role; }
+    public Role getOurRole() { return _ourRole; }
+
     /**
      * If we are Alice, this will contain the IP that Bob says we
      * can be reached at - the IP Charlie says we can be reached 
@@ -79,47 +85,49 @@ class PeerTestState {
     
     /** when did this test begin? */
     public long getBeginTime() { return _beginTime; }
-    public void setBeginTime(long when) { _beginTime = when; }
+
     /** when did we last send out a packet? */
     public long getLastSendTime() { return _lastSendTime; }
     public void setLastSendTime(long when) { _lastSendTime = when; }
-    /** when did we last hear from alice? */
+
+    /**
+     * when did we last hear from alice?
+     */
     public long getReceiveAliceTime() { return _receiveAliceTime; }
     public void setReceiveAliceTime(long when) { _receiveAliceTime = when; }
+
     /** when did we last hear from bob? */
     public long getReceiveBobTime() { return _receiveBobTime; }
     public void setReceiveBobTime(long when) { _receiveBobTime = when; }
+
     /** when did we last hear from charlie? */
     public long getReceiveCharlieTime() { return _receiveCharlieTime; }
     public void setReceiveCharlieTime(long when) { _receiveCharlieTime = when; }
     
-    public int getPacketsRelayed() { return _packetsRelayed; }
-    public void incrementPacketsRelayed() { ++_packetsRelayed; }
+    /** @return new value */
+    public int incrementPacketsRelayed() { return _packetsRelayed.incrementAndGet(); }
     
     @Override
     public String toString() {
-        StringBuilder buf = new StringBuilder(512);
-        buf.append("Role: ");
-        if (_ourRole == ALICE) buf.append("Alice");
-        else if (_ourRole == BOB) buf.append("Bob");
-        else if (_ourRole == CHARLIE) buf.append("Charlie");
-        else buf.append("unkown!");
+        StringBuilder buf = new StringBuilder(256);
+        buf.append("PeerTest ").append(_testNonce)
+           .append(" as ").append(_ourRole.toString());
         if (_aliceIP != null)
-            buf.append(" alice: ").append(_aliceIP).append(':').append(_alicePort);
+            buf.append("; Alice: ").append(_aliceIP).append(':').append(_alicePort);
         if (_aliceIPFromCharlie != null)
             buf.append(" (fromCharlie ").append(_aliceIPFromCharlie).append(':').append(_alicePortFromCharlie).append(')');
         if (_bobIP != null)
-            buf.append(" bob: ").append(_bobIP).append(':').append(_bobPort);
+            buf.append("; Bob: ").append(_bobIP).append(':').append(_bobPort);
         if (_charlieIP != null)
-            buf.append(" charlie: ").append(_charlieIP).append(':').append(_charliePort);
-        buf.append(" last send after ").append(_lastSendTime - _beginTime).append("ms");
+            buf.append(" Charlie: ").append(_charlieIP).append(':').append(_charliePort);
+        buf.append("; last send after ").append(_lastSendTime - _beginTime);
         if (_receiveAliceTime > 0)
-            buf.append(" receive from alice after ").append(_receiveAliceTime - _beginTime).append("ms");
+            buf.append("; rcvd from Alice after ").append(_receiveAliceTime - _beginTime);
         if (_receiveBobTime > 0)
-            buf.append(" receive from bob after ").append(_receiveBobTime - _beginTime).append("ms");
+            buf.append("; rcvd from Bob after ").append(_receiveBobTime - _beginTime);
         if (_receiveCharlieTime > 0)
-            buf.append(" receive from charlie after ").append(_receiveCharlieTime - _beginTime).append("ms");
-        buf.append(" packets relayed: ").append(_packetsRelayed);
+            buf.append("; rcvd from Charlie after ").append(_receiveCharlieTime - _beginTime);
+        buf.append("; pkts relayed: ").append(_packetsRelayed.get());
         return buf.toString();
     }
 }
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java b/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java
index 7bdf756f40333b5ee3e2a6a300c7a38790593c7a..179649de52f62853023553958355ca97e641db17 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java
@@ -96,6 +96,8 @@ class UDPEndpoint {
     private DatagramSocket getSocket() {
         DatagramSocket socket = null;
         int port = _listenPort;
+        if (port > 0 && port < 1024)
+            _log.logAlways(Log.WARN, "Specified UDP port is " + port + ", ports lower than 1024 not recommended");
 
         for (int i = 0; i < MAX_PORT_RETRIES; i++) {
              if (port <= 0) {
@@ -113,7 +115,7 @@ class UDPEndpoint {
                  break;
              } catch (SocketException se) {
                  if (_log.shouldLog(Log.WARN))
-                     _log.warn("Binding to port " + port + " failed: " + se);
+                     _log.warn("Binding to port " + port + " failed", se);
              }
              port = -1;
         }
@@ -157,6 +159,7 @@ class UDPEndpoint {
      *  @since 0.9.2
      */
     public void clearOutbound() {
-        _sender.clear();
+        if (_sender != null)
+            _sender.clear();
     }
 }
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
index d3408db858b6db643f52c95dafaa3f96c110496c..3874a9d4f873fd878f96bcc115a0aee7f3c5295a 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -32,6 +32,7 @@ import net.i2p.router.CommSystemFacade;
 import net.i2p.router.OutNetMessage;
 import net.i2p.router.Router;
 import net.i2p.router.RouterContext;
+import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
 import net.i2p.router.transport.Transport;
 import net.i2p.router.transport.TransportBid;
 import net.i2p.router.transport.TransportImpl;
@@ -51,6 +52,7 @@ import net.i2p.util.Translate;
 public class UDPTransport extends TransportImpl implements TimedWeightedPriorityMessageQueue.FailedListener {
     private final Log _log;
     private UDPEndpoint _endpoint;
+    private final Object _addDropLock = new Object();
     /** Peer (Hash) to PeerState */
     private final Map<Hash, PeerState> _peersByIdent;
     /** RemoteHostId to PeerState */
@@ -110,6 +112,13 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
      */
     public static final int DEFAULT_INTERNAL_PORT = 8887;
 
+    /**
+     *  To prevent trouble. To be raised to 1024 in 0.9.4.
+     *
+     *  @since 0.9.3
+     */
+    static final int MIN_PEER_PORT = 500;
+
     /** Limits on port told to us by others,
      *  We should have an exception if it matches the existing low port.
      */
@@ -404,7 +413,11 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
      */
     SessionKey getIntroKey() { return _introKey; }
 
-    public int getLocalPort() { return _externalListenPort; }
+    /** @deprecated unused */
+    public int getLocalPort() {
+        return _endpoint != null ? _endpoint.getListenPort() : -1;
+    }
+
     public InetAddress getLocalAddress() { return _externalListenHost; }
     public int getExternalPort() { return _externalListenPort; }
 
@@ -708,7 +721,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private boolean getIsPortFixed() {
         String prop = _context.getProperty(PROP_FIXED_PORT);
         if (prop != null)
-            return Boolean.valueOf(prop).booleanValue();
+            return Boolean.parseBoolean(prop);
         int status = getReachabilityStatus();
         return status != CommSystemFacade.STATUS_REJECT_UNSOLICITED;
     }
@@ -720,6 +733,23 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     PeerState getPeerState(RemoteHostId hostInfo) {
             return _peersByRemoteHost.get(hostInfo);
     }
+
+    /** 
+     *  Get the states for all peers at the given remote host, ignoring port.
+     *  Used for a last-chance search for a peer that changed port, by PacketHandler.
+     *  @since 0.9.3
+     */
+    List<PeerState> getPeerStatesByIP(RemoteHostId hostInfo) {
+        List<PeerState> rv = new ArrayList(4);
+        byte[] ip = hostInfo.getIP();
+        if (ip != null) {
+            for (PeerState ps : _peersByIdent.values()) {
+                if (DataHelper.eq(ip, ps.getRemoteIP()))
+                    rv.add(ps);
+            }
+        }
+        return rv;
+    }
     
     /** 
      * get the state for the peer with the given ident, or null 
@@ -729,6 +759,24 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             return _peersByIdent.get(remotePeer);
     }
     
+    /** 
+     *  Remove and add to peersByRemoteHost map
+     *  @since 0.9.3
+     */
+    public void changePeerPort(PeerState peer, int newPort) {
+        int oldPort;
+        synchronized (_addDropLock) {
+            oldPort = peer.getRemotePort();
+            if (oldPort != newPort) {
+                _peersByRemoteHost.remove(peer.getRemoteHostId());
+                peer.changePort(newPort);
+                _peersByRemoteHost.put(peer.getRemoteHostId(), peer);
+            }
+        }
+        if (_log.shouldLog(Log.WARN) && oldPort != newPort)
+            _log.warn("Changed port from " + oldPort + " to " + newPort + " for " + peer);
+    }
+
     /**
      *  For IntroductionManager
      *  @return may be null if not started
@@ -799,47 +847,69 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     boolean addRemotePeerState(PeerState peer) {
         if (_log.shouldLog(Log.INFO))
             _log.info("Add remote peer state: " + peer);
+        synchronized(_addDropLock) {
+            return locked_addRemotePeerState(peer);
+        }
+    }
+
+    private boolean locked_addRemotePeerState(PeerState peer) {
         Hash remotePeer = peer.getRemotePeer();
         long oldEstablishedOn = -1;
         PeerState oldPeer = null;
         if (remotePeer != null) {
-                oldPeer = _peersByIdent.put(remotePeer, peer);
-                if ( (oldPeer != null) && (oldPeer != peer) ) {
-                    // transfer over the old state/inbound message fragments/etc
-                    peer.loadFrom(oldPeer);
-                    oldEstablishedOn = oldPeer.getKeyEstablishedTime();
-                }
+            oldPeer = _peersByIdent.put(remotePeer, peer);
+            if ( (oldPeer != null) && (oldPeer != peer) ) {
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn("Peer already connected (PBID): old=" + oldPeer + " new=" + peer);
+                // transfer over the old state/inbound message fragments/etc
+                peer.loadFrom(oldPeer);
+                oldEstablishedOn = oldPeer.getKeyEstablishedTime();
+            }
         }
         
+        RemoteHostId remoteId = peer.getRemoteHostId();
         if (oldPeer != null) {
             oldPeer.dropOutbound();
             _introManager.remove(oldPeer);
             _expireEvent.remove(oldPeer);
+            RemoteHostId oldID = oldPeer.getRemoteHostId();
+            if (!remoteId.equals(oldID)) {
+                // leak fix, remove old address
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn(remotePeer + " changed address FROM " + oldID + " TO " + remoteId);
+                PeerState oldPeer2 = _peersByRemoteHost.remove(oldID);
+                // different ones in the two maps? shouldn't happen
+                if (oldPeer2 != oldPeer) {
+                    oldPeer2.dropOutbound();
+                     _introManager.remove(oldPeer2);
+                    _expireEvent.remove(oldPeer2);
+                }
+            }
         }
-        oldPeer = null;
-        
-        RemoteHostId remoteId = peer.getRemoteHostId();
-        if (remoteId == null) return false;
+
         // Should always be direct... except maybe for hidden mode?
         // or do we always know the IP by now?
         if (remoteId.getIP() == null && _log.shouldLog(Log.WARN))
             _log.warn("Add indirect: " + peer);
 
-        oldPeer = _peersByRemoteHost.put(remoteId, peer);
-        if ( (oldPeer != null) && (oldPeer != peer) ) {
+        // don't do this twice
+        PeerState oldPeer2 = _peersByRemoteHost.put(remoteId, peer);
+        if (oldPeer2 != null && oldPeer2 != peer && oldPeer2 != oldPeer) {
+            // this shouldn't happen, should have been removed above
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("Peer already connected (PBRH): old=" + oldPeer2 + " new=" + peer);
             // transfer over the old state/inbound message fragments/etc
-            peer.loadFrom(oldPeer);
-            oldEstablishedOn = oldPeer.getKeyEstablishedTime();
-        }
-        
-        if (oldPeer != null) {
-            oldPeer.dropOutbound();
-            _introManager.remove(oldPeer);
-            _expireEvent.remove(oldPeer);
+            peer.loadFrom(oldPeer2);
+            oldEstablishedOn = oldPeer2.getKeyEstablishedTime();
+            oldPeer2.dropOutbound();
+            _introManager.remove(oldPeer2);
+            _expireEvent.remove(oldPeer2);
         }
-        
-        if ( (oldPeer != null) && (_log.shouldLog(Log.WARN)) )
-            _log.warn("Peer already connected: old=" + oldPeer + " new=" + peer, new Exception("dup"));
+
+        if (_log.shouldLog(Log.WARN) && _peersByIdent.size() != _peersByRemoteHost.size())
+            _log.warn("Size Mismatch after add: " + peer
+                       + " byIDsz = " + _peersByIdent.size()
+                       + " byHostsz = " + _peersByRemoteHost.size());
         
         _activeThrottle.unchoke(peer.getRemotePeer());
         markReachable(peer.getRemotePeer(), peer.isInbound());
@@ -996,15 +1066,20 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
              */
             _log.info(buf.toString(), new Exception("Dropped by"));
         }
-        
+        synchronized(_addDropLock) {
+            locked_dropPeer(peer, shouldShitlist, why);
+        }
+        if (needsRebuild())
+            rebuildExternalAddress();
+    }
+
+    private void locked_dropPeer(PeerState peer, boolean shouldShitlist, String why) {
         peer.dropOutbound();
         peer.expireInboundMessages();
         _introManager.remove(peer);
         _fragments.dropPeer(peer);
         
         PeerState altByIdent = null;
-        PeerState altByHost = null;
-        
         if (peer.getRemotePeer() != null) {
             dropPeerCapacities(peer);
             
@@ -1018,9 +1093,14 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         }
         
         RemoteHostId remoteId = peer.getRemoteHostId();
-        if (remoteId != null) {
-                altByHost = _peersByRemoteHost.remove(remoteId);
-        }
+        PeerState altByHost = _peersByRemoteHost.remove(remoteId);
+
+        if (altByIdent != altByHost && _log.shouldLog(Log.WARN)) 
+            _log.warn("Mismatch on remove, RHID = " + remoteId
+                      + " byID = " + altByIdent
+                      + " byHost = " + altByHost
+                      + " byIDsz = " + _peersByIdent.size()
+                      + " byHostsz = " + _peersByRemoteHost.size());
         
         // unchoke 'em, but just because we'll never talk again...
         _activeThrottle.unchoke(peer.getRemotePeer());
@@ -1029,12 +1109,9 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         //    _flooder.removePeer(peer);
         _expireEvent.remove(peer);
         
-        if (needsRebuild())
-            rebuildExternalAddress();
-        
         // deal with races to make sure we drop the peers fully
-        if ( (altByIdent != null) && (peer != altByIdent) ) dropPeer(altByIdent, shouldShitlist, "recurse");
-        if ( (altByHost != null) && (peer != altByHost) ) dropPeer(altByHost, shouldShitlist, "recurse");
+        if ( (altByIdent != null) && (peer != altByIdent) ) locked_dropPeer(altByIdent, shouldShitlist, "recurse");
+        if ( (altByHost != null) && (peer != altByHost) ) locked_dropPeer(altByHost, shouldShitlist, "recurse");
     }
     
     private boolean needsRebuild() {
@@ -1145,20 +1222,33 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     }
 
     /**
-     *  Send a session destroy message to everybody
-     *  BLOCKING if OB queue is full.
+     *  Send a session destroy message to everybody.
+     *  BLOCKING for at least 1 sec per 1K peers, more if BW is very low or if OB queue is full.
      *
      *  @since 0.8.9
      */
     private void destroyAll() {
         _endpoint.clearOutbound();
         int howMany = _peersByIdent.size();
+        // use no more than 1/4 of configured bandwidth
+        final int burst = 8;
+        int pps = Math.max(48, (_context.bandwidthLimiter().getOutboundKBytesPerSecond() * 1000 / 4) /  48);
+        int burstps = pps / burst;
+        // max of 1000 pps
+        int toSleep = Math.max(8, (1000 / burstps));
+        int count = 0;
         if (_log.shouldLog(Log.WARN))
             _log.warn("Sending destroy to : " + howMany + " peers");
         for (PeerState peer : _peersByIdent.values()) {
             sendDestroy(peer);
+            // 1000 per second * 48 bytes = 400 KBps
+            if ((++count) % burst == 0) { 
+                try {
+                    Thread.sleep(toSleep);
+                } catch (InterruptedException ie) {}
+            }
         }
-        int toSleep = Math.min(howMany / 3, 750);
+        toSleep = Math.min(howMany / 3, 750);
         if (toSleep > 0) {
             try {
                 Thread.sleep(toSleep);
@@ -1205,7 +1295,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             if (addr.getOption("ihost0") == null) {
                 byte[] ip = addr.getIP();
                 int port = addr.getPort();
-                if (ip == null || port <= 0 ||
+                if (ip == null || port < MIN_PEER_PORT ||
                     (!isValid(ip)) ||
                     Arrays.equals(ip, getExternalIP())) {
                     markUnreachable(to);
@@ -1503,7 +1593,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
          *  it's usually false positives.
          ******************
         String forceIntroducers = _context.getProperty(PROP_FORCE_INTRODUCERS);
-        if ( (forceIntroducers != null) && (Boolean.valueOf(forceIntroducers).booleanValue()) ) {
+        if ( (forceIntroducers != null) && (Boolean.parseBoolean(forceIntroducers)) ) {
             if (_log.shouldLog(Log.INFO))
                 _log.info("Force introducers specified");
             return true;
@@ -1526,6 +1616,24 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         }
     }
     
+    /**
+     *  For EstablishmentManager
+     *  @since 0.9.3
+     */
+    boolean canIntroduce() {
+        // we don't expect inbound connections when hidden, but it could happen
+        // Don't offer if we are approaching max connections. While Relay Intros do not
+        // count as connections, we have to keep the connection to this peer up longer if
+        // we are offering introductions.
+        return
+            (!_context.router().isHidden()) &&
+            (!introducersRequired()) &&
+            haveCapacity() &&
+            (!((FloodfillNetworkDatabaseFacade)_context.netDb()).floodfillEnabled()) &&
+            _introManager.introducedCount() < IntroductionManager.MAX_OUTBOUND &&
+            _introManager.introducedCount() < getMaxConnections() / 4;
+    }
+
     /** default true */
     private boolean allowDirectUDP() {
         return _context.getBooleanPropertyDefaultTrue(PROP_ALLOW_DIRECT);
@@ -1688,7 +1796,6 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     }
 
     public boolean allowConnection() {
-
             return _peersByIdent.size() < getMaxConnections();
     }
 
@@ -1698,20 +1805,17 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
      */
     @Override
     public Vector<Long> getClockSkews() {
-
         Vector<Long> skews = new Vector();
-        Vector<PeerState> peers = new Vector();
-
-        peers.addAll(_peersByIdent.values());
 
         // If our clock is way off, we may not have many (or any) successful connections,
         // so try hard in that case to return good data
-        boolean includeEverybody = _context.router().getUptime() < 10*60*1000 || peers.size() < 10;
+        boolean includeEverybody = _context.router().getUptime() < 10*60*1000 || _peersByIdent.size() < 10;
         long now = _context.clock().now();
-        for (Iterator<PeerState> iter = peers.iterator(); iter.hasNext(); ) {
-            PeerState peer = iter.next();
-            if ((!includeEverybody) && now - peer.getLastReceiveTime() > 15*60*1000)
+        for (PeerState peer : _peersByIdent.values()) {
+            if ((!includeEverybody) && now - peer.getLastReceiveTime() > 5*60*1000)
                 continue; // skip old peers
+            if (peer.getRTT() > PeerState.INIT_RTT - 250)
+                continue; // Big RTT makes for a poor calculation
             skews.addElement(Long.valueOf(peer.getClockSkew() / 1000));
         }
         if (_log.shouldLog(Log.DEBUG))
@@ -1744,7 +1848,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static final int FLAG_CWND= 6;
     private static final int FLAG_SSTHRESH = 7;
     private static final int FLAG_RTT = 8;
-    private static final int FLAG_DEV = 9;
+    //private static final int FLAG_DEV = 9;
     private static final int FLAG_RTO = 10;
     private static final int FLAG_MTU = 11;
     private static final int FLAG_SEND = 12;
@@ -1784,9 +1888,9 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             case FLAG_RTT:
                 rv = RTTComparator.instance();
                 break;
-            case FLAG_DEV:
-                rv = DevComparator.instance();
-                break;
+            //case FLAG_DEV:
+            //    rv = DevComparator.instance();
+            //    break;
             case FLAG_RTO:
                 rv = RTOComparator.instance();
                 break;
@@ -1927,6 +2031,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
                 return rv;
         }
     }
+
+ /***
     private static class DevComparator extends PeerComparator {
         private static final DevComparator _instance = new DevComparator();
         public static final DevComparator instance() { return _instance; }
@@ -1939,6 +2045,9 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
                 return (int)rv;
         }
     }
+  ****/
+
+    /** */
     private static class RTOComparator extends PeerComparator {
         private static final RTOComparator _instance = new RTOComparator();
         public static final RTOComparator instance() { return _instance; }
@@ -2088,8 +2197,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         buf.append("</th>\n");
         buf.append("<th class=\"smallhead\" nowrap><a href=\"#def.rtt\">RTT</a><br>");
         appendSortLinks(buf, urlBase, sortFlags, _("Sort by round trip time"), FLAG_RTT);
-        buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.dev\">").append(_("Dev")).append("</a><br>");
-        appendSortLinks(buf, urlBase, sortFlags, _("Sort by round trip time deviation"), FLAG_DEV);
+        //buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.dev\">").append(_("Dev")).append("</a><br>");
+        //appendSortLinks(buf, urlBase, sortFlags, _("Sort by round trip time deviation"), FLAG_DEV);
         buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.rto\">RTO</a><br>");
         appendSortLinks(buf, urlBase, sortFlags, _("Sort by retransmission timeout"), FLAG_RTO);
         buf.append("</th>\n");
@@ -2212,9 +2321,9 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             buf.append(DataHelper.formatDuration2(rtt));
             buf.append("</td>");
             
-            buf.append("<td class=\"cells\" align=\"right\">");
-            buf.append(DataHelper.formatDuration2(peer.getRTTDeviation()));
-            buf.append("</td>");
+            //buf.append("<td class=\"cells\" align=\"right\">");
+            //buf.append(DataHelper.formatDuration2(peer.getRTTDeviation()));
+            //buf.append("</td>");
 
             buf.append("<td class=\"cells\" align=\"right\">");
             buf.append(DataHelper.formatDuration2(rto));
@@ -2291,7 +2400,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         buf.append("</b></td><td>&nbsp;</td>\n" +
                    "<td align=\"center\"><b>");
         buf.append(numPeers > 0 ? DataHelper.formatDuration2(rttTotal/numPeers) : '0');
-        buf.append("</b></td><td>&nbsp;</td><td align=\"center\"><b>");
+        //buf.append("</b></td><td>&nbsp;</td><td align=\"center\"><b>");
+        buf.append("</b></td><td align=\"center\"><b>");
         buf.append(numPeers > 0 ? DataHelper.formatDuration2(rtoTotal/numPeers) : '0');
         buf.append("</b></td><td align=\"center\"><b>").append(_mtu).append("</b></td><td align=\"center\"><b>");
         buf.append(sendTotal).append("</b></td><td align=\"center\"><b>").append(recvTotal).append("</b></td>\n" +
@@ -2365,9 +2475,18 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     }
     
     private class ExpirePeerEvent extends SimpleTimer2.TimedEvent {
+        // TODO why have separate Set, just use _peersByIdent.values()
         private final Set<PeerState> _expirePeers;
         private final List<PeerState> _expireBuffer;
         private volatile boolean _alive;
+        private int _runCount;
+        // we've seen firewalls change ports after 40 seconds
+        private static final long PING_FIREWALL_TIME = 30*1000;
+        private static final long PING_FIREWALL_CUTOFF = PING_FIREWALL_TIME / 2;
+        // ping 1/4 of the peers every loop
+        private static final int SLICES = 4;
+        private static final long SHORT_LOOP_TIME = PING_FIREWALL_CUTOFF / (SLICES + 1);
+        private static final long LONG_LOOP_TIME = 25*1000;
 
         public ExpirePeerEvent() {
             super(_context.simpleTimer2());
@@ -2381,10 +2500,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
                 _expireTimeout = Math.min(_expireTimeout + 15*1000, EXPIRE_TIMEOUT);
             else
                 _expireTimeout = Math.max(_expireTimeout - 45*1000, MIN_EXPIRE_TIMEOUT);
-            long shortInactivityCutoff = _context.clock().now() - _expireTimeout;
-            long longInactivityCutoff = _context.clock().now() - EXPIRE_TIMEOUT;
-            long pingCutoff = _context.clock().now() - (2 * 60*60*1000);
+            long now = _context.clock().now();
+            long shortInactivityCutoff = now - _expireTimeout;
+            long longInactivityCutoff = now - EXPIRE_TIMEOUT;
+            long pingCutoff = now - (2 * 60*60*1000);
+            long pingFirewallCutoff = now - PING_FIREWALL_CUTOFF;
+            boolean shouldPingFirewall = _reachabilityStatus != CommSystemFacade.STATUS_OK;
+            boolean pingOneOnly = shouldPingFirewall && _externalListenPort == _endpoint.getListenPort();
+            boolean shortLoop = shouldPingFirewall;
             _expireBuffer.clear();
+            _runCount++;
 
                 for (Iterator<PeerState> iter = _expirePeers.iterator(); iter.hasNext(); ) {
                     PeerState peer = iter.next();
@@ -2397,7 +2522,25 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
                     if ( (peer.getLastReceiveTime() < inactivityCutoff) && (peer.getLastSendTime() < inactivityCutoff) ) {
                         _expireBuffer.add(peer);
                         iter.remove();
-                    }
+                    } else if (shouldPingFirewall &&
+                               ((_runCount ^ peer.hashCode()) & (SLICES - 1)) == 0 &&
+                               peer.getLastSendOrPingTime() < pingFirewallCutoff &&
+                               peer.getLastReceiveTime() < pingFirewallCutoff) {
+                        // ping if firewall is mapping the port to keep port the same...
+                        // if the port changes we are screwed
+                        if (_log.shouldLog(Log.DEBUG))
+                            _log.debug("Pinging for firewall: " + peer);
+                        // don't update or idle time won't be right and peer won't get dropped
+                        // TODO if both sides are firewalled should only one ping
+                        // or else session will stay open forever?
+                        //peer.setLastSendTime(now);
+                        send(_destroyBuilder.buildPing(peer));
+                        peer.setLastPingTime(now);
+                        // If external port is different, it may be changing the port for every
+                        // session, so ping all of them. Otherwise only one.
+                        if (pingOneOnly)
+                            shouldPingFirewall = false;
+		    }
                 }
 
             for (PeerState peer : _expireBuffer) {
@@ -2407,18 +2550,21 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             _expireBuffer.clear();
 
             if (_alive)
-                schedule(30*1000);
+                schedule(shortLoop ? SHORT_LOOP_TIME : LONG_LOOP_TIME);
         }
+
         public void add(PeerState peer) {
                 _expirePeers.add(peer);
         }
+
         public void remove(PeerState peer) {
                 _expirePeers.remove(peer);
         }
+
         public void setIsAlive(boolean isAlive) {
             _alive = isAlive;
             if (isAlive) {
-                reschedule(30*1000);
+                reschedule(LONG_LOOP_TIME);
             } else {
                 cancel();
                 _expirePeers.clear();
@@ -2507,8 +2653,14 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             if (peerInfo == null)
                 continue;
             RouterAddress addr = peerInfo.getTargetAddress(STYLE);
-            if (addr != null)
-                return peer;
+            if (addr == null)
+                continue;
+            byte[] ip = addr.getIP();
+            if (ip == null)
+                continue;
+            if (DataHelper.eq(ip, 0, getExternalIP(), 0, 2))
+                continue;
+            return peer;
         }
         return null;
     }
diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
index 34eaee9efab37ed4355633f3b94ea9f56e6afb26..6303b385c4efde96761776569dea8eb7fad55fae 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
@@ -392,6 +392,7 @@ class BuildExecutor implements Runnable {
                 pools.clear();
             } catch (RuntimeException e) {
                     _log.log(Log.CRIT, "B0rked in the tunnel builder", e);
+                    try { Thread.sleep(LOOP_TIME); } catch (InterruptedException ie) {}
             }
         }
         
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
index 7679ed955cdc13a3b675a3f57a62b4f8bdb59671..a1c6f2ab7d21a43e7771f3c4f62d2159c532d96b 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
@@ -460,7 +460,7 @@ public abstract class TunnelPeerSelector {
             else 
                 val = ctx.getProperty(PROP_OUTBOUND_CLIENT_EXCLUDE_UNREACHABLE, DEFAULT_OUTBOUND_CLIENT_EXCLUDE_UNREACHABLE);
         
-        boolean rv = (val != null ? Boolean.valueOf(val).booleanValue() : def);
+        boolean rv = (val != null ? Boolean.parseBoolean(val) : def);
         //System.err.println("Filter unreachable? " + rv + " (inbound? " + isInbound + ", exploratory? " + isExploratory);
         return rv;
     }
@@ -490,7 +490,7 @@ public abstract class TunnelPeerSelector {
             else 
                 val = ctx.getProperty(PROP_OUTBOUND_CLIENT_EXCLUDE_SLOW);
         
-        boolean rv = (val != null ? Boolean.valueOf(val).booleanValue() : def);
+        boolean rv = (val != null ? Boolean.parseBoolean(val) : def);
         //System.err.println("Filter unreachable? " + rv + " (inbound? " + isInbound + ", exploratory? " + isExploratory);
         return rv;
     }
@@ -519,7 +519,7 @@ public abstract class TunnelPeerSelector {
             else 
                 val = ctx.getProperty(PROP_OUTBOUND_CLIENT_EXCLUDE_UPTIME);
         
-        boolean rv = (val != null ? Boolean.valueOf(val).booleanValue() : def);
+        boolean rv = (val != null ? Boolean.parseBoolean(val) : def);
         //System.err.println("Filter unreachable? " + rv + " (inbound? " + isInbound + ", exploratory? " + isExploratory);
         return rv;
     }
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 1668ecb05bc8abe7e546fc562b25375ded01bebd..8304a1c7098d7d8ae69187c6876e9e2a31926413 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
@@ -75,7 +75,7 @@ public class TunnelPool {
      *  Destination (i.e. for servers or clients w/ persistent key,
      *  or restarting close-on-idle clients)
      */
-    void startup() {
+    synchronized void startup() {
         synchronized (_inProgress) {
             _inProgress.clear();
         }
@@ -102,7 +102,7 @@ public class TunnelPool {
                                new long[] { 5*60*1000l });
     }
     
-    void shutdown() {
+    synchronized void shutdown() {
         if (_log.shouldLog(Log.WARN))
             _log.warn(toString() + ": Shutdown called");
         _alive = false;
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
index bda1fe727fd3a075aa36580136492185d85adffd..1b6c424eca69dfa9b61a9c8fa7c6e5b736013c99 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
@@ -37,8 +37,8 @@ public class TunnelPoolManager implements TunnelManagerFacade {
     private final Map<Hash, TunnelPool> _clientInboundPools;
     /** Hash (destination) to TunnelPool */
     private final Map<Hash, TunnelPool> _clientOutboundPools;
-    private TunnelPool _inboundExploratory;
-    private TunnelPool _outboundExploratory;
+    private final TunnelPool _inboundExploratory;
+    private final TunnelPool _outboundExploratory;
     private final BuildExecutor _executor;
     private final BuildHandler _handler;
     private final TunnelPeerSelector _clientPeerSelector;
@@ -62,10 +62,15 @@ public class TunnelPoolManager implements TunnelManagerFacade {
         _clientInboundPools = new ConcurrentHashMap(4);
         _clientOutboundPools = new ConcurrentHashMap(4);
         _clientPeerSelector = new ClientPeerSelector(ctx);
+
+        ExploratoryPeerSelector selector = new ExploratoryPeerSelector(_context);
+        TunnelPoolSettings inboundSettings = new TunnelPoolSettings(true, true);
+        _inboundExploratory = new TunnelPool(_context, this, inboundSettings, selector);
+        TunnelPoolSettings outboundSettings = new TunnelPoolSettings(true, false);
+        _outboundExploratory = new TunnelPool(_context, this, outboundSettings, selector);
         
+        // threads will be started in startup()
         _executor = new BuildExecutor(ctx, this);
-        I2PThread execThread = new I2PThread(_executor, "BuildExecutor", true);
-        execThread.start();
         _handler = new BuildHandler(ctx, this, _executor);
         int numHandlerThreads;
         int share = TunnelDispatcher.getShareBandwidth(ctx);
@@ -76,10 +81,6 @@ public class TunnelPoolManager implements TunnelManagerFacade {
         else
             numHandlerThreads = 1;
         _numHandlerThreads = ctx.getProperty("router.buildHandlerThreads", numHandlerThreads);
-        for (int i = 1; i <= _numHandlerThreads; i++) {
-            I2PThread hThread = new I2PThread(_handler, "BuildHandler " + i + '/' + numHandlerThreads, true);
-            hThread.start();
-        }
         
         // The following are for TestJob
         ctx.statManager().createRequiredRateStat("tunnel.testFailedTime", "Time for tunnel test failure (ms)", "Tunnels", 
@@ -104,9 +105,7 @@ public class TunnelPoolManager implements TunnelManagerFacade {
      * @return null if none
      */
     public TunnelInfo selectInboundTunnel() { 
-        TunnelPool pool = _inboundExploratory;
-        if (pool == null) return null;
-        TunnelInfo info = pool.selectTunnel(); 
+        TunnelInfo info = _inboundExploratory.selectTunnel(); 
         if (info == null) {
             _inboundExploratory.buildFallback();
             // still can be null, but probably not
@@ -139,13 +138,11 @@ public class TunnelPoolManager implements TunnelManagerFacade {
      * @return null if none
      */
     public TunnelInfo selectOutboundTunnel() { 
-        TunnelPool pool = _outboundExploratory;
-        if (pool == null) return null;
-        TunnelInfo info = pool.selectTunnel();
+        TunnelInfo info = _outboundExploratory.selectTunnel();
         if (info == null) {
-            pool.buildFallback();
+            _outboundExploratory.buildFallback();
             // still can be null, but probably not
-            info = pool.selectTunnel();
+            info = _outboundExploratory.selectTunnel();
         }
         return info;
     }
@@ -176,9 +173,7 @@ public class TunnelPoolManager implements TunnelManagerFacade {
      * @since 0.8.10
      */
     public TunnelInfo selectInboundExploratoryTunnel(Hash closestTo) { 
-        TunnelPool pool = _inboundExploratory;
-        if (pool == null) return null;
-        TunnelInfo info = pool.selectTunnel(); 
+        TunnelInfo info = _inboundExploratory.selectTunnel(); 
         if (info == null) {
             _inboundExploratory.buildFallback();
             // still can be null, but probably not
@@ -222,13 +217,11 @@ public class TunnelPoolManager implements TunnelManagerFacade {
      * @since 0.8.10
      */
     public TunnelInfo selectOutboundExploratoryTunnel(Hash closestTo) { 
-        TunnelPool pool = _outboundExploratory;
-        if (pool == null) return null;
-        TunnelInfo info = pool.selectTunnel();
+        TunnelInfo info = _outboundExploratory.selectTunnel();
         if (info == null) {
-            pool.buildFallback();
+            _outboundExploratory.buildFallback();
             // still can be null, but probably not
-            info = pool.selectTunnel(closestTo);
+            info = _outboundExploratory.selectTunnel(closestTo);
         }
         return info;
     }
@@ -261,14 +254,10 @@ public class TunnelPoolManager implements TunnelManagerFacade {
                 if (info != null)
                     return info;
         }
-        if (_inboundExploratory != null) {
-            info = _inboundExploratory.getTunnel(id);
-            if (info != null) return info;
-        }
-        if (_outboundExploratory != null) {
-            info = _outboundExploratory.getTunnel(id);
-            if (info != null) return info;
-        }
+        info = _inboundExploratory.getTunnel(id);
+        if (info != null) return info;
+        info = _outboundExploratory.getTunnel(id);
+        if (info != null) return info;
         return null;
     }
     
@@ -282,9 +271,6 @@ public class TunnelPoolManager implements TunnelManagerFacade {
 
     /** @return number of outbound exploratory tunnels */
     public int getOutboundTunnelCount() { 
-        if (_outboundExploratory == null)
-            return 0;
-        else
             return _outboundExploratory.size(); 
     }
 
@@ -507,22 +493,15 @@ public class TunnelPoolManager implements TunnelManagerFacade {
     public synchronized void startup() { 
         _isShutdown = false;
         if (!_executor.isRunning()) {
-            I2PThread t = new I2PThread(_executor, "BuildExecutor");
-            t.setDaemon(true);
+            I2PThread t = new I2PThread(_executor, "BuildExecutor", true);
             t.start();
+            for (int i = 1; i <= _numHandlerThreads; i++) {
+                I2PThread hThread = new I2PThread(_handler, "BuildHandler " + i + '/' + _numHandlerThreads, true);
+                hThread.start();
+            }
         }
-        ExploratoryPeerSelector selector = new ExploratoryPeerSelector(_context);
         
-        TunnelPoolSettings inboundSettings = new TunnelPoolSettings();
-        inboundSettings.setIsExploratory(true);
-        inboundSettings.setIsInbound(true);
-        _inboundExploratory = new TunnelPool(_context, this, inboundSettings, selector);
         _inboundExploratory.startup();
-        
-        TunnelPoolSettings outboundSettings = new TunnelPoolSettings();
-        outboundSettings.setIsExploratory(true);
-        outboundSettings.setIsInbound(false);
-        _outboundExploratory = new TunnelPool(_context, this, outboundSettings, selector);
         _context.simpleScheduler().addEvent(new DelayedStartup(_outboundExploratory), 3*1000);
         
         // try to build up longer tunnels
@@ -554,9 +533,7 @@ public class TunnelPoolManager implements TunnelManagerFacade {
     }
 
     private void shutdownExploratory() {
-        if (_inboundExploratory != null)
             _inboundExploratory.shutdown();
-        if (_outboundExploratory != null)
             _outboundExploratory.shutdown();
     }
     
@@ -564,10 +541,8 @@ public class TunnelPoolManager implements TunnelManagerFacade {
     public void listPools(List<TunnelPool> out) {
         out.addAll(_clientInboundPools.values());
         out.addAll(_clientOutboundPools.values());
-        if (_inboundExploratory != null)
-            out.add(_inboundExploratory);
-        if (_outboundExploratory != null)
-            out.add(_outboundExploratory);
+        out.add(_inboundExploratory);
+        out.add(_outboundExploratory);
     }
     void tunnelFailed() { _executor.repoll(); }
     BuildExecutor getExecutor() { return _executor; }
@@ -639,12 +614,18 @@ public class TunnelPoolManager implements TunnelManagerFacade {
             return new HashMap(_clientOutboundPools);
     }
 
-    /** for TunnelRenderer in router console */
+    /**
+     *  For TunnelRenderer in router console
+     *  @return non-null
+     */
     public TunnelPool getInboundExploratoryPool() {
         return _inboundExploratory;
     }
 
-    /** for TunnelRenderer in router console */
+    /**
+     *  For TunnelRenderer in router console
+     *  @return non-null
+     */
     public TunnelPool getOutboundExploratoryPool() {
         return _outboundExploratory;
     }
@@ -658,13 +639,11 @@ public class TunnelPoolManager implements TunnelManagerFacade {
      *  @since 0.8.13
      */
     public void fail(Hash peer) {
-        if (_outboundExploratory != null)
-            failTunnelsWithFirstHop(_outboundExploratory, peer);
+        failTunnelsWithFirstHop(_outboundExploratory, peer);
         for (TunnelPool pool : _clientOutboundPools.values()) {
             failTunnelsWithFirstHop(pool, peer);
         }
-        if (_inboundExploratory != null)
-            failTunnelsWithLastHop(_inboundExploratory, peer);
+        failTunnelsWithLastHop(_inboundExploratory, peer);
         for (TunnelPool pool : _clientInboundPools.values()) {
             failTunnelsWithLastHop(pool, peer);
         }
diff --git a/router/java/src/net/i2p/router/util/EventLog.java b/router/java/src/net/i2p/router/util/EventLog.java
index 9a2d9d20e114cfe080d320561f078929613f2114..70eb9ea3db1333532490c36372e4164ccf1f766b 100644
--- a/router/java/src/net/i2p/router/util/EventLog.java
+++ b/router/java/src/net/i2p/router/util/EventLog.java
@@ -37,9 +37,11 @@ public class EventLog {
     public static final String CHANGE_PORT = "changePort";
     public static final String CLOCK_SHIFT = "clockShift";
     public static final String CRASHED = "crashed";
+    public static final String CRITICAL = "critical";
     public static final String INSTALLED = "installed";
     public static final String INSTALL_FAILED = "intallFailed";
     public static final String NEW_IDENT = "newIdent";
+    public static final String OOM = "oom";
     public static final String REKEYED = "rekeyed";
     public static final String SOFT_RESTART = "softRestart";
     public static final String STARTED = "started";
@@ -48,12 +50,11 @@ public class EventLog {
     public static final String WATCHDOG = "watchdog";
 
     /**
-     *  @param file must be absolute
-     *  @throws IllegalArgumentException if not absolute
+     *  @param file should be absolute
      */
     public EventLog(I2PAppContext ctx, File file) {
-        if (!file.isAbsolute())
-            throw new IllegalArgumentException();
+        //if (!file.isAbsolute())
+        //    throw new IllegalArgumentException();
         _context = ctx;
         _file = file;
         _cache = new HashMap(4);
@@ -128,7 +129,7 @@ public class EventLog {
                         continue;
                     Long ltime = Long.valueOf(time);
                     String info = s.length > 2 ? s[2] : "";
-                    rv.put(time, info);
+                    rv.put(ltime, info);
                 } catch (IndexOutOfBoundsException ioobe) {
                 } catch (NumberFormatException nfe) {
                 }
diff --git a/router/java/src/net/i2p/router/util/RFC822Date.java b/router/java/src/net/i2p/router/util/RFC822Date.java
index 6635bca8cfa3cc02e0500c8e6447ec7502d5189f..2ae4d45696355d73bfc980188421d2adea1ce120 100644
--- a/router/java/src/net/i2p/router/util/RFC822Date.java
+++ b/router/java/src/net/i2p/router/util/RFC822Date.java
@@ -11,20 +11,24 @@ import java.util.Locale;
  */
 public abstract class RFC822Date {
 
+    // SimpleDateFormat is not thread-safe, methods must be synchronized
+
+    private static final SimpleDateFormat OUTPUT_FORMAT = new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US);
+
     /**
      * http://jimyjoshi.com/blog/2007/08/rfc822dateparsinginjava.html
      * Apparently public domain
      * Probably don't need all of these...
      */
     private static final SimpleDateFormat rfc822DateFormats[] = new SimpleDateFormat[] {
+                 OUTPUT_FORMAT,
                  new SimpleDateFormat("EEE, d MMM yy HH:mm:ss z", Locale.US),
                  new SimpleDateFormat("EEE, d MMM yy HH:mm z", Locale.US),
                  new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US),
                  new SimpleDateFormat("EEE, d MMM yyyy HH:mm z", Locale.US),
                  new SimpleDateFormat("d MMM yy HH:mm z", Locale.US),
                  new SimpleDateFormat("d MMM yy HH:mm:ss z", Locale.US),
-                 new SimpleDateFormat("d MMM yyyy HH:mm z", Locale.US),
-                 new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US)
+                 new SimpleDateFormat("d MMM yyyy HH:mm z", Locale.US)
     };
 
     /**
@@ -33,7 +37,7 @@ public abstract class RFC822Date {
      * @param s non-null
      * @return -1 on failure
      */
-    public static long parse822Date(String s) {
+    public synchronized static long parse822Date(String s) {
         for (int i = 0; i < rfc822DateFormats.length; i++) {
             try {
                 Date date = rfc822DateFormats[i].parse(s);
@@ -44,8 +48,12 @@ public abstract class RFC822Date {
         return -1;
     }
 
-    /** @since 0.8.2 */
-    public static String to822Date(long t) {
-        return (new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US)).format(new Date(t));
+    /**
+     * Format is "d MMM yyyy HH:mm:ss z"
+     *
+     * @since 0.8.2
+     */
+    public synchronized static String to822Date(long t) {
+        return OUTPUT_FORMAT.format(new Date(t));
     }
 }