diff --git a/.tx/config b/.tx/config
index abb8a7a0454139b6e1c78ee4f3595a94fa806be4..0456353e5ecb8826d097949e0986dd357a8f4af3 100644
--- a/.tx/config
+++ b/.tx/config
@@ -78,6 +78,7 @@ trans.ar = apps/routerconsole/locale-news/messages_ar.po
 trans.de = apps/routerconsole/locale-news/messages_de.po
 trans.es = apps/routerconsole/locale-news/messages_es.po
 trans.fr = apps/routerconsole/locale-news/messages_fr.po
+trans.he = apps/routerconsole/locale-news/messages_he.po
 trans.ja = apps/routerconsole/locale-news/messages_ja.po
 trans.it = apps/routerconsole/locale-news/messages_it.po
 trans.nl = apps/routerconsole/locale-news/messages_nl.po
@@ -214,6 +215,8 @@ trans.es = debian/po/es.po
 trans.fr = debian/po/fr.po
 trans.it = debian/po/it.po
 trans.hu = debian/po/hu.po
+trans.ja = debian/po/ja.po
+trans.ko = debian/po/ko.po
 trans.pl = debian/po/pl.po
 trans.pt = debian/po/pt.po
 trans.ro = debian/po/ro.po
@@ -230,6 +233,7 @@ trans.de = installer/resources/locale/po/messages_de.po
 trans.es = installer/resources/locale/po/messages_es.po
 trans.fr = installer/resources/locale/po/messages_fr.po
 trans.it = installer/resources/locale/po/messages_it.po
+trans.pl = installer/resources/locale/po/messages_pl.po
 trans.pt = installer/resources/locale/po/messages_pt.po
 trans.pt_BR = installer/resources/locale/po/messages_pt_BR.po
 trans.ro = installer/resources/locale/po/messages_ro.po
@@ -238,6 +242,23 @@ trans.ru_RU = installer/resources/locale/po/messages_ru.po
 trans.tr_TR = installer/resources/locale/po/messages_tr.po
 trans.zh_CN = installer/resources/locale/po/messages_zh.po
 
+[I2P.getopt]
+source_file = core/java/src/gnu/getopt/MessagesBundle.properties
+source_lang = en
+type = PROPERTIES
+trans.cs = core/java/src/gnu/getopt/MessagesBundle_cs.properties
+trans.de = core/java/src/gnu/getopt/MessagesBundle_de.properties
+trans.es = core/java/src/gnu/getopt/MessagesBundle_es.properties
+trans.fr = core/java/src/gnu/getopt/MessagesBundle_fr.properties
+trans.hu = core/java/src/gnu/getopt/MessagesBundle_hu.properties
+trans.it = core/java/src/gnu/getopt/MessagesBundle_it.properties
+trans.ja = core/java/src/gnu/getopt/MessagesBundle_ja.properties
+trans.nl = core/java/src/gnu/getopt/MessagesBundle_nl.properties
+trans.nb = core/java/src/gnu/getopt/MessagesBundle_nb.properties
+trans.pl = core/java/src/gnu/getopt/MessagesBundle_pl.properties
+trans.ro = core/java/src/gnu/getopt/MessagesBundle_ro.properties
+trans.zh_CN = core/java/src/gnu/getopt/MessagesBundle_zh.properties
+
 [main]
 host = https://www.transifex.com
 
diff --git a/INSTALL-headless.txt b/INSTALL-headless.txt
index c5044307c6180266e801a9eed50feae7410c075a..6f545758081bc7667ab5ee02f853e771fc2ff0b5 100644
--- a/INSTALL-headless.txt
+++ b/INSTALL-headless.txt
@@ -12,7 +12,7 @@ you may use:
 to configure the router.
 
 If you're having trouble, swing by http://forum.i2p/, check the
-website at http://www.i2p2.de/, or get on irc://irc.freenode.net/#i2p
+website at https://geti2p.net/, or get on irc://irc.freenode.net/#i2p
 
 I2P will create and store files and configuration data in the user directory
 ~/.i2p/ on Linux and %APPDATA%\I2P\ on Windows. This directory is created
diff --git a/LICENSE.txt b/LICENSE.txt
index 9ea9f333c60e5667cfac7fecd91257314da86019..23509334cf85fb71aa4e49d6bcdea48bd0763930 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -36,7 +36,7 @@ Public domain except as listed below:
    Copyright (c) 2003, TheCrypto
    See licenses/LICENSE-ElGamalDSA.txt
 
-   SHA256 and HMAC-SHA256:
+   SHA256 and HMAC:
    Copyright (c) 2000 - 2004 The Legion Of The Bouncy Castle
    See licenses/LICENSE-SHA256.txt
 
@@ -76,6 +76,11 @@ Public domain except as listed below:
    Copyright 2012  Hiroshi Nakamura <nahi@ruby-lang.org>
    See licenses/LICENSE-Apache2.0.txt
 
+   Getopt:
+   Copyright (c) 1998 by Aaron M. Renn (arenn@urbanophile.com)
+   See licenses/LICENSE-LGPLv2.1.txt
+
+
 Router (router.jar):
 Public domain except as listed below:
    UPnP.java:
diff --git a/README.txt b/README.txt
index fad70c410b36b277deb9ea8385d1529f0e8b31f0..d115a6dbf25b07382c04fd2eae31d726570fba56 100644
--- a/README.txt
+++ b/README.txt
@@ -15,20 +15,20 @@ To build:
 		ant installer-osx
 
 	Run 'ant' with no arguments to see other build options.
-	See INSTALL.txt or http://www.i2p2.de/download.html for installation instructions.
+	See INSTALL.txt or https://geti2p.net/download for installation instructions.
 
 Documentation:
-	http://www.i2p2.de/how
+	https://geti2p.net/how
 	API: run 'ant javadoc' then start at build/javadoc/index.html
 
 Latest release:
-	http://www.i2p2.de/download
+	https://geti2p.net/download
 
 To get development branch from source control:
-	http://www.i2p2.de/newdevelopers
+	https://geti2p.net/newdevelopers
 
 FAQ:
-	http://www.i2p2.de/faq
+	https://geti2p.net/faq
 
 Need help?
 	IRC irc.freenode.net #i2p
diff --git a/apps/addressbook/java/src/net/i2p/addressbook/ConfigParser.java b/apps/addressbook/java/src/net/i2p/addressbook/ConfigParser.java
index e6e5eefab9f8c7a89f8a6922068ff5036efee8cf..47e9bb0fbb58d7a11fc9eec022af6fa9e99024eb 100644
--- a/apps/addressbook/java/src/net/i2p/addressbook/ConfigParser.java
+++ b/apps/addressbook/java/src/net/i2p/addressbook/ConfigParser.java
@@ -91,7 +91,7 @@ class ConfigParser {
         String inputLine;
         inputLine = input.readLine();
         while (inputLine != null) {
-            inputLine = ConfigParser.stripComments(inputLine);
+            inputLine = stripComments(inputLine);
             String[] splitLine = inputLine.split("=");
             if (splitLine.length == 2) {
                 result.put(splitLine[0].trim().toLowerCase(Locale.US), splitLine[1].trim());
@@ -116,7 +116,7 @@ class ConfigParser {
         FileInputStream fileStream = new FileInputStream(file);
         BufferedReader input = new BufferedReader(new InputStreamReader(
                 fileStream));
-        Map<String, String>  rv = ConfigParser.parse(input);
+        Map<String, String>  rv = parse(input);
         try {
             fileStream.close();
         } catch (IOException ioe) {}
@@ -136,7 +136,7 @@ class ConfigParser {
     public static Map<String, String>  parse(String string) throws IOException {
         StringReader stringReader = new StringReader(string);
         BufferedReader input = new BufferedReader(stringReader);
-        return ConfigParser.parse(input);
+        return parse(input);
     }
     
     /**
@@ -153,7 +153,7 @@ class ConfigParser {
     public static Map<String, String>  parse(File file, Map<String, String>  map) {
         Map<String, String>  result;
         try {
-            result = ConfigParser.parse(file);
+            result = parse(file);
             for (Map.Entry<String, String> entry : map.entrySet()) {
                 if (!result.containsKey(entry.getKey()))
                     result.put(entry.getKey(), entry.getValue());
@@ -161,7 +161,7 @@ class ConfigParser {
         } catch (IOException exp) {
             result = map;
             try {
-                ConfigParser.write(result, file);
+                write(result, file);
             } catch (IOException exp2) {
             }
         }
@@ -182,7 +182,7 @@ class ConfigParser {
         List<String> result = new LinkedList<String>();
         String inputLine = input.readLine();
         while (inputLine != null) {
-            inputLine = ConfigParser.stripComments(inputLine).trim();
+            inputLine = stripComments(inputLine).trim();
             if (inputLine.length() > 0) {
                 result.add(inputLine);
             }
@@ -205,7 +205,7 @@ class ConfigParser {
         FileInputStream fileStream = new FileInputStream(file);
         BufferedReader input = new BufferedReader(new InputStreamReader(
                 fileStream));
-        List<String> rv = ConfigParser.parseSubscriptions(input);
+        List<String> rv = parseSubscriptions(input);
         try {
             fileStream.close();
         } catch (IOException ioe) {}
@@ -224,7 +224,7 @@ class ConfigParser {
     public static List<String> parseSubscriptions(String string) throws IOException {
         StringReader stringReader = new StringReader(string);
         BufferedReader input = new BufferedReader(stringReader);
-        return ConfigParser.parseSubscriptions(input);
+        return parseSubscriptions(input);
     }
     
     /**
@@ -234,18 +234,30 @@ class ConfigParser {
      * 
      * @param file
      *            A File to attempt to parse.
-     * @param list list of files to parse
+     * @param list The default subscriptions to be saved and returned if the file cannot be read
      * @return A List consisting of one element for each line in file, or if
      *         file cannot be read, list.
      */
     public static List<String> parseSubscriptions(File file, List<String> list) {
         List<String> result;
         try {
-            result = ConfigParser.parseSubscriptions(file);
+            result = parseSubscriptions(file);
+            // Fix up files that contain the old default
+            // which was changed in 0.9.11
+            if (result.remove(Daemon.OLD_DEFAULT_SUB)) {
+                for (String sub : list) {
+                    if (!result.contains(sub))
+                        result.add(sub);
+                }
+                try {
+                    writeSubscriptions(result, file);
+                    // TODO log
+                } catch (IOException ioe) {}
+            }
         } catch (IOException exp) {
             result = list;
             try {
-                ConfigParser.writeSubscriptions(result, file);
+                writeSubscriptions(result, file);
             } catch (IOException exp2) {
             }
         }
@@ -289,8 +301,7 @@ class ConfigParser {
         boolean success = false;
         if (!isWindows) {
             File tmp = SecureFile.createTempFile("temp-", ".tmp", file.getAbsoluteFile().getParentFile());
-            ConfigParser
-                .write(map, new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(tmp), "UTF-8")));
+            write(map, new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(tmp), "UTF-8")));
             success = tmp.renameTo(file);
             if (!success) {
                 tmp.delete();
@@ -299,8 +310,7 @@ class ConfigParser {
         }
         if (!success) {
             // hmm, that didn't work, try it the old way
-            ConfigParser
-                .write(map, new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(file), "UTF-8")));
+            write(map, new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(file), "UTF-8")));
         }
     }
 
@@ -337,7 +347,7 @@ class ConfigParser {
      */
     public static void writeSubscriptions(List<String> list, File file)
             throws IOException {
-        ConfigParser.writeSubscriptions(list, new BufferedWriter(
+        writeSubscriptions(list, new BufferedWriter(
                 new OutputStreamWriter(new SecureFileOutputStream(file), "UTF-8")));
     }
 
diff --git a/apps/addressbook/java/src/net/i2p/addressbook/Daemon.java b/apps/addressbook/java/src/net/i2p/addressbook/Daemon.java
index d22ac753459ca07445ad0e0b0d543dc444240117..f0ed16569d0355b9679f743913b3634e8507fb1d 100644
--- a/apps/addressbook/java/src/net/i2p/addressbook/Daemon.java
+++ b/apps/addressbook/java/src/net/i2p/addressbook/Daemon.java
@@ -50,6 +50,9 @@ public class Daemon {
     private static final Daemon _instance = new Daemon();
     private volatile boolean _running;
     private static final boolean DEBUG = false;
+    private static final String DEFAULT_SUB = "http://i2p-projekt.i2p/hosts.txt";
+    /** @since 0.9.12 */
+    static final String OLD_DEFAULT_SUB = "http://www.i2p2.i2p/hosts.txt";
     
     /**
      * Update the router and published address books using remote data from the
@@ -253,7 +256,7 @@ public class Daemon {
         
         List<String> defaultSubs = new LinkedList<String>();
         // defaultSubs.add("http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/i2p/hosts.txt");
-        defaultSubs.add("http://www.i2p2.i2p/hosts.txt");
+        defaultSubs.add(DEFAULT_SUB);
         
         SubscriptionList subscriptions = new SubscriptionList(subscriptionFile,
                 etagsFile, lastModifiedFile, lastFetchedFile, delay, defaultSubs, settings
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerID.java b/apps/i2psnark/java/src/org/klomp/snark/PeerID.java
index 16dc9224a99730669a8b49b34d2dbb504924805f..0a71450c7c25188549464ff4bf067900488271c0 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerID.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerID.java
@@ -52,6 +52,7 @@ class PeerID implements Comparable<PeerID>
   private boolean triedDestLookup;
   private final int hash;
   private final I2PSnarkUtil util;
+  private String _toStringCache;
 
   public PeerID(byte[] id, Destination address)
   {
@@ -216,13 +217,15 @@ class PeerID implements Comparable<PeerID>
   }
 
   /**
-   * Returns the String "id@address" where id is the base64 encoded id
-   * and address is the base64 dest (was the base64 hash of the dest) which
+   * Returns the String "id@address" where id is the first 4 chars of the base64 encoded id
+   * and address is the first 6 chars of the base64 dest (was the base64 hash of the dest) which
    * should match what the bytemonsoon tracker reports on its web pages.
    */
-    @Override
+  @Override
   public String toString()
   {
+    if (_toStringCache != null)
+        return _toStringCache;
     if (id == null || address == null)
         return "unkn@" + Base64.encode(destHash).substring(0, 6);
     int nonZero = 0;
@@ -232,7 +235,8 @@ class PeerID implements Comparable<PeerID>
             break;
         }
     }
-    return Base64.encode(id, nonZero, id.length-nonZero).substring(0,4) + "@" + address.toBase64().substring(0,6);
+    _toStringCache = Base64.encode(id, nonZero, id.length-nonZero).substring(0,4) + "@" + address.toBase64().substring(0,6);
+    return _toStringCache;
   }
 
   /**
diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
index 3fe2b2ade3fecfeeb25156d92f76a23ff947eb83..21ffac75869298e9d393232a7458290b6d56fdc7 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
@@ -24,6 +24,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.LinkedBlockingQueue;
 
 import net.i2p.I2PAppContext;
+import net.i2p.app.ClientAppManager;
 import net.i2p.data.Base64;
 import net.i2p.data.DataHelper;
 import net.i2p.update.*;
@@ -198,7 +199,9 @@ public class SnarkManager implements CompleteListener {
         public void timeReached() {
             if (!_running)
                 return;
-            _umgr = _context.updateManager();
+            ClientAppManager cmgr = _context.clientAppManager();
+            if (cmgr != null)
+                _umgr = (UpdateManager) cmgr.getRegisteredApp(UpdateManager.APP_NAME);
             if (_umgr != null) {
                 _uhandler = new UpdateHandler(_context, _umgr, SnarkManager.this);
                 _umgr.register(_uhandler, UpdateType.ROUTER_SIGNED, UpdateMethod.TORRENT, 10);
diff --git a/apps/i2psnark/locale/messages_fr.po b/apps/i2psnark/locale/messages_fr.po
index 0fae67ab8cd0241e857ebd664fd1ba4ec255ae39..7de66f204d04c186671a37622da838b6f2d02b6a 100644
--- a/apps/i2psnark/locale/messages_fr.po
+++ b/apps/i2psnark/locale/messages_fr.po
@@ -2,7 +2,7 @@
 # Copyright (C) 2009 The I2P Project
 # This file is distributed under the same license as the i2psnark package.
 # To contribute translations, see http://www.i2p2.de/newdevelopers
-#
+# 
 # Translators:
 # Boxoa590, 2012-2013
 # ducki2p <ducki2p@gmail.com>, 2011
@@ -11,20 +11,19 @@
 # Boxoa590, 2013
 # Boxoa590, 2012
 # jackjack <root@waka.site40.net>, 2011
-# Towatowa441, 2013
+# Towatowa441, 2013-2014
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-01-09 19:14+0000\n"
-"PO-Revision-Date: 2013-11-22 10:17+0000\n"
+"POT-Creation-Date: 2014-01-09 19:27+0000\n"
+"PO-Revision-Date: 2014-01-23 06:59+0000\n"
 "Last-Translator: Towatowa441\n"
-"Language-Team: French (http://www.transifex.com/projects/p/I2P/language/"
-"fr/)\n"
-"Language: fr\n"
+"Language-Team: French (http://www.transifex.com/projects/p/I2P/language/fr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 #: ../java/src/org/klomp/snark/IdleChecker.java:69
@@ -101,9 +100,7 @@ msgstr "Répertoire des données changé pour {0}"
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:647
 msgid "I2CP and tunnel changes will take effect after stopping all torrents"
-msgstr ""
-"Les modifications sur I2CP et les tunnels seront pris en compte après avoir "
-"arrêté tous les torrents"
+msgstr "Les modifications sur I2CP et les tunnels seront pris en compte après avoir arrêté tous les torrents"
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:651
 #, java-format
@@ -122,9 +119,7 @@ msgstr "Les paramètres I2CP ont été changés à {0}"
 #: ../java/src/org/klomp/snark/SnarkManager.java:664
 msgid ""
 "Unable to connect with the new settings, reverting to the old I2CP settings"
-msgstr ""
-"Impossible de se connecter avec les nouveaux paramètres, retour à l'ancienne "
-"configuration I2CP"
+msgstr "Impossible de se connecter avec les nouveaux paramètres, retour à l'ancienne configuration I2CP"
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:668
 msgid "Unable to reconnect with the old settings!"
@@ -157,14 +152,11 @@ msgstr "Démarrage automatique désactivé"
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:708
 msgid "Enabled open trackers - torrent restart required to take effect."
-msgstr ""
-"Open trackers activés - redémarrage des torrents requis pour prise en compte."
+msgstr "Open trackers activés - redémarrage des torrents requis pour prise en compte."
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:710
 msgid "Disabled open trackers - torrent restart required to take effect."
-msgstr ""
-"Open trackers désactivés - redémarrage des torrents requis pour prise en "
-"compte."
+msgstr "Open trackers désactivés - redémarrage des torrents requis pour prise en compte."
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:717
 msgid "Enabled DHT."
@@ -181,9 +173,7 @@ msgstr "Le changement DHT nécessite la fermeture puis réouverture du tunnel"
 #: ../java/src/org/klomp/snark/SnarkManager.java:728
 #, java-format
 msgid "{0} theme loaded, return to main i2psnark page to view."
-msgstr ""
-"Thème {0}  chargé, revenez à la page d''accueil d''i2psnark pour voir comme "
-"il est beau !"
+msgstr "Thème {0}  chargé, revenez à la page d''accueil d''i2psnark pour voir comme il est beau !"
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:738
 msgid "Configuration unchanged."
@@ -191,15 +181,11 @@ msgstr "Aucun changement de configuration."
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:770
 msgid "Open Tracker list changed - torrent restart required to take effect."
-msgstr ""
-"Liste des Open trackers modifiée - redémarrage des torrents requis pour "
-"prise en compte"
+msgstr "Liste des Open trackers modifiée - redémarrage des torrents requis pour prise en compte"
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:780
 msgid "Private tracker list changed - affects newly created torrents only."
-msgstr ""
-"Liste tracker privé modifiée - affecte seulement les torrents nouvellement "
-"créés."
+msgstr "Liste tracker privé modifiée - affecte seulement les torrents nouvellement créés."
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:826
 #, java-format
@@ -226,7 +212,8 @@ msgstr "Erreur : Impossible d’ajouter le torrent : {0}"
 msgid "Cannot open \"{0}\""
 msgstr "Impossible d’ouvrir: \"{0}\""
 
-#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
+#. TODO - if the existing one is a magnet, delete it and add the metainfo
+#. instead?
 #: ../java/src/org/klomp/snark/SnarkManager.java:957
 #: ../java/src/org/klomp/snark/SnarkManager.java:1058
 #: ../java/src/org/klomp/snark/SnarkManager.java:1140
@@ -243,30 +230,24 @@ msgstr "ERREUR - Pas de trackers I2P dans le torrent privé \"{0}\""
 #: ../java/src/org/klomp/snark/SnarkManager.java:965
 #, java-format
 msgid ""
-"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and "
-"DHT only."
-msgstr ""
-"Avertissement - Pas de trackers I2P dans \"{0}\", vais annoncer aux trackers "
-"I2P ouverts et DHT seulement."
+"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and"
+" DHT only."
+msgstr "Avertissement - Pas de trackers I2P dans \"{0}\", vais annoncer aux trackers I2P ouverts et DHT seulement."
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:968
 #, java-format
 msgid ""
 "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will "
 "announce to DHT only."
-msgstr ""
-"Avertissement - Pas de trackers I2P dans \"{0}\", et les trackers ouverts "
-"sont désactivés, vais annoncer à DHT seulement."
+msgstr "Avertissement - Pas de trackers I2P dans \"{0}\", et les trackers ouverts sont désactivés, vais annoncer à DHT seulement."
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:970
 #, java-format
 msgid ""
 "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 ""
-"Avertissement - Pas de trackers I2P dans \"{0}\", et DHT et les trackers "
-"ouverts sont désactivés, vous devriez activer les trackers ouverts ou DHT "
-"avant de démarrer le torrent."
+"disabled, you should enable open trackers or DHT before starting the "
+"torrent."
+msgstr "Avertissement - Pas de trackers I2P dans \"{0}\", et DHT et les trackers ouverts sont désactivés, vous devriez activer les trackers ouverts ou DHT avant de démarrer le torrent."
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:992
 #, java-format
@@ -277,8 +258,7 @@ msgstr "Le torrent dans \"{0}\" est invalide"
 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:186
 #, java-format
 msgid "ERROR - Out of memory, cannot create torrent from {0}"
-msgstr ""
-"ERREUR - Mémoire insuffisante, impossible de créer le torrent depuis {0}"
+msgstr "ERREUR - Mémoire insuffisante, impossible de créer le torrent depuis {0}"
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:1011
 #, java-format
@@ -300,11 +280,9 @@ msgstr "Envoi {0}"
 #, java-format
 msgid ""
 "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 ""
-"Les trackers ouverts sont désactivés et nous n''avons pas de pairs DHT. La "
-"recherche de {0} pourrait ne pas réussir jusqu''à ce que vous démarriez un "
-"autre torrent, activiez trackers ouverts, ou activeiz DHT."
+"succeed until you start another torrent, enable open trackers, or enable "
+"DHT."
+msgstr "Les trackers ouverts sont désactivés et nous n''avons pas de pairs DHT. La recherche de {0} pourrait ne pas réussir jusqu''à ce que vous démarriez un autre torrent, activiez trackers ouverts, ou activeiz DHT."
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:1079
 #, java-format
@@ -331,9 +309,7 @@ msgstr "Trop de fichiers dans \"{0}\" ({1}), suppression! "
 #: ../java/src/org/klomp/snark/SnarkManager.java:1402
 #, java-format
 msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
-msgstr ""
-"Le fichier torrent \"{0}\" ne peut pas se terminer par \".torrent\", "
-"suppression!"
+msgstr "Le fichier torrent \"{0}\" ne peut pas se terminer par \".torrent\", suppression!"
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:1404
 #, java-format
@@ -363,9 +339,7 @@ msgstr "Le fichier torrent \"{0}\" n'a pas de données, suppression!"
 #: ../java/src/org/klomp/snark/SnarkManager.java:1419
 #, java-format
 msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
-msgstr ""
-"Les torrents dont la taille est supérieure à \"{0}\"octets ne sont pas "
-"encore supportés, suppression \"{1}\"."
+msgstr "Les torrents dont la taille est supérieure à \"{0}\"octets ne sont pas encore supportés, suppression \"{1}\"."
 
 #: ../java/src/org/klomp/snark/SnarkManager.java:1435
 #, java-format
@@ -670,8 +644,7 @@ msgstr "Dernière page"
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:744
 #, java-format
 msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
-msgstr ""
-"URL incorrecte - elle doit débuter par \"http://\", \"{0}\", ou \"{1}\""
+msgstr "URL incorrecte - elle doit débuter par \"http://\", \"{0}\", ou \"{1}\""
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:785
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814
@@ -714,9 +687,7 @@ msgstr "Répertoire effacé: {0}"
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933
 msgid "Error - Cannot include alternate trackers without a primary tracker"
-msgstr ""
-"Erreur - Ne peut pas inclure de trackers trackers alternatifs sans un "
-"tracker primaire"
+msgstr "Erreur - Ne peut pas inclure de trackers trackers alternatifs sans un tracker primaire"
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:946
 msgid "Error - Cannot mix private and public trackers in a torrent"
@@ -732,9 +703,7 @@ msgstr "Torrent créé pour \"{0}\""
 msgid ""
 "Many I2P trackers require you to register new torrents before seeding - "
 "please do so before starting \"{0}\""
-msgstr ""
-"De nombreux trackers I2P nécessitent d’enregistrer les nouveaux torrents "
-"avant de seeder - faites-le avant de démarrer \"{0}\"!"
+msgstr "De nombreux trackers I2P nécessitent d’enregistrer les nouveaux torrents avant de seeder - faites-le avant de démarrer \"{0}\"!"
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:970
 #, java-format
@@ -748,8 +717,7 @@ msgstr "Impossible de créer un torrent pour des données inexistantes: {0}"
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977
 msgid "Error creating torrent - you must enter a file or directory"
-msgstr ""
-"Erreur de création du torrent - vous devez saisir un fichier ou un répertoire"
+msgstr "Erreur de création du torrent - vous devez saisir un fichier ou un répertoire"
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1008
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2018
@@ -776,7 +744,8 @@ msgstr "Ajout tracker"
 msgid "Enter valid tracker name and URLs"
 msgstr "Entrez nom de tracker valide et URLs"
 
-#. "<input type=\"reset\" class=\"cancel\" value=\"").append(_("Cancel")).append("\">\n" +
+#. "<input type=\"reset\" class=\"cancel\"
+#. value=\"").append(_("Cancel")).append("\">\n" +
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1082
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2021
 msgid "Restore defaults"
@@ -897,9 +866,7 @@ msgstr "Enlever le torrent de la liste active, suprression du fichier .torrent"
 msgid ""
 "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will "
 "not be deleted) ?"
-msgstr ""
-"Êtes-vous sûr que vous voulez supprimer le fichier \\''{0}\\'' (les données "
-"téléchargées ne seront pas supprimées) ?"
+msgstr "Êtes-vous sûr que vous voulez supprimer le fichier \\''{0}\\'' (les données téléchargées ne seront pas supprimées) ?"
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1438
 msgid "Remove"
@@ -907,8 +874,7 @@ msgstr "Enlever"
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1450
 msgid "Delete the .torrent file and the associated data file(s)"
-msgstr ""
-"Supprimer le fichier .torrent et le(s) fichier(s) de données associé(s)"
+msgstr "Supprimer le fichier .torrent et le(s) fichier(s) de données associé(s)"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
@@ -918,9 +884,7 @@ msgstr ""
 msgid ""
 "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
 "data?"
-msgstr ""
-"Êtes-vous certain de vouloir supprimer le torrent \\''{0}\\'' ainsi que "
-"toutes les données téléchargées ?"
+msgstr "Êtes-vous certain de vouloir supprimer le torrent \\''{0}\\'' ainsi que toutes les données téléchargées ?"
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1458
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1988
@@ -970,11 +934,9 @@ msgstr "Depuis l'URL"
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1680
 msgid ""
-"Enter the torrent file download URL (I2P only), magnet link, maggot link, or "
-"info hash"
-msgstr ""
-"Entrez l'URL de téléchargement du fichier torrent (I2P seulement), lien "
-"magnet, lien maggot, or l'info hash"
+"Enter the torrent file download URL (I2P only), magnet link, maggot link, or"
+" info hash"
+msgstr "Entrez l'URL de téléchargement du fichier torrent (I2P seulement), lien magnet, lien maggot, or l'info hash"
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1685
 msgid "Add torrent"
@@ -993,7 +955,8 @@ msgstr "La suppression d'un fichier .torrent entraîne l'arrêt du torrent."
 msgid "Create Torrent"
 msgstr "Créer torrent"
 
-#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
+#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\"
+#. value=\"" + newFile + "\" /><br>\n");
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
 msgid "Data to seed"
 msgstr "Données à seeder"
@@ -1038,8 +1001,7 @@ msgstr "Fichiers lisibles par tous"
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1792
 msgid "If checked, other users may access the downloaded files"
-msgstr ""
-"SI coché, les autres utilisateurs pourront accéder aux fichiers téléchargés."
+msgstr "Si coché, les autres utilisateurs pourront accéder aux fichiers téléchargés."
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1796
 msgid "Auto start"
@@ -1103,11 +1065,9 @@ msgstr "Utiliser les open trackers aussi"
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1888
 msgid ""
-"If checked, announce torrents to open trackers as well as the tracker listed "
-"in the torrent file"
-msgstr ""
-"Si coché, les torrents seront annoncés vers les open trackers ainsi que vers "
-"les trackers indiqués dans le fichier torrent"
+"If checked, announce torrents to open trackers as well as the tracker listed"
+" in the torrent file"
+msgstr "Si coché, les torrents seront annoncés vers les open trackers ainsi que vers les trackers indiqués dans le fichier torrent"
 
 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1892
 msgid "Enable DHT"
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
index f522193f68a2c3de455a82f1861a59be3d5d1f88..42bad53f0cfaca17bf903f15203aa350ddbfd9d4 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
@@ -53,6 +53,9 @@ import java.util.StringTokenizer;
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.atomic.AtomicLong;
 
+import gnu.getopt.Getopt;
+import gnu.getopt.LongOpt;
+
 import net.i2p.I2PAppContext;
 import net.i2p.I2PException;
 import net.i2p.client.I2PClient;
@@ -107,18 +110,46 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
 
     private final Set<ConnectionEventListener> listeners = new CopyOnWriteArraySet<ConnectionEventListener>();
 
-    public static void main(String[] args) throws IOException {
-        new I2PTunnel(args);
+    private static final int NOGUI = 99999;
+    private static final LongOpt[] longopts = new LongOpt[] {
+        new LongOpt("cli", LongOpt.NO_ARGUMENT, null, 'c'),
+        new LongOpt("die", LongOpt.NO_ARGUMENT, null, 'd'),
+        new LongOpt("gui", LongOpt.NO_ARGUMENT, null, 'g'),
+        new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h'),
+        new LongOpt("nocli", LongOpt.NO_ARGUMENT, null, 'w'),
+        new LongOpt("nogui", LongOpt.NO_ARGUMENT, null, NOGUI),
+        new LongOpt("wait", LongOpt.NO_ARGUMENT, null, 'w')
+    };
+
+    public static void main(String[] args) {
+        try {
+            new I2PTunnel(args);
+        } catch (IllegalArgumentException iae) {
+            System.err.println(iae.toString());
+            System.exit(1);
+        }
     }
 
+    /**
+     *  Standard constructor for embedded, uses args "-nocli -die" to return immediately
+     */
     public I2PTunnel() {
         this(nocli_args);
     }
 
+    /**
+     *  See usage() for options
+     *  @throws IllegalArgumentException
+     */
     public I2PTunnel(String[] args) {
         this(args, null);
     }
 
+    /**
+     *  See usage() for options
+     *  @param lsnr may be null
+     *  @throws IllegalArgumentException
+     */
     public I2PTunnel(String[] args, ConnectionEventListener lsnr) {
         super();
         _context = I2PAppContext.getGlobalContext(); // new I2PAppContext();
@@ -134,37 +165,95 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
         boolean checkRunByE = true;
         boolean cli = true;
         boolean dontDie = true;
-        for (int i = 0; i < args.length; i++) {
-            if (args[i].equals("-die")) {
+        boolean error = false;
+        List<String> eargs = null;
+        Getopt g = new Getopt("i2ptunnel", args, "d::n:c::w::e:h::", longopts);
+        int c;
+        while ((c = g.getopt()) != -1) {
+          switch (c) {
+            case 'd':  // -d, -die, --die
                 dontDie = false;
                 gui = false;
                 cli = false;
                 checkRunByE = false;
-            } else if (args[i].equals("-nogui")) {
+                break;
+
+            case 'n':  // -noc, -nog, -nocli, -nogui
+                String a = g.getOptarg();
+                if (a.startsWith("oc")) {
+                    gui = false;
+                    cli = false;
+                    checkRunByE = false;
+                    break;
+                } else if (a.startsWith("og")) {
+                    // fall thru
+                } else {
+                    error = true;
+                    break;
+                }
+                // fall thru for -nogui only
+
+            case NOGUI:  // --nogui
                 gui = false;
-                _log.warn(getPrefix() + "The `-nogui' option of I2PTunnel is deprecated.\n"
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn(getPrefix() + "The `-nogui' option of I2PTunnel is deprecated.\n"
                           + "Use `-cli', `-nocli' (aka `-wait') or `-die' instead.");
-            } else if (args[i].equals("-cli")) {
+
+            case 'c':  // -c, -cli, --cli
                 gui = false;
                 cli = true;
                 checkRunByE = false;
-            } else if (args[i].equals("-nocli") || args[i].equals("-wait")) {
+                break;
+
+            case 'w':  // -w, -wait, --nocli
                 gui = false;
                 cli = false;
                 checkRunByE = false;
-            } else if (args[i].equals("-e")) {
-                runCommand(args[i + 1], this);
-                i++;
+                break;
+
+            case 'e':
+                if (eargs == null)
+                    eargs = new ArrayList<String>(4);
+                eargs.add(g.getOptarg());
                 if (checkRunByE) {
                     checkRunByE = false;
                     cli = false;
                 }
-            } else if (new File(args[i]).exists()) {
-                runCommand("run " + args[i], this);
-            } else {
-                System.out.println("Unknown parameter " + args[i]);
+                break;
+
+            case 'h':
+            case '?':
+            case ':':
+            default:
+              error = true;
+          }
+        }
+
+        int remaining = args.length - g.getOptind();
+
+        if (error || remaining > 1) {
+            System.err.println(usage());
+            throw new IllegalArgumentException();
+        }
+
+        if (eargs != null) {
+            for (String arg : eargs) {
+                runCommand(arg, this);
+            }
+        }
+
+        if (remaining == 1) {
+            String f = args[g.getOptind()];
+            File file = new File(f);
+            // This is probably just a problem with the options, so
+            // throw from here
+            if (!file.exists()) {
+                System.err.println(usage());
+                throw new IllegalArgumentException("Command file does not exist: " + f);
             }
+            runCommand("run " + f, this);
         }
+
         if (gui) {
             new I2PTunnelGUI(this);
         } else if (cli) {
@@ -185,6 +274,9 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             } catch (IOException ex) {
                 ex.printStackTrace();
             }
+        } else if (eargs == null && remaining == 0 && dontDie) {
+            System.err.println(usage());
+            throw new IllegalArgumentException("Waiting for nothing! Specify gui, cli, command, command file, or die");
         }
 
         while (dontDie) {
@@ -197,6 +289,23 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
         }
     }
 
+    /** with newlines except for last line */
+    private static String usage() {
+        // not sure this all makes sense, just documenting what's above
+        return
+            "Usage: i2ptunnel [options] [commandFile]\n" +
+            "  Default is to run the GUI.\n" +
+            "  commandFile: run all commands in this file\n" +
+            "  Options:\n" +
+            "    -c, -cli, --cli     :  run the command line interface\n" +
+            "    -d, -die, --die     :  exit immediately, do not wait for commands to finish\n" +
+            "    -e 'command [args]' :  run the command\n" +
+            "    -h, --help          :  display this help\n" +
+            "    -nocli, --nocli     :  do not run the command line interface or GUI\n" +
+            "    -nogui, --nogui     :  do not run the GUI\n" +
+            "    -w, -wait, --wait   :  do not run the command line interface or GUI";
+    }
+
     /** @return A copy, non-null */
     List<I2PSession> getSessions() { 
             return new ArrayList<I2PSession>(_sessions); 
@@ -312,30 +421,30 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
      * @param l logger to receive events and output
      */
     private static void runHelp(Logging l) {
-        l.log("Command list:");
+        l.log("Command list:\n" +
         // alphabetical please...
-        l.log("  auth <username> <password>");
-        l.log("  client <port> <pubkey>[,<pubkey,...]|file:<pubkeyfile> [<sharedClient>]");
-        l.log("  clientoptions [-acx] [key=value ]*");
-        l.log("  close [forced] <jobnumber>|all");
-        l.log("  config [-s] <i2phost> <i2pport>");
-        l.log("  connectclient <port> [<sharedClient>] [<proxy>]");
-        l.log("  genkeys <privkeyfile> [<pubkeyfile>]");
-        l.log("  gentextkeys");
-        l.log("  httpbidirserver <host> <port> <proxyport> <spoofedhost> <privkeyfile>");
-        l.log("  httpclient <port> [<sharedClient>] [<proxy>]");
-        l.log("  httpserver <host> <port> <spoofedhost> <privkeyfile>");
-        l.log("  ircclient <port> <pubkey>[,<pubkey,...]|file:<pubkeyfile> [<sharedClient>]");
-        l.log("  list");
-        l.log("  listen_on <ip>");
-        l.log("  lookup <name>");
-        l.log("  owndest yes|no");
-        l.log("  ping <args>");
-        l.log("  quit");
-        l.log("  read_timeout <msecs>");
-        l.log("  run <commandfile>");
-        l.log("  server <host> <port> <privkeyfile>");
-        l.log("  textserver <host> <port> <privkey>");
+              "  auth <username> <password>\n" +
+              "  client <port> <pubkey>[,<pubkey,...]|file:<pubkeyfile> [<sharedClient>]\n" +
+              "  clientoptions [-acx] [key=value ]*\n" +
+              "  close [forced] <jobnumber>|all\n" +
+              "  config [-s] <i2phost> <i2pport>\n" +
+              "  connectclient <port> [<sharedClient>] [<proxy>]\n" +
+              "  genkeys <privkeyfile> [<pubkeyfile>]\n" +
+              "  gentextkeys\n" +
+              "  httpbidirserver <host> <port> <proxyport> <spoofedhost> <privkeyfile>\n" +
+              "  httpclient <port> [<sharedClient>] [<proxy>]\n" +
+              "  httpserver <host> <port> <spoofedhost> <privkeyfile>\n" +
+              "  ircclient <port> <pubkey>[,<pubkey,...]|file:<pubkeyfile> [<sharedClient>]\n" +
+              "  list\n" +
+              "  listen_on <ip>\n" +
+              "  lookup <name>\n" +
+              "  owndest yes|no\n" +
+              "  ping <args>\n" +
+              "  quit\n" +
+              "  read_timeout <msecs>\n" +
+              "  run <commandfile>\n" +
+              "  server <host> <port> <privkeyfile>\n" +
+              "  textserver <host> <port> <privkey>\n");
     }
     
     /**
@@ -378,12 +487,12 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
                 _clientOptions.setProperty(key, val);
             }
         } else {
-            l.log("Usage:");
-            l.log("  clientoptions [key=value ]*     // sets current options");
-            l.log("  clientoptions -a [key=value ]*  // adds to current options");
-            l.log("  clientoptions -c                // clears current options");
-            l.log("  clientoptions -x [key ]*        // removes listed options");
-            l.log("Current options:");
+            l.log("Usage:\n" +
+                  "  clientoptions [key=value ]*     // sets current options\n" +
+                  "  clientoptions -a [key=value ]*  // adds to current options\n" +
+                  "  clientoptions -c                // clears current options\n" +
+                  "  clientoptions -x [key ]*        // removes listed options\n" +
+                  "Current options:\n");
             Properties p = new OrderedProperties();
             p.putAll(_clientOptions);
             for (Map.Entry<Object, Object> e : p.entrySet()) {
@@ -466,8 +575,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             notifyEvent("serverTaskId", Integer.valueOf(serv.getId()));
             return;
         } else {
-            l.log("server <host> <port> <privkeyfile>");
-            l.log("  creates a server that sends all incoming data\n" + "  of its destination to host:port.");
+            l.log("server <host> <port> <privkeyfile>\n" +
+                  "  creates a server that sends all incoming data\n" + "  of its destination to host:port.");
             notifyEvent("serverTaskId", Integer.valueOf(-1));
         }
     }
@@ -517,8 +626,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             notifyEvent("serverTaskId", Integer.valueOf(serv.getId()));
             return;
         } else {
-            l.log("server <host> <port> <privkeyfile>");
-            l.log("  creates a server that sends all incoming data\n" + "  of its destination to host:port.");
+            l.log("server <host> <port> <privkeyfile>\n" +
+                  "  creates a server that sends all incoming data\n" + "  of its destination to host:port.");
             notifyEvent("serverTaskId", Integer.valueOf(-1));
         }
     }
@@ -578,8 +687,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             notifyEvent("serverTaskId", Integer.valueOf(serv.getId()));
             return;
         } else {
-            l.log("httpserver <host> <port> <spoofedhost> <privkeyfile>");
-            l.log("  creates an HTTP server that sends all incoming data\n" 
+            l.log("httpserver <host> <port> <spoofedhost> <privkeyfile>\n" +
+                  "  creates an HTTP server that sends all incoming data\n" 
                   + "  of its destination to host:port., filtering the HTTP\n" 
                   + "  headers so it looks like the request is to the spoofed host.");
             notifyEvent("serverTaskId", Integer.valueOf(-1));
@@ -654,8 +763,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             notifyEvent("serverTaskId", Integer.valueOf(serv.getId()));
             return;
         } else {
-            l.log("httpserver <host> <port> <proxyport> <spoofedhost> <privkeyfile>");
-            l.log("  creates a bidirectional HTTP server that sends all incoming data\n"
+            l.log("httpserver <host> <port> <proxyport> <spoofedhost> <privkeyfile>\n" +
+                  "  creates a bidirectional HTTP server that sends all incoming data\n"
                   + "  of its destination to host:port., filtering the HTTP\n"
                   + "  headers so it looks like the request is to the spoofed host,"
                   + "  and listens to host:proxyport to proxy HTTP requests.");
@@ -707,8 +816,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             addtask(serv);
             notifyEvent("serverTaskId", Integer.valueOf(serv.getId()));
         } else {
-            l.log("textserver <host> <port> <privkey>");
-            l.log("  creates a server that sends all incoming data\n" + "  of its destination to host:port.");
+            l.log("textserver <host> <port> <privkey>\n" +
+                  "  creates a server that sends all incoming data\n" + "  of its destination to host:port.");
             notifyEvent("textserverTaskId", Integer.valueOf(-1));
         }
     }
@@ -765,8 +874,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
                 throw iae;
             }
         } else {
-            l.log("client <port> <pubkey>[,<pubkey>]|file:<pubkeyfile>[ <sharedClient>] [<privKeyFile>]");
-            l.log("  creates a client that forwards port to the pubkey.\n"
+            l.log("client <port> <pubkey>[,<pubkey>]|file:<pubkeyfile>[ <sharedClient>] [<privKeyFile>]\n" +
+                  "  creates a client that forwards port to the pubkey.\n"
                   + "  use 0 as port to get a free port assigned.  If you specify\n"
                   + "  a comma delimited list of pubkeys, it will rotate among them\n"
                   + "  randomlyl. sharedClient indicates if this client shares \n"
@@ -841,11 +950,11 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
                 throw iae;
             }
         } else {
-            l.log("httpclient <port> [<sharedClient>] [<proxy>]");
-            l.log("  creates a client that distributes HTTP requests.");
-            l.log("  <sharedClient> (optional) indicates if this client shares tunnels with other clients (true of false)");
-            l.log("  <proxy> (optional) indicates a proxy server to be used");
-            l.log("  when trying to access an address out of the .i2p domain");
+            l.log("httpclient <port> [<sharedClient>] [<proxy>]\n" +
+                  "  creates a client that distributes HTTP requests.\n" +
+                  "  <sharedClient> (optional) indicates if this client shares tunnels with other clients (true of false)\n" +
+                  "  <proxy> (optional) indicates a proxy server to be used\n" +
+                  "  when trying to access an address out of the .i2p domain");
             notifyEvent("httpclientTaskId", Integer.valueOf(-1));
         }
     }
@@ -908,11 +1017,11 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
                 throw iae;
             }
         } else {
-            l.log("connectclient <port> [<sharedClient>] [<proxy>]");
-            l.log("  creates a client that for SSL/HTTPS requests.");
-            l.log("  <sharedClient> (optional) indicates if this client shares tunnels with other clients (true of false)");
-            l.log("  <proxy> (optional) indicates a proxy server to be used");
-            l.log("  when trying to access an address out of the .i2p domain");
+            l.log("connectclient <port> [<sharedClient>] [<proxy>]\n" +
+                  "  creates a client that for SSL/HTTPS requests.\n" +
+                  "  <sharedClient> (optional) indicates if this client shares tunnels with other clients (true of false)\n" +
+                  "  <proxy> (optional) indicates a proxy server to be used\n" +
+                  "  when trying to access an address out of the .i2p domain\n");
         }
     }
 
@@ -975,9 +1084,9 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
                 throw iae;
             }
         } else {
-            l.log("ircclient <port> [<sharedClient> [<privKeyFile>]]");
-            l.log("  creates a client that filter IRC protocol.");
-            l.log("  <sharedClient> (optional) indicates if this client shares tunnels with other clients (true of false)");
+            l.log("ircclient <port> [<sharedClient> [<privKeyFile>]]\n" +
+                  "  creates a client that filter IRC protocol.\n" +
+                  "  <sharedClient> (optional) indicates if this client shares tunnels with other clients (true of false)\n");
             notifyEvent("ircclientTaskId", Integer.valueOf(-1));
         }
     }
@@ -1028,8 +1137,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
                 throw iae;
             }
         } else {
-            l.log("sockstunnel <port>");
-            l.log("  creates a tunnel that distributes SOCKS requests.");
+            l.log("sockstunnel <port>\n" +
+                  "  creates a tunnel that distributes SOCKS requests.");
             notifyEvent("sockstunnelTaskId", Integer.valueOf(-1));
         }
     }
@@ -1075,8 +1184,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
                 throw iae;
             }
         } else {
-            l.log("socksirctunnel <port> [<sharedClient> [<privKeyFile>]]");
-            l.log("  creates a tunnel for SOCKS IRC.");
+            l.log("socksirctunnel <port> [<sharedClient> [<privKeyFile>]]\n" +
+                  "  creates a tunnel for SOCKS IRC.");
             notifyEvent("sockstunnelTaskId", Integer.valueOf(-1));
         }
     }
@@ -1125,8 +1234,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
                 throw iae;
             }
         } else {
-            l.log("streamrclient <host> <port> <destination>");
-            l.log("  creates a tunnel that receives streaming data.");
+            l.log("streamrclient <host> <port> <destination>\n" +
+                  "  creates a tunnel that receives streaming data.");
             notifyEvent("streamrtunnelTaskId", Integer.valueOf(-1));
         }
     }
@@ -1166,8 +1275,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             addtask(task);
             notifyEvent("streamrtunnelTaskId", Integer.valueOf(task.getId()));
         } else {
-            l.log("streamrserver <port> <privkeyfile>");
-            l.log("  creates a tunnel that sends streaming data.");
+            l.log("streamrserver <port> <privkeyfile>\n" +
+                  "  creates a tunnel that sends streaming data.");
             notifyEvent("streamrtunnelTaskId", Integer.valueOf(-1));
         }
     }
@@ -1195,12 +1304,12 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             port = args[i];
             notifyEvent("configResult", "ok");
         } else {
-            l.log("Usage:");
-            l.log("  config [-s] <i2phost> <i2pport>");
-            l.log("  sets the connection to the i2p router.");
-            l.log("Current setting:");
             boolean ssl = Boolean.parseBoolean(_clientOptions.getProperty("i2cp.SSL"));
-            l.log("  " + host + ' ' + port + (ssl ? " SSL" : ""));
+            l.log("Usage:\n" +
+                  "  config [-s] <i2phost> <i2pport>\n" +
+                  "  sets the connection to the i2p router.\n" +
+                  "Current setting:\n" +
+                  "  " + host + ' ' + port + (ssl ? " SSL" : ""));
             notifyEvent("configResult", "error");
         }
     }
@@ -1210,16 +1319,16 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
      *
      * @param args {username, password}
      * @param l logger to receive events and output
-     * @since 0.9.10
+     * @since 0.9.11
      */
     private void runAuth(String args[], Logging l) {
         if (args.length == 2) {
             _clientOptions.setProperty("i2cp.username", args[0]);
             _clientOptions.setProperty("i2cp.password", args[1]);
         } else {
-            l.log("Usage:");
-            l.log("  auth <username> <password>");
-            l.log("  Sets the i2cp credentials");
+            l.log("Usage:\n" +
+                  "  auth <username> <password>\n" +
+                  "  Sets the i2cp credentials");
         }
     }
 
@@ -1237,8 +1346,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             ownDest = args[0].equalsIgnoreCase("yes");
             notifyEvent("owndestResult", "ok");
         } else {
-            l.log("owndest yes|no");
-            l.log("  Specifies whether to use its own destination \n" + "  for each outgoing tunnel");
+            l.log("owndest yes|no\n" +
+                  "  Specifies whether to use its own destination \n" + "  for each outgoing tunnel");
             notifyEvent("owndestResult", "error");
         }
     }
@@ -1256,8 +1365,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             listenHost = args[0];
             notifyEvent("listen_onResult", "ok");
         } else {
-            l.log("listen_on <ip>");
-            l.log("  sets the interface to listen for the I2PClient.");
+            l.log("listen_on <ip>\n" +
+                  "  sets the interface to listen for the I2PClient.");
             notifyEvent("listen_onResult", "error");
         }
     }
@@ -1279,15 +1388,16 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             }
             notifyEvent("read_timeoutResult", "ok");
         } else {
-            l.log("read_timeout <msecs>");
-            l.log("  sets the read timeout (in milliseconds) for I2P connections\n"
+            l.log("read_timeout <msecs>\n" +
+                  "  sets the read timeout (in milliseconds) for I2P connections\n"
                   +"  Negative values will make the connections wait forever");
             notifyEvent("read_timeoutResult", "error");
         }
     }
 
     /**
-     * Generate a new keypair
+     * Generate a new keypair.
+     * Does NOT support non-default sig types.
      * Deprecated - only used by CLI
      *
      * Sets the event "genkeysResult" = "ok" or "error" after the generation is complete
@@ -1307,8 +1417,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
                 return;
             }
         } else if (args.length != 1) {
-            l.log("genkeys <privkeyfile> [<pubkeyfile>]");
-            l.log("   creates a new keypair and prints the public key.\n"
+            l.log("genkeys <privkeyfile> [<pubkeyfile>]\n" +
+                  "   creates a new keypair and prints the public key.\n"
                   + "   if pubkeyfile is given, saves the public key there." + "\n"
                   + "   if the privkeyfile already exists, just print/save" + "the pubkey.");
             //notifyEvent("genkeysResult", "error");
@@ -1330,7 +1440,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
     }
 
     /**
-     * Generate a new keypair
+     * Generate a new keypair.
+     * Does NOT support non-default sig types.
      * Deprecated - only used by CLI
      *
      * Sets the event "privateKey" = base64 of the privateKey stream and
@@ -1339,7 +1450,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
      * @param l logger to receive events and output
      */
     private static void runGenTextKeys(Logging l) {
-        ByteArrayOutputStream privkey = new ByteArrayOutputStream(512);
+        ByteArrayOutputStream privkey = new ByteArrayOutputStream(1024);
         ByteArrayOutputStream pubkey = new ByteArrayOutputStream(512);
         makeKey(privkey, pubkey, l);
         l.log("Private key: " + Base64.encode(privkey.toByteArray()));
@@ -1394,8 +1505,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
      */
     public void runClose(String args[], Logging l) {
         if (args.length == 0 || args.length > 2) {
-            l.log("close [forced] <jobnumber>|all");
-            l.log("   stop running tasks. either only one or all.\n"
+            l.log("close [forced] <jobnumber>|all\n" +
+                  "   stop running tasks. either only one or all.\n"
                   + "   use 'forced' to also stop tasks with active connections.\n"
                   + "   use the 'list' command to show the job numbers");
             notifyEvent("closeResult", "error");
@@ -1456,8 +1567,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
                 notifyEvent("runResult", "error");
             }
         } else {
-            l.log("run <commandfile>");
-            l.log("   loads commandfile and runs each line in it. \n"
+            l.log("run <commandfile>\n" +
+                  "   loads commandfile and runs each line in it. \n"
                   + "   You can also give the filename on the commandline.");
             notifyEvent("runResult", "error");
         }
@@ -1474,8 +1585,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
      */
     private void runLookup(String args[], Logging l) {
         if (args.length != 1) {
-            l.log("lookup <name>");
-            l.log("   try to resolve the name into a destination key");
+            l.log("lookup <name>\n" +
+                  "   try to resolve the name into a destination key");
             notifyEvent("lookupResult", "invalidUsage");
         } else {
             try {
@@ -1513,15 +1624,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             addtask(task);
             notifyEvent("pingTaskId", Integer.valueOf(task.getId()));
         } else {
-            l.log("ping <opts> <b64dest|host>");
-            l.log("ping <opts> -h (pings all hosts in hosts.txt)");
-            l.log("ping <opts> -l <destlistfile> (pings a list of hosts in a file)");
-            l.log("   Options:\n" +
-                  "     -c (require 5 consecutive pings to report success)\n" +
-                  "     -m maxSimultaneousPings (default 10)\n" +
-                  "     -n numberOfPings (default 3)\n" +
-                  "     -t timeout (ms, default 30000)\n");
-            l.log("   Tests communication with peers.\n");
+            l.log(I2Ping.usage());
             notifyEvent("pingTaskId", Integer.valueOf(-1));
         }
     }
@@ -1593,10 +1696,11 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
 
     /**
      * Create a new destination, storing the destination and its private keys where 
-     * instructed
+     * instructed.
+     * Does NOT support non-default sig types.
      * Deprecated - only used by CLI
      *
-     * @param writeTo location to store the private keys
+     * @param writeTo location to store the destination and private keys
      * @param pubDest location to store the destination
      * @param l logger to send messages to
      */
@@ -1605,8 +1709,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
             l.log("Generating new keys...");
             I2PClient client = I2PClientFactory.createClient();
             Destination d = client.createDestination(writeTo);
-            l.log("Secret key saved.");
-            l.log("Public key: " + d.toBase64());
+            l.log("Secret key saved.\n" +
+                  "Public key: " + d.toBase64());
             writeTo.flush();
             writeTo.close();
             writePubKey(d, pubDest, l);
@@ -1673,7 +1777,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
      *  @param i2cpPort may be null
      *  @param user may be null
      *  @param pw may be null
-     *  @since 0.9.10
+     *  @since 0.9.11
      */
     private static Destination destFromName(String name, String i2cpHost,
                                             String i2cpPort, boolean isSSL,
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java
index 17ea0019f0b62b71d17ad3abce99c7842d328f36..5b06e271b6e5461cf337c350ae183c93b6a1ae03 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java
@@ -55,7 +55,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
     private int localPort;
 
     /**
-     *  Protected for I2Ping since 0.9.10. Not for use outside package.
+     *  Protected for I2Ping since 0.9.11. Not for use outside package.
      */
     protected boolean listenerReady;
 
@@ -586,7 +586,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
     }
 
     /**
-     *  Non-final since 0.9.10.
+     *  Non-final since 0.9.11.
      *  Any overrides must set listenerReady = true.
      */
     public void run() {
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java
index 2ae58a39844e5db7eb7ea899867807f3897e35c7..9abcdd0fd61162a12d0b044db7a6aba9d60de0e9 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java
@@ -24,6 +24,7 @@ import net.i2p.I2PAppContext;
 import net.i2p.client.streaming.I2PSocketManager;
 import net.i2p.data.Base64;
 import net.i2p.data.DataHelper;
+import net.i2p.util.EepGet;
 import net.i2p.util.EventDispatcher;
 import net.i2p.util.InternalSocket;
 import net.i2p.util.Log;
@@ -409,60 +410,8 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
      *  @since 0.9.4
      */
     private static Map<String, String> parseArgs(String args) {
-        Map<String, String> rv = new HashMap<String, String>(8);
-        char data[] = args.toCharArray();
-        StringBuilder buf = new StringBuilder(32);
-        boolean isQuoted = false;
-        String key = null;
-        for (int i = 0; i < data.length; i++) {
-            switch (data[i]) {
-                case '\"':
-                    if (isQuoted) {
-                        // keys never quoted
-                        if (key != null) {
-                            rv.put(key, buf.toString().trim());
-                            key = null;
-                        }
-                        buf.setLength(0);
-                    }
-                    isQuoted = !isQuoted;
-                    break;
-
-                case ' ':
-                case '\r':
-                case '\n':
-                case '\t':
-                case ',':
-                    // whitespace - if we're in a quoted section, keep this as part of the quote,
-                    // otherwise use it as a delim
-                    if (isQuoted) {
-                        buf.append(data[i]);
-                    } else {
-                        if (key != null) {
-                            rv.put(key, buf.toString().trim());
-                            key = null;
-                        }
-                        buf.setLength(0);
-                    }
-                    break;
-
-                case '=':
-                    if (isQuoted) {
-                        buf.append(data[i]);
-                    } else {
-                        key = buf.toString().trim().toLowerCase(Locale.US);
-                        buf.setLength(0);
-                    }
-                    break;
-
-                default:
-                    buf.append(data[i]);
-                    break;
-            }
-        }
-        if (key != null)
-            rv.put(key, buf.toString().trim());
-        return rv;
+        // moved to EepGet, since it needs this too
+        return EepGet.parseAuthArgs(args);
     }
 
     //////// Error page stuff
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java
index e9a9a5b2122b458d6c7fe7cf952aa20ca9aa467a..66351f74931edc90f9b7da5a6eadd1bcaaf90c58 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java
@@ -18,6 +18,7 @@ import javax.net.ssl.SSLException;
 import net.i2p.I2PAppContext;
 import net.i2p.client.streaming.I2PSocket;
 import net.i2p.data.ByteArray;
+import net.i2p.data.DataHelper;
 import net.i2p.util.ByteCache;
 import net.i2p.util.Clock;
 import net.i2p.util.I2PAppThread;
@@ -137,6 +138,8 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
     protected InputStream getSocketIn() throws IOException { return s.getInputStream(); }
     protected OutputStream getSocketOut() throws IOException { return s.getOutputStream(); }
     
+    private static final byte[] POST = { 'P', 'O', 'S', 'T', ' ' };
+
     @Override
     public void run() {
         try {
@@ -159,8 +162,12 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
                     // So we now get a fast return from flush(), and can do it here to save 250 ms.
                     // To make sure we are under the initial window size and don't hang waiting for accept,
                     // only flush if it fits in one message.
-                    if (initialI2PData.length <= 1730)   // ConnectionOptions.DEFAULT_MAX_MESSAGE_SIZE
-                        i2pout.flush();
+                    if (initialI2PData.length <= 1730) {  // ConnectionOptions.DEFAULT_MAX_MESSAGE_SIZE
+                        // Don't flush if POST, so we can get POST data into the initial packet
+                        if (initialI2PData.length < 5 ||
+                            !DataHelper.eq(POST, 0, initialI2PData, 0, 5))
+                            i2pout.flush();
+                    }
                 //}
             }
             if (initialSocketData != null) {
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java
index a41ae15ed9f2307517f71b8b78d5249efa66f7f6..e8321e41acf4dcaaceacaaab79994f653bcd44ed 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java
@@ -11,6 +11,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
+import gnu.getopt.Getopt;
+
 import net.i2p.I2PAppContext;
 import net.i2p.I2PException;
 import net.i2p.client.I2PSession;
@@ -86,48 +88,76 @@ public class I2Ping extends I2PTunnelClientBase {
       int count = PING_COUNT;
       boolean countPing = false;
       boolean reportTimes = true;
-      while (true) {
-        if (cmd.startsWith("-t ")) { // timeout
-            cmd = cmd.substring(3);
-            int pos = cmd.indexOf(" ");
-            if (pos == -1) {
-                l.log("Syntax error");
-                return;
-            } else {
-                timeout = Long.parseLong(cmd.substring(0, pos));
+      String hostListFile = null;
+      int localPort = 0;
+      int remotePort = 0;
+      boolean error = false;
+      String[] argv = cmd.split(" ");
+      Getopt g = new Getopt("ping", argv, "t:m:n:chl:f:p:");
+      int c;
+      while ((c = g.getopt()) != -1) {
+        switch (c) {
+          case 't':  // timeout
+            timeout = Long.parseLong(g.getOptarg());
                 // convenience, convert msec to sec
                 if (timeout < 100)
                     timeout *= 1000;
-                cmd = cmd.substring(pos + 1);
-            }
-        } else if (cmd.startsWith("-m ")) { // max simultaneous pings
-            cmd = cmd.substring(3);
-            int pos = cmd.indexOf(" ");
-            if (pos == -1) {
-                l.log("Syntax error");
-                return;
-            } else {
-                MAX_SIMUL_PINGS = Integer.parseInt(cmd.substring(0, pos));
-                cmd = cmd.substring(pos + 1);
-            }
-        } else if (cmd.startsWith("-n ")) { // number of pings
-            cmd = cmd.substring(3);
-            int pos = cmd.indexOf(" ");
-            if (pos == -1) {
-                l.log("Syntax error");
-                return;
-            } else {
-                count = Integer.parseInt(cmd.substring(0, pos));
-                cmd = cmd.substring(pos + 1);
-            }
-        } else if (cmd.startsWith("-c ")) { // "count" ping
+            break;
+
+          case 'm': // max simultaneous pings
+            MAX_SIMUL_PINGS = Integer.parseInt(g.getOptarg());
+            break;
+
+          case 'n': // number of pings
+            count = Integer.parseInt(g.getOptarg());
+            break;
+
+          case 'c': // "count" ping
             countPing = true;
             count = CPING_COUNT;
-            cmd = cmd.substring(3);
-        } else if (cmd.equals("-h")) { // ping all hosts
-            cmd = "-l hosts.txt";
-        } else if (cmd.startsWith("-l ")) { // ping a list of hosts
-            BufferedReader br = new BufferedReader(new FileReader(cmd.substring(3)));
+            break;
+
+          case 'h': // ping all hosts
+            if (hostListFile != null)
+                error = true;
+            else
+                hostListFile = "hosts.txt";
+            break;
+
+          case 'l':  // ping a list of hosts
+            if (hostListFile != null)
+                error = true;
+            else
+                hostListFile = g.getOptarg();
+            break;
+
+          case 'f': // local port
+            localPort = Integer.parseInt(g.getOptarg());
+            break;
+
+          case 'p': // remote port
+            remotePort = Integer.parseInt(g.getOptarg());
+            break;
+
+          case '?':
+          case ':':
+          default:
+            error = true;
+        }
+      }
+
+      int remaining = argv.length - g.getOptind();
+
+      if (error ||
+          remaining > 1 ||
+          (remaining <= 0 && hostListFile == null) ||
+          (remaining > 0 && hostListFile != null)) {
+          System.out.println(usage());
+          return;
+      }
+
+      if (hostListFile != null) {
+            BufferedReader br = new BufferedReader(new FileReader(hostListFile));
             String line;
             List<PingHandler> pingHandlers = new ArrayList<PingHandler>();
             int i = 0;
@@ -138,7 +168,8 @@ public class I2Ping extends I2PTunnelClientBase {
                 if (line.indexOf("=") != -1) { // maybe file is hosts.txt?
                     line = line.substring(0, line.indexOf("="));
                 }
-                PingHandler ph = new PingHandler(line, count, timeout, countPing, reportTimes);
+                PingHandler ph = new PingHandler(line, count, localPort, remotePort,
+                                                 timeout, countPing, reportTimes);
                 ph.start();
                 pingHandlers.add(ph);
                 if (++i > 1)
@@ -148,13 +179,31 @@ public class I2Ping extends I2PTunnelClientBase {
             for (Thread t : pingHandlers)
                 t.join();
             return;
-        } else {
-            Thread t = new PingHandler(cmd, count, timeout, countPing, reportTimes);
-            t.start();
-            t.join();
-            return;
-        }
       }
+
+      String host = argv[g.getOptind()];
+      Thread t = new PingHandler(host, count, localPort, remotePort,
+                                 timeout, countPing, reportTimes);
+      t.start();
+      t.join();
+    }
+
+    /**
+     *  With newlines except for last line
+     *  @since 0.9.12
+     */
+    public static String usage() {
+        return
+            "ping <opts> <b64dest|host>\n" +
+            "ping <opts> -h (pings all hosts in hosts.txt)\n" +
+            "ping <opts> -l <destlistfile> (pings a list of hosts in a file)\n" +
+            "Options:\n" +
+            "     -c (require 5 consecutive pings to report success)\n" +
+            "     -m maxSimultaneousPings (default 10)\n" +
+            "     -n numberOfPings (default 3)\n" +
+            "     -t timeout (ms, default 30000)\n" +
+            "     -f fromPort\n" +
+            "     -p toPort";
     }
 
     @Override
@@ -170,7 +219,7 @@ public class I2Ping extends I2PTunnelClientBase {
         return true;
     }
 
-    private boolean ping(Destination dest, long timeout) throws I2PException {
+    private boolean ping(Destination dest, int fromPort, int toPort, long timeout) throws I2PException {
         try {
             synchronized (simulLock) {
                 while (simulPings >= MAX_SIMUL_PINGS) {
@@ -183,7 +232,7 @@ public class I2Ping extends I2PTunnelClientBase {
                 }
                 lastPingTime = System.currentTimeMillis();
             }
-            boolean sent = sockMgr.ping(dest, timeout);
+            boolean sent = sockMgr.ping(dest, fromPort, toPort, timeout);
             synchronized (simulLock) {
                 simulPings--;
                 simulLock.notifyAll();
@@ -197,7 +246,7 @@ public class I2Ping extends I2PTunnelClientBase {
 
     /**
      *  Does nothing.
-     *  @since 0.9.10
+     *  @since 0.9.11
      */
     protected void clientConnectionRun(Socket s) {}
 
@@ -207,15 +256,20 @@ public class I2Ping extends I2PTunnelClientBase {
         private final long timeout;
         private final boolean countPing;
         private final boolean reportTimes;
+        private final int localPort;
+        private final int remotePort;
 
         /**
-         *  As of 0.9.10, does NOT start itself.
+         *  As of 0.9.11, does NOT start itself.
          *  Caller must call start()
          *  @param dest b64 or b32 or host name
          */
-        public PingHandler(String dest, int count, long timeout, boolean countPings, boolean report) {
+        public PingHandler(String dest, int count, int fromPort, int toPort,
+                           long timeout, boolean countPings, boolean report) {
             this.destination = dest;
             cnt = count;
+            localPort = fromPort;
+            remotePort = toPort;
             this.timeout = timeout;
             countPing = countPings;
             reportTimes = report;
@@ -235,8 +289,7 @@ public class I2Ping extends I2PTunnelClientBase {
                 long totalTime = 0;
                 StringBuilder pingResults = new StringBuilder(2 * cnt + destination.length() + 3);
                 for (int i = 0; i < cnt; i++) {
-                    boolean sent;
-                    sent = ping(dest, timeout);
+                    boolean sent = ping(dest, localPort, remotePort, timeout);
                     if (countPing) {
                         if (!sent) {
                             pingResults.append(i).append(" ");
@@ -276,7 +329,7 @@ public class I2Ping extends I2PTunnelClientBase {
 
         /**
          *  @param name b64 or b32 or host name
-         *  @since 0.9.10
+         *  @since 0.9.11
          */
         private Destination lookup(String name) {
             I2PAppContext ctx = I2PAppContext.getGlobalContext();
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
index 1b1fdefcfabf14576c874702e68ae93e5f56d407..5936b6936fcd01aaeeec76f8f1b799c034357c49 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
@@ -7,11 +7,13 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+
 import net.i2p.I2PAppContext;
 import net.i2p.I2PException;
 import net.i2p.client.I2PClient;
 import net.i2p.client.I2PClientFactory;
 import net.i2p.client.I2PSession;
+import net.i2p.crypto.SigType;
 import net.i2p.data.Base32;
 import net.i2p.data.Destination;
 import net.i2p.i2ptunnel.socks.I2PSOCKSTunnel;
@@ -49,8 +51,8 @@ public class TunnelController implements Logging {
      * the prefix should be used (and, in turn, that prefix should be stripped off
      * before being interpreted by this controller)
      * 
-     * @param config original key=value mapping
-     * @param prefix beginning of key values that are relevent to this tunnel
+     * @param config original key=value mapping non-null
+     * @param prefix beginning of key values that are relevant to this tunnel
      */
     public TunnelController(Properties config, String prefix) {
         this(config, prefix, true);
@@ -58,6 +60,8 @@ public class TunnelController implements Logging {
 
     /**
      * 
+     * @param config original key=value mapping non-null
+     * @param prefix beginning of key values that are relevant to this tunnel
      * @param createKey for servers, whether we want to create a brand new destination
      *                  with private keys at the location specified or not (does not
      *                  overwrite existing ones)
@@ -99,7 +103,16 @@ public class TunnelController implements Logging {
         FileOutputStream fos = null;
         try {
             fos = new SecureFileOutputStream(keyFile);
-            Destination dest = client.createDestination(fos);
+            SigType stype = I2PClient.DEFAULT_SIGTYPE;
+            String st = _config.getProperty("option." + I2PClient.PROP_SIGTYPE);
+            if (st != null) {
+                SigType type = SigType.parseSigType(st);
+                if (type != null)
+                    stype = type;
+                else
+                    log("Unsupported sig type " + st);
+            }
+            Destination dest = client.createDestination(fos, stype);
             String destStr = dest.toBase64();
             log("Private key created and saved in " + keyFile.getAbsolutePath());
             log("You should backup this file in a secure place.");
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java
index 425cfb9ca2c089e7419c59a5594379f346aec81d..f1e8abaabeb88adb3eb4931c1b151eb4626c8fb1 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java
@@ -12,6 +12,7 @@ import net.i2p.client.I2PClient;
 import net.i2p.client.I2PClientFactory;
 import net.i2p.client.I2PSession;
 import net.i2p.client.I2PSessionException;
+import net.i2p.crypto.SigType;
 import net.i2p.data.Destination;
 import net.i2p.i2ptunnel.I2PTunnel;
 import net.i2p.i2ptunnel.I2PTunnelTask;
@@ -78,8 +79,17 @@ import net.i2p.util.EventDispatcher;
         I2PClient client = I2PClientFactory.createClient();
         byte[] key;
         try {
-            ByteArrayOutputStream out = new ByteArrayOutputStream(512);
-            client.createDestination(out);
+            ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
+            SigType stype = I2PClient.DEFAULT_SIGTYPE;
+            String st = tunnel.getClientOptions().getProperty(I2PClient.PROP_SIGTYPE);
+            if (st != null) {
+                SigType type = SigType.parseSigType(st);
+                if (type != null)
+                    stype = type;
+                else
+                    l.log("Unsupported sig type " + st);
+            }
+            client.createDestination(out, stype);
             key = out.toByteArray();
         } catch(Exception exc) {
             throw new RuntimeException("failed to create i2p-destination", exc);
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 990d2d1f1e9b2470aca22dce1fcd76c7495fff57..77c89319b0648edadd37486962b179797a29d843 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
@@ -14,6 +14,7 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.TreeMap;
 
+import net.i2p.client.I2PClient;
 import net.i2p.data.Base64;
 import net.i2p.data.Destination;
 import net.i2p.data.PrivateKeyFile;
@@ -177,6 +178,11 @@ public class EditBean extends IndexBean {
         return getBooleanProperty(tunnel, "i2cp.encryptLeaseSet");
     }
     
+    /** @since 0.9.12 */
+    public int getSigType(int tunnel) {
+        return getProperty(tunnel, I2PClient.PROP_SIGTYPE, 0);
+    }
+    
     /** @since 0.8.9 */
     public boolean getDCC(int tunnel) {
         return getBooleanProperty(tunnel, I2PTunnelIRCClient.PROP_DCC);
@@ -358,6 +364,11 @@ public class EditBean extends IndexBean {
         return Addresses.getAllAddresses();
     }
 
+    /** @since 0.9.12 */
+    public boolean isAdvanced() {
+        return _context.getBooleanProperty("routerconsole.advanced");
+    }
+
     public String getI2CPHost(int tunnel) {
         if (_context.isRouterContext())
             return _("internal");
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 f674f490c3390e14da35764f090773fdc169fee7..9b9ad31ad45e76bd505e08f40d036fd3fc98892e 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
@@ -24,6 +24,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import net.i2p.I2PAppContext;
 import net.i2p.app.ClientAppManager;
 import net.i2p.app.Outproxy;
+import net.i2p.client.I2PClient;
 import net.i2p.data.Base32;
 import net.i2p.data.Certificate;
 import net.i2p.data.Destination;
@@ -983,6 +984,7 @@ public class IndexBean {
             } catch (NumberFormatException nfe) {}
         }
     }
+
     public void setCert(String val) {
         if (val != null) {
             try {
@@ -990,10 +992,24 @@ public class IndexBean {
             } catch (NumberFormatException nfe) {}
         }
     }
+
     public void setSigner(String val) {
         _certSigner = val;
     }
 
+    /** @since 0.9.12 */
+    public void setSigType(String val) {
+        if (val != null) {
+            _otherOptions.put(I2PClient.PROP_SIGTYPE, val);
+            if (val.equals("0"))
+                _certType = 0;
+            else
+                _certType = 5;
+        }
+        // TODO: Call modifyDestination??
+        // Otherwise this only works on a new tunnel...
+    }
+
     /** Modify or create a destination */
     private String modifyDestination() {
         if (_privKeyFile == null || _privKeyFile.trim().length() <= 0)
@@ -1234,13 +1250,14 @@ public class IndexBean {
         "outproxyUsername", "outproxyPassword",
         I2PTunnelHTTPClient.PROP_JUMP_SERVERS,
         I2PTunnelHTTPClientBase.PROP_AUTH,
+        I2PClient.PROP_SIGTYPE,
         I2PTunnelHTTPClient.PROP_SSL_OUTPROXIES
         };
     private static final String _otherServerOpts[] = {
         "i2cp.reduceIdleTime", "i2cp.reduceQuantity", "i2cp.leaseSetKey", "i2cp.accessList",
          PROP_MAX_CONNS_MIN, PROP_MAX_CONNS_HOUR, PROP_MAX_CONNS_DAY,
          PROP_MAX_TOTAL_CONNS_MIN, PROP_MAX_TOTAL_CONNS_HOUR, PROP_MAX_TOTAL_CONNS_DAY,
-         PROP_MAX_STREAMS
+         PROP_MAX_STREAMS, I2PClient.PROP_SIGTYPE
         };
     private static final String _httpServerOpts[] = {
         I2PTunnelHTTPServer.OPT_POST_WINDOW,
diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp
index ff397556cfc5f750a9ca7984c1799b088a0e73ee..2b560173c876fc22a1244a42aaf3496ac1e0d8b3 100644
--- a/apps/i2ptunnel/jsp/editClient.jsp
+++ b/apps/i2ptunnel/jsp/editClient.jsp
@@ -449,6 +449,37 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
             </div>
          <% } %>
            
+         <% if (editBean.isAdvanced()) { %>
+            <div id="tunnelOptionsField" class="rowItem">
+                <label>
+                    <%=intl._("Signature type")%>
+                    (<%=intl._("Experts only!")%>)
+                </label>
+            </div>
+            <div id="hostField" class="rowItem">
+              <div id="portField" class="rowItem">
+                <label>DSA-SHA1</label>
+                <input value="0" type="radio" id="startOnLoad" name="sigType" title="Default"<%=(editBean.getSigType(curTunnel)==0 ? " checked=\"checked\"" : "")%> class="tickbox" />                
+              </div>
+              <div id="portField" class="rowItem">
+                <label>ECDSA-P256</label>
+                <input value="1" type="radio" id="startOnLoad" name="sigType" title="Advanced users only"<%=(editBean.getSigType(curTunnel)==1 ? " checked=\"checked\"" : "")%> class="tickbox" />                
+              </div>
+              <div id="portField" class="rowItem">
+                <label>ECDSA-P384</label>
+                <input value="2" type="radio" id="startOnLoad" name="sigType" title="Advanced users only"<%=(editBean.getSigType(curTunnel)==2 ? " checked=\"checked\"" : "")%> class="tickbox" />                
+              </div>
+              <div id="portField" class="rowItem">
+                <label>ECDSA-P521</label>
+                <input value="3" type="radio" id="startOnLoad" name="sigType" title="Advanced users only"<%=(editBean.getSigType(curTunnel)==3 ? " checked=\"checked\"" : "")%> class="tickbox" />                
+              </div>
+            </div>
+                 
+            <div class="subdivider">
+                <hr />
+            </div>
+         <% } // isAdvanced %>>
+
          <% if ("httpclient".equals(tunnelType) || "connectclient".equals(tunnelType) || "sockstunnel".equals(tunnelType) || "socksirctunnel".equals(tunnelType)) { %>
             <div id="accessField" class="rowItem">
                 <label><%=intl._("Local Authorization")%>:</label>
diff --git a/apps/i2ptunnel/jsp/editServer.jsp b/apps/i2ptunnel/jsp/editServer.jsp
index a6c8e7413820032c62294bf8277c00ecec60e634..978afd63acb677acf687067b02b682fdb3dedd7f 100644
--- a/apps/i2ptunnel/jsp/editServer.jsp
+++ b/apps/i2ptunnel/jsp/editServer.jsp
@@ -491,6 +491,7 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
                 <hr />
             </div>
            
+<% /***************** %>
             <div id="tunnelOptionsField" class="rowItem">
                 <label for="cert" accesskey="c">
                     <%=intl._("New Certificate type")%>(<span class="accessKey">C</span>):
@@ -533,10 +534,38 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
                 <button accesskey="S" class="control" type="submit" name="action" value="Modify" title="Force New Cert Now"><%=intl._("Modify")%></button>
                 <span class="comment"><%=intl._("(Tunnel must be stopped first)")%></span>
             </div>
+<% **********************/ %>
+
+         <% if (editBean.isAdvanced()) { %>
+            <div id="tunnelOptionsField" class="rowItem">
+                <label>
+                    <%=intl._("Signature type")%>
+                    (<%=intl._("Experts only! Changes B32!")%>)
+                </label>
+            </div>
+            <div id="hostField" class="rowItem">
+              <div id="portField" class="rowItem">
+                <label>DSA-SHA1</label>
+                <input value="0" type="radio" id="startOnLoad" name="sigType" title="Default"<%=(editBean.getSigType(curTunnel)==0 ? " checked=\"checked\"" : "")%> class="tickbox" />                
+              </div>
+              <div id="portField" class="rowItem">
+                <label>ECDSA-P256</label>
+                <input value="1" type="radio" id="startOnLoad" name="sigType" title="Advanced users only"<%=(editBean.getSigType(curTunnel)==1 ? " checked=\"checked\"" : "")%> class="tickbox" />                
+              </div>
+              <div id="portField" class="rowItem">
+                <label>ECDSA-P384</label>
+                <input value="2" type="radio" id="startOnLoad" name="sigType" title="Advanced users only"<%=(editBean.getSigType(curTunnel)==2 ? " checked=\"checked\"" : "")%> class="tickbox" />                
+              </div>
+              <div id="portField" class="rowItem">
+                <label>ECDSA-P521</label>
+                <input value="3" type="radio" id="startOnLoad" name="sigType" title="Advanced users only"<%=(editBean.getSigType(curTunnel)==3 ? " checked=\"checked\"" : "")%> class="tickbox" />                
+              </div>
+            </div>
                  
             <div class="subdivider">
                 <hr />
             </div>
+         <% } // isAdvanced %>>
                  
             <div id="customOptionsField" class="rowItem">
                 <label for="customOptions" accesskey="u">
diff --git a/apps/i2ptunnel/locale-proxy/messages_en.po b/apps/i2ptunnel/locale-proxy/messages_en.po
index 5e9b0d53d2b0430a4070e76d021b2ad569e14539..d3a4fa3eb3ca1a383f045f462a0308bd0339673d 100644
--- a/apps/i2ptunnel/locale-proxy/messages_en.po
+++ b/apps/i2ptunnel/locale-proxy/messages_en.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P i2ptunnel\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-12-01 20:06+0000\n"
+"POT-Creation-Date: 2014-02-06 18:27+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"
@@ -339,25 +339,22 @@ msgid "The request uses a bad protocol."
 msgstr ""
 
 #: ../java/build/Proxy.java:133
-#, java-format
-msgid "The I2P HTTP Proxy supports {0}http://{1} requests ONLY."
+msgid "The I2P HTTP Proxy supports HTTP and HTTPS requests only."
 msgstr ""
 
 #: ../java/build/Proxy.java:134
-#, java-format
-msgid ""
-"Other protocols such as {0}https://{1} and {0}ftp://{1} are not allowed."
+msgid "Other protocols such as FTP are not allowed."
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:571
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:595
 msgid "This seems to be a bad destination:"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:571
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:595
 msgid "i2paddresshelper cannot help you with a destination like that!"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:638
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:662
 #, java-format
 msgid ""
 "To visit the destination in your host database, click <a href=\"{0}\">here</"
@@ -365,50 +362,50 @@ msgid ""
 "\"{1}\">here</a>."
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1042
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1151
 msgid "Host"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1046
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1155
 msgid "Base 32"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1050
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1159
 msgid "Destination"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1056
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1165
 #, java-format
 msgid "Continue to {0} without saving"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1061
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1170
 #, 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:1064
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1173
 #, java-format
 msgid "Save {0} to master address book and continue to eepsite"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1065
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1174
 #, java-format
 msgid "Save {0} to private address book and continue to eepsite"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1180
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1290
 msgid "HTTP Outproxy"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1216
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1326
 msgid ""
 "Click a link below to look for an address helper by using a \"jump\" service:"
 msgstr ""
 
 #. Translators: parameter is a host name
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1224
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1334
 #, java-format
 msgid "{0} jump service"
 msgstr ""
diff --git a/apps/i2ptunnel/locale-proxy/messages_pt.po b/apps/i2ptunnel/locale-proxy/messages_pt.po
index 41bb1146e75f744e58533dd83c0f0b5f6f142356..82c458a6d8733a5f678f215d3ceedf0c7952f330 100644
--- a/apps/i2ptunnel/locale-proxy/messages_pt.po
+++ b/apps/i2ptunnel/locale-proxy/messages_pt.po
@@ -4,6 +4,7 @@
 # To contribute translations, see http://www.i2p2.de/newdevelopers
 # 
 # Translators:
+# kgtm <fabio.h.f.antunes@gmail.com>, 2014
 # hxdcmls, 2013
 # hxdcmls, 2013
 # rafaelbf, 2013
@@ -14,8 +15,8 @@ msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-12-01 20:06+0000\n"
-"PO-Revision-Date: 2013-11-19 23:51+0000\n"
-"Last-Translator: kytv <killyourtv@i2pmail.org>\n"
+"PO-Revision-Date: 2014-01-22 18:42+0000\n"
+"Last-Translator: kgtm <fabio.h.f.antunes@gmail.com>\n"
 "Language-Team: Portuguese (http://www.transifex.com/projects/p/I2P/language/pt/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -432,15 +433,15 @@ msgstr "Adicionado pelo auxiliar de endereços"
 
 #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:187
 msgid "router"
-msgstr ""
+msgstr "roteador"
 
 #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:189
 msgid "master"
-msgstr ""
+msgstr "mestre"
 
 #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:191
 msgid "private"
-msgstr ""
+msgstr "privado"
 
 #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:198
 #, java-format
diff --git a/apps/i2ptunnel/locale-proxy/messages_pt_BR.po b/apps/i2ptunnel/locale-proxy/messages_pt_BR.po
index 8e318df797fe284a8f27971fa9d27bd7f2f3e5f6..fc90e42bbaab49ae81efd1201dab1dd0a1b139b5 100644
--- a/apps/i2ptunnel/locale-proxy/messages_pt_BR.po
+++ b/apps/i2ptunnel/locale-proxy/messages_pt_BR.po
@@ -2,23 +2,22 @@
 # Copyright (C) 2009 The I2P Project
 # This file is distributed under the same license as the i2ptunnel package.
 # To contribute translations, see http://www.i2p2.de/newdevelopers
-#
+# 
 # Translators:
 # blueboy, 2013
-# blueboy, 2013
+# blueboy, 2013-2014
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-01-09 18:16+0000\n"
-"PO-Revision-Date: 2013-12-13 11:55+0000\n"
+"POT-Creation-Date: 2013-12-01 20:06+0000\n"
+"PO-Revision-Date: 2014-01-29 00:46+0000\n"
 "Last-Translator: blueboy\n"
-"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/"
-"language/pt_BR/)\n"
-"Language: pt_BR\n"
+"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: pt_BR\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 #: ../java/build/Proxy.java:5 ../java/build/Proxy.java:11
@@ -94,8 +93,8 @@ msgstr ""
 #: ../java/build/Proxy.java:15
 #, java-format
 msgid ""
-"If you continue to have trouble you may want to edit your outproxy list {0}"
-"here{1}."
+"If you continue to have trouble you may want to edit your outproxy list "
+"{0}here{1}."
 msgstr ""
 
 #: ../java/build/Proxy.java:16 ../java/build/Proxy.java:38
@@ -113,7 +112,7 @@ msgstr "Erro: Acesso Local"
 
 #: ../java/build/Proxy.java:24
 msgid "Your browser is misconfigured."
-msgstr ""
+msgstr "O seu navegador está mal-configurado."
 
 #: ../java/build/Proxy.java:25
 msgid ""
@@ -140,14 +139,12 @@ msgstr "Verifique o linque ou procure por um endereço de Base 32 ou Base 64."
 #: ../java/build/Proxy.java:35
 #, java-format
 msgid "If you have the Base 64 address, {0}add it to your addressbook{1}."
-msgstr ""
-"Se você tem o endereço de Base 64, {0}adicione-o ao seu livro de "
-"endereços{1}."
+msgstr "Se você tem o endereço de Base 64, {0}adicione-o ao seu livro de endereços{1}."
 
 #: ../java/build/Proxy.java:36
 msgid ""
-"Otherwise, find a Base 32 or address helper link, or use a jump service link "
-"below."
+"Otherwise, find a Base 32 or address helper link, or use a jump service link"
+" below."
 msgstr ""
 
 #: ../java/build/Proxy.java:37
@@ -183,8 +180,8 @@ msgstr ""
 
 #: ../java/build/Proxy.java:56
 msgid ""
-"Perhaps you pasted in the wrong Base 64 string or the link you are following "
-"is bad."
+"Perhaps you pasted in the wrong Base 64 string or the link you are following"
+" is bad."
 msgstr ""
 
 #: ../java/build/Proxy.java:57
@@ -212,9 +209,7 @@ msgstr "Aviso: Nenhum proxy de saída configurado"
 msgid ""
 "Your request was for a site outside of I2P, but you have no HTTP outproxy "
 "configured."
-msgstr ""
-"O seu pedido foi para um site fora da I2P, mas você não possui nenhum proxy "
-"de saída para HTTP configurado"
+msgstr "O seu pedido foi para um site fora da I2P, mas você não possui nenhum proxy de saída para HTTP configurado"
 
 #: ../java/build/Proxy.java:76
 msgid "Please configure an outproxy in I2PTunnel."
@@ -222,7 +217,7 @@ msgstr "Por favor, configurar um proxy de saída no túnel I2P."
 
 #: ../java/build/Proxy.java:77 ../java/build/Proxy.java:83
 msgid "Warning: Destination Key Conflict"
-msgstr ""
+msgstr "Aviso: Conflito de chave de destino"
 
 #: ../java/build/Proxy.java:84
 msgid ""
@@ -232,8 +227,8 @@ msgstr ""
 
 #: ../java/build/Proxy.java:85
 msgid ""
-"Someone could be trying to impersonate another eepsite, or people have given "
-"two eepsites identical names."
+"Someone could be trying to impersonate another eepsite, or people have given"
+" two eepsites identical names."
 msgstr ""
 
 #: ../java/build/Proxy.java:86
@@ -249,28 +244,26 @@ msgstr "Autorização do proxy necessária"
 
 #: ../java/build/Proxy.java:88
 msgid "I2P HTTP Proxy Authorization Required"
-msgstr ""
+msgstr "É necessária a autorização do proxy http da I2P"
 
 #: ../java/build/Proxy.java:89
-msgid "This proxy is configured to require a username and password for access."
-msgstr ""
-"Este proxy está configurado para pedir um nome de usuário e uma senha para "
-"acesso."
+msgid ""
+"This proxy is configured to require a username and password for access."
+msgstr "Este proxy está configurado para pedir um nome de usuário e uma senha para acesso."
 
 #: ../java/build/Proxy.java:90
 #, java-format
 msgid ""
 "Please enter your username and password, or check your {0}router "
 "configuration{1} or {2}I2PTunnel configuration{3}."
-msgstr ""
-"Por favor, forneça o seu nome de usuário e senha, ou verifique sua {0}"
-"configuração de roteamento{1} ou {2}configuração do túnel I2P{3};"
+msgstr "Por favor, forneça o seu nome de usuário e senha, ou verifique sua {0}configuração de roteamento{1} ou {2}configuração do túnel I2P{3};"
 
 #: ../java/build/Proxy.java:91
 #, java-format
 msgid ""
-"To disable authorization, remove the configuration {0}i2ptunnel.proxy."
-"auth=basic{1}, then stop and restart the HTTP Proxy tunnel."
+"To disable authorization, remove the configuration "
+"{0}i2ptunnel.proxy.auth=basic{1}, then stop and restart the HTTP Proxy "
+"tunnel."
 msgstr ""
 
 #: ../java/build/Proxy.java:92 ../java/build/Proxy.java:98
@@ -279,7 +272,7 @@ msgstr "Aviso: eepsite inalcançável"
 
 #: ../java/build/Proxy.java:99
 msgid "The eepsite was not reachable."
-msgstr ""
+msgstr "O eepsite não se encontra alcançável."
 
 #: ../java/build/Proxy.java:100
 msgid ""
@@ -293,7 +286,7 @@ msgstr "Informação: novo nome de host"
 
 #: ../java/build/Proxy.java:109
 msgid "Information: New Host Name with Address Helper"
-msgstr ""
+msgstr "Informação: novo nome de host com auxiliar de endereço"
 
 #: ../java/build/Proxy.java:110
 msgid ""
@@ -312,8 +305,8 @@ msgstr ""
 
 #: ../java/build/Proxy.java:113
 msgid ""
-"If you do not save it, the host name will be forgotten after the next router "
-"restart."
+"If you do not save it, the host name will be forgotten after the next router"
+" restart."
 msgstr ""
 
 #: ../java/build/Proxy.java:114
@@ -324,7 +317,7 @@ msgstr ""
 
 #: ../java/build/Proxy.java:115 ../java/build/Proxy.java:121
 msgid "Warning: Bad Address Helper"
-msgstr ""
+msgstr "Aviso: Auxiliar de endereço ruim"
 
 #: ../java/build/Proxy.java:122
 #, java-format
@@ -343,7 +336,7 @@ msgstr ""
 
 #: ../java/build/Proxy.java:125 ../java/build/Proxy.java:131
 msgid "Warning: Non-HTTP Protocol"
-msgstr ""
+msgstr "Aviso: Protocolo não-HTTP"
 
 #: ../java/build/Proxy.java:132
 msgid "The request uses a bad protocol."
@@ -352,15 +345,13 @@ msgstr "O pedido usa um protocolo inadequado."
 #: ../java/build/Proxy.java:133
 #, java-format
 msgid "The I2P HTTP Proxy supports {0}http://{1} requests ONLY."
-msgstr ""
+msgstr "O proxy HTTP da I2P suporta {0}http://{1} pedidos APENAS."
 
 #: ../java/build/Proxy.java:134
 #, java-format
 msgid ""
 "Other protocols such as {0}https://{1} and {0}ftp://{1} are not allowed."
-msgstr ""
-"Outros protocolos, tais como {0}https://{1} e {0}ftp://{1}, não são "
-"permitidos."
+msgstr "Outros protocolos, tais como {0}https://{1} e {0}ftp://{1}, não são permitidos."
 
 #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:571
 msgid "This seems to be a bad destination:"
@@ -368,14 +359,14 @@ msgstr "Parece que este destino é inadequado:"
 
 #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:571
 msgid "i2paddresshelper cannot help you with a destination like that!"
-msgstr ""
+msgstr "O auxiliar de endereços da I2P não pode ajudá-lo com um destino como este!"
 
 #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:638
 #, java-format
 msgid ""
-"To visit the destination in your host database, click <a href=\"{0}\">here</"
-"a>. To visit the conflicting addresshelper destination, click <a href="
-"\"{1}\">here</a>."
+"To visit the destination in your host database, click <a "
+"href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, "
+"click <a href=\"{1}\">here</a>."
 msgstr ""
 
 #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1042
@@ -417,23 +408,24 @@ msgstr ""
 
 #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1216
 msgid ""
-"Click a link below to look for an address helper by using a \"jump\" service:"
+"Click a link below to look for an address helper by using a \"jump\" "
+"service:"
 msgstr ""
 
 #. Translators: parameter is a host name
 #: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1224
 #, java-format
 msgid "{0} jump service"
-msgstr ""
+msgstr "{0} saltar serviço"
 
 #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:162
 #, java-format
 msgid "Added via address helper from {0}"
-msgstr ""
+msgstr "Adicionado via auxiliar de endereços de {0}"
 
 #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:164
 msgid "Added via address helper"
-msgstr ""
+msgstr "Adicionado via auxiliar de endereços"
 
 #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:187
 msgid "router"
@@ -441,7 +433,7 @@ msgstr "roteador"
 
 #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:189
 msgid "master"
-msgstr ""
+msgstr "mestre"
 
 #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:191
 msgid "private"
@@ -464,4 +456,4 @@ msgstr ""
 
 #: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:213
 msgid "Click here if you are not redirected automatically."
-msgstr ""
+msgstr "Clique aqui se você não foi automaticamente redirecionado."
diff --git a/apps/i2ptunnel/locale-proxy/messages_uk.po b/apps/i2ptunnel/locale-proxy/messages_uk.po
index d68c80a70034125a72d02765e62539158c7167b9..5fbef66e46f3986f2d3260bda0719bc4d782037e 100644
--- a/apps/i2ptunnel/locale-proxy/messages_uk.po
+++ b/apps/i2ptunnel/locale-proxy/messages_uk.po
@@ -6,13 +6,14 @@
 # Translators:
 # Денис Лысенко <gribua@gmail.com>, 2011
 # Денис Лысенко <gribua@gmail.com>, 2012
+# jonny_nut, 2014
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-12-01 20:06+0000\n"
-"PO-Revision-Date: 2013-11-19 23:52+0000\n"
-"Last-Translator: kytv <killyourtv@i2pmail.org>\n"
+"PO-Revision-Date: 2014-01-23 16:58+0000\n"
+"Last-Translator: jonny_nut\n"
 "Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -249,14 +250,14 @@ msgstr "Авторизація outproxy"
 #: ../java/build/Proxy.java:89
 msgid ""
 "This proxy is configured to require a username and password for access."
-msgstr ""
+msgstr "Цей проксі налаштований конечно вимагати ім'я користувача і пароль для доступу."
 
 #: ../java/build/Proxy.java:90
 #, java-format
 msgid ""
 "Please enter your username and password, or check your {0}router "
 "configuration{1} or {2}I2PTunnel configuration{3}."
-msgstr ""
+msgstr "Будь ласка, ввести ваш логін і пароль, або перевірити {0}router configuration{1} або {2}I2PTunnel configuration{3}."
 
 #: ../java/build/Proxy.java:91
 #, java-format
diff --git a/apps/i2ptunnel/locale/messages_en.po b/apps/i2ptunnel/locale/messages_en.po
index b8201f79332c4c98bc903a4fd6519dae9987b48c..6282ceb5183092ad09b3f998eab2fcf3007575fe 100644
--- a/apps/i2ptunnel/locale/messages_en.po
+++ b/apps/i2ptunnel/locale/messages_en.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P i2ptunnel\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-01-09 19:27+0000\n"
+"POT-Creation-Date: 2014-02-06 18:27+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"
@@ -18,141 +18,141 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
-#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:350
-#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:360
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:363
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:373
 msgid "internal"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:436
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:449
 #, java-format
 msgid "{0} inbound, {0} outbound tunnel"
 msgid_plural "{0} inbound, {0} outbound tunnels"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:440
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:453
 msgid "lower bandwidth and reliability"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:442
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:455
 msgid "standard bandwidth and reliability"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:444
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:457
 msgid "higher bandwidth and reliability"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:121
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:123
 msgid "Tunnels are not initialized yet, please reload in two minutes."
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:194
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:196
 msgid ""
 "Invalid form submission, probably because you used the 'back' or 'reload' "
 "button on your browser. Please resubmit."
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:196
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:198
 msgid ""
 "If the problem persists, verify that you have cookies enabled in your "
 "browser."
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:242
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:244
 msgid "Configuration reloaded for all tunnels"
 msgstr ""
 
 #. and give them something to look at in any case
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:255
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:257
 msgid "Starting tunnel"
 msgstr ""
 
 #. and give them something to look at in any case
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:268
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:270
 msgid "Stopping tunnel"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:334
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:336
 msgid "Configuration changes saved"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:337
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:339
 msgid "Failed to save configuration"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:459
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:461
 msgid "New Tunnel"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:482
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:492
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:609
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:484
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:494
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:611
 msgid "Port not set"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:485
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:611
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:487
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:613
 msgid "Invalid port"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:488
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:490
 msgid "Warning - ports less than 1024 are not recommended"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:504
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:506
 msgid "Standard client"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:505
-msgid "HTTP client"
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:507
+msgid "HTTP/HTTPS client"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:506
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:508
 msgid "IRC client"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:507
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:509
 msgid "Standard server"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:508
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:510
 msgid "HTTP server"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:509
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:511
 msgid "SOCKS 4/4a/5 proxy"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:510
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:512
 msgid "SOCKS IRC proxy"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:511
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:513
 msgid "CONNECT/SSL/HTTPS proxy"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:512
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:514
 msgid "IRC server"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:513
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:515
 msgid "Streamr client"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:514
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:516
 msgid "Streamr server"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:515
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
 msgid "HTTP bidir"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:603
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:605
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:313
 msgid "Host not set"
 msgstr ""
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:605
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:607
 msgid "Invalid address"
 msgstr ""
 
@@ -188,7 +188,7 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:137
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:255
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:413
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:422
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:330
 msgid "Description"
 msgstr ""
@@ -206,7 +206,7 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:154
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:167
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:223
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:170
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:191
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:236
@@ -225,202 +225,211 @@ msgid "Outproxies"
 msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:203
+msgid "SSL Outproxies"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:209
+msgid "Use Outproxy Plugin"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:213
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:259
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:145
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:526
+msgid "(Check the Box for 'YES')"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:218
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:378
 msgid "Tunnel Destination"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:230
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:382
 msgid "name, name:port, or destination"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:218
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:233
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:386
 msgid "b32 not recommended"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
 msgid "Shared Client"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
 msgid ""
 "(Share tunnels with other clients and irc/httpclients? Change requires "
 "restart of client proxy)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:232
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:141
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:522
 msgid "Auto Start"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:244
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:145
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:526
-msgid "(Check the Box for 'YES')"
-msgstr ""
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:255
 msgid "Enable DCC"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:263
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
 msgid "Advanced networking options"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:265
 msgid ""
 "(NOTE: when this client proxy is configured to share tunnels, then these "
 "options are for all the shared proxy clients!)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:252
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:267
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:268
 msgid "Tunnel Options"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:269
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:270
 msgid "Length"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:277
 msgid "0 hop tunnel (no anonymity)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:265
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281
 msgid "1 hop tunnel (low anonymity)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:269
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:285
 msgid "2 hop tunnel (medium anonymity)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:273
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:288
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:289
 msgid "3 hop tunnel (high anonymity)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:281
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:297
 msgid "hop tunnel (very poor performance)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:302
 msgid "Variance"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:293
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:309
 msgid "0 hop variance (no randomisation, consistant performance)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:297
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:313
 msgid ""
 "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:317
 msgid ""
 "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:320
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:321
 msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:324
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:325
 msgid "+/- 0-2 hop variance (not recommended)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:336
 msgid "hop variance"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:341
 msgid "Count"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:344
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:345
 msgid "Backup Count"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:336
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:352
 msgid "0 backup tunnels (0 redundancy, no added resource usage)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:355
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
 msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
 msgid ""
 "2 backup tunnels each direction (medium redundancy, medium resource usage)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:363
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
 msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:356
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:371
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:372
 msgid "backup tunnels"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:379
 msgid "Profile"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:385
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:386
 msgid "interactive connection"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:374
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:389
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:390
 msgid "bulk connection (downloads/websites/BT)"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:391
 msgid "Delay Connect"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:380
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:395
 msgid "for request/response connections"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:384
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:399
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:394
 msgid "Router I2CP Address"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:401
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:159
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:396
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:413
 msgid "Host"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:394
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:409
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:165
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:404
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:273
@@ -429,107 +438,107 @@ msgstr ""
 msgid "Port"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:404
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:419
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:502
 msgid "Reduce tunnel quantity when idle"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:428
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:478
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:488
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:421
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:435
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:443
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:455
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:465
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:493
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:503
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:504
 msgid "Enable"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:410
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:425
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:508
 msgid "Reduced tunnel count"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:414
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:429
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:449
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:512
 msgid "Idle minutes"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:418
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:433
 msgid "Close tunnels when idle"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:424
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:439
 msgid "New Keys on Reopen"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:432
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:447
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:430
 msgid "Disable"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:438
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:453
 msgid "Delay tunnel open until required"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:448
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:463
 msgid "Persistent private key"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:454
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:469
 msgid "File"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:463
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:478
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
 msgid "Local destination"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:467
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482
 msgid "Local Base 32"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:491
 msgid "Local Authorization"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:492
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:497
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:507
 msgid "Username"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:496
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:499
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:511
 msgid "Password"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:501
 msgid "Outproxy Authorization"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:503
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
 msgid "Jump URL List"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:509
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:548
 msgid "Custom options"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:513
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:528
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:552
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:702
 msgid "Cancel"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:517
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:532
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:556
 msgid "Delete"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:519
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:534
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:558
 msgid "Save"
 msgstr ""
@@ -780,7 +789,7 @@ msgid "New server tunnel"
 msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:265
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:423
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:432
 #: ../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
@@ -790,7 +799,7 @@ msgid "Standard"
 msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:267
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:425
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:434
 msgid "Create"
 msgstr ""
 
@@ -815,11 +824,15 @@ msgstr ""
 msgid "Destination"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:408
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395
+msgid "internal plugin"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:414
 msgid "none"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:421
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:430
 msgid "New client tunnel"
 msgstr ""
 
diff --git a/apps/i2ptunnel/locale/messages_pl.po b/apps/i2ptunnel/locale/messages_pl.po
index 15453952b5daea6bc28a59f10f87766c8cebee83..3f9b20145e97b89529417c13e1265006a58e8729 100644
--- a/apps/i2ptunnel/locale/messages_pl.po
+++ b/apps/i2ptunnel/locale/messages_pl.po
@@ -12,8 +12,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-12-01 20:06+0000\n"
-"PO-Revision-Date: 2014-01-05 19:47+0000\n"
+"POT-Creation-Date: 2014-01-09 19:27+0000\n"
+"PO-Revision-Date: 2014-02-05 22:26+0000\n"
 "Last-Translator: sebx\n"
 "Language-Team: Polish (http://www.transifex.com/projects/p/I2P/language/pl/)\n"
 "MIME-Version: 1.0\n"
@@ -320,18 +320,18 @@ msgstr "tunel skoku (bardzo mała wydajność)"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:302
 msgid "Variance"
-msgstr ""
+msgstr "Zmienność"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:293
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:309
 msgid "0 hop variance (no randomisation, consistant performance)"
-msgstr ""
+msgstr "0 skoków zmiennych (brak randomizacji, stała wydajność)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:297
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:313
 msgid ""
 "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
-msgstr ""
+msgstr "+ 0-1 zmienność przeskoków (średni dodatek randomizacji, subtraktywna wydajność)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:317
@@ -352,7 +352,7 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:320
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:336
 msgid "hop variance"
-msgstr ""
+msgstr "Zmienność przeskoków"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:341
@@ -444,8 +444,8 @@ msgstr "Zredukuj ilość tuneli podczas bezczynności"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:428
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:469
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:479
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:478
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:488
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:504
 msgid "Enable"
@@ -487,54 +487,54 @@ msgstr ""
 msgid "File"
 msgstr "Plik"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:458
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:463
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
 msgid "Local destination"
 msgstr "Cel localny"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:462
-msgid "(if known)"
-msgstr "(jeżeli znane)"
-
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:467
+msgid "Local Base 32"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
 msgid "Local Authorization"
 msgstr "Lokalna autoryzacja"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:473
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:483
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:492
 msgid "Username"
 msgstr "Użytkownik"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:475
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:487
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:496
 msgid "Password"
 msgstr "Hasło"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:477
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
 msgid "Outproxy Authorization"
 msgstr "Autoryzacja Outproxy"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:503
 msgid "Jump URL List"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:500
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:509
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:548
 msgid "Custom options"
 msgstr "Dodatkowe opcje"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:504
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:513
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:552
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:702
 msgid "Cancel"
 msgstr "Anuluj"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:517
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:556
 msgid "Delete"
 msgstr "Usuń"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:510
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:519
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:558
 msgid "Save"
 msgstr "Zapisz"
@@ -708,7 +708,7 @@ msgstr "Odśwież"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:109
 msgid "Tunnel Wizard"
-msgstr ""
+msgstr "Kreator Tunelu"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113
 msgid "Stop All"
@@ -830,7 +830,7 @@ msgstr "Nowy tunel klienta"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:119
 msgid "I2P Tunnel Manager - Tunnel Creation Wizard"
-msgstr ""
+msgstr "Menager Tunelu I2P - Kreator Tunelu"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:139
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:567
@@ -845,12 +845,12 @@ msgstr "Typ tunelu"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:151
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:601
 msgid "Tunnel name and description"
-msgstr ""
+msgstr "Nazwa tunelu i opis"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:157
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:610
 msgid "Tunnel destination"
-msgstr ""
+msgstr "Miejsce przeznaczenia tunelu"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:163
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:626
@@ -860,11 +860,11 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:169
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:652
 msgid "Tunnel auto-start"
-msgstr ""
+msgstr "Auto-Start Tunnelu"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:175
 msgid "Wizard completed"
-msgstr ""
+msgstr "Kreator zakończony"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:189
 msgid ""
@@ -892,11 +892,11 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:197
 msgid "Server Tunnel"
-msgstr ""
+msgstr "Tunnel Serwera"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:199
 msgid "Client Tunnel"
-msgstr ""
+msgstr "Tunnel Klienta"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:217
 msgid "There are several types of tunnels to choose from:"
@@ -1156,16 +1156,16 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:707
 msgid "Previous"
-msgstr ""
+msgstr "Poprzedni"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:715
 msgid "Save Tunnel"
-msgstr ""
+msgstr "Zapisz Tunnel"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:721
 msgid "Finish"
-msgstr ""
+msgstr "Zakończ"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:727
 msgid "Next"
-msgstr ""
+msgstr "Następny"
diff --git a/apps/i2ptunnel/locale/messages_pt.po b/apps/i2ptunnel/locale/messages_pt.po
index fa1f97361d8dbfd319f9283d6dfc7369c2be033a..a965c259339a753d52c1eb19c533e2a7708a263f 100644
--- a/apps/i2ptunnel/locale/messages_pt.po
+++ b/apps/i2ptunnel/locale/messages_pt.po
@@ -4,6 +4,7 @@
 # To contribute translations, see http://www.i2p2.de/newdevelopers
 # 
 # Translators:
+# kgtm <fabio.h.f.antunes@gmail.com>, 2014
 # rafaelbf, 2013
 # tuliouel, 2013
 # wicked, 2012
@@ -12,8 +13,8 @@ msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-01-09 19:27+0000\n"
-"PO-Revision-Date: 2014-01-09 19:27+0000\n"
-"Last-Translator: kytv <killyourtv@i2pmail.org>\n"
+"PO-Revision-Date: 2014-01-28 13:01+0000\n"
+"Last-Translator: kgtm <fabio.h.f.antunes@gmail.com>\n"
 "Language-Team: Portuguese (http://www.transifex.com/projects/p/I2P/language/pt/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -235,7 +236,7 @@ msgstr "Destino do Túnel"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:215
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:382
 msgid "name, name:port, or destination"
-msgstr ""
+msgstr "nome, nome:porta, ou destino"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:218
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:386
@@ -293,22 +294,22 @@ msgstr "Comprimento"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:277
 msgid "0 hop tunnel (no anonymity)"
-msgstr ""
+msgstr "0 saltos túnel (sem anonimato)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:265
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281
 msgid "1 hop tunnel (low anonymity)"
-msgstr ""
+msgstr "1 saltos túnel (baixo anonimato)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:269
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:285
 msgid "2 hop tunnel (medium anonymity)"
-msgstr ""
+msgstr "2 saltos túnel (médio anonimato)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:273
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:289
 msgid "3 hop tunnel (high anonymity)"
-msgstr ""
+msgstr "3 saltos túnel (grande anonimato)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:281
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:297
@@ -492,7 +493,7 @@ msgstr "Destino local"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:467
 msgid "Local Base 32"
-msgstr ""
+msgstr "Base 32 do endereço local"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
 msgid "Local Authorization"
@@ -551,7 +552,7 @@ msgstr "Nova configuração de servidor"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:179
 msgid "Use SSL?"
-msgstr ""
+msgstr "Usar SSL?"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:222
 msgid "Website name"
@@ -642,19 +643,19 @@ msgstr "Max. de conexões simultâneas (0 = ilimitado)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:477
 msgid "POST limits (0=unlimited)"
-msgstr ""
+msgstr "Limite de submissões HTTP POST (0 = ilimitado)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
 msgid "Per period"
-msgstr ""
+msgstr "Por período"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
 msgid "Ban minutes"
-msgstr ""
+msgstr "Minutos de proibição"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
 msgid "POST limit period (minutes)"
-msgstr ""
+msgstr "Período de limite submissões HTTP POST (minutos)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:516
 msgid "New Certificate type"
diff --git a/apps/i2ptunnel/locale/messages_pt_BR.po b/apps/i2ptunnel/locale/messages_pt_BR.po
index c3a6569e90388568dbfcc296d0b6758a38956205..980a6ad7733b9962c05d4833b7d923059f891e24 100644
--- a/apps/i2ptunnel/locale/messages_pt_BR.po
+++ b/apps/i2ptunnel/locale/messages_pt_BR.po
@@ -2,23 +2,22 @@
 # Copyright (C) 2009 The I2P Project
 # This file is distributed under the same license as the i2ptunnel package.
 # To contribute translations, see http://www.i2p2.de/newdevelopers
-#
+# 
 # Translators:
 # blueboy, 2013
-# blueboy, 2013
+# blueboy, 2013-2014
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-01-09 18:16+0000\n"
-"PO-Revision-Date: 2013-11-25 22:03+0000\n"
+"POT-Creation-Date: 2014-01-09 19:27+0000\n"
+"PO-Revision-Date: 2014-01-29 00:58+0000\n"
 "Last-Translator: blueboy\n"
-"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/"
-"language/pt_BR/)\n"
-"Language: pt_BR\n"
+"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: pt_BR\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 #: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:350
@@ -47,7 +46,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:121
 msgid "Tunnels are not initialized yet, please reload in two minutes."
-msgstr ""
+msgstr "Os túneis não foram inicializados ainda, por favor, recarregue em dois minutos."
 
 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:194
 msgid ""
@@ -59,7 +58,7 @@ msgstr ""
 msgid ""
 "If the problem persists, verify that you have cookies enabled in your "
 "browser."
-msgstr ""
+msgstr "Se o problema persistir, verifique se o seu navegador está configurado para permitir cookies."
 
 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:242
 msgid "Configuration reloaded for all tunnels"
@@ -68,12 +67,12 @@ msgstr ""
 #. and give them something to look at in any case
 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:255
 msgid "Starting tunnel"
-msgstr ""
+msgstr "Inicializando túnel"
 
 #. and give them something to look at in any case
 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:268
 msgid "Stopping tunnel"
-msgstr ""
+msgstr "Parando túnel"
 
 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:334
 msgid "Configuration changes saved"
@@ -100,7 +99,7 @@ msgstr "Porta inválida"
 
 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:488
 msgid "Warning - ports less than 1024 are not recommended"
-msgstr ""
+msgstr "Aviso - portas abaixo de 1024 não são recomendadas"
 
 #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:504
 msgid "Standard client"
@@ -250,7 +249,7 @@ msgstr "Cliente compartilhado"
 msgid ""
 "(Share tunnels with other clients and irc/httpclients? Change requires "
 "restart of client proxy)"
-msgstr ""
+msgstr "(Compartilhar túneis com outros clientes e clientes irc/http? Alterar requer a reinicialização do proxy de cliente)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:232
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:141
@@ -263,7 +262,7 @@ msgstr "Inicialização automática"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:145
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:526
 msgid "(Check the Box for 'YES')"
-msgstr ""
+msgstr "(Selecione a caixa para 'SIM')"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:240
 msgid "Enable DCC"
@@ -272,7 +271,7 @@ msgstr "Permitir DCC"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:248
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
 msgid "Advanced networking options"
-msgstr ""
+msgstr "Opções de rede avançadas"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:250
 msgid ""
@@ -421,7 +420,7 @@ msgstr "Endereço I2CP do roteador"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:396
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:413
 msgid "Host"
-msgstr ""
+msgstr "Host"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:394
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:165
@@ -471,7 +470,7 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:432
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:430
 msgid "Disable"
-msgstr ""
+msgstr "Desabilitar"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:438
 msgid "Delay tunnel open until required"
@@ -571,7 +570,7 @@ msgstr "Adicionar ao livro de endereços local"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:260
 msgid "Hostname Signature"
-msgstr ""
+msgstr "Assinatura do nome do host"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:412
 msgid "Encrypt Leaseset"
@@ -698,7 +697,7 @@ msgstr "Gerenciador de túneis I2P - Lista"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:97
 msgid "Status Messages"
-msgstr ""
+msgstr "Mensagens de Estado"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:101
 msgid "Refresh"
@@ -722,7 +721,7 @@ msgstr "Reinicializar todos"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:124
 msgid "I2P Server Tunnels"
-msgstr ""
+msgstr "Túneis de servidor I2P"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:128
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:149
@@ -740,7 +739,7 @@ msgstr "Mostrar previsão"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:320
 msgid "Status"
-msgstr ""
+msgstr "Estado"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192
 msgid "Base32 Address"
@@ -799,7 +798,7 @@ msgstr "Criar"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:269
 msgid "I2P Client Tunnels"
-msgstr ""
+msgstr "Túneis de cliente I2P"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:277
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:306
@@ -866,20 +865,20 @@ msgstr ""
 
 #: ../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."
+"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:191
 msgid ""
-"The first thing to decide is whether you want to create a server or a client "
-"tunnel."
+"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: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."
+"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:195
@@ -918,8 +917,8 @@ msgstr ""
 #: ../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."
+"\"http_proxy\" environment variable for command-line applications in "
+"GNU/Linux."
 msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:233
@@ -946,7 +945,7 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:241
 msgid "A tunnel that implements the SOCKS protocol."
-msgstr ""
+msgstr "Um túnel que implementa o protocolo SOCKS."
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:243
 msgid ""
@@ -982,7 +981,7 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:253
 msgid "A client tunnel that implements the HTTP CONNECT command."
-msgstr ""
+msgstr "Um túnel de cliente que implementa o comando HTTP CONNECT."
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:255
 msgid ""
@@ -1137,7 +1136,7 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:565
 msgid "Below is a summary of the options you chose:"
-msgstr ""
+msgstr "Abaixo um resumo das opções que você escolheu:"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:663
 msgid ""
@@ -1167,6 +1166,3 @@ msgstr "Terminar"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:727
 msgid "Next"
 msgstr "Próximo"
-
-#~ msgid "(if known)"
-#~ msgstr "(se conhecido)"
diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManager.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManager.java
index 8a8aa4e4dbece5677f89e8ff1f2d45b4b93951d8..6ba93bf3b709666e0f37176938201604f2ed18f0 100644
--- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManager.java
+++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManager.java
@@ -126,12 +126,31 @@ public interface I2PSocketManager {
      * Ping the specified peer, returning true if they replied to the ping within 
      * the timeout specified, false otherwise.  This call blocks.
      *
+     * Uses the ports from the default options.
+     *
      * @param peer Destination to ping
-     * @param timeoutMs timeout in ms
+     * @param timeoutMs timeout in ms, greater than zero
+     * @throws IllegalArgumentException
      * @return success or failure
      */
     public boolean ping(Destination peer, long timeoutMs);
 
+    /**
+     * Ping the specified peer, returning true if they replied to the ping within 
+     * the timeout specified, false otherwise.  This call blocks.
+     *
+     * Uses the ports specified.
+     *
+     * @param peer Destination to ping
+     * @param localPort 0 - 65535
+     * @param remotePort 0 - 65535
+     * @param timeoutMs timeout in ms, greater than zero
+     * @return success or failure
+     * @throws IllegalArgumentException
+     * @since 0.9.12
+     */
+    public boolean ping(Destination peer, int localPort, int remotePort, long timeoutMs);
+
     public String getName();
     public void setName(String name);
 
diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java
index e7aff4cfb4fea621245b4be2e790c23c06b1cdd1..d50bb921046b5797a2b569b76647b124d56804fd 100644
--- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java
+++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java
@@ -14,6 +14,7 @@ import net.i2p.client.I2PClient;
 import net.i2p.client.I2PClientFactory;
 import net.i2p.client.I2PSession;
 import net.i2p.client.I2PSessionException;
+import net.i2p.crypto.SigType;
 import net.i2p.util.Log;
 
 /**
@@ -26,7 +27,7 @@ public class I2PSocketManagerFactory {
 
     public static final String PROP_MANAGER = "i2p.streaming.manager";
     public static final String DEFAULT_MANAGER = "net.i2p.client.streaming.impl.I2PSocketManagerFull";
-    
+
     /**
      * Create a socket manager using a brand new destination connected to the
      * I2CP router on the local machine on the default port (7654).
@@ -79,9 +80,9 @@ public class I2PSocketManagerFactory {
      */
     public static I2PSocketManager createManager(String i2cpHost, int i2cpPort, Properties opts) {
         I2PClient client = I2PClientFactory.createClient();
-        ByteArrayOutputStream keyStream = new ByteArrayOutputStream(512);
+        ByteArrayOutputStream keyStream = new ByteArrayOutputStream(1024);
         try {
-            client.createDestination(keyStream);
+            client.createDestination(keyStream, getSigType(opts));
             ByteArrayInputStream in = new ByteArrayInputStream(keyStream.toByteArray());
             return createManager(in, i2cpHost, i2cpPort, opts);
         } catch (IOException ioe) {
@@ -168,9 +169,9 @@ public class I2PSocketManagerFactory {
                                                              int i2cpPort, Properties opts) throws I2PSessionException {
         if (myPrivateKeyStream == null) {
             I2PClient client = I2PClientFactory.createClient();
-            ByteArrayOutputStream keyStream = new ByteArrayOutputStream(512);
+            ByteArrayOutputStream keyStream = new ByteArrayOutputStream(1024);
             try {
-                client.createDestination(keyStream);
+                client.createDestination(keyStream, getSigType(opts));
             } catch (Exception e) {
                 throw new I2PSessionException("Error creating keys", e);
             }
@@ -257,6 +258,23 @@ public class I2PSocketManagerFactory {
         return i2cpPort;
     }
 
+    /**
+     *  @param opts may be null
+     *  @since 0.9.12
+     */
+    private static SigType getSigType(Properties opts) {
+        if (opts != null) {
+            String st = opts.getProperty(I2PClient.PROP_SIGTYPE);
+            if (st != null) {
+                SigType rv = SigType.parseSigType(st);
+                if (rv != null)
+                    return rv;
+                getLog().error("Unsupported sig type " + st);
+            }
+        }
+        return I2PClient.DEFAULT_SIGTYPE;
+    }
+
     /** @since 0.9.7 */
     private static Log getLog() {
         return I2PAppContext.getGlobalContext().logManager().getLog(I2PSocketManagerFactory.class);
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java b/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java
index 6efc217a922cd0486deced21d5c0a5eb0bbaa32b..84d656abecce31fbeb891f2e13899b54145c1a7d 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java
@@ -17,12 +17,16 @@ import java.util.StringTokenizer;
 import java.util.concurrent.ConcurrentHashMap;
 
 import net.i2p.I2PAppContext;
+import net.i2p.app.ClientAppManager;
+import net.i2p.app.ClientAppState;
+import static net.i2p.app.ClientAppState.*;
 import net.i2p.crypto.SU3File;
 import net.i2p.crypto.TrustedUpdate;
 import net.i2p.data.DataHelper;
 import net.i2p.router.Router;
 import net.i2p.router.RouterContext;
 import net.i2p.router.RouterVersion;
+import net.i2p.router.app.RouterApp;
 import net.i2p.router.web.ConfigServiceHandler;
 import net.i2p.router.web.ConfigUpdateHandler;
 import net.i2p.router.web.Messages;
@@ -50,7 +54,7 @@ import net.i2p.util.VersionComparator;
  *
  *  @since 0.9.4
  */
-public class ConsoleUpdateManager implements UpdateManager {
+public class ConsoleUpdateManager implements UpdateManager, RouterApp {
     
     private final RouterContext _context;
     private final Log _log;
@@ -68,6 +72,8 @@ public class ConsoleUpdateManager implements UpdateManager {
     private final Map<UpdateItem, Version> _installed;
     private final boolean _allowTorrent;
     private static final DecimalFormat _pct = new DecimalFormat("0.0%");
+    private final ClientAppManager _cmgr;
+    private volatile ClientAppState _state = UNINITIALIZED;
 
     private volatile String _status;
 
@@ -77,8 +83,12 @@ public class ConsoleUpdateManager implements UpdateManager {
     private static final long TASK_CLEANER_TIME = 15*60*1000;
     private static final String PROP_UNSIGNED_AVAILABLE = "router.updateUnsignedAvailable";
 
-    public ConsoleUpdateManager(RouterContext ctx) {
+    /**
+     *  @param args ignored
+     */
+    public ConsoleUpdateManager(RouterContext ctx, ClientAppManager listener, String[] args) {
         _context = ctx;
+        _cmgr = listener;
         _log = ctx.logManager().getLog(ConsoleUpdateManager.class);
         _registeredUpdaters = new ConcurrentHashSet<RegisteredUpdater>();
         _registeredCheckers = new ConcurrentHashSet<RegisteredChecker>();
@@ -98,13 +108,34 @@ public class ConsoleUpdateManager implements UpdateManager {
         //_allowTorrent = RouterVersion.BUILD != 0 || _context.random().nextInt(100) < 60;
         // Finally, for 0.9.12, 18 months later...
         _allowTorrent = true;
+        _state = INITIALIZED;
     }
 
+    /**
+     *  @return null if not found
+     */
     public static ConsoleUpdateManager getInstance() {
-        return (ConsoleUpdateManager) I2PAppContext.getGlobalContext().updateManager();
+        ClientAppManager cmgr = I2PAppContext.getGlobalContext().clientAppManager();
+        if (cmgr == null)
+            return null;
+        return (ConsoleUpdateManager) cmgr.getRegisteredApp(APP_NAME);
     }
 
+    /////// ClientApp methods
+
+    /**
+     *  UpdateManager interface
+     */
     public void start() {
+        startup();
+    }
+
+    /**
+     *  ClientApp interface
+     *  @since 0.9.12
+     */
+    public synchronized void startup() {
+        changeState(STARTING);
         notifyInstalled(NEWS, "", Long.toString(NewsHelper.lastUpdated(_context)));
         notifyInstalled(ROUTER_SIGNED, "", RouterVersion.VERSION);
         notifyInstalled(ROUTER_SIGNED_SU3, "", RouterVersion.VERSION);
@@ -118,7 +149,6 @@ public class ConsoleUpdateManager implements UpdateManager {
                 notifyInstalled(PLUGIN, plugin, ver);
         }
 
-        _context.registerUpdateManager(this);
         DummyHandler dh = new DummyHandler(_context, this);
         register((Checker)dh, TYPE_DUMMY, METHOD_DUMMY, 0);
         register((Updater)dh, TYPE_DUMMY, METHOD_DUMMY, 0);
@@ -162,10 +192,27 @@ public class ConsoleUpdateManager implements UpdateManager {
         //register((Updater)puh, PLUGIN, FILE, 0);
         new NewsTimerTask(_context, this);
         _context.simpleScheduler().addPeriodicEvent(new TaskCleaner(), TASK_CLEANER_TIME);
+        changeState(RUNNING);
+        if (_cmgr != null)
+            _cmgr.register(this);
     }
 
+    /**
+     *  UpdateManager interface
+     */
     public void shutdown() {
-        _context.unregisterUpdateManager(this);
+        shutdown(null);
+    }
+
+    /**
+     *  ClientApp interface
+     *  @param args ignored
+     *  @since 0.9.12
+     */
+    public synchronized void shutdown(String[] args) {
+        if (_state == STOPPED)
+            return;
+        changeState(STOPPING);
         stopChecks();
         stopUpdates();
         _registeredUpdaters.clear();
@@ -173,6 +220,30 @@ public class ConsoleUpdateManager implements UpdateManager {
         _available.clear();
         _downloaded.clear();
         _installed.clear();
+        changeState(STOPPED);
+    }
+
+    /** @since 0.9.12 */
+    public ClientAppState getState() {
+        return _state;
+    }
+
+    /** @since 0.9.12 */
+    public String getName() {
+        return APP_NAME;
+    }
+
+    /** @since 0.9.12 */
+    public String getDisplayName() {
+        return "Console Update Manager";
+    }
+
+    /////// end ClientApp methods
+
+    private synchronized void changeState(ClientAppState state) {
+        _state = state;
+        if (_cmgr != null)
+            _cmgr.notify(this, state, null, null);
     }
 
     /**
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/NewsHandler.java b/apps/routerconsole/java/src/net/i2p/router/update/NewsHandler.java
index f2703fde922adf292f12078d9de15144b1e99335..b0f1515f77d71acfb6badd1f81d29ea009891635 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/NewsHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/NewsHandler.java
@@ -21,8 +21,14 @@ import static net.i2p.update.UpdateMethod.*;
  */
 class NewsHandler extends UpdateHandler implements Checker {
     
-    /** @since 0.7.14 not configurable */
-    private static final String BACKUP_NEWS_URL = "http://www.i2p2.i2p/_static/news/news.xml";
+    /**
+     *  Changed in 0.9.11 to the b32 for psi.i2p, run by psi.
+     *  We may be able to change it to psi.i2p in a future release after
+     *  the hostname propagates.
+     *
+     *  @since 0.7.14 not configurable
+     */
+    private static final String BACKUP_NEWS_URL = "http://avviiexdngd32ccoy4kuckvc3mkf53ycvzbz6vz75vzhv4tbpk5a.b32.i2p/news.xml";
 
     public NewsHandler(RouterContext ctx, ConsoleUpdateManager mgr) {
         super(ctx, mgr);
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java
index b5f1e1c51f378bd31261df3ab6f41686102d19e3..09a0def7cfe67ed8501e0efb7ac60818b94c757c 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java
@@ -370,7 +370,7 @@ public class ConfigClientsHandler extends FormHandler {
      *  @param app null for a new install
      */
     private void installPlugin(String app, String url) {
-        ConsoleUpdateManager mgr = (ConsoleUpdateManager) _context.updateManager();
+        ConsoleUpdateManager mgr = UpdateHandler.updateManager(_context);
         if (mgr == null) {
             addFormError("Update manager not registered, cannot install");
             return;
@@ -397,7 +397,7 @@ public class ConfigClientsHandler extends FormHandler {
     }
 
     private void checkPlugin(String app) {
-        ConsoleUpdateManager mgr = (ConsoleUpdateManager) _context.updateManager();
+        ConsoleUpdateManager mgr = UpdateHandler.updateManager(_context);
         if (mgr == null) {
             addFormError("Update manager not registered, cannot check");
             return;
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 5ebee42b506dad405c01fda31d6e24ad70671c31..c1062438c16b6220b584dc43981df909d43eba80 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java
@@ -90,8 +90,11 @@ public class ConfigClientsHelper extends HelperBase {
     /** clients */
     public String getForm1() {
         StringBuilder buf = new StringBuilder(1024);
-        buf.append("<table>\n");
-        buf.append("<tr><th align=\"right\">" + _("Client") + "</th><th>" + _("Run at Startup?") + "</th><th>" + _("Control") + "</th><th align=\"left\">" + _("Class and arguments") + "</th></tr>\n");
+        buf.append("<table>\n" +
+                   "<tr><th align=\"right\">").append(_("Client")).append("</th><th>")
+           .append(_("Run at Startup?")).append("</th><th>")
+           .append(_("Control")).append("</th><th align=\"left\">")
+           .append(_("Class and arguments")).append("</th></tr>\n");
         
         List<ClientAppConfig> clients = ClientAppConfig.getClientApps(_context);
         for (int cur = 0; cur < clients.size(); cur++) {
@@ -134,8 +137,11 @@ public class ConfigClientsHelper extends HelperBase {
     /** webapps */
     public String getForm2() {
         StringBuilder buf = new StringBuilder(1024);
-        buf.append("<table>\n");
-        buf.append("<tr><th align=\"right\">" + _("WebApp") + "</th><th>" + _("Run at Startup?") + "</th><th>" + _("Control") + "</th><th align=\"left\">" + _("Description") + "</th></tr>\n");
+        buf.append("<table>\n" +
+                   "<tr><th align=\"right\">").append(_("WebApp")).append("</th><th>")
+           .append(_("Run at Startup?")).append("</th><th>")
+           .append(_("Control")).append("</th><th align=\"left\">")
+           .append(_("Description")).append("</th></tr>\n");
         Properties props = RouterConsoleRunner.webAppProperties(_context);
         Set<String> keys = new TreeSet(props.keySet());
         for (String name : keys) {
@@ -159,8 +165,11 @@ public class ConfigClientsHelper extends HelperBase {
     /** plugins */
     public String getForm3() {
         StringBuilder buf = new StringBuilder(1024);
-        buf.append("<table>\n");
-        buf.append("<tr><th align=\"right\">" + _("Plugin") + "</th><th>" + _("Run at Startup?") + "</th><th>" + _("Control") + "</th><th align=\"left\">" + _("Description") + "</th></tr>\n");
+        buf.append("<table>\n" +
+                   "<tr><th align=\"right\">").append(_("Plugin")).append("</th><th>")
+           .append(_("Run at Startup?")).append("</th><th>")
+           .append(_("Control")).append("</th><th align=\"left\">")
+           .append(_("Description")).append("</th></tr>\n");
         Properties props = PluginStarter.pluginProperties();
         Set<String> keys = new TreeSet(props.keySet());
         for (String name : keys) {
@@ -273,15 +282,20 @@ public class ConfigClientsHelper extends HelperBase {
         // The icons were way too much, so there's an X in each button class,
         // remove if you wnat to put them back
         if (showStartButton && (!ro) && !edit) {
-            buf.append("<button type=\"submit\" class=\"Xaccept\" name=\"action\" value=\"Start ").append(index).append("\" >" + _("Start") + "<span class=hide> ").append(index).append("</span></button>");
+            buf.append("<button type=\"submit\" class=\"Xaccept\" name=\"action\" value=\"Start ").append(index).append("\" >")
+               .append(_("Start")).append("<span class=hide> ").append(index).append("</span></button>");
         }
         if (showStopButton && (!edit))
-            buf.append("<button type=\"submit\" class=\"Xstop\" name=\"action\" value=\"Stop ").append(index).append("\" >" + _("Stop") + "<span class=hide> ").append(index).append("</span></button>");
+            buf.append("<button type=\"submit\" class=\"Xstop\" name=\"action\" value=\"Stop ").append(index).append("\" >")
+               .append(_("Stop")).append("<span class=hide> ").append(index).append("</span></button>");
         if (showEditButton && (!edit) && !ro)
-            buf.append("<button type=\"submit\" class=\"Xadd\" name=\"edit\" value=\"Edit ").append(index).append("\" >" + _("Edit") + "<span class=hide> ").append(index).append("</span></button>");
+            buf.append("<button type=\"submit\" class=\"Xadd\" name=\"edit\" value=\"Edit ").append(index).append("\" >")
+               .append(_("Edit")).append("<span class=hide> ").append(index).append("</span></button>");
         if (showUpdateButton && (!edit) && !ro) {
-            buf.append("<button type=\"submit\" class=\"Xcheck\" name=\"action\" value=\"Check ").append(index).append("\" >" + _("Check for updates") + "<span class=hide> ").append(index).append("</span></button>");
-            buf.append("<button type=\"submit\" class=\"Xdownload\" name=\"action\" value=\"Update ").append(index).append("\" >" + _("Update") + "<span class=hide> ").append(index).append("</span></button>");
+            buf.append("<button type=\"submit\" class=\"Xcheck\" name=\"action\" value=\"Check ").append(index).append("\" >")
+               .append(_("Check for updates")).append("<span class=hide> ").append(index).append("</span></button>");
+            buf.append("<button type=\"submit\" class=\"Xdownload\" name=\"action\" value=\"Update ").append(index).append("\" >")
+                .append(_("Update")).append("<span class=hide> ").append(index).append("</span></button>");
         }
         if (showDeleteButton && (!edit) && !ro) {
             buf.append("<button type=\"submit\" class=\"Xdelete\" name=\"action\" value=\"Delete ").append(index)
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java
index 8333163578b47df07fe9cf74198afdc83809b79b..1e87c3babc779bb4f9b1e8871bba3def5ab8a589 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java
@@ -45,9 +45,9 @@ public class ConfigLoggingHelper extends HelperBase {
             buf.append(prefix).append('=').append(level).append('\n');
         }
         buf.append("</textarea><br>\n");
-        buf.append("<i>" + _("Add additional logging statements above. Example: net.i2p.router.tunnel=WARN") + "</i><br>");
-        buf.append("<i>" + _("Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN") + "</i><br>");
-        buf.append("<i>" + _("Valid levels are DEBUG, INFO, WARN, ERROR, CRIT") + "</i>\n");
+        buf.append("<i>").append(_("Add additional logging statements above. Example: net.i2p.router.tunnel=WARN")).append("</i><br>");
+        buf.append("<i>").append(_("Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN")).append("</i><br>");
+        buf.append("<i>").append(_("Valid levels are DEBUG, INFO, WARN, ERROR, CRIT")).append("</i>\n");
 
       /****
         // this is too big and ugly
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java
index 6327c05a912403ee1520be6534bfb38680b0b0b1..ba65110ef93d65eeff53864df277eb0b618a2021 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java
@@ -103,11 +103,33 @@ public class ConfigUIHelper extends HelperBase {
 
     /** todo sort by translated string */
     public String getLangSettings() {
-        StringBuilder buf = new StringBuilder(512);
-        String current = Messages.getLanguage(_context);
+        String clang = Messages.getLanguage(_context);
+        String current = clang;
         String country = Messages.getCountry(_context);
         if (country != null && country.length() > 0)
             current += '_' + country;
+        // find best match
+        boolean found = false;
+        for (int i = 0; i < langs.length; i++) {
+            if (langs[i][0].equals(current)) {
+                found = true;
+                break;
+            }
+        }
+        if (!found) {
+            if (country != null && country.length() > 0) {
+                current = clang;
+                for (int i = 0; i < langs.length; i++) {
+                    if (langs[i][0].equals(current)) {
+                        found = true;
+                        break;
+                    }
+                }
+            }
+            if (!found)
+                current = "en";
+        }
+        StringBuilder buf = new StringBuilder(512);
         for (int i = 0; i < langs.length; i++) {
             // we use "lang" so it is set automagically in CSSHelper
             buf.append("<input type=\"radio\" class=\"optbox\" name=\"lang\" ");
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java
index 09f00c388c162843f061e9b6ad76dfce0979ea3c..cc43d51bb95b9967f5f4d4285d7cf6967535eb70 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java
@@ -67,7 +67,7 @@ public class ConfigUpdateHandler extends FormHandler {
     "http://inr.i2p/i2p/i2pupdate.su2\r\n" +
     "http://meeh.i2p/i2pupdate/i2pupdate.su2\r\n" +
     "http://stats.i2p/i2p/i2pupdate.su2\r\n" +
-    "http://www.i2p2.i2p/_static/i2pupdate.su2\r\n" +
+    // "http://www.i2p2.i2p/_static/i2pupdate.su2\r\n" +
     "http://update.dg.i2p/files/i2pupdate.su2\r\n" +
     "http://update.killyourtv.i2p/i2pupdate.su2\r\n" +
     "http://update.postman.i2p/i2pupdate.su2" ;
@@ -77,7 +77,7 @@ public class ConfigUpdateHandler extends FormHandler {
     "http://inr.i2p/i2p/i2pupdate.sud\r\n" +
     "http://meeh.i2p/i2pupdate/i2pupdate.sud\r\n" +
     "http://stats.i2p/i2p/i2pupdate.sud\r\n" +
-    "http://www.i2p2.i2p/_static/i2pupdate.sud\r\n" +
+    // "http://www.i2p2.i2p/_static/i2pupdate.sud\r\n" +
     "http://update.dg.i2p/files/i2pupdate.sud\r\n" +
     "http://update.killyourtv.i2p/i2pupdate.sud\r\n" +
     "http://update.postman.i2p/i2pupdate.sud" ;
@@ -111,7 +111,7 @@ public class ConfigUpdateHandler extends FormHandler {
     "http://inr.i2p/i2p/i2pupdate.su3\r\n" +
     "http://meeh.i2p/i2pupdate/i2pupdate.su3\r\n" +
     "http://stats.i2p/i2p/i2pupdate.su3\r\n" +
-    "http://www.i2p2.i2p/_static/i2pupdate.su3\r\n" +
+    // "http://www.i2p2.i2p/_static/i2pupdate.su3\r\n" +
     "http://update.dg.i2p/files/i2pupdate.su3\r\n" +
     "http://update.killyourtv.i2p/i2pupdate.su3\r\n" +
     "http://update.postman.i2p/i2pupdate.su3" ;
@@ -139,7 +139,7 @@ public class ConfigUpdateHandler extends FormHandler {
         if (_action == null)
             return;
         if (_action.equals(_("Check for updates"))) {
-            ConsoleUpdateManager mgr = (ConsoleUpdateManager) _context.updateManager();
+            ConsoleUpdateManager mgr = UpdateHandler.updateManager(_context);
             if (mgr == null) {
                 addFormError("Update manager not registered, cannot check");
                 return;
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 037acb8bc95dc39cbf327a4f139e9e1ef2afbcec..4b7281fd9ae17c1594e34d8948454fcbd94fd177 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java
@@ -115,9 +115,9 @@ public class ConfigUpdateHelper extends HelperBase {
                 buf.append("\" selected=\"selected");
             
             if (PERIODS[i] == -1)
-                buf.append("\">" + _("Never") + "</option>\n");
+                buf.append("\">").append(_("Never")).append("</option>\n");
             else
-                buf.append("\">" + _("Every") + " ").append(DataHelper.formatDuration2(PERIODS[i])).append("</option>\n");
+                buf.append("\">").append(_("Every")).append(' ').append(DataHelper.formatDuration2(PERIODS[i])).append("</option>\n");
         }
         buf.append("</select>\n");
         return buf.toString();
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java
index b98a02119bc7e1be4c2c721b0bcbe031e7f171db..3a76ffb7bfe4e1d77e19a93c179e4e8a969b2fd5 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java
@@ -351,7 +351,7 @@ public class GraphHelper extends FormHandler {
         try {
             _out.write("<br><h3>" + _("Configure Graph Display") + " [<a href=\"configstats\">" + _("Select Stats") + "</a>]</h3>");
             _out.write("<form action=\"graphs\" method=\"POST\">\n" +
-                       "<input type=\"hidden\" name=\"action\" value=\"foo\">\n" +
+                       "<input type=\"hidden\" name=\"action\" value=\"save\">\n" +
                        "<input type=\"hidden\" name=\"nonce\" value=\"" + nonce + "\" >\n");
             _out.write(_("Periods") + ": <input size=\"5\" style=\"text-align: right;\" type=\"text\" name=\"periodCount\" value=\"" + _periodCount + "\"><br>\n");
             _out.write(_("Plot averages") + ": <input type=\"radio\" class=\"optbox\" name=\"showEvents\" value=\"false\" " + (_showEvents ? "" : "checked=\"checked\" ") + "> ");
@@ -380,7 +380,7 @@ public class GraphHelper extends FormHandler {
             if (persistent)
                 _out.write(" checked=\"checked\"");
             _out.write(">" +
-                       "<hr><div class=\"formaction\"><input type=\"submit\" class=\"acceot\" value=\"" + _("Save settings and redraw graphs") + "\"></div></form>");
+                       "<hr><div class=\"formaction\"><input type=\"submit\" class=\"accept\" value=\"" + _("Save settings and redraw graphs") + "\"></div></form>");
         } catch (IOException ioe) {
             ioe.printStackTrace();
         }
@@ -413,7 +413,8 @@ public class GraphHelper extends FormHandler {
      */
     @Override
     protected void processForm() {
-        saveSettings();
+        if ("save".equals(_action))
+            saveSettings();
     }
 
     /**
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
index d892469a3c1fce3107453529fbd4cc780fe7f745..db047c39bc6ed9f9865f65f5ecd8b19066c37743 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
+import net.i2p.data.Base32;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Destination;
 import net.i2p.data.Hash;
@@ -167,6 +168,8 @@ public class NetDbRenderer {
                         median = dist;
                 }
                 buf.append(" Dist: <b>").append(fmt.format(biLog2(dist))).append("</b><br>");
+                buf.append(Base32.encode(key.getData())).append(".b32.i2p<br>");
+                buf.append("Sig type: ").append(dest.getSigningPublicKey().getType()).append("<br>");
                 buf.append("Routing Key: ").append(ls.getRoutingKey().toBase64());
                 buf.append("<br>");
                 buf.append("Encryption Key: ").append(ls.getEncryptionKey().toBase64().substring(0, 20)).append("...<br>");
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 24633f495ccd21ffe2b8cd57ffcb6870f24a0bc9..cb09a1e5eb048bf50c03cb42d99aec5bbb993093 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java
@@ -121,7 +121,7 @@ public class PluginStarter implements Runnable {
         if (toUpdate.isEmpty())
             return;
 
-        ConsoleUpdateManager mgr = (ConsoleUpdateManager) ctx.updateManager();
+        ConsoleUpdateManager mgr = UpdateHandler.updateManager(ctx);
         if (mgr == null)
             return;
         if (mgr.isUpdateInProgress())
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
index b931b0bee7e0eb4efbc6a9237cb86db49b7355f6..b8799df161169edb73ae47608894afaad454db9f 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
@@ -645,7 +645,7 @@ public class RouterConsoleRunner implements RouterApp {
         t.setPriority(Thread.NORM_PRIORITY - 1);
         t.start();
         
-            ConsoleUpdateManager um = new ConsoleUpdateManager(_context);
+            ConsoleUpdateManager um = new ConsoleUpdateManager(_context, _mgr, null);
             um.start();
         
             if (PluginStarter.pluginsEnabled(_context)) {
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 a548cbe5980d568ba0f0ff1fdac577b891dc5ffc..d123740585b9b268567899226b7c01d3e56da674 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
@@ -422,11 +422,11 @@ public class SummaryHelper extends HelperBase {
                 
                 buf.append("<tr><td align=\"right\"><img src=\"/themes/console/images/");
                 if (_context.clientManager().shouldPublishLeaseSet(h))
-                    buf.append("server.png\" alt=\"Server\" title=\"" + _("Server") + "\">");
+                    buf.append("server.png\" alt=\"Server\" title=\"").append(_("Server")).append("\">");
                 else
-                    buf.append("client.png\" alt=\"Client\" title=\"" + _("Client") + "\">");
+                    buf.append("client.png\" alt=\"Client\" title=\"").append(_("Client")).append("\">");
                 buf.append("</td><td align=\"left\"><b><a href=\"tunnels#").append(h.toBase64().substring(0,4));
-                buf.append("\" target=\"_top\" title=\"" + _("Show tunnels") + "\">");
+                buf.append("\" target=\"_top\" title=\"").append(_("Show tunnels")).append("\">");
                 if (name.length() < 18)
                     buf.append(name);
                 else
@@ -861,7 +861,7 @@ public class SummaryHelper extends HelperBase {
                .append("\"></td><td align=\"left\">")
                .append(_(sectionNames.get(section)))
                .append("</td><td align=\"right\"><input type=\"hidden\" name=\"order_")
-               .append(i + "_" + section)
+               .append(i).append('_').append(section)
                .append("\" value=\"")
                .append(i)
                .append("\">");
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryListener.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryListener.java
index b4572e53b13621be3b358fd338c536dba237bac2..3cd7d9046b324baca53fa0f3285699348269cb7e 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryListener.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryListener.java
@@ -78,8 +78,17 @@ class SummaryListener implements RateSummaryListener {
                 //String names[] = _sample.getDsNames();
                 //System.out.println("Add " + val + " over " + eventCount + " for " + _name
                 //                   + " [" + names[0] + ", " + names[1] + "]");
+            } catch (IllegalArgumentException iae) {
+                // ticket #1186
+                // apparently a corrupt file, thrown from update()
+                _log.error("Error adding", iae);
+                String path = _isPersistent ? _db.getPath() : null;
+                stopListening();
+                if (path != null)
+                    (new File(path)).delete();
             } catch (IOException ioe) {
                 _log.error("Error adding", ioe);
+                stopListening();
             } catch (RrdException re) {
                 // this can happen after the time slews backwards, so don't make it an error
                 // org.jrobin.core.RrdException: Bad sample timestamp 1264343107. Last update time was 1264343172, at least one second step is required
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 4148a63afa4fcf53e43040d8023db50f20aa5b48..cf2b737a21f91db7fd94acbc74ecbfa240e5fced 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java
@@ -1,7 +1,9 @@
 package net.i2p.router.web;
 
+import net.i2p.app.ClientAppManager;
 import net.i2p.router.RouterContext;
 import net.i2p.router.update.ConsoleUpdateManager;
+import net.i2p.update.UpdateManager;
 import net.i2p.update.UpdateType;
 import static net.i2p.update.UpdateType.*;
 import net.i2p.util.Log;
@@ -33,6 +35,17 @@ public class UpdateHandler {
         _context = ctx;
         _log = ctx.logManager().getLog(UpdateHandler.class);
     }
+
+    /**
+     *  @return null if not found
+     *  @since 0.9.12
+     */
+    public static ConsoleUpdateManager updateManager(RouterContext ctx) {
+        ClientAppManager cmgr = ctx.clientAppManager();
+        if (cmgr == null)
+            return null;
+        return (ConsoleUpdateManager) cmgr.getRegisteredApp(UpdateManager.APP_NAME);
+    }
     
     /**
      * Configure this bean to query a particular router context
@@ -75,7 +88,7 @@ public class UpdateHandler {
     }
 
     private void update(UpdateType type) {
-        ConsoleUpdateManager mgr = (ConsoleUpdateManager) _context.updateManager();
+        ConsoleUpdateManager mgr = updateManager(_context);
         if (mgr == null)
             return;
         if (mgr.isUpdateInProgress(ROUTER_SIGNED) || mgr.isUpdateInProgress(ROUTER_UNSIGNED) ||
diff --git a/apps/routerconsole/jsp/configreseed.jsp b/apps/routerconsole/jsp/configreseed.jsp
index c83ed389dd0487820155c275335dcc11a25f877a..3e306c7584c940f18b7c81327ca3bd51e4d009d1 100644
--- a/apps/routerconsole/jsp/configreseed.jsp
+++ b/apps/routerconsole/jsp/configreseed.jsp
@@ -26,7 +26,7 @@
 <%=intl._("If reseeding has failed, you should first check your network connection.")%>
 <p><b><%=intl._("The default settings will work for most people.")%></b>
 <%=intl._("Change these only if HTTP is blocked by a restrictive firewall, reseed has failed, and you have access to an HTTP proxy.")%>
-<%=intl._("See {0} for instructions on reseeding manually.", "<a href=\"http://www.i2p2.de/faq.html#manual_reseed\">" + intl._("the FAQ") + "</a>")%>
+<%=intl._("See {0} for instructions on reseeding manually.", "<a href=\"https://geti2p.net/faq#manual_reseed\">" + intl._("the FAQ") + "</a>")%>
 </p>
 <div class="wideload">
 <table border="0" cellspacing="5">
diff --git a/apps/routerconsole/jsp/debug.jsp b/apps/routerconsole/jsp/debug.jsp
index f36e9f31ffa2b3cbc6176ba4be07976545c28364..7744f651d4497bc9115c11ef488baf8df2fd0d21 100644
--- a/apps/routerconsole/jsp/debug.jsp
+++ b/apps/routerconsole/jsp/debug.jsp
@@ -30,7 +30,14 @@
     /*
      *  Print out the status for the UpdateManager
      */
-    ctx.updateManager().renderStatusHTML(out);
+    net.i2p.app.ClientAppManager cmgr = ctx.clientAppManager();
+    if (cmgr != null) {
+        net.i2p.router.update.ConsoleUpdateManager umgr =
+            (net.i2p.router.update.ConsoleUpdateManager) cmgr.getRegisteredApp(net.i2p.update.UpdateManager.APP_NAME);
+        if (umgr != null) {
+            umgr.renderStatusHTML(out);
+        }
+    }
 
     /*
      *  Print out the status for the AppManager
diff --git a/apps/routerconsole/jsp/error500.jsp b/apps/routerconsole/jsp/error500.jsp
index f86125f115583bd56a7e7dbc783837bdd6602864..2a965fc617067b4f0dc429e49ce37d2c40babf60 100644
--- a/apps/routerconsole/jsp/error500.jsp
+++ b/apps/routerconsole/jsp/error500.jsp
@@ -34,7 +34,9 @@
 %><%=intl._("Please report bugs on {0} or {1}.",
           "<a href=\"http://trac.i2p2.i2p/newticket\">trac.i2p2.i2p</a>",
           "<a href=\"https://trac.i2p2.de/newticket\">trac.i2p2.de</a>")%>
+<!--
 <%=intl._("You may use the username \"guest\" and password \"guest\" if you do not wish to register.")%>
+-->
 <p><%=intl._("Please include this information in bug reports")%>:
 </p></div><div class="sorry" id="warning2">
 <h3><%=intl._("Error Details")%></h3>
diff --git a/apps/routerconsole/jsp/help.jsi b/apps/routerconsole/jsp/help.jsi
index c6be7c3cb39a8efd6024ed071f9f581d366d9bb2..5ee964bc53febdc0c35c7f411140b36658a8e2b0 100644
--- a/apps/routerconsole/jsp/help.jsi
+++ b/apps/routerconsole/jsp/help.jsi
@@ -1,9 +1,9 @@
 If you'd like to help improve or translate the documentation, or
 help with other aspects of the project, please see the documentation for
-<a href="http://i2p-projekt.i2p/getinvolved.html">volunteers.</a>
+<a href="http://i2p-projekt.i2p/en/get-involved">volunteers.</a>
 </p><p>Further assistance is available here:</p>
 <ul class="links">
-<li class="tidylist"><a href="http://i2p-projekt.i2p/faq.html">FAQ on i2p-projekt.i2p</a></li>
-<li class="tidylist"><a href="http://i2p-projekt.i2p/faq_de.html">Deutsch FAQ</a>.</li></ul>
+<li class="tidylist"><a href="http://i2p-projekt.i2p/en/faq">FAQ on i2p-projekt.i2p</a></li>
+<li class="tidylist"><a href="http://i2p-projekt.i2p/de/faq">Deutsch FAQ</a>.</li></ul>
 <br>You may also try the <a href="http://forum.i2p/">I2P forum</a>
 or IRC.
diff --git a/apps/routerconsole/jsp/help_ar.jsp b/apps/routerconsole/jsp/help_ar.jsp
index 249d58f21d6cf21a31995860791cee2b7d3c606c..d7d6b1454d28007bdd56ace1fa607bb8a6d4e8dd 100644
--- a/apps/routerconsole/jsp/help_ar.jsp
+++ b/apps/routerconsole/jsp/help_ar.jsp
@@ -17,10 +17,10 @@
 <div class="main" id="main" dir="rtl" lang="ar"><p>
 اذا رغبت في المساعدة أو ترجمة الوثائق، أو المساعدة في أشياء أخرى، انظر اسفله
 
-<a href="http://i2p-projekt.i2p/getinvolved.html">تطوع</a>
+<a href="http://i2p-projekt.i2p/ar/get-involved">تطوع</a>
 </p>المزيد من المساعدة هنا:
 <ul class="links">
-<li class="tidylist"><a href="http://i2p-projekt.i2p/faq.html">ابئلة شائعة i2p-projekt.i2p</a>
+<li class="tidylist"><a href="http://i2p-projekt.i2p/ar/faq">ابئلة شائعة i2p-projekt.i2p</a>
 <br>يمكن ايضا<a href="http://forum.i2p/">I2P منتدى</a>
 او بالدردشة على  IRC.</li></ul>
 
@@ -151,7 +151,7 @@ Apache's javax.servlet (javax.servlet.jar) implementation.
 This product includes software developed by the Apache Software Foundation
 (http://www.apache.org/).</p>
 
-<p>Another application you can see on this webpage is <a href="http://i2p-projekt.i2p/i2ptunnel">I2PTunnel</a>
+<p>Another application you can see on this webpage is <a href="http://i2p-projekt.i2p/ar/docs/api/i2ptunnel">I2PTunnel</a>
 (your <a href="i2ptunnel/" target="_blank">web interface</a>) - a GPL'ed application written by mihi that
 lets you tunnel normal TCP/IP traffic over I2P (such as the eepproxy and the irc proxy).  There is also a
 <a href="http://susi.i2p/">susimail</a> web based mail client <a href="susimail/susimail">available</a> on
@@ -159,15 +159,15 @@ the console, which is a GPL'ed application written by susi23.  The addressbook a
 <a href="http://ragnarok.i2p/">Ragnarok</a> helps maintain your hosts.txt files (see ./addressbook/ for
 more information).</p>
 
-<p>The router by default also includes human's public domain <a href="http://i2p-projekt.i2p/sam">SAM</a> bridge,
+<p>The router by default also includes human's public domain <a href="http://i2p-projekt.i2p/ar/docs/api/sam">SAM</a> bridge,
 which other client applications (such the <a href="http://duck.i2p/i2p-bt/">bittorrent port</a>) can use.
 There is also an optimized library for doing large number calculations - jbigi - which in turn uses the
 LGPL licensed <a href="http://swox.com/gmp/">GMP</a> library, tuned for various PC architectures.  
 Launchers for windows users are built with <a href="http://launch4j.sourceforge.net/">Launch4J</a>, and 
 the installer is built with <a href="http://www.izforge.com/izpack/">IzPack</a>.  For
 details on other applications available, as well as their licenses, please see the
-<a href="http://i2p-projekt.i2p/licenses">license policy</a>.  Source for the I2P code and most bundled
-client applications can be found on our <a href="http://i2p-projekt.i2p/download">download page</a>.
+<a href="http://i2p-projekt.i2p/ar/get-involved/develop/licenses">license policy</a>.  Source for the I2P code and most bundled
+client applications can be found on our <a href="http://i2p-projekt.i2p/ar/download">download page</a>.
 .</p>
 
 <h2>Change Log</h2>
diff --git a/apps/routerconsole/jsp/help_fr.jsp b/apps/routerconsole/jsp/help_fr.jsp
index 67be1416599790ce4979b2c39c1e6855ee1c2439..e22bd30a9cd74c59d0d7f14f2989d1ea3c885696 100644
--- a/apps/routerconsole/jsp/help_fr.jsp
+++ b/apps/routerconsole/jsp/help_fr.jsp
@@ -13,15 +13,15 @@
 <%@include file="summaryajax.jsi" %>
 </head><body onload="initAjax()">
 <%@include file="summary.jsi" %>
-Traduction de mars 2011 (magma@mail.i2p)
+<!-- Traduction de mars 2011 (magma@mail.i2p) -->
 <h1>Aide et assistance du routeur I2P</h1>
 <div class="main" id="main"><p>
 Si vous souhaitez améliorer ou traduire la documentation ou d'autres versants du projet, merci de vous reporter à 
-la page consacrée aux <a href="http://i2p-projekt.i2p/getinvolved_fr.html">volontaires</a>.
+la page consacrée aux <a href="http://i2p-projekt.i2p/fr/get-involved">volontaires</a>.
 </p>D'autres détails sont disponibles ici:
 <ul class="links">
-<li class="tidylist"><a href="http://i2p-projekt.i2p/faq.html">FAQ en anglais sur i2p-projekt.i2p</a></li>
-<li class="tidylist"><a href="http://i2p-projekt.i2p/faq_fr.html">les FAQ en français</a>.</li></ul>
+<li class="tidylist"><a href="http://i2p-projekt.i2p/en/faq">FAQ en anglais sur i2p-projekt.i2p</a></li>
+<li class="tidylist"><a href="http://i2p-projekt.i2p/fr/faq">les FAQ en français</a>.</li></ul>
 <br>Il y a aussi le <a href="http://forum.i2p/">forum I2P</a>
 et l'IRC.
 
@@ -131,22 +131,22 @@ configuration), vous permettant de déployer dans votre routeur des applications
 Jetty fait usage de l'implémentation javax.servlet d'Apache. Ce dispositif inclus du logiciel développé par la 
 fondation Apache Software (http://www.apache.org/).</p>
 
-<p>Une autre application visible sur cette page: <a href="http://i2p-projekt.i2p/i2ptunnel">I2PTunnel</a>
+<p>Une autre application visible sur cette page: <a href="http://i2p-projekt.i2p/fr/docs/api/i2ptunnel">I2PTunnel</a>
 (votre <a href="i2ptunnel/" target="_blank">interface web</a>) sous licence GPL écrite par mihi qui vous permet de 
 mettre en tunnels le trafic normal TCP/IP sur I2P (comme les proxy eep et le proxy irc). Il y a aussi un client webmail 
 <a href="http://susi.i2p/">susimail</a> <a href="susimail/susimail">disponible</a> dans la console, qui est sous 
 licence GPL et écrit par susi23. L'application carnet d'adresses, écrite par 
 <a href="http://ragnarok.i2p/">Ragnarok</a> gère votre fichier hosts.txt (voir ./addressbook/ pour plus de détails).</p>
 
-<p>Le routeur inclu aussi par défaut le pont <a href="http://i2p-projekt.i2p/sam">SAM</a> du domaine public de l'humanité, 
+<p>Le routeur inclu aussi par défaut le pont <a href="http://i2p-projekt.i2p/fr/docs/api/sam">SAM</a> du domaine public de l'humanité, 
 que les autres applications clientes (comme le <a href="http://duck.i2p/i2p-bt/">portage bittorrent</a>) peuvent à leur 
 tour utiliser. Il y a aussi une bibliothèque optimisée pour les calculs sur les grand nombres - jbigi - qui de son 
 côté utilise la bibliothèque sous licence LGPL <a href="http://swox.com/gmp/">GMP</a>, adaptée à diverses architectures
 PC. Les lanceurs pour Windows sont faits avec <a href="http://launch4j.sourceforge.net/">Launch4J</a>, et l'installeur 
 avec <a href="http://www.izforge.com/izpack/">IzPack</a>. Les détails sur les autres applications disponibles comme sur 
-leurs licences respectives, référez-vous à notre <a href="http://i2p-projekt.i2p/licenses">politique de licences</a>. 
+leurs licences respectives, référez-vous à notre <a href="http://i2p-projekt.i2p/fr/get-involved/develop/licenses">politique de licences</a>. 
 Les sources du code I2P et de la plupart des applications jointes est sur notre page de 
-<a href="http://i2p-projekt.i2p/download_fr">téléchargements</a>.
+<a href="http://i2p-projekt.i2p/fr/download">téléchargements</a>.
 .</p>
 
 <h2>Historique des évolutions</h2>
diff --git a/apps/routerconsole/jsp/help_nl.jsp b/apps/routerconsole/jsp/help_nl.jsp
index 4eea3e9e18a83ce5d62644e9ccc86ac1a53d05d1..03da62ee8b60ab29eb8db41fc17b5a02c28c26c1 100644
--- a/apps/routerconsole/jsp/help_nl.jsp
+++ b/apps/routerconsole/jsp/help_nl.jsp
@@ -17,10 +17,10 @@
 <div class="main" id="main"><p>
 Als je wilt helpen om de documentatie te verbeteren of vertalen, of wilt helpen
 met andere aspecten van het project, zie dan de documentatie voor 
-<a href="http://i2p-projekt.i2p/getinvolved.html">vrijwilligers.</a>
+<a href="http://i2p-projekt.i2p/nl/get-involved">vrijwilligers.</a>
 </p>Verdere ondersteuning is hier beschikbaar:
 <ul class="links">
-<li class="tidylist"><a href="http://i2p-projekt.i2p/faq.html">FAQ op i2p-projekt.i2p</a></li>
+<li class="tidylist"><a href="http://i2p-projekt.i2p/nl/faq">FAQ op i2p-projekt.i2p</a></li>
 </ul>
 <br>Je kunt ook het <a href="http://forum.i2p/">I2P forum</a>
 of IRC proberen.
@@ -168,7 +168,7 @@ Dit product bevat software ontwikkeld door de Apache Software Foundation
 (http://www.apache.org/).</p>
 
 <p>Een andere applicatie op deze webpagina is <a
-href="http://i2p-projekt.i2p/i2ptunnel">I2PTunnel</a> (je <a href="i2ptunnel/"
+href="http://i2p-projekt.i2p/nl/docs/api/i2ptunnel">I2PTunnel</a> (je <a href="i2ptunnel/"
 target="_blank">web interface</a>) - een GPL applicatie geschreven door mihi
 die normaal TCP/IP verkeer over I2P laat tunnelen (zoals de eepproxy en de irc
 proxy). Er is ook een <a href="http://susi.i2p/">susimail</a> web based mail
@@ -178,7 +178,7 @@ GPL applicatie geschreven door susi23. De adresboek applicatie, geschreven door
 hosts.txt bestanden (zie ./addressbook/ voor meer informatie).</p>
 
 <p>De router bevat ook standaard human's public domain <a
-href="http://i2p-projekt.i2p/sam">SAM</a> brug, welke andere client applicaties
+href="http://i2p-projekt.i2p/nl/docs/api/sam">SAM</a> brug, welke andere client applicaties
 (zoals de <a href="http://duck.i2p/i2p-bt/">bittorrent port</a>) kan gebruiken.
 Er is ook een geoptimaliseerde library voor het uitvoeren van berekeningen met
 grote getallen - jbigi - deze gebruikt de LGPL licensed <a
@@ -187,9 +187,9 @@ architecturen.  Opstarters voor windows gebruikers zijn gemaakt met <a
 href="http://launch4j.sourceforge.net/">Launch4J</a>, en de installer is
 gemaakt met <a href="http://www.izforge.com/izpack/">IzPack</a>.  Voor details
 over andere beschikbare applicaties, en hun licenties, zie het <a
-href="http://i2p-projekt.i2p/licenses">licentie beleid</a>.  Broncode voor I2P en
+href="http://i2p-projekt.i2p/nl/get-involved/develop/licenses">licentie beleid</a>.  Broncode voor I2P en
 de meeste gebundelde client applicaties kan gevonden worden op onze <a
-href="http://i2p-projekt.i2p/download">download pagina</a>.</p>
+href="http://i2p-projekt.i2p/nl/download">download pagina</a>.</p>
 
 <h2>Release geschiedenis</h2>
  <jsp:useBean class="net.i2p.router.web.ContentHelper" id="contenthelper" scope="request" />
diff --git a/apps/routerconsole/jsp/help_ru.jsp b/apps/routerconsole/jsp/help_ru.jsp
index 888aa1333a94948c0e408e3b928fedde74ae6f22..b3ef9e551922b3e20338abd6c810590b06056ba7 100644
--- a/apps/routerconsole/jsp/help_ru.jsp
+++ b/apps/routerconsole/jsp/help_ru.jsp
@@ -19,9 +19,9 @@
 <div class="main" id="main">
 
 <p> Если Вы хотите помочь в улучшении или переводе документации, если у Вас есть идеи, как еще помочь проекту, пожалуйста, загляните в раздел документации 
-<a href="http://i2p-projekt.i2p/getinvolved.html">как стать участником</a>. </p>
+<a href="http://i2p-projekt.i2p/ru/get-involved">как стать участником</a>. </p>
 
-<p>Дальнейшие инструкции доступны в <a href="http://i2p-projekt.i2p/faq.html">FAQ на i2p-projekt.i2p</a>
+<p>Дальнейшие инструкции доступны в <a href="http://i2p-projekt.i2p/ru/faq">FAQ на i2p-projekt.i2p</a>
 
 <br>Также, имеет смысл зайти на <a href="http://forum.i2p/">форум I2P</a> и IRC-каналы проекта.</p>
 
@@ -161,9 +161,9 @@
 <p>Поверх I2P маршрутизатора работают различные приложения-клиенты, каждое со своим набором лицензий и зависимостей. Например, эта страница входит в приложение консоли маршрутизатора, которое сделано из усеченной версии <a href="http://jetty.mortbay.com/jetty/index.html">Jetty</a> (в сборку не включены демонстрационные приложения и прочие дополнения, настройки упрощены). Jetty позволяет запускать в составе маршрутизатора стандартные JSP/сервлеты. Jetty использует javax.servlet.jar разработанный в составе проекта Apache (http://www.apache.org/). 
 </p>
 
-<p>Ещё одно приложение на этой странице — <a href="http://i2p-projekt.i2p/i2ptunnel">I2PTunnel</a> (а тут <a href="i2ptunnel/" target="_blank">его вебинтерфейс</a>).  Автор mihi, лицензия GPL. I2PTunnel занимается туннелированнием обычного TCP/IP трафика через I2P (может применяться для eepproxy и irc-прокси). <a href="http://susi.i2p/">susimail</a> — почтовый клиент с <a href="susimail/susimail">вебинтерфейсом</a>, автор susi23, лицензия  GPL. Адресная книга помогает управлять содержимым Ваших hosts.txt файлов (подробнее см. ./addressbook/), автор <a href="http://ragnarok.i2p/">Ragnarok</a>.</p> 
+<p>Ещё одно приложение на этой странице — <a href="http://i2p-projekt.i2p/ru/docs/api/i2ptunnel">I2PTunnel</a> (а тут <a href="i2ptunnel/" target="_blank">его вебинтерфейс</a>).  Автор mihi, лицензия GPL. I2PTunnel занимается туннелированнием обычного TCP/IP трафика через I2P (может применяться для eepproxy и irc-прокси). <a href="http://susi.i2p/">susimail</a> — почтовый клиент с <a href="susimail/susimail">вебинтерфейсом</a>, автор susi23, лицензия  GPL. Адресная книга помогает управлять содержимым Ваших hosts.txt файлов (подробнее см. ./addressbook/), автор <a href="http://ragnarok.i2p/">Ragnarok</a>.</p> 
 
-<p>В поставку маршрутизатора включен <a href="http://i2p-projekt.i2p/sam">SAM</a> интерфейс, автор human, приложение в общественном достоянии. SAM предназначен для использования приложениями-клиентами, такими как <a href="http://duck.i2p/i2p-bt/">bittorrent-клиенты</a>. Маршрутизатором используется оптимизированная под разные PC-архитектуры библиотека для вычислений с большими числами – jbigi, которая в свою очередь использует библиотеку <a href="http://swox.com/gmp/">GMP</a> (LGPL лицензия). Вспомогательные приложения для Windows созданы с использованием <a href="http://launch4j.sourceforge.net/">Launch4J</a>, а инсталлятор собран при помощи <a href="http://www.izforge.com/izpack/">IzPack</a>. Подробнее о других доступных приложениях и их лицензиях смотрите на странице <a href="http://i2p-projekt.i2p/licenses">I2P Software Licenses</a>. Исходный код I2P маршрутизатора и идущих в комплекте приложений можно найти на нашей <a href="http://i2p-projekt.i2p/download">странице загрузки</a>. </p> 
+<p>В поставку маршрутизатора включен <a href="http://i2p-projekt.i2p/ru/docs/api/sam">SAM</a> интерфейс, автор human, приложение в общественном достоянии. SAM предназначен для использования приложениями-клиентами, такими как <a href="http://duck.i2p/i2p-bt/">bittorrent-клиенты</a>. Маршрутизатором используется оптимизированная под разные PC-архитектуры библиотека для вычислений с большими числами – jbigi, которая в свою очередь использует библиотеку <a href="http://swox.com/gmp/">GMP</a> (LGPL лицензия). Вспомогательные приложения для Windows созданы с использованием <a href="http://launch4j.sourceforge.net/">Launch4J</a>, а инсталлятор собран при помощи <a href="http://www.izforge.com/izpack/">IzPack</a>. Подробнее о других доступных приложениях и их лицензиях смотрите на странице <a href="http://i2p-projekt.i2p/ru/get-involved/develop/licenses">I2P Software Licenses</a>. Исходный код I2P маршрутизатора и идущих в комплекте приложений можно найти на нашей <a href="http://i2p-projekt.i2p/ru/download">странице загрузки</a>. </p> 
 
 
 <h2>История версий</h2>
diff --git a/apps/routerconsole/jsp/logs.jsp b/apps/routerconsole/jsp/logs.jsp
index 80ef70b9d349ed21e058ec33b82d265c8b5efa97..538ae2abf5594a69812e75e78953833e55c556c0 100644
--- a/apps/routerconsole/jsp/logs.jsp
+++ b/apps/routerconsole/jsp/logs.jsp
@@ -17,7 +17,9 @@
 %><%=intl._("Please report bugs on {0} or {1}.",
           "<a href=\"http://trac.i2p2.i2p/newticket\">trac.i2p2.i2p</a>",
           "<a href=\"https://trac.i2p2.de/newticket\">trac.i2p2.de</a>")%>
+<!--
 <%=intl._("You may use the username \"guest\" and password \"guest\" if you do not wish to register.")%>
+-->
 <p><i><%=intl._("Please include this information in bug reports")%>:</i>
  <p>
 <b>I2P version:</b> <%=net.i2p.router.RouterVersion.FULL_VERSION%><br>
diff --git a/apps/routerconsole/locale-countries/messages_ja.po b/apps/routerconsole/locale-countries/messages_ja.po
index ced5f7d6b9226fd9ed942bc8867a1974905132aa..36f76e5461061e38024e0db739b9f29735aa91ee 100644
--- a/apps/routerconsole/locale-countries/messages_ja.po
+++ b/apps/routerconsole/locale-countries/messages_ja.po
@@ -2,22 +2,21 @@
 # Copyright (C) 2009 The I2P Project
 # This file is distributed under the same license as the routerconsole package.
 # To contribute translations, see http://www.i2p2.de/newdevelopers
-#
+# 
 # Translators:
-# plazmism <gomidori@live.jp>, 2013
+# plazmism <gomidori@live.jp>, 2013-2014
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-19 22:59+0000\n"
-"PO-Revision-Date: 2013-11-17 04:10+0000\n"
+"POT-Creation-Date: 2013-10-14 13:33+0000\n"
+"PO-Revision-Date: 2014-02-05 11:54+0000\n"
 "Last-Translator: plazmism <gomidori@live.jp>\n"
-"Language-Team: Japanese (http://www.transifex.com/projects/p/I2P/language/"
-"ja/)\n"
-"Language: ja\n"
+"Language-Team: Japanese (http://www.transifex.com/projects/p/I2P/language/ja/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: ja\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 msgid "Anonymous Proxy"
@@ -69,697 +68,697 @@ msgid "Australia"
 msgstr "オーストラリア"
 
 msgid "Aruba"
-msgstr ""
+msgstr "アルバ"
 
 msgid "Ã…land Islands"
-msgstr ""
+msgstr "オーランド諸島"
 
 msgid "Azerbaijan"
-msgstr ""
+msgstr "アゼルバイジャン"
 
 msgid "Bosnia and Herzegovina"
-msgstr ""
+msgstr "ボスニア・ヘルツェゴビナ"
 
 msgid "Barbados"
-msgstr ""
+msgstr "バルバドス"
 
 msgid "Bangladesh"
-msgstr ""
+msgstr "バングラデシュ"
 
 msgid "Belgium"
-msgstr ""
+msgstr "ベルギー"
 
 msgid "Burkina Faso"
-msgstr ""
+msgstr "ブルキナファソ"
 
 msgid "Bulgaria"
-msgstr ""
+msgstr "ブルガリア"
 
 msgid "Bahrain"
-msgstr ""
+msgstr "バーレーン"
 
 msgid "Burundi"
-msgstr ""
+msgstr "ブルンジ"
 
 msgid "Benin"
-msgstr ""
+msgstr "ベナン"
 
 msgid "Bermuda"
-msgstr ""
+msgstr "バミューダ"
 
 msgid "Brunei Darussalam"
-msgstr ""
+msgstr "ブルネイ・ダルサラーム"
 
 msgid "Bolivia"
-msgstr ""
+msgstr "ボリビア"
 
 msgid "Brazil"
-msgstr ""
+msgstr "ブラジル"
 
 msgid "Bahamas"
-msgstr ""
+msgstr "バハマ"
 
 msgid "Bhutan"
-msgstr ""
+msgstr "ブータン"
 
 msgid "Bouvet Island"
-msgstr ""
+msgstr "ブーヴェ島"
 
 msgid "Botswana"
-msgstr ""
+msgstr "ボツワナ"
 
 msgid "Belarus"
-msgstr ""
+msgstr "ベラルーシ"
 
 msgid "Belize"
-msgstr ""
+msgstr "ベリーズ"
 
 msgid "Canada"
-msgstr ""
+msgstr "カナダ"
 
 msgid "Cocos (Keeling) Islands"
-msgstr ""
+msgstr "ココス(キーリング)諸島"
 
 msgid "The Democratic Republic of the Congo"
-msgstr ""
+msgstr "コンゴ民主共和国"
 
 msgid "Central African Republic"
-msgstr ""
+msgstr "中央アフリカ共和国"
 
 msgid "Congo"
-msgstr ""
+msgstr "コンゴ"
 
 msgid "Switzerland"
-msgstr ""
+msgstr "スイス"
 
 msgid "Cote D'Ivoire"
-msgstr ""
+msgstr "コートジボワール"
 
 msgid "Cook Islands"
-msgstr ""
+msgstr "クック諸島"
 
 msgid "Chile"
-msgstr ""
+msgstr "チリ"
 
 msgid "Cameroon"
-msgstr ""
+msgstr "カメルーン"
 
 msgid "China"
-msgstr ""
+msgstr "中国"
 
 msgid "Colombia"
-msgstr ""
+msgstr "コロンビア"
 
 msgid "Costa Rica"
-msgstr ""
+msgstr "コスタリカ"
 
 msgid "Serbia and Montenegro"
-msgstr ""
+msgstr "セルビア・モンテネグロ"
 
 msgid "Cuba"
-msgstr ""
+msgstr "キューバ"
 
 msgid "Cape Verde"
-msgstr ""
+msgstr "カーボベルデ"
 
 msgid "Curaçao"
-msgstr ""
+msgstr "キュラソー"
 
 msgid "Christmas Island"
-msgstr ""
+msgstr "クリスマス島"
 
 msgid "Cyprus"
-msgstr ""
+msgstr "キプロス"
 
 msgid "Czech Republic"
-msgstr ""
+msgstr "チェコ共和国"
 
 msgid "Germany"
-msgstr ""
+msgstr "ドイツ"
 
 msgid "Djibouti"
-msgstr ""
+msgstr "ジプチ"
 
 msgid "Denmark"
-msgstr ""
+msgstr "デンマーク"
 
 msgid "Dominica"
-msgstr ""
+msgstr "ドミニカ"
 
 msgid "Dominican Republic"
-msgstr ""
+msgstr "ドミニカ共和国"
 
 msgid "Algeria"
-msgstr ""
+msgstr "アルジェリア"
 
 msgid "Ecuador"
-msgstr ""
+msgstr "エクアドル"
 
 msgid "Estonia"
-msgstr ""
+msgstr "エストニア"
 
 msgid "Egypt"
-msgstr ""
+msgstr "エジプト"
 
 msgid "Western Sahara"
-msgstr ""
+msgstr "西サハラ"
 
 msgid "Eritrea"
-msgstr ""
+msgstr "エリトリア"
 
 msgid "Spain"
-msgstr ""
+msgstr "スペイン"
 
 msgid "Ethiopia"
-msgstr ""
+msgstr "エチオピア"
 
 msgid "European Union"
-msgstr ""
+msgstr "ヨーロッパ連合"
 
 msgid "Finland"
-msgstr ""
+msgstr "フィンランド"
 
 msgid "Fiji"
-msgstr ""
+msgstr "フィジー"
 
 msgid "Falkland Islands (Malvinas)"
-msgstr ""
+msgstr "フォークランド諸島 (マルビナス)"
 
 msgid "Federated States of Micronesia"
-msgstr ""
+msgstr "ミクロネシア連邦"
 
 msgid "Faroe Islands"
-msgstr ""
+msgstr "フェロー諸島"
 
 msgid "France"
-msgstr ""
+msgstr "フランス"
 
 msgid "Gabon"
-msgstr ""
+msgstr "ガボン"
 
 msgid "United Kingdom"
-msgstr ""
+msgstr "イギリス"
 
 msgid "Grenada"
-msgstr ""
+msgstr "グレナダ"
 
 msgid "Georgia"
-msgstr ""
+msgstr "グルジア"
 
 msgid "French Guiana"
-msgstr ""
+msgstr "フランス領ギアナ"
 
 msgid "Guernsey"
-msgstr ""
+msgstr "ガーンジー"
 
 msgid "Ghana"
-msgstr ""
+msgstr "ガーナ"
 
 msgid "Gibraltar"
-msgstr ""
+msgstr "ジブラルタル"
 
 msgid "Greenland"
-msgstr ""
+msgstr "グリーンランド"
 
 msgid "Gambia"
-msgstr ""
+msgstr "ガンビア"
 
 msgid "Guinea"
-msgstr ""
+msgstr "ギニア"
 
 msgid "Guadeloupe"
-msgstr ""
+msgstr "グアドループ"
 
 msgid "Equatorial Guinea"
-msgstr ""
+msgstr "赤道ギニア"
 
 msgid "Greece"
-msgstr ""
+msgstr "ギリシャ"
 
 msgid "South Georgia and the South Sandwich Islands"
-msgstr ""
+msgstr "サウスジョージア・サウスサンドウィッチ諸島"
 
 msgid "Guatemala"
-msgstr ""
+msgstr "グアテマラ"
 
 msgid "Guam"
-msgstr ""
+msgstr "グアム"
 
 msgid "Guinea-Bissau"
-msgstr ""
+msgstr "ギニアビサウ"
 
 msgid "Guyana"
-msgstr ""
+msgstr "ガイアナ"
 
 msgid "Hong Kong"
-msgstr ""
+msgstr "香港"
 
 msgid "Honduras"
-msgstr ""
+msgstr "ホンジュラス"
 
 msgid "Croatia"
-msgstr ""
+msgstr "クロアチア"
 
 msgid "Haiti"
-msgstr ""
+msgstr "ハイチ"
 
 msgid "Hungary"
-msgstr ""
+msgstr "ハンガリー"
 
 msgid "Indonesia"
-msgstr ""
+msgstr "インドネシア"
 
 msgid "Ireland"
-msgstr ""
+msgstr "アイルランド"
 
 msgid "Israel"
-msgstr ""
+msgstr "イスラエル"
 
 msgid "Isle of Man"
-msgstr ""
+msgstr "マン島"
 
 msgid "India"
-msgstr ""
+msgstr "インド"
 
 msgid "British Indian Ocean Territory"
-msgstr ""
+msgstr "イギリス領インド洋地域"
 
 msgid "Iraq"
-msgstr ""
+msgstr "イラク"
 
 msgid "Islamic Republic of Iran"
-msgstr ""
+msgstr "イラン・イスラム共和国"
 
 msgid "Iceland"
-msgstr ""
+msgstr "アイスランド"
 
 msgid "Italy"
-msgstr ""
+msgstr "イタリア"
 
 msgid "Jersey"
-msgstr ""
+msgstr "ジャージー"
 
 msgid "Jamaica"
-msgstr ""
+msgstr "ジャマイカ"
 
 msgid "Jordan"
-msgstr ""
+msgstr "ヨルダン"
 
 msgid "Japan"
-msgstr ""
+msgstr "日本"
 
 msgid "Kenya"
-msgstr ""
+msgstr "ケニア"
 
 msgid "Kyrgyzstan"
-msgstr ""
+msgstr "キルギスタン"
 
 msgid "Cambodia"
-msgstr ""
+msgstr "カンボジア"
 
 msgid "Kiribati"
-msgstr ""
+msgstr "キリバス"
 
 msgid "Comoros"
-msgstr ""
+msgstr "コモロ"
 
 msgid "Saint Kitts and Nevis"
-msgstr ""
+msgstr "セントクリストファー・ネイビス"
 
 msgid "The Democratic People's Republic of Korea"
-msgstr ""
+msgstr "朝鮮民主主義人民共和国"
 
 msgid "Republic of Korea"
-msgstr ""
+msgstr "大韓民国"
 
 msgid "Kuwait"
-msgstr ""
+msgstr "クウェート"
 
 msgid "Cayman Islands"
-msgstr ""
+msgstr "ケイマン諸島"
 
 msgid "Kazakhstan"
-msgstr ""
+msgstr "カザフスタン"
 
 msgid "Lao People's Democratic Republic"
-msgstr ""
+msgstr "ラオス人民民主共和国"
 
 msgid "Lebanon"
-msgstr ""
+msgstr "レバノン"
 
 msgid "Saint Lucia"
-msgstr ""
+msgstr "セントルシア"
 
 msgid "Liechtenstein"
-msgstr ""
+msgstr "リヒテンシュタイン"
 
 msgid "Sri Lanka"
-msgstr ""
+msgstr "スリランカ"
 
 msgid "Liberia"
-msgstr ""
+msgstr "リベリア"
 
 msgid "Lesotho"
-msgstr ""
+msgstr "レソト"
 
 msgid "Lithuania"
-msgstr ""
+msgstr "リトアニア"
 
 msgid "Luxembourg"
-msgstr ""
+msgstr "ルクセンブルク"
 
 msgid "Latvia"
-msgstr ""
+msgstr "ラトビア"
 
 msgid "Libyan Arab Jamahiriya"
-msgstr ""
+msgstr "リビア"
 
 msgid "Morocco"
-msgstr ""
+msgstr "モロッコ"
 
 msgid "Monaco"
-msgstr ""
+msgstr "モナコ"
 
 msgid "Republic of Moldova"
-msgstr ""
+msgstr "モルダビア共和国"
 
 msgid "Montenegro"
-msgstr ""
+msgstr "モンテネグロ"
 
 msgid "Saint Martin"
-msgstr ""
+msgstr "サンマルタン"
 
 msgid "Madagascar"
-msgstr ""
+msgstr "マダガスカル"
 
 msgid "Marshall Islands"
-msgstr ""
+msgstr "マーシャル諸島"
 
 msgid "The Former Yugoslav Republic of Macedonia"
-msgstr ""
+msgstr "マケドニア・旧ユーゴスラビア共和国"
 
 msgid "Mali"
-msgstr ""
+msgstr "マリ"
 
 msgid "Myanmar"
-msgstr ""
+msgstr "ミャンマー"
 
 msgid "Mongolia"
-msgstr ""
+msgstr "モンゴル"
 
 msgid "Macao"
-msgstr ""
+msgstr "マカオ"
 
 msgid "Northern Mariana Islands"
-msgstr ""
+msgstr "北マリアナ諸島連邦"
 
 msgid "Martinique"
-msgstr ""
+msgstr "マルティニーク島"
 
 msgid "Mauritania"
-msgstr ""
+msgstr "モーリタニア"
 
 msgid "Montserrat"
-msgstr ""
+msgstr "モンセラー"
 
 msgid "Malta"
-msgstr ""
+msgstr "マルタ"
 
 msgid "Mauritius"
-msgstr ""
+msgstr "モーリシャス"
 
 msgid "Maldives"
-msgstr ""
+msgstr "モルジブ"
 
 msgid "Malawi"
-msgstr ""
+msgstr "マラウイ"
 
 msgid "Mexico"
-msgstr ""
+msgstr "メキシコ"
 
 msgid "Malaysia"
-msgstr ""
+msgstr "マレーシア"
 
 msgid "Mozambique"
-msgstr ""
+msgstr "モザンビーク"
 
 msgid "Namibia"
-msgstr ""
+msgstr "ナミビア"
 
 msgid "New Caledonia"
-msgstr ""
+msgstr "ニューカレドニア"
 
 msgid "Niger"
-msgstr ""
+msgstr "ニジェール"
 
 msgid "Norfolk Island"
-msgstr ""
+msgstr "ノーフォーク島"
 
 msgid "Nigeria"
-msgstr ""
+msgstr "ナイジェリア"
 
 msgid "Nicaragua"
-msgstr ""
+msgstr "ニカラグア"
 
 msgid "Netherlands"
-msgstr ""
+msgstr "オランダ"
 
 msgid "Norway"
-msgstr ""
+msgstr "ノルウェー"
 
 msgid "Nepal"
-msgstr ""
+msgstr "ネパール"
 
 msgid "Nauru"
-msgstr ""
+msgstr "ナウル"
 
 msgid "Niue"
-msgstr ""
+msgstr "ニウエ"
 
 msgid "New Zealand"
-msgstr ""
+msgstr "ニュージーランド"
 
 msgid "Oman"
-msgstr ""
+msgstr "オマーン"
 
 msgid "Panama"
-msgstr ""
+msgstr "パナマ"
 
 msgid "Peru"
-msgstr ""
+msgstr "ペルー"
 
 msgid "French Polynesia"
-msgstr ""
+msgstr "フランス領ポリネシア"
 
 msgid "Papua New Guinea"
-msgstr ""
+msgstr "パプアニューギニア"
 
 msgid "Philippines"
-msgstr ""
+msgstr "フィリピン"
 
 msgid "Pakistan"
-msgstr ""
+msgstr "パキスタン"
 
 msgid "Poland"
-msgstr ""
+msgstr "ポーランド"
 
 msgid "Saint Pierre and Miquelon"
-msgstr ""
+msgstr "サンピエール島・ミクロン島"
 
 msgid "Pitcairn Islands"
-msgstr ""
+msgstr "ピトケアン諸島"
 
 msgid "Puerto Rico"
-msgstr ""
+msgstr "プエルトリコ"
 
 msgid "Palestinian Territory"
-msgstr ""
+msgstr "パレスチナ自治領"
 
 msgid "Portugal"
-msgstr ""
+msgstr "ポルトガル"
 
 msgid "Palau"
-msgstr ""
+msgstr "パラオ"
 
 msgid "Paraguay"
-msgstr ""
+msgstr "パラグアイ"
 
 msgid "Qatar"
-msgstr ""
+msgstr "カタール"
 
 msgid "Réunion"
-msgstr ""
+msgstr "レユニオン"
 
 msgid "Romania"
-msgstr ""
+msgstr "ルーマニア"
 
 msgid "Serbia"
-msgstr ""
+msgstr "セルビア"
 
 msgid "Russian Federation"
-msgstr ""
+msgstr "ロシア連邦"
 
 msgid "Rwanda"
-msgstr ""
+msgstr "ルワンダ"
 
 msgid "Saudi Arabia"
-msgstr ""
+msgstr "サウジアラビア"
 
 msgid "Solomon Islands"
-msgstr ""
+msgstr "ソロモン諸島"
 
 msgid "Seychelles"
-msgstr ""
+msgstr "セイシェル"
 
 msgid "Sudan"
-msgstr ""
+msgstr "スーダン"
 
 msgid "Sweden"
-msgstr ""
+msgstr "スウェーデン"
 
 msgid "Singapore"
-msgstr ""
+msgstr "シンガポール"
 
 msgid "Saint Helena"
-msgstr ""
+msgstr "セントヘレナ"
 
 msgid "Slovenia"
-msgstr ""
+msgstr "スロベニア"
 
 msgid "Svalbard and Jan Mayen"
-msgstr ""
+msgstr "スヴァールバル・ヤンマイエン"
 
 msgid "Slovakia"
-msgstr ""
+msgstr "スロヴァキア"
 
 msgid "Sierra Leone"
-msgstr ""
+msgstr "シエラ・レオネ"
 
 msgid "San Marino"
-msgstr ""
+msgstr "サンマリノ"
 
 msgid "Senegal"
-msgstr ""
+msgstr "セネガル"
 
 msgid "Somalia"
-msgstr ""
+msgstr "ソマリア"
 
 msgid "Suriname"
-msgstr ""
+msgstr "スリナム"
 
 msgid "Sao Tome and Principe"
-msgstr ""
+msgstr "サントメ・プリンシペ"
 
 msgid "El Salvador"
-msgstr ""
+msgstr "エルサルバドル"
 
 msgid "Syrian Arab Republic"
-msgstr ""
+msgstr "シリア・アラブ共和国"
 
 msgid "Swaziland"
-msgstr ""
+msgstr "スワジランド"
 
 msgid "Turks and Caicos Islands"
-msgstr ""
+msgstr "タークス・カイコス諸島"
 
 msgid "Chad"
-msgstr ""
+msgstr "チャド"
 
 msgid "French Southern Territories"
-msgstr ""
+msgstr "フランス南方領土"
 
 msgid "Togo"
-msgstr ""
+msgstr "トーゴ"
 
 msgid "Thailand"
-msgstr ""
+msgstr "タイ"
 
 msgid "Tajikistan"
-msgstr ""
+msgstr "タジキスタン"
 
 msgid "Tokelau"
-msgstr ""
+msgstr "トケラウ"
 
 msgid "Timor-Leste"
-msgstr ""
+msgstr "東ティモール"
 
 msgid "Turkmenistan"
-msgstr ""
+msgstr "トルクメニスタン"
 
 msgid "Tunisia"
-msgstr ""
+msgstr "チュニジア"
 
 msgid "Tonga"
-msgstr ""
+msgstr "トンガ"
 
 msgid "Turkey"
-msgstr ""
+msgstr "トルコ"
 
 msgid "Trinidad and Tobago"
-msgstr ""
+msgstr "トリニダード・トバゴ"
 
 msgid "Tuvalu"
-msgstr ""
+msgstr "ツバル"
 
 msgid "Taiwan"
-msgstr ""
+msgstr "台湾"
 
 msgid "United Republic of Tanzania"
-msgstr ""
+msgstr "タンザニア連合共和国"
 
 msgid "Ukraine"
-msgstr ""
+msgstr "ウクライナ"
 
 msgid "Uganda"
-msgstr ""
+msgstr "ウガンダ"
 
 msgid "United States Minor Outlying Islands"
-msgstr ""
+msgstr "合衆国領有小離島"
 
 msgid "United States"
-msgstr ""
+msgstr "アメリカ合衆国"
 
 msgid "Uruguay"
-msgstr ""
+msgstr "ウルグアイ"
 
 msgid "Uzbekistan"
-msgstr ""
+msgstr "ウズベキスタン"
 
 msgid "Holy See (Vatican City State)"
-msgstr ""
+msgstr "教皇庁 (ヴァチカン市国)"
 
 msgid "Saint Vincent and the Grenadines"
-msgstr ""
+msgstr "セントビンセントおよびグレナディーン諸島"
 
 msgid "Venezuela"
-msgstr ""
+msgstr "ベネズエラ"
 
 msgid "Virgin Islands"
-msgstr ""
+msgstr "バージン諸島"
 
 msgid "Viet Nam"
-msgstr ""
+msgstr "ベトナム"
 
 msgid "Vanuatu"
-msgstr ""
+msgstr "バヌアツ"
 
 msgid "Wallis and Futuna"
-msgstr ""
+msgstr "ウォリス・フトゥーナ"
 
 msgid "Samoa"
-msgstr ""
+msgstr "サモア"
 
 msgid "Yemen"
-msgstr ""
+msgstr "イエメン"
 
 msgid "Mayotte"
-msgstr ""
+msgstr "マヨット"
 
 msgid "South Africa"
-msgstr ""
+msgstr "南アフリカ"
 
 msgid "Zambia"
-msgstr ""
+msgstr "ザンビア"
 
 msgid "Zimbabwe"
-msgstr ""
+msgstr "ジンバブエ"
diff --git a/apps/routerconsole/locale-countries/messages_pt_BR.po b/apps/routerconsole/locale-countries/messages_pt_BR.po
index 4f3a00dde03dc0dd73440988bc73a8fa3754a9d2..8e573ec66aaf940f8008f492111fc4f8cf2a8ce4 100644
--- a/apps/routerconsole/locale-countries/messages_pt_BR.po
+++ b/apps/routerconsole/locale-countries/messages_pt_BR.po
@@ -5,13 +5,13 @@
 # 
 # Translators:
 # blueboy, 2013
-# blueboy, 2013
+# blueboy, 2013-2014
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-10-14 13:33+0000\n"
-"PO-Revision-Date: 2013-12-18 03:19+0000\n"
+"PO-Revision-Date: 2014-02-04 19:47+0000\n"
 "Last-Translator: blueboy\n"
 "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
@@ -210,226 +210,226 @@ msgid "Dominican Republic"
 msgstr "República Dominicana"
 
 msgid "Algeria"
-msgstr ""
+msgstr "Argélia"
 
 msgid "Ecuador"
-msgstr ""
+msgstr "Equador"
 
 msgid "Estonia"
-msgstr ""
+msgstr "Estônia"
 
 msgid "Egypt"
-msgstr ""
+msgstr "Egito"
 
 msgid "Western Sahara"
-msgstr ""
+msgstr "Saara Ocidental"
 
 msgid "Eritrea"
-msgstr ""
+msgstr "Eritreia"
 
 msgid "Spain"
-msgstr ""
+msgstr "Espanha"
 
 msgid "Ethiopia"
-msgstr ""
+msgstr "Etiópia"
 
 msgid "European Union"
-msgstr ""
+msgstr "União Europeia"
 
 msgid "Finland"
-msgstr ""
+msgstr "Finlândia"
 
 msgid "Fiji"
-msgstr ""
+msgstr "Fiji"
 
 msgid "Falkland Islands (Malvinas)"
-msgstr ""
+msgstr "Malvinas (Ilhas Falkland)"
 
 msgid "Federated States of Micronesia"
-msgstr ""
+msgstr "Estados Federados da Micronésia"
 
 msgid "Faroe Islands"
-msgstr ""
+msgstr "Ilhas Faroé"
 
 msgid "France"
-msgstr ""
+msgstr "França"
 
 msgid "Gabon"
-msgstr ""
+msgstr "Gabão"
 
 msgid "United Kingdom"
-msgstr ""
+msgstr "Reino Unido"
 
 msgid "Grenada"
-msgstr ""
+msgstr "Granada"
 
 msgid "Georgia"
-msgstr ""
+msgstr "Geórgia"
 
 msgid "French Guiana"
-msgstr ""
+msgstr "Guiana Francesa"
 
 msgid "Guernsey"
-msgstr ""
+msgstr "Guernsey"
 
 msgid "Ghana"
-msgstr ""
+msgstr "Gana"
 
 msgid "Gibraltar"
-msgstr ""
+msgstr "Gibraltar"
 
 msgid "Greenland"
-msgstr ""
+msgstr "Groenlândia"
 
 msgid "Gambia"
-msgstr ""
+msgstr "Gâmbia"
 
 msgid "Guinea"
-msgstr ""
+msgstr "Guiné"
 
 msgid "Guadeloupe"
-msgstr ""
+msgstr "Guadalupe"
 
 msgid "Equatorial Guinea"
-msgstr ""
+msgstr "Guiné Equatorial"
 
 msgid "Greece"
-msgstr ""
+msgstr "Grécia"
 
 msgid "South Georgia and the South Sandwich Islands"
-msgstr ""
+msgstr "Ilhas Geórgia do Sul e Sandwich do Sul"
 
 msgid "Guatemala"
-msgstr ""
+msgstr "Guatemala"
 
 msgid "Guam"
-msgstr ""
+msgstr "Guam"
 
 msgid "Guinea-Bissau"
-msgstr ""
+msgstr "Guiné-Bissau"
 
 msgid "Guyana"
-msgstr ""
+msgstr "Guiana"
 
 msgid "Hong Kong"
-msgstr ""
+msgstr "Hong Kong"
 
 msgid "Honduras"
-msgstr ""
+msgstr "Honduras"
 
 msgid "Croatia"
-msgstr ""
+msgstr "Croácia"
 
 msgid "Haiti"
-msgstr ""
+msgstr "Haiti"
 
 msgid "Hungary"
-msgstr ""
+msgstr "Hungria"
 
 msgid "Indonesia"
-msgstr ""
+msgstr "Indonésia"
 
 msgid "Ireland"
-msgstr ""
+msgstr "Irlanda"
 
 msgid "Israel"
-msgstr ""
+msgstr "Israel"
 
 msgid "Isle of Man"
-msgstr ""
+msgstr "Ilha de Man"
 
 msgid "India"
-msgstr ""
+msgstr "Índia"
 
 msgid "British Indian Ocean Territory"
-msgstr ""
+msgstr "Território Britânico do Oceano Índico"
 
 msgid "Iraq"
-msgstr ""
+msgstr "Iraque"
 
 msgid "Islamic Republic of Iran"
-msgstr ""
+msgstr "Irã"
 
 msgid "Iceland"
-msgstr ""
+msgstr "Islândia"
 
 msgid "Italy"
-msgstr ""
+msgstr "Itália"
 
 msgid "Jersey"
-msgstr ""
+msgstr "Jersey"
 
 msgid "Jamaica"
-msgstr ""
+msgstr "Jamaica"
 
 msgid "Jordan"
-msgstr ""
+msgstr "Jordânia"
 
 msgid "Japan"
-msgstr ""
+msgstr "Japão"
 
 msgid "Kenya"
-msgstr ""
+msgstr "Quênia"
 
 msgid "Kyrgyzstan"
-msgstr ""
+msgstr "Quirguistão"
 
 msgid "Cambodia"
-msgstr ""
+msgstr "Camboja"
 
 msgid "Kiribati"
-msgstr ""
+msgstr "Quiribati"
 
 msgid "Comoros"
-msgstr ""
+msgstr "Comores"
 
 msgid "Saint Kitts and Nevis"
-msgstr ""
+msgstr "São Cristóvão e Nevis"
 
 msgid "The Democratic People's Republic of Korea"
-msgstr ""
+msgstr "Coreia do Norte"
 
 msgid "Republic of Korea"
-msgstr ""
+msgstr "Coreia do Sul"
 
 msgid "Kuwait"
-msgstr ""
+msgstr "Kuaite"
 
 msgid "Cayman Islands"
-msgstr ""
+msgstr "Ilhas Cayman"
 
 msgid "Kazakhstan"
-msgstr ""
+msgstr "Cazaquistão"
 
 msgid "Lao People's Democratic Republic"
-msgstr ""
+msgstr "Laos"
 
 msgid "Lebanon"
-msgstr ""
+msgstr "Líbano"
 
 msgid "Saint Lucia"
-msgstr ""
+msgstr "Santa Lúcia"
 
 msgid "Liechtenstein"
-msgstr ""
+msgstr "Liechtenstein"
 
 msgid "Sri Lanka"
-msgstr ""
+msgstr "Sri Lanka"
 
 msgid "Liberia"
-msgstr ""
+msgstr "Libéria"
 
 msgid "Lesotho"
-msgstr ""
+msgstr "Lesoto"
 
 msgid "Lithuania"
-msgstr ""
+msgstr "Lituânia"
 
 msgid "Luxembourg"
-msgstr ""
+msgstr "Luxemburgo"
 
 msgid "Latvia"
-msgstr ""
+msgstr "Letônia"
 
 msgid "Libyan Arab Jamahiriya"
 msgstr ""
diff --git a/apps/routerconsole/locale-news/messages_ja.po b/apps/routerconsole/locale-news/messages_ja.po
index cd7270da3ff573e3c0027a28c8c54d8db861bf27..b225c6d7d01440e40f8fb29247489d2f0a320c9a 100644
--- a/apps/routerconsole/locale-news/messages_ja.po
+++ b/apps/routerconsole/locale-news/messages_ja.po
@@ -2,26 +2,25 @@
 # Copyright (C) 2009 The I2P Project
 # This file is distributed under the same license as the routerconsole package.
 # To contribute translations, see http://www.i2p2.de/newdevelopers
-#
+# 
 # Translators:
-# plazmism <gomidori@live.jp>, 2013
+# plazmism <gomidori@live.jp>, 2013-2014
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-12-01 20:04+0000\n"
-"PO-Revision-Date: 2013-11-26 10:49+0000\n"
+"POT-Creation-Date: 2013-07-13 21:46+0000\n"
+"PO-Revision-Date: 2014-02-05 11:58+0000\n"
 "Last-Translator: plazmism <gomidori@live.jp>\n"
-"Language-Team: Japanese (http://www.transifex.com/projects/p/I2P/language/"
-"ja/)\n"
-"Language: ja\n"
+"Language-Team: Japanese (http://www.transifex.com/projects/p/I2P/language/ja/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: ja\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
 msgid "Congratulations on getting I2P installed!"
-msgstr "I2P がインストールされたことに関する設定"
+msgstr "I2P のインストールに際する設定"
 
 msgid "Welcome to I2P!"
 msgstr "I2P にようこそ!"
@@ -32,21 +31,18 @@ msgstr "I2P が起動し、ピアを検索するまで{0}お待ちください{1
 
 #, java-format
 msgid ""
-"While you are waiting, please {0}adjust your bandwidth settings{1} on the {2}"
-"configuration page{3}."
+"While you are waiting, please {0}adjust your bandwidth settings{1} on the "
+"{2}configuration page{3}."
 msgstr "お待ちの間、{2}設定ページ{3}で{0}帯域幅設定を調整{1}してください。"
 
-msgid "Also you can setup your browser to use the I2P proxy to reach eepsites."
-msgstr ""
-"また、 eepsite に到達するために I2P プロキシを使用するためにブラウザをセット"
-"アップしてください。"
+msgid ""
+"Also you can setup your browser to use the I2P proxy to reach eepsites."
+msgstr "また、 eepsite に到達するために I2P プロキシを使用するためにブラウザをセットアップしてください。"
 
 msgid ""
 "Just enter 127.0.0.1 (or localhost) port 4444 as a http proxy into your "
 "browser settings."
-msgstr ""
-"127.0.0.1 (または localhost) ポート 4444番をHTTPプロキシとして、ブラウザ設定"
-"に入力してください。"
+msgstr "127.0.0.1 (または localhost) ポート 4444番をHTTPプロキシとして、ブラウザ設定に入力してください。"
 
 msgid "Do not use SOCKS for this."
 msgstr "これには SOCKS を使用しないでください。"
@@ -54,20 +50,16 @@ msgstr "これには SOCKS を使用しないでください。"
 #, java-format
 msgid ""
 "More information can be found on the {0}I2P browser proxy setup page{1}."
-msgstr "さらなる情報は {0}I2P ブラウザプロキシ設定ページ{1}で見つけられます。"
+msgstr "詳細は {0}I2P ブラウザプロキシ設定ページ{1} にあります。"
 
 #, java-format
 msgid ""
-"Once you have a \"shared clients\" destination listed on the left, please {0}"
-"check out{1} our {2}FAQ{3}."
-msgstr ""
-"左にリストされている「共有クライアント」の宛先があれば、{2}FAQ{3}を{0}確認{1}"
-"してください。"
+"Once you have a \"shared clients\" destination listed on the left, please "
+"{0}check out{1} our {2}FAQ{3}."
+msgstr "左にリストされている「共有クライアント」の宛先があれば、{2}FAQ{3}を{0}確認{1}してください。"
 
 #, java-format
 msgid ""
 "Point your IRC client to {0}localhost:6668{1} and say hi to us on {2}#i2p-"
 "help{3} or {4}#i2p{5}."
-msgstr ""
-"IRCクライアントを{0}localhost:6668{1}にポイントし、 {2}#i2p-help{3}かr {4}"
-"#i2p{5}で私たちに挨拶してください。"
+msgstr "IRCクライアントを{0}localhost:6668{1}に合わせ、 {2}#i2p-help{3}かr {4}#i2p{5}で私たちによろしくどうぞ。"
diff --git a/apps/routerconsole/locale-news/messages_pt_BR.po b/apps/routerconsole/locale-news/messages_pt_BR.po
index c91c5ccb9b2f9466f07ab0bfa516786d4673c062..4da2e76a23d3f5c3eb2da2290e2419987a5aed94 100644
--- a/apps/routerconsole/locale-news/messages_pt_BR.po
+++ b/apps/routerconsole/locale-news/messages_pt_BR.po
@@ -2,23 +2,22 @@
 # Copyright (C) 2009 The I2P Project
 # This file is distributed under the same license as the routerconsole package.
 # To contribute translations, see http://www.i2p2.de/newdevelopers
-#
+# 
 # Translators:
 # blueboy, 2013
-# blueboy, 2013
+# blueboy, 2013-2014
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-01-09 18:16+0000\n"
-"PO-Revision-Date: 2013-12-02 23:17+0000\n"
+"POT-Creation-Date: 2013-07-13 21:46+0000\n"
+"PO-Revision-Date: 2014-02-04 13:02+0000\n"
 "Last-Translator: blueboy\n"
-"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/"
-"language/pt_BR/)\n"
-"Language: pt_BR\n"
+"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: pt_BR\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 msgid "Congratulations on getting I2P installed!"
@@ -29,27 +28,22 @@ msgstr "Seja bem-vindo à I2P!"
 
 #, java-format
 msgid "Please {0}have patience{1} as I2P boots up and finds peers."
-msgstr ""
-"Por favor, {0}tenha paciência{1}: a I2P está sendo inicializada e procurando "
-"por nós."
+msgstr "Por favor, {0}tenha paciência{1}: a I2P está sendo inicializada e procurando por nodos."
 
 #, java-format
 msgid ""
-"While you are waiting, please {0}adjust your bandwidth settings{1} on the {2}"
-"configuration page{3}."
-msgstr ""
-"Enquanto você aguarda, por favor, {0}ajuste as especificações da sua banda "
-"larga{1} na {2}página de configuração{3}."
+"While you are waiting, please {0}adjust your bandwidth settings{1} on the "
+"{2}configuration page{3}."
+msgstr "Enquanto você aguarda, por favor, {0}ajuste as especificações da sua banda larga{1} na {2}página de configuração{3}."
 
-msgid "Also you can setup your browser to use the I2P proxy to reach eepsites."
-msgstr ""
-"Além disso, você pode configurar o seu navegador para usar o proxy I2P para "
-"acessar eepsites."
+msgid ""
+"Also you can setup your browser to use the I2P proxy to reach eepsites."
+msgstr "Além disso, você pode configurar o seu navegador para usar o proxy I2P para acessar eepsites."
 
 msgid ""
 "Just enter 127.0.0.1 (or localhost) port 4444 as a http proxy into your "
 "browser settings."
-msgstr ""
+msgstr "Apenas entre com 127.0.0.1 (ou localhost) porta 4444 como um proxy http nas configurações do seu navegador."
 
 msgid "Do not use SOCKS for this."
 msgstr "Não use SOCKS para isto!"
@@ -57,18 +51,16 @@ msgstr "Não use SOCKS para isto!"
 #, java-format
 msgid ""
 "More information can be found on the {0}I2P browser proxy setup page{1}."
-msgstr ""
+msgstr "Informações adicionais podem ser encontradas na {0}página de configuração do proxy de navegação I2P{1}."
 
 #, java-format
 msgid ""
-"Once you have a \"shared clients\" destination listed on the left, please {0}"
-"check out{1} our {2}FAQ{3}."
-msgstr ""
+"Once you have a \"shared clients\" destination listed on the left, please "
+"{0}check out{1} our {2}FAQ{3}."
+msgstr "Uma vez que você tenha um destino de \"clientes compartilhados\" listado a esquerda, por favor, {0}verifique{1} nossa página de  {2}Perguntas Frequentes{3}."
 
 #, java-format
 msgid ""
 "Point your IRC client to {0}localhost:6668{1} and say hi to us on {2}#i2p-"
 "help{3} or {4}#i2p{5}."
-msgstr ""
-"Direcione o seu cliente IRC para {0}localhost:6668{1} e nos dê um oi em {2}"
-"#i2p-help{3} ou {4}#i2p{5}."
+msgstr "Direcione o seu cliente IRC para {0}localhost:6668{1} e nos dê um oi em {2}#i2p-help{3} ou {4}#i2p{5}."
diff --git a/apps/routerconsole/locale/messages_da.po b/apps/routerconsole/locale/messages_da.po
index a57490d4feb021f70ee8494ebc29b893969b8cdb..ba3de192f1ffd8ca80da31978f95f0af853db56a 100644
--- a/apps/routerconsole/locale/messages_da.po
+++ b/apps/routerconsole/locale/messages_da.po
@@ -11,7 +11,7 @@ msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-01-09 19:27+0000\n"
-"PO-Revision-Date: 2014-01-12 11:28+0000\n"
+"PO-Revision-Date: 2014-01-26 21:36+0000\n"
 "Last-Translator: cacapo <handelsehorisont@gmail.com>\n"
 "Language-Team: Danish (http://www.transifex.com/projects/p/I2P/language/da/)\n"
 "MIME-Version: 1.0\n"
@@ -1384,7 +1384,7 @@ msgstr "Opdaterings link"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:279
 msgid "Stop"
-msgstr "Sto"
+msgstr "Stop"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:283
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:141
diff --git a/apps/routerconsole/locale/messages_en.po b/apps/routerconsole/locale/messages_en.po
index 1b6feeceea686c3814cd68800d4aa5d767b94760..52037c2148de4342a281ceed5092ee6e18ad8403 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: 2014-01-09 19:27+0000\n"
+"POT-Creation-Date: 2014-02-06 18:27+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"
@@ -170,36 +170,36 @@ msgstr ""
 msgid "Rejecting tunnels"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:158
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:162
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:22
 msgid "Reseeding"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:170
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:174
 #, java-format
 msgid "Reseed fetched only 1 router."
 msgid_plural "Reseed fetched only {0} routers."
 msgstr[0] ""
 msgstr[1] ""
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:177
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:181
 msgid "Reseed failed."
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:178
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:182
 #, java-format
 msgid "See {0} for help."
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:179
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:183
 msgid "reseed configuration page"
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:325
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:329
 msgid "Reseeding: fetching seed URL."
 msgstr ""
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:383
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:387
 #, java-format
 msgid ""
 "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
@@ -734,60 +734,60 @@ msgstr ""
 msgid "Dropping tunnel requests: Queue time"
 msgstr ""
 
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:760
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:762
 #, java-format
 msgid "New plugin version {0} is available"
 msgstr ""
 
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:838
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:840
 #, java-format
 msgid "Update check failed for plugin {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:840
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:842
 #, java-format
 msgid "No new version is available for plugin {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:863
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:865
 #, java-format
 msgid "{0}B transferred"
 msgstr ""
 
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:916
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:918
 #: ../java/src/net/i2p/router/update/UpdateRunner.java:288
 #, java-format
 msgid "Transfer failed from {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1153
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1217
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1241
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1155
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1219
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1243
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:671
 msgid "Update downloaded"
 msgstr ""
 
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1197
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1241
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1199
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1243
 msgid "Restarting"
 msgstr ""
 
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1197
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1199
 msgid "Update verified"
 msgstr ""
 
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1206
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1208
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:136
 #, java-format
 msgid "from {0}"
 msgstr ""
 
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1221
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1223
 #, java-format
 msgid "Unsigned update file from {0} is corrupt"
 msgstr ""
 
-#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1250
+#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1252
 #, java-format
 msgid "Failed copy to {0}"
 msgstr ""
@@ -1139,13 +1139,13 @@ msgid "Save Plugin Configuration"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:56
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:586
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:590
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:589
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:593
 msgid "Install Plugin"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:60
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:592
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:595
 msgid "Update All Installed Plugins"
 msgstr ""
 
@@ -1525,7 +1525,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:117
+#: ../java/src/net/i2p/router/web/LogsHelper.java:129
 msgid "CRIT"
 msgstr ""
 
@@ -1534,22 +1534,22 @@ msgid "DEBUG"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
-#: ../java/src/net/i2p/router/web/LogsHelper.java:119
+#: ../java/src/net/i2p/router/web/LogsHelper.java:131
 msgid "ERROR"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
-#: ../java/src/net/i2p/router/web/LogsHelper.java:123
+#: ../java/src/net/i2p/router/web/LogsHelper.java:135
 msgid "INFO"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
-#: ../java/src/net/i2p/router/web/LogsHelper.java:121
+#: ../java/src/net/i2p/router/web/LogsHelper.java:133
 msgid "WARN"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:144
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:145
 #: ../java/src/net/i2p/router/web/HomeHelper.java:195
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:851
 msgid "Remove"
@@ -2284,77 +2284,81 @@ msgid "French"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:85
-msgid "Hungarian"
+msgid "Hebrew"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:86
-msgid "Italian"
+msgid "Hungarian"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:87
-msgid "Japanese"
+msgid "Italian"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:88
-msgid "Dutch"
+msgid "Japanese"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:89
-msgid "Norwegian Bokmaal"
+msgid "Dutch"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:90
-msgid "Polish"
+msgid "Norwegian Bokmaal"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:91
+msgid "Polish"
+msgstr ""
+
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:92
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:93
 msgid "Portuguese"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:93
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:94
 msgid "Romanian"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:94
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:95
 msgid "Russian"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:95
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:96
 msgid "Swedish"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:96
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:97
 msgid "Turkish"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:97
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:98
 msgid "Ukrainian"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:98
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:99
 msgid "Vietnamese"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:99
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:100
 msgid "Chinese"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:140
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:141
 msgid "Add a user and password to enable."
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:146
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:147
 msgid "User Name"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:157
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:158
 #: ../java/src/net/i2p/router/web/HomeHelper.java:217
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:899
 msgid "Add"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:160
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:161
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:534
 msgid "Password"
 msgstr ""
@@ -2899,16 +2903,16 @@ msgstr ""
 msgid "Summary"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/LogsHelper.java:32
-#: ../java/src/net/i2p/router/web/LogsHelper.java:79
+#: ../java/src/net/i2p/router/web/LogsHelper.java:37
+#: ../java/src/net/i2p/router/web/LogsHelper.java:91
 msgid "File location"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/LogsHelper.java:76
+#: ../java/src/net/i2p/router/web/LogsHelper.java:88
 msgid "File not found"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/LogsHelper.java:94
+#: ../java/src/net/i2p/router/web/LogsHelper.java:106
 msgid "No log messages"
 msgstr ""
 
@@ -4496,7 +4500,7 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:546
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:562
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:576
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:588
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:591
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:470
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:490
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:506
@@ -4652,6 +4656,11 @@ msgid "Plugin Installation"
 msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:582
+#, java-format
+msgid "Look for available plugins on {0}."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:585
 msgid "To install a plugin, enter the download URL:"
 msgstr ""
 
@@ -4676,7 +4685,7 @@ msgid "Recommended Eepsites"
 msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:496
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:411
 msgid "Local Services"
 msgstr ""
 
@@ -5831,8 +5840,8 @@ msgstr ""
 msgid "home"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:396
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:377
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:398
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:379
 msgid "Welcome to I2P"
 msgstr ""
 
@@ -5947,11 +5956,11 @@ msgid ""
 "change it later."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:385
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:387
 msgid "Search I2P"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:405
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:407
 msgid "Eepsites of Interest"
 msgstr ""
 
diff --git a/apps/routerconsole/locale/messages_fr.po b/apps/routerconsole/locale/messages_fr.po
index 21213c1aebb39acf4498c54351f2cc306e431b43..fb038d31f18dd677e9df66202fb8c657354a072e 100644
--- a/apps/routerconsole/locale/messages_fr.po
+++ b/apps/routerconsole/locale/messages_fr.po
@@ -2,7 +2,7 @@
 # Copyright (C) 2009 The I2P Project
 # This file is distributed under the same license as the routerconsole package.
 # To contribute translations, see http://www.i2p2.de/newdevelopers
-#
+# 
 # Translators:
 # aylham <aylham@gmail.com>, 2011
 # aylham <aylham@gmail.com>, 2011
@@ -20,23 +20,25 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-01-09 19:13+0000\n"
-"PO-Revision-Date: 2014-01-09 09:51+0000\n"
+"POT-Creation-Date: 2014-01-09 19:27+0000\n"
+"PO-Revision-Date: 2014-01-22 22:47+0000\n"
 "Last-Translator: Towatowa441\n"
-"Language-Team: French (http://www.transifex.com/projects/p/I2P/language/"
-"fr/)\n"
-"Language: fr\n"
+"Language-Team: French (http://www.transifex.com/projects/p/I2P/language/fr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\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
+#. 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
 #. a lot of tables.
 #. milliseconds
 #. Note to translators, may be negative or zero, 2999 maximum.
-#. {0,number,####} prevents 1234 from being output as 1,234 in the English locale.
+#. {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:1484
@@ -129,7 +131,8 @@ msgstr "aucun"
 
 #. NPE, too early
 #. if (_context.router().getRouterInfo().getBandwidthTier().equals("K"))
-#. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low");
+#. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too
+#. low");
 #. else
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:75
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:120
@@ -142,7 +145,8 @@ msgid "Rejecting tunnels: High message delay"
 msgstr "Refus de tunnels: (délai de messages élevé)"
 
 #. hard to do {0} from here
-#. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of tunnels: High number of requests");
+#. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of
+#. tunnels: High number of requests");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:196
 msgid "Rejecting most tunnels: High number of requests"
 msgstr "Refuse la plupart des tunnels: (trop de requêtes)"
@@ -159,13 +163,15 @@ msgid "Rejecting tunnels: Bandwidth limit"
 msgstr "Refus de tunnels: (limite de bande passante)"
 
 #. hard to do {0} from here
-#. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels: Bandwidth limit");
+#. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels:
+#. Bandwidth limit");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:380
 msgid "Rejecting most tunnels: Bandwidth limit"
 msgstr "Refuse la plupart des tunnels: (limite de bande passante)"
 
 #. hard to do {0} from here
-#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of tunnels");
+#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of
+#. tunnels");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:384
 msgid "Accepting most tunnels"
 msgstr "Accepte la plupart des tunnels"
@@ -216,11 +222,10 @@ msgstr "Réamorçage: collecte des URL sources."
 #, java-format
 msgid ""
 "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
-msgstr ""
-"Réamorçage: collecte routerInfo depuis l''URL source ({0} réussie, {1} "
-"erreurs)."
+msgstr "Réamorçage: collecte routerInfo depuis l''URL source ({0} réussie, {1} erreurs)."
 
-#. NOTE TO TRANSLATORS - each of these phrases is a description for a statistic
+#. NOTE TO TRANSLATORS - each of these phrases is a description for a
+#. statistic
 #. to be displayed on /stats.jsp and in the graphs on /graphs.jsp.
 #. Please keep relatively short so it will fit on the graphs.
 #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:33
@@ -251,7 +256,8 @@ msgstr "Pairs rapides connus"
 msgid "NetDb entry"
 msgstr "Entrée NetDb"
 
-#. This used to be "no common transports" but it is almost always no transports at all
+#. This used to be "no common transports" but it is almost always no
+#. transports at all
 #: ../../../router/java/src/net/i2p/router/transport/GetBidsJob.java:73
 msgid "No transports (hidden or starting up?)"
 msgstr "Pas de transports (masqués ou en cours de démarrage ?)"
@@ -279,18 +285,13 @@ msgstr "Aide"
 msgid ""
 "Your transport connection limits are automatically set based on your "
 "configured bandwidth."
-msgstr ""
-"Vos limites de connexion de transport sont réglées automatiquement selon "
-"votre bande passante configurée."
+msgstr "Vos limites de connexion de transport sont réglées automatiquement selon votre bande passante configurée."
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:584
 msgid ""
 "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and "
 "i2np.udp.maxConnections=nnn on the advanced configuration page."
-msgstr ""
-"Pour modifier ces limites, ajoutez  les réglages i2np.ntcp."
-"maxConnections=nnn et i2np.udp.maxConnections=nnn dans la configuration "
-"avancée."
+msgstr "Pour modifier ces limites, ajoutez  les réglages i2np.ntcp.maxConnections=nnn et i2np.udp.maxConnections=nnn dans la configuration avancée."
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:586
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:274
@@ -328,15 +329,12 @@ msgstr "Connexion sortante"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:593
 msgid "They offered to introduce us (help other peers traverse our firewall)"
-msgstr ""
-"A proposé de nous représenter (aide de la part d'autres pairs pour traverser "
-"notre pare-feu)"
+msgstr "A proposé de nous représenter (aide de la part d'autres pairs pour traverser notre pare-feu)"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:595
-msgid "We offered to introduce them (help other peers traverse their firewall)"
-msgstr ""
-"Nous avons proposé de le représenter (aide à d'autres pairs pour traverser "
-"passer leur pare-feu)"
+msgid ""
+"We offered to introduce them (help other peers traverse their firewall)"
+msgstr "Nous avons proposé de le représenter (aide à d'autres pairs pour traverser passer leur pare-feu)"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:596
 msgid "How long since a packet has been received / sent"
@@ -384,8 +382,7 @@ msgstr "Écart de temps entre l'horloge du pair et la votre"
 msgid ""
 "The congestion window, which is how many bytes can be sent without an "
 "acknowledgement"
-msgstr ""
-"Fenêtre de congestion, en nombre d'octets transmissibles sans acquittement"
+msgstr "Fenêtre de congestion, en nombre d'octets transmissibles sans acquittement"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:601
 msgid "The number of sent messages awaiting acknowledgement"
@@ -407,7 +404,9 @@ msgstr "Seuil de démarrage lent"
 msgid "The round trip time in milliseconds"
 msgstr "Aller-retour en ms"
 
-#. "<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" +
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:607
 msgid "The retransmit timeout in milliseconds"
 msgstr "Délai de retransmission en millisecondes"
@@ -416,9 +415,7 @@ msgstr "Délai de retransmission en millisecondes"
 msgid ""
 "Current maximum send packet size / estimated maximum receive packet size "
 "(bytes)"
-msgstr ""
-"Taille actuelle maximum de paquet envoyé / taille maximum estimée de paquet "
-"reçu (octets) "
+msgstr "Taille actuelle maximum de paquet envoyé / taille maximum estimée de paquet reçu (octets) "
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:609
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1128
@@ -536,9 +533,7 @@ msgstr "Dispositifs UPNP désactivés"
 msgid ""
 "UPnP has been disabled; Do you have more than one UPnP Internet Gateway "
 "Device on your LAN ?"
-msgstr ""
-"UPnP a été désactivé; peut-être avez-vous plus d'une passerelle Internet "
-"avec UPnP activé sur votre réseau local."
+msgstr "UPnP a été désactivé; peut-être avez-vous plus d'une passerelle Internet avec UPnP activé sur votre réseau local."
 
 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:627
 msgid "UPnP has not found any UPnP-aware, compatible device on your LAN."
@@ -564,7 +559,8 @@ msgid "UPnP reports the maximum upstream bit rate is {0}bits/sec"
 msgstr "UPnP indique un débit montant maximum de  {0}b/s"
 
 #. {0} is TCP or UDP
-#. {1,number,#####} prevents 12345 from being output as 12,345 in the English locale.
+#. {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:651
 #, java-format
@@ -823,8 +819,7 @@ msgstr "Échec de copie vers {0}"
 
 #: ../java/src/net/i2p/router/update/NewsFetcher.java:140
 msgid "In-network updates disabled. Check package manager."
-msgstr ""
-"Mises à jour intra-réseau désactivées. Vérifiez le gestionnaire de paquet."
+msgstr "Mises à jour intra-réseau désactivées. Vérifiez le gestionnaire de paquet."
 
 #: ../java/src/net/i2p/router/update/NewsFetcher.java:146
 msgid "No write permission for I2P install directory."
@@ -894,7 +889,8 @@ msgstr "Le greffon de {0} est corrompu"
 msgid "Plugin from {0} does not contain the required configuration file"
 msgstr "Le greffon de {0} ne contient pas le fichier de configuration requis"
 
-#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
+#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' '
+#. + signer + "</b>");
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:170
 #, java-format
 msgid "Plugin from {0} contains an invalid key"
@@ -931,9 +927,7 @@ msgstr "Ce greffon nécessite Java version {0} ou plus récente"
 msgid ""
 "Downloaded plugin is for new installs only, but the plugin is already "
 "installed"
-msgstr ""
-"La version du greffon téléchargée est faite pour les nouvelles "
-"installations, mais le greffon est déjà installé "
+msgstr "La version du greffon téléchargée est faite pour les nouvelles installations, mais le greffon est déjà installé "
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:277
 msgid "Installed plugin does not contain the required configuration file"
@@ -941,16 +935,12 @@ msgstr "Le greffon installé ne contient pas le fichier de configuration requis"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:285
 msgid "Signature of downloaded plugin does not match installed plugin"
-msgstr ""
-"La signature du greffon téléchargé ne correspond pas à celle de celui qui "
-"est installé"
+msgstr "La signature du greffon téléchargé ne correspond pas à celle de celui qui est installé"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:292
 #, java-format
 msgid "Downloaded plugin version {0} is not newer than installed plugin"
-msgstr ""
-"La version {0} du greffon téléchargé n''est pas plus récente que celle "
-"installée"
+msgstr "La version {0} du greffon téléchargé n''est pas plus récente que celle installée"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:299
 #, java-format
@@ -983,9 +973,7 @@ msgstr "Le plugin sera installé au prochain redémarrage."
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:358
 msgid "Plugin is for upgrades only, but the plugin is not installed"
-msgstr ""
-"Ce greffon est seulement une mise à jour, mais le greffon prérequis n'est "
-"pas installé"
+msgstr "Ce greffon est seulement une mise à jour, mais le greffon prérequis n'est pas installé"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:371
 #, java-format
@@ -1006,8 +994,7 @@ msgstr "Greffon {0} installé et démarré"
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:400
 #, java-format
 msgid "Plugin {0} installed but failed to start, check logs"
-msgstr ""
-"Greffon {0} installé, mais son démarrage a échoué. Vérifiez les historiques"
+msgstr "Greffon {0} installé, mais son démarrage a échoué. Vérifiez les historiques"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:402
 #, java-format
@@ -1140,8 +1127,7 @@ msgstr "Console du routeur I2P"
 
 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:51
 msgid "Error updating the configuration - please see the error logs"
-msgstr ""
-"Erreur pendant la mise à jour de la configuration: contrôlez les historiques"
+msgstr "Erreur pendant la mise à jour de la configuration: contrôlez les historiques"
 
 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:61
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:372
@@ -1155,9 +1141,7 @@ msgstr "Configuration sauvegardée avec succès"
 msgid ""
 "Error saving the configuration (applied but not saved) - please see the "
 "error logs"
-msgstr ""
-"Erreur pendant l'enregistrement de la configuration (appliquée mais non "
-"sauvegardée): contrôlez les historiques"
+msgstr "Erreur pendant l'enregistrement de la configuration (appliquée mais non sauvegardée): contrôlez les historiques"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:40
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:478
@@ -1551,17 +1535,13 @@ msgstr "Configuration des historiques enregistrée"
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:48
 msgid ""
 "Add additional logging statements above. Example: net.i2p.router.tunnel=WARN"
-msgstr ""
-"Ajoutez des critères supplémentaires ci-dessus. Exemple: net.i2p.router."
-"tunnel=WARN"
+msgstr "Ajoutez des critères supplémentaires ci-dessus. Exemple: net.i2p.router.tunnel=WARN"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:49
 msgid ""
-"Or put entries in the logger.config file. Example: logger.record.net.i2p."
-"router.tunnel=WARN"
-msgstr ""
-"Ou mettez des entrées dans le fichier logger.config. Exemple logger.record."
-"net.i2p.router.tunnel=WARN"
+"Or put entries in the logger.config file. Example: "
+"logger.record.net.i2p.router.tunnel=WARN"
+msgstr "Ou mettez des entrées dans le fichier logger.config. Exemple logger.record.net.i2p.router.tunnel=WARN"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:50
 msgid "Valid levels are DEBUG, INFO, WARN, ERROR, CRIT"
@@ -1959,8 +1939,8 @@ msgstr "Arrêt dans {0}"
 #, java-format
 msgid "Please wait for routing commitment to expire for {0} tunnel"
 msgid_plural "Please wait for routing commitments to expire for {0} tunnels"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Veuillez attendre qu'expire l'engagement d'acheminement pour {0} tunnel"
+msgstr[1] "Veuillez attendre qu'expirent les engagements d'acheminement pour {0} tunnels"
 
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:82
 #, java-format
@@ -2099,9 +2079,7 @@ msgstr "Statistiques complètes désactivées"
 msgid ""
 "Graph list updated, may take up to 60s to be reflected on the {0}Graphs "
 "Page{1}"
-msgstr ""
-"Liste de graphique mise à jour, peut prendre jusqu''à 60s pour être réfléchi "
-"sur la {0}Page graphiques{1}"
+msgstr "Liste de graphique mise à jour, peut prendre jusqu''à 60s pour être réfléchi sur la {0}Page graphiques{1}"
 
 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:24
 msgid "Save order"
@@ -2166,7 +2144,8 @@ msgstr "Déplacé"
 msgid "Saved order of sections."
 msgstr "Sauvegarder l'ordre des sections"
 
-#. the count isn't really correct anyway, since we don't check for actual changes
+#. 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
 msgid "Updated settings for all pools."
@@ -2183,9 +2162,7 @@ msgstr "Configuration des tunnels exploratoires sauvegardée avec succès."
 msgid ""
 "Error saving the configuration (applied but not saved) - please see the "
 "error logs."
-msgstr ""
-"Erreur pendant la sauvegarde de la configuration (appliquée mais non "
-"sauvegardée) : regardez les historiques d'erreur"
+msgstr "Erreur pendant la sauvegarde de la configuration (appliquée mais non sauvegardée) : regardez les historiques d'erreur"
 
 #. * dummies for translation
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14
@@ -2222,14 +2199,11 @@ msgstr "AVERTISSEMENT d'ANONYMAT: les réglages incluent des tunnels à 1 saut!"
 
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:86
 msgid "PERFORMANCE WARNING - Settings include very long tunnels."
-msgstr ""
-"AVERTISSEMENT de PERFORMANCES: les réglages incluent des tunnels très longs!"
+msgstr "AVERTISSEMENT de PERFORMANCES: les réglages incluent des tunnels très longs!"
 
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:89
 msgid "PERFORMANCE WARNING - Settings include high tunnel quantities."
-msgstr ""
-"AVERTISSEMENT de PERFORMANCES: les réglages incluent un grand nombre de "
-"tunnels!"
+msgstr "AVERTISSEMENT de PERFORMANCES: les réglages incluent un grand nombre de tunnels!"
 
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:97
 msgid "Length"
@@ -2353,7 +2327,6 @@ msgid "Dutch"
 msgstr "Néerlandais"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:89
-#, fuzzy
 msgid "Norwegian Bokmaal"
 msgstr "Norvégien Bokmaal"
 
@@ -2367,7 +2340,6 @@ msgid "Portuguese"
 msgstr "Portugais"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:93
-#, fuzzy
 msgid "Romanian"
 msgstr "Roumain"
 
@@ -2424,8 +2396,7 @@ msgstr "Mise à jour disponible, essai de téléchargement en cours"
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:159
 msgid "Update available, click button on left to download"
-msgstr ""
-"Mise à jour disponible, cliquez sur le bouton de gauche pour la télécharger"
+msgstr "Mise à jour disponible, cliquez sur le bouton de gauche pour la télécharger"
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:165
 msgid "No update available"
@@ -2502,18 +2473,13 @@ msgstr "Télécharger, vérifier et redémarrer"
 msgid ""
 "Invalid form submission, probably because you used the 'back' or 'reload' "
 "button on your browser. Please resubmit."
-msgstr ""
-"Soumission de formulaire incorrecte: vous avez peut-être utilisé le bouton "
-"\"Page précédente\" ou \"Rechargement\" de votre navigateur. Merci de "
-"renvoyer."
+msgstr "Soumission de formulaire incorrecte: vous avez peut-être utilisé le bouton \"Page précédente\" ou \"Rechargement\" de votre navigateur. Merci de renvoyer."
 
 #: ../java/src/net/i2p/router/web/FormHandler.java:205
 msgid ""
 "If the problem persists, verify that you have cookies enabled in your "
 "browser."
-msgstr ""
-"Si le problème persiste, vérifiez que vous avez activé les cookies dans "
-"votre navigateur."
+msgstr "Si le problème persiste, vérifiez que vous avez activé les cookies dans votre navigateur."
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:158
 msgid "Combined bandwidth graph"
@@ -2719,7 +2685,8 @@ msgstr "Signalements de bug"
 msgid "Bug tracker"
 msgstr "Traqueur bug"
 
-#. "colombo-bt.i2p" + S + _x("The Italian Bittorrent Resource") + S + "http://colombo-bt.i2p/" + S + I + "colomboicon.png" + S +
+#. "colombo-bt.i2p" + S + _x("The Italian Bittorrent Resource") + S + "http
+#. ://colombo-bt.i2p/" + S + I + "colomboicon.png" + S +
 #: ../java/src/net/i2p/router/web/HomeHelper.java:41
 msgid "Dev Forum"
 msgstr "Forum dev"
@@ -2761,9 +2728,7 @@ msgstr "Forum"
 msgid ""
 "A public anonymous Git hosting site - supports pulling via Git and HTTP and "
 "pushing via SSH"
-msgstr ""
-"Un site d'hébergement Git public anonyme - soutient le pulling Git et HTTP "
-"et pushing via SSH"
+msgstr "Un site d'hébergement Git public anonyme - soutient le pulling Git et HTTP et pushing via SSH"
 
 #: ../java/src/net/i2p/router/web/HomeHelper.java:46
 msgid "Anonymous Git Hosting"
@@ -2788,9 +2753,10 @@ msgstr "Documentation technique"
 
 #: ../java/src/net/i2p/router/web/HomeHelper.java:49
 msgid "Simple and fast microblogging website"
-msgstr ""
+msgstr "Site web simple et rapide de microblogging"
 
-#. _x("Key Server") + S + _x("OpenPGP Keyserver") + S + "http://keys.i2p/" + S + I + "education.png" + S +
+#. _x("Key Server") + S + _x("OpenPGP Keyserver") + S + "http://keys.i2p/" + S
+#. + I + "education.png" + S +
 #: ../java/src/net/i2p/router/web/HomeHelper.java:51
 msgid "Debian and Tahoe-LAFS repositories"
 msgstr "Dépôts Debian et Tahoe-LAFS"
@@ -2866,9 +2832,7 @@ msgstr "Le proxy HTTP n'est pas en place"
 #: ../java/src/net/i2p/router/web/HomeHelper.java:106
 #, java-format
 msgid "Your browser is not properly configured to use the HTTP proxy at {0}"
-msgstr ""
-"Votre navigateur n''est pas configuré correctement pour utiliser le proxy "
-"HTTP à {0}"
+msgstr "Votre navigateur n''est pas configuré correctement pour utiliser le proxy HTTP à {0}"
 
 #: ../java/src/net/i2p/router/web/HomeHelper.java:197
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:853
@@ -2921,7 +2885,7 @@ msgstr "{0} va démarrer dans {1}"
 
 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:113
 msgid "Total Job Statistics"
-msgstr "Statistiques totales du job"
+msgstr "Statistiques totales des jobs"
 
 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:124
 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:141
@@ -2934,7 +2898,7 @@ msgstr "Mis en file d'attente"
 
 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:141
 msgid "Runs"
-msgstr "Fonctionnent"
+msgstr "Lancés"
 
 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:142
 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:144
@@ -3191,7 +3155,7 @@ msgstr "Montrer les actualités"
 
 #: ../java/src/net/i2p/router/web/PluginStarter.java:133
 msgid "Checking for plugin updates"
-msgstr "Vérifier mises à jour de plugin"
+msgstr "Vérifie pour mises à jour de plugin"
 
 #: ../java/src/net/i2p/router/web/PluginStarter.java:175
 #, java-format
@@ -3369,9 +3333,7 @@ msgstr "Groupes"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:276
 msgid "capabilities in the netDb, not used to determine profiles"
-msgstr ""
-"possibilités vues dans la base de données du réseau (non utilisées pour "
-"définir les profils)"
+msgstr "possibilités vues dans la base de données du réseau (non utilisées pour définir les profils)"
 
 #. capabilities
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:276
@@ -3395,8 +3357,7 @@ msgstr "Capacité"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:278
 msgid "how many tunnels can we ask them to join in an hour?"
-msgstr ""
-"combien de tunnels nous pouvons lui demander de rejoindre en une heure."
+msgstr "combien de tunnels nous pouvons lui demander de rejoindre en une heure."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:279
 msgid "how many new peers have they told us about lately?"
@@ -3440,14 +3401,11 @@ msgstr "Statistiques collectées pendant cette session du routeur"
 msgid ""
 "The data gathered is quantized over a 1 minute period, so should just be "
 "used as an estimate."
-msgstr ""
-"Les données collectées sont quantifiées sur 1mn, et ne doivent être "
-"utilisées que comme estimations."
+msgstr "Les données collectées sont quantifiées sur 1mn, et ne doivent être utilisées que comme estimations."
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:64
 msgid "These statistics are primarily used for development and debugging."
-msgstr ""
-"Ces statistiques sont initialement destinées au développement et au débogage."
+msgstr "Ces statistiques sont initialement destinées au développement et au débogage."
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:105
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:156
@@ -3466,12 +3424,14 @@ msgstr "Moyenne glissante d'évènements par période"
 msgid "Highest events per period"
 msgstr "Maximum d'évènements par période"
 
-#. if (showAll && (curFreq.getMaxAverageEventsPerPeriod() > 0) && (curFreq.getAverageEventsPerPeriod() > 0) ) {
+#. if (showAll && (curFreq.getMaxAverageEventsPerPeriod() > 0) &&
+#. (curFreq.getAverageEventsPerPeriod() > 0) ) {
 #. buf.append("(current is ");
 #. buf.append(pct(curFreq.getAverageEventsPerPeriod()/curFreq.getMaxAverageEventsPerPeriod()));
 #. buf.append(" of max)");
 #. }
-#. buf.append(" <i>avg interval between updates:</i> (").append(num(curFreq.getAverageInterval())).append("ms, min ");
+#. buf.append(" <i>avg interval between updates:</i>
+#. (").append(num(curFreq.getAverageInterval())).append("ms, min ");
 #. buf.append(num(curFreq.getMinAverageInterval())).append("ms)");
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:135
 msgid "Lifetime average events per period"
@@ -3555,9 +3515,7 @@ msgstr "Aide &amp; FAQ"
 msgid ""
 "Configure startup of clients and webapps (services); manually start dormant "
 "services"
-msgstr ""
-"configurer le démarrage des clients et des applications web (services); "
-"démarrer manuellement les services arrêtés"
+msgstr "configurer le démarrage des clients et des applications web (services); démarrer manuellement les services arrêtés"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:154
 msgid "I2P Services"
@@ -3635,14 +3593,11 @@ msgstr "Général"
 msgid ""
 "Your Local Identity is your unique I2P router identity, similar to an ip "
 "address but tailored to I2P. "
-msgstr ""
-"Votre identité locale est votre identité unique de routeur I2P, semblable à "
-"une adresse ip, mais adaptée à I2P."
+msgstr "Votre identité locale est votre identité unique de routeur I2P, semblable à une adresse ip, mais adaptée à I2P."
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276
 msgid "Never disclose this to anyone, as it can reveal your real world ip."
-msgstr ""
-"Ne divulguez jamais ceci à personne, car il peut révéler votre IP monde réel."
+msgstr "Ne divulguez jamais ceci à personne, car il peut révéler votre IP monde réel."
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:278
 msgid "Local Identity"
@@ -3678,9 +3633,7 @@ msgstr "Lancé depuis"
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:343
 msgid ""
 "Help with configuring your firewall and router for optimal I2P performance"
-msgstr ""
-"Aide à la configuration du pare-feu et du routeur pour optimiser les "
-"performances d'I2P"
+msgstr "Aide à la configuration du pare-feu et du routeur pour optimiser les performances d'I2P"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:358
 msgid "Configure I2P Updates"
@@ -3692,8 +3645,7 @@ msgstr "Mise à jour I2P"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:385
 msgid "Peers we've been talking to in the last few minutes/last hour"
-msgstr ""
-"Pairs dont nous avons parlé dans les dernières minutes / heure dernière"
+msgstr "Pairs dont nous avons parlé dans les dernières minutes / heure dernière"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:388
 msgid "Active"
@@ -3701,8 +3653,7 @@ msgstr "Actifs"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397
 msgid "The number of peers available for building client tunnels"
-msgstr ""
-"Le nombre de pairs disponibles pour La construction de tunnels exploratoires"
+msgstr "Le nombre de pairs disponibles pour La construction de tunnels exploratoires"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:400
 msgid "Fast"
@@ -3710,8 +3661,7 @@ msgstr "Rapides"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:406
 msgid "The number of peers available for building exploratory tunnels"
-msgstr ""
-"Le nombre de pairs disponibles pour la construction de tunnels exploratoires"
+msgstr "Le nombre de pairs disponibles pour la construction de tunnels exploratoires"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:409
 msgid "High capacity"
@@ -3719,8 +3669,7 @@ msgstr "Hautes capacités"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415
 msgid "The number of peers available for network database inquiries"
-msgstr ""
-"Le nombre de pairs disponibles pour les demandes de bases de données réseau"
+msgstr "Le nombre de pairs disponibles pour les demandes de bases de données réseau"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:424
 msgid "The total number of peers in our network database"
@@ -3748,10 +3697,9 @@ msgstr "Utilisée"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:498
 msgid ""
-"Used for building and testing tunnels, and communicating with floodfill peers"
-msgstr ""
-"Utilisé pour construire et tester des tunnels, et communiquer avec leurs "
-"pairs de remplissage par diffusion"
+"Used for building and testing tunnels, and communicating with floodfill "
+"peers"
+msgstr "Utilisé pour construire et tester des tunnels, et communiquer avec leurs pairs de remplissage par diffusion"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:501
 msgid "Exploratory"
@@ -3759,17 +3707,13 @@ msgstr "Exploratoires"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:507
 msgid "Tunnels we are using to provide or access services on the network"
-msgstr ""
-"Tunnels que nous utilisons pour fournir ou accéder à des services sur le "
-"réseau"
+msgstr "Tunnels que nous utilisons pour fournir ou accéder à des services sur le réseau"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:516
 msgid ""
 "Tunnels we are participating in, directly contributing bandwith to the "
 "network"
-msgstr ""
-"Tunnels auxquels nous participons, contribuant ainsi directement à la bande "
-"passante du réseau"
+msgstr "Tunnels auxquels nous participons, contribuant ainsi directement à la bande passante du réseau"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:519
 msgid "Participating"
@@ -3779,10 +3723,7 @@ msgstr "Participants"
 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 ""
-"Le ratio de sauts tunnel que nous offrons aux sauts tunnel que nous "
-"utilisons - une valeur supérieure à 1,00 indique une contribution positive "
-"au réseau"
+msgstr "Le ratio de sauts tunnel que nous offrons aux sauts tunnel que nous utilisons - une valeur supérieure à 1,00 indique une contribution positive au réseau"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:528
 msgid "Share ratio"
@@ -3806,9 +3747,7 @@ msgstr "Retard de tâches"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:557
 msgid "Indicates how quickly outbound messages to other I2P routers are sent"
-msgstr ""
-"Indique à quelle vitesse les messages sortants vers d'autres routeurs I2P "
-"sont envoyés"
+msgstr "Indique à quelle vitesse les messages sortants vers d'autres routeurs I2P sont envoyés"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:560
 msgid "Message delay"
@@ -3885,14 +3824,11 @@ msgstr "Déconnecté - vérifier le câble réseau"
 msgid ""
 "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and "
 "restart"
-msgstr ""
-"ERR-Port UDP en cours d'utilisation - Réglez i2np.udp.internalPort=xxxx dans "
-"la configuration avancée puis redémarrez"
+msgstr "ERR-Port UDP en cours d'utilisation - Réglez i2np.udp.internalPort=xxxx dans la configuration avancée puis redémarrez"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:184
 msgid "ERR-No Active Peers, Check Network Connection and Firewall"
-msgstr ""
-"ERR-Pas de pair actif, vérifiez votre connexion réseau et votre pare-feu"
+msgstr "ERR-Pas de pair actif, vérifiez votre connexion réseau et votre pare-feu"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:187
 msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
@@ -3904,8 +3840,7 @@ msgstr "WARN - Pare-feu avec UDP desactivé"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:414
 msgid "Add/remove/edit &amp; control your client and server tunnels"
-msgstr ""
-"Ajoutez, modifiez/supprimez &amp; contrôlez vos tunnels clients et serveurs"
+msgstr "Ajoutez, modifiez/supprimez &amp; contrôlez vos tunnels clients et serveurs"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:425
 msgid "Server"
@@ -3978,7 +3913,8 @@ msgstr "Télécharger la version {0}"
 
 #. 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>
+#. If the translation is shorter than the English, you should probably not
+#. include <br>
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:721
 #, java-format
 msgid "Download Unsigned<br>Update {0}"
@@ -4315,7 +4251,7 @@ msgstr "Transport"
 
 #: ../java/strings/Strings.java:73
 msgid "udp"
-msgstr "udp"
+msgstr "UDP"
 
 #. parameters in transport addresses (netdb.jsp)
 #. may or may not be worth translating
@@ -4432,7 +4368,8 @@ msgstr "Configurer la bande passante"
 msgid "Router is down"
 msgstr "Routeur est en panne"
 
-#. We have intl defined when this is included, but not when compiled standalone.
+#. 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:299
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:299
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325
@@ -4532,10 +4469,7 @@ msgstr "Gestionnaire de bande passante"
 msgid ""
 "I2P will work best if you configure your rates to match the speed of your "
 "internet connection."
-msgstr ""
-"I2P fonctionnera mieux si vous configurez les débits de réception et "
-"d'émission de façon à ce qu'ils correspondent à ceux de votre connexion "
-"Internet."
+msgstr "I2P fonctionnera mieux si vous configurez les débits de réception et d'émission de façon à ce qu'ils correspondent à ceux de votre connexion Internet."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:416
 msgid "KBps In"
@@ -4562,23 +4496,18 @@ msgstr "Vous avez configuré I2P pour qu''il ne partage que {0} ko/s."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457
 msgid "I2P requires at least 12KBps to enable sharing. "
-msgstr ""
-"I2P a besoin de plus de 12ko/s afin d'activer le partage de bande passante."
+msgstr "I2P a besoin de plus de 12ko/s afin d'activer le partage de bande passante."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:458
 msgid ""
 "Please enable sharing (participating in tunnels) by configuring more "
 "bandwidth. "
-msgstr ""
-"Merci d'activer le partage de bande passante (en participant aux tunnels) en "
-"augmentant votre bande passante, si possible."
+msgstr "Merci d'activer le partage de bande passante (en participant aux tunnels) en augmentant votre bande passante, si possible."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
 msgid ""
 "It improves your anonymity by creating cover traffic, and helps the network."
-msgstr ""
-"Cela aidera votre anonymat en cachant vos données parmi les données des "
-"autres, et cela améliorera le réseau."
+msgstr "Cela aidera votre anonymat en cachant vos données parmi les données des autres, et cela améliorera le réseau."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
 #, java-format
@@ -4589,9 +4518,7 @@ msgstr "Vous avez configuré le partage I2P à {0}ko/s."
 msgid ""
 "The higher the share bandwidth the more you improve your anonymity and help "
 "the network."
-msgstr ""
-"En partageant plus de votre bande passante, vous améliorerez votre anonymat "
-"et le réseau."
+msgstr "En partageant davantage de votre bande passante, vous améliorerez votre anonymat et le réseau."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:468
 msgid "Advanced network configuration page"
@@ -4651,16 +4578,14 @@ msgstr "Préférences"
 msgid ""
 "The Java clients listed below are started by the router and run in the same "
 "JVM."
-msgstr ""
-"Les clients Java listés ci-dessous sont démarrés par le routeur et "
-"s'exécutent dans la même JVM."
+msgstr "Les clients Java listés ci-dessous sont démarrés par le routeur et s'exécutent dans la même JVM."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455
 msgid ""
-"Be careful changing any settings here. The 'router console' and 'application "
-"tunnels' are required for most uses of I2P. Only advanced users should "
+"Be careful changing any settings here. The 'router console' and 'application"
+" tunnels' are required for most uses of I2P. Only advanced users should "
 "change these."
-msgstr ""
+msgstr "Soyez prudent ici en changeant n'importe quelle préférence. La 'console du routeur' et les 'tunnels d'application' sont exigés pour la plupart des usages d'I2P. Seuls les utilisateurs avancés devraient changer ceux-ci."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461
 msgid "To change other client options, edit the file"
@@ -4690,8 +4615,7 @@ msgstr "Activé avec SLL requis"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:502
 msgid "Disabled - Clients outside this Java process may not connect"
-msgstr ""
-"Désactivé: les clients hors de ce processus Java ne peuvent pas se connecter"
+msgstr "Désactivé: les clients hors de ce processus Java ne peuvent pas se connecter"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:504
 msgid "I2CP Port"
@@ -4721,14 +4645,11 @@ msgstr "La configuration par défaut marchera pour la plupart des gens."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:538
 msgid "Any changes made here must also be configured in the external client."
-msgstr ""
-"Tous les changements apportés ici doivent être répercutés dans le client "
-"externe."
+msgstr "Tous les changements apportés ici doivent être répercutés dans le client externe."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:540
 msgid "Many clients do not support SSL or authorization."
-msgstr ""
-"De nombreux clients ne prennent pas en charge l'authentification ni SSL."
+msgstr "De nombreux clients ne prennent pas en charge l'authentification ni SSL."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:550
 msgid "WebApp Configuration"
@@ -4738,18 +4659,11 @@ msgstr "Configuration WebApp"
 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 "
-"accessible through the router console. They may be complete applications (e."
-"g. i2psnark),front-ends to another client or application which must be "
+"accessible through the router console. They may be complete applications "
+"(e.g. i2psnark),front-ends to another client or application which must be "
 "separately enabled (e.g. susidns, i2ptunnel), or have no web interface at "
 "all (e.g. addressbook)."
-msgstr ""
-"Les applications Web Java listées ci-dessous sont démarrées par le client "
-"webConsole et s'exécutent dans la même JVM que le routeur. Il s'agit "
-"généralement d'applications web accessibles par la console du routeur. Il "
-"peut s'agir d'applications complètes (ex: i2pSnark), d'interfaces pour "
-"d'autres clients ou applications qui doivent être activées séparément (ex: "
-"susidns, i2ptunnel), ou n'ayant absolument aucune interface web (ex: le "
-"carnet d'adresses)."
+msgstr "Les applications Web Java listées ci-dessous sont démarrées par le client webConsole et s'exécutent dans la même JVM que le routeur. Il s'agit généralement d'applications web accessibles par la console du routeur. Il peut s'agir d'applications complètes (ex: i2pSnark), d'interfaces pour d'autres clients ou applications qui doivent être activées séparément (ex: susidns, i2ptunnel), ou n'ayant absolument aucune interface web (ex: le carnet d'adresses)."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:554
 msgid ""
@@ -4757,11 +4671,7 @@ msgid ""
 "directory; however the .war file and web app will reappear when you update "
 "your router to a newer version, so disabling the web app here is the "
 "preferred method."
-msgstr ""
-"Une appli web peut aussi être désactivée en supprimant le ficher .war du "
-"répertoire des web apps; mais le fichier et la web app reviendront à "
-"l'occasion d'une mise à jour du routeur, et donc la désactivation depuis la "
-"console est la méthode recommandée."
+msgstr "Une appli web peut aussi être désactivée en supprimant le ficher .war du répertoire des web apps; mais le fichier et la web app reviendront à l'occasion d'une mise à jour du routeur, et donc la désactivation depuis la console est la méthode recommandée."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:568
 msgid "Plugin Configuration"
@@ -4814,16 +4724,12 @@ msgstr "Configuration du porte-clés I2P"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:451
 msgid "The router keyring is used to decrypt encrypted leaseSets."
-msgstr ""
-"Le trousseau de clés du routeur est utilisé pour déchiffrer les jeux de baux "
-"(leaseSets) cryptés."
+msgstr "Le trousseau de clés du routeur est utilisé pour déchiffrer les jeux de baux (leaseSets) cryptés."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:454
 msgid ""
 "The keyring may contain keys for local or remote encrypted destinations."
-msgstr ""
-"Le trousseau contient les clés pour des destinations cryptées locales ou "
-"distantes."
+msgstr "Le trousseau contient les clés pour des destinations cryptées locales ou distantes."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:460
 msgid "Manual Keyring Addition"
@@ -4876,9 +4782,7 @@ msgstr "Format des enregistrements d'historiques"
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:422
 msgid ""
 "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
-msgstr ""
-"(utilisez \"d\" = date, \"c\" = classe, \"t\" = tâche, \"p\" = priorité, \"m"
-"\" = message)"
+msgstr "(utilisez \"d\" = date, \"c\" = classe, \"t\" = tâche, \"p\" = priorité, \"m\" = message)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:424
 msgid "Log date format"
@@ -4888,9 +4792,7 @@ msgstr "Format de date des historiques"
 msgid ""
 "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' "
 "= millisecond)"
-msgstr ""
-"(\"MM\" = mois, \"dd\" = jour, \"HH\" = heure, \"mm\" = minute, \"ss\" = "
-"seconde, \"SSS\" = milliseconde)"
+msgstr "(\"MM\" = mois, \"dd\" = jour, \"HH\" = heure, \"mm\" = minute, \"ss\" = seconde, \"SSS\" = milliseconde)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:430
 msgid "Max log file size"
@@ -4904,9 +4806,7 @@ msgstr "Niveau d'historisation par défaut"
 msgid ""
 "(DEBUG and INFO are not recommended defaults, as they will drastically slow "
 "down your router)"
-msgstr ""
-"(DEBUG et INFO sont déconseillés, car ils ralentissent drastiquement votre "
-"routeur)"
+msgstr "(DEBUG et INFO sont déconseillés, car ils ralentissent drastiquement votre routeur)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:440
 msgid "Log level overrides"
@@ -4990,9 +4890,7 @@ msgstr "Action quand l'IP change"
 msgid ""
 "Laptop mode - Change router identity and UDP port when IP changes for "
 "enhanced anonymity"
-msgstr ""
-"Mode IP publique dynamique/PC portable: modifie l'identité du router et le "
-"port UDP quand l'IP publique change, pour améliorer l'anonymat"
+msgstr "Mode IP publique dynamique/PC portable: modifie l'identité du router et le port UDP quand l'IP publique change, pour améliorer l'anonymat"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:502
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:526
@@ -5068,9 +4966,7 @@ msgstr "Désactiver les connexions entrantes (car derrière un pare-feu)"
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:582
 msgid ""
 "(select only if behind a firewall that throttles or blocks outbound TCP)"
-msgstr ""
-"(selectionner seulement si derrière un pare-feu qui limite les connexions "
-"sortantes TCP)"
+msgstr "(selectionner seulement si derrière un pare-feu qui limite les connexions sortantes TCP)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:584
 msgid "Externally reachable TCP port"
@@ -5092,9 +4988,7 @@ msgstr "Remarques"
 msgid ""
 "a) Do not reveal your port numbers to anyone!   b) Changing these settings "
 "will restart your router."
-msgstr ""
-"a) Ne révélez vos n° de ports à personne ! b) La modification de ces "
-"réglages redémarrera votre routeur. "
+msgstr "a) Ne révélez vos n° de ports à personne ! b) La modification de ces réglages redémarrera votre routeur. "
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:609
 msgid "Configuration Help"
@@ -5104,57 +4998,42 @@ msgstr "Aide à la configuration"
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:660
 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 ""
-"Bien que I2P fonctionne derrière la plupart des pare-feux, votre vitesse et "
-"votre intégration au réseau seront généralement améliorées par la "
-"redirection des ports UDP et TCP d'I2P."
+"integration will generally improve if the I2P port is forwarded for both UDP"
+" and TCP."
+msgstr "Bien que I2P fonctionne derrière la plupart des pare-feux, votre vitesse et votre intégration au réseau seront généralement améliorées par la redirection des ports UDP et TCP d'I2P."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:613
 msgid ""
-"If you can, please poke a hole in your firewall to allow unsolicited UDP and "
-"TCP packets to reach you."
-msgstr ""
-"Si vous le pouvez, ouvrez un port dans votre pare-feu pour recevoir les "
-"paquets UDP et TCP non sollicités."
+"If you can, please poke a hole in your firewall to allow unsolicited UDP and"
+" TCP packets to reach you."
+msgstr "Si vous le pouvez, ouvrez un port dans votre pare-feu pour recevoir les paquets UDP et TCP non sollicités."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:615
 msgid ""
 "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole "
 "punching with \"SSU introductions\" to relay traffic."
-msgstr ""
-"Sinon, I2P est compatible UPnP (Universal Plug and Play) et perçage de trou "
-"UDP par \"représentations SSU\" pour relayer le trafic."
+msgstr "Sinon, I2P est compatible UPnP (Universal Plug and Play) et perçage de trou UDP par \"représentations SSU\" pour relayer le trafic."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:617
 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 ""
-"La plupart des options ci-dessous concernent des situations particulières, "
-"par exemple quand UPnP ne marche pas correctement, ou qu'un pare-feu hors de "
-"contrôle fait son pénible."
+"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 "La plupart des options ci-dessous concernent des situations particulières, par exemple quand UPnP ne marche pas correctement, ou qu'un pare-feu hors de contrôle fait son pénible."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:619
 msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
-msgstr ""
-"Certains types de pare-feu (tels que les NAT symétriques) empêchent un "
-"fonctionnement correct."
+msgstr "Certains types de pare-feu (tels que les NAT symétriques) empêchent un fonctionnement correct."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:628
 msgid ""
 "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect "
 "the external IP address and forward ports."
-msgstr ""
-"UPnP est utilisé pour communiquer avec des passerelles Internet pour "
-"détecter l'adresse IP extérieure et contrôler la redirection des ports."
+msgstr "UPnP est utilisé pour communiquer avec des passerelles Internet pour détecter l'adresse IP extérieure et contrôler la redirection des ports."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:630
 msgid "UPnP support is beta, and may not work for any number of reasons"
-msgstr ""
-"La gestion par UPnP est toujours en développement, et peut ne pas "
-"fonctionner pour plusieurs raisons"
+msgstr "La gestion par UPnP est toujours en développement, et peut ne pas fonctionner pour plusieurs raisons"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:632
 msgid "No UPnP-compatible device present"
@@ -5188,15 +5067,11 @@ msgstr "Vérifier l'état d'UPnP ici."
 msgid ""
 "UPnP may be enabled or disabled above, but a change requires a router "
 "restart to take effect."
-msgstr ""
-"UPnP peut être activé ou desactivé ci-dessus, mais afin de prendre en compte "
-"la changement il faut rédemarrer le routeur I2P."
+msgstr "UPnP peut être activé ou desactivé ci-dessus, mais afin de prendre en compte la changement il faut rédemarrer le routeur I2P."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:648
 msgid "Hostnames entered above will be published in the network database."
-msgstr ""
-"Les noms d'hôtes saisis ci-dessus seront publié dans la base de données du "
-"réseau I2P."
+msgstr "Les noms d'hôtes saisis ci-dessus seront publié dans la base de données du réseau I2P."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:650
 msgid "They are <b>not private</b>."
@@ -5204,20 +5079,16 @@ msgstr "Ils ne sont pas <b>privés</b>."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:652
 msgid ""
-"Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
-msgstr ""
-"De plus, <b>ne saisissez pas une adresse IP privée</b> tel que 127.0.0.1 ou "
+"Also, <b>do not enter a private IP address</b> like 127.0.0.1 or "
 "192.168.1.1."
+msgstr "De plus, <b>ne saisissez pas une adresse IP privée</b> tel que 127.0.0.1 ou 192.168.1.1."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:654
 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 ""
-"Si vous saisissez une mauvaise adresse IP ou nom d'hôte, ou configurez votre "
-"NAT ou pare-feu incorrectement, votre intégration avec le réseau I2P sera "
-"substantiellement dégradée."
+msgstr "Si vous saisissez une mauvaise adresse IP ou nom d'hôte, ou configurez votre NAT ou pare-feu incorrectement, votre intégration avec le réseau I2P sera substantiellement dégradée."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:656
 msgid "When in doubt, leave the settings at the defaults."
@@ -5232,19 +5103,13 @@ 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 ""
-"Si vous pensez que vous avez ouvert votre pare-feu et qu'I2P indique "
-"toujours que vous êtes derrière le pare-feu, n'oubliez pas que vous avez "
-"peut-être plusieurs pare-feux: par exemple celui de votre box DSL et un pare-"
-"feu logiciel dans votre ordinateur."
+msgstr "Si vous pensez que vous avez ouvert votre pare-feu et qu'I2P indique toujours que vous êtes derrière le pare-feu, n'oubliez pas que vous avez peut-être plusieurs pare-feux: par exemple celui de votre box DSL et un pare-feu logiciel dans votre ordinateur."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:666
 msgid ""
 "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help "
 "diagnose the problem."
-msgstr ""
-"S'il y a une erreur, les <a href=\"logs.jsp\">historiques</a> peuvent aider "
-"au diagnostic."
+msgstr "S'il y a une erreur, les <a href=\"logs.jsp\">historiques</a> peuvent aider au diagnostic."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:670
 msgid "Your UDP port does not appear to be firewalled."
@@ -5258,54 +5123,39 @@ msgstr "Votre port UDP semble bloqué par un pare-feu."
 msgid ""
 "As the firewall detection methods are not 100% reliable, this may "
 "occasionally be displayed in error."
-msgstr ""
-"Comme les méthodes de détection de pare-feu ne sont pas fiables à 100%, ceci "
-"peut occasionnellement générer une erreur."
+msgstr "Comme les méthodes de détection de pare-feu ne sont pas fiables à 100%, ceci peut occasionnellement générer une erreur."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:678
 msgid ""
 "However, if it appears consistently, you should check whether both your "
 "external and internal firewalls are open for your port."
-msgstr ""
-"Cependant, si ça se reproduit systématiquement, vous devez vérifier que "
-"votre box et vos pare-feux internes sont ouverts pour votre port."
+msgstr "Cependant, si ça se reproduit systématiquement, vous devez vérifier que votre box et vos pare-feux internes sont ouverts pour votre port."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:680
 msgid ""
 "I2P will work fine when firewalled, there is no reason for concern. When "
 "firewalled, the router uses \"introducers\" to relay inbound connections."
-msgstr ""
-"I2P fonctionne très bien derrière un pare-feu, ça n'est pas un problème. "
-"Derrière un pare-feu, le routeur utilise des  \"représentants\" pour relayer "
-"les connexions entrantes."
+msgstr "I2P fonctionne très bien derrière un pare-feu, ça n'est pas un problème. Derrière un pare-feu, le routeur utilise des  \"représentants\" pour relayer les connexions entrantes."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:682
 msgid ""
 "However, you will get more participating traffic and help the network more "
 "if you can open your firewall(s)."
-msgstr ""
-"Cependant, vous obtiendrez davantage de trafic participant et aiderez "
-"davantage le réseau si vous avez la possibilité d'ouvrir vos pare-feux."
+msgstr "Cependant, vous obtiendrez davantage de trafic participant et aiderez davantage le réseau si vous avez la possibilité d'ouvrir vos pare-feux."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:684
 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 ""
-"Si vous pensez que vous l'avez déjà fait, n'oubliez pas que vous avez peut-"
-"être un pare-feu matériel et logiciel, ou que vous êtes derrière un pare-feu "
-"supplémentaire sur lequel vous n'avez aucun contrôle (p.e. en entreprise)."
+msgstr "Si vous pensez que vous l'avez déjà fait, n'oubliez pas que vous avez peut-être un pare-feu matériel et logiciel, ou que vous êtes derrière un pare-feu supplémentaire sur lequel vous n'avez aucun contrôle (p.e. en entreprise)."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:686
 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 ""
-"De plus, certains pare-feux ne peuvent pas transférer correctement TCP et "
-"UDP sur le même port, ou pourraient  avoir d'autres limitations ou des "
-"bogues qui  les empêcheraient de passer le trafic à I2P."
+msgstr "De plus, certains pare-feux ne peuvent pas transférer correctement TCP et UDP sur le même port, ou pourraient  avoir d'autres limitations ou des bogues qui  les empêcheraient de passer le trafic à I2P."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:690
 msgid "The router is currently testing whether your UDP port is firewalled."
@@ -5315,17 +5165,13 @@ msgstr "Le routeur teste actuellement si votre port UDP est bloqué."
 msgid ""
 "The router is not configured to publish its address, therefore it does not "
 "expect incoming connections."
-msgstr ""
-"Le routeur n'est pas configuré pour publier son adresse : il n'attend donc "
-"pas de connexions entrantes."
+msgstr "Le routeur n'est pas configuré pour publier son adresse : il n'attend donc pas de connexions entrantes."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:696
 msgid ""
 "Hidden mode is automatically enabled for added protection in certain "
 "countries."
-msgstr ""
-"Le mode caché est automatiquement activé pour une protection accrue dans "
-"certains pays."
+msgstr "Le mode caché est automatiquement activé pour une protection accrue dans certains pays."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:698
 msgid "WARN - Firewalled and Fast"
@@ -5333,21 +5179,16 @@ msgstr "WARN - Pare-feu et Rapide"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:700
 msgid ""
-"You have configured I2P to share more than 128KBps of bandwidth, but you are "
-"firewalled."
-msgstr ""
-"Vous avez configuré I2P pour partager plus de 128ko/s de bande passante, "
-"mais vous êtes bloqué par un pare-feu."
+"You have configured I2P to share more than 128KBps of bandwidth, but you are"
+" firewalled."
+msgstr "Vous avez configuré I2P pour partager plus de 128ko/s de bande passante, mais vous êtes bloqué par un pare-feu."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:702
 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 ""
-"Bien qu'I2P fonctionne correctement dans cette configuration, si vous avez "
-"vraiment plus de 128ko/s (~1Mb/s) de bande passante à partager, il serait "
-"bénéfique pour le réseau que vous ouvriez un port dans votre pare-feu."
+msgstr "Bien qu'I2P fonctionne correctement dans cette configuration, si vous avez vraiment plus de 128ko/s (~1Mb/s) de bande passante à partager, il serait bénéfique pour le réseau que vous ouvriez un port dans votre pare-feu."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:704
 msgid "WARN - Firewalled and Floodfill"
@@ -5356,16 +5197,12 @@ msgstr "WARN - Pare-feu et Floodfill"
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:706
 msgid ""
 "You have configured I2P to be a floodfill router, but you are firewalled."
-msgstr ""
-"Vous avez configuré I2P pour être un routeur de remplissage par diffusion, "
-"mais vous êtes derrière un pare-feu."
+msgstr "Vous avez configuré I2P pour être un routeur de remplissage par diffusion, mais vous êtes derrière un pare-feu."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:708
 msgid ""
 "For best participation as a floodfill router, you should open your firewall."
-msgstr ""
-"Pour une meilleure participation en tant que diffuseur, vous devriez ouvrir "
-"votre pare-feu."
+msgstr "Pour une meilleure participation en tant que diffuseur, vous devriez ouvrir votre pare-feu."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:710
 msgid "WARN - Firewalled with Inbound TCP Enabled"
@@ -5375,23 +5212,17 @@ msgstr "WARN - Pare-feu avec TCP entrant activé"
 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 ""
-"Vous avez configuré le TCP entrant,  cependant votre port UDP est bloqué par "
-"un pare-feu, en conséquence il est probable que votre port TCP le soit aussi."
+msgstr "Vous avez configuré le TCP entrant,  cependant votre port UDP est bloqué par un pare-feu, en conséquence il est probable que votre port TCP le soit aussi."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:714
 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 ""
-"Si votre port TCP est bloqué par un pare-feu et les connexions entrantes TCP "
-"activées, les routeurs ne pourront pas vous contacter via TCP, ce qui va "
-"perturber le réseau. "
+"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 "Si votre port TCP est bloqué par un pare-feu et les connexions entrantes TCP activées, les routeurs ne pourront pas vous contacter via TCP, ce qui va perturber le réseau. "
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:716
 msgid "Please open your firewall or disable inbound TCP above."
-msgstr ""
-"Merci d'ouvrir votre pare-feu ou de désactiver le TCP entrant ci-dessus."
+msgstr "Merci d'ouvrir votre pare-feu ou de désactiver le TCP entrant ci-dessus."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:718
 msgid "WARN - Firewalled with UDP Disabled"
@@ -5405,9 +5236,7 @@ msgstr "Vous avez configuré le TCP entrant, mais vous avez désactivé UDP."
 msgid ""
 "You appear to be firewalled on TCP, therefore your router cannot accept "
 "inbound connections."
-msgstr ""
-"Vous apparaissez comme étant bloqué par un pare-feu pour TCP, et en "
-"conséquence votre routeur ne peut pas accepter les connexions entrantes."
+msgstr "Vous apparaissez comme étant bloqué par un pare-feu pour TCP, et en conséquence votre routeur ne peut pas accepter les connexions entrantes."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:724
 msgid "Please open your firewall or enable UDP."
@@ -5421,9 +5250,7 @@ msgstr "ERR - Horloge décalée"
 msgid ""
 "Your system's clock is skewed, which will make it difficult to participate "
 "in the network."
-msgstr ""
-"L'horloge système est décalée, ce qui rend la participation au réseau "
-"difficile."
+msgstr "L'horloge système est décalée, ce qui rend la participation au réseau difficile."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:730
 msgid "Correct your clock setting if this error persists."
@@ -5437,9 +5264,7 @@ msgstr "ERR - Adresse TCP privée"
 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 ""
-"Vous ne devez jamais publier une IP non routable telle que 127.0.0.1 ou "
-"192.168.1.1 en tant qu'adresse externe."
+msgstr "Vous ne devez jamais publier une IP non routable telle que 127.0.0.1 ou 192.168.1.1 en tant qu'adresse externe."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:736
 msgid "Correct the address or disable inbound TCP above."
@@ -5458,18 +5283,13 @@ 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 ""
-"I2P marche mal derrière ce genre de pare-feu. Vous serez probablement "
-"incapable d'accepter de recevoir des connexions entrantes, ce qui limitera "
-"votre participation au réseau."
+msgstr "I2P marche mal derrière ce genre de pare-feu. Vous serez probablement incapable d'accepter de recevoir des connexions entrantes, ce qui limitera votre participation au réseau."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:744
 msgid ""
 "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config "
 "and restart"
-msgstr ""
-"ERR - Port UDP en cours d'utilisation - réglez i2np.udp.internalPort=xxxx "
-"dans la configuration avancée puis redémarrez"
+msgstr "ERR - Port UDP en cours d'utilisation - réglez i2np.udp.internalPort=xxxx dans la configuration avancée puis redémarrez"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:746
 msgid "I2P was unable to bind to port 8887 or other configured port."
@@ -5479,24 +5299,17 @@ msgstr "I2P n'a pas pu s'attacher au port configuré."
 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 ""
-"Vérifiez si un autre logiciel utilise le port configuré pour I2P. Si oui, "
-"arrêtez ce logiciel ou configurez I2P afin qu'il utilise un port différent "
-"(dans Windows tapez netstat dans une boîte de commandes pour lister les "
-"ports utilisés par les logiciels)."
+msgstr "Vérifiez si un autre logiciel utilise le port configuré pour I2P. Si oui, arrêtez ce logiciel ou configurez I2P afin qu'il utilise un port différent (dans Windows tapez netstat dans une boîte de commandes pour lister les ports utilisés par les logiciels)."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:750
 msgid ""
 "This may be a transient error, if the other program is no longer using the "
 "port."
-msgstr ""
-"Il s'agit peut-être d'une erreur passagère, si l'autre logiciel  n'utilise "
-"plus le port."
+msgstr "Il s'agit peut-être d'une erreur passagère, si l'autre logiciel  n'utilise plus le port."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:752
 msgid "However, a restart is always required after this error."
-msgstr ""
-"Cependant un redémarrage du routeur est toujours requis après cette erreur."
+msgstr "Cependant un redémarrage du routeur est toujours requis après cette erreur."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:754
 msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
@@ -5506,9 +5319,7 @@ msgstr "ERR - UDP est désactivé et l'hôte/port TCP entrant n'est pas défini.
 msgid ""
 "You have not configured inbound TCP with a hostname and port above, however "
 "you have disabled UDP."
-msgstr ""
-"Vous n'avez pas configuré le TCP entrant ci-dessus avec un nom d'hôte et un "
-"port, cependant vous avez désactivé UDP."
+msgstr "Vous n'avez pas configuré le TCP entrant ci-dessus avec un nom d'hôte et un port, cependant vous avez désactivé UDP."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:758
 msgid "Therefore your router cannot accept inbound connections."
@@ -5524,17 +5335,13 @@ msgstr "ERR - Erreur du gestionnaire de clients I2CP - vérifier l'historique"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:764
 msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
-msgstr ""
-"Ceci est habituellement dû à un conflit de port 7654. Vérifiez dans "
-"l'historique (et pensez éventuellement à netstat   ;-)  ) "
+msgstr "Ceci est habituellement dû à un conflit de port 7654. Vérifiez dans l'historique (et pensez éventuellement à netstat   ;-)  ) "
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:766
 msgid ""
 "Do you have another I2P instance running? Stop the conflicting program and "
 "restart I2P."
-msgstr ""
-"Avez-vous une autre instance d'I2P en cours d'exécution ? Arrêtez le "
-"logiciel en conflit et redémarrez I2P."
+msgstr "Avez-vous une autre instance d'I2P en cours d'exécution ? Arrêtez le logiciel en conflit et redémarrez I2P."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:147
 msgid "config peers"
@@ -5559,8 +5366,7 @@ msgstr "(Dé)banissement manuel d'un pair"
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:466
 msgid ""
 "Banning will prevent the participation of this peer in tunnels you create."
-msgstr ""
-"Le banissement empêchera ce pair de participer aux tunnels que vous créez."
+msgstr "Le banissement empêchera ce pair de participer aux tunnels que vous créez."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:476
 msgid "Adjust Profile Bonuses"
@@ -5568,16 +5374,11 @@ msgstr "Ajuster les bonus du profil"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:478
 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 "
+"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 "
 "Capacity peers are used for some exploratory tunnels. Current bonuses are "
 "displayed on the"
-msgstr ""
-"Les bonus peuvent être positifs ou négatifs, et influencent l'affectation "
-"des pairs dans les groupes \"Rapides\" et \"Hautes capacités\". Les pairs "
-"rapides sont utilisés pour les tunnels clients, et les pairs à hautes "
-"capacités pour certains tunnels exploratoires. Les bonus actuels sont "
-"affichés sur la"
+msgstr "Les bonus peuvent être positifs ou négatifs, et influencent l'affectation des pairs dans les groupes \"Rapides\" et \"Hautes capacités\". Les pairs rapides sont utilisés pour les tunnels clients, et les pairs à hautes capacités pour certains tunnels exploratoires. Les bonus actuels sont affichés sur la"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:480
 msgid "profiles page"
@@ -5608,25 +5409,18 @@ 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 ""
-"Le réamorçage est le processus de lancement utilisé pour trouver d'autres "
-"routeurs lors de la première installation de I2P, ou lorsqu'il reste au "
-"routeur trop peu de références vers d'autres routeurs."
+msgstr "Le réamorçage est le processus de lancement utilisé pour trouver d'autres routeurs lors de la première installation de I2P, ou lorsqu'il reste au routeur trop peu de références vers d'autres routeurs."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:453
 msgid ""
 "If reseeding has failed, you should first check your network connection."
-msgstr ""
-"Si le réamorçage a échoué, vérifiez d'abord l'état de votre connexion au "
-"réseau."
+msgstr "Si le réamorçage a échoué, vérifiez d'abord l'état de votre connexion au réseau."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:457
 msgid ""
 "Change these only if HTTP is blocked by a restrictive firewall, reseed has "
 "failed, and you have access to an HTTP proxy."
-msgstr ""
-"Changez-les seulement si HTTP est bloqué par un pare-feu restrictif, si le "
-"réamorçage a échoué, et si vous avez accès à un mandataire (proxy) HTTP."
+msgstr "Changez-les seulement si HTTP est bloqué par un pare-feu restrictif, si le réamorçage a échoué, et si vous avez accès à un mandataire (proxy) HTTP."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:459
 #, java-format
@@ -5663,11 +5457,11 @@ msgstr "Activer le proxy HTTP ?"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:483
 msgid "HTTP Proxy Host"
-msgstr "Hôte mandataire HTTP"
+msgstr "Hôte mandataire proxy HTTP"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:487
 msgid "HTTP Proxy Port"
-msgstr "Port mandataire HTTP"
+msgstr "Port mandataire proxy HTTP"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:491
 msgid "Use HTTP Proxy Authorization?"
@@ -5719,52 +5513,40 @@ msgstr "Arrêter le routeur"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:439
 msgid ""
-"Graceful shutdown lets the router satisfy the agreements it has already made "
-"before shutting down, but may take a few minutes."
-msgstr ""
-"Un arrêt respectueux permet au routeur de satisfaire les accords en place "
-"avec d'autres routeurs avant la fermeture,  mais cela prendra quelques "
-"minutes."
+"Graceful shutdown lets the router satisfy the agreements it has already made"
+" before shutting down, but may take a few minutes."
+msgstr "Un arrêt respectueux permet au routeur de satisfaire les accords en place avec d'autres routeurs avant la fermeture,  mais cela prendra quelques minutes."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:441
 msgid ""
-"If you need to kill the router immediately, that option is available as well."
-msgstr ""
-"Si vous avez besoin d'arrêter le routeur I2P immédiatement, cette option est "
-"également disponible."
+"If you need to kill the router immediately, that option is available as "
+"well."
+msgstr "Si vous avez besoin d'arrêter le routeur I2P immédiatement, cette option est également disponible."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:451
 msgid ""
-"If you want the router to restart itself after shutting down, you can choose "
-"one of the following."
-msgstr ""
-"Si vous voulez que le routeur redémarre après l'arrêt, vous pouvez choisir "
-"une des possibilités suivantes."
+"If you want the router to restart itself after shutting down, you can choose"
+" one of the following."
+msgstr "Si vous voulez que le routeur redémarre après l'arrêt, vous pouvez choisir une des possibilités suivantes."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:453
 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 ""
-"C'est utile dans certaines situations: p.e. quand vous faites un réglage que "
-"telle application cliente ne lit qu'au démarrage, comme le mot de passe de "
-"la console ou l'interface sur lequel elle écoute."
+msgstr "C'est utile dans certaines situations: p.e. quand vous faites un réglage que telle application cliente ne lit qu'au démarrage, comme le mot de passe de la console ou l'interface sur lequel elle écoute."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:455
 msgid ""
 "A graceful restart will take a few minutes (but your peers will appreciate "
 "your patience), while a hard restart does so immediately."
-msgstr ""
-"Un redémarrage respectueux prendra quelques minutes (mais vos pairs "
-"apprécieront votre patience), un redémarrage immédiat est quasi instantané."
+msgstr "Un redémarrage respectueux prendra quelques minutes (mais vos pairs apprécieront votre patience), un redémarrage immédiat est quasi instantané."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:457
 msgid ""
-"After tearing down the router, it will wait 1 minute before starting back up "
-"again."
-msgstr ""
-"Après le redémarrage du routeur, il attendra 1 minute avant de se relancer."
+"After tearing down the router, it will wait 1 minute before starting back up"
+" again."
+msgstr "Après le redémarrage du routeur, il attendra 1 minute avant de se relancer."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:467
 msgid "Systray integration"
@@ -5774,20 +5556,17 @@ msgstr "Intégration dans la zone de notification"
 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 ""
-"Sur Windows, une icône pour la zone de notification indiquant l'état du "
-"routeur "
+msgstr "Sur Windows, une icône pour la zone de notification indiquant l'état du routeur "
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:471
 msgid ""
 "(later on, I2P client applications will be able to integrate their own "
 "functionality into the system tray as well)."
-msgstr ""
-"(Ultérieurement, les applications clientes I2P pourront aussi intégrer leurs "
-"propres fonctionnalités dans la zone de notification système)."
+msgstr "(Ultérieurement, les applications clientes I2P pourront aussi intégrer leurs propres fonctionnalités dans la zone de notification système)."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:473
-msgid "If you are on windows, you can either enable or disable that icon here."
+msgid ""
+"If you are on windows, you can either enable or disable that icon here."
 msgstr "Si vous êtes sur Windows, vous pouvez (dés)activer cette icône ici."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:475
@@ -5804,12 +5583,9 @@ msgstr "Lancer au démarrage"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:481
 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 ""
-"Vous pouvez contrôler si I2P doit être lancé au démarrage ou pas en "
-"choisissant une des options suivantes : I2P installera le service en "
-"conséquence."
+"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 "Vous pouvez contrôler si I2P doit être lancé au démarrage ou pas en choisissant une des options suivantes : I2P installera le service en conséquence."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:483
 msgid "If you prefer the command line, you can also run the "
@@ -5822,19 +5598,15 @@ msgstr "Note"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:493
 msgid ""
-"If you are running I2P as service right now, removing it will shut down your "
-"router immediately."
-msgstr ""
-"Si vous exécutez actuellement I2P en tant que service, l'enlever arrêtera le "
-"routeur immédiatement."
+"If you are running I2P as service right now, removing it will shut down your"
+" router immediately."
+msgstr "Si vous exécutez actuellement I2P en tant que service, l'enlever arrêtera le routeur immédiatement."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:495
 msgid ""
 "You may want to consider shutting down gracefully, as above, then running "
 "uninstall_i2p_service_winnt.bat."
-msgstr ""
-"Vous pouvez faire un arrêt respectueux, comme ci-dessus, puis lancer le "
-"fichier uninstall_i2p_service_winnt.bat."
+msgstr "Vous pouvez faire un arrêt respectueux, comme ci-dessus, puis lancer le fichier uninstall_i2p_service_winnt.bat."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:499
 msgid "Debugging"
@@ -5846,14 +5618,10 @@ msgstr "Afficher la file d'attente de travaux"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:505
 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 ""
-"À l'occasion, il peut être utile de déboguer I2P à l'aide d'un cliché de "
-"tâches. Pour ce faire, cliquer sur le bouton ci-dessous et examiner le "
-"résultat dans  l'historique du <a href=\"logs.jsp#servicelogs\">service "
-"Wrapper</a>."
+"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 "À l'occasion, il peut être utile de déboguer I2P à l'aide d'un cliché de tâches. Pour ce faire, cliquer sur le bouton ci-dessous et examiner le résultat dans  l'historique du <a href=\"logs.jsp#servicelogs\">service Wrapper</a>."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:517
 msgid "Launch browser on router startup?"
@@ -5863,9 +5631,7 @@ msgstr "Lancer le navigateur au démarrage du routeur?"
 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 ""
-"La plus grande partie de la configuration d'I2P se fait dans cette console, "
-"et donc pour votre confort, I2P peut lancer au démarrage votre navigateur sur"
+msgstr "La plus grande partie de la configuration d'I2P se fait dans cette console, et donc pour votre confort, I2P peut lancer au démarrage votre navigateur sur"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:147
 msgid "config summary bar"
@@ -5943,8 +5709,7 @@ msgstr "Configuration des tunnels I2P"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:449
 msgid "The default settings work for most people."
-msgstr ""
-"La configuration par défaut fonctionne pour la plupart des utilisateurs."
+msgstr "La configuration par défaut fonctionne pour la plupart des utilisateurs."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:453
 msgid "There is a fundamental tradeoff between anonymity and performance."
@@ -5953,42 +5718,30 @@ msgstr "Il y a une contradiction fondamentale entre anonymat et performances."
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:456
 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 ""
-"Des tunnels à plus de 3 sauts (p.e. 2 sauts + 0-2 sauts, 3 sauts + 0-1 saut, "
-"3 sauts + 0-2 sauts), ou en grand nombre avec une réserve de secours élevée, "
-"peuvent gravement réduire les performances ou la fiabilité. "
+"hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely"
+" reduce performance or reliability."
+msgstr "Des tunnels à plus de 3 sauts (p.e. 2 sauts + 0-2 sauts, 3 sauts + 0-1 saut, 3 sauts + 0-2 sauts), ou en grand nombre avec une réserve de secours élevée, peuvent gravement réduire les performances ou la fiabilité. "
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:459
 msgid "High CPU and/or high outbound bandwidth usage may result."
-msgstr ""
-"Une haute charge CPU et/ou une haute utilisation de bande passante sortante "
-"peuvent en résulter. "
+msgstr "Une haute charge CPU et/ou une haute utilisation de bande passante sortante peuvent en résulter. "
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:462
 msgid "Change these settings with care, and adjust them if you have problems."
-msgstr ""
-"Modifiez ces réglages avec prudence, et ajustez les en cas de problèmes."
+msgstr "Modifiez ces réglages avec prudence, et ajustez les en cas de problèmes."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:472
 msgid ""
 "Exploratory tunnel setting changes are stored in the router.config file."
-msgstr ""
-"Les modifications des réglages de tunnels exploratoires sont enregistrées "
-"dans le fichier router.config."
+msgstr "Les modifications des réglages de tunnels exploratoires sont enregistrées dans le fichier router.config."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:475
 msgid "Client tunnel changes are temporary and are not saved."
-msgstr ""
-"Les modifications des tunnels clients sont temporaires et ne sont pas "
-"enregistrées."
+msgstr "Les modifications des tunnels clients sont temporaires et ne sont pas enregistrées."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:477
 msgid "To make permanent client tunnel changes see the"
-msgstr ""
-"Pour faire des modifications permanentes à un tunnel client particulier, "
-"voyez la"
+msgstr "Pour faire des modifications permanentes à un tunnel client particulier, voyez la"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:479
 msgid "i2ptunnel page"
@@ -6015,10 +5768,7 @@ 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 ""
-"Si vous n'utilisez pas IE, c'est que votre navigateur tente de le faire "
-"croire; configurez-le (ou son proxy) pour qu'il utilise une chaîne User "
-"Agent différente si vous souhaitez pouvoir changer de thème."
+msgstr "Si vous n'utilisez pas IE, c'est que votre navigateur tente de le faire croire; configurez-le (ou son proxy) pour qu'il utilise une chaîne User Agent différente si vous souhaitez pouvoir changer de thème."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:426
 msgid "Router Console Language"
@@ -6028,9 +5778,7 @@ msgstr "Langue de la console"
 msgid ""
 "Please contribute to the router console translation project! Contact the "
 "developers in #i2p-dev on IRC to help."
-msgstr ""
-"S'il vous plaît contribuez au projet de traduction de la console routeur ! "
-"Contactez les développeurs sur #i2p-dev sur IRC pour aider."
+msgstr "S'il vous plaît contribuez au projet de traduction de la console routeur ! Contactez les développeurs sur #i2p-dev sur IRC pour aider."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:436
 msgid "Apply"
@@ -6106,8 +5854,7 @@ msgstr "Clés de confiance"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:488
 msgid "Update with unsigned development builds?"
-msgstr ""
-"Mettre à jour avec les versions intermédiaires de développement non signées?"
+msgstr "Mettre à jour avec les versions intermédiaires de développement non signées?"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:492
 msgid "Unsigned Build URL"
@@ -6174,16 +5921,14 @@ msgstr "Merci de signaler les bogues sur {0} ou {1}."
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:175
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:346
 msgid ""
-"You may use the username \"guest\" and password \"guest\" if you do not wish "
-"to register."
-msgstr ""
-"Vous pouvez utiliser l'identifiant \"guest\" et le mot de passe \"guest\" si "
-"vous ne souhaitez pas vous inscrire."
+"You may use the username \"guest\" and password \"guest\" if you do not wish"
+" to register."
+msgstr "Vous pouvez utiliser l'identifiant \"guest\" et le mot de passe \"guest\" si vous ne souhaitez pas vous inscrire."
 
 #: ../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:348
 msgid "Please include this information in bug reports"
-msgstr "Veuillez inclure cette information dans les rapports des bugs"
+msgstr "Veuillez inclure cette information dans les rapports de bugs"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:179
 msgid "Error Details"
@@ -6203,12 +5948,9 @@ msgstr "Version d'I2P & environnement d'exécution"
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:397
 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 ""
-"Veuillez prendre note que les informations système, les tampons horaires, et "
-"les messages d'historiques contiennent des indices susceptibles de révéler "
-"votre identité. Merci de vérifier tout ce que vous incluez dans un rapport "
-"de bogue."
+"clues to your location; please review everything you include in a bug "
+"report."
+msgstr "Veuillez prendre note que les informations système, les tampons horaires, et les messages d'historiques contiennent des indices susceptibles de révéler votre identité. Merci de vérifier tout ce que vous incluez dans un rapport de bogue."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:155
 msgid "Page Not Found"
@@ -6218,8 +5960,7 @@ msgstr "Page introuvable"
 msgid ""
 "Sorry! You appear to be requesting a non-existent Router Console page or "
 "resource."
-msgstr ""
-"Désolé! Vous avez demandé une page ou ressource de la console inexistante. "
+msgstr "Désolé! Vous avez demandé une page ou ressource de la console inexistante. "
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:328
 msgid "Error 404"
@@ -6243,9 +5984,7 @@ msgstr "Graphiques de performances I2P"
 msgid ""
 "Click a flag to select a language. Click 'configure language' below to "
 "change it later."
-msgstr ""
-"Cliquez sur un drapeau pour sélectionner une langue. Cliquez sur 'configurer "
-"la langue' ci-dessous pour la changer plus tard."
+msgstr "Cliquez sur un drapeau pour sélectionner une langue. Cliquez sur 'configurer la langue' ci-dessous pour la changer plus tard."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:385
 msgid "Search I2P"
@@ -6317,11 +6056,9 @@ msgstr "L'application web demandée n'est pas lancée."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:344
 msgid ""
-"Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</"
-"a> to start it."
-msgstr ""
-"Pour la lancer, rendez-vous sur <a href=\"/configclients.jsp#webapp"
-"\">configuration des clients</a>."
+"Please visit the <a href=\"/configclients.jsp#webapp\">config clients "
+"page</a> to start it."
+msgstr "Pour la lancer, rendez-vous sur <a href=\"/configclients.jsp#webapp\">configuration des clients</a>."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:143
 msgid "peer connections"
diff --git a/apps/routerconsole/locale/messages_ja.po b/apps/routerconsole/locale/messages_ja.po
index bb4089ceb7cee4226c05582d1562101603cf9961..e0499491d4cd8e71757b9bf7dacfb999a99fd510 100644
--- a/apps/routerconsole/locale/messages_ja.po
+++ b/apps/routerconsole/locale/messages_ja.po
@@ -11,7 +11,7 @@ msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-01-09 19:27+0000\n"
-"PO-Revision-Date: 2014-01-15 09:24+0000\n"
+"PO-Revision-Date: 2014-02-05 12:51+0000\n"
 "Last-Translator: plazmism <gomidori@live.jp>\n"
 "Language-Team: Japanese (http://www.transifex.com/projects/p/I2P/language/ja/)\n"
 "MIME-Version: 1.0\n"
@@ -127,67 +127,67 @@ msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:159
 msgid "Rejecting tunnels: High message delay"
-msgstr "トンネルを拒否: 高いメッセージ遅延"
+msgstr "トンネルを拒否中: 高いメッセージ遅延"
 
 #. 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:196
 msgid "Rejecting most tunnels: High number of requests"
-msgstr "大部分のトンネルを禁止: 高いリクエスト数"
+msgstr "大部分のトンネルを拒否中: 高いリクエスト数"
 
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:247
 msgid "Rejecting tunnels: Limit reached"
-msgstr ""
+msgstr "トンネルを拒否中: 制限に到達"
 
 #. .067KBps
 #. * also limited to 90% - see below
 #. always leave at least 4KBps free when allowing
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:310
 msgid "Rejecting tunnels: Bandwidth limit"
-msgstr ""
+msgstr "トンネルを拒否中: 帯域幅制限"
 
 #. hard to do {0} from here
 #. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels:
 #. Bandwidth limit");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:380
 msgid "Rejecting most tunnels: Bandwidth limit"
-msgstr ""
+msgstr "ほとんどのトンネルを拒否中: 帯域幅制限"
 
 #. hard to do {0} from here
 #. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of
 #. tunnels");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:384
 msgid "Accepting most tunnels"
-msgstr ""
+msgstr "ほとんどのトンネルを承認中"
 
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:386
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:513
 msgid "Accepting tunnels"
-msgstr ""
+msgstr "トンネルを承認中"
 
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:502
 msgid "Rejecting tunnels: Shutting down"
-msgstr "トンネルを拒否: シャットダウン"
+msgstr "トンネルを拒否中: シャットダウン"
 
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:515
 msgid "Rejecting tunnels"
-msgstr ""
+msgstr "トンネルを拒否中"
 
 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:158
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:22
 msgid "Reseeding"
-msgstr ""
+msgstr "リシード中"
 
 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:170
 #, java-format
 msgid "Reseed fetched only 1 router."
 msgid_plural "Reseed fetched only {0} routers."
-msgstr[0] ""
+msgstr[0] "リシードは {0} ルーターのみ取得しました。"
 
 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:177
 msgid "Reseed failed."
-msgstr ""
+msgstr "リシード失敗。"
 
 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:178
 #, java-format
@@ -196,17 +196,17 @@ msgstr "ヘルプについては  {0} をご覧ください。"
 
 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:179
 msgid "reseed configuration page"
-msgstr ""
+msgstr "リシード設定ページ"
 
 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:325
 msgid "Reseeding: fetching seed URL."
-msgstr ""
+msgstr "リシード中: シード URL を取得中"
 
 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:383
 #, java-format
 msgid ""
 "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
-msgstr ""
+msgstr "リシード中: シード URL ({0} 成功、 {1} エラー) からルーター情報を取得中"
 
 #. NOTE TO TRANSLATORS - each of these phrases is a description for a
 #. statistic
@@ -234,30 +234,30 @@ msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:40
 msgid "Known fast peers"
-msgstr ""
+msgstr "既知の高速なピア"
 
 #: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:362
 msgid "NetDb entry"
-msgstr ""
+msgstr "NetDb エントリ"
 
 #. This used to be "no common transports" but it is almost always no
 #. transports at all
 #: ../../../router/java/src/net/i2p/router/transport/GetBidsJob.java:73
 msgid "No transports (hidden or starting up?)"
-msgstr ""
+msgstr "トランスポートなし (隠されているかスタートアップ中?)"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:502
 msgid "Unreachable on any transport"
-msgstr ""
+msgstr "すべてのトランスポートに到達不可"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:557
 msgid "Router Transport Addresses"
-msgstr ""
+msgstr "ルータートランスポートアドレス"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:565
 #, java-format
 msgid "{0} is used for outbound connections only"
-msgstr ""
+msgstr "{0} は送信接続にのみ使用されます。"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:581
 #: ../java/src/net/i2p/router/web/HomeHelper.java:32
@@ -269,18 +269,18 @@ msgstr "ヘルプ"
 msgid ""
 "Your transport connection limits are automatically set based on your "
 "configured bandwidth."
-msgstr ""
+msgstr "トランスポート接続制限数は、設定されている帯域幅に基づき自動的に設定されました。"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:584
 msgid ""
 "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and "
 "i2np.udp.maxConnections=nnn on the advanced configuration page."
-msgstr ""
+msgstr "これらの制限を上書きするには、高度な設定ページに設定 i2np.ntcp.maxConnections=nnn 及び i2np.udp.maxConnections=nnn を加えてください。"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:586
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:274
 msgid "Definitions"
-msgstr ""
+msgstr "定義"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:587
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1121
@@ -295,7 +295,7 @@ msgstr "ピア"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:587
 msgid "The remote peer, identified by router hash"
-msgstr ""
+msgstr "リモートピア、ルーターハッシュにより識別"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:588
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1122
@@ -305,24 +305,24 @@ msgstr "ディレクトリ"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:589
 msgid "Inbound connection"
-msgstr ""
+msgstr "着信接続"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:591
 msgid "Outbound connection"
-msgstr ""
+msgstr "送信接続"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:593
 msgid "They offered to introduce us (help other peers traverse our firewall)"
-msgstr ""
+msgstr "They offered to introduce us (こちらのファイアーウォールを他のピアが越えるのに役立ちます)"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:595
 msgid ""
 "We offered to introduce them (help other peers traverse their firewall)"
-msgstr ""
+msgstr "We offered to introduce them (彼らのファイアーウォールを他のピアが越えるのに役立ちます)"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:596
 msgid "How long since a packet has been received / sent"
-msgstr ""
+msgstr "パケットが受信/送信されてからの経過時間"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:596
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1124
@@ -339,7 +339,7 @@ msgstr "入出力"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:597
 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)"
-msgstr ""
+msgstr "平滑化された受信/送信転送速度(キロバイト毎秒)"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:598
 msgid "How long ago this connection was established"
@@ -350,99 +350,99 @@ msgstr "この接続が確立以後の経過時間"
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2540
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:877
 msgid "Up"
-msgstr ""
+msgstr "アップ"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:599
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1127
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2542
 msgid "Skew"
-msgstr ""
+msgstr "スキュー"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:599
 msgid "The difference between the peer's clock and your own"
-msgstr ""
+msgstr "ピアの時計の自分の間の違い"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:600
 msgid ""
 "The congestion window, which is how many bytes can be sent without an "
 "acknowledgement"
-msgstr ""
+msgstr "輻輳(ふくそう)ウィンドウ、どれだけ多くのバイトが確認なしに送信されうるか"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:601
 msgid "The number of sent messages awaiting acknowledgement"
-msgstr ""
+msgstr "確認待ちの送信メッセージ数"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:602
 msgid "The maximum number of concurrent messages to send"
-msgstr ""
+msgstr "同時送信メッセージの最大数"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:603
 msgid "The number of pending sends which exceed congestion window"
-msgstr ""
+msgstr "輻輳ウィンドウを超える保留中の送信の数"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:604
 msgid "The slow start threshold"
-msgstr ""
+msgstr "スロースタートしきい値"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:605
 msgid "The round trip time in milliseconds"
-msgstr ""
+msgstr "ミリ秒単位往復時間"
 
 #. "<b id=\"def.dev\">").append(_("Dev")).append("</b>: ").append(_("The
 #. standard deviation of the round trip time in
 #. milliseconds")).append("<br>\n" +
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:607
 msgid "The retransmit timeout in milliseconds"
-msgstr ""
+msgstr "ミリ秒単位再送タイムアウト"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:608
 msgid ""
 "Current maximum send packet size / estimated maximum receive packet size "
 "(bytes)"
-msgstr ""
+msgstr "現在の最大送信パケットサイズ / 推定最大受信パケットサイズ (バイト)"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:609
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1128
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2559
 msgid "TX"
-msgstr ""
+msgstr "TX"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:609
 msgid "The total number of packets sent to the peer"
-msgstr ""
+msgstr "ピアに送信されたパケットの合計数"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:610
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1129
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2561
 msgid "RX"
-msgstr ""
+msgstr "RX"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:610
 msgid "The total number of packets received from the peer"
-msgstr ""
+msgstr "ピアから受信したパケットの合計数"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:611
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2564
 msgid "Dup TX"
-msgstr ""
+msgstr "Dup TX"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:611
 msgid "The total number of packets retransmitted to the peer"
-msgstr ""
+msgstr "ピアに再送されたパケットの合計数"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:612
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2566
 msgid "Dup RX"
-msgstr ""
+msgstr "Dup RX"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:612
 msgid "The total number of duplicate packets received from the peer"
-msgstr ""
+msgstr "ピアから受信した重複パケットの合計数"
 
 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:525
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
 msgid "Service"
-msgstr ""
+msgstr "サービス"
 
 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:527
 msgid "WAN Common Interface Configuration"
@@ -564,7 +564,7 @@ msgstr ""
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:632
 #, java-format
 msgid "Excessive clock skew: {0}"
-msgstr ""
+msgstr "過度のクロックスキュー: {0}"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1116
 msgid "NTCP connections"
@@ -573,12 +573,12 @@ msgstr "NTCP 接続"
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1117
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2520
 msgid "Limit"
-msgstr ""
+msgstr "制限"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1118
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2521
 msgid "Timeout"
-msgstr ""
+msgstr "タイムアウト"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1123
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2529
@@ -591,34 +591,34 @@ msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1131
 msgid "Backlogged?"
-msgstr ""
+msgstr "バッグログされていますか?"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1144
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2583
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:91
 msgid "Inbound"
-msgstr ""
+msgstr "着信"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1146
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2585
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:91
 msgid "Outbound"
-msgstr ""
+msgstr "送信"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1201
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2750
 #, java-format
 msgid "{0} peer"
 msgid_plural "{0} peers"
-msgstr[0] ""
+msgstr[0] "{0} ピア"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2519
 msgid "UDP connections"
-msgstr ""
+msgstr "UDP 接続"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2526
 msgid "Sort by peer hash"
-msgstr ""
+msgstr "ピアハッシュでソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2528
 msgid "Direction/Introduction"
@@ -626,91 +626,91 @@ msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2531
 msgid "Sort by idle inbound"
-msgstr ""
+msgstr "アイドルの受信でソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2533
 msgid "Sort by idle outbound"
-msgstr ""
+msgstr "アイドルの送信でソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2536
 msgid "Sort by inbound rate"
-msgstr ""
+msgstr "受信速度でソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2538
 msgid "Sort by outbound rate"
-msgstr ""
+msgstr "送信速度でソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2541
 msgid "Sort by connection uptime"
-msgstr ""
+msgstr "接続稼働時間でソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2543
 msgid "Sort by clock skew"
-msgstr ""
+msgstr "クロックスキューでソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2546
 msgid "Sort by congestion window"
-msgstr ""
+msgstr "輻輳ウィンドウでソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2548
 msgid "Sort by slow start threshold"
-msgstr ""
+msgstr "スロースタートしきい値でソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2551
 msgid "Sort by round trip time"
-msgstr ""
+msgstr "往復時間でソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2555
 msgid "Sort by retransmission timeout"
-msgstr ""
+msgstr "再送信タイムアウトでソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2558
 msgid "Sort by outbound maximum transmit unit"
-msgstr ""
+msgstr "送信最大伝送単位でソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2560
 msgid "Sort by packets sent"
-msgstr ""
+msgstr "送信パケットでソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2562
 msgid "Sort by packets received"
-msgstr ""
+msgstr "受信パケットでソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2565
 msgid "Sort by packets retransmitted"
-msgstr ""
+msgstr "再送パケットでソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2567
 msgid "Sort by packets received more than once"
-msgstr ""
+msgstr "二度以上受信したパケットでソート"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2587
 msgid "We offered to introduce them"
-msgstr ""
+msgstr "We offered to introduce them"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2589
 msgid "They offered to introduce us"
-msgstr ""
+msgstr "They offered to introduce us"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2593
 msgid "Choked"
-msgstr ""
+msgstr "絞られました"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2601
 msgid "1 fail"
-msgstr ""
+msgstr "1 回失敗"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2603
 #, java-format
 msgid "{0} fails"
-msgstr ""
+msgstr "{0} 回失敗"
 
 #. 1
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2609
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:165
 #: ../java/src/net/i2p/router/web/ProfilesHelper.java:13
 msgid "Banned"
-msgstr ""
+msgstr "禁止されました"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2668
 msgid "backlogged"
@@ -718,34 +718,34 @@ msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:213
 msgid "Dropping tunnel requests: Too slow"
-msgstr ""
+msgstr "トンネル要求ドロップ: 遅すぎます"
 
 #. don't even bother, since we are so overloaded locally
 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:371
 msgid "Dropping tunnel requests: Overloaded"
-msgstr ""
+msgstr "トンネル要求ドロップ: 過負荷"
 
 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:619
 msgid "Rejecting tunnels: Request overload"
-msgstr ""
+msgstr "トンネルを拒否中: リクエスト過負荷"
 
 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:650
 msgid "Rejecting tunnels: Connection limit"
-msgstr ""
+msgstr "トンネルを拒否中: 接続制限"
 
 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:861
 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:894
 msgid "Dropping tunnel requests: High load"
-msgstr ""
+msgstr "トンネル要求ドロップ: 高いロード"
 
 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:973
 msgid "Dropping tunnel requests: Queue time"
-msgstr ""
+msgstr "トンネル要求ドロップ: キュー時間"
 
 #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:760
 #, java-format
 msgid "New plugin version {0} is available"
-msgstr ""
+msgstr "新しいプラグインのバージョン {0} が利用できます。"
 
 #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:838
 #, java-format
@@ -755,7 +755,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:840
 #, java-format
 msgid "No new version is available for plugin {0}"
-msgstr ""
+msgstr "プラグイン {0} の新しいバージョンは利用できません。"
 
 #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:863
 #, java-format
@@ -802,7 +802,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/update/NewsFetcher.java:140
 msgid "In-network updates disabled. Check package manager."
-msgstr ""
+msgstr "ネットワーク内アップデートが無効になりました。パッケージマネージャーを確認してください。"
 
 #: ../java/src/net/i2p/router/update/NewsFetcher.java:146
 msgid "No write permission for I2P install directory."
@@ -811,12 +811,12 @@ msgstr ""
 #: ../java/src/net/i2p/router/update/NewsFetcher.java:154
 #, java-format
 msgid "You must first update to version {0}"
-msgstr ""
+msgstr "まずバージョン {0} にアップデートしなければなりません"
 
 #: ../java/src/net/i2p/router/update/NewsFetcher.java:164
 #, java-format
 msgid "Requires Java version {0} but installed Java version is {1}"
-msgstr ""
+msgstr "Java のバージョン {0} が必要ですが、インストールされている Java のバージョンは {1} です"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateChecker.java:55
 #, java-format
@@ -850,7 +850,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:390
 #, java-format
 msgid "Downloading plugin from {0}"
-msgstr ""
+msgstr "{0} からプラグインをダウンロード中"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:122
 msgid "Plugin downloaded"
@@ -889,22 +889,22 @@ msgstr ""
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:233
 #, java-format
 msgid "Plugin from {0} has invalid name or version"
-msgstr ""
+msgstr " {0} からのプラグインは、名前またはバージョンを無効化しました。"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:238
 #, java-format
 msgid "Plugin {0} has mismatched versions"
-msgstr ""
+msgstr "プラグイン {0} はバージョンが一致しませんでした。"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:249
 #, java-format
 msgid "This plugin requires I2P version {0} or higher"
-msgstr ""
+msgstr "このプラグインには I2P のバージョン {0} 以降が必要です。"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:257
 #, java-format
 msgid "This plugin requires Java version {0} or higher"
-msgstr ""
+msgstr "このプラグインは Java のバージョン {0} 以降が必要です。"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:266
 msgid ""
@@ -923,27 +923,27 @@ msgstr ""
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:292
 #, java-format
 msgid "Downloaded plugin version {0} is not newer than installed plugin"
-msgstr ""
+msgstr "ダウンロードされたプラグインのバージョン {0} はインストールされているプラグインより新しくありません。"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:299
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or higher"
-msgstr ""
+msgstr "プラグインのアップデートにはインストールされているプラグインのバージョン {0} 以降が必要です。"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:306
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or lower"
-msgstr ""
+msgstr "プラグインのアップデートにはインストールされたプラグインのバージョン {0} 以前が必要です。"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:314
 #, java-format
 msgid "Plugin requires Jetty version {0} or higher"
-msgstr ""
+msgstr "プラグインには Jetty のバージョン {0} 以降が必要です。"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:321
 #, java-format
 msgid "Plugin requires Jetty version {0} or lower"
-msgstr ""
+msgstr "プラグインには Jetty のバージョン {0} 以前が必要です。"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:330
 #, java-format
@@ -997,7 +997,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/update/UpdateRunner.java:265
 #, java-format
 msgid "No new version found at {0}"
-msgstr ""
+msgstr "{0} に新しいバージョンが見つかりませんでした"
 
 #: ../java/src/net/i2p/router/web/BanlistRenderer.java:64
 #, java-format
@@ -1106,16 +1106,16 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:227
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:229
 msgid "I2P Router Console"
-msgstr ""
+msgstr "I2P ルーターコンソール"
 
 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:51
 msgid "Error updating the configuration - please see the error logs"
-msgstr ""
+msgstr "設定を更新する際にエラー - エラーログを確認してください"
 
 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:61
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:372
 msgid "Configuration saved successfully"
-msgstr ""
+msgstr "設定は正常に保存されました"
 
 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:63
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:458
@@ -1124,34 +1124,34 @@ msgstr ""
 msgid ""
 "Error saving the configuration (applied but not saved) - please see the "
 "error logs"
-msgstr ""
+msgstr "設定を保存する際にエラー (適用されましたが保存されませんでした) - エラーログを確認してください"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:40
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:478
 msgid "Save Client Configuration"
-msgstr ""
+msgstr "クライアント設定を保存"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:44
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:544
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:548
 msgid "Save Interface Configuration"
-msgstr ""
+msgstr "インターフェース設定を保存"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:48
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:564
 msgid "Save WebApp Configuration"
-msgstr ""
+msgstr "WebApp 設定を保存"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:52
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:578
 msgid "Save Plugin Configuration"
-msgstr ""
+msgstr "プラグイン設定を保存"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:56
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:586
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:590
 msgid "Install Plugin"
-msgstr ""
+msgstr "プラグインをインストール"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:60
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:592
@@ -1162,37 +1162,37 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:131
 #, java-format
 msgid "Error stopping plugin {0}"
-msgstr ""
+msgstr "プラグイン {0} を停止中にエラー"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:105
 #, java-format
 msgid "Deleted plugin {0}"
-msgstr ""
+msgstr "プラグイン {0} を削除しました"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:107
 #, java-format
 msgid "Error deleting plugin {0}"
-msgstr ""
+msgstr "プラグイン {0} を削除する際にエラー"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:129
 #, java-format
 msgid "Stopped plugin {0}"
-msgstr ""
+msgstr "プラグイン {0} を停止しました"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:136
 #, java-format
 msgid "Stopped webapp {0}"
-msgstr ""
+msgstr "ウェブアプリ  {0} が停止しました"
 
 #. label (IE)
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:157
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:276
 msgid "Start"
-msgstr ""
+msgstr "èµ·å‹•"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:220
 msgid "New client added"
-msgstr ""
+msgstr "新規クライアントが追加されました"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:224
 msgid "Client configuration saved successfully"
@@ -1202,12 +1202,12 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:260
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:275
 msgid "Bad client index."
-msgstr ""
+msgstr "不良なクライアントインデックス"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:243
 #, java-format
 msgid "Client {0} stopped"
-msgstr ""
+msgstr "クライアント {0} が停止しました"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:265
 #, java-format
@@ -1217,46 +1217,46 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:280
 #, java-format
 msgid "Client {0} deleted"
-msgstr ""
+msgstr "クライアント {0} が削除されました"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:296
 msgid "WebApp configuration saved."
-msgstr ""
+msgstr "WebApp 設定が保存されました。"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311
 msgid "Plugin configuration saved."
-msgstr ""
+msgstr "プラグイン設定が保存されました。"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:326
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:138
 msgid "WebApp"
-msgstr ""
+msgstr "WebApp"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:326
 msgid "started"
-msgstr ""
+msgstr "起動しました"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:328
 msgid "Failed to start"
-msgstr ""
+msgstr "起動に失敗"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:333
 msgid "Failed to find server."
-msgstr ""
+msgstr "サーバーの検索に失敗"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339
 msgid "No plugin URL specified."
-msgstr ""
+msgstr "プラグインURLが指定されていません。"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:349
 #, java-format
 msgid "No update URL specified for {0}"
-msgstr ""
+msgstr "更新URLは {0} に指定されていません。"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:358
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:379
 msgid "Plugin or update download already in progress."
-msgstr ""
+msgstr "プラグインまたはアップデートのダウンロードはすでに進行中です。"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:361
 msgid "Updating all plugins"
@@ -1270,17 +1270,17 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:406
 #, java-format
 msgid "Checking plugin {0} for updates"
-msgstr ""
+msgstr "プラグイン {0} のアップデートを確認中"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:416
 #, java-format
 msgid "Started plugin {0}"
-msgstr ""
+msgstr "プラグイン {0} を起動しました"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:418
 #, java-format
 msgid "Error starting plugin {0}"
-msgstr ""
+msgstr "プラグイン {0} を起動する際にエラー"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:440
 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:89
@@ -1303,101 +1303,101 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:76
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:281
 msgid "Edit"
-msgstr ""
+msgstr "編集"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:474
 msgid "Add Client"
-msgstr ""
+msgstr "クライアントを追加"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94
 msgid "Class and arguments"
-msgstr ""
+msgstr "クラスと引数"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:510
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:427
 msgid "Client"
-msgstr ""
+msgstr "クライアント"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:138
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163
 msgid "Control"
-msgstr ""
+msgstr "操作"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:138
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163
 msgid "Run at Startup?"
-msgstr ""
+msgstr "スタートアップ時に起動?"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:138
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:211
 msgid "Description"
-msgstr ""
+msgstr "説明"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163
 msgid "Plugin"
-msgstr ""
+msgstr "プラグイン"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:175
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:301
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:295
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:321
 msgid "Version"
-msgstr ""
+msgstr "バージョン"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:177
 msgid "Signed by"
-msgstr ""
+msgstr "署名者"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:194
 msgid "Date"
-msgstr ""
+msgstr "日付"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:200
 msgid "Author"
-msgstr ""
+msgstr "作者"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:216
 msgid "License"
-msgstr ""
+msgstr "ライセンス"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:221
 #: ../java/src/net/i2p/router/web/HomeHelper.java:35
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:174
 msgid "Website"
-msgstr ""
+msgstr "ウェブサイト"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:226
 msgid "Update link"
-msgstr ""
+msgstr "アップデートリンク"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:279
 msgid "Stop"
-msgstr ""
+msgstr "停止"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:283
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:141
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:436
 msgid "Check for updates"
-msgstr ""
+msgstr "アップデートを確認"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:284
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
 msgid "Update"
-msgstr ""
+msgstr "アップデート"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:289
 #, java-format
 msgid "Are you sure you want to delete {0}?"
-msgstr ""
+msgstr "{0} を削除してよろしいですか?"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:291
 msgid "Delete"
-msgstr ""
+msgstr "削除"
 
 #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:21
 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:22
@@ -1408,7 +1408,7 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:504
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:446
 msgid "Delete selected"
-msgstr ""
+msgstr "選択削除"
 
 #: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:22
 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:23
@@ -1466,69 +1466,69 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:477
 msgid "Add key"
-msgstr ""
+msgstr "キーを追加"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:475
 msgid "Delete key"
-msgstr ""
+msgstr "Delete キー"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:21
 msgid "You must enter a destination"
-msgstr ""
+msgstr "宛先を入力しなければなりません"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:23
 msgid "You must enter a key"
-msgstr ""
+msgstr "キーを入力しなければなりません"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43
 msgid "Key for"
-msgstr ""
+msgstr "キー:"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34
 msgid "added to keyring"
-msgstr ""
+msgstr "キーホルダーを追加中"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:36
 msgid "Invalid destination or key"
-msgstr ""
+msgstr "無効な宛先またはキー"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41
 msgid "removed from keyring"
-msgstr ""
+msgstr "キーホルダーから削除されました"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43
 msgid "not found in keyring"
-msgstr ""
+msgstr "キーホルダーが見つかりません"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:45
 msgid "Invalid destination"
-msgstr ""
+msgstr "無効な宛先"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:82
 msgid "Log overrides updated"
-msgstr ""
+msgstr "ログオーバーライドが更新されました"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:161
 msgid "Log configuration saved"
-msgstr ""
+msgstr "ログ設定が保存されました"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:48
 msgid ""
 "Add additional logging statements above. Example: net.i2p.router.tunnel=WARN"
-msgstr ""
+msgstr "上に追加ログ記録命令を追加してください。例: net.i2p.router.tunnel=WARN"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:49
 msgid ""
 "Or put entries in the logger.config file. Example: "
 "logger.record.net.i2p.router.tunnel=WARN"
-msgstr ""
+msgstr "または、 logger.config ファイルにエントリを加えてください。例: logger.record.net.i2p.router.tunnel=WARN"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:50
 msgid "Valid levels are DEBUG, INFO, WARN, ERROR, CRIT"
-msgstr ""
+msgstr "有効なレベルは DEBUG, INFO, WARN, ERROR, CRIT です"
 
 #. Homeland Security Advisory System
 #. http://www.dhs.gov/xinfoshare/programs/Copy_of_press_release_0046.shtm
@@ -1536,37 +1536,37 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 #: ../java/src/net/i2p/router/web/LogsHelper.java:117
 msgid "CRIT"
-msgstr ""
+msgstr "CRIT"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 msgid "DEBUG"
-msgstr ""
+msgstr "DEBUG"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 #: ../java/src/net/i2p/router/web/LogsHelper.java:119
 msgid "ERROR"
-msgstr ""
+msgstr "ERROR"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 #: ../java/src/net/i2p/router/web/LogsHelper.java:123
 msgid "INFO"
-msgstr ""
+msgstr "INFO"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 #: ../java/src/net/i2p/router/web/LogsHelper.java:121
 msgid "WARN"
-msgstr ""
+msgstr "WARN"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:144
 #: ../java/src/net/i2p/router/web/HomeHelper.java:195
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:851
 msgid "Remove"
-msgstr ""
+msgstr "削除"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:125
 msgid "Select a class to add"
-msgstr ""
+msgstr "追加するクラスを選択"
 
 #. stat groups for stats.jsp
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
@@ -1581,7 +1581,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:345
 msgid "Network"
-msgstr ""
+msgstr "ネットワーク"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:286
@@ -1631,44 +1631,44 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
 msgid "UI"
-msgstr ""
+msgstr "UI"
 
 #: ../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:493
 #: ../java/strings/Strings.java:72
 msgid "Tunnels"
-msgstr ""
+msgstr "トンネル"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21
 msgid "Clients"
-msgstr ""
+msgstr "クライアント"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:449
 msgid "Keyring"
-msgstr ""
+msgstr "キーホルダー"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21
 msgid "Logging"
-msgstr ""
+msgstr "ロギング"
 
 #: ../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:379
 #: ../java/strings/Strings.java:67
 msgid "Peers"
-msgstr ""
+msgstr "ピア"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:430
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240
 msgid "Stats"
-msgstr ""
+msgstr "統計"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:22
 msgid "Advanced"
-msgstr ""
+msgstr "詳細"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:58
 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:30
@@ -1681,15 +1681,15 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:533
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:483
 msgid "Save changes"
-msgstr ""
+msgstr "変更を保存"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:142
 msgid "Rechecking router reachability..."
-msgstr ""
+msgstr "ルーター到達性を再確認中"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205
 msgid "Updating IP address"
-msgstr ""
+msgstr "IP アドレスを更新中"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:227
 msgid "Updating IPv6 setting"
@@ -1697,7 +1697,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:244
 msgid "Disabling TCP completely"
-msgstr ""
+msgstr "完全に TCP を無効化中"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:249
 #, java-format
@@ -1706,11 +1706,11 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:256
 msgid "Disabling inbound TCP"
-msgstr ""
+msgstr "着信 TCP を無効化中"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:258
 msgid "Updating inbound TCP address to auto"
-msgstr ""
+msgstr "着信 TCP アドレスをオートに更新中"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:271
 #, java-format
@@ -1729,7 +1729,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:282
 msgid "Updating inbound TCP port to auto"
-msgstr ""
+msgstr "着信 TCP ポートをオートに更新中"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:296
 #, java-format
@@ -1738,11 +1738,11 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:321
 msgid "Gracefully restarting into Hidden Router Mode"
-msgstr ""
+msgstr "隠されたルーターモードにグレースフルに再起動"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:323
 msgid "Gracefully restarting to exit Hidden Router Mode"
-msgstr ""
+msgstr "グレースフルに再起動し、隠されたルーターモードを終了"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:332
 msgid "Enabling UPnP"
@@ -1754,11 +1754,11 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:343
 msgid "Enabling laptop mode"
-msgstr ""
+msgstr "ラップトップモードを有効化中"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:345
 msgid "Disabling laptop mode"
-msgstr ""
+msgstr "ラップトップモードを無効化中"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:352
 msgid "Disabling UDP"
@@ -1770,7 +1770,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:361
 msgid "Requiring SSU introducers"
-msgstr ""
+msgstr "SSU イントロデューサーを要求中"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:419
 msgid "Invalid address"
@@ -1792,11 +1792,11 @@ msgstr "帯域幅制限を更新しました"
 #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:45
 #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:48
 msgid "unknown"
-msgstr ""
+msgstr "不明"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:240
 msgid "bits per second"
-msgstr ""
+msgstr "毎秒ビット"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:241
 #, java-format
@@ -1806,66 +1806,66 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:468
 msgid "Ban peer until restart"
-msgstr ""
+msgstr "再起動までピアを禁止"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:23
 #, java-format
 msgid "Manually banned via {0}"
-msgstr ""
+msgstr "{0} を通じて手動で禁止されました"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
 msgid "banned until restart"
-msgstr ""
+msgstr "再起動まで禁止されました"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:27
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:38
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:59
 msgid "Invalid peer"
-msgstr ""
+msgstr "無効なピア"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:470
 msgid "Unban peer"
-msgstr ""
+msgstr "ピアの禁止を解除"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
 msgid "unbanned"
-msgstr ""
+msgstr "禁止解除されました"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
 msgid "is not currently banned"
-msgstr ""
+msgstr "現在禁止されていません"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:496
 msgid "Adjust peer bonuses"
-msgstr ""
+msgstr "ピアのボーナスを調整"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47
 msgid "Bad speed value"
-msgstr ""
+msgstr "不良な速度値"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:52
 msgid "Bad capacity value"
-msgstr ""
+msgstr "不良な許容値"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61
 msgid "Unsupported"
-msgstr ""
+msgstr "非サポート"
 
 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:20
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:529
 msgid "Save changes and reseed now"
-msgstr ""
+msgstr "変更を保存し、今すぐリシード"
 
 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:23
 msgid "Reseeding is already in progress"
-msgstr ""
+msgstr "リシードはすでに進行中です"
 
 #. skip the nonce checking in ReseedHandler
 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:26
 msgid "Starting reseed process"
-msgstr ""
+msgstr "リシードプロセスを開始"
 
 #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:83
 msgid "Configuration saved successfully."
@@ -1959,37 +1959,37 @@ msgstr "正常な再起動が要求されました"
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:190
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:461
 msgid "Hard restart"
-msgstr ""
+msgstr "ハード再起動"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:195
 msgid "Hard restart requested"
-msgstr ""
+msgstr "ハード再起動が要求されました"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:196
 msgid "Rekey and Restart"
-msgstr ""
+msgstr "キー交換して再起動"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:197
 msgid "Rekeying after graceful restart"
-msgstr ""
+msgstr "グレースフル・リスタート後にキー交換"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:200
 msgid "Rekey and Shutdown"
-msgstr ""
+msgstr "キー交換し、シャットダウン"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:201
 msgid "Rekeying after graceful shutdown"
-msgstr ""
+msgstr "グレースフル・シャットダウン後にキー交換"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:204
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:487
 msgid "Run I2P on startup"
-msgstr ""
+msgstr "スタートアップ時に I2P を起動"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:206
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:489
 msgid "Don't run I2P on startup"
-msgstr ""
+msgstr "スタートアップ時に I2P を起動しない"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:208
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:513
@@ -2157,7 +2157,7 @@ msgstr[0] ""
 #, java-format
 msgid "1 tunnel"
 msgid_plural "{0} tunnels"
-msgstr[0] ""
+msgstr[0] "{0} トンネル"
 
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:33
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:35
@@ -2252,7 +2252,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:75
 msgid "Arabic"
-msgstr ""
+msgstr "アラビア語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:76
 msgid "Czech"
@@ -2264,11 +2264,11 @@ msgstr "デンマーク語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:78
 msgid "German"
-msgstr ""
+msgstr "ドイツ語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:79
 msgid "Estonian"
-msgstr ""
+msgstr "エストニア語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:80
 msgid "Greek"
@@ -2276,11 +2276,11 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:81
 msgid "English"
-msgstr ""
+msgstr "英語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:82
 msgid "Spanish"
-msgstr ""
+msgstr "スペイン語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:83
 msgid "Finnish"
@@ -2288,11 +2288,11 @@ msgstr "フィンランド語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:84
 msgid "French"
-msgstr ""
+msgstr "フランス語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:85
 msgid "Hungarian"
-msgstr ""
+msgstr "ハンガリー語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:86
 msgid "Italian"
@@ -2300,15 +2300,15 @@ msgstr "イタリア語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:87
 msgid "Japanese"
-msgstr ""
+msgstr "日本語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:88
 msgid "Dutch"
-msgstr ""
+msgstr "オランダ語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:89
 msgid "Norwegian Bokmaal"
-msgstr ""
+msgstr "ブークモール・ノルウェー語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:90
 msgid "Polish"
@@ -2317,19 +2317,19 @@ msgstr "ポーランド語"
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:91
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:92
 msgid "Portuguese"
-msgstr ""
+msgstr "ポルトガル語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:93
 msgid "Romanian"
-msgstr ""
+msgstr "ルーマニア語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:94
 msgid "Russian"
-msgstr ""
+msgstr "ロシア語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:95
 msgid "Swedish"
-msgstr ""
+msgstr "スウェーデン語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:96
 msgid "Turkish"
@@ -2345,7 +2345,7 @@ msgstr "ベトナム語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:99
 msgid "Chinese"
-msgstr ""
+msgstr "中国語"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:140
 msgid "Add a user and password to enable."
@@ -2589,7 +2589,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/HomeHelper.java:27
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:252
 msgid "Addressbook"
-msgstr ""
+msgstr "アドレスブック"
 
 #: ../java/src/net/i2p/router/web/HomeHelper.java:27
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:250
@@ -2635,7 +2635,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/HomeHelper.java:32
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:268
 msgid "I2P Router Help"
-msgstr ""
+msgstr "I2P ルーターヘルプ"
 
 #: ../java/src/net/i2p/router/web/HomeHelper.java:33
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:155
@@ -2783,7 +2783,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/HomeHelper.java:59
 msgid "I2P Network Statistics"
-msgstr ""
+msgstr "I2P ネットワーク統計"
 
 #: ../java/src/net/i2p/router/web/HomeHelper.java:60
 msgid "Technical Docs"
@@ -2865,7 +2865,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:113
 msgid "Total Job Statistics"
-msgstr ""
+msgstr "合計ジョブ統計"
 
 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:124
 #: ../java/src/net/i2p/router/web/JobQueueHelper.java:141
@@ -2954,7 +2954,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:92
 msgid "not found in network database"
-msgstr ""
+msgstr "ネットワークデータベース内に見つかりませんでした"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:135
 msgid "LeaseSet"
@@ -3004,7 +3004,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:294
 msgid "Network Database Router Statistics"
-msgstr ""
+msgstr "ネットワークデータベースルーター統計"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:301
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:315
@@ -3014,7 +3014,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:315
 msgid "Transports"
-msgstr ""
+msgstr "トランスポート"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:333
 msgid "Country"
@@ -3289,15 +3289,15 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:269
 msgid "fast peers"
-msgstr ""
+msgstr "高速なピア"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:271
 msgid "high capacity peers"
-msgstr ""
+msgstr "許容数の大きいピア"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:273
 msgid " well integrated peers"
-msgstr ""
+msgstr "上手く統合されているピア"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:275
 msgid "as determined by the profile organizer"
@@ -3371,7 +3371,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:60
 msgid "Statistics gathered during this router's uptime"
-msgstr ""
+msgstr "ルーターの稼働時間中に収集された統計"
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:63
 msgid ""
@@ -3479,7 +3479,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:142
 msgid "I2P Router Help &amp; FAQ"
-msgstr ""
+msgstr "I2P ルーターヘルプ &amp; FAQ"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:144
 msgid "Help &amp; FAQ"
@@ -3497,7 +3497,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:186
 msgid "Configure I2P Router"
-msgstr ""
+msgstr "I2P ルーターを構成"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:188
 msgid "I2P Internals"
@@ -3523,7 +3523,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:212
 msgid "Show list of all known I2P routers"
-msgstr ""
+msgstr "既存の全 I2P ルーターの一覧を表示"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:214
 msgid "NetDB"
@@ -3567,7 +3567,7 @@ msgstr ""
 msgid ""
 "Your Local Identity is your unique I2P router identity, similar to an ip "
 "address but tailored to I2P. "
-msgstr ""
+msgstr "ローカル識別子は一意な I2P ルーターの識別子であり、 IP アドレスに近いですが、 I2P に合わせています。"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276
 msgid "Never disclose this to anyone, as it can reveal your real world ip."
@@ -3575,7 +3575,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:278
 msgid "Local Identity"
-msgstr ""
+msgstr "ローカル識別子"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282
 msgid "Your unique I2P router identity is"
@@ -3592,7 +3592,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:292
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:318
 msgid "The version of the I2P software we are running"
-msgstr ""
+msgstr "起動中の I2P ソフトウェアのバージョン"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:302
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:328
@@ -3602,7 +3602,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:305
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:331
 msgid "Uptime"
-msgstr ""
+msgstr "稼働時間"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:343
 msgid ""
@@ -3643,11 +3643,11 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415
 msgid "The number of peers available for network database inquiries"
-msgstr ""
+msgstr "ネットワークデータベースに利用できるピアの数の照会"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:424
 msgid "The total number of peers in our network database"
-msgstr ""
+msgstr "ネットワークデータベース内の合計ピア数"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:427
 msgid "Known"
@@ -3663,17 +3663,17 @@ msgstr "帯域幅 入力/出力"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:469
 msgid "Total"
-msgstr ""
+msgstr "合計"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:476
 msgid "Used"
-msgstr ""
+msgstr "使用済み"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:498
 msgid ""
 "Used for building and testing tunnels, and communicating with floodfill "
 "peers"
-msgstr ""
+msgstr "トンネルの作成・テストと、floodfillピアとコミュニケーションを取るのに使用された"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:501
 msgid "Exploratory"
@@ -3792,7 +3792,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:176
 msgid "Disconnected - check network cable"
-msgstr ""
+msgstr "切断されました - ネットワークケーブルを確認してください"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:178
 msgid ""
@@ -3802,7 +3802,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:184
 msgid "ERR-No Active Peers, Check Network Connection and Firewall"
-msgstr ""
+msgstr "ERR-アクティブのピアなし、ネットワークの接続およびファイアーウォールを確認してください。"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:187
 msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
@@ -3814,7 +3814,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:414
 msgid "Add/remove/edit &amp; control your client and server tunnels"
-msgstr ""
+msgstr "クライアント及びサーバートンネルを追加・削除・編集・操作"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:425
 msgid "Server"
@@ -3873,7 +3873,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:690
 #, java-format
 msgid "Version {0}"
-msgstr ""
+msgstr "バージョン {0} "
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:689
 msgid "Update available"
@@ -4027,7 +4027,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:131
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:223
 msgid "Lifetime bandwidth usage"
-msgstr ""
+msgstr "生涯帯域幅使用量"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:161
 msgid "Expiry"
@@ -4070,7 +4070,7 @@ msgstr ""
 #: ../java/strings/Strings.java:12
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:161
 msgid "addressbook"
-msgstr ""
+msgstr "アドレスブック"
 
 #: ../java/strings/Strings.java:13
 msgid "i2psnark"
@@ -4181,7 +4181,7 @@ msgstr ""
 
 #: ../java/strings/Strings.java:58
 msgid "BandwidthLimiter"
-msgstr ""
+msgstr "帯域幅リミッター"
 
 #: ../java/strings/Strings.java:59
 msgid "ClientMessages"
@@ -4205,7 +4205,7 @@ msgstr ""
 
 #: ../java/strings/Strings.java:65
 msgid "NetworkDatabase"
-msgstr ""
+msgstr "ネットワークデータベース"
 
 #: ../java/strings/Strings.java:66
 msgid "ntcp"
@@ -4221,7 +4221,7 @@ msgstr ""
 
 #: ../java/strings/Strings.java:71
 msgid "Transport"
-msgstr ""
+msgstr "トランスポート"
 
 #: ../java/strings/Strings.java:73
 msgid "udp"
@@ -4437,7 +4437,7 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:410
 msgid "Bandwidth limiter"
-msgstr ""
+msgstr "帯域幅リミッター"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:412
 msgid ""
@@ -4518,7 +4518,7 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:448
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:502
 msgid "Cancel"
-msgstr ""
+msgstr "キャンセル"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:145
 msgid "config advanced"
@@ -4563,7 +4563,7 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461
 msgid "To change other client options, edit the file"
-msgstr ""
+msgstr "その他のクライアントオプションを変更するために、ファイルを編集"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:468
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:542
@@ -4637,7 +4637,7 @@ msgid ""
 "(e.g. i2psnark),front-ends to another client or application which must be "
 "separately enabled (e.g. susidns, i2ptunnel), or have no web interface at "
 "all (e.g. addressbook)."
-msgstr ""
+msgstr "いかにリストされている Java のウェブアプリケーション はウェブコンソールにより起動され、ルーターと同じ JVM で起動されています。これらは、通常ルーターコンソールを通じてアクセス可能なウェブアプリケーションです。これらは、完全なアプリケーション (例: i2psnark)や、別に有効化しなければならない別のクライアントまたはアプリケーションへのフロントエンド (例: susidns, i2ptunnel)、まったくウェブインターフェースのないもの(例:アドレスブック)である場合があります。"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:554
 msgid ""
@@ -4645,7 +4645,7 @@ msgid ""
 "directory; however the .war file and web app will reappear when you update "
 "your router to a newer version, so disabling the web app here is the "
 "preferred method."
-msgstr ""
+msgstr "webapps ディレクトリから .war ファイルを削除すると、ウェブアプリも無効化される場合があります。しかし、 .war ファイルとウェブアプリはルーターを新しいバージョンに更新したときにまた現れるので、ここでウェブアプリを無効にすることは、推奨の方法です。"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:568
 msgid "Plugin Configuration"
@@ -4792,15 +4792,15 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:147
 msgid "config networking"
-msgstr ""
+msgstr "ネットワークを設定"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:351
 msgid "I2P Network Configuration"
-msgstr ""
+msgstr "I2P ネットワーク設定"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:450
 msgid "IP and Transport Configuration"
-msgstr ""
+msgstr "IP とトランスポート設定"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:454
 msgid "There is help below."
@@ -5273,7 +5273,7 @@ msgstr ""
 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 ""
+msgstr "他のプログラムが設定したポートを使用しているか確認してください。そうであれば、そのプログラムを停止するか、 I2P が違うポートを使用するように設定してください。"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:750
 msgid ""
@@ -5315,11 +5315,11 @@ msgstr ""
 msgid ""
 "Do you have another I2P instance running? Stop the conflicting program and "
 "restart I2P."
-msgstr ""
+msgstr "別の I2P のインスタンスを実行していませんか?競合しているプログラムを停止し、 I2P を再起動してください。"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:147
 msgid "config peers"
-msgstr ""
+msgstr "ピアを設定"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:338
 msgid "I2P Peer Configuration"
@@ -5360,7 +5360,7 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:498
 msgid "Banned Peers"
-msgstr ""
+msgstr "禁止されているピア"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:519
 msgid "Banned IPs"
@@ -5850,7 +5850,7 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:328
 msgid "I2P Addressbook"
-msgstr ""
+msgstr "I2P アドレスブック"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:330
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:331
@@ -5916,7 +5916,7 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:201
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:338
 msgid "I2P Version and Running Environment"
-msgstr ""
+msgstr "I2P のバージョンと起動環境"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:250
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:397
@@ -5994,7 +5994,7 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:336
 msgid "I2P Router Logs"
-msgstr ""
+msgstr "I2P ルーターログ"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:399
 msgid "Critical Logs"
@@ -6010,11 +6010,11 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:143
 msgid "network database"
-msgstr ""
+msgstr "ネットワークデータベース"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:310
 msgid "I2P Network Database"
-msgstr ""
+msgstr "I2P ネットワークデータベース"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:149
 msgid "WebApp Not Found"
@@ -6040,7 +6040,7 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:310
 msgid "I2P Network Peers"
-msgstr ""
+msgstr "I2P ネットワーク ピア"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:143
 msgid "peer profiles"
@@ -6060,7 +6060,7 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:323
 msgid "I2P Router Statistics"
-msgstr ""
+msgstr "I2P ルーター統計"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:308
 #, java-format
diff --git a/apps/routerconsole/locale/messages_pt.po b/apps/routerconsole/locale/messages_pt.po
index 938a0d4e11a546651ed0123c76638f77bfe99fb9..07140d3e27f80fe871a7e5cbd700f2ca3d3b297c 100644
--- a/apps/routerconsole/locale/messages_pt.po
+++ b/apps/routerconsole/locale/messages_pt.po
@@ -24,7 +24,7 @@ msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-01-09 19:27+0000\n"
-"PO-Revision-Date: 2014-01-18 22:20+0000\n"
+"PO-Revision-Date: 2014-01-22 15:14+0000\n"
 "Last-Translator: kgtm <fabio.h.f.antunes@gmail.com>\n"
 "Language-Team: Portuguese (http://www.transifex.com/projects/p/I2P/language/pt/)\n"
 "MIME-Version: 1.0\n"
@@ -3111,31 +3111,31 @@ msgstr "NTCP e SSU com intermediadores"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:448
 msgid "IPv6 Only SSU, introducers"
-msgstr ""
+msgstr "Apenas IPv6 com introdutores SSU"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:448
 msgid "IPv6 SSU"
-msgstr ""
+msgstr "SSU IPv6"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:448
 msgid "IPv6 SSU, introducers"
-msgstr ""
+msgstr "SSU introdutores com IPv6"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:449
 msgid "IPv6 NTCP"
-msgstr ""
+msgstr "NTCP IPv6"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:449
 msgid "IPv6 NTCP, SSU"
-msgstr ""
+msgstr "NTCP e SSU com IPv6"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:449
 msgid "IPv6 NTCP, SSU, introducers"
-msgstr ""
+msgstr "NTCP e SSU introdutores com IPv6"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:449
 msgid "IPv6 Only NTCP, SSU, introducers"
-msgstr ""
+msgstr "Apenas NTCP e SSU introdutores com IPv6"
 
 #: ../java/src/net/i2p/router/web/NewsHelper.java:252
 #, java-format
diff --git a/apps/routerconsole/locale/messages_pt_BR.po b/apps/routerconsole/locale/messages_pt_BR.po
index 7b0af39a35853cb04d6d4faaa9c21b09fcacad53..59ba4650a8b8cd4d7b37fa11019305249d09770b 100644
--- a/apps/routerconsole/locale/messages_pt_BR.po
+++ b/apps/routerconsole/locale/messages_pt_BR.po
@@ -2,31 +2,33 @@
 # Copyright (C) 2009 The I2P Project
 # This file is distributed under the same license as the routerconsole package.
 # To contribute translations, see http://www.i2p2.de/newdevelopers
-#
+# 
 # Translators:
 # blueboy, 2013
-# blueboy, 2013
+# blueboy, 2013-2014
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-01-09 18:16+0000\n"
-"PO-Revision-Date: 2013-11-25 21:53+0000\n"
+"POT-Creation-Date: 2014-01-09 19:27+0000\n"
+"PO-Revision-Date: 2014-01-31 17:09+0000\n"
 "Last-Translator: blueboy\n"
-"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/"
-"language/pt_BR/)\n"
-"Language: pt_BR\n"
+"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: pt_BR\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\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
+#. 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
 #. a lot of tables.
 #. milliseconds
 #. Note to translators, may be negative or zero, 2999 maximum.
-#. {0,number,####} prevents 1234 from being output as 1,234 in the English locale.
+#. {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:1484
@@ -119,7 +121,8 @@ msgstr ""
 
 #. NPE, too early
 #. if (_context.router().getRouterInfo().getBandwidthTier().equals("K"))
-#. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low");
+#. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too
+#. low");
 #. else
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:75
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:120
@@ -132,7 +135,8 @@ msgid "Rejecting tunnels: High message delay"
 msgstr "Rejeitando túneis: mensagens com tempo de retardo alto"
 
 #. hard to do {0} from here
-#. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of tunnels: High number of requests");
+#. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of
+#. tunnels: High number of requests");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:196
 msgid "Rejecting most tunnels: High number of requests"
 msgstr "Rejeitando a maioria dos túneis: Muitos pedidos"
@@ -149,13 +153,15 @@ msgid "Rejecting tunnels: Bandwidth limit"
 msgstr "Rejeitando túneis: limitação na largura de banda"
 
 #. hard to do {0} from here
-#. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels: Bandwidth limit");
+#. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels:
+#. Bandwidth limit");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:380
 msgid "Rejecting most tunnels: Bandwidth limit"
 msgstr "Rejeitando a maioria dos túneis: limitação na largura de banda"
 
 #. hard to do {0} from here
-#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of tunnels");
+#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of
+#. tunnels");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:384
 msgid "Accepting most tunnels"
 msgstr "Aceitando a maioria dos túneis"
@@ -208,7 +214,8 @@ msgid ""
 "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
 msgstr ""
 
-#. NOTE TO TRANSLATORS - each of these phrases is a description for a statistic
+#. NOTE TO TRANSLATORS - each of these phrases is a description for a
+#. statistic
 #. to be displayed on /stats.jsp and in the graphs on /graphs.jsp.
 #. Please keep relatively short so it will fit on the graphs.
 #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:33
@@ -239,7 +246,8 @@ msgstr ""
 msgid "NetDb entry"
 msgstr "Entrada do BD da rede"
 
-#. This used to be "no common transports" but it is almost always no transports at all
+#. This used to be "no common transports" but it is almost always no
+#. transports at all
 #: ../../../router/java/src/net/i2p/router/transport/GetBidsJob.java:73
 msgid "No transports (hidden or starting up?)"
 msgstr ""
@@ -273,10 +281,7 @@ msgstr ""
 msgid ""
 "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and "
 "i2np.udp.maxConnections=nnn on the advanced configuration page."
-msgstr ""
-"Para sobrescrever estes limites, adicione as espeficações i2np.ntcp."
-"maxConnections=nnn e i2np.udp.maxConnections=nnn na página de configurações "
-"avançadas."
+msgstr "Para sobrescrever estes limites, adicione as espeficações i2np.ntcp.maxConnections=nnn e i2np.udp.maxConnections=nnn na página de configurações avançadas."
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:586
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:274
@@ -292,7 +297,7 @@ msgstr "Definições"
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:86
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
 msgid "Peer"
-msgstr "Nós"
+msgstr "Nodos"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:587
 msgid "The remote peer, identified by router hash"
@@ -317,7 +322,8 @@ msgid "They offered to introduce us (help other peers traverse our firewall)"
 msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:595
-msgid "We offered to introduce them (help other peers traverse their firewall)"
+msgid ""
+"We offered to introduce them (help other peers traverse their firewall)"
 msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:596
@@ -388,7 +394,9 @@ msgstr ""
 msgid "The round trip time in milliseconds"
 msgstr ""
 
-#. "<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" +
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:607
 msgid "The retransmit timeout in milliseconds"
 msgstr ""
@@ -541,7 +549,8 @@ msgid "UPnP reports the maximum upstream bit rate is {0}bits/sec"
 msgstr ""
 
 #. {0} is TCP or UDP
-#. {1,number,#####} prevents 12345 from being output as 12,345 in the English locale.
+#. {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:651
 #, java-format
@@ -743,7 +752,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:760
 #, java-format
 msgid "New plugin version {0} is available"
-msgstr ""
+msgstr "Um nova versão da extensão {0} está disponível"
 
 #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:838
 #, java-format
@@ -753,7 +762,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:840
 #, java-format
 msgid "No new version is available for plugin {0}"
-msgstr ""
+msgstr "Não há nenhuma nova versão da extensão {0} disponível"
 
 #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:863
 #, java-format
@@ -858,7 +867,7 @@ msgstr "Extensão baixada"
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:363
 #, java-format
 msgid "Cannot create plugin directory {0}"
-msgstr ""
+msgstr "Não é possível criar o diretório da extensão {0}"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:146
 #, java-format
@@ -870,7 +879,8 @@ msgstr "A extensão de {0} está corrompida"
 msgid "Plugin from {0} does not contain the required configuration file"
 msgstr "A extensão de {0} não contém o arquivo de configuração necessário"
 
-#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
+#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' '
+#. + signer + "</b>");
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:170
 #, java-format
 msgid "Plugin from {0} contains an invalid key"
@@ -896,7 +906,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:249
 #, java-format
 msgid "This plugin requires I2P version {0} or higher"
-msgstr ""
+msgstr "Esta extensão requer a versão {0} ou mais recente do roteador I2P"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:257
 #, java-format
@@ -994,7 +1004,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/update/UpdateRunner.java:265
 #, java-format
 msgid "No new version found at {0}"
-msgstr ""
+msgstr "Nenhuma nova versão de {0} foi encontrada"
 
 #: ../java/src/net/i2p/router/web/BanlistRenderer.java:64
 #, java-format
@@ -1126,7 +1136,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:40
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:478
 msgid "Save Client Configuration"
-msgstr "Salvar configuração de cliente"
+msgstr "Salvar configuração do cliente"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:44
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:544
@@ -1519,8 +1529,8 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:49
 msgid ""
-"Or put entries in the logger.config file. Example: logger.record.net.i2p."
-"router.tunnel=WARN"
+"Or put entries in the logger.config file. Example: "
+"logger.record.net.i2p.router.tunnel=WARN"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:50
@@ -1563,7 +1573,7 @@ msgstr "Remover"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:125
 msgid "Select a class to add"
-msgstr "Selecione a classe para adicionar"
+msgstr "Selecione uma classe para adicionar"
 
 #. stat groups for stats.jsp
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
@@ -2124,7 +2134,8 @@ msgstr ""
 msgid "Saved order of sections."
 msgstr ""
 
-#. the count isn't really correct anyway, since we don't check for actual changes
+#. 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
 msgid "Updated settings for all pools."
@@ -2222,7 +2233,7 @@ msgstr "Alteração do tema salva."
 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:61
 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:66
 msgid "Refresh the page to view."
-msgstr ""
+msgstr "Para visualizar, recarregue a página."
 
 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:64
 msgid "Mobile console option saved."
@@ -2434,11 +2445,11 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:120
 msgid "Every"
-msgstr ""
+msgstr "Sempre"
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:138
 msgid "Notify only"
-msgstr ""
+msgstr "Informar apenas"
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:145
 msgid "Download and verify only"
@@ -2469,7 +2480,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/GraphHelper.java:232
 #, java-format
 msgid "{0} for {1}"
-msgstr ""
+msgstr "{0} para {1}"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:219
 #: ../java/src/net/i2p/router/web/StatSummarizer.java:304
@@ -2567,7 +2578,7 @@ msgstr "altura"
 #: ../java/src/net/i2p/router/web/GraphHelper.java:360
 #: ../java/src/net/i2p/router/web/GraphHelper.java:361
 msgid "pixels"
-msgstr ""
+msgstr "pixels"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:362
 msgid "Refresh delay"
@@ -2664,7 +2675,8 @@ msgstr ""
 msgid "Bug tracker"
 msgstr ""
 
-#. "colombo-bt.i2p" + S + _x("The Italian Bittorrent Resource") + S + "http://colombo-bt.i2p/" + S + I + "colomboicon.png" + S +
+#. "colombo-bt.i2p" + S + _x("The Italian Bittorrent Resource") + S + "http
+#. ://colombo-bt.i2p/" + S + I + "colomboicon.png" + S +
 #: ../java/src/net/i2p/router/web/HomeHelper.java:41
 msgid "Dev Forum"
 msgstr ""
@@ -2733,7 +2745,8 @@ msgstr ""
 msgid "Simple and fast microblogging website"
 msgstr ""
 
-#. _x("Key Server") + S + _x("OpenPGP Keyserver") + S + "http://keys.i2p/" + S + I + "education.png" + S +
+#. _x("Key Server") + S + _x("OpenPGP Keyserver") + S + "http://keys.i2p/" + S
+#. + I + "education.png" + S +
 #: ../java/src/net/i2p/router/web/HomeHelper.java:51
 msgid "Debian and Tahoe-LAFS repositories"
 msgstr ""
@@ -2963,7 +2976,7 @@ msgstr "Local"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:139
 msgid "Unpublished"
-msgstr ""
+msgstr "Não publicado"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:140
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:147
@@ -3049,7 +3062,7 @@ msgstr "{0} atrás"
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:406
 msgid "Published"
-msgstr ""
+msgstr "Publicado"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:408
 msgid "Address(es)"
@@ -3401,12 +3414,14 @@ msgstr ""
 msgid "Highest events per period"
 msgstr ""
 
-#. if (showAll && (curFreq.getMaxAverageEventsPerPeriod() > 0) && (curFreq.getAverageEventsPerPeriod() > 0) ) {
+#. if (showAll && (curFreq.getMaxAverageEventsPerPeriod() > 0) &&
+#. (curFreq.getAverageEventsPerPeriod() > 0) ) {
 #. buf.append("(current is ");
 #. buf.append(pct(curFreq.getAverageEventsPerPeriod()/curFreq.getMaxAverageEventsPerPeriod()));
 #. buf.append(" of max)");
 #. }
-#. buf.append(" <i>avg interval between updates:</i> (").append(num(curFreq.getAverageInterval())).append("ms, min ");
+#. buf.append(" <i>avg interval between updates:</i>
+#. (").append(num(curFreq.getAverageInterval())).append("ms, min ");
 #. buf.append(num(curFreq.getMinAverageInterval())).append("ms)");
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:135
 msgid "Lifetime average events per period"
@@ -3484,7 +3499,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:144
 msgid "Help &amp; FAQ"
-msgstr "Ajuda &amp; FAQ"
+msgstr "Ajuda &amp; Perguntas Frequentes"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:152
 msgid ""
@@ -3580,11 +3595,11 @@ msgstr "Identidade local"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282
 msgid "Your unique I2P router identity is"
-msgstr ""
+msgstr "O identificador, único, do seu roteador I2P é"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:286
 msgid "never reveal it to anyone"
-msgstr ""
+msgstr "nunca revele-o para alguém"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288
 msgid "show"
@@ -3672,7 +3687,8 @@ msgstr "Usados"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:498
 msgid ""
-"Used for building and testing tunnels, and communicating with floodfill peers"
+"Used for building and testing tunnels, and communicating with floodfill "
+"peers"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:501
@@ -3887,7 +3903,8 @@ 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>
+#. If the translation is shorter than the English, you should probably not
+#. include <br>
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:721
 #, java-format
 msgid "Download Unsigned<br>Update {0}"
@@ -4128,7 +4145,7 @@ msgstr ""
 
 #: ../java/strings/Strings.java:37
 msgid "IRC proxy"
-msgstr ""
+msgstr "Proxy IRC"
 
 #: ../java/strings/Strings.java:38
 msgid "eepsite"
@@ -4140,16 +4157,16 @@ msgstr ""
 
 #: ../java/strings/Strings.java:40
 msgid "HTTP Proxy"
-msgstr ""
+msgstr "Proxy HTTP"
 
 #. older names for pre-0.7.4 installs
 #: ../java/strings/Strings.java:42
 msgid "eepProxy"
-msgstr ""
+msgstr "eepProxy"
 
 #: ../java/strings/Strings.java:43
 msgid "ircProxy"
-msgstr ""
+msgstr "proxyIrc"
 
 #. hardcoded in i2psnark
 #: ../java/strings/Strings.java:45
@@ -4341,7 +4358,8 @@ msgstr ""
 msgid "Router is down"
 msgstr ""
 
-#. We have intl defined when this is included, but not when compiled standalone.
+#. 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:299
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:299
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325
@@ -4540,11 +4558,11 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:354
 msgid "I2P Client Configuration"
-msgstr ""
+msgstr "Configuração do cliente I2P"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:451
 msgid "Client Configuration"
-msgstr ""
+msgstr "Configuração do cliente"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:453
 msgid ""
@@ -4554,8 +4572,8 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455
 msgid ""
-"Be careful changing any settings here. The 'router console' and 'application "
-"tunnels' are required for most uses of I2P. Only advanced users should "
+"Be careful changing any settings here. The 'router console' and 'application"
+" tunnels' are required for most uses of I2P. Only advanced users should "
 "change these."
 msgstr ""
 
@@ -4603,7 +4621,7 @@ msgstr "Autorização"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:530
 msgid "Require username and password"
-msgstr ""
+msgstr "Necessário nome de usuário e senha"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:532
 msgid "Username"
@@ -4631,8 +4649,8 @@ msgstr ""
 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 "
-"accessible through the router console. They may be complete applications (e."
-"g. i2psnark),front-ends to another client or application which must be "
+"accessible through the router console. They may be complete applications "
+"(e.g. i2psnark),front-ends to another client or application which must be "
 "separately enabled (e.g. susidns, i2ptunnel), or have no web interface at "
 "all (e.g. addressbook)."
 msgstr ""
@@ -4682,7 +4700,7 @@ msgid "Recommended Eepsites"
 msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:496
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:407
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:409
 msgid "Local Services"
 msgstr ""
 
@@ -4818,7 +4836,7 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:464
 msgid "IP Configuration"
-msgstr ""
+msgstr "Configuração de IP"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:466
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:552
@@ -4852,7 +4870,7 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:492
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:570
 msgid "Specify hostname or IP"
-msgstr ""
+msgstr "Especificar o hostname ou IP"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:496
 msgid "Action when IP changes"
@@ -4921,7 +4939,7 @@ msgstr "Usar endereço de IP automaticamente detectado"
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:558
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:590
 msgid "currently"
-msgstr ""
+msgstr "atualmente"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:562
 msgid "if we are not firewalled"
@@ -4970,14 +4988,14 @@ msgstr "Ajuda de configuração"
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:660
 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."
+"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:613
 msgid ""
-"If you can, please poke a hole in your firewall to allow unsolicited UDP and "
-"TCP packets to reach you."
+"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:615
@@ -4988,8 +5006,9 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:617
 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."
+"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:619
@@ -5050,7 +5069,8 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:652
 msgid ""
-"Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
+"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:654
@@ -5149,8 +5169,8 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:700
 msgid ""
-"You have configured I2P to share more than 128KBps of bandwidth, but you are "
-"firewalled."
+"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:702
@@ -5186,8 +5206,8 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:714
 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."
+"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:716
@@ -5297,7 +5317,7 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:760
 msgid "Please configure a TCP host and port above or enable UDP."
-msgstr ""
+msgstr "Por favor, configure um host e uma porta para o TCP acima ou habilite o UDP."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:762
 msgid "ERR - Client Manager I2CP Error - check logs"
@@ -5344,8 +5364,8 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:478
 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 "
+"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 "
 "Capacity peers are used for some exploratory tunnels. Current bonuses are "
 "displayed on the"
 msgstr ""
@@ -5483,19 +5503,20 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:439
 msgid ""
-"Graceful shutdown lets the router satisfy the agreements it has already made "
-"before shutting down, but may take a few minutes."
+"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:441
 msgid ""
-"If you need to kill the router immediately, that option is available as well."
+"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:451
 msgid ""
-"If you want the router to restart itself after shutting down, you can choose "
-"one of the following."
+"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:453
@@ -5513,8 +5534,8 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:457
 msgid ""
-"After tearing down the router, it will wait 1 minute before starting back up "
-"again."
+"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:467
@@ -5534,7 +5555,8 @@ msgid ""
 msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:473
-msgid "If you are on windows, you can either enable or disable that icon here."
+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:475
@@ -5551,8 +5573,8 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:481
 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."
+"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:483
@@ -5566,8 +5588,8 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:493
 msgid ""
-"If you are running I2P as service right now, removing it will shut down your "
-"router immediately."
+"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:495
@@ -5586,9 +5608,9 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:505
 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>."
+"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:517
@@ -5686,8 +5708,8 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:456
 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."
+"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:459
@@ -5837,8 +5859,8 @@ msgstr ""
 msgid "home"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:394
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:396
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:377
 msgid "Welcome to I2P"
 msgstr ""
 
@@ -5889,8 +5911,8 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:175
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:346
 msgid ""
-"You may use the username \"guest\" and password \"guest\" if you do not wish "
-"to register."
+"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:177
@@ -5916,7 +5938,8 @@ msgstr ""
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:397
 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."
+"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:155
@@ -5953,11 +5976,11 @@ msgid ""
 "change it later."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:383
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:385
 msgid "Search I2P"
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:403
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:405
 msgid "Eepsites of Interest"
 msgstr ""
 
@@ -6023,8 +6046,8 @@ msgstr ""
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:344
 msgid ""
-"Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</"
-"a> to start it."
+"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:143
diff --git a/apps/routerconsole/locale/messages_ru.po b/apps/routerconsole/locale/messages_ru.po
index b3fe6bc58c70adf6fd18246cf25c4c3f4e0b7367..95edc11686dcb16050cf2e48307b692055b62f9c 100644
--- a/apps/routerconsole/locale/messages_ru.po
+++ b/apps/routerconsole/locale/messages_ru.po
@@ -2,7 +2,7 @@
 # Copyright (C) 2009 The I2P Project
 # This file is distributed under the same license as the routerconsole package.
 # To contribute translations, see http://www.i2p2.de/newdevelopers
-#
+# 
 # Translators:
 # IOException <opexob@yandex.ru>, 2013
 # Alexey Solomin <a.rainman@gmail.com>, 2013
@@ -13,30 +13,32 @@
 # foo <foo@bar>, 2009
 # gmind, 2013
 # gmind, 2012
+# rineri, 2014
 # Роман Азаренко <transifex@basicxp.ru>, 2013
 # Роман Азаренко <transifex@basicxp.ru>, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-01-09 19:10+0000\n"
-"PO-Revision-Date: 2013-11-20 13:15+0000\n"
-"Last-Translator: IOException <opexob@yandex.ru>\n"
-"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/I2P/"
-"language/ru_RU/)\n"
-"Language: ru_RU\n"
+"POT-Creation-Date: 2014-01-09 19:27+0000\n"
+"PO-Revision-Date: 2014-02-03 20:31+0000\n"
+"Last-Translator: rineri\n"
+"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/I2P/language/ru_RU/)\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%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Language: ru_RU\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 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
+#. 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
 #. a lot of tables.
 #. milliseconds
 #. Note to translators, may be negative or zero, 2999 maximum.
-#. {0,number,####} prevents 1234 from being output as 1,234 in the English locale.
+#. {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:1484
@@ -134,7 +136,8 @@ msgstr "нет"
 
 #. NPE, too early
 #. if (_context.router().getRouterInfo().getBandwidthTier().equals("K"))
-#. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low");
+#. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too
+#. low");
 #. else
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:75
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:120
@@ -147,7 +150,8 @@ msgid "Rejecting tunnels: High message delay"
 msgstr "Не принимаем туннели: высокая задержка сообщений"
 
 #. hard to do {0} from here
-#. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of tunnels: High number of requests");
+#. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of
+#. tunnels: High number of requests");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:196
 msgid "Rejecting most tunnels: High number of requests"
 msgstr "Не принимаем туннели: высокое число запросов"
@@ -164,13 +168,15 @@ msgid "Rejecting tunnels: Bandwidth limit"
 msgstr "Не принимаем туннели: достигнут предел пропускной способности"
 
 #. hard to do {0} from here
-#. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels: Bandwidth limit");
+#. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels:
+#. Bandwidth limit");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:380
 msgid "Rejecting most tunnels: Bandwidth limit"
 msgstr "Не принимаем туннели: достигнут предел пропускной способности"
 
 #. hard to do {0} from here
-#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of tunnels");
+#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of
+#. tunnels");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:384
 msgid "Accepting most tunnels"
 msgstr "Принимаем большинство туннелей"
@@ -197,12 +203,9 @@ msgstr "Начальная загрузка"
 #, java-format
 msgid "Reseed fetched only 1 router."
 msgid_plural "Reseed fetched only {0} routers."
-msgstr[0] ""
-"При начальной загрузке получены данные только об {0} маршрутизаторе."
-msgstr[1] ""
-"При начальной загрузке получены данные только о {0} маршрутизаторах."
-msgstr[2] ""
-"При начальной загрузке получены данные только о {0} маршрутизаторах."
+msgstr[0] "При начальной загрузке получены данные только об {0} маршрутизаторе."
+msgstr[1] "При начальной загрузке получены данные только о {0} маршрутизаторах."
+msgstr[2] "При начальной загрузке получены данные только о {0} маршрутизаторах."
 
 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:177
 msgid "Reseed failed."
@@ -219,18 +222,16 @@ msgstr "страница настройки начальной загрузки"
 
 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:325
 msgid "Reseeding: fetching seed URL."
-msgstr ""
-"Производится начальная загрузка: загружается URL каталога маршрутизаторов."
+msgstr "Производится начальная загрузка: загружается URL каталога маршрутизаторов."
 
 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:383
 #, java-format
 msgid ""
 "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
-msgstr ""
-"Производится начальная загрузка: получение информации о маршрутизаторах "
-"(удачно: {0}, ошибок: {1})."
+msgstr "Производится начальная загрузка: получение информации о маршрутизаторах (удачно: {0}, ошибок: {1})."
 
-#. NOTE TO TRANSLATORS - each of these phrases is a description for a statistic
+#. NOTE TO TRANSLATORS - each of these phrases is a description for a
+#. statistic
 #. to be displayed on /stats.jsp and in the graphs on /graphs.jsp.
 #. Please keep relatively short so it will fit on the graphs.
 #: ../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java:33
@@ -261,7 +262,8 @@ msgstr "Известные быстрые узлы"
 msgid "NetDb entry"
 msgstr "Запись сетевой БД"
 
-#. This used to be "no common transports" but it is almost always no transports at all
+#. This used to be "no common transports" but it is almost always no
+#. transports at all
 #: ../../../router/java/src/net/i2p/router/transport/GetBidsJob.java:73
 msgid "No transports (hidden or starting up?)"
 msgstr "Нет транспортных протоколов (в скрытом режиме или запущен недавно?)"
@@ -289,18 +291,13 @@ msgstr "Справка"
 msgid ""
 "Your transport connection limits are automatically set based on your "
 "configured bandwidth."
-msgstr ""
-"Пределы транспортных соединений назначены автоматически на основе заданной "
-"вами пропускной способности."
+msgstr "Пределы транспортных соединений назначены автоматически на основе заданной вами пропускной способности."
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:584
 msgid ""
 "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and "
 "i2np.udp.maxConnections=nnn on the advanced configuration page."
-msgstr ""
-"Для переопределения этих пределов добавьте параметры i2np.ntcp."
-"maxConnections=nnn и i2np.udp.maxConnections=nnn на странице расширенных "
-"настроек."
+msgstr "Для переопределения этих пределов добавьте параметры i2np.ntcp.maxConnections=nnn и i2np.udp.maxConnections=nnn на странице расширенных настроек."
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:586
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:274
@@ -338,15 +335,12 @@ msgstr "Исходящее соединение"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:593
 msgid "They offered to introduce us (help other peers traverse our firewall)"
-msgstr ""
-"Этот узел предлагает себя в качестве нашего посредника (для того, чтобы "
-"другие узлы могли соединяться с нами в обход нашего брандмауэра)"
+msgstr "Этот узел предлагает себя в качестве нашего посредника (для того, чтобы другие узлы могли соединяться с нами в обход нашего брандмауэра)"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:595
-msgid "We offered to introduce them (help other peers traverse their firewall)"
-msgstr ""
-"Мы предлагаем себя в качестве посредника для этого узла (чтобы другие узлы "
-"могли соединяться с ним в обход его брандмауэра)"
+msgid ""
+"We offered to introduce them (help other peers traverse their firewall)"
+msgstr "Мы предлагаем себя в качестве посредника для этого узла (чтобы другие узлы могли соединяться с ним в обход его брандмауэра)"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:596
 msgid "How long since a packet has been received / sent"
@@ -394,9 +388,7 @@ msgstr "Разница хода часов между узлом и нами"
 msgid ""
 "The congestion window, which is how many bytes can be sent without an "
 "acknowledgement"
-msgstr ""
-"<i>Congestion Window</i>. Окно перегрузки — количество байт, которое мы "
-"можем послать без полученного подтверждения"
+msgstr "<i>Congestion Window</i>. Окно перегрузки — количество байт, которое мы можем послать без полученного подтверждения"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:601
 msgid "The number of sent messages awaiting acknowledgement"
@@ -416,24 +408,20 @@ msgstr "<i>Slow Start Threshold</i>. Порог медленного старт
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:605
 msgid "The round trip time in milliseconds"
-msgstr ""
-"<i>Round-Trip Time</i>. Время между отправкой запроса и получением ответа (в "
-"миллисекундах)"
+msgstr "<i>Round-Trip Time</i>. Время между отправкой запроса и получением ответа (в миллисекундах)"
 
-#. "<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" +
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:607
 msgid "The retransmit timeout in milliseconds"
-msgstr ""
-"<i>Retransmit Time-Out</i>. Время ожидания подтверждения перед повторной "
-"отправкой пакета (в миллисекундах)"
+msgstr "<i>Retransmit Time-Out</i>. Время ожидания подтверждения перед повторной отправкой пакета (в миллисекундах)"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:608
 msgid ""
 "Current maximum send packet size / estimated maximum receive packet size "
 "(bytes)"
-msgstr ""
-"<i>Maximum Transfer Unit</i>. Текущий максимальный размер исходящих/входящих "
-"пакетов (в байтах) "
+msgstr "<i>Maximum Transfer Unit</i>. Текущий максимальный размер исходящих/входящих пакетов (в байтах) "
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:609
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1128
@@ -551,9 +539,7 @@ msgstr "Отключить UPnP Устройства"
 msgid ""
 "UPnP has been disabled; Do you have more than one UPnP Internet Gateway "
 "Device on your LAN ?"
-msgstr ""
-"UPnP был отключен; есть ли у вас более одного шлюза с поддержкой UPnP в "
-"локальной сети?"
+msgstr "UPnP был отключен; есть ли у вас более одного шлюза с поддержкой UPnP в локальной сети?"
 
 #: ../../../router/java/src/net/i2p/router/transport/UPnP.java:627
 msgid "UPnP has not found any UPnP-aware, compatible device on your LAN."
@@ -579,7 +565,8 @@ msgid "UPnP reports the maximum upstream bit rate is {0}bits/sec"
 msgstr "UPnP сообщает максимальную скорость восходящего потока {0}бит/секунду"
 
 #. {0} is TCP or UDP
-#. {1,number,#####} prevents 12345 from being output as 12,345 in the English locale.
+#. {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:651
 #, java-format
@@ -777,8 +764,7 @@ msgstr "Игнорируем запросы туннелей: высокая н
 
 #: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:973
 msgid "Dropping tunnel requests: Queue time"
-msgstr ""
-"Игнорируем запросы туннелей: слишком большое время пребывания в очереди"
+msgstr "Игнорируем запросы туннелей: слишком большое время пребывания в очереди"
 
 #: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:760
 #, java-format
@@ -910,7 +896,8 @@ msgstr "Загруженный из {0} модуль поврежден"
 msgid "Plugin from {0} does not contain the required configuration file"
 msgstr "Загруженный из {0} модуль не содержит необходимый файл конфигурации"
 
-#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
+#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' '
+#. + signer + "</b>");
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:170
 #, java-format
 msgid "Plugin from {0} contains an invalid key"
@@ -947,9 +934,7 @@ msgstr "Для этого модуля требуется Java версии {0}
 msgid ""
 "Downloaded plugin is for new installs only, but the plugin is already "
 "installed"
-msgstr ""
-"Загруженный установщик модуля предназначен только для первоначальной "
-"установки, но такой модуль уже установлен"
+msgstr "Загруженный установщик модуля предназначен только для первоначальной установки, но такой модуль уже установлен"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:277
 msgid "Installed plugin does not contain the required configuration file"
@@ -962,8 +947,7 @@ msgstr "Подпись загруженного модуля не совпада
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:292
 #, java-format
 msgid "Downloaded plugin version {0} is not newer than installed plugin"
-msgstr ""
-"Версия загруженного модуля {0} не новее версии уже установленного модуля"
+msgstr "Версия загруженного модуля {0} не новее версии уже установленного модуля"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:299
 #, java-format
@@ -996,9 +980,7 @@ msgstr "Модуль будет установлен при следующем 
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:358
 msgid "Plugin is for upgrades only, but the plugin is not installed"
-msgstr ""
-"Загруженный установщик модуля предназначен только для обновления, но такой "
-"модуль еще не был установлен"
+msgstr "Загруженный установщик модуля предназначен только для обновления, но такой модуль еще не был установлен"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:371
 #, java-format
@@ -1019,9 +1001,7 @@ msgstr "Модуль {0} установлен и запущен"
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:400
 #, java-format
 msgid "Plugin {0} installed but failed to start, check logs"
-msgstr ""
-"Модуль {0} установлен, но при его запуске произошел сбой, смотрите журналы "
-"ошибок"
+msgstr "Модуль {0} установлен, но при его запуске произошел сбой, смотрите журналы ошибок"
 
 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:402
 #, java-format
@@ -1168,9 +1148,7 @@ msgstr "Конфигурация успешно сохранена"
 msgid ""
 "Error saving the configuration (applied but not saved) - please see the "
 "error logs"
-msgstr ""
-"Ошибка сохранения конфигурации (применена, но не сохранена) — смотрите "
-"журналы ошибок"
+msgstr "Ошибка сохранения конфигурации (применена, но не сохранена) — смотрите журналы ошибок"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:40
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:478
@@ -1564,17 +1542,13 @@ msgstr "Конфигурация журналирования сохранена
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:48
 msgid ""
 "Add additional logging statements above. Example: net.i2p.router.tunnel=WARN"
-msgstr ""
-"Добавьте выше дополнительные настройки уровней детализации журнала. Пример: "
-"net.i2p.router.tunnel=WARN"
+msgstr "Добавьте выше дополнительные настройки уровней детализации журнала. Пример: net.i2p.router.tunnel=WARN"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:49
 msgid ""
-"Or put entries in the logger.config file. Example: logger.record.net.i2p."
-"router.tunnel=WARN"
-msgstr ""
-"Либо добавьте эти записи в файл logger.config. Пример: logger.record.net.i2p."
-"router.tunnel=WARN"
+"Or put entries in the logger.config file. Example: "
+"logger.record.net.i2p.router.tunnel=WARN"
+msgstr "Либо добавьте эти записи в файл logger.config. Пример: logger.record.net.i2p.router.tunnel=WARN"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:50
 msgid "Valid levels are DEBUG, INFO, WARN, ERROR, CRIT"
@@ -1760,8 +1734,7 @@ msgstr "Отключение входящих TCP-соединений"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:258
 msgid "Updating inbound TCP address to auto"
-msgstr ""
-"Установка автоматического определения адреса для входящих TCP-соединений"
+msgstr "Установка автоматического определения адреса для входящих TCP-соединений"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:271
 #, java-format
@@ -1780,8 +1753,7 @@ msgstr "Неверный порт"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:282
 msgid "Updating inbound TCP port to auto"
-msgstr ""
-"Установка автоматического определения порта для входящих TCP-соединений"
+msgstr "Установка автоматического определения порта для входящих TCP-соединений"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:296
 #, java-format
@@ -2115,9 +2087,7 @@ msgstr "Полная статистика отключена"
 msgid ""
 "Graph list updated, may take up to 60s to be reflected on the {0}Graphs "
 "Page{1}"
-msgstr ""
-"Список графиков обновлен, может потребоваться до 60 секунд для отражения "
-"изменений на {1}Странице Графиков {0}"
+msgstr "Список графиков обновлен, может потребоваться до 60 секунд для отражения изменений на {0}Странице Графиков {1}"
 
 #: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:24
 msgid "Save order"
@@ -2182,7 +2152,8 @@ msgstr "Перемещено"
 msgid "Saved order of sections."
 msgstr "Сохранен порядок секций."
 
-#. the count isn't really correct anyway, since we don't check for actual changes
+#. 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
 msgid "Updated settings for all pools."
@@ -2199,9 +2170,7 @@ msgstr "Конфигурация зондирующих туннелей усп
 msgid ""
 "Error saving the configuration (applied but not saved) - please see the "
 "error logs."
-msgstr ""
-"Ошибка сохранения конфигурации (применена, но не сохранена) — смотрите "
-"журналы ошибок"
+msgstr "Ошибка сохранения конфигурации (применена, но не сохранена) — смотрите журналы ошибок"
 
 #. * dummies for translation
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14
@@ -2240,14 +2209,11 @@ msgstr "ОПАСНО ДЛЯ АНОНИМНОСТИ — Настройки зад
 
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:86
 msgid "PERFORMANCE WARNING - Settings include very long tunnels."
-msgstr ""
-"ОПАСНО ДЛЯ ПРОИЗВОДИТЕЛЬНОСТИ — Настройки задают слишком длинные туннели."
+msgstr "ОПАСНО ДЛЯ ПРОИЗВОДИТЕЛЬНОСТИ — Настройки задают слишком длинные туннели."
 
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:89
 msgid "PERFORMANCE WARNING - Settings include high tunnel quantities."
-msgstr ""
-"ОПАСНО ДЛЯ ПРОИЗВОДИТЕЛЬНОСТИ — Настройки задают слишком большие количества "
-"туннелей."
+msgstr "ОПАСНО ДЛЯ ПРОИЗВОДИТЕЛЬНОСТИ — Настройки задают слишком большие количества туннелей."
 
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:97
 msgid "Length"
@@ -2371,9 +2337,8 @@ msgid "Dutch"
 msgstr "Nederlands"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:89
-#, fuzzy
 msgid "Norwegian Bokmaal"
-msgstr "Norsk (bokmål)"
+msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:90
 msgid "Polish"
@@ -2385,7 +2350,6 @@ msgid "Portuguese"
 msgstr "Português"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:93
-#, fuzzy
 msgid "Romanian"
 msgstr "Румынский"
 
@@ -2519,17 +2483,13 @@ msgstr "Скачивать, проверять целостность и пер
 msgid ""
 "Invalid form submission, probably because you used the 'back' or 'reload' "
 "button on your browser. Please resubmit."
-msgstr ""
-"Неверные данные формы, скорее всего это произошло из-за того, что Вы "
-"нажимали кнопку \"Назад\" или \"Обновить\" в браузере. Пожалуйста, заполните "
-"форму заново."
+msgstr "Неверные данные формы, скорее всего это произошло из-за того, что Вы нажимали кнопку \"Назад\" или \"Обновить\" в браузере. Пожалуйста, заполните форму заново."
 
 #: ../java/src/net/i2p/router/web/FormHandler.java:205
 msgid ""
 "If the problem persists, verify that you have cookies enabled in your "
 "browser."
-msgstr ""
-"Если проблема сохраняется, проверьте, что у Вас разрешены cookies в браузере"
+msgstr "Если проблема сохраняется, проверьте, что у Вас разрешены cookies в браузере"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:158
 msgid "Combined bandwidth graph"
@@ -2664,9 +2624,7 @@ 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 ""
-"Управление файлами hosts (единственный механизм, используемый I2P для "
-"разрешения доменных имен)"
+msgstr "Управление файлами hosts (единственный механизм, используемый I2P для разрешения доменных имен)"
 
 #: ../java/src/net/i2p/router/web/HomeHelper.java:28
 msgid "Configure Bandwidth"
@@ -2737,7 +2695,8 @@ msgstr "Сообщения об ошибках"
 msgid "Bug tracker"
 msgstr "Багтрекер"
 
-#. "colombo-bt.i2p" + S + _x("The Italian Bittorrent Resource") + S + "http://colombo-bt.i2p/" + S + I + "colomboicon.png" + S +
+#. "colombo-bt.i2p" + S + _x("The Italian Bittorrent Resource") + S + "http
+#. ://colombo-bt.i2p/" + S + I + "colomboicon.png" + S +
 #: ../java/src/net/i2p/router/web/HomeHelper.java:41
 msgid "Dev Forum"
 msgstr "Форум разработчиков"
@@ -2779,9 +2738,7 @@ msgstr "Форум"
 msgid ""
 "A public anonymous Git hosting site - supports pulling via Git and HTTP and "
 "pushing via SSH"
-msgstr ""
-"Публичный анонимный Git-хостинг — поддерживает получение через Git и HTTP и "
-"публикацию через SSH"
+msgstr "Публичный анонимный Git-хостинг — поддерживает получение через Git и HTTP и публикацию через SSH"
 
 #: ../java/src/net/i2p/router/web/HomeHelper.java:46
 msgid "Anonymous Git Hosting"
@@ -2806,9 +2763,10 @@ msgstr "Техническая документация"
 
 #: ../java/src/net/i2p/router/web/HomeHelper.java:49
 msgid "Simple and fast microblogging website"
-msgstr ""
+msgstr "Простой и быстрый веб-сайт для микроблоггинга"
 
-#. _x("Key Server") + S + _x("OpenPGP Keyserver") + S + "http://keys.i2p/" + S + I + "education.png" + S +
+#. _x("Key Server") + S + _x("OpenPGP Keyserver") + S + "http://keys.i2p/" + S
+#. + I + "education.png" + S +
 #: ../java/src/net/i2p/router/web/HomeHelper.java:51
 msgid "Debian and Tahoe-LAFS repositories"
 msgstr "Репозитории Debian и Tahoe-LAFS"
@@ -2884,8 +2842,7 @@ msgstr "HTTP-прокси не запущен"
 #: ../java/src/net/i2p/router/web/HomeHelper.java:106
 #, java-format
 msgid "Your browser is not properly configured to use the HTTP proxy at {0}"
-msgstr ""
-"Ваш браузер не настроен должным образом для использования HTTP-прокси {0}"
+msgstr "Ваш браузер не настроен должным образом для использования HTTP-прокси {0}"
 
 #: ../java/src/net/i2p/router/web/HomeHelper.java:197
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:853
@@ -3310,9 +3267,7 @@ msgstr "Возможности"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
 msgid "Integ. Value"
-msgstr ""
-"Величина\n"
-"интеграции"
+msgstr "Величина\nинтеграции"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
 msgid "Last Heard About"
@@ -3384,9 +3339,7 @@ msgstr "хорошо интегрированные узлы"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:275
 msgid "as determined by the profile organizer"
-msgstr ""
-"определяется автоматически модулем ProfileOrganizer на основании собранной "
-"информации о производительности узла"
+msgstr "определяется автоматически модулем ProfileOrganizer на основании собранной информации о производительности узла"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:275
 msgid "groups"
@@ -3394,9 +3347,7 @@ msgstr "Входит в группы"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:276
 msgid "capabilities in the netDb, not used to determine profiles"
-msgstr ""
-"информация об узле, предоставленная сетевой БД; для профилирования не "
-"используется"
+msgstr "информация об узле, предоставленная сетевой БД; для профилирования не используется"
 
 #. capabilities
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:276
@@ -3420,8 +3371,7 @@ msgstr "емкость"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:278
 msgid "how many tunnels can we ask them to join in an hour?"
-msgstr ""
-"ко скольким туннелям мы можем попросить этот узел присоединиться за час?"
+msgstr "ко скольким туннелям мы можем попросить этот узел присоединиться за час?"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:279
 msgid "how many new peers have they told us about lately?"
@@ -3465,9 +3415,7 @@ msgstr "Статистика собрана за время с последне
 msgid ""
 "The data gathered is quantized over a 1 minute period, so should just be "
 "used as an estimate."
-msgstr ""
-"Собираемые данные округляются за 1-минутные промежутки, поэтому используйте "
-"эту информацию только для приблизительной оценки."
+msgstr "Собираемые данные округляются за 1-минутные промежутки, поэтому используйте эту информацию только для приблизительной оценки."
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:64
 msgid "These statistics are primarily used for development and debugging."
@@ -3490,12 +3438,14 @@ msgstr "Скользящее среднее количество событий
 msgid "Highest events per period"
 msgstr "Максимальное количество событий за период"
 
-#. if (showAll && (curFreq.getMaxAverageEventsPerPeriod() > 0) && (curFreq.getAverageEventsPerPeriod() > 0) ) {
+#. if (showAll && (curFreq.getMaxAverageEventsPerPeriod() > 0) &&
+#. (curFreq.getAverageEventsPerPeriod() > 0) ) {
 #. buf.append("(current is ");
 #. buf.append(pct(curFreq.getAverageEventsPerPeriod()/curFreq.getMaxAverageEventsPerPeriod()));
 #. buf.append(" of max)");
 #. }
-#. buf.append(" <i>avg interval between updates:</i> (").append(num(curFreq.getAverageInterval())).append("ms, min ");
+#. buf.append(" <i>avg interval between updates:</i>
+#. (").append(num(curFreq.getAverageInterval())).append("ms, min ");
 #. buf.append(num(curFreq.getMinAverageInterval())).append("ms)");
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:135
 msgid "Lifetime average events per period"
@@ -3581,9 +3531,7 @@ msgstr "Справка и FAQ"
 msgid ""
 "Configure startup of clients and webapps (services); manually start dormant "
 "services"
-msgstr ""
-"Настройка автозапуска клиентов и веб-приложений (служб), ручной запуск "
-"неактивных приложений"
+msgstr "Настройка автозапуска клиентов и веб-приложений (служб), ручной запуск неактивных приложений"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:154
 msgid "I2P Services"
@@ -3661,9 +3609,7 @@ msgstr "Общая информация"
 msgid ""
 "Your Local Identity is your unique I2P router identity, similar to an ip "
 "address but tailored to I2P. "
-msgstr ""
-"Ваш локальный идентификатор — это уникальный идентификатор Вашего I2P-"
-"маршрутизатора, как IP-адрес, но применительно к I2P."
+msgstr "Ваш локальный идентификатор — это уникальный идентификатор Вашего I2P-маршрутизатора, как IP-адрес, но применительно к I2P."
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276
 msgid "Never disclose this to anyone, as it can reveal your real world ip."
@@ -3703,9 +3649,7 @@ msgstr "Время работы"
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:343
 msgid ""
 "Help with configuring your firewall and router for optimal I2P performance"
-msgstr ""
-"Помощь в настройке брандмауэра и маршрутизатора для обеспечения оптимальной "
-"производительности I2P"
+msgstr "Помощь в настройке брандмауэра и маршрутизатора для обеспечения оптимальной производительности I2P"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:358
 msgid "Configure I2P Updates"
@@ -3769,10 +3713,9 @@ msgstr "Объем"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:498
 msgid ""
-"Used for building and testing tunnels, and communicating with floodfill peers"
-msgstr ""
-"Используются для создания и тестирования туннелей и соединения с floodfill-"
-"узлами"
+"Used for building and testing tunnels, and communicating with floodfill "
+"peers"
+msgstr "Используются для создания и тестирования туннелей и соединения с floodfill-узлами"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:501
 msgid "Exploratory"
@@ -3786,9 +3729,7 @@ msgstr "Туннели, используемые для доступа к слу
 msgid ""
 "Tunnels we are participating in, directly contributing bandwith to the "
 "network"
-msgstr ""
-"Туннели, в которых мы принимаем участие, непосредственно способствующие "
-"пропускной способнсти сети"
+msgstr "Туннели, в которых мы принимаем участие, непосредственно способствующие пропускной способнсти сети"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:519
 msgid "Participating"
@@ -3798,10 +3739,7 @@ msgstr "Транзитные"
 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 ""
-"Доля транзита отображает соотношение предоставляемой нами пропускной "
-"способности для транзитных туннелей по отношению к потребляемой нами "
-"скорости. Соотношение 1.00 означает положительный вклад в сеть"
+msgstr "Доля транзита отображает соотношение предоставляемой нами пропускной способности для транзитных туннелей по отношению к потребляемой нами скорости. Соотношение 1.00 означает положительный вклад в сеть"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:528
 msgid "Share ratio"
@@ -3825,9 +3763,7 @@ msgstr "Задержка задач"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:557
 msgid "Indicates how quickly outbound messages to other I2P routers are sent"
-msgstr ""
-"Показывает, как быстро исходящие сообщения отправляются другим I2P-"
-"маршрутизаторам"
+msgstr "Показывает, как быстро исходящие сообщения отправляются другим I2P-маршрутизаторам"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:560
 msgid "Message delay"
@@ -3843,8 +3779,7 @@ msgstr "Задержка туннелей"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:577
 msgid "Queued requests from other routers to participate in tunnels"
-msgstr ""
-"Очередь запросов от других маршрутизаторов, принимающих участие в туннелях"
+msgstr "Очередь запросов от других маршрутизаторов, принимающих участие в туннелях"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:580
 msgid "Backlog"
@@ -3905,9 +3840,7 @@ msgstr "Отключено — проверьте сетевой кабель"
 msgid ""
 "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and "
 "restart"
-msgstr ""
-"ОШИБКА — UDP-порт уже используется - перенастройте i2np.udp."
-"internalPort=xxxx в дополнительных настройках и перезапустите маршрутизатор"
+msgstr "ОШИБКА — UDP-порт уже используется - перенастройте i2np.udp.internalPort=xxxx в дополнительных настройках и перезапустите маршрутизатор"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:184
 msgid "ERR-No Active Peers, Check Network Connection and Firewall"
@@ -3915,8 +3848,7 @@ msgstr "ОШИБКА — Нет активных узлов, проверьте
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:187
 msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
-msgstr ""
-"ОШИБКА — UDP отключен и не заданы адрес/порт для входящих TCP-соединений"
+msgstr "ОШИБКА — UDP отключен и не заданы адрес/порт для входящих TCP-соединений"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:189
 msgid "WARN-Firewalled with UDP Disabled"
@@ -3997,7 +3929,8 @@ msgstr "Скачать обновление {0}"
 
 #. 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>
+#. If the translation is shorter than the English, you should probably not
+#. include <br>
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:721
 #, java-format
 msgid "Download Unsigned<br>Update {0}"
@@ -4451,7 +4384,8 @@ msgstr "настройка полосы пропускания"
 msgid "Router is down"
 msgstr "Маршрутизатор выключен"
 
-#. We have intl defined when this is included, but not when compiled standalone.
+#. 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:299
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:299
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325
@@ -4551,9 +4485,7 @@ msgstr "Ограничение скорости"
 msgid ""
 "I2P will work best if you configure your rates to match the speed of your "
 "internet connection."
-msgstr ""
-"I2P будет работать лучше, если Вы настроите ограничение скорости в "
-"соответствии со скоростью Вашего подключения к Интернету."
+msgstr "I2P будет работать лучше, если Вы настроите ограничение скорости в соответствии со скоростью Вашего подключения к Интернету."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:416
 msgid "KBps In"
@@ -4576,9 +4508,7 @@ msgstr "ПРИМЕЧАНИЕ"
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:454
 #, java-format
 msgid "You have configured I2P to share only {0} KBps."
-msgstr ""
-"Вы настроили очень низкий лимит для транзитного трафика (всего {0} килобайт/"
-"секунду)."
+msgstr "Вы настроили очень низкий лимит для транзитного трафика (всего {0} килобайт/секунду)."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457
 msgid "I2P requires at least 12KBps to enable sharing. "
@@ -4588,16 +4518,12 @@ msgstr "I2P нужно как минимум 12 килобайт/секунду
 msgid ""
 "Please enable sharing (participating in tunnels) by configuring more "
 "bandwidth. "
-msgstr ""
-"Пожалуйста, увеличьте долю транзитного трафика, указав бóльшую пропускную "
-"способность."
+msgstr "Пожалуйста, увеличьте долю транзитного трафика, указав бóльшую пропускную способность."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
 msgid ""
 "It improves your anonymity by creating cover traffic, and helps the network."
-msgstr ""
-"Это одновременно повысит Вашу анонимность (благодаря маскирующему "
-"транзитному трафику) и поможет сети."
+msgstr "Это одновременно повысит Вашу анонимность (благодаря маскирующему транзитному трафику) и поможет сети."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
 #, java-format
@@ -4608,9 +4534,7 @@ msgstr "Вы задали долю транзитного трафика {0} к
 msgid ""
 "The higher the share bandwidth the more you improve your anonymity and help "
 "the network."
-msgstr ""
-"Чем выше доля транзитного трафика, тем выше Ваша анонимность и больше Ваша "
-"помощь сети."
+msgstr "Чем выше доля транзитного трафика, тем выше Ваша анонимность и больше Ваша помощь сети."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:468
 msgid "Advanced network configuration page"
@@ -4652,9 +4576,7 @@ msgstr "Дополнительные настройки I2P"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:420
 msgid "Some changes may require a restart to take effect."
-msgstr ""
-"Для вступления некоторых изменений в силу может потребоваться перезапуск I2P-"
-"маршрутизатора."
+msgstr "Для вступления некоторых изменений в силу может потребоваться перезапуск I2P-маршрутизатора."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:147
 msgid "config clients"
@@ -4672,15 +4594,14 @@ msgstr "Настройки клиентов"
 msgid ""
 "The Java clients listed below are started by the router and run in the same "
 "JVM."
-msgstr ""
-"Перечисленные ниже Java-клиенты запускаются маршрутизатором внутри своей JVM."
+msgstr "Перечисленные ниже Java-клиенты запускаются маршрутизатором внутри своей JVM."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455
 msgid ""
-"Be careful changing any settings here. The 'router console' and 'application "
-"tunnels' are required for most uses of I2P. Only advanced users should "
+"Be careful changing any settings here. The 'router console' and 'application"
+" tunnels' are required for most uses of I2P. Only advanced users should "
 "change these."
-msgstr ""
+msgstr "Будьте осторожны при изменении этих настроек. 'Консоль маршрутизатора' и 'клиентские туннели' необходимы для большинства сценариев использования I2P. Такие настройки рекомендуется производить только продвинутым пользователям."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461
 msgid "To change other client options, edit the file"
@@ -4690,9 +4611,7 @@ msgstr "Для изменения других клиентских настро
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:542
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:560
 msgid "All changes require restart to take effect."
-msgstr ""
-"Для вступления измененных настроек в силу потребуется перезапуск "
-"маршрутизатора."
+msgstr "Для вступления измененных настроек в силу потребуется перезапуск маршрутизатора."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:480
 msgid "Advanced Client Interface Configuration"
@@ -4742,9 +4661,7 @@ msgstr "Настройки по умолчанию подойдут больши
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:538
 msgid "Any changes made here must also be configured in the external client."
-msgstr ""
-"Любые изменения, сделанные здесь, так же должны быть выполнены во внешнем "
-"клиенте."
+msgstr "Любые изменения, сделанные здесь, так же должны быть выполнены во внешнем клиенте."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:540
 msgid "Many clients do not support SSL or authorization."
@@ -4758,17 +4675,11 @@ msgstr "Конфигурация веб-приложений"
 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 "
-"accessible through the router console. They may be complete applications (e."
-"g. i2psnark),front-ends to another client or application which must be "
+"accessible through the router console. They may be complete applications "
+"(e.g. i2psnark),front-ends to another client or application which must be "
 "separately enabled (e.g. susidns, i2ptunnel), or have no web interface at "
 "all (e.g. addressbook)."
-msgstr ""
-"Перечисленные ниже веб-приложения Java запускаются консолью маршрутизатора "
-"внутри JVM маршрутизатора. Обычно эти приложения доступны через консоль "
-"маршрутизатора. Это могут быть как самостоятельные приложения (например, "
-"I2PSnark), так и интерфейсы к другим приложениям или клиентам, которые надо "
-"включать отдельно (например, SusiDNS, менеджер туннелей I2P), либо могут "
-"вообще не иметь веб-интерфейса (например, адресная книга)."
+msgstr "Перечисленные ниже веб-приложения Java запускаются консолью маршрутизатора внутри JVM маршрутизатора. Обычно эти приложения доступны через консоль маршрутизатора. Это могут быть как самостоятельные приложения (например, I2PSnark), так и интерфейсы к другим приложениям или клиентам, которые надо включать отдельно (например, SusiDNS, менеджер туннелей I2P), либо могут вообще не иметь веб-интерфейса (например, адресная книга)."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:554
 msgid ""
@@ -4776,11 +4687,7 @@ msgid ""
 "directory; however the .war file and web app will reappear when you update "
 "your router to a newer version, so disabling the web app here is the "
 "preferred method."
-msgstr ""
-"Веб-приложение также можно отключить, просто удалив .war-файл из директории "
-"webapps. Однако при обновлении маршрутизатора и .war-файл, и соответствующее "
-"приложение будут возвращены на свои места, поэтому отключение веб-приложения "
-"через эту страницу — более корректный способ."
+msgstr "Веб-приложение также можно отключить, просто удалив .war-файл из директории webapps. Однако при обновлении маршрутизатора и .war-файл, и соответствующее приложение будут возвращены на свои места, поэтому отключение веб-приложения через эту страницу — более корректный способ."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:568
 msgid "Plugin Configuration"
@@ -4833,16 +4740,12 @@ msgstr "Конфигурация связки ключей I2P"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:451
 msgid "The router keyring is used to decrypt encrypted leaseSets."
-msgstr ""
-"Маршрутизатор использует связку ключей для расшифровывания зашифрованных "
-"LeaseSet."
+msgstr "Маршрутизатор использует связку ключей для расшифровывания зашифрованных LeaseSet."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:454
 msgid ""
 "The keyring may contain keys for local or remote encrypted destinations."
-msgstr ""
-"Связка ключей может хранить ключи как для локальных, так и для удаленных "
-"зашифрованных адресов назначения."
+msgstr "Связка ключей может хранить ключи как для локальных, так и для удаленных зашифрованных адресов назначения."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:460
 msgid "Manual Keyring Addition"
@@ -4895,8 +4798,7 @@ msgstr "Формат записи в журнал"
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:422
 msgid ""
 "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
-msgstr ""
-"('d' = дата, 'c' = класс, 't' = поток, 'p' = приоритет, 'm' = сообщение)"
+msgstr "('d' = дата, 'c' = класс, 't' = поток, 'p' = приоритет, 'm' = сообщение)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:424
 msgid "Log date format"
@@ -4906,9 +4808,7 @@ msgstr "Формат даты"
 msgid ""
 "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' "
 "= millisecond)"
-msgstr ""
-"('MM' = месяц, 'dd' = день, 'HH' = часы, 'mm' = минуты, 'ss' = секунды, "
-"'SSS' = миллисекунды)"
+msgstr "('MM' = месяц, 'dd' = день, 'HH' = часы, 'mm' = минуты, 'ss' = секунды, 'SSS' = миллисекунды)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:430
 msgid "Max log file size"
@@ -4922,9 +4822,7 @@ msgstr "Уровень детализации по умолчанию"
 msgid ""
 "(DEBUG and INFO are not recommended defaults, as they will drastically slow "
 "down your router)"
-msgstr ""
-"(не рекомендуется использовать уровни DEBUG и INFO для постоянного "
-"использования, так как они сильно замедлят работу Вашего маршрутизатора)"
+msgstr "(не рекомендуется использовать уровни DEBUG и INFO для постоянного использования, так как они сильно замедлят работу Вашего маршрутизатора)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:440
 msgid "Log level overrides"
@@ -4981,9 +4879,7 @@ msgstr "Определять автоматически (без использо
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:478
 msgid "Ignore local interface IP address"
-msgstr ""
-"Определять автоматически (без использования IP-адресов локальных сетевых "
-"интерфейсов)"
+msgstr "Определять автоматически (без использования IP-адресов локальных сетевых интерфейсов)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:482
 msgid "Use SSU IP address detection only"
@@ -5010,9 +4906,7 @@ msgstr "Действие при смене IP"
 msgid ""
 "Laptop mode - Change router identity and UDP port when IP changes for "
 "enhanced anonymity"
-msgstr ""
-"Режим мобильного компьютера: автоматически менять идентификатор "
-"маршрутизатора и UDP-порт после смены IP"
+msgstr "Режим мобильного компьютера: автоматически менять идентификатор маршрутизатора и UDP-порт после смены IP"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:502
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:526
@@ -5058,9 +4952,7 @@ msgstr "Полностью отключить"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:538
 msgid "(select only if behind a firewall that blocks outbound UDP)"
-msgstr ""
-"(используйте этот режим только если находитесь за брандмауэром, который "
-"блокирует исходящие UDP-соединения)"
+msgstr "(используйте этот режим только если находитесь за брандмауэром, который блокирует исходящие UDP-соединения)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:550
 msgid "TCP Configuration"
@@ -5081,9 +4973,7 @@ msgstr "если входящий порт не заблокирован"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:566
 msgid "Always use auto-detected IP address (Not firewalled)"
-msgstr ""
-"Всегда использовать автоматически определенный IP-адрес (не заблокирован "
-"брандмауэром)"
+msgstr "Всегда использовать автоматически определенный IP-адрес (не заблокирован брандмауэром)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:576
 msgid "Disable inbound (Firewalled)"
@@ -5092,9 +4982,7 @@ msgstr "Отключить поддержку входящих соединен
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:582
 msgid ""
 "(select only if behind a firewall that throttles or blocks outbound TCP)"
-msgstr ""
-"(используйте этот режим только при наличии в системе брандмауэра, который "
-"замедляет или блокирует исходящие TCP-соединения)"
+msgstr "(используйте этот режим только при наличии в системе брандмауэра, который замедляет или блокирует исходящие TCP-соединения)"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:584
 msgid "Externally reachable TCP port"
@@ -5116,9 +5004,7 @@ msgstr "Примечания"
 msgid ""
 "a) Do not reveal your port numbers to anyone!   b) Changing these settings "
 "will restart your router."
-msgstr ""
-"а) Не сообщайте никому номера портов! б) Изменение этих настроек повлечет "
-"перезапуск I2P-маршрутизатора."
+msgstr "а) Не сообщайте никому номера портов! б) Изменение этих настроек повлечет перезапуск I2P-маршрутизатора."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:609
 msgid "Configuration Help"
@@ -5128,56 +5014,42 @@ msgstr "Справка по конфигурации сети"
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:660
 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 ""
-"Хотя I2P без проблем работает за большинством брандмауэров, скорость и "
-"уровень интеграции в сеть будут гораздо лучше, если открыть порт Вашего I2P-"
-"маршрутизатора для UDP- и TCP-соединений из Интернета."
+"integration will generally improve if the I2P port is forwarded for both UDP"
+" and TCP."
+msgstr "Хотя I2P без проблем работает за большинством брандмауэров, скорость и уровень интеграции в сеть будут гораздо лучше, если открыть порт Вашего I2P-маршрутизатора для UDP- и TCP-соединений из Интернета."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:613
 msgid ""
-"If you can, please poke a hole in your firewall to allow unsolicited UDP and "
-"TCP packets to reach you."
-msgstr ""
-"Попробуйте открыть доступ на Вашем брандмауэре для произвольных входящих "
-"UDP- и TCP-пакетов на порт I2P."
+"If you can, please poke a hole in your firewall to allow unsolicited UDP and"
+" TCP packets to reach you."
+msgstr "Попробуйте открыть доступ на Вашем брандмауэре для произвольных входящих UDP- и TCP-пакетов на порт I2P."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:615
 msgid ""
 "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole "
 "punching with \"SSU introductions\" to relay traffic."
-msgstr ""
-"Ничего страшного, если такой возможности нет. I2P поддерживает UPnP "
-"(Universal Plug and Play) и обход NAT с помощью SSU-посредников."
+msgstr "Ничего страшного, если такой возможности нет. I2P поддерживает UPnP (Universal Plug and Play) и обход NAT с помощью SSU-посредников."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:617
 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 ""
-"Настройки выше, в основном, предназначены для особых ситуаций. Например, "
-"если некорректно сработал UPnP или возник конфликт брандмауэра и I2P."
+"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 "Настройки выше, в основном, предназначены для особых ситуаций. Например, если некорректно сработал UPnP или возник конфликт брандмауэра и I2P."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:619
 msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
-msgstr ""
-"Некоторые виды брандмауэров могут быть частично несовместимы с I2P "
-"(например, симметричные NAT)."
+msgstr "Некоторые виды брандмауэров могут быть частично несовместимы с I2P (например, симметричные NAT)."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:628
 msgid ""
 "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect "
 "the external IP address and forward ports."
-msgstr ""
-"UPnP используется для взаимодействия с шлюзами доступа в Интернет (IGD) при "
-"определении внешнего IP-адреса и переадресации портов."
+msgstr "UPnP используется для взаимодействия с шлюзами доступа в Интернет (IGD) при определении внешнего IP-адреса и переадресации портов."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:630
 msgid "UPnP support is beta, and may not work for any number of reasons"
-msgstr ""
-"Поддержка UPnP находится в разработке (бета-версия). В следующих случаях "
-"UPnP возможно не будет работать"
+msgstr "Поддержка UPnP находится в разработке (бета-версия). В следующих случаях UPnP возможно не будет работать"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:632
 msgid "No UPnP-compatible device present"
@@ -5211,14 +5083,11 @@ msgstr "Посмотреть состояние UPnP можно здесь."
 msgid ""
 "UPnP may be enabled or disabled above, but a change requires a router "
 "restart to take effect."
-msgstr ""
-"UPnP можно включить/выключить в настройках выше. Настройка вступит в силу "
-"только после перезапуска I2P-маршрутизатора."
+msgstr "UPnP можно включить/выключить в настройках выше. Настройка вступит в силу только после перезапуска I2P-маршрутизатора."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:648
 msgid "Hostnames entered above will be published in the network database."
-msgstr ""
-"Если Вы задали вручную имена узлов, они будут опубликованы в сетевой базе."
+msgstr "Если Вы задали вручную имена узлов, они будут опубликованы в сетевой базе."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:650
 msgid "They are <b>not private</b>."
@@ -5226,20 +5095,16 @@ msgstr "<b>Не вводите локальные внутрисетевые и
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:652
 msgid ""
-"Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
-msgstr ""
-"Также <b>не вводите IP из локальных диапазонов</b>, такие как 127.0.0.1 или "
+"Also, <b>do not enter a private IP address</b> like 127.0.0.1 or "
 "192.168.1.1."
+msgstr "Также <b>не вводите IP из локальных диапазонов</b>, такие как 127.0.0.1 или 192.168.1.1."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:654
 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 ""
-"Производительность Вашего соединения с I2P-сетью может сильно пострадать, "
-"если Вы введете неверный IP-адрес, неверное имя узла или неправильно "
-"настроите NAT или брандмауэр."
+msgstr "Производительность Вашего соединения с I2P-сетью может сильно пострадать, если Вы введете неверный IP-адрес, неверное имя узла или неправильно настроите NAT или брандмауэр."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:656
 msgid "When in doubt, leave the settings at the defaults."
@@ -5254,18 +5119,13 @@ 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 ""
-"Если Вы думаете, что открыли необходимые порты на брандмауэре, а I2P все еще "
-"считает, что трафик фильтруется, помните, что у Вас может быть несколько "
-"брандмауэров, например программный, а также внешний аппаратный."
+msgstr "Если Вы думаете, что открыли необходимые порты на брандмауэре, а I2P все еще считает, что трафик фильтруется, помните, что у Вас может быть несколько брандмауэров, например программный, а также внешний аппаратный."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:666
 msgid ""
 "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help "
 "diagnose the problem."
-msgstr ""
-"В случае ошибок, <a href=\"logs.jsp\">журналы</a> могут помочь "
-"диагностировать проблему."
+msgstr "В случае ошибок, <a href=\"logs.jsp\">журналы</a> могут помочь диагностировать проблему."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:670
 msgid "Your UDP port does not appear to be firewalled."
@@ -5279,75 +5139,55 @@ msgstr "Ваш UDP-порт заблокирован брандмауэром."
 msgid ""
 "As the firewall detection methods are not 100% reliable, this may "
 "occasionally be displayed in error."
-msgstr ""
-"Иногда это сообщение не соответствует действительности, так как методы "
-"обнаружения брандмауэров пока не идеальны."
+msgstr "Иногда это сообщение не соответствует действительности, так как методы обнаружения брандмауэров пока не идеальны."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:678
 msgid ""
 "However, if it appears consistently, you should check whether both your "
 "external and internal firewalls are open for your port."
-msgstr ""
-"Но если оно появляется постоянно, Вам следует проверить, что на всех Ваших "
-"брандмауэрах открыт порт для I2P."
+msgstr "Но если оно появляется постоянно, Вам следует проверить, что на всех Ваших брандмауэрах открыт порт для I2P."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:680
 msgid ""
 "I2P will work fine when firewalled, there is no reason for concern. When "
 "firewalled, the router uses \"introducers\" to relay inbound connections."
-msgstr ""
-"Повода для паники нет, I2P сможет работать даже с заблокированным портом при "
-"помощи заранее выбранных «посредников» для ретрансляции входящих соединений."
+msgstr "Повода для паники нет, I2P сможет работать даже с заблокированным портом при помощи заранее выбранных «посредников» для ретрансляции входящих соединений."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:682
 msgid ""
 "However, you will get more participating traffic and help the network more "
 "if you can open your firewall(s)."
-msgstr ""
-"С другой стороны, при работе с открытым портом Вы получите гораздо больше "
-"транзитного трафика и сможете помочь сети."
+msgstr "С другой стороны, при работе с открытым портом Вы получите гораздо больше транзитного трафика и сможете помочь сети."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:684
 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 ""
-"Возможно, Вы собственноручно открыли порт на Вашем брандмауэре, но ошибка "
-"все равно появляется. Имейте в виду, что Вы можете быть одновременно за "
-"программным и аппаратным брандмауэрами или за дополнительным корпоративным "
-"брандмауэром (который Вы не можете контролировать)."
+msgstr "Возможно, Вы собственноручно открыли порт на Вашем брандмауэре, но ошибка все равно появляется. Имейте в виду, что Вы можете быть одновременно за программным и аппаратным брандмауэрами или за дополнительным корпоративным брандмауэром (который Вы не можете контролировать)."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:686
 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 ""
-"Кроме того, некоторые маршрутизаторы не могут корректно переадресовать "
-"одновременно TCP и UDP на один порт или имеют другие ограничения, мешающие "
-"нормальному прохождению трафика до I2P."
+msgstr "Кроме того, некоторые маршрутизаторы не могут корректно переадресовать одновременно TCP и UDP на один порт или имеют другие ограничения, мешающие нормальному прохождению трафика до I2P."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:690
 msgid "The router is currently testing whether your UDP port is firewalled."
-msgstr ""
-"Маршрутизатор проверяет возможность принятия входящих соединений на UDP-порт."
+msgstr "Маршрутизатор проверяет возможность принятия входящих соединений на UDP-порт."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:694
 msgid ""
 "The router is not configured to publish its address, therefore it does not "
 "expect incoming connections."
-msgstr ""
-"В настройках I2P-маршрутизатора запрещена публикация его адреса, как "
-"результат, маршрутизатор не ожидает входящих соединений."
+msgstr "В настройках I2P-маршрутизатора запрещена публикация его адреса, как результат, маршрутизатор не ожидает входящих соединений."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:696
 msgid ""
 "Hidden mode is automatically enabled for added protection in certain "
 "countries."
-msgstr ""
-"Скрытый режим автоматически включен для дополнительной защиты в некоторых "
-"странах."
+msgstr "Скрытый режим автоматически включен для дополнительной защиты в некоторых странах."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:698
 msgid "WARN - Firewalled and Fast"
@@ -5355,21 +5195,16 @@ msgstr "ПРЕДУПРЕЖДЕНИЕ —  Заблокирован извне, 
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:700
 msgid ""
-"You have configured I2P to share more than 128KBps of bandwidth, but you are "
-"firewalled."
-msgstr ""
-"Вы настроили долю транзитного трафика выше 128 килобайт/секунду, при этом у "
-"Вас заблокирован входящий порт."
+"You have configured I2P to share more than 128KBps of bandwidth, but you are"
+" firewalled."
+msgstr "Вы настроили долю транзитного трафика выше 128 килобайт/секунду, при этом у Вас заблокирован входящий порт."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:702
 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 ""
-"I2P будет работать нормально в такой конфигурации, но Вы можете помочь сети, "
-"разблокировав входящий порт, если у Вас действительно быстрый Интернет "
-"(скорость выше 128 килобайт/секунду)."
+msgstr "I2P будет работать нормально в такой конфигурации, но Вы можете помочь сети, разблокировав входящий порт, если у Вас действительно быстрый Интернет (скорость выше 128 килобайт/секунду)."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:704
 msgid "WARN - Firewalled and Floodfill"
@@ -5378,44 +5213,32 @@ msgstr "ПРЕДУПРЕЖДЕНИЕ — Заблокирован извне, fl
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:706
 msgid ""
 "You have configured I2P to be a floodfill router, but you are firewalled."
-msgstr ""
-"Вы настроили I2P работать в режиме floodfill-маршрутизатора, при этом у Вас "
-"заблокирован входящий порт."
+msgstr "Вы настроили I2P работать в режиме floodfill-маршрутизатора, при этом у Вас заблокирован входящий порт."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:708
 msgid ""
 "For best participation as a floodfill router, you should open your firewall."
-msgstr ""
-"Для оптимальной работы в качестве floodfill-маршрутизатора Вам нужно "
-"разблокировать входящий порт."
+msgstr "Для оптимальной работы в качестве floodfill-маршрутизатора Вам нужно разблокировать входящий порт."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:710
 msgid "WARN - Firewalled with Inbound TCP Enabled"
-msgstr ""
-"ПРЕДУПРЕЖДЕНИЕ — Заблокирован извне при включенных входящих TCP-соединениях"
+msgstr "ПРЕДУПРЕЖДЕНИЕ — Заблокирован извне при включенных входящих TCP-соединениях"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:712
 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 ""
-"Вы разрешили входящие TCP-соединения, но при этом Ваш UDP-порт заблокирован, "
-"следовательно, скорее всего, TCP-порт тоже заблокирован."
+msgstr "Вы разрешили входящие TCP-соединения, но при этом Ваш UDP-порт заблокирован, следовательно, скорее всего, TCP-порт тоже заблокирован."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:714
 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 ""
-"Если у Вас разрешены входящие TCP-соединения при заблокированном TCP-порте, "
-"то другие маршрутизаторы не смогут к Вам подсоединиться по TCP. Это повредит "
-"производительности сети. "
+"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 "Если у Вас разрешены входящие TCP-соединения при заблокированном TCP-порте, то другие маршрутизаторы не смогут к Вам подсоединиться по TCP. Это повредит производительности сети. "
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:716
 msgid "Please open your firewall or disable inbound TCP above."
-msgstr ""
-"Пожалуйста, проверьте состояние TCP-порта и разблокируйте его или отключите "
-"поддержку входящих TCP-соединений."
+msgstr "Пожалуйста, проверьте состояние TCP-порта и разблокируйте его или отключите поддержку входящих TCP-соединений."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:718
 msgid "WARN - Firewalled with UDP Disabled"
@@ -5423,17 +5246,13 @@ msgstr "ПРЕДУПРЕЖДЕНИЕ - Заблокирован извне пр
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:720
 msgid "You have configured inbound TCP, however you have disabled UDP."
-msgstr ""
-"Вы включили поддержку входящих TCP-соединений, при этом отключили поддержку "
-"UDP."
+msgstr "Вы включили поддержку входящих TCP-соединений, при этом отключили поддержку UDP."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:722
 msgid ""
 "You appear to be firewalled on TCP, therefore your router cannot accept "
 "inbound connections."
-msgstr ""
-"Вашим брандмауэром заблокированы входящие TCP-соединения, поэтому "
-"маршрутизатор не может принимать входящие подключения."
+msgstr "Вашим брандмауэром заблокированы входящие TCP-соединения, поэтому маршрутизатор не может принимать входящие подключения."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:724
 msgid "Please open your firewall or enable UDP."
@@ -5447,15 +5266,11 @@ msgstr "ОШИБКА — Часы сбиты"
 msgid ""
 "Your system's clock is skewed, which will make it difficult to participate "
 "in the network."
-msgstr ""
-"Ваши системные часы сильно отстают/спешат. Это помешает Вашему участию в "
-"сети."
+msgstr "Ваши системные часы сильно отстают/спешат. Это помешает Вашему участию в сети."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:730
 msgid "Correct your clock setting if this error persists."
-msgstr ""
-"Поправьте настройки времени, если Вы постоянно видите это сообщение об "
-"ошибке."
+msgstr "Поправьте настройки времени, если Вы постоянно видите это сообщение об ошибке."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:732
 msgid "ERR - Private TCP Address"
@@ -5465,9 +5280,7 @@ msgstr "ОШИБКА — Частный TCP-адрес"
 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 ""
-"Не публикуйте локальные IP-адреса (такие как 127.0.0.1 или 192.168.1.1) в "
-"качестве своего внешнего IP-адреса."
+msgstr "Не публикуйте локальные IP-адреса (такие как 127.0.0.1 или 192.168.1.1) в качестве своего внешнего IP-адреса."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:736
 msgid "Correct the address or disable inbound TCP above."
@@ -5486,18 +5299,13 @@ 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 ""
-"I2P не очень хорошо работает за таким типом брандмауэров. Скорее всего Вы не "
-"сможете принимать входящие соединения и это снизит эффективность Вашего "
-"участия в сети."
+msgstr "I2P не очень хорошо работает за таким типом брандмауэров. Скорее всего Вы не сможете принимать входящие соединения и это снизит эффективность Вашего участия в сети."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:744
 msgid ""
 "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config "
 "and restart"
-msgstr ""
-"ОШИБКА — UDP-порт уже используется — перенастройте i2np.udp."
-"internalPort=xxxx в дополнительных настройках и перезапустите маршрутизатор"
+msgstr "ОШИБКА — UDP-порт уже используется — перенастройте i2np.udp.internalPort=xxxx в дополнительных настройках и перезапустите маршрутизатор"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:746
 msgid "I2P was unable to bind to port 8887 or other configured port."
@@ -5507,17 +5315,13 @@ msgstr "I2P не удалось использовать порт 8887 (или 
 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 ""
-"Проверьте, не занят ли этот порт другим приложением. Если такое приложение "
-"нашлось, остановите его или задайте другой порт в настройках I2P."
+msgstr "Проверьте, не занят ли этот порт другим приложением. Если такое приложение нашлось, остановите его или задайте другой порт в настройках I2P."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:750
 msgid ""
 "This may be a transient error, if the other program is no longer using the "
 "port."
-msgstr ""
-"Это может быть временной ошибкой, если никакая другая программа не "
-"использует настроенный порт."
+msgstr "Это может быть временной ошибкой, если никакая другая программа не использует настроенный порт."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:752
 msgid "However, a restart is always required after this error."
@@ -5525,16 +5329,13 @@ msgstr "После возникновения этой ошибки необхо
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:754
 msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
-msgstr ""
-"ОШИБКА — UDP отключен и не заданы адрес/порт для входящих TCP-соединений"
+msgstr "ОШИБКА — UDP отключен и не заданы адрес/порт для входящих TCP-соединений"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:756
 msgid ""
 "You have not configured inbound TCP with a hostname and port above, however "
 "you have disabled UDP."
-msgstr ""
-"Вы не задали адрес/порт для входящих TCP-соединений и одновременно отключили "
-"поддержку UDP."
+msgstr "Вы не задали адрес/порт для входящих TCP-соединений и одновременно отключили поддержку UDP."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:758
 msgid "Therefore your router cannot accept inbound connections."
@@ -5550,17 +5351,13 @@ msgstr "ОШИБКА — ошибка менеджера I2CP — смотрит
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:764
 msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
-msgstr ""
-"Эта ошибка обычно возникает из-за конфликта порта 7654. Загляните в журналы, "
-"чтобы убедиться."
+msgstr "Эта ошибка обычно возникает из-за конфликта порта 7654. Загляните в журналы, чтобы убедиться."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:766
 msgid ""
 "Do you have another I2P instance running? Stop the conflicting program and "
 "restart I2P."
-msgstr ""
-"Не запущена ли у вас еще одна копия I2P? Остановите вызвавшую конфликт "
-"программу и перезапустите I2P."
+msgstr "Не запущена ли у вас еще одна копия I2P? Остановите вызвавшую конфликт программу и перезапустите I2P."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:147
 msgid "config peers"
@@ -5585,8 +5382,7 @@ msgstr "Вручную заблокировать/разблокировать 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:466
 msgid ""
 "Banning will prevent the participation of this peer in tunnels you create."
-msgstr ""
-"Блокировка запретит участие указанного узла в создаваемых Вами туннелях."
+msgstr "Блокировка запретит участие указанного узла в создаваемых Вами туннелях."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:476
 msgid "Adjust Profile Bonuses"
@@ -5594,16 +5390,11 @@ msgstr "Настроить бонусы для этого узла"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:478
 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 "
+"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 "
 "Capacity peers are used for some exploratory tunnels. Current bonuses are "
 "displayed on the"
-msgstr ""
-"Бонусы могут быть положительными и отрицательными и вводятся для управления "
-"включением пира в группы «быстрые» и «высокоемкие». Быстрые пиры "
-"используются для построения клиентских туннелей, высокоемкие пиры "
-"используются для некоторых зондирующих туннелей. Текущие бонусы можно "
-"посмотреть на"
+msgstr "Бонусы могут быть положительными и отрицательными и вводятся для управления включением пира в группы «быстрые» и «высокоемкие». Быстрые пиры используются для построения клиентских туннелей, высокоемкие пиры используются для некоторых зондирующих туннелей. Текущие бонусы можно посмотреть на"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:480
 msgid "profiles page"
@@ -5634,31 +5425,23 @@ 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 ""
-"Начальная загрузка (англ. reseeding) - процесс, используемый для нахождения "
-"других маршрутизаторов, когда вы впервые установили I2P, или когда ваш "
-"маршрутизатор имеет слишком мало данных о других маршрутизаторах."
+msgstr "Начальная загрузка (англ. reseeding) - процесс, используемый для нахождения других маршрутизаторов, когда вы впервые установили I2P, или когда ваш маршрутизатор имеет слишком мало данных о других маршрутизаторах."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:453
 msgid ""
 "If reseeding has failed, you should first check your network connection."
-msgstr ""
-"Если начальная загрузка не удалась, первым делом Вы должны проверить "
-"соединение с сетью."
+msgstr "Если начальная загрузка не удалась, первым делом Вы должны проверить соединение с сетью."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:457
 msgid ""
 "Change these only if HTTP is blocked by a restrictive firewall, reseed has "
 "failed, and you have access to an HTTP proxy."
-msgstr ""
-"Меняйте эти параметры только если HTTP заблокирован на брандмауэре, "
-"начальная загрузка не удалась и Вы имеете доступ к HTTP-прокси."
+msgstr "Меняйте эти параметры только если HTTP заблокирован на брандмауэре, начальная загрузка не удалась и Вы имеете доступ к HTTP-прокси."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:459
 #, java-format
 msgid "See {0} for instructions on reseeding manually."
-msgstr ""
-"Смотрите {0} на предмет инструкций как выполнить начальную загрузку вручную."
+msgstr "Смотрите {0} на предмет инструкций как выполнить начальную загрузку вручную."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:459
 msgid "the FAQ"
@@ -5746,55 +5529,40 @@ msgstr "Выключить маршрутизатор"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:439
 msgid ""
-"Graceful shutdown lets the router satisfy the agreements it has already made "
-"before shutting down, but may take a few minutes."
-msgstr ""
-"Плавное выключение позволяет маршрутизатору перед остановкой отработать все "
-"поставленные задачи, но при этом на процесс выключения потребуется "
-"дополнительное время."
+"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:441
 msgid ""
-"If you need to kill the router immediately, that option is available as well."
-msgstr ""
-"Если маршрутизатор должен быть выключен немедленно, Вы можете выбрать "
-"соответствующую команду."
+"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:451
 msgid ""
-"If you want the router to restart itself after shutting down, you can choose "
-"one of the following."
-msgstr ""
-"Если Вы хотите, чтобы маршрутизатор был перезапущен после выключения, Вы "
-"можете выбрать одну из следующих команд."
+"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:453
 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 ""
-"Это полезно в некоторых ситуациях. Например, вы изменили некоторые "
-"настройки, которые клиентские приложения считывают только при запуске, такие "
-"как пароль консоли маршрутизатора или прослушиваемый ей интерфейс."
+msgstr "Это полезно в некоторых ситуациях. Например, вы изменили некоторые настройки, которые клиентские приложения считывают только при запуске, такие как пароль консоли маршрутизатора или прослушиваемый ей интерфейс."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:455
 msgid ""
 "A graceful restart will take a few minutes (but your peers will appreciate "
 "your patience), while a hard restart does so immediately."
-msgstr ""
-"Плавный перезапуск займет несколько минут (но зато узлы, использующие Ваш "
-"маршрутизатор, будут Вам благодарны за терпение). Если Вы не можете ждать, "
-"выбирайте немедленный перезапуск. В случае немедленного перезапуска "
-"маршрутизатор запустится через одну минуту."
+msgstr "Плавный перезапуск займет несколько минут (но зато узлы, использующие Ваш маршрутизатор, будут Вам благодарны за терпение). Если Вы не можете ждать, выбирайте немедленный перезапуск. В случае немедленного перезапуска маршрутизатор запустится через одну минуту."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:457
 msgid ""
-"After tearing down the router, it will wait 1 minute before starting back up "
-"again."
-msgstr ""
-"После выключения маршрутизатора будет иметь место задержка (1 минута) перед "
-"его повторным запуском."
+"After tearing down the router, it will wait 1 minute before starting back up"
+" again."
+msgstr "После выключения маршрутизатора будет иметь место задержка (1 минута) перед его повторным запуском."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:467
 msgid "Systray integration"
@@ -5804,23 +5572,18 @@ msgstr "Интеграция в область уведомлений"
 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 ""
-"Если Вы работаете под Windows, у Вас есть возможность отслеживать состояние "
-"маршрутизатора через значок в области уведомлений"
+msgstr "Если Вы работаете под Windows, у Вас есть возможность отслеживать состояние маршрутизатора через значок в области уведомлений"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:471
 msgid ""
 "(later on, I2P client applications will be able to integrate their own "
 "functionality into the system tray as well)."
-msgstr ""
-"(позже, клиентские приложения I2P также смогут интегрировать свою "
-"функциональность в область уведомлений)."
+msgstr "(позже, клиентские приложения I2P также смогут интегрировать свою функциональность в область уведомлений)."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:473
-msgid "If you are on windows, you can either enable or disable that icon here."
-msgstr ""
-"Если Вы пользуетесь I2P под Windows, то здесь Вы можете настроить "
-"отображение этого значка."
+msgid ""
+"If you are on windows, you can either enable or disable that icon here."
+msgstr "Если Вы пользуетесь I2P под Windows, то здесь Вы можете настроить отображение этого значка."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:475
 msgid "Show systray icon"
@@ -5836,17 +5599,13 @@ msgstr "Автоматический запуск I2P"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:481
 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 ""
-"Вы можете настроить автоматическую загрузку маршрутизатора при каждом "
-"запуске системы. В зависимости от выбранной кнопки I2P или установит службу "
-"в автозагрузку, либо удалит ее оттуда."
+"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 "Вы можете настроить автоматическую загрузку маршрутизатора при каждом запуске системы. В зависимости от выбранной кнопки I2P или установит службу в автозагрузку, либо удалит ее оттуда."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:483
 msgid "If you prefer the command line, you can also run the "
-msgstr ""
-"Если Вам удобно работать через командную строку, попробуйте использовать "
+msgstr "Если Вам удобно работать через командную строку, попробуйте использовать "
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:491
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:469
@@ -5855,19 +5614,15 @@ msgstr "ВНИМАНИЕ"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:493
 msgid ""
-"If you are running I2P as service right now, removing it will shut down your "
-"router immediately."
-msgstr ""
-"Если I2P в данный момент запущен в качестве службы, при удалении ее из "
-"автозапуска маршрутизатор будет немедленно выключен."
+"If you are running I2P as service right now, removing it will shut down your"
+" router immediately."
+msgstr "Если I2P в данный момент запущен в качестве службы, при удалении ее из автозапуска маршрутизатор будет немедленно выключен."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:495
 msgid ""
 "You may want to consider shutting down gracefully, as above, then running "
 "uninstall_i2p_service_winnt.bat."
-msgstr ""
-"Возможно лучше плавно остановить маршрутизатор и после этого запустить файл "
-"uninstall_i2p_service_winnt.bat."
+msgstr "Возможно лучше плавно остановить маршрутизатор и после этого запустить файл uninstall_i2p_service_winnt.bat."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:499
 msgid "Debugging"
@@ -5879,14 +5634,10 @@ msgstr "Просмотр очереди заданий"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:505
 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 ""
-"В некоторых случаях для отладки может пригодиться список состояний потоков "
-"I2P-маршутизатора. Для получения такого списка нажмите соответствующую "
-"кнопку. Список будет сохранен в файле <a href=\"logs.jsp#servicelogs"
-"\">wrapper.log</a>."
+"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 "В некоторых случаях для отладки может пригодиться список состояний потоков I2P-маршутизатора. Для получения такого списка нажмите соответствующую кнопку. Список будет сохранен в файле <a href=\"logs.jsp#servicelogs\">wrapper.log</a>."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:517
 msgid "Launch browser on router startup?"
@@ -5896,9 +5647,7 @@ msgstr "Запускать браузер при старте I2P?"
 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 ""
-"Основной интерфейс настройки I2P это веб-консоль. Здесь можно выбрать "
-"автоматическое открытие при запуске маршрутизатора страницы"
+msgstr "Основной интерфейс настройки I2P это веб-консоль. Здесь можно выбрать автоматическое открытие при запуске маршрутизатора страницы"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:147
 msgid "config summary bar"
@@ -5980,19 +5729,14 @@ msgstr "Большинству пользователей подойдут на
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:453
 msgid "There is a fundamental tradeoff between anonymity and performance."
-msgstr ""
-"Примите во внимание, что между анонимностью и эффективностью есть обратная "
-"связь — длинные туннели более анонимны, но хуже работают."
+msgstr "Примите во внимание, что между анонимностью и эффективностью есть обратная связь — длинные туннели более анонимны, но хуже работают."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:456
 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 ""
-"Туннели длиннее 3 хопов, а также большое количество туннелей (как обычных, "
-"так и резервных) могут привести к снижению производительности/надежности "
-"работы маршрутизатора."
+"hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely"
+" reduce performance or reliability."
+msgstr "Туннели длиннее 3 хопов, а также большое количество туннелей (как обычных, так и резервных) могут привести к снижению производительности/надежности работы маршрутизатора."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:459
 msgid "High CPU and/or high outbound bandwidth usage may result."
@@ -6000,9 +5744,7 @@ msgstr "Результатом может быть высокая нагрузк
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:462
 msgid "Change these settings with care, and adjust them if you have problems."
-msgstr ""
-"Осторожно вносите изменения в настройки и при возникновении у Вас проблем "
-"возвращайте их в положение по умолчанию."
+msgstr "Осторожно вносите изменения в настройки и при возникновении у Вас проблем возвращайте их в положение по умолчанию."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:472
 msgid ""
@@ -6011,15 +5753,11 @@ msgstr "Настройки зондирующих туннелей сохран
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:475
 msgid "Client tunnel changes are temporary and are not saved."
-msgstr ""
-"Настройки клиентских туннелей нигде не сохраняются и действуют только до "
-"перезапуска."
+msgstr "Настройки клиентских туннелей нигде не сохраняются и действуют только до перезапуска."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:477
 msgid "To make permanent client tunnel changes see the"
-msgstr ""
-"Для задания постоянных изменений в настройках клиентских туннелей "
-"воспользуйтесь"
+msgstr "Для задания постоянных изменений в настройках клиентских туннелей воспользуйтесь"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:479
 msgid "i2ptunnel page"
@@ -6046,11 +5784,7 @@ 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 ""
-"Если вы не используете IE, то, скорее всего, Ваш браузер сконфигурирован "
-"представляться как IE. Пожалуйста измените строку User-Agent в настройках "
-"Вашего браузера (или прокси-сервера), если хотите использовать темы "
-"оформления."
+msgstr "Если вы не используете IE, то, скорее всего, Ваш браузер сконфигурирован представляться как IE. Пожалуйста измените строку User-Agent в настройках Вашего браузера (или прокси-сервера), если хотите использовать темы оформления."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:426
 msgid "Router Console Language"
@@ -6060,9 +5794,7 @@ msgstr "Язык консоли маршрутизатора"
 msgid ""
 "Please contribute to the router console translation project! Contact the "
 "developers in #i2p-dev on IRC to help."
-msgstr ""
-"Пожалуйста, помогите проекту перевода консоли маршрутизатора! Разработчики "
-"доступны для связи на IRC-канале #i2p-dev."
+msgstr "Пожалуйста, помогите проекту перевода консоли маршрутизатора! Разработчики доступны для связи на IRC-канале #i2p-dev."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:436
 msgid "Apply"
@@ -6205,11 +5937,9 @@ msgstr "Пожалуйста сообщайте об ошибках по адр
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:175
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:346
 msgid ""
-"You may use the username \"guest\" and password \"guest\" if you do not wish "
-"to register."
-msgstr ""
-"Вы можете использовать имя пользователя \"guest\" и пароль \"guest\", если "
-"не хотите регистрироваться."
+"You may use the username \"guest\" and password \"guest\" if you do not wish"
+" to register."
+msgstr "Вы можете использовать имя пользователя \"guest\" и пароль \"guest\", если не хотите регистрироваться."
 
 #: ../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:348
@@ -6234,11 +5964,9 @@ msgstr "Версия I2P и информация о среде выполнен
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:397
 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 ""
-"Имейте в виду, что информация о системе, временные метки в журналах и сами "
-"журналы могут помочь выявить ваше местоположение; пожалуйста проверьте все, "
-"что вы включаете в сообщение об ошибке."
+"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:155
 msgid "Page Not Found"
@@ -6272,9 +6000,7 @@ msgstr "Графики производительности I2P"
 msgid ""
 "Click a flag to select a language. Click 'configure language' below to "
 "change it later."
-msgstr ""
-"Нажмите на флаг для выбора языка. В дальнейшем вы можете воспользоваться "
-"пунктом \"Настроить язык\" ниже."
+msgstr "Нажмите на флаг для выбора языка. В дальнейшем вы можете воспользоваться пунктом \"Настроить язык\" ниже."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:385
 msgid "Search I2P"
@@ -6346,11 +6072,9 @@ msgstr "Запрошенное веб-приложение не запущено
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:344
 msgid ""
-"Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</"
-"a> to start it."
-msgstr ""
-"Пожалуйста, запустите его со <a href=\"/configclients.jsp#webapp\">страницы "
-"настроек веб-приложений</a>."
+"Please visit the <a href=\"/configclients.jsp#webapp\">config clients "
+"page</a> to start it."
+msgstr "Пожалуйста, запустите его со <a href=\"/configclients.jsp#webapp\">страницы настроек веб-приложений</a>."
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:143
 msgid "peer connections"
diff --git a/apps/routerconsole/locale/messages_uk.po b/apps/routerconsole/locale/messages_uk.po
index 05da33b117b4c380628f56b4f54806778fd32147..d19bb66839802864f38ce9d2de96254177f5e37d 100644
--- a/apps/routerconsole/locale/messages_uk.po
+++ b/apps/routerconsole/locale/messages_uk.po
@@ -7,13 +7,14 @@
 # naeto <a89393@rmqkr.net>, 2012
 # Денис Лысенко <gribua@gmail.com>, 2011
 # Денис Лысенко <gribua@gmail.com>, 2011
+# jonny_nut, 2014
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-01-09 19:27+0000\n"
-"PO-Revision-Date: 2014-01-10 11:42+0000\n"
-"Last-Translator: kytv <killyourtv@i2pmail.org>\n"
+"PO-Revision-Date: 2014-01-23 16:47+0000\n"
+"Last-Translator: jonny_nut\n"
 "Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -369,7 +370,7 @@ msgstr "Підключений"
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1127
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2542
 msgid "Skew"
-msgstr ""
+msgstr "Нахил"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:599
 msgid "The difference between the peer's clock and your own"
@@ -586,12 +587,12 @@ msgstr ""
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1117
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2520
 msgid "Limit"
-msgstr ""
+msgstr "Обмеження"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1118
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2521
 msgid "Timeout"
-msgstr ""
+msgstr "Упущення часу бездіяльности"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1123
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2529
@@ -600,23 +601,23 @@ msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1130
 msgid "Out Queue"
-msgstr ""
+msgstr "Вихідна Черга"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1131
 msgid "Backlogged?"
-msgstr ""
+msgstr "Перевантажено?"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1144
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2583
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:91
 msgid "Inbound"
-msgstr ""
+msgstr "вхідно"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1146
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2585
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:91
 msgid "Outbound"
-msgstr ""
+msgstr "вихідно"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:1201
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2750
@@ -629,7 +630,7 @@ msgstr[2] ""
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2519
 msgid "UDP connections"
-msgstr ""
+msgstr "зв'язки UDP"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2526
 msgid "Sort by peer hash"
@@ -641,27 +642,27 @@ msgstr ""
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2531
 msgid "Sort by idle inbound"
-msgstr ""
+msgstr "Порядком за вхідню бездіяльність"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2533
 msgid "Sort by idle outbound"
-msgstr ""
+msgstr "Порядком за вихідню бездіяльність"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2536
 msgid "Sort by inbound rate"
-msgstr ""
+msgstr "Порядком за вхідну ставку"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2538
 msgid "Sort by outbound rate"
-msgstr ""
+msgstr "Порядком за вихідну ставку"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2541
 msgid "Sort by connection uptime"
-msgstr ""
+msgstr "Порядком за тривалість зв'язку"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2543
 msgid "Sort by clock skew"
-msgstr ""
+msgstr "Порядком за нахилом такту"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2546
 msgid "Sort by congestion window"
@@ -725,7 +726,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:165
 #: ../java/src/net/i2p/router/web/ProfilesHelper.java:13
 msgid "Banned"
-msgstr ""
+msgstr "Забороненo"
 
 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2668
 msgid "backlogged"
@@ -1249,7 +1250,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:326
 msgid "started"
-msgstr ""
+msgstr "почато"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:328
 msgid "Failed to start"
@@ -1257,7 +1258,7 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:333
 msgid "Failed to find server."
-msgstr ""
+msgstr "Провал пошуку за сервер"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339
 msgid "No plugin URL specified."
@@ -1318,7 +1319,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:76
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:281
 msgid "Edit"
-msgstr ""
+msgstr "Редагування"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:474
@@ -1333,7 +1334,7 @@ msgstr ""
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:510
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:427
 msgid "Client"
-msgstr ""
+msgstr "Клієнт"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:138
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java
index 47cfd6a53d7f8d1371ddb2c37487c864fc3bafd2..8cec3cad8c36ac15bcfecf39f6b843edf6c7ec33 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/Connection.java
@@ -307,6 +307,8 @@ class Connection {
         reply.setSendStreamId(_sendStreamId);
         reply.setReceiveStreamId(_receiveStreamId);
         reply.setOptionalFrom(_connectionManager.getSession().getMyDestination());
+        reply.setLocalPort(_localPort);
+        reply.setRemotePort(_remotePort);
         // this just sends the packet - no retries or whatnot
         if (_outboundQueue.enqueue(reply)) {
             _unackedPacketsReceived = 0;
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionDataReceiver.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionDataReceiver.java
index dbf546ad880f36568cbf9ae5d54c5f7024eb4e40..8568e7c69b0a131b00799c971a83608da604c139 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionDataReceiver.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionDataReceiver.java
@@ -206,9 +206,9 @@ class ConnectionDataReceiver implements MessageOutputStream.DataReceiver {
             packet.setFlag(Packet.FLAG_SYNCHRONIZE);
             packet.setOptionalFrom(con.getSession().getMyDestination());
             packet.setOptionalMaxSize(con.getOptions().getMaxMessageSize());
-            packet.setLocalPort(con.getLocalPort());
-            packet.setRemotePort(con.getPort());
         }
+        packet.setLocalPort(con.getLocalPort());
+        packet.setRemotePort(con.getPort());
         if (con.getSendStreamId() == Packet.STREAM_ID_UNKNOWN) {
             packet.setFlag(Packet.FLAG_NO_ACK);
         }
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionManager.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionManager.java
index 435a09ce42cd4d17ef69fe6d43b1238d4bb39c2d..5924e818c5fbbcf9d06632cbbab7c6d0dc4245ae 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionManager.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionManager.java
@@ -262,6 +262,8 @@ class ConnectionManager {
             reply.setSendStreamId(synPacket.getReceiveStreamId());
             reply.setReceiveStreamId(0);
             reply.setOptionalFrom(_session.getMyDestination());
+            reply.setLocalPort(synPacket.getLocalPort());
+            reply.setRemotePort(synPacket.getRemotePort());
             // this just sends the packet - no retries or whatnot
             _outboundQueue.enqueue(reply);
             return null;
@@ -284,6 +286,44 @@ class ConnectionManager {
         return con;
     }
     
+    /**
+     *  Process a ping by checking for throttling, etc., then sending a pong.
+     *
+     *  @param con null if unknown
+     *  @param ping Ping packet to process, must have From and Sig fields,
+     *              with signature already verified, only if answerPings() returned true
+     *  @return true if we sent a pong
+     *  @since 0.9.12 from PacketHandler.receivePing()
+     */
+    public boolean receivePing(Connection con, Packet ping) {
+        Destination dest = ping.getOptionalFrom();
+        if (dest == null)
+            return false;
+        if (con == null) {
+            // Use the same throttling as for connections
+            String why = shouldRejectConnection(ping);
+            if (why != null) {
+                if ((!_defaultOptions.getDisableRejectLogging()) || _log.shouldLog(Log.WARN))
+                    _log.logAlways(Log.WARN, "Dropping ping since peer is " + why + ": " + dest.calculateHash());
+                return false;
+            }
+        } else {
+            // in-connection ping to a 3rd party ???
+            if (!dest.equals(con.getRemotePeer())) {
+                _log.logAlways(Log.WARN, "Dropping ping from " + con.getRemotePeer().calculateHash() +
+                                         " to " + dest.calculateHash());
+                return false;
+            }
+        }
+        PacketLocal pong = new PacketLocal(_context, dest);
+        pong.setFlag(Packet.FLAG_ECHO | Packet.FLAG_NO_ACK);
+        pong.setReceiveStreamId(ping.getSendStreamId());
+        pong.setLocalPort(ping.getLocalPort());
+        pong.setRemotePort(ping.getRemotePort());
+        _outboundQueue.enqueue(pong);
+        return true;
+    }
+    
     private static final long DEFAULT_STREAM_DELAY_MAX = 10*1000;
     
     /**
@@ -572,24 +612,44 @@ class ConnectionManager {
             return new HashSet<Connection>(_connectionByInboundId.values());
     }
 
-    /** blocking */
+    /**
+     *  blocking
+     *
+     *  @param timeoutMs greater than zero
+     *  @return true if pong received
+     */
     public boolean ping(Destination peer, long timeoutMs) {
-        return ping(peer, timeoutMs, true, null);
+        return ping(peer, 0, 0, timeoutMs, true, null);
     }
-    public boolean ping(Destination peer, long timeoutMs, boolean blocking) {
-        return ping(peer, timeoutMs, blocking, null);
+
+    /**
+     *  blocking
+     *
+     *  @param timeoutMs greater than zero
+     *  @return true if pong received
+     *  @since 0.9.12 added port args
+     */
+    public boolean ping(Destination peer, int fromPort, int toPort, long timeoutMs) {
+        return ping(peer, fromPort, toPort, timeoutMs, true, null);
     }
 
     /**
-     * @deprecated I2PSession ignores tags, use non-tag variant
-     * @param keyToUse ignored
-     * @param tagsToSend ignored
+     *  @param timeoutMs greater than zero
+     *  @return true if blocking and pong received
+     *  @since 0.9.12 added port args
      */
-    public boolean ping(Destination peer, long timeoutMs, boolean blocking, SessionKey keyToUse, Set<?> tagsToSend, PingNotifier notifier) {
-        return ping(peer, timeoutMs, blocking, notifier);
+    public boolean ping(Destination peer, int fromPort, int toPort, long timeoutMs, boolean blocking) {
+        return ping(peer, fromPort, toPort, timeoutMs, blocking, null);
     }
 
-    public boolean ping(Destination peer, long timeoutMs, boolean blocking, PingNotifier notifier) {
+    /**
+     *  @param timeoutMs greater than zero
+     *  @param notifier may be null
+     *  @return true if blocking and pong received
+     *  @since 0.9.12 added port args
+     */
+    public boolean ping(Destination peer, int fromPort, int toPort, long timeoutMs,
+                        boolean blocking, PingNotifier notifier) {
         Long id = Long.valueOf(_context.random().nextLong(Packet.MAX_STREAM_ID-1)+1);
         PacketLocal packet = new PacketLocal(_context, peer);
         packet.setSendStreamId(id.longValue());
@@ -597,13 +657,15 @@ class ConnectionManager {
                        Packet.FLAG_NO_ACK |
                        Packet.FLAG_SIGNATURE_INCLUDED);
         packet.setOptionalFrom(_session.getMyDestination());
+        packet.setLocalPort(fromPort);
+        packet.setRemotePort(toPort);
         //if ( (keyToUse != null) && (tagsToSend != null) ) {
         //    packet.setKeyUsed(keyToUse);
         //    packet.setTagsSent(tagsToSend);
         //}
         if (_log.shouldLog(Log.INFO)) {
-            _log.info(String.format("about to ping %s timeout=%d blocking=%b",
-                    peer,timeoutMs,blocking));
+            _log.info(String.format("about to ping %s port %d from port %d timeout=%d blocking=%b",
+                      peer.calculateHash().toString(), toPort, fromPort, timeoutMs, blocking));
         }
             
         
@@ -658,6 +720,7 @@ class ConnectionManager {
         private boolean _ponged;
         private final PingNotifier _notifier;
 
+        /** @param notifier may be null */
         public PingRequest(PingNotifier notifier) { 
             _notifier = notifier;
         }
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketManagerFull.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketManagerFull.java
index 757eb37f42d2dddfbbc51ba405ab1cb63f37c4ca..435207b6c31cc9c2d381918a5a63bd60b49418b0 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketManagerFull.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketManagerFull.java
@@ -148,13 +148,41 @@ public class I2PSocketManagerFull implements I2PSocketManager {
      * Ping the specified peer, returning true if they replied to the ping within 
      * the timeout specified, false otherwise.  This call blocks.
      *
+     * Uses the ports from the default options.
      * 
      * @param peer
-     * @param timeoutMs
+     * @param timeoutMs timeout in ms, greater than zero
      * @return true on success, false on failure
+     * @throws IllegalArgumentException
      */
     public boolean ping(Destination peer, long timeoutMs) {
-        return _connectionManager.ping(peer, timeoutMs);
+        if (timeoutMs <= 0)
+            throw new IllegalArgumentException("bad timeout");
+        return _connectionManager.ping(peer, _defaultOptions.getLocalPort(),
+                                       _defaultOptions.getPort(), timeoutMs);
+    }
+
+    /**
+     * Ping the specified peer, returning true if they replied to the ping within 
+     * the timeout specified, false otherwise.  This call blocks.
+     *
+     * Uses the ports specified.
+     *
+     * @param peer Destination to ping
+     * @param localPort 0 - 65535
+     * @param remotePort 0 - 65535
+     * @param timeoutMs timeout in ms, greater than zero
+     * @return success or failure
+     * @throws IllegalArgumentException
+     * @since 0.9.12
+     */
+    public boolean ping(Destination peer, int localPort, int remotePort, long timeoutMs) {
+        if (localPort < 0 || localPort > 65535 ||
+            remotePort < 0 || remotePort > 65535)
+            throw new IllegalArgumentException("bad port");
+        if (timeoutMs <= 0)
+            throw new IllegalArgumentException("bad timeout");
+        return _connectionManager.ping(peer, localPort, remotePort, timeoutMs);
     }
 
     /**
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/Packet.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/Packet.java
index 16784d38fcdb1155a1dd1dd7fef93df7a2a17f08..2de71035b6ed3c36287f0ebb7a6994b00d853cc1 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/impl/Packet.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/Packet.java
@@ -5,6 +5,7 @@ import java.io.IOException;
 import java.util.Arrays;
 
 import net.i2p.I2PAppContext;
+import net.i2p.crypto.SigType;
 import net.i2p.data.Base64;
 import net.i2p.data.ByteArray;
 import net.i2p.data.DataFormatException;
@@ -403,13 +404,14 @@ class Packet {
      * @throws IllegalStateException if there is data missing or otherwise b0rked
      */
     public int writePacket(byte buffer[], int offset) throws IllegalStateException {
-        return writePacket(buffer, offset, true);
+        return writePacket(buffer, offset, 0);
     }
+
     /**
-     * @param includeSig if true, include the real signature, otherwise put zeroes
-     *                   in its place.
+     * @param fakeSigLen if 0, include the real signature in _optionSignature;
+     *                   if nonzero, leave space for that many bytes
      */
-    private int writePacket(byte buffer[], int offset, boolean includeSig) throws IllegalStateException {
+    private int writePacket(byte buffer[], int offset, int fakeSigLen) throws IllegalStateException {
         int cur = offset;
         DataHelper.toLong(buffer, cur, 4, (_sendStreamId >= 0 ? _sendStreamId : STREAM_ID_UNKNOWN));
         cur += 4;
@@ -443,8 +445,14 @@ class Packet {
             optionSize += _optionFrom.size();
         if (isFlagSet(FLAG_MAX_PACKET_SIZE_INCLUDED))
             optionSize += 2;
-        if (isFlagSet(FLAG_SIGNATURE_INCLUDED))
-            optionSize += Signature.SIGNATURE_BYTES;
+        if (isFlagSet(FLAG_SIGNATURE_INCLUDED)) {
+            if (fakeSigLen > 0)
+                optionSize += fakeSigLen;
+            else if (_optionSignature != null)
+                optionSize += _optionSignature.length();
+            else
+                throw new IllegalStateException();
+        }
         
         DataHelper.toLong(buffer, cur, 2, optionSize);
         cur += 2;
@@ -461,11 +469,14 @@ class Packet {
             cur += 2;
         }
         if (isFlagSet(FLAG_SIGNATURE_INCLUDED)) {
-            if (includeSig)
-                System.arraycopy(_optionSignature.getData(), 0, buffer, cur, Signature.SIGNATURE_BYTES);
-            else // we're signing (or validating)
-                Arrays.fill(buffer, cur, cur+Signature.SIGNATURE_BYTES, (byte)0x0);
-            cur += Signature.SIGNATURE_BYTES;
+            if (fakeSigLen == 0) {
+                // we're signing (or validating)
+                System.arraycopy(_optionSignature.getData(), 0, buffer, cur, _optionSignature.length());
+                cur += _optionSignature.length();
+            } else {
+                Arrays.fill(buffer, cur, cur + fakeSigLen, (byte)0x0);
+                cur += fakeSigLen;
+            }
         }
         
         if (_payload != null) {
@@ -518,7 +529,7 @@ class Packet {
         if (isFlagSet(FLAG_MAX_PACKET_SIZE_INCLUDED))
             size += 2;
         if (isFlagSet(FLAG_SIGNATURE_INCLUDED))
-            size += Signature.SIGNATURE_BYTES;
+            size += _optionSignature.length();
         
         size += 2; // option size
         
@@ -613,12 +624,37 @@ class Packet {
             cur += 2;
         }
         if (isFlagSet(FLAG_SIGNATURE_INCLUDED)) {
-            Signature optionSignature = new Signature();
-            byte buf[] = new byte[Signature.SIGNATURE_BYTES];
-            System.arraycopy(buffer, cur, buf, 0, Signature.SIGNATURE_BYTES);
+            Signature optionSignature;
+            Destination from = getOptionalFrom();
+            if (from != null) {
+                optionSignature = new Signature(from.getSigningPublicKey().getType());
+            } else {
+                // super cheat for now, look for correct type,
+                // assume no more options. If we add to the options
+                // we will have to ask the manager.
+                int siglen = payloadBegin - cur;
+                SigType type = null;
+                for (SigType t : SigType.values()) {
+                    if (t.getSigLen() == siglen) {
+                        type = t;
+                        break;
+                    }
+                }
+                if (type == null) {
+                    if (siglen < Signature.SIGNATURE_BYTES)
+                        throw new IllegalArgumentException("unknown sig type len=" + siglen);
+                    // Hope it's the default type with some unknown options following;
+                    // if not the sig will fail later
+                    type = SigType.DSA_SHA1;
+                    siglen = Signature.SIGNATURE_BYTES;
+                }
+                optionSignature = new Signature(type);
+            }
+            byte buf[] = new byte[optionSignature.length()];
+            System.arraycopy(buffer, cur, buf, 0, buf.length);
             optionSignature.setData(buf);
             setOptionalSignature(optionSignature);
-            cur += Signature.SIGNATURE_BYTES;
+            cur += buf.length;
         }
     }
     
@@ -641,7 +677,7 @@ class Packet {
         
         if (buffer == null)
             buffer = new byte[size];
-        int written = writePacket(buffer, 0, false);
+        int written = writePacket(buffer, 0, from.getSigningPublicKey().getType().getSigLen());
         if (written != size) {
             ctx.logManager().getLog(Packet.class).error("Written " + written + " size " + size + " for " + toString(), new Exception("moo"));
             return false;
@@ -672,14 +708,14 @@ class Packet {
      */
     public int writeSignedPacket(byte buffer[], int offset, I2PAppContext ctx, SigningPrivateKey key) throws IllegalStateException {
         setFlag(FLAG_SIGNATURE_INCLUDED);
-        int size = writePacket(buffer, offset, false);
+        int size = writePacket(buffer, offset, key.getType().getSigLen());
         _optionSignature = ctx.dsa().sign(buffer, offset, size, key);
-        if (false) {
-            Log l = ctx.logManager().getLog(Packet.class);
-            l.error("Signing: " + toString());
-            l.error(Base64.encode(buffer, 0, size));
-            l.error("Signature: " + Base64.encode(_optionSignature.getData()));
-        }
+        //if (false) {
+        //    Log l = ctx.logManager().getLog(Packet.class);
+        //    l.error("Signing: " + toString());
+        //    l.error(Base64.encode(buffer, 0, size));
+        //    l.error("Signature: " + Base64.encode(_optionSignature.getData()));
+        //}
         // jump into the signed data and inject the signature where we 
         // previously placed a bunch of zeroes
         int signatureOffset = offset 
@@ -694,7 +730,7 @@ class Packet {
                               + (isFlagSet(FLAG_DELAY_REQUESTED) ? 2 : 0)
                               + (isFlagSet(FLAG_FROM_INCLUDED) ? _optionFrom.size() : 0)
                               + (isFlagSet(FLAG_MAX_PACKET_SIZE_INCLUDED) ? 2 : 0);
-        System.arraycopy(_optionSignature.getData(), 0, buffer, signatureOffset, Signature.SIGNATURE_BYTES);
+        System.arraycopy(_optionSignature.getData(), 0, buffer, signatureOffset, _optionSignature.length());
         return size;
     }
     
@@ -740,7 +776,7 @@ class Packet {
         if (isFlagSet(FLAG_CLOSE)) buf.append(" CLOSE");
         if (isFlagSet(FLAG_DELAY_REQUESTED)) buf.append(" DELAY ").append(_optionDelay);
         if (isFlagSet(FLAG_ECHO)) buf.append(" ECHO");
-        if (isFlagSet(FLAG_FROM_INCLUDED)) buf.append(" FROM");
+        if (isFlagSet(FLAG_FROM_INCLUDED)) buf.append(" FROM ").append(_optionFrom.size());
         if (isFlagSet(FLAG_MAX_PACKET_SIZE_INCLUDED)) buf.append(" MS ").append(_optionMaxSize);
         if (isFlagSet(FLAG_PROFILE_INTERACTIVE)) buf.append(" INTERACTIVE");
         if (isFlagSet(FLAG_RESET)) buf.append(" RESET");
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketHandler.java
index c40afe453a4b41d38b31c07397f90e5c52fb4afa..1deef1f226531653bb42c980f4dfbe9479bdc987 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketHandler.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketHandler.java
@@ -136,7 +136,7 @@ class PacketHandler {
         if (packet.isFlagSet(Packet.FLAG_ECHO)) {
             if (packet.getSendStreamId() > 0) {
                 if (con.getOptions().getAnswerPings())
-                    receivePing(packet);
+                    receivePing(con, packet);
                 else if (_log.shouldLog(Log.WARN))
                     _log.warn("Dropping Echo packet on existing con: " + packet);
             } else if (packet.getReceiveStreamId() > 0) {
@@ -247,6 +247,8 @@ class PacketHandler {
         reply.setSendStreamId(packet.getReceiveStreamId());
         reply.setReceiveStreamId(packet.getSendStreamId());
         reply.setOptionalFrom(_manager.getSession().getMyDestination());
+        reply.setLocalPort(packet.getLocalPort());
+        reply.setRemotePort(packet.getRemotePort());
         // this just sends the packet - no retries or whatnot
         _manager.getPacketQueue().enqueue(reply);
     }
@@ -255,7 +257,7 @@ class PacketHandler {
         if (packet.isFlagSet(Packet.FLAG_ECHO)) {
             if (packet.getSendStreamId() > 0) {
                 if (_manager.answerPings())
-                    receivePing(packet);
+                    receivePing(null, packet);
                 else if (_log.shouldLog(Log.WARN))
                     _log.warn("Dropping Echo packet on unknown con: " + packet);
             } else if (packet.getReceiveStreamId() > 0) {
@@ -335,7 +337,10 @@ class PacketHandler {
         }
     }
     
-    private void receivePing(Packet packet) {
+    /**
+     *  @param con null if unknown
+     */
+    private void receivePing(Connection con, Packet packet) {
         boolean ok = packet.verifySignature(_context, packet.getOptionalFrom(), null);
         if (!ok) {
             if (_log.shouldLog(Log.WARN)) {
@@ -348,10 +353,7 @@ class PacketHandler {
                               + " sig=" + packet.getOptionalSignature().toBase64() + ")");
             }
         } else {
-            PacketLocal pong = new PacketLocal(_context, packet.getOptionalFrom());
-            pong.setFlag(Packet.FLAG_ECHO | Packet.FLAG_NO_ACK);
-            pong.setReceiveStreamId(packet.getSendStreamId());
-            _manager.getPacketQueue().enqueue(pong);
+            _manager.receivePing(con, packet);
         }
     }
     
diff --git a/apps/susidns/locale/messages_en.po b/apps/susidns/locale/messages_en.po
index e7b26754900c7c48e022d1c488705cd05c39c84a..a1d1d3b595d08c7a6e10af5bac0a394498acddd8 100644
--- a/apps/susidns/locale/messages_en.po
+++ b/apps/susidns/locale/messages_en.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P susidns\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-01-09 19:27+0000\n"
+"POT-Creation-Date: 2014-02-06 18:27+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"
@@ -628,8 +628,8 @@ msgstr ""
 
 #: ../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\" target=\"_top\">the overview on www.i2p2.i2p</a>."
+"For more information on naming in I2P, see <a href=\"http://i2p-projekt.i2p/"
+"naming.html\" target=\"_top\">the overview</a>."
 msgstr ""
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:142
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java
index 24289f903e9139a346f1f5e49878f35d24284aa6..70b29e72fa0b9f6df7b81e3aef21c0adeeb25f17 100644
--- a/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java
+++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 import java.util.Properties;
 
 import net.i2p.I2PAppContext;
+import net.i2p.crypto.SigType;
 import net.i2p.data.Base32;
 import net.i2p.data.Base64;
 import net.i2p.data.Certificate;
@@ -228,11 +229,38 @@ public class AddressBean
 				return _("Hidden");
 			case Certificate.CERTIFICATE_TYPE_SIGNED:
 				return _("Signed");
+			case Certificate.CERTIFICATE_TYPE_KEY:
+				return _("Key");
 			default:
 				return _("Type {0}", type);
 		}
 	}
 
+	/**
+	 * Do this the easy way
+	 * @since 0.9.12
+	 */
+	public String getSigType() {
+		// (4 / 3) * (pubkey length + signing key length)
+		String cert = destination.substring(512);
+		if (cert.equals("AAAA"))
+			return _("DSA 1024 bit");
+		byte[] enc = Base64.decode(cert);
+		if (enc == null)
+			// shouldn't happen
+			return "invalid";
+		int type = enc[0] & 0xff;
+		if (type != Certificate.CERTIFICATE_TYPE_KEY)
+			return _("DSA 1024 bit");
+		int st = ((enc[3] & 0xff) << 8) | (enc[4] & 0xff);
+		if (st == 0)
+			return _("DSA 1024 bit");
+		SigType stype = SigType.getByCode(st);
+                if (stype == null)
+			return _("Type {0}", st);
+                return stype.toString();
+	}
+
 	/** @since 0.8.7 */
 	private String getProp(String p) {
 		if (props == null)
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/Messages.java b/apps/susidns/src/java/src/i2p/susi/dns/Messages.java
index f1dba7653f618d201e8583ebd1ce32d6be1fc618..99aa07c0f5b2c1795472de635259557235bb1631 100644
--- a/apps/susidns/src/java/src/i2p/susi/dns/Messages.java
+++ b/apps/susidns/src/java/src/i2p/susi/dns/Messages.java
@@ -20,6 +20,11 @@ public class Messages {
         return Translate.getString(key, _context, BUNDLE_NAME);
     }
 
+    /** @since 0.9.11 */
+    public String _(String key, Object o) {
+        return Translate.getString(key, o, _context, BUNDLE_NAME);
+    }
+
     public static String getString(String s) {
         return Translate.getString(s, I2PAppContext.getGlobalContext(), BUNDLE_NAME);
     }
diff --git a/apps/susidns/src/jsp/config.jsp b/apps/susidns/src/jsp/config.jsp
index 03cc9b0a32a6ed7bc74777f858bbc46d6ceff2c9..8afd6a86de94d4b786c813d654f1e213368cd4dd 100644
--- a/apps/susidns/src/jsp/config.jsp
+++ b/apps/susidns/src/jsp/config.jsp
@@ -31,7 +31,6 @@
 
 %>
 <%@page pageEncoding="UTF-8"%>
-<%@page trimDirectiveWhitespaces="true"%>
 <%@ page contentType="text/html" %>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application"/>
diff --git a/apps/susidns/src/jsp/details.jsp b/apps/susidns/src/jsp/details.jsp
index 2c657f7c2386af7c441c62ecdc349f67152f73df..d5d6256414a32bf065e745d7e4ed505cfba9710c 100644
--- a/apps/susidns/src/jsp/details.jsp
+++ b/apps/susidns/src/jsp/details.jsp
@@ -107,7 +107,7 @@
 <td><%=intl._("ElGamal 2048 bit")%></td>
 </tr><tr class="list${book.trClass}">
 <td><%=intl._("Signing Key")%></td>
-<td><%=intl._("DSA 1024 bit")%></td>
+<td><%=addr.getSigType()%></td>
 </tr><tr class="list${book.trClass}">
 <td><%=intl._("Certificate")%></td>
 <td><%=addr.getCert()%></td>
diff --git a/apps/susidns/src/jsp/index.jsp b/apps/susidns/src/jsp/index.jsp
index 2b10abe9eb1fe8e0dab831049da7224029ecbf19..7023d080f36bdfc0cc9f84cee500bd3ce8750c04 100644
--- a/apps/susidns/src/jsp/index.jsp
+++ b/apps/susidns/src/jsp/index.jsp
@@ -31,7 +31,6 @@
 
 %>
 <%@page pageEncoding="UTF-8"%>
-<%@page trimDirectiveWhitespaces="true"%>
 <%@ page contentType="text/html"%>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 <jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" />
@@ -70,7 +69,7 @@
 <%=intl._("It regularly updates your hosts.txt file from distributed sources or \"subscriptions\".")%>
 </p>
 <p>
-<%=intl._("In the default configuration, the address book is only subscribed to www.i2p2.i2p.")%>
+<%=intl._("In the default configuration, the address book is only subscribed to {0}.", "i2p-projekt.i2p")%>
 <%=intl._("Subscribing to additional sites is easy, just add them to your <a href=\"subscriptions\">subscriptions</a> file.")%>
 </p>
 <p>
diff --git a/apps/susidns/src/jsp/subscriptions.jsp b/apps/susidns/src/jsp/subscriptions.jsp
index 88807125d9c595ff7d1b186ebe6ee3fa10085cb2..afc572f4282df6d26485ea652fca864094fe4f50 100644
--- a/apps/susidns/src/jsp/subscriptions.jsp
+++ b/apps/susidns/src/jsp/subscriptions.jsp
@@ -31,7 +31,6 @@
 
 %>
 <%@page pageEncoding="UTF-8"%>
-<%@page trimDirectiveWhitespaces="true"%>
 <%@ page contentType="text/html"%>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 <jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" />
@@ -81,9 +80,9 @@
 <%=intl._("The subscription file contains a list of i2p URLs.")%>
 <%=intl._("The addressbook application regularly checks this list for new eepsites.")%>
 <%=intl._("Those URLs refer to published hosts.txt files.")%>
-<%=intl._("The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently.")%>
+<%=intl._("The default subscription is the hosts.txt from {0}, which is updated infrequently.", "i2p-projekt.i2p")%>
 <%=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" target="_top"><%=intl._("See the FAQ for a list of subscription URLs.")%></a>
+<a href="http://i2p-projekt.i2p/faq.html#subscriptions" target="_top"><%=intl._("See the FAQ for a list of subscription URLs.")%></a>
 </p>
 </div>
 <div id="footer">
diff --git a/apps/susimail/locale/messages_pt.po b/apps/susimail/locale/messages_pt.po
index 8ad761d5bf78791c7a474f9bec6b63cf9e82f32c..d8e2ca0eb2e91f106ffc6d4a0546a64071f6455c 100644
--- a/apps/susimail/locale/messages_pt.po
+++ b/apps/susimail/locale/messages_pt.po
@@ -2,226 +2,223 @@
 # Copyright (C) 2009 The I2P Project
 # This file is distributed under the same license as the susimail package.
 # To contribute translations, see http://www.i2p2.de/newdevelopers
-#
+# 
 # Translators:
+# kgtm <fabio.h.f.antunes@gmail.com>, 2014
 # tuliouel, 2013
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-08-11 15:44+0000\n"
-"PO-Revision-Date: 2013-07-04 19:06+0000\n"
-"Last-Translator: tuliouel\n"
-"Language-Team: Portuguese (http://www.transifex.com/projects/p/I2P/language/"
-"pt/)\n"
-"Language: pt\n"
+"POT-Creation-Date: 2014-01-09 19:27+0000\n"
+"PO-Revision-Date: 2014-01-22 18:41+0000\n"
+"Last-Translator: kgtm <fabio.h.f.antunes@gmail.com>\n"
+"Language-Team: Portuguese (http://www.transifex.com/projects/p/I2P/language/pt/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: pt\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/src/i2p/susi/webmail/WebMail.java:447
+#: src/src/i2p/susi/webmail/WebMail.java:443
 msgid "unknown"
 msgstr "desconhecido"
 
-#: src/src/i2p/susi/webmail/WebMail.java:466
+#: src/src/i2p/susi/webmail/WebMail.java:462
 msgid "Warning: no transfer encoding found, fallback to 7bit."
-msgstr ""
-"Aviso: nenhuma codificação de conteúdo de transferência encontrada. Recorrer "
-"para 7bit."
+msgstr "Aviso: nenhuma codificação de conteúdo de transferência encontrada. Recorrer para 7bit."
 
-#: src/src/i2p/susi/webmail/WebMail.java:471
+#: src/src/i2p/susi/webmail/WebMail.java:467
 #, java-format
 msgid "No encoder found for encoding \\''{0}\\''."
 msgstr "Nenhum codificador encontrado para codificar ''{0}\\''."
 
-#: src/src/i2p/susi/webmail/WebMail.java:477
+#: src/src/i2p/susi/webmail/WebMail.java:473
 msgid "Warning: no charset found, fallback to US-ASCII."
-msgstr ""
-"Aviso: nenhuma codificação de caracteres encontrada. Recorrer ao US-ASCII."
+msgstr "Aviso: nenhuma codificação de caracteres encontrada. Recorrer ao US-ASCII."
 
-#: src/src/i2p/susi/webmail/WebMail.java:491
+#: src/src/i2p/susi/webmail/WebMail.java:487
 #, java-format
 msgid "Charset \\''{0}\\'' not supported."
 msgstr "Codificação de caracteres \\''{0}\\'' não admitida."
 
-#: src/src/i2p/susi/webmail/WebMail.java:495
+#: src/src/i2p/susi/webmail/WebMail.java:491
 #, java-format
 msgid "Part ({0}) not shown, because of {1}"
 msgstr "Parte ({0}) não exibida por causa de {1}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:518
+#: src/src/i2p/susi/webmail/WebMail.java:514
 msgid "Download"
 msgstr "Baixar"
 
-#: src/src/i2p/susi/webmail/WebMail.java:518
+#: src/src/i2p/susi/webmail/WebMail.java:514
 msgid "File is packed into a zipfile for security reasons."
 msgstr "Arquivo zipado por razões de segurança."
 
-#: src/src/i2p/susi/webmail/WebMail.java:518
+#: src/src/i2p/susi/webmail/WebMail.java:514
 #, java-format
 msgid "attachment ({0})."
 msgstr "Anexo ({0})."
 
-#: src/src/i2p/susi/webmail/WebMail.java:522
+#: src/src/i2p/susi/webmail/WebMail.java:518
 #, java-format
 msgid "Attachment ({0})."
 msgstr "Anexo ({0})."
 
-#: src/src/i2p/susi/webmail/WebMail.java:572
+#: src/src/i2p/susi/webmail/WebMail.java:568
 msgid "Need username for authentication."
 msgstr "Necessário nome de usuário para autenticação."
 
-#: src/src/i2p/susi/webmail/WebMail.java:576
+#: src/src/i2p/susi/webmail/WebMail.java:572
 msgid "Need password for authentication."
 msgstr "Nova senha para autenticação."
 
-#: src/src/i2p/susi/webmail/WebMail.java:580
+#: src/src/i2p/susi/webmail/WebMail.java:576
 msgid "Need hostname for connect."
 msgstr "Necessário nome do host para conectar."
 
-#: src/src/i2p/susi/webmail/WebMail.java:585
+#: src/src/i2p/susi/webmail/WebMail.java:581
 msgid "Need port number for pop3 connect."
 msgstr "Necessário número de porta para conectar por pop3."
 
-#: src/src/i2p/susi/webmail/WebMail.java:592
+#: src/src/i2p/susi/webmail/WebMail.java:588
 msgid "POP3 port number is not in range 0..65535."
 msgstr "O número da porta do POP3 não pertence ao intervalo 0..65535."
 
-#: src/src/i2p/susi/webmail/WebMail.java:598
+#: src/src/i2p/susi/webmail/WebMail.java:594
 msgid "POP3 port number is invalid."
 msgstr "Número da porta do POP3 é inválido."
 
-#: src/src/i2p/susi/webmail/WebMail.java:604
+#: src/src/i2p/susi/webmail/WebMail.java:600
 msgid "Need port number for smtp connect."
 msgstr "Necessário número da porta para conectar por smtp."
 
-#: src/src/i2p/susi/webmail/WebMail.java:611
+#: src/src/i2p/susi/webmail/WebMail.java:607
 msgid "SMTP port number is not in range 0..65535."
 msgstr "O número da porta do SMTP não pertence ao intervalo 0..65535."
 
-#: src/src/i2p/susi/webmail/WebMail.java:617
+#: src/src/i2p/susi/webmail/WebMail.java:613
 msgid "SMTP port number is invalid."
 msgstr "Número da porta do SMTP é inválido."
 
-#: src/src/i2p/susi/webmail/WebMail.java:664
+#: src/src/i2p/susi/webmail/WebMail.java:660
 msgid "User logged out."
 msgstr "Usuário se desconectou."
 
-#: src/src/i2p/susi/webmail/WebMail.java:668
+#: src/src/i2p/susi/webmail/WebMail.java:664
 msgid "Internal error, lost connection."
 msgstr "Erro interno. Conexão perdida."
 
-#: src/src/i2p/susi/webmail/WebMail.java:764
+#: src/src/i2p/susi/webmail/WebMail.java:760
 #, java-format
 msgid "On {0} {1} wrote:"
 msgstr "Em {0} {1} escreveu:"
 
-#: src/src/i2p/susi/webmail/WebMail.java:811
+#: src/src/i2p/susi/webmail/WebMail.java:807
 msgid "begin forwarded mail"
 msgstr "Início da mensagem encaminhada"
 
-#: src/src/i2p/susi/webmail/WebMail.java:833
+#: src/src/i2p/susi/webmail/WebMail.java:829
 msgid "end forwarded mail"
 msgstr "fim da mensagem encaminhada"
 
-#: src/src/i2p/susi/webmail/WebMail.java:840
-#: src/src/i2p/susi/webmail/WebMail.java:1770
+#: src/src/i2p/susi/webmail/WebMail.java:836
+#: src/src/i2p/susi/webmail/WebMail.java:1769
 msgid "Could not fetch mail body."
 msgstr "Não foi possível recuperar o corpo do e-mail."
 
-#: src/src/i2p/susi/webmail/WebMail.java:868
+#: src/src/i2p/susi/webmail/WebMail.java:864
 msgid "Message id not valid."
 msgstr "ID da mensagem não é válido."
 
-#: src/src/i2p/susi/webmail/WebMail.java:951
+#: src/src/i2p/susi/webmail/WebMail.java:947
 #, java-format
 msgid "No Encoding found for {0}"
 msgstr "Nenhuma codificação encontrada para {0}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:955
+#: src/src/i2p/susi/webmail/WebMail.java:951
 #, java-format
 msgid "Could not encode data: {0}"
 msgstr "Não foi possível codificar datos: {0}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:960
+#: src/src/i2p/susi/webmail/WebMail.java:956
 #, java-format
 msgid "Error reading uploaded file: {0}"
 msgstr "Erro ao ler arquivo enviado: {0}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1038
+#: src/src/i2p/susi/webmail/WebMail.java:1034
 msgid "Error parsing download parameter."
 msgstr "Erro ao analisar parâmetro de download."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1082
+#: src/src/i2p/susi/webmail/WebMail.java:1078
 msgid "Invalid pagesize number, resetting to default value."
 msgstr "Número inválido de tamanho de página, restituindo ao valor original."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1106
+#: src/src/i2p/susi/webmail/WebMail.java:1102
 msgid "No messages marked for deletion."
 msgstr "Nenhuma mensagem marcada para eliminação."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1126
+#: src/src/i2p/susi/webmail/WebMail.java:1122
 #, java-format
 msgid "Error deleting message: {0}"
 msgstr "Erro ao eliminar mensagem: {0}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1137
+#: src/src/i2p/susi/webmail/WebMail.java:1133
 #, java-format
 msgid "1 message deleted."
 msgid_plural "{0} messages deleted."
 msgstr[0] "Uma mensagem eliminada"
 msgstr[1] "{0} mensagens eliminadas."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1313
-#: src/src/i2p/susi/webmail/WebMail.java:1654
+#: src/src/i2p/susi/webmail/WebMail.java:1314
+#: src/src/i2p/susi/webmail/WebMail.java:1653
 msgid "Login"
 msgstr "Entrar"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1315
+#: src/src/i2p/susi/webmail/WebMail.java:1316
 #, java-format
 msgid "1 Message"
 msgid_plural "{0} Messages"
 msgstr[0] "Uma mensagem"
 msgstr[1] "{0} Mensagens"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1317
+#: src/src/i2p/susi/webmail/WebMail.java:1318
 msgid "Show Message"
 msgstr "Exibir Mensagem"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1383
+#: src/src/i2p/susi/webmail/WebMail.java:1384
 #, java-format
 msgid "Error decoding content: {0}"
 msgstr "Erro ao decodificar conteúdo: {0}"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1388
+#: src/src/i2p/susi/webmail/WebMail.java:1389
 msgid "Error decoding content: No encoder found."
 msgstr "Erro ao decodificar conteúdo: Nenhum codificador encontrado."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1435
+#: src/src/i2p/susi/webmail/WebMail.java:1436
 msgid "no subject"
 msgstr "sem assunto"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1452
+#: src/src/i2p/susi/webmail/WebMail.java:1453
 msgid "Found no valid sender address."
 msgstr "Nenhum endereço válido de remetente encontrado."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1458
+#: src/src/i2p/susi/webmail/WebMail.java:1459
 #, java-format
 msgid "Found no valid address in \\''{0}\\''."
 msgstr "Nenhum endereço válido encontrado em \\''{0}\\''."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1477
+#: src/src/i2p/susi/webmail/WebMail.java:1478
 msgid "No recipients found."
 msgstr "Nenhum destinatário encontrado."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1484
+#: src/src/i2p/susi/webmail/WebMail.java:1485
 msgid "Quoted printable encoder not available."
-msgstr ""
+msgstr "Codificação de caracteres ASCII imprimíveis não disponível."
 
-#: src/src/i2p/susi/webmail/WebMail.java:1489
+#: src/src/i2p/susi/webmail/WebMail.java:1490
 msgid "Header line encoder not available."
-msgstr ""
+msgstr "Cabeçalho da codificação de caracteres não disponível."
 
 #: src/src/i2p/susi/webmail/WebMail.java:1540
 msgid "Mail sent."
@@ -240,19 +237,19 @@ msgid "Delete Attachment"
 msgstr "Apagar anexo"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1582
-#: src/src/i2p/susi/webmail/WebMail.java:1676
-#: src/src/i2p/susi/webmail/WebMail.java:1757
+#: src/src/i2p/susi/webmail/WebMail.java:1675
+#: src/src/i2p/susi/webmail/WebMail.java:1756
 msgid "Reload Config"
 msgstr "Recarregar Configurações"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1583
-#: src/src/i2p/susi/webmail/WebMail.java:1677
-#: src/src/i2p/susi/webmail/WebMail.java:1758
+#: src/src/i2p/susi/webmail/WebMail.java:1676
+#: src/src/i2p/susi/webmail/WebMail.java:1757
 msgid "Logout"
 msgstr "Desconectar"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1606
-#: src/src/i2p/susi/webmail/WebMail.java:1762
+#: src/src/i2p/susi/webmail/WebMail.java:1761
 msgid "From:"
 msgstr "De:"
 
@@ -269,7 +266,7 @@ msgid "Bcc:"
 msgstr "Cópia Oculta:"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1610
-#: src/src/i2p/susi/webmail/WebMail.java:1764
+#: src/src/i2p/susi/webmail/WebMail.java:1763
 msgid "Subject:"
 msgstr "Assunto:"
 
@@ -290,161 +287,161 @@ msgid "Attachments:"
 msgstr "Anexos:"
 
 #. current postman hq length limits 16/12, new postman version 32/32
-#: src/src/i2p/susi/webmail/WebMail.java:1643
+#: src/src/i2p/susi/webmail/WebMail.java:1642
 msgid "User"
 msgstr "Usuário"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1644
+#: src/src/i2p/susi/webmail/WebMail.java:1643
 msgid "Password"
 msgstr "Senha"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1649
+#: src/src/i2p/susi/webmail/WebMail.java:1648
 msgid "Host"
 msgstr "Servidor"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1650
+#: src/src/i2p/susi/webmail/WebMail.java:1649
 msgid "POP3-Port"
 msgstr "Porta-POP3"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1651
+#: src/src/i2p/susi/webmail/WebMail.java:1650
 msgid "SMTP-Port"
 msgstr "Porta-SMTP"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1654
+#: src/src/i2p/susi/webmail/WebMail.java:1653
 msgid "Reset"
 msgstr "Reiniciar"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1655
+#: src/src/i2p/susi/webmail/WebMail.java:1654
 msgid "Learn about I2P mail"
 msgstr "Aprenda sobre o e-mail do I2P"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1656
+#: src/src/i2p/susi/webmail/WebMail.java:1655
 msgid "Create Account"
 msgstr "Criar Conta"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1668
+#: src/src/i2p/susi/webmail/WebMail.java:1667
 msgid "Really delete the marked messages?"
 msgstr "Eliminar, realmente, as mensagens marcadas?"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1668
+#: src/src/i2p/susi/webmail/WebMail.java:1667
 msgid "Yes, really delete them!"
 msgstr "Sim, realmente elimine-as!"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1670
-#: src/src/i2p/susi/webmail/WebMail.java:1749
+#: src/src/i2p/susi/webmail/WebMail.java:1669
+#: src/src/i2p/susi/webmail/WebMail.java:1748
 msgid "New"
 msgstr "Novo"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1671
-#: src/src/i2p/susi/webmail/WebMail.java:1750
+#: src/src/i2p/susi/webmail/WebMail.java:1670
+#: src/src/i2p/susi/webmail/WebMail.java:1749
 msgid "Reply"
 msgstr "Responder"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1672
-#: src/src/i2p/susi/webmail/WebMail.java:1751
+#: src/src/i2p/susi/webmail/WebMail.java:1671
+#: src/src/i2p/susi/webmail/WebMail.java:1750
 msgid "Reply All"
 msgstr "Responder a todos"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1673
-#: src/src/i2p/susi/webmail/WebMail.java:1752
+#: src/src/i2p/susi/webmail/WebMail.java:1672
+#: src/src/i2p/susi/webmail/WebMail.java:1751
 msgid "Forward"
 msgstr "Encaminhar"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1674
-#: src/src/i2p/susi/webmail/WebMail.java:1753
+#: src/src/i2p/susi/webmail/WebMail.java:1673
+#: src/src/i2p/susi/webmail/WebMail.java:1752
 msgid "Delete"
 msgstr "Eliminar"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1675
+#: src/src/i2p/susi/webmail/WebMail.java:1674
 msgid "Check Mail"
 msgstr "Verificar e-mail"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1679
+#: src/src/i2p/susi/webmail/WebMail.java:1678
 msgid "Sender"
 msgstr "Remetente"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1680
+#: src/src/i2p/susi/webmail/WebMail.java:1679
 msgid "Subject"
 msgstr "Assunto"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1681
+#: src/src/i2p/susi/webmail/WebMail.java:1680
 msgid "Date"
 msgstr "Data"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1682
+#: src/src/i2p/susi/webmail/WebMail.java:1681
 msgid "Size"
 msgstr "Tamanho"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1708
+#: src/src/i2p/susi/webmail/WebMail.java:1707
 #, java-format
 msgid "1 Byte"
 msgid_plural "{0} Bytes"
 msgstr[0] "1 Byte"
 msgstr[1] "{0} Bytes"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1713
+#: src/src/i2p/susi/webmail/WebMail.java:1712
 msgid "Mark All"
 msgstr "Marcar todos"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1714
+#: src/src/i2p/susi/webmail/WebMail.java:1713
 msgid "Invert Selection"
 msgstr "Inverter Seleção"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1715
+#: src/src/i2p/susi/webmail/WebMail.java:1714
 msgid "Clear"
 msgstr "Apagar"
 
+#: src/src/i2p/susi/webmail/WebMail.java:1717
 #: src/src/i2p/susi/webmail/WebMail.java:1718
-#: src/src/i2p/susi/webmail/WebMail.java:1719
 msgid "First"
 msgstr "Primeiro"
 
+#: src/src/i2p/susi/webmail/WebMail.java:1717
 #: src/src/i2p/susi/webmail/WebMail.java:1718
-#: src/src/i2p/susi/webmail/WebMail.java:1719
-#: src/src/i2p/susi/webmail/WebMail.java:1754
+#: src/src/i2p/susi/webmail/WebMail.java:1753
 msgid "Previous"
 msgstr "Anterior"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1720
+#: src/src/i2p/susi/webmail/WebMail.java:1719
 #, java-format
 msgid "Page {0} of {1}"
 msgstr "Página {0} de {1}"
 
+#: src/src/i2p/susi/webmail/WebMail.java:1721
 #: src/src/i2p/susi/webmail/WebMail.java:1722
-#: src/src/i2p/susi/webmail/WebMail.java:1723
 msgid "Last"
 msgstr "Última"
 
+#: src/src/i2p/susi/webmail/WebMail.java:1721
 #: src/src/i2p/susi/webmail/WebMail.java:1722
-#: src/src/i2p/susi/webmail/WebMail.java:1723
-#: src/src/i2p/susi/webmail/WebMail.java:1755
+#: src/src/i2p/susi/webmail/WebMail.java:1754
 msgid "Next"
 msgstr "Próxima"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1726
+#: src/src/i2p/susi/webmail/WebMail.java:1725
 msgid "Pagesize:"
 msgstr "Tamanho da página:"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1727
+#: src/src/i2p/susi/webmail/WebMail.java:1726
 msgid "Set"
-msgstr ""
+msgstr "Definir"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1737
+#: src/src/i2p/susi/webmail/WebMail.java:1736
 msgid "Really delete this message?"
 msgstr "Eliminar, realmente, esta mensagem?"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1737
+#: src/src/i2p/susi/webmail/WebMail.java:1736
 msgid "Yes, really delete it!"
 msgstr "Sim, realmente elimine-a!"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1756
+#: src/src/i2p/susi/webmail/WebMail.java:1755
 msgid "Back to Folder"
 msgstr "Voltar à Pasta"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1763
+#: src/src/i2p/susi/webmail/WebMail.java:1762
 msgid "Date:"
 msgstr "Data:"
 
-#: src/src/i2p/susi/webmail/WebMail.java:1774
+#: src/src/i2p/susi/webmail/WebMail.java:1773
 msgid "Could not fetch mail."
 msgstr "Não foi possível recuperar o e-mail."
diff --git a/apps/susimail/locale/messages_pt_BR.po b/apps/susimail/locale/messages_pt_BR.po
index 5b89c199ccee5bf4f047fb0eaa91adaa8e451654..ac335dfceda7dcb80155dc23e3775cbc95010dc7 100644
--- a/apps/susimail/locale/messages_pt_BR.po
+++ b/apps/susimail/locale/messages_pt_BR.po
@@ -2,23 +2,22 @@
 # Copyright (C) 2009 The I2P Project
 # This file is distributed under the same license as the susimail package.
 # To contribute translations, see http://www.i2p2.de/newdevelopers
-#
+# 
 # Translators:
 # blueboy, 2013
-# blueboy, 2013
+# blueboy, 2013-2014
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-01-09 18:16+0000\n"
-"PO-Revision-Date: 2013-11-24 16:35+0000\n"
+"POT-Creation-Date: 2014-01-09 19:27+0000\n"
+"PO-Revision-Date: 2014-02-04 20:01+0000\n"
 "Last-Translator: blueboy\n"
-"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/"
-"language/pt_BR/)\n"
-"Language: pt_BR\n"
+"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: pt_BR\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 #: src/src/i2p/susi/webmail/WebMail.java:443
@@ -32,11 +31,11 @@ msgstr ""
 #: src/src/i2p/susi/webmail/WebMail.java:467
 #, java-format
 msgid "No encoder found for encoding \\''{0}\\''."
-msgstr ""
+msgstr "Nenhum codificador foi encontrado para codificar \\''{0}\\''."
 
 #: src/src/i2p/susi/webmail/WebMail.java:473
 msgid "Warning: no charset found, fallback to US-ASCII."
-msgstr ""
+msgstr "Aviso: Nenhum conjunto de caractéres foi encontrado. Usando US-ASCII."
 
 #: src/src/i2p/susi/webmail/WebMail.java:487
 #, java-format
@@ -46,7 +45,7 @@ msgstr "O conjunto de caractéres \\''{0}\\'' não é suportado."
 #: src/src/i2p/susi/webmail/WebMail.java:491
 #, java-format
 msgid "Part ({0}) not shown, because of {1}"
-msgstr ""
+msgstr "Parte ({0}) não exibida por causa de {1}"
 
 #: src/src/i2p/susi/webmail/WebMail.java:514
 msgid "Download"
@@ -59,12 +58,12 @@ msgstr "Por questões de segurança, o arquivo está zipado."
 #: src/src/i2p/susi/webmail/WebMail.java:514
 #, java-format
 msgid "attachment ({0})."
-msgstr ""
+msgstr "anexo ({0})."
 
 #: src/src/i2p/susi/webmail/WebMail.java:518
 #, java-format
 msgid "Attachment ({0})."
-msgstr ""
+msgstr "Anexo ({0})."
 
 #: src/src/i2p/susi/webmail/WebMail.java:568
 msgid "Need username for authentication."
@@ -84,11 +83,11 @@ msgstr "É necessário fornecer o número da porta para o POP3 conectar."
 
 #: src/src/i2p/susi/webmail/WebMail.java:588
 msgid "POP3 port number is not in range 0..65535."
-msgstr "O número da porta do POP3 não se inclui na faixa 0..65535."
+msgstr "O número da porta POP3 não se inclui na faixa 0..65535."
 
 #: src/src/i2p/susi/webmail/WebMail.java:594
 msgid "POP3 port number is invalid."
-msgstr "Número de porta para o POP3 inválido."
+msgstr "O número da porta POP3 é inválido."
 
 #: src/src/i2p/susi/webmail/WebMail.java:600
 msgid "Need port number for smtp connect."
@@ -96,11 +95,11 @@ msgstr "É necessário fornecer o número da porta para o SMTP conectar."
 
 #: src/src/i2p/susi/webmail/WebMail.java:607
 msgid "SMTP port number is not in range 0..65535."
-msgstr "O número da porta do SMTP não se inclui na faixa 0..65535."
+msgstr "O número da porta SMTP não se inclui na faixa 0..65535."
 
 #: src/src/i2p/susi/webmail/WebMail.java:613
 msgid "SMTP port number is invalid."
-msgstr "Número de porta para o SMTP inválido."
+msgstr "O número da porta SMTP é inválido."
 
 #: src/src/i2p/susi/webmail/WebMail.java:660
 msgid "User logged out."
@@ -126,7 +125,7 @@ msgstr ""
 #: src/src/i2p/susi/webmail/WebMail.java:836
 #: src/src/i2p/susi/webmail/WebMail.java:1769
 msgid "Could not fetch mail body."
-msgstr ""
+msgstr "Não foi possível recuperar o corpo da mensagem."
 
 #: src/src/i2p/susi/webmail/WebMail.java:864
 msgid "Message id not valid."
@@ -145,11 +144,11 @@ msgstr "Não foi possível codificar os dados: {0}"
 #: src/src/i2p/susi/webmail/WebMail.java:956
 #, java-format
 msgid "Error reading uploaded file: {0}"
-msgstr ""
+msgstr "Erro ao ler arquivo carregado: {0}"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1034
 msgid "Error parsing download parameter."
-msgstr ""
+msgstr "Erro ao analisar parâmetro de download."
 
 #: src/src/i2p/susi/webmail/WebMail.java:1078
 msgid "Invalid pagesize number, resetting to default value."
@@ -174,7 +173,7 @@ msgstr[1] "{0} mensagens deletadas."
 #: src/src/i2p/susi/webmail/WebMail.java:1314
 #: src/src/i2p/susi/webmail/WebMail.java:1653
 msgid "Login"
-msgstr ""
+msgstr "Login"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1316
 #, java-format
@@ -235,13 +234,13 @@ msgstr "Cancelar"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1581
 msgid "Delete Attachment"
-msgstr ""
+msgstr "Deletar anexo"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1582
 #: src/src/i2p/susi/webmail/WebMail.java:1675
 #: src/src/i2p/susi/webmail/WebMail.java:1756
 msgid "Reload Config"
-msgstr ""
+msgstr "Recarregar configurações"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1583
 #: src/src/i2p/susi/webmail/WebMail.java:1676
@@ -277,7 +276,7 @@ msgstr ""
 
 #: src/src/i2p/susi/webmail/WebMail.java:1614
 msgid "New Attachment:"
-msgstr ""
+msgstr "Novo anexo:"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1614
 msgid "Upload File"
@@ -285,7 +284,7 @@ msgstr "Carregar arquivo"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1620
 msgid "Attachments:"
-msgstr ""
+msgstr "Anexos:"
 
 #. current postman hq length limits 16/12, new postman version 32/32
 #: src/src/i2p/susi/webmail/WebMail.java:1642
@@ -298,23 +297,23 @@ msgstr "Senha"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1648
 msgid "Host"
-msgstr ""
+msgstr "Host"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1649
 msgid "POP3-Port"
-msgstr "Porta do POP3"
+msgstr "Porta POP3"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1650
 msgid "SMTP-Port"
-msgstr "Porta do SMTP"
+msgstr "Porta SMTP"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1653
 msgid "Reset"
-msgstr ""
+msgstr "Resetar"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1654
 msgid "Learn about I2P mail"
-msgstr ""
+msgstr "Conheça o correio da rede I2P"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1655
 msgid "Create Account"
@@ -326,7 +325,7 @@ msgstr "Quer mesmo deletar as mensagens marcadas?"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1667
 msgid "Yes, really delete them!"
-msgstr "Sim, quero deletá-los!"
+msgstr "Sim, quero deletá-las!"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1669
 #: src/src/i2p/susi/webmail/WebMail.java:1748
@@ -401,7 +400,7 @@ msgstr "Primeiro"
 #: src/src/i2p/susi/webmail/WebMail.java:1718
 #: src/src/i2p/susi/webmail/WebMail.java:1753
 msgid "Previous"
-msgstr ""
+msgstr "Anterior"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1719
 #, java-format
@@ -437,7 +436,7 @@ msgstr "Sim, quero deletá-lo!"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1755
 msgid "Back to Folder"
-msgstr ""
+msgstr "Voltar para pasta"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1762
 msgid "Date:"
@@ -445,4 +444,4 @@ msgstr "Data:"
 
 #: src/src/i2p/susi/webmail/WebMail.java:1773
 msgid "Could not fetch mail."
-msgstr ""
+msgstr "Não foi possível recuperar o correio."
diff --git a/build.xml b/build.xml
index 432434a664e7da2030049a9bb817952acb358f48..c11ff6f130c337138a7189e6ca9295cf79b23474 100644
--- a/build.xml
+++ b/build.xml
@@ -448,7 +448,11 @@
         <ant dir="installer/resources/locale" target="poupdate" />
     </target>
 
-    <target name="prep-script-translation" >
+    <condition property="no.bundle">
+        <isfalse value="${require.gettext}" />
+    </condition>
+
+    <target name="prep-script-translation" unless="no.bundle" >
         <!-- script translation added in 0.8.13, enabled in 0.9.5. -->
         <ant dir="installer/resources/locale" target="bundle" />
         <copy todir="pkg-temp/locale/">
@@ -467,7 +471,7 @@
             splitindex="true"
             doctitle="I2P Javadocs for Release ${release.number} Build ${i2p.build.number}${build.extra}"
             windowtitle="I2P Anonymous Network - Java Documentation - Version ${release.number}">
-            <group title="Core SDK (i2p.jar)" packages="net.i2p:net.i2p.*:net.i2p.client:net.i2p.client.*:net.i2p.internal:net.i2p.internal.*:freenet.support.CPUInformation:org.bouncycastle.oldcrypto:org.bouncycastle.oldcrypto.*:gnu.crypto.*:gnu.gettext:com.nettgryppa.security:net.metanotion:net.metanotion.*" />
+            <group title="Core SDK (i2p.jar)" packages="net.i2p:net.i2p.*:net.i2p.client:net.i2p.client.*:net.i2p.internal:net.i2p.internal.*:freenet.support.CPUInformation:org.bouncycastle.oldcrypto:org.bouncycastle.oldcrypto.*:gnu.crypto.*:gnu.getopt:gnu.gettext:com.nettgryppa.security:net.metanotion:net.metanotion.*" />
             <group title="Streaming Library" packages="net.i2p.client.streaming:net.i2p.client.streaming.impl" />
             <group title="Router" packages="net.i2p.router:net.i2p.router.*:net.i2p.data.i2np:org.cybergarage.*:org.freenetproject:org.xlattice.crypto.filters" />
             <group title="Router Console" packages="net.i2p.router.web:net.i2p.router.update" />
diff --git a/core/java/build.xml b/core/java/build.xml
index 814064343cae0fcd4744e83dd771c1c418be9f1c..0d3f10dec898f4bd03c08fce0a31600c56c3a3a8 100644
--- a/core/java/build.xml
+++ b/core/java/build.xml
@@ -46,7 +46,10 @@
     <target name="jar" depends="compile, jarUpToDate, listChangedFiles" unless="jar.uptodate" >
         <!-- set if unset -->
         <property name="workspace.changes.tr" value="" />
-        <jar destfile="./build/i2p.jar" basedir="./build/obj" includes="**/*.class" >
+        <jar destfile="./build/i2p.jar" >
+            <fileset dir="./build/obj" includes="**/*.class" />
+            <!-- the getopt translation files -->
+            <fileset dir="src" includes="gnu/getopt/*.properties" />
             <manifest>
                 <attribute name="Implementation-Version" value="${full.version}" />
                 <attribute name="Built-By" value="${build.built-by}" />
diff --git a/core/java/src/gnu/getopt/Getopt.java b/core/java/src/gnu/getopt/Getopt.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ca1c6ee3ada0673b32ec147efd139a9bf468148
--- /dev/null
+++ b/core/java/src/gnu/getopt/Getopt.java
@@ -0,0 +1,1337 @@
+/**************************************************************************
+/* Getopt.java -- Java port of GNU getopt from glibc 2.0.6
+/*
+/* Copyright (c) 1987-1997 Free Software Foundation, Inc.
+/* Java Port Copyright (c) 1998 by Aaron M. Renn (arenn@urbanophile.com)
+/*
+/* This program is free software; you can redistribute it and/or modify
+/* it under the terms of the GNU Library General Public License as published 
+/* by  the Free Software Foundation; either version 2 of the License or
+/* (at your option) any later version.
+/*
+/* This program is distributed in the hope that it will be useful, but
+/* WITHOUT ANY WARRANTY; without even the implied warranty of
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/* GNU Library General Public License for more details.
+/*
+/* You should have received a copy of the GNU Library General Public License
+/* along with this program; see the file COPYING.LIB.  If not, write to 
+/* the Free Software Foundation Inc., 59 Temple Place - Suite 330, 
+/* Boston, MA  02111-1307 USA
+/**************************************************************************/
+
+package gnu.getopt;
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.text.MessageFormat;
+
+/**************************************************************************/
+
+/**
+  * This is a Java port of GNU getopt, a class for parsing command line
+  * arguments passed to programs.  It it based on the C getopt() functions
+  * in glibc 2.0.6 and should parse options in a 100% compatible manner.
+  * If it does not, that is a bug.  The programmer's interface is also
+  * very compatible.
+  * <p>
+  * To use Getopt, create a Getopt object with a argv array passed to the
+  * main method, then call the getopt() method in a loop.  It will return an
+  * int that contains the value of the option character parsed from the
+  * command line.  When there are no more options to be parsed, it
+  * returns -1.
+  * <p>
+  * A command line option can be defined to take an argument.  If an
+  * option has an argument, the value of that argument is stored in an
+  * instance variable called optarg, which can be accessed using the
+  * getOptarg() method.  If an option that requires an argument is
+  * found, but there is no argument present, then an error message is
+  * printed. Normally getopt() returns a '?' in this situation, but
+  * that can be changed as described below.
+  * <p>
+  * If an invalid option is encountered, an error message is printed
+  * to the standard error and getopt() returns a '?'.  The value of the
+  * invalid option encountered is stored in the instance variable optopt
+  * which can be retrieved using the getOptopt() method.  To suppress
+  * the printing of error messages for this or any other error, set
+  * the value of the opterr instance variable to false using the 
+  * setOpterr() method.
+  * <p>
+  * Between calls to getopt(), the instance variable optind is used to
+  * keep track of where the object is in the parsing process.  After all
+  * options have been returned, optind is the index in argv of the first
+  * non-option argument.  This variable can be accessed with the getOptind()
+  * method.
+  * <p>
+  * Note that this object expects command line options to be passed in the
+  * traditional Unix manner.  That is, proceeded by a '-' character. 
+  * Multiple options can follow the '-'.  For example "-abc" is equivalent
+  * to "-a -b -c".  If an option takes a required argument, the value
+  * of the argument can immediately follow the option character or be
+  * present in the next argv element.  For example, "-cfoo" and "-c foo"
+  * both represent an option character of 'c' with an argument of "foo"
+  * assuming c takes a required argument.  If an option takes an argument
+  * that is not required, then any argument must immediately follow the
+  * option character in the same argv element.  For example, if c takes
+  * a non-required argument, then "-cfoo" represents option character 'c'
+  * with an argument of "foo" while "-c foo" represents the option
+  * character 'c' with no argument, and a first non-option argv element
+  * of "foo".
+  * <p>
+  * The user can stop getopt() from scanning any further into a command line
+  * by using the special argument "--" by itself.  For example: 
+  * "-a -- -d" would return an option character of 'a', then return -1
+  * The "--" is discarded and "-d" is pointed to by optind as the first
+  * non-option argv element.
+  * <p>
+  * Here is a basic example of using Getopt:
+  * <p>
+  * <pre>
+  * Getopt g = new Getopt("testprog", argv, "ab:c::d");
+  * //
+  * int c;
+  * String arg;
+  * while ((c = g.getopt()) != -1)
+  *   {
+  *     switch(c)
+  *       {
+  *          case 'a':
+  *          case 'd':
+  *            System.out.print("You picked " + (char)c + "\n");
+  *            break;
+  *            //
+  *          case 'b':
+  *          case 'c':
+  *            arg = g.getOptarg();
+  *            System.out.print("You picked " + (char)c + 
+  *                             " with an argument of " +
+  *                             ((arg != null) ? arg : "null") + "\n");
+  *            break;
+  *            //
+  *          case '?':
+  *            break; // getopt() already printed an error
+  *            //
+  *          default:
+  *            System.out.print("getopt() returned " + c + "\n");
+  *       }
+  *   }
+  * </pre>
+  * <p>
+  * In this example, a new Getopt object is created with three params.
+  * The first param is the program name.  This is for printing error
+  * messages in the form "program: error message".  In the C version, this
+  * value is taken from argv[0], but in Java the program name is not passed
+  * in that element, thus the need for this parameter.  The second param is
+  * the argument list that was passed to the main() method.  The third
+  * param is the list of valid options.  Each character represents a valid
+  * option.  If the character is followed by a single colon, then that
+  * option has a required argument.  If the character is followed by two
+  * colons, then that option has an argument that is not required.
+  * <p>
+  * Note in this example that the value returned from getopt() is cast to
+  * a char prior to printing.  This is required in order to make the value
+  * display correctly as a character instead of an integer.
+  * <p>
+  * If the first character in the option string is a colon, for example
+  * ":abc::d", then getopt() will return a ':' instead of a '?' when it
+  * encounters an option with a missing required argument.  This allows the
+  * caller to distinguish between invalid options and valid options that
+  * are simply incomplete.
+  * <p>
+  * In the traditional Unix getopt(), -1 is returned when the first non-option
+  * charcter is encountered.  In GNU getopt(), the default behavior is to
+  * allow options to appear anywhere on the command line.  The getopt()
+  * method permutes the argument to make it appear to the caller that all
+  * options were at the beginning of the command line, and all non-options
+  * were at the end.  For example, calling getopt() with command line args
+  * of "-a foo bar -d" returns options 'a' and 'd', then sets optind to 
+  * point to "foo".  The program would read the last two argv elements as
+  * "foo" and "bar", just as if the user had typed "-a -d foo bar". 
+  * <p> 
+  * The user can force getopt() to stop scanning the command line with
+  * the special argument "--" by itself.  Any elements occuring before the
+  * "--" are scanned and permuted as normal.  Any elements after the "--"
+  * are returned as is as non-option argv elements.  For example, 
+  * "foo -a -- bar -d" would return  option 'a' then -1.  optind would point 
+  * to "foo", "bar" and "-d" as the non-option argv elements.  The "--"
+  * is discarded by getopt().
+  * <p>
+  * There are two ways this default behavior can be modified.  The first is
+  * to specify traditional Unix getopt() behavior (which is also POSIX
+  * behavior) in which scanning stops when the first non-option argument
+  * encountered.  (Thus "-a foo bar -d" would return 'a' as an option and
+  * have "foo", "bar", and "-d" as non-option elements).  The second is to
+  * allow options anywhere, but to return all elements in the order they
+  * occur on the command line.  When a non-option element is ecountered,
+  * an integer 1 is returned and the value of the non-option element is
+  * stored in optarg is if it were the argument to that option.  For
+  * example, "-a foo -d", returns first 'a', then 1 (with optarg set to
+  * "foo") then 'd' then -1.  When this "return in order" functionality
+  * is enabled, the only way to stop getopt() from scanning all command
+  * line elements is to use the special "--" string by itself as described
+  * above.  An example is "-a foo -b -- bar", which would return 'a', then
+  * integer 1 with optarg set to "foo", then 'b', then -1.  optind would
+  * then point to "bar" as the first non-option argv element.  The "--"
+  * is discarded.
+  * <p>
+  * The POSIX/traditional behavior is enabled by either setting the 
+  * property "gnu.posixly_correct" or by putting a '+' sign as the first
+  * character of the option string.  The difference between the two 
+  * methods is that setting the gnu.posixly_correct property also forces
+  * certain error messages to be displayed in POSIX format.  To enable
+  * the "return in order" functionality, put a '-' as the first character
+  * of the option string.  Note that after determining the proper 
+  * behavior, Getopt strips this leading '+' or '-', meaning that a ':'
+  * placed as the second character after one of those two will still cause
+  * getopt() to return a ':' instead of a '?' if a required option
+  * argument is missing.
+  * <p>
+  * In addition to traditional single character options, GNU Getopt also
+  * supports long options.  These are preceeded by a "--" sequence and
+  * can be as long as desired.  Long options provide a more user-friendly
+  * way of entering command line options.  For example, in addition to a
+  * "-h" for help, a program could support also "--help".  
+  * <p>
+  * Like short options, long options can also take a required or non-required 
+  * argument.  Required arguments can either be specified by placing an
+  * equals sign after the option name, then the argument, or by putting the
+  * argument in the next argv element.  For example: "--outputdir=foo" and
+  * "--outputdir foo" both represent an option of "outputdir" with an
+  * argument of "foo", assuming that outputdir takes a required argument.
+  * If a long option takes a non-required argument, then the equals sign
+  * form must be used to specify the argument.  In this case,
+  * "--outputdir=foo" would represent option outputdir with an argument of
+  * "foo" while "--outputdir foo" would represent the option outputdir
+  * with no argument and a first non-option argv element of "foo".
+  * <p>
+  * Long options can also be specified using a special POSIX argument 
+  * format (one that I highly discourage).  This form of entry is 
+  * enabled by placing a "W;" (yes, 'W' then a semi-colon) in the valid
+  * option string.  This causes getopt to treat the name following the
+  * "-W" as the name of the long option.  For example, "-W outputdir=foo"
+  * would be equivalent to "--outputdir=foo".  The name can immediately
+  * follow the "-W" like so: "-Woutputdir=foo".  Option arguments are
+  * handled identically to normal long options.  If a string follows the 
+  * "-W" that does not represent a valid long option, then getopt() returns
+  * 'W' and the caller must decide what to do.  Otherwise getopt() returns
+  * a long option value as described below.
+  * <p>
+  * While long options offer convenience, they can also be tedious to type
+  * in full.  So it is permissible to abbreviate the option name to as
+  * few characters as required to uniquely identify it.  If the name can
+  * represent multiple long options, then an error message is printed and
+  * getopt() returns a '?'.  
+  * <p>
+  * If an invalid option is specified or a required option argument is 
+  * missing, getopt() prints an error and returns a '?' or ':' exactly
+  * as for short options.  Note that when an invalid long option is
+  * encountered, the optopt variable is set to integer 0 and so cannot
+  * be used to identify the incorrect option the user entered.
+  * <p>
+  * Long options are defined by LongOpt objects.  These objects are created
+  * with a contructor that takes four params: a String representing the
+  * object name, a integer specifying what arguments the option takes
+  * (the value is one of LongOpt.NO_ARGUMENT, LongOpt.REQUIRED_ARGUMENT,
+  * or LongOpt.OPTIONAL_ARGUMENT), a StringBuffer flag object (described
+  * below), and an integer value (described below).
+  * <p>
+  * To enable long option parsing, create an array of LongOpt's representing
+  * the legal options and pass it to the Getopt() constructor.  WARNING: If
+  * all elements of the array are not populated with LongOpt objects, the
+  * getopt() method will throw a NullPointerException.
+  * <p>
+  * When getopt() is called and a long option is encountered, one of two
+  * things can be returned.  If the flag field in the LongOpt object 
+  * representing the long option is non-null, then the integer value field
+  * is stored there and an integer 0 is returned to the caller.  The val
+  * field can then be retrieved from the flag field.  Note that since the
+  * flag field is a StringBuffer, the appropriate String to integer converions
+  * must be performed in order to get the actual int value stored there.
+  * If the flag field in the LongOpt object is null, then the value field
+  * of the LongOpt is returned.  This can be the character of a short option.
+  * This allows an app to have both a long and short option sequence 
+  * (say, "-h" and "--help") that do the exact same thing.
+  * <p>
+  * With long options, there is an alternative method of determining 
+  * which option was selected.  The method getLongind() will return the
+  * the index in the long option array (NOT argv) of the long option found.
+  * So if multiple long options are configured to return the same value,
+  * the application can use getLongind() to distinguish between them. 
+  * <p>
+  * Here is an expanded Getopt example using long options and various
+  * techniques described above:
+  * <p>
+  * <pre>
+  * int c;
+  * String arg;
+  * LongOpt[] longopts = new LongOpt[3];
+  * // 
+  * StringBuffer sb = new StringBuffer();
+  * longopts[0] = new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h');
+  * longopts[1] = new LongOpt("outputdir", LongOpt.REQUIRED_ARGUMENT, sb, 'o'); 
+  * longopts[2] = new LongOpt("maximum", LongOpt.OPTIONAL_ARGUMENT, null, 2);
+  * // 
+  * Getopt g = new Getopt("testprog", argv, "-:bc::d:hW;", longopts);
+  * g.setOpterr(false); // We'll do our own error handling
+  * //
+  * while ((c = g.getopt()) != -1)
+  *   switch (c)
+  *     {
+  *        case 0:
+  *          arg = g.getOptarg();
+  *          System.out.println("Got long option with value '" +
+  *                             (char)(new Integer(sb.toString())).intValue()
+  *                             + "' with argument " +
+  *                             ((arg != null) ? arg : "null"));
+  *          break;
+  *          //
+  *        case 1:
+  *          System.out.println("I see you have return in order set and that " +
+  *                             "a non-option argv element was just found " +
+  *                             "with the value '" + g.getOptarg() + "'");
+  *          break;
+  *          //
+  *        case 2:
+  *          arg = g.getOptarg();
+  *          System.out.println("I know this, but pretend I didn't");
+  *          System.out.println("We picked option " +
+  *                             longopts[g.getLongind()].getName() +
+  *                           " with value " + 
+  *                           ((arg != null) ? arg : "null"));
+  *          break;
+  *          //
+  *        case 'b':
+  *          System.out.println("You picked plain old option " + (char)c);
+  *          break;
+  *          //
+  *        case 'c':
+  *        case 'd':
+  *          arg = g.getOptarg();
+  *          System.out.println("You picked option '" + (char)c + 
+  *                             "' with argument " +
+  *                             ((arg != null) ? arg : "null"));
+  *          break;
+  *          //
+  *        case 'h':
+  *          System.out.println("I see you asked for help");
+  *          break;
+  *          //
+  *        case 'W':
+  *          System.out.println("Hmmm. You tried a -W with an incorrect long " +
+  *                             "option name");
+  *          break;
+  *          //
+  *        case ':':
+  *          System.out.println("Doh! You need an argument for option " +
+  *                             (char)g.getOptopt());
+  *          break;
+  *          //
+  *        case '?':
+  *          System.out.println("The option '" + (char)g.getOptopt() + 
+  *                           "' is not valid");
+  *          break;
+  *          //
+  *        default:
+  *          System.out.println("getopt() returned " + c);
+  *          break;
+  *     }
+  * //
+  * for (int i = g.getOptind(); i < argv.length ; i++)
+  *   System.out.println("Non option argv element: " + argv[i] + "\n");
+  * </pre>
+  * <p>
+  * There is an alternative form of the constructor used for long options
+  * above.  This takes a trailing boolean flag.  If set to false, Getopt
+  * performs identically to the example, but if the boolean flag is true
+  * then long options are allowed to start with a single '-' instead of
+  * "--".  If the first character of the option is a valid short option
+  * character, then the option is treated as if it were the short option.
+  * Otherwise it behaves as if the option is a long option.  Note that
+  * the name given to this option - long_only - is very counter-intuitive.
+  * It does not cause only long options to be parsed but instead enables
+  * the behavior described above.
+  * <p> 
+  * Note that the functionality and variable names used are driven from 
+  * the C lib version as this object is a port of the C code, not a 
+  * new implementation.  This should aid in porting existing C/C++ code,
+  * as well as helping programmers familiar with the glibc version to
+  * adapt to the Java version even if it seems very non-Java at times.
+  * <p>
+  * In this release I made all instance variables protected due to
+  * overwhelming public demand.  Any code which relied on optarg,
+  * opterr, optind, or optopt being public will need to be modified to
+  * use the appropriate access methods.
+  * <p>
+  * Please send all bug reports, requests, and comments to
+  * <a href="mailto:arenn@urbanophile.com">arenn@urbanophile.com</a>.
+  *
+  * @version 1.0.7
+  *
+  * @author Roland McGrath (roland@gnu.ai.mit.edu)
+  * @author Ulrich Drepper (drepper@cygnus.com)
+  * @author Aaron M. Renn (arenn@urbanophile.com)
+  *
+  * @see LongOpt
+  */
+public class Getopt extends Object
+{
+
+/**************************************************************************/
+
+/*
+ * Class Variables
+ */
+
+/** 
+  * Describe how to deal with options that follow non-option ARGV-elements.
+  *
+  * If the caller did not specify anything,
+  * the default is REQUIRE_ORDER if the property 
+  * gnu.posixly_correct is defined, PERMUTE otherwise.
+  *
+  * The special argument `--' forces an end of option-scanning regardless
+  * of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
+  * `--' can cause `getopt' to return -1 with `optind' != ARGC.
+  *
+  * REQUIRE_ORDER means don't recognize them as options;
+  * stop option processing when the first non-option is seen.
+  * This is what Unix does.
+  * This mode of operation is selected by either setting the property
+  * gnu.posixly_correct, or using `+' as the first character
+  * of the list of option characters.
+  */
+protected static final int REQUIRE_ORDER = 1;
+
+/**
+  * PERMUTE is the default.  We permute the contents of ARGV as we scan,
+  * so that eventually all the non-options are at the end.  This allows options
+  * to be given in any order, even with programs that were not written to
+  * expect this.
+  */
+protected static final int PERMUTE = 2;
+
+/**
+  * RETURN_IN_ORDER is an option available to programs that were written
+  * to expect options and other ARGV-elements in any order and that care about
+  * the ordering of the two.  We describe each non-option ARGV-element
+  * as if it were the argument of an option with character code 1.
+  * Using `-' as the first character of the list of option characters
+  * selects this mode of operation.
+  */
+protected static final int RETURN_IN_ORDER = 3;
+
+/**************************************************************************/
+
+/*
+ * Instance Variables
+ */
+ 
+/**
+  * For communication from `getopt' to the caller.
+  * When `getopt' finds an option that takes an argument,
+  * the argument value is returned here.
+  * Also, when `ordering' is RETURN_IN_ORDER,
+  * each non-option ARGV-element is returned here.
+  */
+protected String optarg;
+
+/**
+  *  Index in ARGV of the next element to be scanned.
+  *  This is used for communication to and from the caller
+  *  and for communication between successive calls to `getopt'.
+  *
+  *  On entry to `getopt', zero means this is the first call; initialize.
+  *
+  *  When `getopt' returns -1, this is the index of the first of the
+  *  non-option elements that the caller should itself scan.
+  *
+  *  Otherwise, `optind' communicates from one call to the next
+  *  how much of ARGV has been scanned so far.  
+  */
+protected int optind = 0;
+
+/** 
+  * Callers store false here to inhibit the error message
+  * for unrecognized options.  
+  */
+protected boolean opterr = true;
+
+/** 
+  * When an unrecognized option is encountered, getopt will return a '?'
+  * and store the value of the invalid option here.
+  */
+protected int optopt = '?';
+
+/** 
+  * The next char to be scanned in the option-element
+  * in which the last option character we returned was found.
+  * This allows us to pick up the scan where we left off.
+  *
+  * If this is zero, or a null string, it means resume the scan
+  * by advancing to the next ARGV-element.  
+  */
+protected String nextchar;
+
+/**
+  * This is the string describing the valid short options.
+  */
+protected String optstring;
+
+/**
+  * This is an array of LongOpt objects which describ the valid long 
+  * options.
+  */
+protected LongOpt[] long_options;
+
+/**
+  * This flag determines whether or not we are parsing only long args
+  */
+protected boolean long_only;
+
+/**
+  * Stores the index into the long_options array of the long option found
+  */
+protected int longind;
+
+/**
+  * The flag determines whether or not we operate in strict POSIX compliance
+  */
+protected boolean posixly_correct;
+
+/**
+  * A flag which communicates whether or not checkLongOption() did all
+  * necessary processing for the current option
+  */
+protected boolean longopt_handled;
+
+/**
+  * The index of the first non-option in argv[]
+  */
+protected int first_nonopt = 1;
+
+/**
+  * The index of the last non-option in argv[]
+  */
+protected int last_nonopt = 1;
+
+/**
+  * Flag to tell getopt to immediately return -1 the next time it is
+  * called.
+  */
+private boolean endparse = false;
+
+/**
+  * Saved argument list passed to the program
+  */
+protected String[] argv;
+
+/**
+  * Determines whether we permute arguments or not
+  */
+protected int ordering;
+
+/**
+  * Name to print as the program name in error messages.  This is necessary
+  * since Java does not place the program name in argv[0]
+  */
+protected String progname;
+
+/**
+  * The localized strings are kept in a separate file
+  */
+private ResourceBundle _messages = ResourceBundle.getBundle(
+                           "gnu/getopt/MessagesBundle", Locale.getDefault());
+
+/**************************************************************************/
+
+/*
+ * Constructors
+ */
+
+/**
+  * Construct a basic Getopt instance with the given input data.  Note that
+  * this handles "short" options only.
+  *
+  * @param progname The name to display as the program name when printing errors
+  * @param argv The String array passed as the command line to the program.
+  * @param optstring A String containing a description of the valid args for this program
+  */
+public
+Getopt(String progname, String[] argv, String optstring)
+{
+  this(progname, argv, optstring, null, false);
+}
+
+/**************************************************************************/
+
+/**
+  * Construct a Getopt instance with given input data that is capable of
+  * parsing long options as well as short.
+  *
+  * @param progname The name to display as the program name when printing errors
+  * @param argv The String array passed as the command ilne to the program
+  * @param optstring A String containing a description of the valid short args for this program
+  * @param long_options An array of LongOpt objects that describes the valid long args for this program
+  */
+public
+Getopt(String progname, String[] argv, String optstring, 
+       LongOpt[] long_options)
+{
+  this(progname, argv, optstring, long_options, false);
+}
+
+/**************************************************************************/
+
+/**
+  * Construct a Getopt instance with given input data that is capable of
+  * parsing long options and short options.  Contrary to what you might
+  * think, the flag 'long_only' does not determine whether or not we 
+  * scan for only long arguments.  Instead, a value of true here allows
+  * long arguments to start with a '-' instead of '--' unless there is a
+  * conflict with a short option name.
+  *
+  * @param progname The name to display as the program name when printing errors
+  * @param argv The String array passed as the command ilne to the program
+  * @param optstring A String containing a description of the valid short args for this program
+  * @param long_options An array of LongOpt objects that describes the valid long args for this program
+  * @param long_only true if long options that do not conflict with short options can start with a '-' as well as '--'
+  */
+public
+Getopt(String progname, String[] argv, String optstring, 
+       LongOpt[] long_options, boolean long_only)
+{
+  if (optstring.length() == 0)
+    optstring = " ";
+
+  // This function is essentially _getopt_initialize from GNU getopt
+  this.progname = progname;
+  this.argv = argv;
+  this.optstring = optstring;
+  this.long_options = long_options;
+  this.long_only = long_only;
+
+  // Check for property "gnu.posixly_correct" to determine whether to
+  // strictly follow the POSIX standard.  This replaces the "POSIXLY_CORRECT"
+  // environment variable in the C version
+  if (System.getProperty("gnu.posixly_correct", null) == null)
+    posixly_correct = false;
+  else
+    {
+      posixly_correct = true;
+      _messages = ResourceBundle.getBundle("gnu/getopt/MessagesBundle",
+                                                   Locale.US);
+    }
+
+  // Determine how to handle the ordering of options and non-options
+  if (optstring.charAt(0) == '-')
+    {
+      ordering = RETURN_IN_ORDER;
+      if (optstring.length() > 1)
+        this.optstring = optstring.substring(1);
+    }
+  else if (optstring.charAt(0) == '+')
+    {
+      ordering = REQUIRE_ORDER;
+      if (optstring.length() > 1)
+        this.optstring = optstring.substring(1);
+    }
+  else if (posixly_correct)
+    {
+      ordering = REQUIRE_ORDER;
+    }
+  else
+    {
+      ordering = PERMUTE; // The normal default case
+    }
+}
+
+/**************************************************************************/
+ 
+/*
+ * Instance Methods
+ */
+
+/**
+  * In GNU getopt, it is possible to change the string containg valid options
+  * on the fly because it is passed as an argument to getopt() each time.  In
+  * this version we do not pass the string on every call.  In order to allow
+  * dynamic option string changing, this method is provided.
+  *
+  * @param optstring The new option string to use
+  */
+public void
+setOptstring(String optstring)
+{
+  if (optstring.length() == 0)
+    optstring = " ";
+
+  this.optstring = optstring;
+}
+
+/**************************************************************************/
+
+/**
+  * optind it the index in ARGV of the next element to be scanned.
+  * This is used for communication to and from the caller
+  * and for communication between successive calls to `getopt'.
+  *
+  * When `getopt' returns -1, this is the index of the first of the
+  * non-option elements that the caller should itself scan.
+  *
+  * Otherwise, `optind' communicates from one call to the next
+  * how much of ARGV has been scanned so far.  
+  */
+public int
+getOptind()
+{
+  return(optind);
+}
+
+/**************************************************************************/
+
+/**
+  * This method allows the optind index to be set manually.  Normally this
+  * is not necessary (and incorrect usage of this method can lead to serious
+  * lossage), but optind is a public symbol in GNU getopt, so this method 
+  * was added to allow it to be modified by the caller if desired.
+  *
+  * @param optind The new value of optind
+  */
+public void
+setOptind(int optind)
+{
+  this.optind = optind;
+}
+
+/**************************************************************************/
+
+/**
+  * Since in GNU getopt() the argument vector is passed back in to the
+  * function every time, the caller can swap out argv on the fly.  Since
+  * passing argv is not required in the Java version, this method allows
+  * the user to override argv.  Note that incorrect use of this method can
+  * lead to serious lossage.
+  *
+  * @param argv New argument list
+  */
+public void
+setArgv(String[] argv)
+{
+  this.argv = argv;
+}
+
+/**************************************************************************/
+
+/** 
+  * For communication from `getopt' to the caller.
+  * When `getopt' finds an option that takes an argument,
+  * the argument value is returned here.
+  * Also, when `ordering' is RETURN_IN_ORDER,
+  * each non-option ARGV-element is returned here.
+  * No set method is provided because setting this variable has no effect.
+  */
+public String
+getOptarg()
+{
+  return(optarg);
+}
+
+/**************************************************************************/
+
+/**
+  * Normally Getopt will print a message to the standard error when an
+  * invalid option is encountered.  This can be suppressed (or re-enabled)
+  * by calling this method.  There is no get method for this variable 
+  * because if you can't remember the state you set this to, why should I?
+  */
+public void
+setOpterr(boolean opterr)
+{
+  this.opterr = opterr;
+}
+
+/**************************************************************************/
+
+/**
+  * When getopt() encounters an invalid option, it stores the value of that
+  * option in optopt which can be retrieved with this method.  There is
+  * no corresponding set method because setting this variable has no effect.
+  */
+public int
+getOptopt()
+{
+  return(optopt);
+}
+
+/**************************************************************************/
+
+/**
+  * Returns the index into the array of long options (NOT argv) representing
+  * the long option that was found.
+  */
+public int
+getLongind()
+{
+  return(longind);
+}
+
+/**************************************************************************/
+
+/**
+  * Exchange the shorter segment with the far end of the longer segment.
+  * That puts the shorter segment into the right place.
+  * It leaves the longer segment in the right place overall,
+  * but it consists of two parts that need to be swapped next.
+  * This method is used by getopt() for argument permutation.
+  */
+protected void
+exchange(String[] argv)
+{
+  int bottom = first_nonopt;
+  int middle = last_nonopt;
+  int top = optind;
+  String tem;
+
+  while (top > middle && middle > bottom)
+    {
+      if (top - middle > middle - bottom)
+        {
+          // Bottom segment is the short one. 
+          int len = middle - bottom;
+          int i;
+
+          // Swap it with the top part of the top segment. 
+          for (i = 0; i < len; i++)
+            {
+              tem = argv[bottom + i];
+              argv[bottom + i] = argv[top - (middle - bottom) + i];
+              argv[top - (middle - bottom) + i] = tem;
+            }
+          // Exclude the moved bottom segment from further swapping. 
+          top -= len;
+        }
+      else
+        {
+          // Top segment is the short one.
+          int len = top - middle;
+          int i;
+
+          // Swap it with the bottom part of the bottom segment. 
+          for (i = 0; i < len; i++)
+            {
+              tem = argv[bottom + i];
+              argv[bottom + i] = argv[middle + i];
+              argv[middle + i] = tem;
+            }
+          // Exclude the moved top segment from further swapping. 
+          bottom += len;
+        }
+    }
+
+  // Update records for the slots the non-options now occupy. 
+
+  first_nonopt += (optind - last_nonopt);
+  last_nonopt = optind;
+}
+
+/**************************************************************************/
+
+/**
+  * Check to see if an option is a valid long option.  Called by getopt().
+  * Put in a separate method because this needs to be done twice.  (The
+  * C getopt authors just copy-pasted the code!).
+  *
+  * Uses field longind, A buffer in which to store the 'val' field of found LongOpt
+  *
+  * @return Various things depending on circumstances
+  */
+protected int
+checkLongOption()
+{
+  LongOpt pfound = null;
+  int nameend;
+  boolean ambig;
+  boolean exact;
+  
+  longopt_handled = true;
+  ambig = false;
+  exact = false;
+  longind = -1;
+
+  nameend = nextchar.indexOf("=");
+  if (nameend == -1)
+    nameend = nextchar.length();
+  
+  // Test all lnog options for either exact match or abbreviated matches
+  for (int i = 0; i < long_options.length; i++)
+    {
+      if (long_options[i].getName().startsWith(nextchar.substring(0, nameend)))
+        {
+          if (long_options[i].getName().equals(nextchar.substring(0, nameend)))
+            {
+              // Exact match found
+              pfound = long_options[i];
+              longind = i;
+              exact = true;
+              break;
+            }
+          else if (pfound == null)
+            {
+              // First nonexact match found
+              pfound = long_options[i];
+              longind = i;
+            }
+          else
+            {
+              // Second or later nonexact match found
+              ambig = true;
+            }
+        }
+    } // for
+  
+  // Print out an error if the option specified was ambiguous
+  if (ambig && !exact)
+    {
+      if (opterr)
+        {
+          Object[] msgArgs = { progname, argv[optind] };
+          System.err.println(MessageFormat.format(
+                             _messages.getString("getopt.ambigious"), 
+                             msgArgs));
+        }
+
+       nextchar = "";
+       optopt = 0;
+       ++optind;
+ 
+       return('?');
+    }
+ 
+  if (pfound != null)
+    {
+      ++optind;
+ 
+      if (nameend != nextchar.length())
+        {
+          if (pfound.has_arg != LongOpt.NO_ARGUMENT)
+            {
+              if (nextchar.substring(nameend).length() > 1)
+                optarg = nextchar.substring(nameend+1);
+              else
+                optarg = "";
+            }
+          else
+            {
+              if (opterr)
+                {
+                  // -- option
+                  if (argv[optind - 1].startsWith("--"))
+                    {
+                      Object[] msgArgs = { progname, pfound.name };
+                      System.err.println(MessageFormat.format(
+                                  _messages.getString("getopt.arguments1"), 
+                                  msgArgs));
+                    }
+                  // +option or -option
+                  else
+                    {
+                      Object[] msgArgs = { progname, new 
+                               Character(argv[optind-1].charAt(0)).toString(),
+                               pfound.name };
+                      System.err.println(MessageFormat.format(
+                               _messages.getString("getopt.arguments2"), 
+                               msgArgs));
+                    }
+                 }
+   
+              nextchar = "";
+              optopt = pfound.val;
+   
+              return('?');
+            }
+        } // if (nameend)
+      else if (pfound.has_arg == LongOpt.REQUIRED_ARGUMENT)
+        {
+          if (optind < argv.length)
+            {
+               optarg = argv[optind];
+               ++optind;
+            }
+          else
+            {
+              if (opterr)
+                {
+                  Object[] msgArgs = { progname, argv[optind-1] };
+                  System.err.println(MessageFormat.format(
+                                     _messages.getString("getopt.requires"), 
+                                     msgArgs));
+                }
+   
+              nextchar = "";
+              optopt = pfound.val;
+              if (optstring.charAt(0) == ':')
+                return(':');
+              else
+                return('?');
+            }
+        } // else if (pfound)
+   
+      nextchar = "";
+
+      if (pfound.flag != null)
+        {
+          pfound.flag.setLength(0);
+          pfound.flag.append(pfound.val);
+   
+          return(0);
+        }
+
+      return(pfound.val);
+   } // if (pfound != null)
+  
+  longopt_handled = false;
+
+  return(0);
+}
+
+/**************************************************************************/
+
+/**
+  * This method returns a char that is the current option that has been
+  * parsed from the command line.  If the option takes an argument, then
+  * the internal variable 'optarg' is set which is a String representing
+  * the the value of the argument.  This value can be retrieved by the
+  * caller using the getOptarg() method.  If an invalid option is found,
+  * an error message is printed and a '?' is returned.  The name of the
+  * invalid option character can be retrieved by calling the getOptopt()
+  * method.  When there are no more options to be scanned, this method
+  * returns -1.  The index of first non-option element in argv can be
+  * retrieved with the getOptind() method.
+  *
+  * @return Various things as described above
+  */
+public int
+getopt()
+{
+  optarg = null;
+
+  if (endparse == true)
+    return(-1);
+
+  if ((nextchar == null) || (nextchar.equals("")))
+    {
+      // If we have just processed some options following some non-options,
+      //  exchange them so that the options come first.
+      if (last_nonopt > optind)
+        last_nonopt = optind;
+      if (first_nonopt > optind)
+        first_nonopt = optind;
+
+      if (ordering == PERMUTE)
+        {
+          // If we have just processed some options following some non-options,
+          // exchange them so that the options come first.
+          if ((first_nonopt != last_nonopt) && (last_nonopt != optind))
+            exchange(argv);
+          else if (last_nonopt != optind)
+            first_nonopt = optind;
+
+          // Skip any additional non-options
+          // and extend the range of non-options previously skipped.
+          while ((optind < argv.length) && (argv[optind].equals("") ||
+            (argv[optind].charAt(0) != '-') || argv[optind].equals("-")))
+            {
+              optind++;
+            }
+          
+          last_nonopt = optind;
+        }
+
+      // The special ARGV-element `--' means premature end of options.
+      // Skip it like a null option,
+      // then exchange with previous non-options as if it were an option,
+      // then skip everything else like a non-option.
+      if ((optind != argv.length) && argv[optind].equals("--"))
+        {
+          optind++;
+
+          if ((first_nonopt != last_nonopt) && (last_nonopt != optind))
+            exchange (argv);
+          else if (first_nonopt == last_nonopt)
+            first_nonopt = optind;
+
+          last_nonopt = argv.length;
+
+          optind = argv.length;
+        }
+
+      // If we have done all the ARGV-elements, stop the scan
+      // and back over any non-options that we skipped and permuted.
+      if (optind == argv.length)
+        {
+          // Set the next-arg-index to point at the non-options
+          // that we previously skipped, so the caller will digest them.
+          if (first_nonopt != last_nonopt)
+            optind = first_nonopt;
+
+          return(-1);
+        }
+
+      // If we have come to a non-option and did not permute it,
+      // either stop the scan or describe it to the caller and pass it by.
+      if (argv[optind].equals("") || (argv[optind].charAt(0) != '-') || 
+          argv[optind].equals("-"))
+        {
+          if (ordering == REQUIRE_ORDER)
+            return(-1);
+
+            optarg = argv[optind++];
+            return(1);
+        }
+      
+      // We have found another option-ARGV-element.
+      // Skip the initial punctuation.
+      if (argv[optind].startsWith("--"))
+        nextchar = argv[optind].substring(2);
+      else
+        nextchar = argv[optind].substring(1);
+   }
+
+  // Decode the current option-ARGV-element.
+
+  /* Check whether the ARGV-element is a long option.
+
+     If long_only and the ARGV-element has the form "-f", where f is
+     a valid short option, don't consider it an abbreviated form of
+     a long option that starts with f.  Otherwise there would be no
+     way to give the -f short option.
+
+     On the other hand, if there's a long option "fubar" and
+     the ARGV-element is "-fu", do consider that an abbreviation of
+     the long option, just like "--fu", and not "-f" with arg "u".
+
+     This distinction seems to be the most useful approach.  */
+  if ((long_options != null) && (argv[optind].startsWith("--")
+      || (long_only && ((argv[optind].length()  > 2) || 
+      (optstring.indexOf(argv[optind].charAt(1)) == -1)))))
+    {
+       int c = checkLongOption();
+
+       if (longopt_handled)
+         return(c);
+         
+      // Can't find it as a long option.  If this is not getopt_long_only,
+      // or the option starts with '--' or is not a valid short
+      // option, then it's an error.
+      // Otherwise interpret it as a short option.
+      if (!long_only || argv[optind].startsWith("--")
+        || (optstring.indexOf(nextchar.charAt(0)) == -1))
+        {
+          if (opterr)
+            {
+              if (argv[optind].startsWith("--"))
+                {
+                  Object[] msgArgs = { progname, nextchar };
+                  System.err.println(MessageFormat.format(
+                                   _messages.getString("getopt.unrecognized"), 
+                                   msgArgs));
+                }
+              else
+                {
+                  Object[] msgArgs = { progname, new 
+                                 Character(argv[optind].charAt(0)).toString(), 
+                                 nextchar };
+                  System.err.println(MessageFormat.format(
+                                 _messages.getString("getopt.unrecognized2"), 
+                                 msgArgs));
+                }
+            }
+
+          nextchar = "";
+          ++optind;
+          optopt = 0;
+    
+          return('?');
+        }
+    } // if (longopts)
+
+  // Look at and handle the next short option-character */
+  int c = nextchar.charAt(0); //**** Do we need to check for empty str?
+  if (nextchar.length() > 1)
+    nextchar = nextchar.substring(1);
+  else
+    nextchar = "";
+  
+  String temp = null;
+  if (optstring.indexOf(c) != -1)
+    temp = optstring.substring(optstring.indexOf(c));
+
+  if (nextchar.equals(""))
+    ++optind;
+
+  if ((temp == null) || (c == ':'))
+    {
+      if (opterr)
+        {
+          if (posixly_correct)
+            {
+              // 1003.2 specifies the format of this message
+              Object[] msgArgs = { progname, new 
+                                   Character((char)c).toString() };
+              System.err.println(MessageFormat.format(
+                            _messages.getString("getopt.illegal"), msgArgs));
+            }
+          else
+            {
+              Object[] msgArgs = { progname, new 
+                                   Character((char)c).toString() };
+              System.err.println(MessageFormat.format(
+                            _messages.getString("getopt.invalid"), msgArgs));
+            }
+        }
+
+      optopt = c;
+
+      return('?');
+    }
+
+  // Convenience. Treat POSIX -W foo same as long option --foo
+  if ((temp.charAt(0) == 'W') && (temp.length() > 1) && (temp.charAt(1) == ';'))
+    {
+      if (!nextchar.equals(""))
+        {
+          optarg = nextchar;
+        }
+      // No further cars in this argv element and no more argv elements
+      else if (optind == argv.length)
+        {
+          if (opterr)
+            {
+              // 1003.2 specifies the format of this message. 
+              Object[] msgArgs = { progname, new 
+                                   Character((char)c).toString() };
+              System.err.println(MessageFormat.format(
+                            _messages.getString("getopt.requires2"), msgArgs));
+            }
+
+          optopt = c;
+          if (optstring.charAt(0) == ':')
+            return(':');
+          else
+            return('?');
+        }
+      else
+        {
+          // We already incremented `optind' once;
+          // increment it again when taking next ARGV-elt as argument. 
+          nextchar = argv[optind];
+          optarg  = argv[optind];
+        }
+
+      c = checkLongOption();
+
+      if (longopt_handled)
+        return(c);
+      else
+        // Let the application handle it
+        {
+          nextchar = null;
+          ++optind;
+          return('W');
+        }
+    }
+
+  if ((temp.length() > 1) && (temp.charAt(1) == ':'))
+    {
+      if ((temp.length() > 2) && (temp.charAt(2) == ':'))
+        // This is an option that accepts and argument optionally
+        {
+          if (!nextchar.equals(""))
+            {
+               optarg = nextchar;
+               ++optind;
+            }
+          else
+            {
+              optarg = null;
+            }
+
+          nextchar = null;
+        }
+      else
+        {
+          if (!nextchar.equals(""))
+            {
+              optarg = nextchar;
+              ++optind;
+            }
+          else if (optind == argv.length)
+            {
+              if (opterr)
+                {
+                  // 1003.2 specifies the format of this message
+                  Object[] msgArgs = { progname, new 
+                                       Character((char)c).toString() };
+                  System.err.println(MessageFormat.format(
+                            _messages.getString("getopt.requires2"), msgArgs));
+                }
+
+              optopt = c;
+ 
+              if (optstring.charAt(0) == ':')
+                return(':');
+              else
+                return('?');
+            }
+          else
+            {
+              optarg = argv[optind];
+              ++optind;
+
+              // Ok, here's an obscure Posix case.  If we have o:, and
+              // we get -o -- foo, then we're supposed to skip the --,
+              // end parsing of options, and make foo an operand to -o.
+              // Only do this in Posix mode.
+              if ((posixly_correct) && optarg.equals("--"))
+                {
+                  // If end of argv, error out
+                  if (optind == argv.length)
+                    {
+                      if (opterr)
+                        {
+                          // 1003.2 specifies the format of this message
+                          Object[] msgArgs = { progname, new 
+                                               Character((char)c).toString() };
+                          System.err.println(MessageFormat.format(
+                             _messages.getString("getopt.requires2"), msgArgs));
+                        }
+
+                      optopt = c;
+ 
+                      if (optstring.charAt(0) == ':')
+                        return(':');
+                      else
+                        return('?');
+                    }
+
+                  // Set new optarg and set to end
+                  // Don't permute as we do on -- up above since we
+                  // know we aren't in permute mode because of Posix.
+                  optarg = argv[optind];
+                  ++optind;
+                  first_nonopt = optind;
+                  last_nonopt = argv.length;
+                  endparse = true;
+                }
+            }
+
+          nextchar = null;
+        }
+    }
+
+  return(c);
+}
+
+} // Class Getopt
+
+
diff --git a/core/java/src/gnu/getopt/LongOpt.java b/core/java/src/gnu/getopt/LongOpt.java
new file mode 100644
index 0000000000000000000000000000000000000000..6357085fe1540d0f95af33bca364690d01b24d3e
--- /dev/null
+++ b/core/java/src/gnu/getopt/LongOpt.java
@@ -0,0 +1,195 @@
+/**************************************************************************
+/* LongOpt.java -- Long option object for Getopt
+/*
+/* Copyright (c) 1998 by Aaron M. Renn (arenn@urbanophile.com)
+/*
+/* This program is free software; you can redistribute it and/or modify
+/* it under the terms of the GNU Library General Public License as published 
+/* by  the Free Software Foundation; either version 2 of the License or
+/* (at your option) any later version.
+/*
+/* This program is distributed in the hope that it will be useful, but
+/* WITHOUT ANY WARRANTY; without even the implied warranty of
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+/* GNU Library General Public License for more details.
+/*
+/* You should have received a copy of the GNU Library General Public License
+/* along with this program; see the file COPYING.LIB.  If not, write to 
+/* the Free Software Foundation Inc., 59 Temple Place - Suite 330, 
+/* Boston, MA  02111-1307 USA
+/**************************************************************************/
+
+package gnu.getopt;
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.text.MessageFormat;
+
+/**************************************************************************/
+
+/**
+  * This object represents the definition of a long option in the Java port
+  * of GNU getopt.  An array of LongOpt objects is passed to the Getopt
+  * object to define the list of valid long options for a given parsing
+  * session.  Refer to the getopt documentation for details on the
+  * format of long options.
+  * 
+  * @version 1.0.5
+  * @author Aaron M. Renn (arenn@urbanophile.com)
+  *
+  * @see Getopt
+  */
+public class LongOpt extends Object
+{
+
+/**************************************************************************/
+
+/*
+ * Class Variables
+ */
+
+/**
+  * Constant value used for the "has_arg" constructor argument.  This
+  * value indicates that the option takes no argument.
+  */
+public static final int NO_ARGUMENT = 0;
+
+/** 
+  * Constant value used for the "has_arg" constructor argument.  This
+  * value indicates that the option takes an argument that is required.
+  */
+public static final int REQUIRED_ARGUMENT = 1;
+
+/**
+  * Constant value used for the "has_arg" constructor argument.  This
+  * value indicates that the option takes an argument that is optional.
+  */
+public static final int OPTIONAL_ARGUMENT = 2;
+
+/**************************************************************************/
+
+/*
+ * Instance Variables
+ */
+
+/**
+  * The name of the long option
+  */
+protected String name;
+
+/**
+  * Indicates whether the option has no argument, a required argument, or
+  * an optional argument.
+  */
+protected int has_arg;
+
+/**
+  * If this variable is not null, then the value stored in "val" is stored
+  * here when this long option is encountered.  If this is null, the value
+  * stored in "val" is treated as the name of an equivalent short option.
+  */
+protected StringBuffer flag;
+
+/**
+  * The value to store in "flag" if flag is not null, otherwise the
+  * equivalent short option character for this long option.
+  */
+protected int val;
+
+/**
+  * Localized strings for error messages
+  */
+private ResourceBundle _messages = ResourceBundle.getBundle(
+                            "gnu/getopt/MessagesBundle", Locale.getDefault());
+
+/**************************************************************************/
+
+/*
+ * Constructors
+ */
+
+/**
+  * Create a new LongOpt object with the given parameter values.  If the
+  * value passed as has_arg is not valid, then an exception is thrown.
+  *
+  * @param name The long option String.
+  * @param has_arg Indicates whether the option has no argument (NO_ARGUMENT), a required argument (REQUIRED_ARGUMENT) or an optional argument (OPTIONAL_ARGUMENT).
+  * @param flag If non-null, this is a location to store the value of "val" when this option is encountered, otherwise "val" is treated as the equivalent short option character.
+  * @param val The value to return for this long option, or the equivalent single letter option to emulate if flag is null.
+  * 
+  * @exception IllegalArgumentException If the has_arg param is not one of NO_ARGUMENT, REQUIRED_ARGUMENT or OPTIONAL_ARGUMENT.
+  */
+public
+LongOpt(String name, int has_arg, 
+        StringBuffer flag, int val) throws IllegalArgumentException
+{
+  // Validate has_arg
+  if ((has_arg != NO_ARGUMENT) && (has_arg != REQUIRED_ARGUMENT) 
+     && (has_arg != OPTIONAL_ARGUMENT))
+    {
+      Object[] msgArgs = { new Integer(has_arg).toString() };
+      throw new IllegalArgumentException(MessageFormat.format(
+                    _messages.getString("getopt.invalidValue"), msgArgs));
+    }
+
+  // Store off values
+  this.name = name;
+  this.has_arg = has_arg;
+  this.flag = flag;
+  this.val = val;
+}
+
+/**************************************************************************/
+
+/**
+  * Returns the name of this LongOpt as a String
+  *
+  * @return Then name of the long option
+  */
+public String
+getName()
+{
+  return(name);
+}
+
+/**************************************************************************/
+
+/**
+  * Returns the value set for the 'has_arg' field for this long option
+  *
+  * @return The value of 'has_arg'
+  */
+public int
+getHasArg()
+{
+  return(has_arg);
+}
+
+/**************************************************************************/
+
+/**
+  * Returns the value of the 'flag' field for this long option
+  *
+  * @return The value of 'flag'
+  */
+public StringBuffer
+getFlag()
+{
+  return(flag);
+}
+
+/**
+  * Returns the value of the 'val' field for this long option
+  *
+  * @return The value of 'val'
+  */
+public int
+getVal()
+{
+  return(val);
+}
+
+/**************************************************************************/
+
+} // Class LongOpt
+
diff --git a/core/java/src/gnu/getopt/MessagesBundle.properties b/core/java/src/gnu/getopt/MessagesBundle.properties
new file mode 100644
index 0000000000000000000000000000000000000000..11cdf5c79bf7dc52cdfe8b5d5fc5b6036582a629
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle.properties
@@ -0,0 +1,31 @@
+#**************************************************************************
+#* MessagesBundle.properties -- English language error messages
+#*
+#* Copyright (c) 1998 by William King (wrking@eng.sun.com) and
+#*                       Aaron M. Renn (arenn@urbanophile.com)
+#*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: option ''{1}'' is ambiguous
+getopt.arguments1={0}: option ''--{1}'' doesn't allow an argument
+getopt.arguments2={0}: option ''{1}{2}'' doesn't allow an argument
+getopt.requires={0}: option ''{1}'' requires an argument
+getopt.unrecognized={0}: unrecognized option ''--{1}''
+getopt.unrecognized2={0}: unrecognized option ''{1}{2}''
+getopt.illegal={0}: illegal option -- {1}
+getopt.invalid={0}: invalid option -- {1}
+getopt.requires2={0}: option requires an argument -- {1}
+getopt.invalidValue=Invalid value {0} for parameter 'has_arg' 
diff --git a/core/java/src/gnu/getopt/MessagesBundle_cs.properties b/core/java/src/gnu/getopt/MessagesBundle_cs.properties
new file mode 100644
index 0000000000000000000000000000000000000000..860846ea28db3ce4284daf963dd1af5d353b717f
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle_cs.properties
@@ -0,0 +1,31 @@
+#**************************************************************************
+#* MessagesBundle_cs.properties -- Czech language error messages
+#*
+#* Czech Messages Copyright (c) 1998 by Roman Szturc (Roman.Szturc@vsb.cz)
+#* These messages are encoded in ISO-8859-2
+#*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: volba ''{1}'' je nejednozna\u010Dn\u00E1
+getopt.arguments1={0}: volba ''--{1}'' nep\u0159ipou\u0161t\u00ED argument
+getopt.arguments2={0}: volba ''{1}{2}'' nep\u0159ipou\u0161t\u00ED argument
+getopt.requires={0}: volba ''{1}'' vy\u017Eaduje argument
+getopt.unrecognized={0}: nep\u0159\u00EDpustn\u00E1 volba ''--{1}''
+getopt.unrecognized2={0}: nep\u0159\u00EDpustn\u00E1 volba ''{1}{2}''
+getopt.illegal={0}: nep\u0159\u00EDpustn\u00E1 volba -- {1}
+getopt.invalid={0}: neplatn\u00E1 volba -- {1}
+getopt.requires2={0}: volba vy\u017Eaduje argument -- {1}
+getopt.invalidValue=Neplatn\u00E1 hodnota {0} parameteru 'has_arg' 
diff --git a/core/java/src/gnu/getopt/MessagesBundle_de.properties b/core/java/src/gnu/getopt/MessagesBundle_de.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1f175f914bee3edad9c7177ae8c047a4ead92ad4
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle_de.properties
@@ -0,0 +1,31 @@
+#**************************************************************************
+#* MessagesBundle.properties -- German language error messages
+#*
+#* German Messages Copyright (c) 1999 by Bernhard Bablok (bablokb@gmx.net)
+#* These messages are encoded in ISO-8859-1
+#/*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: Option ''{1}'' ist zweideutig
+getopt.arguments1={0}: Option ''--{1}'' erlaubt kein Argument
+getopt.arguments2={0}: Option ''{1}{2}'' erlaubt kein Argument
+getopt.requires={0}: Option ''{1}'' ben\u00F6tigt ein Argument
+getopt.unrecognized={0}: Unbekannte Option ''--{1}''
+getopt.unrecognized2={0}: Unbekannte Option ''{1}{2}''
+getopt.illegal={0}: Verbotene Option -- {1}
+getopt.invalid={0}: Ung\u00FCltige Option -- {1}
+getopt.requires2={0}: Option ben\u00F6tigt ein Argument -- {1}
+getopt.invalidValue=Ung\u00FCltiger Wert {0} f\u00FCr Parameter 'has_arg' 
diff --git a/core/java/src/gnu/getopt/MessagesBundle_es.properties b/core/java/src/gnu/getopt/MessagesBundle_es.properties
new file mode 100644
index 0000000000000000000000000000000000000000..31e509dd2a7d5ab69c227899563f8abbfd0ccc2a
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle_es.properties
@@ -0,0 +1,31 @@
+#**************************************************************************
+#* MessagesBundle_es.properties -- Spanish language error messages
+#*
+#* Spanish Messages Copyright (c) 2004 by Daniel P\u00E9rez (dondani@gmail.com)
+#* These messages are encoded in ISO-8859-1
+#*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: la opci\u00F3n ''{1}'' es ambigua
+getopt.arguments1={0}: la opci\u00F3n ''--{1}'' no permite un argumento
+getopt.arguments2={0}: la opci\u00F3n ''{1}{2}'' no permite un argumento
+getopt.requires={0}: la opci\u00F3n ''{1}'' requiere un argumento
+getopt.unrecognized={0}: opci\u00F3n no reconocida ''--{1}''
+getopt.unrecognized2={0}: opci\u00F3n no reconocida ''{1}{2}''
+getopt.illegal={0}: opci\u00F3n ilegal -- {1}
+getopt.invalid={0}: opci\u00F3n no v\u00E1lida -- {1}
+getopt.requires2={0}: la opci\u00F3n requiere un argumento -- {1}
+getopt.invalidValue=Valor no v\u00E1lido {0} para el par\u00E1metro 'has_arg'
diff --git a/core/java/src/gnu/getopt/MessagesBundle_fr.properties b/core/java/src/gnu/getopt/MessagesBundle_fr.properties
new file mode 100644
index 0000000000000000000000000000000000000000..04835f4c18e61f39db8587b189d5dfc9b81238a8
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle_fr.properties
@@ -0,0 +1,33 @@
+#**************************************************************************
+#* MessagesBundle_fr.properties -- French language error messages
+#*
+#* Copyright (c) 1999 Free Software Foundation, Inc.
+#*    Michel Robitaille <robitail@IRO.UMontreal.CA>, 1996,
+#*    Edouard G. Parmelan <edouard.parmelan@quadratec.fr>, 1999.
+#* These messages are encoded in ISO-8859-1
+#*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: l'option ''{1}'' est ambigu\u00EB
+getopt.arguments1={0}: l'option ''--{1}'' ne permet pas de param\u00E8tre
+getopt.arguments2={0}: l'option ''{1}{2}'' ne permet pas de param\u00E8tre
+getopt.requires={0}: l'option ''{1}'' requiert un param\u00E8tre
+getopt.unrecognized={0}: option non reconnue ''--{1}''
+getopt.unrecognized2={0}: option non reconnue ''{1}{2}''
+getopt.illegal={0}: option ill\u00E9gale -- {1}
+getopt.invalid={0}: option invalide -- {1}
+getopt.requires2={0}: cette option requiert un param\u00E8tre -- {1}
+getopt.invalidValue=Valeur invalide {0} pour le param\u00E8tre 'has_arg'
diff --git a/core/java/src/gnu/getopt/MessagesBundle_hu.properties b/core/java/src/gnu/getopt/MessagesBundle_hu.properties
new file mode 100644
index 0000000000000000000000000000000000000000..455345970bf37ad591c42c053d6e5283737d65a5
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle_hu.properties
@@ -0,0 +1,30 @@
+#**************************************************************************
+#* MessagesBundle.properties -- Hungarian language error messages
+#*
+#* Copyright (c) 2001 by Gyula Csom (csom@informix.hu) 
+#*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: opci\u00F3 ''{1}'' f\u00E9lre\u00E9rthet\u0151
+getopt.arguments1={0}: opci\u00F3 ''--{1}'' nem enged meg argumentumot
+getopt.arguments2={0}: opci\u00F3 ''{1}{2}'' nem enged meg argumentumot
+getopt.requires={0}: opci\u00F3 ''{1}'' argumentumot ig\u00E9nyel
+getopt.unrecognized={0}: ismeretlen opci\u00F3 ''--{1}''
+getopt.unrecognized2={0}: ismeretlen opci\u00F3 ''{1}{2}''
+getopt.illegal={0}: illeg\u00E1lis opci\u00F3 -- {1}
+getopt.invalid={0}: \u00E9rv\u00E9nytelen opci\u00F3 -- {1}
+getopt.requires2={0}: az opci\u00F3 argumentumot ig\u00E9nyel -- {1}
+getopt.invalidValue=\u00C9rv\u00E9nytelen \u00E9rt\u00E9k {0} a k\u00F6vetkez\u0151 param\u00E9terhez 'has_arg' 
diff --git a/core/java/src/gnu/getopt/MessagesBundle_it.properties b/core/java/src/gnu/getopt/MessagesBundle_it.properties
new file mode 100644
index 0000000000000000000000000000000000000000..689b9608bbadb9a9e6e64e87b4b9c66cbe04c97a
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle_it.properties
@@ -0,0 +1,30 @@
+#**************************************************************************
+#* MessagesBundle.properties -- Italian language error messages
+#*
+#* Copyright (c) 2005 by Sandro Tosi (matrixhasu@gmail.com)
+#*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: l'opzione ''{1}'' \u00E8 ambigua
+getopt.arguments1={0}: l'opzione ''--{1}'' non ammette un argomento
+getopt.arguments2={0}: l'opzione ''{1}{2}'' non ammette un argomento
+getopt.requires={0}: l'opzione ''{1}'' richiede un argomento
+getopt.unrecognized={0}: opzione non riconosciuta ''--{1}''
+getopt.unrecognized2={0}: opzione non riconosciuta ''{1}{2}''
+getopt.illegal={0}: opzione illegale -- {1}
+getopt.invalid={0}: opzione invalida -- {1}
+getopt.requires2={0}: l'opzione richiede un argomento -- {1}
+getopt.invalidValue=Valore non valido {0} per il parametro 'has_arg' 
diff --git a/core/java/src/gnu/getopt/MessagesBundle_ja.properties b/core/java/src/gnu/getopt/MessagesBundle_ja.properties
new file mode 100644
index 0000000000000000000000000000000000000000..aeddde12735bcfa53f1fe153a87ee0579a9d15cd
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle_ja.properties
@@ -0,0 +1,30 @@
+#**************************************************************************
+#* MessagesBundle.properties -- Japanese language error messages
+#*
+#* Copyright (c) 2001 by Yasuoka Masahiko (yasuoka@yasuoka.net)
+#*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: ''{1}'' \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u66d6\u6627\u3067\u3059\u3002
+getopt.arguments1={0}: ''--{1}'' \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u3082\u3061\u307e\u305b\u3093\u3002
+getopt.arguments2={0}: ''{1}{2}'' \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u3082\u3061\u307e\u305b\u3093\u3002
+getopt.requires={0}: ''{1}'' \u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\u5fc5\u8981\u3067\u3059\u3002
+getopt.unrecognized={0}: ''--{1}'' \u306f\u7121\u52b9\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u3059\u3002
+getopt.unrecognized2={0}: ''{1}{2}'' \u306f\u7121\u52b9\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u3059\u3002
+getopt.illegal={0}: -- {1} \u306f\u4e0d\u6b63\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u3059\u3002
+getopt.invalid={0}: -- {1} \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002
+getopt.requires2={0}: -- {1} \u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\u5fc5\u8981\u3067\u3059\u3002
+getopt.invalidValue={0} \u306f\u3001'has_arg' \u30d1\u30e9\u30e1\u30fc\u30bf\u3068\u3057\u3066\u4e0d\u6b63\u306a\u5024\u3067\u3059\u3002
diff --git a/core/java/src/gnu/getopt/MessagesBundle_nb.properties b/core/java/src/gnu/getopt/MessagesBundle_nb.properties
new file mode 100644
index 0000000000000000000000000000000000000000..110aed77267fbffa0cdbc56c9ca4ca3324f1a7f9
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle_nb.properties
@@ -0,0 +1,30 @@
+#**************************************************************************
+#* MessagesBundle.properties -- Norwegian language error messages
+#*
+#* Copyright (c) 1999 by Bj\u00F8rn-Ove Heimsund (s811@ii.uib.no)
+#*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: flagget ''{1}'' er flertydig
+getopt.arguments1={0}: flagget ''--{1}'' tillater ikke et argument
+getopt.arguments2={0}: flagget ''{1}{2}'' tillater ikke et argument
+getopt.requires={0}: flagget ''{1}'' krever et argument
+getopt.unrecognized={0}: ukjent flagg ''--{1}''
+getopt.unrecognized2={0}: ukjent flagg ''{1}{2}''
+getopt.illegal={0}: ugyldig flagg -- {1}
+getopt.invalid={0}: ugyldig flagg -- {1}
+getopt.requires2={0}: flagget krever et argument -- {1}
+getopt.invalidValue=Ugyldig verdi {0} for parameter 'has_arg' 
diff --git a/core/java/src/gnu/getopt/MessagesBundle_nl.properties b/core/java/src/gnu/getopt/MessagesBundle_nl.properties
new file mode 100644
index 0000000000000000000000000000000000000000..50b2fe56e9c3b771a9ca1686eade6e88f068ab3a
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle_nl.properties
@@ -0,0 +1,30 @@
+#**************************************************************************
+#* MessagesBundle_nl.properties -- Dutch language error messages
+#*
+#* Copyright (c) 1999 by Ernst de Haan (ernst@jollem.com)
+#*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: optie ''{1}'' is ambigue
+getopt.arguments1={0}: optie ''--{1}'' staat geen argumenten toe
+getopt.arguments2={0}: optie ''{1}{2}'' staat geen argumenten toe
+getopt.requires={0}: optie ''{1}'' heeft een argument nodig
+getopt.unrecognized={0}: onbekende optie ''--{1}''
+getopt.unrecognized2={0}: onbekende optie ''{1}{2}''
+getopt.illegal={0}: niet-toegestane optie -- {1}
+getopt.invalid={0}: onjuiste optie -- {1}
+getopt.requires2={0}: optie heeft een argument nodig -- {1}
+getopt.invalidValue=Ongeldige waarde {0} voor parameter 'has_arg' 
diff --git a/core/java/src/gnu/getopt/MessagesBundle_pl.properties b/core/java/src/gnu/getopt/MessagesBundle_pl.properties
new file mode 100644
index 0000000000000000000000000000000000000000..557220fd4a846eb0b502c88a8d569a7d95e03aee
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle_pl.properties
@@ -0,0 +1,31 @@
+#**************************************************************************
+#* MessagesBundle_pl.properties -- Polish language error messages
+#*
+#* Polish Messages Copyright (c) 2006 by Krzysztof Szyma?ski (sirch.s@gmail.com)
+#* These messages are encoded in ISO-8859-2
+#*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: opcja ''{1}''jest wieloznaczna
+getopt.arguments1={0}: opcja ''--{1}'' nie akceptuje argumentu
+getopt.arguments2={0}: opcja ''{1}{2}'' nie akceptuje argumentu
+getopt.requires={0}: opcja ''{1}'' wymaga argumentu
+getopt.unrecognized={0}: nierozpoznana opcja ''--{1}''
+getopt.unrecognized2={0}: nierozpoznana opcja ''{1}{2}''
+getopt.illegal={0}: nie dopuszczalna opcja --{1}
+getopt.invalid={0}: b??dna opcja --{1}
+getopt.requires2={0}: opcja --{1} oczekuje argumentu 
+getopt.invalidValue=Nie poprawna warto?? {0} argument 'has_arg' 
diff --git a/core/java/src/gnu/getopt/MessagesBundle_ro.properties b/core/java/src/gnu/getopt/MessagesBundle_ro.properties
new file mode 100644
index 0000000000000000000000000000000000000000..7a3eacaaaac1c9b18fe1b708b0113ce78d246b3d
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle_ro.properties
@@ -0,0 +1,32 @@
+#**************************************************************************
+#* MessagesBundle_fr.properties -- Romanian language error messages
+#*
+#* Copyright (c) 1999 Free Software Foundation, Inc.
+#*    Marian-Nicolae Ion <marian_ion@noos.fr>, 2004,
+#* These messages are encoded in ISO-8859-2
+#*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your optiunea) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: op\u0163iunea ''{1}'' este ambigu\u0103
+getopt.arguments1={0}: op\u0163iunea ''--{1}'' nu accept\u0103 parametru
+getopt.arguments2={0}: op\u0163iunea ''{1}{2}'' nu accept\u0103 parametru
+getopt.requires={0}: op\u0163iunea ''{1}'' cere un parametru
+getopt.unrecognized={0}: op\u0163iune necunoscut\u0103 ''--{1}''
+getopt.unrecognized2={0}: op\u0163iune necunoscut\u0103 ''{1}{2}''
+getopt.illegal={0}: op\u0163iune ilegal\u0103 -- {1}
+getopt.invalid={0}: op\u0163iune invalid\u0103 -- {1}
+getopt.requires2={0}: aceast\u0103 op\u0163iune cere un parametru -- {1}
+getopt.invalidValue=Valoare invalid\u0103 {0} pentru parametrul 'has_arg'
diff --git a/core/java/src/gnu/getopt/MessagesBundle_zh.properties b/core/java/src/gnu/getopt/MessagesBundle_zh.properties
new file mode 100644
index 0000000000000000000000000000000000000000..bd37bf23ba23515068beeb685b1133d5451d71bc
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle_zh.properties
@@ -0,0 +1,30 @@
+#**************************************************************************
+#* MessagesBundle.properties Simple Chinese language error messages
+#*
+#* Copyright (c) 2012 by David Zhang (david290@qq.com)
+#*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: \u9009\u9879 ''{1}'' \u6709\u6B67\u4E49
+getopt.arguments1={0}:\u9009\u9879''--{1}'' \u4E0D\u80FD\u5E26\u53C2\u6570
+getopt.arguments2={0}:\u9009\u9879''{1}{2}''\u4E0D\u80FD\u5E26\u53C2\u6570
+getopt.requires={0}: \u9009\u9879 ''{1}'' \u8981\u6C42\u5E26\u6709\u53C2\u6570
+getopt.unrecognized={0}: \u65E0\u6CD5\u8BC6\u522B\u7684\u9009\u9879 ''--{1}''
+getopt.unrecognized2={0}:\u65E0\u6CD5\u8BC6\u522B\u7684\u9009\u9879''{1}{2}''
+getopt.illegal={0}: \u975E\u6CD5\u9009\u9879 -- {1}
+getopt.invalid={0}: \u65E0\u6548\u9009\u9879 -- {1}
+getopt.requires2={0}:\u9009\u9879\u9700\u8981\u6709\u53C2\u6570 -- {1}
+getopt.invalidValue=\u9009\u9879 'has_arg'\u7684\u503C {0} \u975E\u6CD5
diff --git a/core/java/src/gnu/getopt/MessagesBundle_zh_TW.properties b/core/java/src/gnu/getopt/MessagesBundle_zh_TW.properties
new file mode 100644
index 0000000000000000000000000000000000000000..4dd5ba4bc39c3ffa7d96b9443fa86176c4026e94
--- /dev/null
+++ b/core/java/src/gnu/getopt/MessagesBundle_zh_TW.properties
@@ -0,0 +1,30 @@
+#**************************************************************************
+#* MessagesBundle.properties  - Triditional  Chinese language error messages
+#*
+#* Copyright (c) 2012 by David Zhang (david290@qq.com)
+#*
+#* This program is free software; you can redistribute it and/or modify
+#* it under the terms of the GNU Library General Public License as published
+#* by  the Free Software Foundation; either version 2 of the License or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful, but
+#* WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU Library General Public License for more details.
+#*
+#* You should have received a copy of the GNU Library General Public License
+#* along with this program; see the file COPYING.LIB.  If not, write to
+#* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
+#* Boston, MA  02111-1307 USA
+#**************************************************************************/
+getopt.ambigious={0}: \u9078\u9805 ''{1}'' \u6709\u6B67\u7FA9
+getopt.arguments1={0}:\u9078\u9805''--{1}'' \u4E0D\u80FD\u5E36\u53C3\u6578
+getopt.arguments2={0}:\u9078\u9805''{1}{2}''\u4E0D\u80FD\u5E36\u53C3\u6578
+getopt.requires={0}: \u9078\u9805 ''{1}'' \u8981\u6C42\u5E36\u6709\u53C3\u6578
+getopt.unrecognized={0}: \u7121\u6CD5\u8B58\u5225\u7684\u9078\u9805 ''--{1}''
+getopt.unrecognized2={0}:\u7121\u6CD5\u8B58\u5225\u7684\u9078\u9805''{1}{2}''
+getopt.illegal={0}: \u975E\u6CD5\u9078\u9805 -- {1}
+getopt.invalid={0}: \u7121\u6548\u9078\u9805 -- {1}
+getopt.requires2={0}:\u9078\u9805\u9700\u8981\u6709\u53C3\u6578 -- {1}
+getopt.invalidValue=\u9078\u9805 'has_arg'\u7684\u503C {0} \u975E\u6CD5
diff --git a/core/java/src/gnu/getopt/package.html b/core/java/src/gnu/getopt/package.html
new file mode 100644
index 0000000000000000000000000000000000000000..4f7b81adc13d01658c651cdf15c29ca64792cb7d
--- /dev/null
+++ b/core/java/src/gnu/getopt/package.html
@@ -0,0 +1,25 @@
+<html><body>
+<p>
+This is Java getopt 1.0.14 (released 2012/02/08)
+</p><p>
+Added in I2P 0.9.12.
+Source was retrieved from <a href="https://github.com/arenn/java-getopt">here</a>.
+Previous version 1.0.13 (released 2006/08/29)
+is available <a href="http://www.urbanophile.com/arenn/hacking/getopt/">here</a>.
+</p><p>
+Copyright (c) 1998 by Aaron M. Renn (arenn@urbanophile.com),
+LGPL v2.
+</p><p>
+Changes:
+<ul><li>
+Simplified Chinese
+MessagesBundle_chs.properties renamed to MessagesBundle_zh.properties
+</li><li>
+Traditional Chinese
+MessagesBundle_cht.properties renamed to MessagesBundle_zh_TW.properties
+</li><li>
+Norwegian Bokmaal
+MessagesBundle_no.properties renamed to MessagesBundle_nb.properties
+</li></ul>
+</p>
+</body></html>
diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java
index 96a3ef8c92f2aa355d6fcbb9db2735c947e8bce7..5d59638d535d2fd5736f75ff96e89ecf0f68f8d6 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.10";
+    public final static String VERSION = "0.9.11";
 
     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 d20ceb982da0d44be89f7b809e3e2398c4427eee..69e110632ea1962709228952bd492b9b333f9692 100644
--- a/core/java/src/net/i2p/I2PAppContext.java
+++ b/core/java/src/net/i2p/I2PAppContext.java
@@ -128,8 +128,7 @@ public class I2PAppContext {
                          _lock5 = new Object(), _lock6 = new Object(), _lock7 = new Object(), _lock8 = new Object(),
                          _lock9 = new Object(), _lock10 = new Object(), _lock11 = new Object(), _lock12 = new Object(),
                          _lock13 = new Object(), _lock14 = new Object(), _lock15 = new Object(), _lock16 = new Object(),
-                         _lock17 = new Object(), _lock18 = new Object(), _lock19 = new Object(), _lock20 = new Object(),
-                         _lock21 = new Object();
+                         _lock17 = new Object(), _lock18 = new Object(), _lock19 = new Object(), _lock20 = new Object();
 
     /**
      * Pull the default context, creating a new one if necessary, else using 
@@ -1017,15 +1016,6 @@ public class I2PAppContext {
         }
     }
 
-    /**
-     *  The controller of router, plugin, and other updates.
-     *  @return always null in I2PAppContext, the update manager if in RouterContext and it is registered
-     *  @since 0.9.4
-     */
-    public UpdateManager updateManager() {
-        return null;
-    }
-
     /**
      *  The RouterAppManager in RouterContext, null always in I2PAppContext
      *  @return null always
diff --git a/core/java/src/net/i2p/client/I2PClient.java b/core/java/src/net/i2p/client/I2PClient.java
index 521ed35b5bc8a6e143a96394d788770b0155e625..c4503608cf240a1281954268d913e33fd3d0304b 100644
--- a/core/java/src/net/i2p/client/I2PClient.java
+++ b/core/java/src/net/i2p/client/I2PClient.java
@@ -15,6 +15,7 @@ import java.io.OutputStream;
 import java.util.Properties;
 
 import net.i2p.I2PException;
+import net.i2p.crypto.SigType;
 import net.i2p.data.Certificate;
 import net.i2p.data.Destination;
 
@@ -40,6 +41,11 @@ public interface I2PClient {
     /** @since 0.8.1 */
     public final static String PROP_RELIABILITY_NONE = "none";
 
+    /** @since 0.9.12 */
+    public static final String PROP_SIGTYPE = "i2cp.destination.sigType";
+    /** @since 0.9.12 */
+    public static final SigType DEFAULT_SIGTYPE = SigType.DSA_SHA1;
+
     /**
      * For router->client payloads.
      *
@@ -83,6 +89,18 @@ public interface I2PClient {
      */
     public Destination createDestination(OutputStream destKeyStream) throws I2PException, IOException;
 
+    /**
+     * Create a destination with the given signature type.
+     * It will have a null certificate for DSA 1024/160 and KeyCertificate otherwise.
+     * This is not bound to the I2PClient, you must supply the data back again
+     * in createSession().
+     *
+     * @param destKeyStream location to write out the destination, PrivateKey, and SigningPrivateKey,
+     *                      format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile}
+     * @since 0.9.12
+     */
+    public Destination createDestination(OutputStream destKeyStream, SigType type) throws I2PException, IOException;
+
     /** Create a new destination with the given certificate and store it, along with the private 
      * encryption and signing keys at the specified location
      *
diff --git a/core/java/src/net/i2p/client/I2PClientImpl.java b/core/java/src/net/i2p/client/I2PClientImpl.java
index 932daa61a5a4f0c9fc9476bce23d82253ecee215..e0c7feea9ff7f025df66542feba73081897f0ed4 100644
--- a/core/java/src/net/i2p/client/I2PClientImpl.java
+++ b/core/java/src/net/i2p/client/I2PClientImpl.java
@@ -12,17 +12,22 @@ package net.i2p.client;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.security.GeneralSecurityException;
 import java.util.Properties;
 
 import net.i2p.I2PAppContext;
 import net.i2p.I2PException;
 import net.i2p.crypto.KeyGenerator;
+import net.i2p.crypto.SigType;
 import net.i2p.data.Certificate;
 import net.i2p.data.Destination;
+import net.i2p.data.KeyCertificate;
 import net.i2p.data.PrivateKey;
 import net.i2p.data.PublicKey;
 import net.i2p.data.SigningPrivateKey;
 import net.i2p.data.SigningPublicKey;
+import net.i2p.data.SimpleDataStructure;
+import net.i2p.util.RandomSource;
 
 /**
  * Base client implementation.
@@ -34,7 +39,7 @@ import net.i2p.data.SigningPublicKey;
 class I2PClientImpl implements I2PClient {
 
     /**
-     * Create the destination with a null payload.
+     * Create a destination with a DSA 1024/160 signature type and a null certificate.
      * This is not bound to the I2PClient, you must supply the data back again
      * in createSession().
      *
@@ -42,9 +47,26 @@ class I2PClientImpl implements I2PClient {
      *                      format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile}
      */
     public Destination createDestination(OutputStream destKeyStream) throws I2PException, IOException {
-        Certificate cert = new Certificate();
-        cert.setCertificateType(Certificate.CERTIFICATE_TYPE_NULL);
-        cert.setPayload(null);
+        return createDestination(destKeyStream, DEFAULT_SIGTYPE);
+    }
+
+    /**
+     * Create a destination with the given signature type.
+     * It will have a null certificate for DSA 1024/160 and KeyCertificate otherwise.
+     * This is not bound to the I2PClient, you must supply the data back again
+     * in createSession().
+     *
+     * @param destKeyStream location to write out the destination, PrivateKey, and SigningPrivateKey,
+     *                      format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile}
+     * @since 0.9.12
+     */
+    public Destination createDestination(OutputStream destKeyStream, SigType type) throws I2PException, IOException {
+        Certificate cert;
+        if (type == SigType.DSA_SHA1) {
+            cert = Certificate.NULL_CERT;
+        } else {
+            cert = new KeyCertificate(type);
+        }
         return createDestination(destKeyStream, cert);
     }
 
@@ -52,20 +74,49 @@ class I2PClientImpl implements I2PClient {
      * Create the destination with the given payload and write it out along with
      * the PrivateKey and SigningPrivateKey to the destKeyStream
      *
+     * If cert is a KeyCertificate, the signing keypair will be of the specified type.
+     * The KeyCertificate data must be .............................
+     * The padding if any will be randomized. The extra key data if any will be set in the
+     * key cert.
+     *
      * @param destKeyStream location to write out the destination, PrivateKey, and SigningPrivateKey,
      *                      format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile}
      */
     public Destination createDestination(OutputStream destKeyStream, Certificate cert) throws I2PException, IOException {
         Destination d = new Destination();
-        d.setCertificate(cert);
         Object keypair[] = KeyGenerator.getInstance().generatePKIKeypair();
         PublicKey publicKey = (PublicKey) keypair[0];
         PrivateKey privateKey = (PrivateKey) keypair[1];
-        Object signingKeys[] = KeyGenerator.getInstance().generateSigningKeypair();
+        SimpleDataStructure signingKeys[];
+        if (cert.getCertificateType() == Certificate.CERTIFICATE_TYPE_KEY) {
+            KeyCertificate kcert = cert.toKeyCertificate();
+            SigType type = kcert.getSigType();
+            try {
+                signingKeys = KeyGenerator.getInstance().generateSigningKeys(type);
+            } catch (GeneralSecurityException gse) {
+                throw new I2PException("keygen fail", gse);
+            }
+        } else {
+            signingKeys = KeyGenerator.getInstance().generateSigningKeys();
+        }
         SigningPublicKey signingPubKey = (SigningPublicKey) signingKeys[0];
         SigningPrivateKey signingPrivKey = (SigningPrivateKey) signingKeys[1];
         d.setPublicKey(publicKey);
         d.setSigningPublicKey(signingPubKey);
+        if (cert.getCertificateType() == Certificate.CERTIFICATE_TYPE_KEY) {
+            // fix up key certificate or padding
+            KeyCertificate kcert = cert.toKeyCertificate();
+            SigType type = kcert.getSigType();
+            int len = type.getPubkeyLen();
+            if (len < 128) {
+                byte[] pad = new byte[128 - len];
+                RandomSource.getInstance().nextBytes(pad);
+                d.setPadding(pad);
+            } else if (len > 128) {
+                System.arraycopy(signingPubKey.getData(), 128, kcert.getPayload(), KeyCertificate.HEADER_LENGTH, len - 128);
+            }
+        }
+        d.setCertificate(cert);
 
         d.writeBytes(destKeyStream);
         privateKey.writeBytes(destKeyStream);
diff --git a/core/java/src/net/i2p/client/I2PSessionImpl.java b/core/java/src/net/i2p/client/I2PSessionImpl.java
index 293bc91636d83d1b2d4271f607da0078e93e90bc..460ee13f34cb1528d91795f53c465459f023d0d7 100644
--- a/core/java/src/net/i2p/client/I2PSessionImpl.java
+++ b/core/java/src/net/i2p/client/I2PSessionImpl.java
@@ -67,7 +67,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
     /** private key for decryption */
     private final PrivateKey _privateKey;
     /** private key for signing */
-    private final SigningPrivateKey _signingPrivateKey;
+    private   /* final */   SigningPrivateKey _signingPrivateKey;
     /** configuration options */
     private final Properties _options;
     /** this session's Id */
@@ -390,6 +390,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
     private void readDestination(InputStream destKeyStream) throws DataFormatException, IOException {
         _myDestination.readBytes(destKeyStream);
         _privateKey.readBytes(destKeyStream);
+        _signingPrivateKey = new SigningPrivateKey(_myDestination.getSigningPublicKey().getType());
         _signingPrivateKey.readBytes(destKeyStream);
     }
 
diff --git a/core/java/src/net/i2p/client/I2PSimpleClient.java b/core/java/src/net/i2p/client/I2PSimpleClient.java
index e91ae2f8b7e9416359eb20f2524f3bb4e3e8e8d4..38286f2b1ba9f05654f138be63efa786fb99aa73 100644
--- a/core/java/src/net/i2p/client/I2PSimpleClient.java
+++ b/core/java/src/net/i2p/client/I2PSimpleClient.java
@@ -12,6 +12,7 @@ import java.util.Properties;
 
 import net.i2p.I2PAppContext;
 import net.i2p.I2PException;
+import net.i2p.crypto.SigType;
 import net.i2p.data.Certificate;
 import net.i2p.data.Destination;
 
@@ -20,14 +21,30 @@ import net.i2p.data.Destination;
  * just used to talk to the router.
  */
 public class I2PSimpleClient implements I2PClient {
-    /** @deprecated Don't do this */
+
+    /**
+     *  @deprecated Don't do this
+     *  @throws UnsupportedOperationException always
+     */
     public Destination createDestination(OutputStream destKeyStream) throws I2PException, IOException {
-        return null;
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     *  @deprecated Don't do this
+     *  @throws UnsupportedOperationException always
+     *  @since 0.9.12
+     */
+    public Destination createDestination(OutputStream destKeyStream, SigType type) throws I2PException, IOException {
+        throw new UnsupportedOperationException();
     }
 
-    /** @deprecated or this */
+    /**
+     *  @deprecated Don't do this
+     *  @throws UnsupportedOperationException always
+     */
     public Destination createDestination(OutputStream destKeyStream, Certificate cert) throws I2PException, IOException {
-        return null;
+        throw new UnsupportedOperationException();
     }
 
     /**
@@ -37,6 +54,7 @@ public class I2PSimpleClient implements I2PClient {
     public I2PSession createSession(InputStream destKeyStream, Properties options) throws I2PSessionException {
         return createSession(I2PAppContext.getGlobalContext(), options);
     }
+
     /**
      * Create a new session (though do not connect it yet)
      *
diff --git a/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java
index 620f571f4d328604b50127df06224858754d8c30..09f224efc06f98ab65fc6b5f0fa3e026870be490 100644
--- a/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java
+++ b/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java
@@ -14,6 +14,7 @@ import java.util.concurrent.ConcurrentHashMap;
 
 import net.i2p.I2PAppContext;
 import net.i2p.crypto.KeyGenerator;
+import net.i2p.crypto.SigType;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Destination;
@@ -105,6 +106,15 @@ class RequestLeaseSetMessageHandler extends HandlerImpl {
         }
         try {
             leaseSet.sign(session.getPrivateKey());
+            // Workaround for unparsable serialized signing private key for revocation
+            // Send him a dummy DSA_SHA1 private key since it's unused anyway
+            // See CreateLeaseSetMessage.doReadMessage()
+            SigningPrivateKey spk = li.getSigningPrivateKey();
+            if (!_context.isRouterContext() && spk.getType() != SigType.DSA_SHA1) {
+                byte[] dummy = new byte[SigningPrivateKey.KEYSIZE_BYTES];
+                _context.random().nextBytes(dummy);
+                spk = new SigningPrivateKey(dummy);
+            }
             session.getProducer().createLeaseSet(session, leaseSet, li.getSigningPrivateKey(), li.getPrivateKey());
             session.setLeaseSet(leaseSet);
         } catch (DataFormatException dfe) {
diff --git a/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java b/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java
index 00c897a6f5d4a637afe0c8eb1f6795d593294835..d22bafd2e5244dfdfd9e66a100692cc5a07ad2a6 100644
--- a/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java
+++ b/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java
@@ -14,6 +14,7 @@ import java.io.IOException;
 import net.i2p.I2PAppContext;
 import net.i2p.crypto.DSAEngine;
 import net.i2p.crypto.SHA256Generator;
+import net.i2p.crypto.SigType;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Destination;
 import net.i2p.data.Hash;
@@ -67,7 +68,10 @@ public final class I2PDatagramDissector {
         try {
             // read destination
             rxDest = Destination.create(dgStream);
-            rxSign = new Signature();
+            SigType type = rxDest.getSigningPublicKey().getType();
+            if (type == null)
+                throw new DataFormatException("unsupported sig type");
+            rxSign = new Signature(type);
             // read signature
             rxSign.readBytes(dgStream);
             
diff --git a/core/java/src/net/i2p/crypto/DSAEngine.java b/core/java/src/net/i2p/crypto/DSAEngine.java
index dce8843e624b80004ccc8dde4123dc9ae3db1135..b80dac38c6395688de96544ecbddfdb71334d77c 100644
--- a/core/java/src/net/i2p/crypto/DSAEngine.java
+++ b/core/java/src/net/i2p/crypto/DSAEngine.java
@@ -89,13 +89,20 @@ public class DSAEngine {
      *  Uses TheCrypto code for DSA-SHA1 unless configured to use the java.security libraries.
      */
     public boolean verifySignature(Signature signature, byte signedData[], SigningPublicKey verifyingKey) {
+        return verifySignature(signature, signedData, 0, signedData.length, verifyingKey);
+    }
+
+    /**
+     *  Verify using any sig type as of 0.9.12 (DSA only prior to that)
+     */
+    public boolean verifySignature(Signature signature, byte signedData[], int offset, int size, SigningPublicKey verifyingKey) {
         boolean rv;
         SigType type = signature.getType();
         if (type != verifyingKey.getType())
             throw new IllegalArgumentException("type mismatch sig=" + signature.getType() + " key=" + verifyingKey.getType());
         if (type != SigType.DSA_SHA1) {
             try {
-                rv = altVerifySig(signature, signedData, verifyingKey);
+                rv = altVerifySig(signature, signedData, offset, size, verifyingKey);
                 if ((!rv) && _log.shouldLog(Log.WARN))
                     _log.warn(type + " Sig Verify Fail");
                 return rv;
@@ -107,7 +114,7 @@ public class DSAEngine {
         }
         if (_useJavaLibs) {
             try {
-                rv = altVerifySigSHA1(signature, signedData, verifyingKey);
+                rv = altVerifySigSHA1(signature, signedData, offset, size, verifyingKey);
                 if ((!rv) && _log.shouldLog(Log.WARN))
                     _log.warn("Lib DSA Sig Verify Fail");
                 return rv;
@@ -117,19 +124,12 @@ public class DSAEngine {
                 // now try TheCrypto
             }
         }
-        rv = verifySignature(signature, signedData, 0, signedData.length, verifyingKey);
+        rv = verifySignature(signature, calculateHash(signedData, offset, size), verifyingKey);
         if ((!rv) && _log.shouldLog(Log.WARN))
             _log.warn("TheCrypto DSA Sig Verify Fail");
         return rv;
     }
 
-    /**
-     *  Verify using DSA-SHA1 ONLY
-     */
-    public boolean verifySignature(Signature signature, byte signedData[], int offset, int size, SigningPublicKey verifyingKey) {
-        return verifySignature(signature, calculateHash(signedData, offset, size), verifyingKey);
-    }
-
     /**
      *  Verify using DSA-SHA1 ONLY
      */
@@ -256,16 +256,26 @@ public class DSAEngine {
     }
 
     /**
-     *  Sign using DSA-SHA1 or ECDSA.
+     *  Sign using any key type.
      *  Uses TheCrypto code unless configured to use the java.security libraries.
      *
      *  @return null on error
      */
     public Signature sign(byte data[], SigningPrivateKey signingKey) {
+        return sign(data, 0, data.length, signingKey);
+    }
+
+    /**
+     *  Sign using any key type as of 0.9.12 (DSA-SHA1 only prior to that)
+     *
+     *  @return null on error
+     */
+    public Signature sign(byte data[], int offset, int length, SigningPrivateKey signingKey) {
+        if ((signingKey == null) || (data == null) || (data.length <= 0)) return null;
         SigType type = signingKey.getType();
         if (type != SigType.DSA_SHA1) {
             try {
-                return altSign(data, signingKey);
+                return altSign(data, offset, length, signingKey);
             } catch (GeneralSecurityException gse) {
                 if (_log.shouldLog(Log.WARN))
                     _log.warn(type + " Sign Fail", gse);
@@ -274,23 +284,13 @@ public class DSAEngine {
         }
         if (_useJavaLibs) {
             try {
-                return altSignSHA1(data, signingKey);
+                return altSignSHA1(data, offset, length, signingKey);
             } catch (GeneralSecurityException gse) {
                 if (_log.shouldLog(Log.WARN))
                     _log.warn("Lib Sign Fail, privkey = " + signingKey, gse);
                 // now try TheCrypto
             }
         }
-        return sign(data, 0, data.length, signingKey);
-    }
-
-    /**
-     *  Sign using DSA-SHA1 ONLY
-     *
-     *  @return null on error
-     */
-    public Signature sign(byte data[], int offset, int length, SigningPrivateKey signingKey) {
-        if ((signingKey == null) || (data == null) || (data.length <= 0)) return null;
         SHA1Hash h = calculateHash(data, offset, length);
         return sign(h, signingKey);
     }
@@ -495,20 +495,20 @@ public class DSAEngine {
     /**
      *  Generic verify DSA_SHA1, ECDSA, or RSA
      *  @throws GeneralSecurityException if algorithm unvailable or on other errors
-     *  @since 0.9.9
+     *  @since 0.9.9 added off/len 0.9.12
      */
-    private boolean altVerifySig(Signature signature, byte[] data, SigningPublicKey verifyingKey)
+    private boolean altVerifySig(Signature signature, byte[] data, int offset, int len, SigningPublicKey verifyingKey)
                         throws GeneralSecurityException {
         SigType type = signature.getType();
         if (type != verifyingKey.getType())
             throw new IllegalArgumentException("type mismatch sig=" + type + " key=" + verifyingKey.getType());
         if (type == SigType.DSA_SHA1)
-            return altVerifySigSHA1(signature, data, verifyingKey);
+            return altVerifySigSHA1(signature, data, offset, len, verifyingKey);
 
         java.security.Signature jsig = java.security.Signature.getInstance(type.getAlgorithmName());
         PublicKey pubKey = SigUtil.toJavaKey(verifyingKey);
         jsig.initVerify(pubKey);
-        jsig.update(data);
+        jsig.update(data, offset, len);
         boolean rv = jsig.verify(SigUtil.toJavaSig(signature));
         return rv;
     }
@@ -555,13 +555,14 @@ public class DSAEngine {
     /**
      *  Alternate to verifySignature() using java.security libraries.
      *  @throws GeneralSecurityException if algorithm unvailable or on other errors
-     *  @since 0.8.7
+     *  @since 0.8.7 added off/len 0.9.12
      */
-    private boolean altVerifySigSHA1(Signature signature, byte[] data, SigningPublicKey verifyingKey) throws GeneralSecurityException {
+    private boolean altVerifySigSHA1(Signature signature, byte[] data, int offset,
+                                     int len, SigningPublicKey verifyingKey) throws GeneralSecurityException {
         java.security.Signature jsig = java.security.Signature.getInstance("SHA1withDSA");
         PublicKey pubKey = SigUtil.toJavaDSAKey(verifyingKey);
         jsig.initVerify(pubKey);
-        jsig.update(data);
+        jsig.update(data, offset, len);
         boolean rv = jsig.verify(SigUtil.toJavaSig(signature));
         //if (!rv) {
         //    System.out.println("BAD SIG\n" + net.i2p.util.HexDump.dump(signature.getData()));
@@ -573,17 +574,18 @@ public class DSAEngine {
     /**
      *  Generic sign DSA_SHA1, ECDSA, or RSA
      *  @throws GeneralSecurityException if algorithm unvailable or on other errors
-     *  @since 0.9.9
+     *  @since 0.9.9 added off/len 0.9.12
      */
-    private Signature altSign(byte[] data, SigningPrivateKey privateKey) throws GeneralSecurityException {
+    private Signature altSign(byte[] data, int offset, int len,
+                              SigningPrivateKey privateKey) throws GeneralSecurityException {
         SigType type = privateKey.getType();
         if (type == SigType.DSA_SHA1)
-            return altSignSHA1(data, privateKey);
+            return altSignSHA1(data, offset, len, privateKey);
 
         java.security.Signature jsig = java.security.Signature.getInstance(type.getAlgorithmName());
         PrivateKey privKey = SigUtil.toJavaKey(privateKey);
         jsig.initSign(privKey, _context.random());
-        jsig.update(data);
+        jsig.update(data, offset, len);
         return SigUtil.fromJavaSig(jsig.sign(), type);
     }
 
@@ -622,13 +624,14 @@ public class DSAEngine {
     /**
      *  Alternate to sign() using java.security libraries.
      *  @throws GeneralSecurityException if algorithm unvailable or on other errors
-     *  @since 0.8.7
+     *  @since 0.8.7 added off/len args 0.9.12
      */
-    private Signature altSignSHA1(byte[] data, SigningPrivateKey privateKey) throws GeneralSecurityException {
+    private Signature altSignSHA1(byte[] data, int offset, int len,
+                                  SigningPrivateKey privateKey) throws GeneralSecurityException {
         java.security.Signature jsig = java.security.Signature.getInstance("SHA1withDSA");
         PrivateKey privKey = SigUtil.toJavaDSAKey(privateKey);
         jsig.initSign(privKey, _context.random());
-        jsig.update(data);
+        jsig.update(data, offset, len);
         return SigUtil.fromJavaSig(jsig.sign(), SigType.DSA_SHA1);
     }
 
diff --git a/core/java/src/net/i2p/crypto/HMAC256Generator.java b/core/java/src/net/i2p/crypto/HMAC256Generator.java
index 5d38e5e1de3595e373fd09d93f83c71ed63639ac..688e3148dc479cb5d0387a2edfef2f786dbe04eb 100644
--- a/core/java/src/net/i2p/crypto/HMAC256Generator.java
+++ b/core/java/src/net/i2p/crypto/HMAC256Generator.java
@@ -1,36 +1,101 @@
 package net.i2p.crypto;
 
-import gnu.crypto.hash.Sha256Standalone;
+import java.security.GeneralSecurityException;
+import java.security.Key;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import javax.crypto.spec.SecretKeySpec;
 
 import net.i2p.I2PAppContext;
+import net.i2p.data.DataHelper;
+import net.i2p.data.Hash;
+import net.i2p.data.SessionKey;
 
-import org.bouncycastle.oldcrypto.Digest;
 import org.bouncycastle.oldcrypto.macs.I2PHMac;
 
 /**
- * Calculate the HMAC-SHA256 of a key+message.  All the good stuff occurs
- * in {@link org.bouncycastle.oldcrypto.macs.I2PHMac} and 
- * {@link gnu.crypto.hash.Sha256Standalone}.
+ * Calculate the HMAC-SHA256 of a key+message.
+ * This is compatible with javax.crypto.Mac.getInstance("HmacSHA256").
  *
- * This should be compatible with javax.crypto.Mac.getInstance("HmacSHA256")
- * but that is untested.
+ * As of 0.9.12, uses javax.crypto.Mac.
  *
- * deprecated used only by syndie
+ * Deprecated, used only by Syndie.
  */
 public class HMAC256Generator extends HMACGenerator {
+
+    /**
+     *  @param context unused
+     */
     public HMAC256Generator(I2PAppContext context) { super(context); }
     
+    /**
+     *  @deprecated unused (not even by Syndie)
+     *  @throws UnsupportedOperationException since 0.9.12
+     */
     @Override
     protected I2PHMac acquire() {
-        I2PHMac rv = _available.poll();
-        if (rv != null)
-            return rv;
-        // the HMAC is hardcoded to use SHA256 digest size
-        // for backwards compatability.  next time we have a backwards
-        // incompatible change, we should update this by removing ", 32"
-        return new I2PHMac(new Sha256ForMAC());
+        throw new UnsupportedOperationException();
+    }
+    
+    /**
+     *  Calculate the HMAC of the data with the given key
+     *
+     *  @return the first 16 bytes contain the HMAC, the last 16 bytes are zero
+     *  @deprecated unused (not even by Syndie)
+     *  @throws UnsupportedOperationException always
+     *  @since 0.9.12 overrides HMACGenerator
+     */
+    @Override
+    public Hash calculate(SessionKey key, byte data[]) {
+        throw new UnsupportedOperationException();
     }
     
+    /**
+     *  Calculate the HMAC of the data with the given key.
+     *  Outputs 32 bytes to target starting at targetOffset.
+     *
+     *  @throws UnsupportedOperationException if the JVM does not support it
+     *  @throws IllegalArgumentException for bad key or target too small
+     *  @since 0.9.12 overrides HMACGenerator
+     */
+    @Override
+    public void calculate(SessionKey key, byte data[], int offset, int length, byte target[], int targetOffset) {
+        try {
+            javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA256");
+            Key keyObj = new SecretKeySpec(key.getData(), "HmacSHA256");
+            mac.init(keyObj);
+            mac.update(data, offset, length);
+            mac.doFinal(target, targetOffset);
+        } catch (NoSuchAlgorithmException e) {
+            throw new UnsupportedOperationException("HmacSHA256", e);
+        } catch (GeneralSecurityException e) {
+            throw new IllegalArgumentException("HmacSHA256", e);
+        }
+    }
+    
+    /**
+     *  Verify the MAC inline, reducing some unnecessary memory churn.
+     *
+     *  @param key session key to verify the MAC with
+     *  @param curData MAC to verify
+     *  @param curOffset index into curData to MAC
+     *  @param curLength how much data in curData do we want to run the HMAC over
+     *  @param origMAC what do we expect the MAC of curData to equal
+     *  @param origMACOffset index into origMAC
+     *  @param origMACLength how much of the MAC do we want to verify, use 32 for HMAC256
+     *  @since 0.9.12 overrides HMACGenerator
+     */
+    @Override
+    public boolean verify(SessionKey key, byte curData[], int curOffset, int curLength,
+                          byte origMAC[], int origMACOffset, int origMACLength) {
+        byte calc[] = acquireTmp();
+        calculate(key, curData, curOffset, curLength, calc, 0);
+        boolean eq = DataHelper.eq(calc, 0, origMAC, origMACOffset, origMACLength);
+        releaseTmp(calc);
+        return eq;
+    }
+
+/******
     private static class Sha256ForMAC extends Sha256Standalone implements Digest {
         public String getAlgorithmName() { return "sha256 for hmac"; }
         public int getDigestSize() { return 32; }
@@ -43,7 +108,6 @@ public class HMAC256Generator extends HMACGenerator {
         
     }
     
-/******
     public static void main(String args[]) {
         I2PAppContext ctx = I2PAppContext.getGlobalContext();
         byte data[] = new byte[64];
@@ -53,4 +117,81 @@ public class HMAC256Generator extends HMACGenerator {
         System.out.println(Base64.encode(mac.getData()));
     }
 ******/
+
+    /**
+     *  Test the BC and the JVM's implementations for speed
+     *
+     *  Results on 2012 hexcore box, OpenJDK 7:
+     *    BC 9275 ms (before converting to MessageDigest)
+     *    BC 8500 ms (after converting to MessageDigest)
+     *    JVM 8065 ms
+     *
+     */
+/****
+    public static void main(String args[]) {
+        I2PAppContext ctx = I2PAppContext.getGlobalContext();
+        byte[] rand = new byte[32];
+        byte[] data = new byte[1500];
+        Key keyObj = new SecretKeySpec(rand, "HmacSHA256");
+        SessionKey key = new SessionKey(rand);
+
+        HMAC256Generator gen = new HMAC256Generator(I2PAppContext.getGlobalContext());
+        byte[] result = new byte[32];
+        javax.crypto.Mac mac;
+        try {
+            mac = javax.crypto.Mac.getInstance("HmacSHA256");
+        } catch (NoSuchAlgorithmException e) {
+            System.err.println("Fatal: " + e);
+            return;
+        }
+        // warmup and comparison
+        System.out.println("Warmup and comparison:");
+        int RUNS = 25000;
+        for (int i = 0; i < RUNS; i++) {
+            ctx.random().nextBytes(rand);
+            ctx.random().nextBytes(data);
+            keyObj = new SecretKeySpec(rand, "HmacSHA256");
+            byte[] keyBytes = keyObj.getEncoded();
+            if (!DataHelper.eq(rand, keyBytes))
+                System.out.println("secret key in != out");
+            key = new SessionKey(rand);
+            gen.calculate(key, data, 0, data.length, result, 0);
+            try {
+                mac.init(keyObj);
+            } catch (GeneralSecurityException e) {
+                System.err.println("Fatal: " + e);
+                return;
+            }
+            byte[] result2 = mac.doFinal(data);
+            if (!DataHelper.eq(result, result2))
+                throw new IllegalStateException();
+        }
+
+        // real thing
+        System.out.println("Passed");
+        System.out.println("BC Test:");
+        RUNS = 500000;
+        long start = System.currentTimeMillis();
+        for (int i = 0; i < RUNS; i++) {
+            gen.calculate(key, data, 0, data.length, result, 0);
+        }
+        long time = System.currentTimeMillis() - start;
+        System.out.println("Time for " + RUNS + " HMAC-SHA256 computations:");
+        System.out.println("BC time (ms): " + time);
+
+        System.out.println("JVM Test:");
+        start = System.currentTimeMillis();
+        for (int i = 0; i < RUNS; i++) {
+            try {
+                mac.init(keyObj);
+            } catch (GeneralSecurityException e) {
+                System.err.println("Fatal: " + e);
+            }
+            byte[] sha = mac.doFinal(data);
+        }
+        time = System.currentTimeMillis() - start;
+
+        System.out.println("JVM time (ms): " + time);
+    }
+****/
 }
diff --git a/core/java/src/net/i2p/crypto/HMACGenerator.java b/core/java/src/net/i2p/crypto/HMACGenerator.java
index f5643ca1b9b401c46238dee79c044eea37c288cf..eb3533033dcefc5bddcf76ba780a8ead9f4df88b 100644
--- a/core/java/src/net/i2p/crypto/HMACGenerator.java
+++ b/core/java/src/net/i2p/crypto/HMACGenerator.java
@@ -1,5 +1,7 @@
 package net.i2p.crypto;
 
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
 import java.util.concurrent.LinkedBlockingQueue;
 
@@ -16,7 +18,6 @@ import net.i2p.data.Hash;
 import net.i2p.data.SessionKey;
 import net.i2p.util.SimpleByteCache;
 
-import org.bouncycastle.oldcrypto.digests.MD5Digest;
 import org.bouncycastle.oldcrypto.macs.I2PHMac;
 
 /**
@@ -56,7 +57,7 @@ public class HMACGenerator {
      * Calculate the HMAC of the data with the given key
      *
      * @return the first 16 bytes contain the HMAC, the last 16 bytes are zero
-     * @deprecated unused
+     * @deprecated unused (not even by Syndie)
      */
     public Hash calculate(SessionKey key, byte data[]) {
         if ((key == null) || (key.getData() == null) || (data == null))
@@ -69,6 +70,9 @@ public class HMACGenerator {
     
     /**
      * Calculate the HMAC of the data with the given key
+     *
+     * @return the first 16 bytes contain the HMAC, the last 16 bytes are zero
+     * @throws IllegalArgumentException for bad key or target too small
      */
     public void calculate(SessionKey key, byte data[], int offset, int length, byte target[], int targetOffset) {
         if ((key == null) || (key.getData() == null) || (data == null))
@@ -91,8 +95,10 @@ public class HMACGenerator {
      * @param origMAC what do we expect the MAC of curData to equal
      * @param origMACOffset index into origMAC
      * @param origMACLength how much of the MAC do we want to verify
+     * @throws IllegalArgumentException for bad key
      */
-    public boolean verify(SessionKey key, byte curData[], int curOffset, int curLength, byte origMAC[], int origMACOffset, int origMACLength) {
+    public boolean verify(SessionKey key, byte curData[], int curOffset, int curLength,
+                          byte origMAC[], int origMACOffset, int origMACLength) {
         if ((key == null) || (key.getData() == null) || (curData == null))
             throw new NullPointerException("Null arguments for HMAC");
         
@@ -116,7 +122,12 @@ public class HMACGenerator {
         // for backwards compatability.  next time we have a backwards
         // incompatible change, we should update this by removing ", 32"
         // SEE NOTES ABOVE
-        return new I2PHMac(new MD5Digest(), 32);
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            return new I2PHMac(md, 32);
+        } catch (NoSuchAlgorithmException nsae) {
+            throw new UnsupportedOperationException("MD5");
+        }
     }
 
     private void release(I2PHMac mac) {
@@ -124,15 +135,15 @@ public class HMACGenerator {
     }
 
     /**
-     * Not really tmp, just from the byte array cache.
+     * 32 bytes from the byte array cache.
      * Does NOT zero.
      */
-    private byte[] acquireTmp() {
+    protected byte[] acquireTmp() {
         byte rv[] = SimpleByteCache.acquire(Hash.HASH_LENGTH);
         return rv;
     }
 
-    private void releaseTmp(byte tmp[]) {
+    protected void releaseTmp(byte tmp[]) {
         SimpleByteCache.release(tmp);
     }
 
diff --git a/core/java/src/net/i2p/crypto/SU3File.java b/core/java/src/net/i2p/crypto/SU3File.java
index dd23ad05abf9418f8888bf7711e851b61ca2e856..b401c8f280cd4c7462d9e4a1726253dc67573d1a 100644
--- a/core/java/src/net/i2p/crypto/SU3File.java
+++ b/core/java/src/net/i2p/crypto/SU3File.java
@@ -26,6 +26,8 @@ import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Properties;
 
+import gnu.getopt.Getopt;
+
 import net.i2p.I2PAppContext;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
@@ -437,27 +439,37 @@ public class SU3File {
      */
     public static void main(String[] args) {
         boolean ok = false;
-        List<String> a = new ArrayList<String>(Arrays.asList(args));
         try {
             // defaults
             String stype = null;
             String ctype = null;
-            Iterator<String> iter = a.iterator();
-            String cmd = iter.next();
-            iter.remove();
-            for ( ; iter.hasNext(); ) {
-                String arg = iter.next();
-                if (arg.equals("-t")) {
-                    iter.remove();
-                    stype = iter.next();
-                    iter.remove();
-                } else if (arg.equals("-c")) {
-                    iter.remove();
-                    ctype = iter.next();
-                    iter.remove();
-                }
+            boolean error = false;
+            Getopt g = new Getopt("SU3File", args, "t:c:");
+            int c;
+            while ((c = g.getopt()) != -1) {
+              switch (c) {
+                case 't':
+                    stype = g.getOptarg();
+                    break;
+
+                case 'c':
+                    ctype = g.getOptarg();
+                    break;
+
+                case '?':
+                case ':':
+                default:
+                  error = true;
+              }
             }
-            if ("showversion".equals(cmd)) {
+
+            int idx = g.getOptind();
+            String cmd = args[idx];
+            List<String> a = new ArrayList<String>(Arrays.asList(args).subList(idx + 1, args.length));
+
+            if (error) {
+                showUsageCLI();
+            } else if ("showversion".equals(cmd)) {
                 ok = showVersionCLI(a.get(0));
             } else if ("sign".equals(cmd)) {
                 // speed things up by specifying a small PRNG buffer size
@@ -518,23 +530,6 @@ public class SU3File {
         return buf.toString();
     }
 
-    /**
-     *  @param stype number or name
-     *  @return null if not found
-     *  @since 0.9.9
-     */
-    private static SigType parseSigType(String stype) {
-        try {
-            return SigType.valueOf(stype.toUpperCase(Locale.US));
-        } catch (IllegalArgumentException iae) {
-            try {
-                int code = Integer.parseInt(stype);
-                return SigType.getByCode(code);
-            } catch (NumberFormatException nfe) {
-                return null;
-             }
-        }
-    }
     /**
      *  @param stype number or name
      *  @return null if not found
@@ -627,7 +622,7 @@ public class SU3File {
      */
     private static final boolean signCLI(String stype, String ctype, String inputFile, String signedFile,
                                          String privateKeyFile, String version, String signerName, String keypw) {
-        SigType type = stype == null ? SigType.getByCode(Integer.valueOf(DEFAULT_SIG_CODE)) : parseSigType(stype);
+        SigType type = stype == null ? SigType.getByCode(Integer.valueOf(DEFAULT_SIG_CODE)) : SigType.parseSigType(stype);
         if (type == null) {
             System.out.println("Signature type " + stype + " is not supported");
             return false;
@@ -719,7 +714,7 @@ public class SU3File {
      *  @since 0.9.9
      */
     private static final boolean genKeysCLI(String stype, String publicKeyFile, String privateKeyFile, String alias) {
-        SigType type = stype == null ? SigType.getByCode(Integer.valueOf(DEFAULT_SIG_CODE)) : parseSigType(stype);
+        SigType type = stype == null ? SigType.getByCode(Integer.valueOf(DEFAULT_SIG_CODE)) : SigType.parseSigType(stype);
         if (type == null) {
             System.out.println("Signature type " + stype + " is not supported");
             return false;
diff --git a/core/java/src/net/i2p/crypto/SigType.java b/core/java/src/net/i2p/crypto/SigType.java
index 105ff09b1a5e7686cdc1d259b5176dfe9d966e07..c5e32f048dbb54c5e3115a92ba4c5d270742b145 100644
--- a/core/java/src/net/i2p/crypto/SigType.java
+++ b/core/java/src/net/i2p/crypto/SigType.java
@@ -5,6 +5,7 @@ import java.security.NoSuchAlgorithmException;
 import java.security.spec.AlgorithmParameterSpec;
 import java.security.spec.InvalidParameterSpecException;
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 
 import net.i2p.data.Hash;
@@ -170,4 +171,24 @@ public enum SigType {
     public static SigType getByCode(int code) {
         return BY_CODE.get(Integer.valueOf(code));
     }
+
+    /**
+     *  Convenience for user apps
+     *
+     *  @param stype number or name
+     *  @return null if not found
+     *  @since 0.9.9 moved from SU3File in 0.9.12
+     */
+    public static SigType parseSigType(String stype) {
+        try {
+            return valueOf(stype.toUpperCase(Locale.US));
+        } catch (IllegalArgumentException iae) {
+            try {
+                int code = Integer.parseInt(stype);
+                return getByCode(code);
+            } catch (NumberFormatException nfe) {
+                return null;
+             }
+        }
+    }
 }
diff --git a/core/java/src/net/i2p/data/Certificate.java b/core/java/src/net/i2p/data/Certificate.java
index ef6484f31ed4d147e47fb06562ad6e1aa7b75c12..49fc560e6f2e8ab533566a358ca0935a55c25c92 100644
--- a/core/java/src/net/i2p/data/Certificate.java
+++ b/core/java/src/net/i2p/data/Certificate.java
@@ -42,6 +42,8 @@ public class Certificate extends DataStructureImpl {
     public final static int CERTIFICATE_LENGTH_SIGNED_WITH_HASH = Signature.SIGNATURE_BYTES + Hash.HASH_LENGTH;
     /** Contains multiple certs */
     public final static int CERTIFICATE_TYPE_MULTIPLE = 4;
+    /** @since 0.9.12 */
+    public final static int CERTIFICATE_TYPE_KEY = 5;
 
     /**
      * If null cert, return immutable static instance, else create new
@@ -58,6 +60,13 @@ public class Certificate extends DataStructureImpl {
             return new Certificate(type, null);
         byte[] payload = new byte[length];
         System.arraycopy(data, off + 3, payload, 0, length);
+        if (type == CERTIFICATE_TYPE_KEY) {
+            try {
+                return new KeyCertificate(payload);
+            } catch (DataFormatException dfe) {
+                throw new IllegalArgumentException(dfe);
+            }
+        }
         return new Certificate(type, payload);
     }
 
@@ -77,13 +86,20 @@ public class Certificate extends DataStructureImpl {
         int read = DataHelper.read(in, payload);
         if (read != length)
             throw new DataFormatException("Not enough bytes for the payload (read: " + read + " length: " + length + ')');
+        if (type == CERTIFICATE_TYPE_KEY)
+            return new KeyCertificate(payload);
         return new Certificate(type, payload);
     }
 
     public Certificate() {
     }
 
+    /**
+     *  @throws IllegalArgumentException if type < 0
+     */
     public Certificate(int type, byte[] payload) {
+        if (type < 0)
+            throw new IllegalArgumentException();
         _type = type;
         _payload = payload;
     }
@@ -93,7 +109,15 @@ public class Certificate extends DataStructureImpl {
         return _type;
     }
 
+    /**
+     *  @throws IllegalArgumentException if type < 0
+     *  @throws IllegalStateException if already set
+     */
     public void setCertificateType(int type) {
+        if (type < 0)
+            throw new IllegalArgumentException();
+        if (_type != 0 && _type != type)
+            throw new IllegalStateException("already set");
         _type = type;
     }
 
@@ -101,11 +125,21 @@ public class Certificate extends DataStructureImpl {
         return _payload;
     }
 
+    /**
+     *  @throws IllegalStateException if already set
+     */
     public void setPayload(byte[] payload) {
+        if (_payload != null)
+            throw new IllegalStateException("already set");
         _payload = payload;
     }
     
+    /**
+     *  @throws IllegalStateException if already set
+     */
     public void readBytes(InputStream in) throws DataFormatException, IOException {
+        if (_type != 0 || _payload != null)
+            throw new IllegalStateException("already set");
         _type = (int) DataHelper.readLong(in, 1);
         int length = (int) DataHelper.readLong(in, 2);
         if (length > 0) {
@@ -149,7 +183,12 @@ public class Certificate extends DataStructureImpl {
         return cur - offset;
     }
     
+    /**
+     *  @throws IllegalStateException if already set
+     */
     public int readBytes(byte source[], int offset) throws DataFormatException {
+        if (_type != 0 || _payload != null)
+            throw new IllegalStateException("already set");
         if (source == null) throw new DataFormatException("Cert is null");
         if (source.length < offset + 3)
             throw new DataFormatException("Cert is too small [" + source.length + " off=" + offset + "]");
@@ -175,6 +214,18 @@ public class Certificate extends DataStructureImpl {
         return 1 + 2 + (_payload != null ? _payload.length : 0);
     }
     
+    /**
+     *  Up-convert this to a KeyCertificate
+     *
+     *  @throws DataFormatException if cert type != CERTIFICATE_TYPE_KEY
+     *  @since 0.9.12
+     */
+    public KeyCertificate toKeyCertificate() throws DataFormatException {
+        if (_type != CERTIFICATE_TYPE_KEY)
+            throw new DataFormatException("type");
+        return new KeyCertificate(this);
+    }
+
     @Override
     public boolean equals(Object object) {
         if (object == this) return true;
@@ -194,6 +245,8 @@ public class Certificate extends DataStructureImpl {
         buf.append("[Certificate: type: ");
         if (getCertificateType() == CERTIFICATE_TYPE_NULL)
             buf.append("Null certificate");
+        else if (getCertificateType() == CERTIFICATE_TYPE_KEY)
+            buf.append("Key certificate");
         else if (getCertificateType() == CERTIFICATE_TYPE_HASHCASH)
             buf.append("Hashcash certificate");
         else if (getCertificateType() == CERTIFICATE_TYPE_HIDDEN)
diff --git a/core/java/src/net/i2p/data/Destination.java b/core/java/src/net/i2p/data/Destination.java
index ad21985e39f61a1c9fb11ceef4074290a10014a1..9533c86f489c9fa1e0b86a56c11f172b5a3badc7 100644
--- a/core/java/src/net/i2p/data/Destination.java
+++ b/core/java/src/net/i2p/data/Destination.java
@@ -57,6 +57,16 @@ public class Destination extends KeysAndCert {
         PublicKey pk = PublicKey.create(in);
         SigningPublicKey sk = SigningPublicKey.create(in);
         Certificate c = Certificate.create(in);
+        byte[] padding;
+        if (c.getCertificateType() == Certificate.CERTIFICATE_TYPE_KEY) {
+            // convert SPK to new SPK and padding
+            KeyCertificate kcert = c.toKeyCertificate();
+            padding = sk.getPadding(kcert);
+            sk = sk.toTypedKey(kcert);
+            c = kcert;
+        } else {
+            padding = null;
+        }
         Destination rv;
         synchronized(_cache) {
             rv = _cache.get(sk);
@@ -67,7 +77,7 @@ public class Destination extends KeysAndCert {
             }
             //if (STATS)
             //    I2PAppContext.getGlobalContext().statManager().addRateData("DestCache", 0);
-            rv = new Destination(pk, sk, c);
+            rv = new Destination(pk, sk, c, padding);
             _cache.put(sk, rv);
         }
         return rv;
@@ -86,10 +96,11 @@ public class Destination extends KeysAndCert {
     /**
      * @since 0.9.9
      */
-    private Destination(PublicKey pk, SigningPublicKey sk, Certificate c) {
+    private Destination(PublicKey pk, SigningPublicKey sk, Certificate c, byte[] padding) {
         _publicKey = pk;
         _signingKey = sk;
         _certificate = c;
+        _padding = padding;
     }
 
     /**
@@ -100,14 +111,19 @@ public class Destination extends KeysAndCert {
         int cur = offset;
         System.arraycopy(_publicKey.getData(), 0, target, cur, PublicKey.KEYSIZE_BYTES);
         cur += PublicKey.KEYSIZE_BYTES;
-        System.arraycopy(_signingKey.getData(), 0, target, cur, SigningPublicKey.KEYSIZE_BYTES);
-        cur += SigningPublicKey.KEYSIZE_BYTES;
+        if (_padding != null) {
+            System.arraycopy(_padding, 0, target, cur, _padding.length);
+            cur += _padding.length;
+        }
+        System.arraycopy(_signingKey.getData(), 0, target, cur, _signingKey.length());
+        cur += _signingKey.length();
         cur += _certificate.writeBytes(target, cur);
         return cur - offset;
     }
     
     /**
-     * @deprecated was used only by Packet.java in streaming, now unused
+     * deprecated was used only by Packet.java in streaming, now unused
+     * Warning - used by i2p-bote. Does NOT support alternate key types. DSA-SHA1 only.
      *
      * @throws IllegalStateException if data already set
      */
@@ -132,7 +148,16 @@ public class Destination extends KeysAndCert {
     }
 
     public int size() {
-        return PublicKey.KEYSIZE_BYTES + SigningPublicKey.KEYSIZE_BYTES + _certificate.size();
+        int rv = PublicKey.KEYSIZE_BYTES + _signingKey.length();
+        if (_certificate.getCertificateType() == Certificate.CERTIFICATE_TYPE_KEY) {
+            // cert data included in keys
+            rv += 7;
+            if (_padding != null)
+                rv += _padding.length;
+        } else {
+            rv += _certificate.size();
+        }
+        return rv;
     }
 
     /**
diff --git a/core/java/src/net/i2p/data/KeyCertificate.java b/core/java/src/net/i2p/data/KeyCertificate.java
new file mode 100644
index 0000000000000000000000000000000000000000..f4251ce211dec974e608890781ab484fffb27707
--- /dev/null
+++ b/core/java/src/net/i2p/data/KeyCertificate.java
@@ -0,0 +1,252 @@
+package net.i2p.data;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import net.i2p.crypto.SigType;
+
+/**
+ * This certificate type gets its own class because it's going to be used a lot.
+ *
+ * The crypto type is assumed to be always 0x0000 (ElG) for now.
+ *
+ * @since 0.9.12
+ */
+public class KeyCertificate extends Certificate {
+
+    public static final int HEADER_LENGTH = 4;
+
+    public static final KeyCertificate ELG_ECDSA256_CERT;
+    static {
+        KeyCertificate kc;
+        try {
+            kc = new ECDSA256Cert();
+        } catch (DataFormatException dfe) {
+            kc = null;  // won't happen
+        }
+        ELG_ECDSA256_CERT = kc;
+    }
+
+    /**
+     *  @param payload 4 bytes minimum if non-null
+     *  @throws DataFormatException
+     */
+    public KeyCertificate(byte[] payload) throws DataFormatException {
+         super(CERTIFICATE_TYPE_KEY, payload);
+         if (payload != null && payload.length < HEADER_LENGTH)
+             throw new DataFormatException("data");
+    }
+
+    /**
+     *  A KeyCertificate with crypto type 0 (ElGamal)
+     *  and the signature type and extra data from the given public key.
+     *
+     *  @param sig non-null data non-null
+     *  @throws IllegalArgumentException
+     */
+    public KeyCertificate(SigningPublicKey spk) {
+         super(CERTIFICATE_TYPE_KEY, null);
+         if (spk == null || spk.getData() == null)
+             throw new IllegalArgumentException();
+         SigType type = spk.getType();
+         int len = type.getPubkeyLen();
+         int extra = Math.max(0, len - 128);
+         _payload = new byte[HEADER_LENGTH + extra];
+         int code = type.getCode();
+         _payload[0] = (byte) (code >> 8);
+         _payload[1] = (byte) (code & 0xff);
+         // 2 and 3 always 0, it is the only crypto code for now
+         if (extra > 0)
+             System.arraycopy(spk.getData(), 128, _payload, HEADER_LENGTH, extra);
+    }
+
+    /**
+     *  A KeyCertificate with crypto type 0 (ElGamal)
+     *  and the signature type as specified.
+     *  Payload is created.
+     *  If type.getPubkeyLen() is greater than 128, caller MUST
+     *  fill in the extra key data in the payload.
+     *
+     *  @param sig non-null data non-null
+     *  @throws IllegalArgumentException
+     */
+    public KeyCertificate(SigType type) {
+         super(CERTIFICATE_TYPE_KEY, null);
+         int len = type.getPubkeyLen();
+         int extra = Math.max(0, len - 128);
+         _payload = new byte[HEADER_LENGTH + extra];
+         int code = type.getCode();
+         _payload[0] = (byte) (code >> 8);
+         _payload[1] = (byte) (code & 0xff);
+         // 2 and 3 always 0, it is the only crypto code for now
+    }
+
+    /**
+     *  Up-convert a cert to this class
+     *
+     *  @param cert payload 4 bytes minimum if non-null
+     *  @throws DataFormatException if cert type != CERTIFICATE_TYPE_KEY
+     */
+    public KeyCertificate(Certificate cert) throws DataFormatException {
+        this(cert.getPayload());
+        if (cert.getCertificateType() != CERTIFICATE_TYPE_KEY)
+            throw new DataFormatException("type");
+    }
+
+    /**
+     *  @return -1 if unset
+     */
+    public int getSigTypeCode() {
+        if (_payload == null)
+            return -1;
+        return ((_payload[0] & 0xff) << 8) | (_payload[1] & 0xff);
+    }
+
+    /**
+     *  @return -1 if unset
+     */
+    public int getCryptoTypeCode() {
+        if (_payload == null)
+            return -1;
+        return ((_payload[2] & 0xff) << 8) | (_payload[3] & 0xff);
+    }
+
+    /**
+     *  @return null if unset or unknown
+     */
+    public SigType getSigType() {
+        return SigType.getByCode(getSigTypeCode());
+    }
+
+    /**
+     *  Signing Key extra data, if any, is first in the array.
+     *  Crypto Key extra data, if any, is second in the array,
+     *  at offset max(0, 128 - getSigType().getPubkeyLen()
+     *
+     *  @return null if unset or none
+     */
+    public byte[] getExtraKeyData() {
+        if (_payload == null || _payload.length <= HEADER_LENGTH)
+            return null;
+        byte[] rv = new byte[_payload.length - HEADER_LENGTH];
+        System.arraycopy(_payload, HEADER_LENGTH, rv, 0, rv.length);
+        return rv;
+    }
+
+
+    /**
+     *  Signing Key extra data, if any.
+     *
+     *  @return null if unset or none
+     *  @throws UnsupportedOperationException if the sig type is unsupported
+     */
+    public byte[] getExtraSigningKeyData() {
+        // we assume no crypto key data
+        if (_payload == null || _payload.length <= HEADER_LENGTH)
+            return null;
+        SigType type = getSigType();
+        if (type == null)
+            throw new UnsupportedOperationException("unknown sig type");
+        int extra = 128 - type.getPubkeyLen();
+        if (_payload.length == HEADER_LENGTH + extra)
+            return getExtraKeyData();
+        byte[] rv = new byte[extra];
+        System.arraycopy(_payload, HEADER_LENGTH, rv, 0, extra);
+        return rv;
+    }
+
+    // todo
+    // constructor w/ crypto type
+    // getCryptoType()
+    // getCryptoDataOffset()
+
+    @Override
+    public KeyCertificate toKeyCertificate() {
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder buf = new StringBuilder(64);
+        buf.append("[Certificate: type: Key certificate");
+        if (_payload == null) {
+            buf.append(" null payload");
+        } else {
+            buf.append("\n\tCrypto type: ").append(getCryptoTypeCode());
+            buf.append("\n\tSig type: ").append(getSigTypeCode())
+               .append(" (").append(getSigType()).append(')');
+            if (_payload.length > HEADER_LENGTH)
+                buf.append("\n\tKey data: ").append(_payload.length - HEADER_LENGTH).append(" bytes");
+        }
+        buf.append("]");
+        return buf.toString();
+    }
+
+    /**
+     *  An immutable ElG/ECDSA-256 certificate.
+     *  @since 0.8.3
+     */
+    private static final class ECDSA256Cert extends KeyCertificate {
+        private static final byte[] ECDSA256_DATA = new byte[] {
+            CERTIFICATE_TYPE_KEY, 0, HEADER_LENGTH, 0, (byte) (SigType.ECDSA_SHA256_P256.getCode()), 0, 0
+        };
+        private static final int ECDSA256_LENGTH = ECDSA256_DATA.length;
+        private static final byte[] ECDSA256_PAYLOAD = new byte[] {
+                                        0, (byte) (SigType.ECDSA_SHA256_P256.getCode()), 0, 0
+        };
+
+        public ECDSA256Cert() throws DataFormatException {
+            super(ECDSA256_PAYLOAD);
+        }
+
+        /** @throws RuntimeException always */
+        @Override
+        public void setCertificateType(int type) {
+            throw new RuntimeException("Data already set");
+        }
+
+        /** @throws RuntimeException always */
+        @Override
+        public void setPayload(byte[] payload) {
+            throw new RuntimeException("Data already set");
+        }
+    
+        /** @throws RuntimeException always */
+        @Override
+        public void readBytes(InputStream in) throws DataFormatException, IOException {
+            throw new RuntimeException("Data already set");
+        }
+    
+        /** Overridden for efficiency */
+        @Override
+        public void writeBytes(OutputStream out) throws IOException {
+            out.write(ECDSA256_DATA);
+        }
+    
+        /** Overridden for efficiency */
+        @Override
+        public int writeBytes(byte target[], int offset) {
+            System.arraycopy(ECDSA256_DATA, 0, target, offset, ECDSA256_LENGTH);
+            return ECDSA256_LENGTH;
+        }
+    
+        /** @throws RuntimeException always */
+        @Override
+        public int readBytes(byte source[], int offset) throws DataFormatException {
+            throw new RuntimeException("Data already set");
+        }
+    
+        /** Overridden for efficiency */
+        @Override
+        public int size() {
+            return ECDSA256_LENGTH;
+        }
+    
+        /** Overridden for efficiency */
+        @Override
+        public int hashCode() {
+            return 1234567;
+        }
+    }
+}
diff --git a/core/java/src/net/i2p/data/KeysAndCert.java b/core/java/src/net/i2p/data/KeysAndCert.java
index 429d89be7c56bbeef7d195e9cbf1d12351ead5b8..fc58a422ca0b4ccbb5358848ca18b3e7574f8b4a 100644
--- a/core/java/src/net/i2p/data/KeysAndCert.java
+++ b/core/java/src/net/i2p/data/KeysAndCert.java
@@ -35,6 +35,7 @@ public class KeysAndCert extends DataStructureImpl {
     protected SigningPublicKey _signingKey;
     protected Certificate _certificate;
     protected Hash __calculatedHash;
+    protected byte[] _padding;
 
     public Certificate getCertificate() {
         return _certificate;
@@ -78,6 +79,17 @@ public class KeysAndCert extends DataStructureImpl {
         __calculatedHash = null;
     }
     
+    /**
+     * @throws IllegalStateException if was already set
+     * @since 0.9.12
+     */
+    public void setPadding(byte[] padding) {
+        if (_padding != null)
+            throw new IllegalStateException();
+        _padding = padding;
+        __calculatedHash = null;
+    }
+    
     /**
      * @throws IllegalStateException if data already set
      */
@@ -85,8 +97,18 @@ public class KeysAndCert extends DataStructureImpl {
         if (_publicKey != null || _signingKey != null || _certificate != null)
             throw new IllegalStateException();
         _publicKey = PublicKey.create(in);
-        _signingKey = SigningPublicKey.create(in);
-        _certificate = Certificate.create(in);
+        SigningPublicKey spk = SigningPublicKey.create(in);
+        Certificate  cert = Certificate.create(in);
+        if (cert.getCertificateType() == Certificate.CERTIFICATE_TYPE_KEY) {
+            // convert SPK to new SPK and padding
+            KeyCertificate kcert = cert.toKeyCertificate();
+            _signingKey = spk.toTypedKey(kcert);
+            _padding = spk.getPadding(kcert);
+            _certificate = kcert;
+        } else {
+            _signingKey = spk;
+            _certificate = cert;
+        }
         __calculatedHash = null;
     }
     
@@ -94,7 +116,9 @@ public class KeysAndCert extends DataStructureImpl {
         if ((_certificate == null) || (_publicKey == null) || (_signingKey == null))
             throw new DataFormatException("Not enough data to format the router identity");
         _publicKey.writeBytes(out);
-        _signingKey.writeBytes(out);
+        if (_padding != null)
+            out.write(_padding);
+        _signingKey.writeTruncatedBytes(out);
         _certificate.writeBytes(out);
     }
     
@@ -106,6 +130,7 @@ public class KeysAndCert extends DataStructureImpl {
         return
                DataHelper.eq(_signingKey, ident._signingKey)
                && DataHelper.eq(_publicKey, ident._publicKey)
+               && DataHelper.eq(_padding, ident._padding)
                && DataHelper.eq(_certificate, ident._certificate);
     }
     
@@ -125,6 +150,8 @@ public class KeysAndCert extends DataStructureImpl {
         buf.append("\n\tCertificate: ").append(_certificate);
         buf.append("\n\tPublicKey: ").append(_publicKey);
         buf.append("\n\tSigningPublicKey: ").append(_signingKey);
+        if (_padding != null)
+            buf.append("\n\tPadding: ").append(_padding.length).append(" bytes");
         buf.append(']');
         return buf.toString();
     }
diff --git a/core/java/src/net/i2p/data/LeaseSet.java b/core/java/src/net/i2p/data/LeaseSet.java
index 75b24220d4d89a399f5b258c38ba3c2171081ca4..cf9b39deb2c467882ffe8fd9091c4cdd0322943e 100644
--- a/core/java/src/net/i2p/data/LeaseSet.java
+++ b/core/java/src/net/i2p/data/LeaseSet.java
@@ -275,11 +275,9 @@ public class LeaseSet extends DatabaseEntry {
     protected byte[] getBytes() {
         if ((_destination == null) || (_encryptionKey == null) || (_signingKey == null))
             return null;
-        int len = PublicKey.KEYSIZE_BYTES  // dest
-                + SigningPublicKey.KEYSIZE_BYTES // dest
-                + 3 // cert minimum, could be more, only used to size the BAOS
+        int len = _destination.size()
                 + PublicKey.KEYSIZE_BYTES // encryptionKey
-                + SigningPublicKey.KEYSIZE_BYTES // signingKey
+                + _signingKey.length() // signingKey
                 + 1
                 + _leases.size() * 44; // leases
         ByteArrayOutputStream out = new ByteArrayOutputStream(len);
@@ -310,7 +308,9 @@ public class LeaseSet extends DatabaseEntry {
             throw new IllegalStateException();
         _destination = Destination.create(in);
         _encryptionKey = PublicKey.create(in);
-        _signingKey = SigningPublicKey.create(in);
+        // revocation signing key must be same type as the destination signing key
+        _signingKey = new SigningPublicKey(_destination.getSigningPublicKey().getType());
+        _signingKey.readBytes(in);
         int numLeases = (int) DataHelper.readLong(in, 1);
         if (numLeases > MAX_LEASES)
             throw new DataFormatException("Too many leases - max is " + MAX_LEASES);
@@ -320,7 +320,8 @@ public class LeaseSet extends DatabaseEntry {
             lease.readBytes(in);
             addLease(lease);
         }
-        _signature = new Signature();
+        // signature must be same type as the destination signing key
+        _signature = new Signature(_destination.getSigningPublicKey().getType());
         _signature.readBytes(in);
     }
     
@@ -345,11 +346,9 @@ public class LeaseSet extends DatabaseEntry {
      *  Number of bytes, NOT including signature
      */
     public int size() {
-        return PublicKey.KEYSIZE_BYTES //destination.pubKey
-             + SigningPublicKey.KEYSIZE_BYTES // destination.signPubKey
-             + _destination.getCertificate().size() // destination.certificate, usually 3
+        return _destination.size()
              + PublicKey.KEYSIZE_BYTES // encryptionKey
-             + SigningPublicKey.KEYSIZE_BYTES // signingKey
+             + _signingKey.length() // signingKey
              + 1 // number of leases
              + _leases.size() * (Hash.HASH_LENGTH + 4 + 8);
     }
diff --git a/core/java/src/net/i2p/data/PrivateKeyFile.java b/core/java/src/net/i2p/data/PrivateKeyFile.java
index 9c71cc96b301a84275b8d7c03a530d45f3c255e0..6d5eb403b317770bd9b514f260eeb1141f24dd3f 100644
--- a/core/java/src/net/i2p/data/PrivateKeyFile.java
+++ b/core/java/src/net/i2p/data/PrivateKeyFile.java
@@ -6,17 +6,24 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
 
 import com.nettgryppa.security.HashCash;
 
+import gnu.getopt.Getopt;
+
 import net.i2p.I2PException;
 import net.i2p.client.I2PClient;
 import net.i2p.client.I2PClientFactory;
 import net.i2p.client.I2PSession;
 import net.i2p.client.I2PSessionException;
 import net.i2p.crypto.DSAEngine;
+import net.i2p.crypto.KeyGenerator;
+import net.i2p.crypto.SigType;
+import net.i2p.util.RandomSource;
 
 /**
  * This helper class reads and writes files in the
@@ -50,65 +57,125 @@ public class PrivateKeyFile {
      *  Copied and expanded from that in Destination.java
      */
     public static void main(String args[]) {
-        if (args.length == 0) {
-            System.err.println("Usage: PrivateKeyFile filename (generates if nonexistent, then prints)");
-            System.err.println("       PrivateKeyFile -h filename (generates if nonexistent, adds hashcash cert)");
-            System.err.println("       PrivateKeyFile -h effort filename (specify HashCash effort instead of default " + HASH_EFFORT + ")");
-            System.err.println("       PrivateKeyFile -n filename (changes to null cert)");
-            System.err.println("       PrivateKeyFile -s filename signwithdestfile (generates if nonexistent, adds cert signed by 2nd dest)");
-            System.err.println("       PrivateKeyFile -u filename (changes to unknown cert)");
-            System.err.println("       PrivateKeyFile -x filename (changes to hidden cert)");
-            return;
+        int hashEffort = HASH_EFFORT;
+        String stype = null;
+        int mode = 0;
+        boolean error = false;
+        Getopt g = new Getopt("pkf", args, "t:nuxhse:");
+        int c;
+        while ((c = g.getopt()) != -1) {
+          switch (c) {
+            case 't':
+                stype = g.getOptarg();
+                // fall thru...
+
+            case 'n':
+            case 'u':
+            case 'x':
+            case 'h':
+            case 's':
+                if (mode == 0)
+                    mode = c;
+                else
+                    error = true;
+                break;
+
+            case 'e':
+                hashEffort = Integer.parseInt(g.getOptarg());
+                break;
+
+            case '?':
+            case ':':
+            default:
+                error = true;
+                break;
+          }  // switch
+        } // while
+
+        int remaining = args.length - g.getOptind();
+        int reqd = mode == 's' ? 2 : 1;
+        if (error || remaining != reqd) {
+            usage();
+            System.exit(1);
         }
+        String filearg = args[g.getOptind()];
+
         I2PClient client = I2PClientFactory.createClient();
 
-        int filearg = 0;
-        if (args.length > 1) {
-            if (args.length >= 2 && args[0].equals("-h"))
-                filearg = args.length - 1;
-            else
-                filearg = 1;
-        }
         try {
-            File f = new File(args[filearg]);
+            File f = new File(filearg);
             PrivateKeyFile pkf = new PrivateKeyFile(f, client);
             Destination d = pkf.createIfAbsent();
             System.out.println("Original Destination:");
             System.out.println(pkf);
             verifySignature(d);
-            if (args.length == 1)
-                return;
-            if (args[0].equals("-n")) {
+            switch (mode) {
+              case 0:
+                // we are done
+                break;
+
+              case 'n':
                 // Cert constructor generates a null cert
                 pkf.setCertType(Certificate.CERTIFICATE_TYPE_NULL);
                 System.out.println("New destination with null cert is:");
-            } else if (args[0].equals("-u")) {
+                break;
+
+              case 'u':
                 pkf.setCertType(99);
                 System.out.println("New destination with unknown cert is:");
-            } else if (args[0].equals("-x")) {
+                break;
+
+              case 'x':
                 pkf.setCertType(Certificate.CERTIFICATE_TYPE_HIDDEN);
                 System.out.println("New destination with hidden cert is:");
-            } else if (args[0].equals("-h")) {
-                int hashEffort = HASH_EFFORT;
-                if (args.length == 3)
-                    hashEffort = Integer.parseInt(args[1]);
+                break;
+
+              case 'h':
                 System.out.println("Estimating hashcash generation time, stand by...");
                 System.out.println(estimateHashCashTime(hashEffort));
                 pkf.setHashCashCert(hashEffort);
                 System.out.println("New destination with hashcash cert is:");
-            } else if (args.length == 3 && args[0].equals("-s")) {
+                break;
+
+              case 's':
                 // Sign dest1 with dest2's Signing Private Key
-                PrivateKeyFile pkf2 = new PrivateKeyFile(args[2]);
+                PrivateKeyFile pkf2 = new PrivateKeyFile(args[g.getOptind() + 1]);
                 pkf.setSignedCert(pkf2);
                 System.out.println("New destination with signed cert is:");
+
+              case 't':
+                // KeyCert
+                SigType type = SigType.parseSigType(stype);
+                if (type == null)
+                    throw new IllegalArgumentException("Signature type " + stype + " is not supported");
+                pkf.setKeyCert(type);
+                System.out.println("New destination with key cert is:");
+                break;
+
+              default:
+                // shouldn't happen
+                usage();
+                return;
             }
             System.out.println(pkf);
             pkf.write();
-            verifySignature(d);
+            verifySignature(pkf.getDestination());
         } catch (Exception e) {
             e.printStackTrace();
+            System.exit(1);
         }
     }
+
+    private static void usage() {
+        System.err.println("Usage: PrivateKeyFile filename (generates if nonexistent, then prints)\n" +
+                           "       PrivateKeyFile -h filename (generates if nonexistent, adds hashcash cert)\n" +
+                           "       PrivateKeyFile -h -e effort filename (specify HashCash effort instead of default " + HASH_EFFORT + ")\n" +
+                           "       PrivateKeyFile -n filename (changes to null cert)\n" +
+                           "       PrivateKeyFile -s filename signwithdestfile (generates if nonexistent, adds cert signed by 2nd dest)\n" +
+                           "       PrivateKeyFile -t sigtype filename (changes to KeyCertificate of the given sig type\n" +
+                           "       PrivateKeyFile -u filename (changes to unknown cert)\n" +
+                           "       PrivateKeyFile -x filename (changes to hidden cert)\n");
+    }
     
     public PrivateKeyFile(String file) {
         this(new File(file), I2PClientFactory.createClient());
@@ -209,6 +276,43 @@ public class PrivateKeyFile {
         return c;
     }
     
+    /**
+     * Change cert type - caller must also call write().
+     * Side effect - creates new Destination object.
+     * @since 0.9.12
+     */
+    public Certificate setKeyCert(SigType type) {
+        if (type == SigType.DSA_SHA1)
+            return setCertType(Certificate.CERTIFICATE_TYPE_NULL);
+        if (dest == null)
+            throw new IllegalArgumentException("Dest is null");
+        KeyCertificate c = new KeyCertificate(type);
+        SimpleDataStructure signingKeys[];
+        try {
+            signingKeys = KeyGenerator.getInstance().generateSigningKeys(type);
+        } catch (GeneralSecurityException gse) {
+            throw new RuntimeException("keygen fail", gse);
+        }
+        SigningPublicKey signingPubKey = (SigningPublicKey) signingKeys[0];
+        signingPrivKey = (SigningPrivateKey) signingKeys[1];
+        // dests now immutable, must create new
+        Destination newdest = new Destination();
+        newdest.setPublicKey(dest.getPublicKey());
+        newdest.setSigningPublicKey(signingPubKey);
+        // fix up key certificate or padding
+        int len = type.getPubkeyLen();
+        if (len < 128) {
+            byte[] pad = new byte[128 - len];
+            RandomSource.getInstance().nextBytes(pad);
+            newdest.setPadding(pad);
+        } else if (len > 128) {
+            System.arraycopy(signingPubKey.getData(), 128, c.getPayload(), KeyCertificate.HEADER_LENGTH, len - 128);
+        }
+        newdest.setCertificate(c);
+        dest = newdest;
+        return c;
+    }
+    
     /** change to hashcash cert - caller must also call write() */
     public Certificate setHashCashCert(int effort) {
         Certificate c = setCertType(Certificate.CERTIFICATE_TYPE_HASHCASH);
@@ -444,8 +548,6 @@ public class PrivateKeyFile {
     
     private static final int HASH_EFFORT = VerifiedDestination.MIN_HASHCASH_EFFORT;
     
-    
-    
     private final File file;
     private final I2PClient client;
     private Destination dest;
diff --git a/core/java/src/net/i2p/data/RouterInfo.java b/core/java/src/net/i2p/data/RouterInfo.java
index 214937815e164c26b0bbba686eb874b0514c88b7..4900a4e9ee470d1b47b9461c0200750ed7765281 100644
--- a/core/java/src/net/i2p/data/RouterInfo.java
+++ b/core/java/src/net/i2p/data/RouterInfo.java
@@ -554,7 +554,7 @@ public class RouterInfo extends DatabaseEntry {
             }
         }
         DataHelper.readProperties(din, _options);
-        _signature = new Signature();
+        _signature = new Signature(_identity.getSigningPublicKey().getType());
         _signature.readBytes(in);
 
         if (verifySig) {
diff --git a/core/java/src/net/i2p/data/Signature.java b/core/java/src/net/i2p/data/Signature.java
index 83f0410e2458ab1e4c920260aac7cb747da6a2ea..1338cb664140607a2bfc2ee1b55cc0a4e9a77831 100644
--- a/core/java/src/net/i2p/data/Signature.java
+++ b/core/java/src/net/i2p/data/Signature.java
@@ -13,12 +13,15 @@ import net.i2p.crypto.SigType;
 
 /**
  * Defines the signature as defined by the I2P data structure spec.
- * A signature is a 40-byte array verifying the authenticity of some data 
+ * By default, a signature is a 40-byte array verifying the authenticity of some data 
  * using the DSA-SHA1 algorithm.
  *
  * The signature is the 20-byte R followed by the 20-byte S,
  * both are unsigned integers.
  *
+ * As of release 0.9.8, signatures of arbitrary length and type are supported.
+ * See SigType.
+ *
  * @author jrandom
  */
 public class Signature extends SimpleDataStructure {
@@ -39,10 +42,15 @@ public class Signature extends SimpleDataStructure {
     }
 
     /**
+     *  Unknown type not allowed as we won't know the length to read in the data.
+     *
+     *  @param type non-null
      *  @since 0.9.8
      */
     public Signature(SigType type) {
         super();
+        if (type == null)
+            throw new IllegalArgumentException("unknown type");
         _type = type;
     }
 
@@ -51,10 +59,15 @@ public class Signature extends SimpleDataStructure {
     }
 
     /**
+     *  Should we allow an unknown type here?
+     *
+     *  @param type non-null
      *  @since 0.9.8
      */
     public Signature(SigType type, byte data[]) {
         super();
+        if (type == null)
+            throw new IllegalArgumentException("unknown type");
         _type = type;
         setData(data);
     }
@@ -64,6 +77,7 @@ public class Signature extends SimpleDataStructure {
     }
 
     /**
+     *  @return non-null
      *  @since 0.9.8
      */
     public SigType getType() {
diff --git a/core/java/src/net/i2p/data/SigningPrivateKey.java b/core/java/src/net/i2p/data/SigningPrivateKey.java
index 4b60ee7e88fb1f878931f0fd1d4f9d367eced176..a8fcbb208196c88c8310f5b3e33b382a91057e39 100644
--- a/core/java/src/net/i2p/data/SigningPrivateKey.java
+++ b/core/java/src/net/i2p/data/SigningPrivateKey.java
@@ -14,10 +14,13 @@ import net.i2p.crypto.SigType;
 
 /**
  * Defines the SigningPrivateKey as defined by the I2P data structure spec.
- * A signing private key is 20 byte Integer. The private key represents only the 
+ * A signing private key is by default a 20 byte Integer. The private key represents only the 
  * exponent, not the primes, which are constant and defined in the crypto spec.
  * This key varies from the PrivateKey in its usage (signing, not decrypting)
  *
+ * As of release 0.9.8, keys of arbitrary length and type are supported.
+ * See SigType.
+ *
  * @author jrandom
  */
 public class SigningPrivateKey extends SimpleDataStructure {
diff --git a/core/java/src/net/i2p/data/SigningPublicKey.java b/core/java/src/net/i2p/data/SigningPublicKey.java
index e01d6ec39294a510371cf16a9bc8862a3600ee38..50dba721379b2d5cffd2d2444abe12668e037096 100644
--- a/core/java/src/net/i2p/data/SigningPublicKey.java
+++ b/core/java/src/net/i2p/data/SigningPublicKey.java
@@ -11,15 +11,19 @@ package net.i2p.data;
 
 import java.io.InputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 
 import net.i2p.crypto.SigType;
 
 /**
  * Defines the SigningPublicKey as defined by the I2P data structure spec.
- * A signing public key is 128 byte Integer. The public key represents only the 
+ * A signing public key is by default 128 byte Integer. The public key represents only the 
  * exponent, not the primes, which are constant and defined in the crypto spec.
  * This key varies from the PrivateKey in its usage (verifying signatures, not encrypting)
  *
+ * As of release 0.9.8, keys of arbitrary length and type are supported.
+ * See SigType.
+ *
  * @author jrandom
  */
 public class SigningPublicKey extends SimpleDataStructure {
@@ -55,6 +59,7 @@ public class SigningPublicKey extends SimpleDataStructure {
     }
 
     /**
+     *  @param type if null, type is unknown
      *  @since 0.9.8
      */
     public SigningPublicKey(SigType type) {
@@ -67,12 +72,16 @@ public class SigningPublicKey extends SimpleDataStructure {
     }
 
     /**
+     *  @param type if null, type is unknown
      *  @since 0.9.8
      */
     public SigningPublicKey(SigType type, byte data[]) {
         super();
         _type = type;
-        setData(data);
+        if (type != null || data == null)
+            setData(data);
+        else
+            _data = data;  // bypass length check
     }
 
     /** constructs from base64
@@ -84,17 +93,91 @@ public class SigningPublicKey extends SimpleDataStructure {
         fromBase64(base64Data);
     }
 
+    /**
+     *  @return if type unknown, the length of the data, or 128 if no data
+     */
     public int length() {
-        return _type.getPubkeyLen();
+        if (_type != null)
+            return _type.getPubkeyLen();
+        if (_data != null)
+            return _data.length;
+        return KEYSIZE_BYTES;
     }
 
     /**
+     *  @return null if unknown
      *  @since 0.9.8
      */
     public SigType getType() {
         return _type;
     }
 
+    /**
+     *  Up-convert this from an untyped (type 0) SPK to a typed SPK based on the Key Cert given
+     *
+     *  @throws IllegalArgumentException if this is already typed to a different type
+     *  @since 0.9.12
+     */
+    public SigningPublicKey toTypedKey(KeyCertificate kcert) {
+        if (_data == null)
+            throw new IllegalStateException();
+        SigType newType = kcert.getSigType();
+        if (_type == newType)
+            return this;
+        if (_type != SigType.DSA_SHA1)
+            throw new IllegalArgumentException("Cannot convert " + _type + " to " + newType);
+        int newLen = newType.getPubkeyLen();
+        if (newLen == SigType.DSA_SHA1.getPubkeyLen())
+            return new SigningPublicKey(newType, _data);
+        byte[] newData = new byte[newLen];
+        if (newLen < SigType.DSA_SHA1.getPubkeyLen()) {
+            // right-justified
+            System.arraycopy(_data, _data.length - newLen, newData, 0, newLen);
+        } else {
+            // full 128 bytes + fragment in kcert
+            System.arraycopy(_data, 0, newData, 0, _data.length);
+            System.arraycopy(kcert.getPayload(), KeyCertificate.HEADER_LENGTH, newData, _data.length, newLen - _data.length);
+        }
+        return new SigningPublicKey(newType, newData);
+    }
+
+    /**
+     *  Get the portion of this (type 0) SPK that is really padding based on the Key Cert type given,
+     *  if any
+     *
+     *  @return leading padding length > 0 or null
+     *  @throws IllegalArgumentException if this is already typed to a different type
+     *  @since 0.9.12
+     */
+    public byte[] getPadding(KeyCertificate kcert) {
+        if (_data == null)
+            throw new IllegalStateException();
+        SigType newType = kcert.getSigType();
+        if (_type == newType)
+            return null;
+        if (_type != SigType.DSA_SHA1)
+            throw new IllegalStateException("Cannot convert " + _type + " to " + newType);
+        int newLen = newType.getPubkeyLen();
+        if (newLen >= SigType.DSA_SHA1.getPubkeyLen())
+            return null;
+        int padLen = SigType.DSA_SHA1.getPubkeyLen() - newLen;
+        byte[] pad = new byte[padLen];
+        System.arraycopy(_data, 0, pad, 0, padLen);
+        return pad;
+    }
+    
+    /**
+     *  Write the data up to a max of 128 bytes.
+     *  If longer, the rest will be written in the KeyCertificate.
+     *  @since 0.9.12
+     */
+    public void writeTruncatedBytes(OutputStream out) throws DataFormatException, IOException {
+        if (_type.getPubkeyLen() <= KEYSIZE_BYTES)
+            out.write(_data);
+        else
+            out.write(_data, 0, KEYSIZE_BYTES);
+    }
+
     /**
      *  @since 0.9.8
      */
diff --git a/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java b/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java
index b57af1f8da89573253470f706dd65c3817238f0a..6477768c53211e7cbcb6d002613b8dface7c3171 100644
--- a/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java
@@ -71,6 +71,11 @@ public class CreateLeaseSetMessage extends I2CPMessageImpl {
         try {
             _sessionId = new SessionId();
             _sessionId.readBytes(in);
+            // Revocation is unimplemented.
+            // As the SPK comes before the LeaseSet, we don't know the key type.
+            // We could have some sort of callback or state setting so we get the
+            // expected type from the session. But for now, we just assume it's 20 bytes.
+            // Clients outside router context should throw in a dummy 20 bytes.
             _signingPrivateKey = new SigningPrivateKey();
             _signingPrivateKey.readBytes(in);
             _privateKey = new PrivateKey();
@@ -87,7 +92,7 @@ public class CreateLeaseSetMessage extends I2CPMessageImpl {
         if ((_sessionId == null) || (_signingPrivateKey == null) || (_privateKey == null) || (_leaseSet == null))
             throw new I2CPMessageException("Unable to write out the message as there is not enough data");
         int size = 4 // sessionId
-                 + SigningPrivateKey.KEYSIZE_BYTES
+                 + _signingPrivateKey.length()
                  + PrivateKey.KEYSIZE_BYTES
                  + _leaseSet.size();
         ByteArrayOutputStream os = new ByteArrayOutputStream(size);
diff --git a/core/java/src/net/i2p/data/i2cp/GetDateMessage.java b/core/java/src/net/i2p/data/i2cp/GetDateMessage.java
index 087062cbb2cecaea1d65b2fa8aebd31bc4f00655..00c5a75b87a25c21be523551d68ef48b1f2aa0c3 100644
--- a/core/java/src/net/i2p/data/i2cp/GetDateMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/GetDateMessage.java
@@ -24,7 +24,7 @@ import net.i2p.util.OrderedProperties;
  * Only supported from client to router.
  *
  * Since 0.8.7, optionally include a version string.
- * Since 0.9.10, optionally include options.
+ * Since 0.9.11, optionally include options.
  */
 public class GetDateMessage extends I2CPMessageImpl {
     public final static int MESSAGE_TYPE = 32;
@@ -49,7 +49,7 @@ public class GetDateMessage extends I2CPMessageImpl {
      *                 must be non-null if options is non-null and non-empty.
      *  @param options Client options to be sent to the router; primarily for authentication; may be null;
      *                 keys and values 255 bytes (not chars) max each
-     *  @since 0.9.10
+     *  @since 0.9.11
      */
     public GetDateMessage(String version, Properties options) {
         super();
@@ -72,7 +72,7 @@ public class GetDateMessage extends I2CPMessageImpl {
      *  Primarily for authentication.
      *
      *  @return may be null
-     *  @since 0.9.10
+     *  @since 0.9.11
      */
     public Properties getOptions() {
         return _options;
diff --git a/core/java/src/net/i2p/data/i2cp/I2CPMessageHandler.java b/core/java/src/net/i2p/data/i2cp/I2CPMessageHandler.java
index bf34befde1c00ebfc6ab28b579ed9d9aee5cde7b..915757fc09e8d4860185091139e96898c1ea907d 100644
--- a/core/java/src/net/i2p/data/i2cp/I2CPMessageHandler.java
+++ b/core/java/src/net/i2p/data/i2cp/I2CPMessageHandler.java
@@ -23,7 +23,7 @@ public class I2CPMessageHandler {
 
     /**
      *  This is huge. Mainly to catch a completly bogus response, possibly not an I2CP socket.
-     *  @since 0.9.10
+     *  @since 0.9.11
      */
     public static final int MAX_LENGTH = 128*1024;
 
diff --git a/core/java/src/net/i2p/data/i2cp/SessionConfig.java b/core/java/src/net/i2p/data/i2cp/SessionConfig.java
index 7e128576894f7ec3dc167dc688955a090b632e2e..6cd7e280b6191669ac3c90cbc741feb9f5ed012d 100644
--- a/core/java/src/net/i2p/data/i2cp/SessionConfig.java
+++ b/core/java/src/net/i2p/data/i2cp/SessionConfig.java
@@ -190,7 +190,7 @@ public class SessionConfig extends DataStructureImpl {
         _destination = Destination.create(rawConfig);
         _options = DataHelper.readProperties(rawConfig);
         _creationDate = DataHelper.readDate(rawConfig);
-        _signature = new Signature();
+        _signature = new Signature(_destination.getSigningPublicKey().getType());
         _signature.readBytes(rawConfig);
     }
 
diff --git a/core/java/src/net/i2p/data/i2cp/SessionId.java b/core/java/src/net/i2p/data/i2cp/SessionId.java
index 2cacd63fe280d102814bdca975ed21d53f4fe577..8bf373625a1c0be4ae5c154fa663ddf436ad7ee8 100644
--- a/core/java/src/net/i2p/data/i2cp/SessionId.java
+++ b/core/java/src/net/i2p/data/i2cp/SessionId.java
@@ -43,14 +43,25 @@ public class SessionId extends DataStructureImpl {
         return _sessionId;
     }
 
-    /** @param id 0-65535 */
+    /**
+     *  @param id 0-65535
+     *  @throws IllegalArgumentException
+     *  @throws IllegalStateException if already set
+     */
     public void setSessionId(int id) {
         if (id < 0 || id > 65535)
             throw new IllegalArgumentException();
+        if (_sessionId >= 0)
+            throw new IllegalStateException();
         _sessionId = id;
     }
 
+    /**
+     *  @throws IllegalStateException if already set
+     */
     public void readBytes(InputStream in) throws DataFormatException, IOException {
+        if (_sessionId >= 0)
+            throw new IllegalStateException();
         _sessionId = (int) DataHelper.readLong(in, 2);
     }
 
@@ -62,12 +73,12 @@ public class SessionId extends DataStructureImpl {
     @Override
     public boolean equals(Object obj) {
         if ((obj == null) || !(obj instanceof SessionId)) return false;
-        return _sessionId == ((SessionId) obj).getSessionId();
+        return _sessionId == ((SessionId) obj)._sessionId;
     }
 
     @Override
     public int hashCode() {
-        return _sessionId;
+        return 777 * _sessionId;
     }
 
     @Override
diff --git a/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java b/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java
index 5ed81c2fd6245f7559520de93524441bc059ac74..5af2a649bd03955fe88735b860a3644502771549 100644
--- a/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java
@@ -31,6 +31,8 @@ public class SessionStatusMessage extends I2CPMessageImpl {
     public final static int STATUS_CREATED = 1;
     public final static int STATUS_UPDATED = 2;
     public final static int STATUS_INVALID = 3;
+    /** @since 0.9.12 */
+    public final static int STATUS_REFUSED = 4;
 
     public SessionStatusMessage() {
         setStatus(STATUS_INVALID);
diff --git a/core/java/src/net/i2p/update/UpdateManager.java b/core/java/src/net/i2p/update/UpdateManager.java
index 3a1315812b10c8bb8d1f330055fefa9885bb6819..ce18c59ee976685050c636427d578604aa4495e8 100644
--- a/core/java/src/net/i2p/update/UpdateManager.java
+++ b/core/java/src/net/i2p/update/UpdateManager.java
@@ -18,6 +18,12 @@ import java.util.Map;
  */
 public interface UpdateManager {
     
+    /**
+     *  The name we register with the ClientAppManager
+     *  @since 0.9.12
+     */
+    public static final String APP_NAME = "update";
+
     /**
      *  Call once for each type/method pair.
      */
diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java
index 97d84f4f79b3bd363337021ed4bd991bb59e61cc..2f59baeac7ce8cced513b80ae111dc1fdd102e14 100644
--- a/core/java/src/net/i2p/util/EepGet.java
+++ b/core/java/src/net/i2p/util/EepGet.java
@@ -1,25 +1,33 @@
 package net.i2p.util;
 
 import java.io.BufferedInputStream;
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.PipedInputStream;
 import java.io.PipedOutputStream;
 import java.io.OutputStream;
 import java.net.ConnectException;
 import java.net.MalformedURLException;
 import java.net.Socket;
+import java.net.UnknownHostException;
 import java.net.URL;
 import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Formatter;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
+
+import gnu.getopt.Getopt;
 
 import net.i2p.I2PAppContext;
+import net.i2p.data.Base32;
 import net.i2p.data.Base64;
 import net.i2p.data.ByteArray;
 import net.i2p.data.DataHelper;
@@ -82,6 +90,10 @@ public class EepGet {
     protected boolean _isGzippedResponse;
     protected IOException _decompressException;
 
+    // following for proxy digest auth
+    // only created via addAuthorization()
+    protected AuthState _authState;
+
     /** this will be replaced by the HTTP Proxy if we are using it */
     protected static final String USER_AGENT = "Wget/1.11.4";
     protected static final long CONNECT_TIMEOUT = 45*1000;
@@ -163,56 +175,103 @@ public class EepGet {
         long inactivityTimeout = INACTIVITY_TIMEOUT;
         String etag = null;
         String saveAs = null;
-        String url = null;
         List<String> extra = null;
         String username = null;
         String password = null;
+        boolean error = false;
+        //
+        // note: if you add options, please update installer/resources/man/eepget.1
+        //
+        Getopt g = new Getopt("eepget", args, "p:cn:t:e:o:m:l:h:u:x:");
         try {
-            for (int i = 0; i < args.length; i++) {
-                if (args[i].equals("-p")) {
-                    proxyHost = args[++i].substring(0, args[i].indexOf(':'));
-                    String port = args[i].substring(args[i].indexOf(':')+1);
-                    proxyPort = Integer.parseInt(port);
-                } else if (args[i].equals("-n")) {
-                    numRetries = Integer.parseInt(args[i+1]);
-                    i++;
-                } else if (args[i].equals("-t")) {
-                    inactivityTimeout = 1000 * Integer.parseInt(args[i+1]);
-                    i++;
-                } else if (args[i].equals("-e")) {
-                    etag = "\"" + args[i+1] + "\"";
-                    i++;
-                } else if (args[i].equals("-o")) {
-                    saveAs = args[i+1];
-                    i++;
-                } else if (args[i].equals("-m")) {
-                    markSize = Integer.parseInt(args[++i]);
-                    lineLen = Integer.parseInt(args[++i]);
-                } else if (args[i].equals("-h")) {
-                    if (extra == null)
-                        extra = new ArrayList<String>(2);
-                    extra.add(args[++i]);
-                    extra.add(args[++i]);
-                } else if (args[i].equals("-u")) {
-                    username = args[++i];
-                    password = args[++i];
-                } else if (args[i].startsWith("-")) {
-                    usage();
-                    return;
-                } else {
-                    url = args[i];
-                }
-            }
+            int c;
+            while ((c = g.getopt()) != -1) {
+              switch (c) {
+                case 'p':
+                    String s = g.getOptarg();
+                    int colon = s.indexOf(':');
+                    if (colon >= 0) {
+                        // Todo IPv6 [a:b:c]:4444
+                        proxyHost = s.substring(0, colon);
+                        String port = s.substring(colon + 1);
+                        proxyPort = Integer.parseInt(port);
+                    } else {
+                        proxyHost = s;
+                        // proxyPort remains default
+                    }
+                    break;
+
+                case 'c':
+                    // no proxy, same as -p :0
+                    proxyHost = "";
+                    proxyPort = 0;
+                    break;
+
+                case 'n':
+                    numRetries = Integer.parseInt(g.getOptarg());
+                    break;
+
+                case 't':
+                    inactivityTimeout = 1000 * Integer.parseInt(g.getOptarg());
+                    break;
+
+                case 'e':
+                    etag = "\"" + g.getOptarg() + "\"";
+                    break;
+
+                case 'o':
+                    saveAs = g.getOptarg();
+                    break;
+
+                case 'm':
+                    markSize = Integer.parseInt(g.getOptarg());
+                    break;
+
+                case 'l':
+                    lineLen = Integer.parseInt(g.getOptarg());
+                    break;
+
+                case 'h':
+                    String a = g.getOptarg();
+                    int eq = a.indexOf('=');
+                    if (eq > 0) {
+                        if (extra == null)
+                            extra = new ArrayList<String>(2);
+                        String key = a.substring(0, eq);
+                        String val = a.substring(eq + 1);
+                        extra.add(key);
+                        extra.add(val);
+                    } else {
+                        error = true;
+                    }
+                    break;
+
+                case 'u':
+                    username = g.getOptarg();
+                    break;
+
+                case 'x':
+                    password = g.getOptarg();
+                    break;
+
+                case '?':
+                case ':':
+                default:
+                    error = true;
+                    break;
+              }  // switch
+            } // while
         } catch (Exception e) {
             e.printStackTrace();
-            usage();
-            return;
+            error = true;
         }
 
-        if (url == null) {
+        if (error || args.length - g.getOptind() != 1) {
             usage();
-            return;
+            System.exit(1);
         }
+        String url = args[g.getOptind()];
+
         if (saveAs == null)
             saveAs = suggestName(url);
 
@@ -222,8 +281,23 @@ public class EepGet {
                 get.addHeader(extra.get(i), extra.get(i + 1));
             }
         }
-        if (username != null && password != null)
+        if (username != null) {
+            if (password == null) {
+                try {
+                    BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
+                    do {
+                        System.err.print("Proxy password: ");
+                        password = r.readLine();
+                        if (password == null)
+                            throw new IOException();
+                        password = password.trim();
+                    } while (password.length() <= 0);
+                } catch (IOException ioe) {
+                    System.exit(1);
+                }
+            }
             get.addAuthorization(username, password);
+        }
         get.addStatusListener(get.new CLIStatusListener(markSize, lineLen));
         if (!get.fetch(CONNECT_TIMEOUT, -1, inactivityTimeout))
             System.exit(1);
@@ -278,10 +352,15 @@ public class EepGet {
     }
 
     private static void usage() {
-        System.err.println("EepGet [-p 127.0.0.1:4444] [-n #retries] [-o outputFile]\n" +
-                           "       [-m markSize lineLen] [-t timeout] [-h headerKey headerValue]\n" +
-                           "       [-u username password] url]\n" +
-                           "       (use -p :0 for no proxy)");
+        System.err.println("eepget [-p 127.0.0.1[:4444]] [-c] [-o outputFile]\n" +
+                           "       [-n #retries] (default 5)\n" +
+                           "       [-m markSize] (default 1024)\n" +
+                           "       [-l lineLen]  (default 40)\n" +
+                           "       [-t timeout]  (default 60 sec)\n" +
+                           "       [-e etag]\n" +
+                           "       [-h headerName=headerValue]\n" +
+                           "       [-u username] [-x password] url\n" +
+                           "       (use -c or -p :0 for no proxy)");
     }
     
     public static interface StatusListener {
@@ -532,6 +611,7 @@ public class EepGet {
                 if (_log.shouldLog(Log.WARN))
                     _log.warn("ERR: doFetch failed ", ioe);
                 if (ioe instanceof MalformedURLException ||
+                    ioe instanceof UnknownHostException ||
                     ioe instanceof ConnectException) // proxy or nonproxied host Connection Refused
                     _keepFetching = false;
             } finally {
@@ -592,6 +672,7 @@ public class EepGet {
         }
         
         if (_redirectLocation != null) {
+            // we also are here after a 407
             //try {
                 if (_redirectLocation.startsWith("http://")) {
                     _actualURL = _redirectLocation;
@@ -610,10 +691,25 @@ public class EepGet {
             //} catch (MalformedURLException mue) {
             //    throw new IOException("Redirected from an invalid URL");
             //}
-            _redirects++;
-            if (_redirects > 5)
-                throw new IOException("Too many redirects: to " + _redirectLocation);
-            if (_log.shouldLog(Log.INFO)) _log.info("Redirecting to " + _redirectLocation);
+
+            AuthState as = _authState;
+            if (_responseCode == 407) {
+                if (!_shouldProxy)
+                    throw new IOException("Proxy auth response from non-proxy");
+                if (as == null)
+                    throw new IOException("Proxy requires authentication");
+                if (as.authSent)
+                    throw new IOException("Proxy authentication failed");  // ignore stale
+                if (_log.shouldLog(Log.INFO)) _log.info("Adding auth");
+                // actually happens in getRequest()
+            } else {
+                _redirects++;
+                if (_redirects > 5)
+                    throw new IOException("Too many redirects: to " + _redirectLocation);
+                if (_log.shouldLog(Log.INFO)) _log.info("Redirecting to " + _redirectLocation);
+                if (as != null)
+                    as.authSent = false;
+            }
 
             // reset some important variables, we don't want to save the values from the redirect
             _bytesRemaining = -1;
@@ -801,6 +897,7 @@ public class EepGet {
                 _keepFetching = false;
                 _notModified = true;
                 return; 
+            case 401: // server auth
             case 403: // bad req
             case 404: // not found
             case 409: // bad addr helper
@@ -819,6 +916,17 @@ public class EepGet {
                         _out = new FileOutputStream(_outputFile, true);
                 }
                 break;
+            case 407: // proxy auth
+                // we will treat this is a redirect if we haven't sent auth yet
+                //_redirectLocation will be set to _actualURL below
+                _alreadyTransferred = 0;
+                if (_authState != null)
+                    rcOk = !_authState.authSent;
+                else
+                    rcOk = false;
+                redirect = rcOk;
+                _keepFetching = rcOk;
+                break;
             case 416: // completed (or range out of reach)
                 _bytesRemaining = 0;
                 if (_alreadyTransferred > 0 || !_shouldWriteErrorToOutput) {
@@ -900,11 +1008,14 @@ public class EepGet {
                     increment(lookahead, cur);
                     if (isEndOfHeaders(lookahead)) {
                         if (!rcOk)
-                            throw new IOException("Invalid HTTP response code: " + _responseCode);
+                            throw new IOException("Invalid HTTP response code: " + _responseCode + ' ' + _responseText);
                         if (_encodingChunked) {
                             _bytesRemaining = readChunkLength();
                         }
-                        if (!redirect) _redirectLocation = null;
+                        if (!redirect)
+                            _redirectLocation = null;
+                        else if (_responseCode == 407)
+                            _redirectLocation = _actualURL;
                         return;
                     }
                     break;
@@ -1011,6 +1122,8 @@ public class EepGet {
             _contentType=val;
         } else if (key.equals("location")) {
             _redirectLocation=val;
+        } else if (key.equals("proxy-authenticate") && _responseCode == 407 && _authState != null && _shouldProxy) {
+            _authState.setAuthChallenge(val);
         } else {
             // ignore the rest
         }
@@ -1061,8 +1174,11 @@ public class EepGet {
                 URL url = new URL(_actualURL);
                 if ("http".equals(url.getProtocol())) {
                     String host = url.getHost();
-                    if (host.toLowerCase(Locale.US).endsWith(".i2p"))
-                        throw new MalformedURLException("I2P addresses must be proxied");
+                    String hostlc = host.toLowerCase(Locale.US);
+                    if (hostlc.endsWith(".i2p"))
+                        throw new UnknownHostException("I2P addresses must be proxied");
+                    if (hostlc.endsWith(".onion"))
+                        throw new UnknownHostException("Tor addresses must be proxied");
                     int port = url.getPort();
                     if (port == -1)
                         port = 80;
@@ -1119,10 +1235,11 @@ public class EepGet {
                 urlToSend += '?' + query;
         }
         if (post) {
-            buf.append("POST ").append(urlToSend).append(" HTTP/1.1\r\n");
+            buf.append("POST ");
         } else {
-            buf.append("GET ").append(urlToSend).append(" HTTP/1.1\r\n");
+            buf.append("GET ");
         }
+        buf.append(urlToSend).append(" HTTP/1.1\r\n");
         // RFC 2616 sec 5.1.2 - host + port (NOT authority, which includes userinfo)
         buf.append("Host: ").append(host);
         if (port >= 0)
@@ -1167,6 +1284,12 @@ public class EepGet {
         }
         if(!uaOverridden)
             buf.append("User-Agent: " + USER_AGENT + "\r\n");
+        if (_authState != null && _shouldProxy && _authState.authMode != AUTH_MODE.NONE) {
+            buf.append("Proxy-Authorization: ");
+            String method = post ? "POST" : "GET";
+            buf.append(_authState.getAuthHeader(method, urlToSend));
+            buf.append("\r\n");
+        }
         buf.append("Connection: close\r\n\r\n");
         if (post)
             buf.append(_postData);
@@ -1257,14 +1380,246 @@ public class EepGet {
      *  Add basic authorization header for the proxy.
      *  Only added if the request is going through a proxy.
      *  Must be called before fetch().
-     *  Not supported by EepHead.
      *
      *  @since 0.8.9
      */
     public void addAuthorization(String userName, String password) {
-        if (_shouldProxy)
-            addHeader("Proxy-Authorization", 
-                      "Basic " + Base64.encode(DataHelper.getUTF8(userName + ':' + password), true));  // true = use standard alphabet
+        if (_shouldProxy) {
+            // Could only do this for Basic
+            // Now we always wait for the 407, in the hope we can use Digest
+            //addHeader("Proxy-Authorization", 
+            //          "Basic " + Base64.encode(DataHelper.getUTF8(userName + ':' + password), true));  // true = use standard alphabet
+            if (_authState != null)
+                throw new IllegalStateException();
+            _authState = new AuthState(userName, password);
+        }
+    }
+
+    /**
+     *  Parse the args in an authentication header.
+     *
+     *  Modified from LoadClientAppsJob.
+     *  All keys are mapped to lower case.
+     *  Double quotes around values are stripped.
+     *  Ref: RFC 2617
+     *
+     *  Public for I2PTunnelHTTPClientBase; use outside of tree at own risk, subject to change or removal
+     *
+     *  @param args non-null, starting after "Digest " or "Basic "
+     *  @since 0.9.4, moved from I2PTunnelHTTPClientBase in 0.9.12
+     */
+    public static Map<String, String> parseAuthArgs(String args) {
+        Map<String, String> rv = new HashMap<String, String>(8);
+        char data[] = args.toCharArray();
+        StringBuilder buf = new StringBuilder(32);
+        boolean isQuoted = false;
+        String key = null;
+        for (int i = 0; i < data.length; i++) {
+            switch (data[i]) {
+                case '\"':
+                    if (isQuoted) {
+                        // keys never quoted
+                        if (key != null) {
+                            rv.put(key, buf.toString().trim());
+                            key = null;
+                        }
+                        buf.setLength(0);
+                    }
+                    isQuoted = !isQuoted;
+                    break;
+
+                case ' ':
+                case '\r':
+                case '\n':
+                case '\t':
+                case ',':
+                    // whitespace - if we're in a quoted section, keep this as part of the quote,
+                    // otherwise use it as a delim
+                    if (isQuoted) {
+                        buf.append(data[i]);
+                    } else {
+                        if (key != null) {
+                            rv.put(key, buf.toString().trim());
+                            key = null;
+                        }
+                        buf.setLength(0);
+                    }
+                    break;
+
+                case '=':
+                    if (isQuoted) {
+                        buf.append(data[i]);
+                    } else {
+                        key = buf.toString().trim().toLowerCase(Locale.US);
+                        buf.setLength(0);
+                    }
+                    break;
+
+                default:
+                    buf.append(data[i]);
+                    break;
+            }
+        }
+        if (key != null)
+            rv.put(key, buf.toString().trim());
+        return rv;
+    }
+
+
+    /**
+     *  @since 0.9.12
+     */
+    protected enum AUTH_MODE {NONE, BASIC, DIGEST, UNKNOWN}
+
+    /**
+     *  Manage the authentication parameters
+     *  Ref: RFC 2617
+     *  Supports both Basic and Digest, however i2ptunnel HTTP proxy
+     *  has migrated all previous Basic support to Digest.
+     *
+     *  @since 0.9.12
+     */
+    protected class AuthState {
+        private final String username;
+        private final String password;
+        // as recvd in 407
+        public AUTH_MODE authMode = AUTH_MODE.NONE;
+        // as recvd in 407, after the mode string
+        private String authChallenge;
+        public boolean authSent;
+        private int nonceCount;
+        private String cnonce;
+        // as parsed from authChallenge
+        private Map<String, String> args;
+
+        public AuthState(String user, String pw) {
+            username = user;
+            password = pw;
+        }
+
+        /**
+         *  May be called multiple times, save the best one
+         */
+        public void setAuthChallenge(String auth) {
+            String authLC = auth.toLowerCase(Locale.US);
+            if (authLC.startsWith("basic ")) {
+                // better than anything but DIGEST
+                if (authMode != AUTH_MODE.DIGEST) {
+                    // use standard alphabet
+                    authMode = AUTH_MODE.BASIC;
+                    authChallenge = auth.substring(6);
+                }
+            } else if (authLC.startsWith("digest ")) {
+                // better than anything
+                authMode = AUTH_MODE.DIGEST;
+                authChallenge = auth.substring(7);
+            } else {
+                // better than NONE only
+                if (authMode == AUTH_MODE.NONE) {
+                    authMode = AUTH_MODE.UNKNOWN;
+                    authChallenge = null;
+                }
+            }
+            nonceCount = 0;
+            args = null;
+        }
+
+        public String getAuthHeader(String method, String uri) throws IOException {
+            switch (authMode) {
+                case BASIC:
+                    authSent = true;
+                    // use standard alphabet
+                    return "Basic " +
+                           Base64.encode(DataHelper.getUTF8(username + ':' + password), true);
+
+                case DIGEST:
+                    if (authChallenge == null)
+                        throw new IOException("Bad proxy auth response");
+                    if (args == null)
+                        args = parseAuthArgs(authChallenge);
+                    Map<String, String> outArgs = generateAuthArgs(method, uri);
+                    if (outArgs == null)
+                        throw new IOException("Bad proxy auth response");
+                    StringBuilder buf = new StringBuilder(256);
+                    buf.append("Digest");
+                    for (Map.Entry<String, String> e : outArgs.entrySet()) {
+                        buf.append(' ').append(e.getKey()).append('=').append(e.getValue());
+                    }
+                    authSent = true;
+                    return buf.toString();
+
+                default:
+                    throw new IOException("Unknown proxy auth type " + authChallenge);
+            }
+        }
+
+        /**
+         *  Generate the digest authentication parameters
+         *  Ref: RFC 2617
+         *
+         *  @since 0.9.12 modified from I2PTunnelHTTPClientBase.validateDigest()
+         */
+        public Map<String, String> generateAuthArgs(String method, String uri) throws IOException {
+            Map<String, String> rv = new HashMap<String, String>(12);
+            String realm = args.get("realm");
+            String nonce = args.get("nonce");
+            String qop = args.get("qop");
+            String opaque = args.get("opaque");
+            //String algorithm = args.get("algorithm");
+            //String stale = args.get("stale");
+            if (realm == null || nonce == null) {
+                if (_log.shouldLog(Log.INFO))
+                    _log.info("Bad digest request: " + DataHelper.toString(args));
+                throw new IOException("Bad auth response");
+            }
+            rv.put("username", '"' + username + '"');
+            rv.put("realm", '"' + realm + '"');
+            rv.put("nonce", '"' + nonce + '"');
+            rv.put("uri", '"' + uri + '"');
+            if (opaque != null)
+                rv.put("opaque", '"' + opaque + '"');
+            String kdMiddle;
+            if ("auth".equals(qop)) {
+                rv.put("qop", "\"auth\"");
+                if (cnonce == null) {
+                    byte[] rand = new byte[5];
+                    _context.random().nextBytes(rand);
+                    cnonce = Base32.encode(rand);
+                }  // else reuse on redirect
+                rv.put("cnonce", '"' + cnonce + '"');
+                String nc = lc8hex(++nonceCount);
+                rv.put("nc", nc);
+                kdMiddle = ':' + nc + ':' + cnonce + ':' + qop;
+            } else {
+                kdMiddle = "";
+            }
+
+            // get H(A1)
+            String ha1 = PasswordManager.md5Hex(username + ':' + realm + ':' + password);
+            // get H(A2)
+            String a2 = method + ':' + uri;
+            String ha2 = PasswordManager.md5Hex(a2);
+            // response
+            String kd = ha1 + ':' + nonce + kdMiddle + ':' + ha2;
+            rv.put("response", '"' + PasswordManager.md5Hex(kd) + '"');
+            return rv;
+        }
+    }
+
+    /**
+     *  @return 8 hex chars, lower case, e.g. 00000001
+     *  @since 0.8.10
+     */
+    private static String lc8hex(int nc) {
+        StringBuilder buf = new StringBuilder(8);
+        for (int i = 28; i >= 0; i -= 4) {
+            int v = (nc >> i) & 0xf;
+            if (v < 10)
+                buf.append((char) (v + '0'));
+            else
+                buf.append((char) (v + 'a' - 10));
+        }
+        return buf.toString();
     }
 
     /**
diff --git a/core/java/src/net/i2p/util/EepHead.java b/core/java/src/net/i2p/util/EepHead.java
index 53650408835e147c9896be070e732fbba7dafbcc..c1ddb62828001a4661c0e877ae10030b84a6328d 100644
--- a/core/java/src/net/i2p/util/EepHead.java
+++ b/core/java/src/net/i2p/util/EepHead.java
@@ -1,10 +1,15 @@
 package net.i2p.util;
 
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.net.URL;
 
+import gnu.getopt.Getopt;
+
 import net.i2p.I2PAppContext;
 
 /**
@@ -51,39 +56,86 @@ public class EepHead extends EepGet {
         int proxyPort = 4444;
         int numRetries = 0;
         int inactivityTimeout = 60*1000;
-        String url = null;
+        String username = null;
+        String password = null;
+        boolean error = false;
+        Getopt g = new Getopt("eephead", args, "p:cn:t:u:x:");
         try {
-            for (int i = 0; i < args.length; i++) {
-                if (args[i].equals("-p")) {
-                    proxyHost = args[i+1].substring(0, args[i+1].indexOf(':'));
-                    String port = args[i+1].substring(args[i+1].indexOf(':')+1);
-                    proxyPort = Integer.parseInt(port);
-                    i++;
-                } else if (args[i].equals("-n")) {
-                    numRetries = Integer.parseInt(args[i+1]);
-                    i++;
-                } else if (args[i].equals("-t")) {
-                    inactivityTimeout = 1000 * Integer.parseInt(args[i+1]);
-                    i++;
-                } else if (args[i].startsWith("-")) {
-                    usage();
-                    return;
-                } else {
-                    url = args[i];
-                }
-            }
+            int c;
+            while ((c = g.getopt()) != -1) {
+              switch (c) {
+                case 'p':
+                    String s = g.getOptarg();
+                    int colon = s.indexOf(':');
+                    if (colon >= 0) {
+                        // Todo IPv6 [a:b:c]:4444
+                        proxyHost = s.substring(0, colon);
+                        String port = s.substring(colon + 1);
+                        proxyPort = Integer.parseInt(port);
+                    } else {
+                        proxyHost = s;
+                        // proxyPort remains default
+                    }
+                    break;
+
+                case 'c':
+                    // no proxy, same as -p :0
+                    proxyHost = "";
+                    proxyPort = 0;
+                    break;
+
+                case 'n':
+                    numRetries = Integer.parseInt(g.getOptarg());
+                    break;
+
+                case 't':
+                    inactivityTimeout = 1000 * Integer.parseInt(g.getOptarg());
+                    break;
+
+                case 'u':
+                    username = g.getOptarg();
+                    break;
+
+                case 'x':
+                    password = g.getOptarg();
+                    break;
+
+                case '?':
+                case ':':
+                default:
+                    error = true;
+                    break;
+              }  // switch
+            } // while
         } catch (Exception e) {
             e.printStackTrace();
-            usage();
-            return;
+            error = true;
         }
-        
-        if (url == null) {
+
+        if (error || args.length - g.getOptind() != 1) {
             usage();
-            return;
+            System.exit(1);
         }
-
+        String url = args[g.getOptind()];
+        
         EepHead get = new EepHead(I2PAppContext.getGlobalContext(), proxyHost, proxyPort, numRetries, url);
+        if (username != null) {
+            if (password == null) {
+                try {
+                    BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
+                    do {
+                        System.err.print("Proxy password: ");
+                        password = r.readLine();
+                        if (password == null)
+                            throw new IOException();
+                        password = password.trim();
+                    } while (password.length() <= 0);
+                } catch (IOException ioe) {
+                    System.exit(1);
+                }
+            }
+            get.addAuthorization(username, password);
+        }
         if (get.fetch(45*1000, -1, inactivityTimeout)) {
             System.err.println("Content-Type: " + get.getContentType());
             System.err.println("Content-Length: " + get.getContentLength());
@@ -96,7 +148,11 @@ public class EepHead extends EepGet {
     }
     
     private static void usage() {
-        System.err.println("EepHead [-p 127.0.0.1:4444] [-n #retries] [-t timeout] url");
+        System.err.println("EepHead [-p 127.0.0.1[:4444]] [-c]\n" +
+                           "        [-n #retries] (default 0)\n" +
+                           "        [-t timeout]  (default 60 sec)\n" +
+                           "        [-u username] [-x password] url\n" +
+                           "        (use -c or -p :0 for no proxy)");
     }
     
     /** return true if the URL was completely retrieved */
@@ -138,10 +194,24 @@ public class EepHead extends EepGet {
             //} catch (MalformedURLException mue) {
             //    throw new IOException("Redirected from an invalid URL");
             //}
-            _redirects++;
-            if (_redirects > 5)
-                throw new IOException("Too many redirects: to " + _redirectLocation);
-            if (_log.shouldLog(Log.INFO)) _log.info("Redirecting to " + _redirectLocation);
+            AuthState as = _authState;
+            if (_responseCode == 407) {
+                if (!_shouldProxy)
+                    throw new IOException("Proxy auth response from non-proxy");
+                if (as == null)
+                    throw new IOException("Proxy requires authentication");
+                if (as.authSent)
+                    throw new IOException("Proxy authentication failed");  // ignore stale
+                if (_log.shouldLog(Log.INFO)) _log.info("Adding auth");
+                // actually happens in getRequest()
+            } else {
+                _redirects++;
+                if (_redirects > 5)
+                    throw new IOException("Too many redirects: to " + _redirectLocation);
+                if (_log.shouldLog(Log.INFO)) _log.info("Redirecting to " + _redirectLocation);
+                if (as != null)
+                    as.authSent = false;
+            }
 
             // reset some important variables, we don't want to save the values from the redirect
             _bytesRemaining = -1;
@@ -212,6 +282,11 @@ public class EepHead extends EepGet {
         buf.append("Accept-Encoding: \r\n");
         // This will be replaced if we are going through I2PTunnelHTTPClient
         buf.append("User-Agent: " + USER_AGENT + "\r\n");
+        if (_authState != null && _shouldProxy && _authState.authMode != AUTH_MODE.NONE) {
+            buf.append("Proxy-Authorization: ");
+            buf.append(_authState.getAuthHeader("HEAD", urlToSend));
+            buf.append("\r\n");
+        }
         buf.append("Connection: close\r\n\r\n");
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Request: [" + buf.toString() + "]");
diff --git a/core/java/src/net/i2p/util/PartialEepGet.java b/core/java/src/net/i2p/util/PartialEepGet.java
index 4f3cf95519676799bbfdfe177ac337352fc3482a..baab6e0397d2b557e6a76df453d7a9904e070a93 100644
--- a/core/java/src/net/i2p/util/PartialEepGet.java
+++ b/core/java/src/net/i2p/util/PartialEepGet.java
@@ -1,12 +1,16 @@
 package net.i2p.util;
 
+import java.io.BufferedReader;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Locale;
 
+import gnu.getopt.Getopt;
+
 import net.i2p.I2PAppContext;
 
 /**
@@ -50,46 +54,99 @@ public class PartialEepGet extends EepGet {
         int proxyPort = 4444;
         // 40 sig + 16 version for .suds
         long size = 56;
-        String url = null;
+        String saveAs = null;
+        String username = null;
+        String password = null;
+        boolean error = false;
+        Getopt g = new Getopt("partialeepget", args, "p:cl:o:u:x:");
         try {
-            for (int i = 0; i < args.length; i++) {
-                if (args[i].equals("-p")) {
-                    proxyHost = args[i+1].substring(0, args[i+1].indexOf(':'));
-                    String port = args[i+1].substring(args[i+1].indexOf(':')+1);
-                    proxyPort = Integer.parseInt(port);
-                    i++;
-                } else if (args[i].equals("-l")) {
-                    size = Long.parseLong(args[i+1]);
-                    i++;
-                } else if (args[i].startsWith("-")) {
-                    usage();
-                    return;
-                } else {
-                    url = args[i];
-                }
-            }
+            int c;
+            while ((c = g.getopt()) != -1) {
+              switch (c) {
+                case 'p':
+                    String s = g.getOptarg();
+                    int colon = s.indexOf(':');
+                    if (colon >= 0) {
+                        // Todo IPv6 [a:b:c]:4444
+                        proxyHost = s.substring(0, colon);
+                        String port = s.substring(colon + 1);
+                        proxyPort = Integer.parseInt(port);
+                    } else {
+                        proxyHost = s;
+                        // proxyPort remains default
+                    }
+                    break;
+
+                case 'c':
+                    // no proxy, same as -p :0
+                    proxyHost = "";
+                    proxyPort = 0;
+                    break;
+
+                case 'l':
+                    size = Long.parseLong(g.getOptarg());
+                    break;
+
+                case 'o':
+                    saveAs = g.getOptarg();
+                    break;
+
+                case 'u':
+                    username = g.getOptarg();
+                    break;
+
+                case 'x':
+                    password = g.getOptarg();
+                    break;
+
+                case '?':
+                case ':':
+                default:
+                    error = true;
+                    break;
+              }  // switch
+            } // while
         } catch (Exception e) {
             e.printStackTrace();
-            usage();
-            return;
+            error = true;
         }
-        
-        if (url == null) {
+
+        if (error || args.length - g.getOptind() != 1) {
             usage();
-            return;
+            System.exit(1);
         }
+        String url = args[g.getOptind()];
 
-        String saveAs = suggestName(url);
+        if (saveAs == null)
+            saveAs = suggestName(url);
         OutputStream out;
         try {
             // resume from a previous eepget won't work right doing it this way
             out = new FileOutputStream(saveAs);
         } catch (IOException ioe) {
             System.err.println("Failed to create output file " + saveAs);
-            return;
+            out = null; // dummy for compiler
+            System.exit(1);
         }
 
         EepGet get = new PartialEepGet(I2PAppContext.getGlobalContext(), proxyHost, proxyPort, out, url, size);
+        if (username != null) {
+            if (password == null) {
+                try {
+                    BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
+                    do {
+                        System.err.print("Proxy password: ");
+                        password = r.readLine();
+                        if (password == null)
+                            throw new IOException();
+                        password = password.trim();
+                    } while (password.length() <= 0);
+                } catch (IOException ioe) {
+                    System.exit(1);
+                }
+            }
+            get.addAuthorization(username, password);
+        }
         get.addStatusListener(get.new CLIStatusListener(1024, 40));
         if (get.fetch(45*1000, -1, 60*1000)) {
             System.err.println("Last-Modified: " + get.getLastModified());
@@ -101,8 +158,10 @@ public class PartialEepGet extends EepGet {
     }
     
     private static void usage() {
-        System.err.println("PartialEepGet [-p 127.0.0.1:4444] [-l #bytes] url\n" +
-                           "              (use -p :0 for no proxy)");
+        System.err.println("PartialEepGet [-p 127.0.0.1[:4444]] [-c] [-o outputFile]\n" +
+                           "              [-l #bytes] (default 56)\n" +
+                           "              [-u username] [-x password] url\n" +
+                           "              (use -c or -p :0 for no proxy)");
     }
     
     @Override
@@ -158,6 +217,11 @@ public class PartialEepGet extends EepGet {
         // This will be replaced if we are going through I2PTunnelHTTPClient
         if(!uaOverridden)
             buf.append("User-Agent: " + USER_AGENT + "\r\n");
+        if (_authState != null && _shouldProxy && _authState.authMode != AUTH_MODE.NONE) {
+            buf.append("Proxy-Authorization: ");
+            buf.append(_authState.getAuthHeader("GET", urlToSend));
+            buf.append("\r\n");
+        }
         buf.append("\r\n");
 
         if (_log.shouldLog(Log.DEBUG))
diff --git a/core/java/src/net/i2p/util/PasswordManager.java b/core/java/src/net/i2p/util/PasswordManager.java
index e0f75a095d01356b6bfcdd59e38bafe7d04401a5..5e51dcb7dfb9bc8d95747f9525bc56d54cae7ca4 100644
--- a/core/java/src/net/i2p/util/PasswordManager.java
+++ b/core/java/src/net/i2p/util/PasswordManager.java
@@ -9,6 +9,8 @@ import net.i2p.data.Base64;
 import net.i2p.data.DataHelper;
 import net.i2p.data.SessionKey;
 
+//import org.bouncycastle.oldcrypto.digests.MD5Digest;
+
 /**
  *  Manage both plaintext and salted/hashed password storage in
  *  router.config.
@@ -197,4 +199,43 @@ public class PasswordManager {
         } catch (NoSuchAlgorithmException nsae) {}
         return null;
     }
+
+    /**
+     *  speed/comparison test before removing BC version;
+     *  JVM was slightly faster
+     */
+/*****
+    public static void main(String[] args) {
+        RandomSource rand = RandomSource.getInstance();
+        byte[] d = new byte[1500];
+        MD5Digest md = new MD5Digest();
+        byte[] bc = new byte[16];
+        // warmup and comparison
+        int runs = 25000;
+        for (int i = 0; i < runs; i++) {
+            rand.nextBytes(d);
+            byte[] jvm = md5Sum(d);
+            md.update(d, 0, d.length);
+            md.doFinal(bc, 0);
+            if (!DataHelper.eq(jvm, bc))
+                throw new IllegalStateException();
+            md.reset();
+        }
+
+        // real thing
+        runs = 500000;
+        long start = System.currentTimeMillis();
+        for (int i = 0; i < runs; i++) {
+            md5Sum(d);
+        }
+        System.out.println("JVM " + (System.currentTimeMillis() - start));
+        start = System.currentTimeMillis();
+        for (int i = 0; i < runs; i++) {
+            md.update(d, 0, d.length);
+            md.doFinal(bc, 0);
+            md.reset();
+        }
+        System.out.println("BC " + (System.currentTimeMillis() - start));
+    }
+*****/
 }
diff --git a/core/java/src/net/i2p/util/SSLEepGet.java b/core/java/src/net/i2p/util/SSLEepGet.java
index 81b728b57262706d97260314c6c33cc3c20d6fbf..9236d6cae989428912b69b01593940b786e4f6ed 100644
--- a/core/java/src/net/i2p/util/SSLEepGet.java
+++ b/core/java/src/net/i2p/util/SSLEepGet.java
@@ -58,6 +58,8 @@ import javax.net.ssl.TrustManager;
 import javax.net.ssl.TrustManagerFactory;
 import javax.net.ssl.X509TrustManager;
 
+import gnu.getopt.Getopt;
+
 import net.i2p.I2PAppContext;
 import net.i2p.crypto.CertUtil;
 import net.i2p.crypto.KeyStoreUtil;
@@ -147,29 +149,34 @@ public class SSLEepGet extends EepGet {
      * SSLEepGet -s https://foo/bar
      */ 
     public static void main(String args[]) {
-        String url = null;
         boolean saveCerts = false;
+        boolean error = false;
+        Getopt g = new Getopt("ssleepget", args, "s");
         try {
-            for (int i = 0; i < args.length; i++) {
-                if (args[i].equals("-s")) {
+            int c;
+            while ((c = g.getopt()) != -1) {
+              switch (c) {
+                case 's':
                     saveCerts = true;
-                } else if (args[i].startsWith("-")) {
-                    usage();
-                    return;
-                } else {
-                    url = args[i];
-                }
-            }
+                    break;
+
+                case '?':
+                case ':':
+                default:
+                    error = true;
+                    break;
+              }  // switch
+            } // while
         } catch (Exception e) {
             e.printStackTrace();
-            usage();
-            return;
+            error = true;
         }
-        
-        if (url == null) {
+
+        if (error || args.length - g.getOptind() != 1) {
             usage();
-            return;
+            System.exit(1);
         }
+        String url = args[g.getOptind()];
 
         String saveAs = suggestName(url);
         OutputStream out;
@@ -191,8 +198,8 @@ public class SSLEepGet extends EepGet {
     }
     
     private static void usage() {
-        System.err.println("Usage: SSLEepGet https://url");
-        System.err.println("To save unknown certs, use: SSLEepGet -s https://url");
+        System.err.println("Usage: SSLEepGet https://url\n" +
+                           "To save unknown certs, use: SSLEepGet -s https://url");
     }
 
     /**
diff --git a/core/java/src/org/bouncycastle/oldcrypto/Digest.java b/core/java/src/org/bouncycastle/oldcrypto/Digest.java
deleted file mode 100644
index 0ecc1bd65de8381ec44f03b2f99a002a3eb03973..0000000000000000000000000000000000000000
--- a/core/java/src/org/bouncycastle/oldcrypto/Digest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.bouncycastle.oldcrypto;
-/*
- * Copyright (c) 2000 - 2004 The Legion Of The Bouncy Castle
- * (http://www.bouncycastle.org)
- *
- * Permission is hereby granted, free of charge, to any person 
- * obtaining a copy of this software and associated 
- * documentation files (the "Software"), to deal in the Software
- * without restriction, including without limitation the rights to 
- * use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following 
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-/**
- * interface that a message digest conforms to.
- */
-public interface Digest
-{
-    /**
-     * return the algorithm name
-     *
-     * @return the algorithm name
-     */
-    public String getAlgorithmName();
-
-    /**
-     * return the size, in bytes, of the digest produced by this message digest.
-     *
-     * @return the size, in bytes, of the digest produced by this message digest.
-     */
-    public int getDigestSize();
-
-    /**
-     * update the message digest with a single byte.
-     *
-     * @param in the input byte to be entered.
-     */
-    public void update(byte in);
-
-    /**
-     * update the message digest with a block of bytes.
-     *
-     * @param in the byte array containing the data.
-     * @param inOff the offset into the byte array where the data starts.
-     * @param len the length of the data.
-     */
-    public void update(byte[] in, int inOff, int len);
-
-    /**
-     * close the digest, producing the final digest value. The doFinal
-     * call leaves the digest reset.
-     *
-     * @param out the array the digest is to be copied into.
-     * @param outOff the offset into the out array the digest is to start at.
-     */
-    public int doFinal(byte[] out, int outOff);
-
-    /**
-     * reset the digest back to it's initial state.
-     */
-    public void reset();
-}
diff --git a/core/java/src/org/bouncycastle/oldcrypto/digests/GeneralDigest.java b/core/java/src/org/bouncycastle/oldcrypto/digests/GeneralDigest.java
deleted file mode 100644
index 85324b97631c53fa55c8240a09e7c53c04731c97..0000000000000000000000000000000000000000
--- a/core/java/src/org/bouncycastle/oldcrypto/digests/GeneralDigest.java
+++ /dev/null
@@ -1,154 +0,0 @@
-package org.bouncycastle.oldcrypto.digests;
-/*
- * Copyright (c) 2000 - 2004 The Legion Of The Bouncy Castle
- * (http://www.bouncycastle.org)
- *
- * Permission is hereby granted, free of charge, to any person 
- * obtaining a copy of this software and associated 
- * documentation files (the "Software"), to deal in the Software
- * without restriction, including without limitation the rights to 
- * use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following 
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-import org.bouncycastle.oldcrypto.Digest;
-
-/**
- * base implementation of MD4 family style digest as outlined in
- * "Handbook of Applied Cryptography", pages 344 - 347.
- */
-public abstract class GeneralDigest
-    implements Digest
-{
-    private final byte[]  xBuf;
-    private int     xBufOff;
-
-    private long    byteCount;
-
-    /**
-     * Standard constructor
-     */
-    protected GeneralDigest()
-    {
-        xBuf = new byte[4];
-        xBufOff = 0;
-    }
-
-    /**
-     * Copy constructor.  We are using copy constructors in place
-     * of the Object.clone() interface as this interface is not
-     * supported by J2ME.
-     */
-    protected GeneralDigest(GeneralDigest t)
-    {
-        xBuf = new byte[t.xBuf.length];
-        System.arraycopy(t.xBuf, 0, xBuf, 0, t.xBuf.length);
-
-        xBufOff = t.xBufOff;
-        byteCount = t.byteCount;
-    }
-
-    public void update(
-        byte in)
-    {
-        xBuf[xBufOff++] = in;
-
-        if (xBufOff == xBuf.length)
-        {
-            processWord(xBuf, 0);
-            xBufOff = 0;
-        }
-
-        byteCount++;
-    }
-
-    public void update(
-        byte[]  in,
-        int     inOff,
-        int     len)
-    {
-        //
-        // fill the current word
-        //
-        while ((xBufOff != 0) && (len > 0))
-        {
-            update(in[inOff]);
-
-            inOff++;
-            len--;
-        }
-
-        //
-        // process whole words.
-        //
-        while (len > xBuf.length)
-        {
-            processWord(in, inOff);
-
-            inOff += xBuf.length;
-            len -= xBuf.length;
-            byteCount += xBuf.length;
-        }
-
-        //
-        // load in the remainder.
-        //
-        while (len > 0)
-        {
-            update(in[inOff]);
-
-            inOff++;
-            len--;
-        }
-    }
-
-    public void finish()
-    {
-        long    bitLength = (byteCount << 3);
-
-        //
-        // add the pad bytes.
-        //
-        update((byte)128);
-
-        while (xBufOff != 0)
-        {
-            update((byte)0);
-        }
-
-        processLength(bitLength);
-
-        processBlock();
-    }
-
-    public void reset()
-    {
-        byteCount = 0;
-
-        xBufOff = 0;
-        for ( int i = 0; i < xBuf.length; i++ ) {
-            xBuf[i] = 0;
-        }
-    }
-
-    protected abstract void processWord(byte[] in, int inOff);
-
-    protected abstract void processLength(long bitLength);
-
-    protected abstract void processBlock();
-}
diff --git a/core/java/src/org/bouncycastle/oldcrypto/digests/MD5Digest.java b/core/java/src/org/bouncycastle/oldcrypto/digests/MD5Digest.java
deleted file mode 100644
index 250fb256f4f0b98ad9605009737cd416e8b0af45..0000000000000000000000000000000000000000
--- a/core/java/src/org/bouncycastle/oldcrypto/digests/MD5Digest.java
+++ /dev/null
@@ -1,303 +0,0 @@
-package org.bouncycastle.oldcrypto.digests;
-
-
-/**
- * implementation of MD5 as outlined in "Handbook of Applied Cryptography", pages 346 - 347.
- */
-public class MD5Digest
-    extends GeneralDigest
-{
-    private static final int    DIGEST_LENGTH = 16;
-
-    private int     H1, H2, H3, H4;         // IV's
-
-    private final int[]   X = new int[16];
-    private int     xOff;
-
-    /**
-     * Standard constructor
-     */
-    public MD5Digest()
-    {
-        reset();
-    }
-
-    /**
-     * Copy constructor.  This will copy the state of the provided
-     * message digest.
-     */
-    public MD5Digest(MD5Digest t)
-    {
-        super(t);
-
-        H1 = t.H1;
-        H2 = t.H2;
-        H3 = t.H3;
-        H4 = t.H4;
-
-        System.arraycopy(t.X, 0, X, 0, t.X.length);
-        xOff = t.xOff;
-    }
-
-    public String getAlgorithmName()
-    {
-        return "MD5";
-    }
-
-    public int getDigestSize()
-    {
-        return DIGEST_LENGTH;
-    }
-
-    protected void processWord(
-        byte[]  in,
-        int     inOff)
-    {
-        X[xOff++] = (in[inOff] & 0xff) | ((in[inOff + 1] & 0xff) << 8)
-            | ((in[inOff + 2] & 0xff) << 16) | ((in[inOff + 3] & 0xff) << 24); 
-
-        if (xOff == 16)
-        {
-            processBlock();
-        }
-    }
-
-    protected void processLength(
-        long    bitLength)
-    {
-        if (xOff > 14)
-        {
-            processBlock();
-        }
-
-        X[14] = (int)(bitLength & 0xffffffff);
-        X[15] = (int)(bitLength >>> 32);
-    }
-
-    private static void unpackWord(
-        int     word,
-        byte[]  out,
-        int     outOff)
-    {
-        out[outOff]     = (byte)word;
-        out[outOff + 1] = (byte)(word >>> 8);
-        out[outOff + 2] = (byte)(word >>> 16);
-        out[outOff + 3] = (byte)(word >>> 24);
-    }
-
-    public int doFinal(
-        byte[]  out,
-        int     outOff)
-    {
-        finish();
-
-        unpackWord(H1, out, outOff);
-        unpackWord(H2, out, outOff + 4);
-        unpackWord(H3, out, outOff + 8);
-        unpackWord(H4, out, outOff + 12);
-
-        reset();
-
-        return DIGEST_LENGTH;
-    }
-
-    /**
-     * reset the chaining variables to the IV values.
-     */
-    @Override
-    public void reset()
-    {
-        super.reset();
-
-        H1 = 0x67452301;
-        H2 = 0xefcdab89;
-        H3 = 0x98badcfe;
-        H4 = 0x10325476;
-
-        xOff = 0;
-
-        for (int i = 0; i != X.length; i++)
-        {
-            X[i] = 0;
-        }
-    }
-
-    //
-    // round 1 left rotates
-    //
-    private static final int S11 = 7;
-    private static final int S12 = 12;
-    private static final int S13 = 17;
-    private static final int S14 = 22;
-
-    //
-    // round 2 left rotates
-    //
-    private static final int S21 = 5;
-    private static final int S22 = 9;
-    private static final int S23 = 14;
-    private static final int S24 = 20;
-
-    //
-    // round 3 left rotates
-    //
-    private static final int S31 = 4;
-    private static final int S32 = 11;
-    private static final int S33 = 16;
-    private static final int S34 = 23;
-
-    //
-    // round 4 left rotates
-    //
-    private static final int S41 = 6;
-    private static final int S42 = 10;
-    private static final int S43 = 15;
-    private static final int S44 = 21;
-
-    /*
-     * rotate int x left n bits.
-     */
-    private static int rotateLeft(
-        int x,
-        int n)
-    {
-        return (x << n) | (x >>> (32 - n));
-    }
-
-    /*
-     * F, G, H and I are the basic MD5 functions.
-     */
-    private static int F(
-        int u,
-        int v,
-        int w)
-    {
-        return (u & v) | (~u & w);
-    }
-
-    private static int G(
-        int u,
-        int v,
-        int w)
-    {
-        return (u & w) | (v & ~w);
-    }
-
-    private static int H(
-        int u,
-        int v,
-        int w)
-    {
-        return u ^ v ^ w;
-    }
-
-    private static int K(
-        int u,
-        int v,
-        int w)
-    {
-        return v ^ (u | ~w);
-    }
-
-    protected void processBlock()
-    {
-        int a = H1;
-        int b = H2;
-        int c = H3;
-        int d = H4;
-
-        //
-        // Round 1 - F cycle, 16 times.
-        //
-        a = rotateLeft((a + F(b, c, d) + X[ 0] + 0xd76aa478), S11) + b;
-        d = rotateLeft((d + F(a, b, c) + X[ 1] + 0xe8c7b756), S12) + a;
-        c = rotateLeft((c + F(d, a, b) + X[ 2] + 0x242070db), S13) + d;
-        b = rotateLeft((b + F(c, d, a) + X[ 3] + 0xc1bdceee), S14) + c;
-        a = rotateLeft((a + F(b, c, d) + X[ 4] + 0xf57c0faf), S11) + b;
-        d = rotateLeft((d + F(a, b, c) + X[ 5] + 0x4787c62a), S12) + a;
-        c = rotateLeft((c + F(d, a, b) + X[ 6] + 0xa8304613), S13) + d;
-        b = rotateLeft((b + F(c, d, a) + X[ 7] + 0xfd469501), S14) + c;
-        a = rotateLeft((a + F(b, c, d) + X[ 8] + 0x698098d8), S11) + b;
-        d = rotateLeft((d + F(a, b, c) + X[ 9] + 0x8b44f7af), S12) + a;
-        c = rotateLeft((c + F(d, a, b) + X[10] + 0xffff5bb1), S13) + d;
-        b = rotateLeft((b + F(c, d, a) + X[11] + 0x895cd7be), S14) + c;
-        a = rotateLeft((a + F(b, c, d) + X[12] + 0x6b901122), S11) + b;
-        d = rotateLeft((d + F(a, b, c) + X[13] + 0xfd987193), S12) + a;
-        c = rotateLeft((c + F(d, a, b) + X[14] + 0xa679438e), S13) + d;
-        b = rotateLeft((b + F(c, d, a) + X[15] + 0x49b40821), S14) + c;
-
-        //
-        // Round 2 - G cycle, 16 times.
-        //
-        a = rotateLeft((a + G(b, c, d) + X[ 1] + 0xf61e2562), S21) + b;
-        d = rotateLeft((d + G(a, b, c) + X[ 6] + 0xc040b340), S22) + a;
-        c = rotateLeft((c + G(d, a, b) + X[11] + 0x265e5a51), S23) + d;
-        b = rotateLeft((b + G(c, d, a) + X[ 0] + 0xe9b6c7aa), S24) + c;
-        a = rotateLeft((a + G(b, c, d) + X[ 5] + 0xd62f105d), S21) + b;
-        d = rotateLeft((d + G(a, b, c) + X[10] + 0x02441453), S22) + a;
-        c = rotateLeft((c + G(d, a, b) + X[15] + 0xd8a1e681), S23) + d;
-        b = rotateLeft((b + G(c, d, a) + X[ 4] + 0xe7d3fbc8), S24) + c;
-        a = rotateLeft((a + G(b, c, d) + X[ 9] + 0x21e1cde6), S21) + b;
-        d = rotateLeft((d + G(a, b, c) + X[14] + 0xc33707d6), S22) + a;
-        c = rotateLeft((c + G(d, a, b) + X[ 3] + 0xf4d50d87), S23) + d;
-        b = rotateLeft((b + G(c, d, a) + X[ 8] + 0x455a14ed), S24) + c;
-        a = rotateLeft((a + G(b, c, d) + X[13] + 0xa9e3e905), S21) + b;
-        d = rotateLeft((d + G(a, b, c) + X[ 2] + 0xfcefa3f8), S22) + a;
-        c = rotateLeft((c + G(d, a, b) + X[ 7] + 0x676f02d9), S23) + d;
-        b = rotateLeft((b + G(c, d, a) + X[12] + 0x8d2a4c8a), S24) + c;
-
-        //
-        // Round 3 - H cycle, 16 times.
-        //
-        a = rotateLeft((a + H(b, c, d) + X[ 5] + 0xfffa3942), S31) + b;
-        d = rotateLeft((d + H(a, b, c) + X[ 8] + 0x8771f681), S32) + a;
-        c = rotateLeft((c + H(d, a, b) + X[11] + 0x6d9d6122), S33) + d;
-        b = rotateLeft((b + H(c, d, a) + X[14] + 0xfde5380c), S34) + c;
-        a = rotateLeft((a + H(b, c, d) + X[ 1] + 0xa4beea44), S31) + b;
-        d = rotateLeft((d + H(a, b, c) + X[ 4] + 0x4bdecfa9), S32) + a;
-        c = rotateLeft((c + H(d, a, b) + X[ 7] + 0xf6bb4b60), S33) + d;
-        b = rotateLeft((b + H(c, d, a) + X[10] + 0xbebfbc70), S34) + c;
-        a = rotateLeft((a + H(b, c, d) + X[13] + 0x289b7ec6), S31) + b;
-        d = rotateLeft((d + H(a, b, c) + X[ 0] + 0xeaa127fa), S32) + a;
-        c = rotateLeft((c + H(d, a, b) + X[ 3] + 0xd4ef3085), S33) + d;
-        b = rotateLeft((b + H(c, d, a) + X[ 6] + 0x04881d05), S34) + c;
-        a = rotateLeft((a + H(b, c, d) + X[ 9] + 0xd9d4d039), S31) + b;
-        d = rotateLeft((d + H(a, b, c) + X[12] + 0xe6db99e5), S32) + a;
-        c = rotateLeft((c + H(d, a, b) + X[15] + 0x1fa27cf8), S33) + d;
-        b = rotateLeft((b + H(c, d, a) + X[ 2] + 0xc4ac5665), S34) + c;
-
-        //
-        // Round 4 - K cycle, 16 times.
-        //
-        a = rotateLeft((a + K(b, c, d) + X[ 0] + 0xf4292244), S41) + b;
-        d = rotateLeft((d + K(a, b, c) + X[ 7] + 0x432aff97), S42) + a;
-        c = rotateLeft((c + K(d, a, b) + X[14] + 0xab9423a7), S43) + d;
-        b = rotateLeft((b + K(c, d, a) + X[ 5] + 0xfc93a039), S44) + c;
-        a = rotateLeft((a + K(b, c, d) + X[12] + 0x655b59c3), S41) + b;
-        d = rotateLeft((d + K(a, b, c) + X[ 3] + 0x8f0ccc92), S42) + a;
-        c = rotateLeft((c + K(d, a, b) + X[10] + 0xffeff47d), S43) + d;
-        b = rotateLeft((b + K(c, d, a) + X[ 1] + 0x85845dd1), S44) + c;
-        a = rotateLeft((a + K(b, c, d) + X[ 8] + 0x6fa87e4f), S41) + b;
-        d = rotateLeft((d + K(a, b, c) + X[15] + 0xfe2ce6e0), S42) + a;
-        c = rotateLeft((c + K(d, a, b) + X[ 6] + 0xa3014314), S43) + d;
-        b = rotateLeft((b + K(c, d, a) + X[13] + 0x4e0811a1), S44) + c;
-        a = rotateLeft((a + K(b, c, d) + X[ 4] + 0xf7537e82), S41) + b;
-        d = rotateLeft((d + K(a, b, c) + X[11] + 0xbd3af235), S42) + a;
-        c = rotateLeft((c + K(d, a, b) + X[ 2] + 0x2ad7d2bb), S43) + d;
-        b = rotateLeft((b + K(c, d, a) + X[ 9] + 0xeb86d391), S44) + c;
-
-        H1 += a;
-        H2 += b;
-        H3 += c;
-        H4 += d;
-
-        //
-        // reset the offset and clean out the word buffer.
-        //
-        xOff = 0;
-        for (int i = 0; i != X.length; i++)
-        {
-            X[i] = 0;
-        }
-    }
-}
diff --git a/core/java/src/org/bouncycastle/oldcrypto/macs/I2PHMac.java b/core/java/src/org/bouncycastle/oldcrypto/macs/I2PHMac.java
index 031f0295512e559ad2a8f0cf50e994ba3fcca26c..09ccb63941815e8a7fda464a4ef75f12d0b7f3d4 100644
--- a/core/java/src/org/bouncycastle/oldcrypto/macs/I2PHMac.java
+++ b/core/java/src/org/bouncycastle/oldcrypto/macs/I2PHMac.java
@@ -27,11 +27,12 @@ package org.bouncycastle.oldcrypto.macs;
  */
 
 //import org.bouncycastle.crypto.CipherParameters;
+import java.security.DigestException;
+import java.security.MessageDigest;
 import java.util.Arrays;
 
 import net.i2p.util.SimpleByteCache;
 
-import org.bouncycastle.oldcrypto.Digest;
 import org.bouncycastle.oldcrypto.Mac;
 
 /**
@@ -47,6 +48,10 @@ import org.bouncycastle.oldcrypto.Mac;
  * in the standard bouncycastle library, thus it conflicts in JVMs that contain the
  * standard library (Android).
  *
+ * As of 0.9.12, refactored to use standard MessageDigest.
+ *
+ * Deprecated - Do not use outside of router or Syndie.
+ * To be moved to router.
  */
 public class I2PHMac
 implements Mac
@@ -56,34 +61,34 @@ implements Mac
     private final static byte IPAD = (byte)0x36;
     private final static byte OPAD = (byte)0x5C;
 
-    private final Digest digest;
+    private final MessageDigest digest;
     private final int digestSize;
     private final byte[] inputPad = new byte[BLOCK_LENGTH];
     private final byte[] outputPad = new byte[BLOCK_LENGTH];
 
-    public I2PHMac(
-        Digest digest)
-    {
-        this(digest, digest.getDigestSize()); 
+    /**
+     *  Standard HMAC, size == digest size.
+     *  @deprecated Use javax.crypto.Mac
+     */
+    public I2PHMac(MessageDigest digest) {
+        this(digest, digest.getDigestLength()); 
     }
 
     /**
-     *  @param sz override the digest's size
+     *  @param sz override the digest's size, nonstandard if different.
      *  SEE NOTES in HMACGenerator about why this isn't compatible with standard HmacMD5
      */
-    public I2PHMac(
-        Digest digest, int sz)
-    {
+    public I2PHMac(MessageDigest digest, int sz) {
         this.digest = digest;
         this.digestSize = sz; 
     }
 
     public String getAlgorithmName()
     {
-        return digest.getAlgorithmName() + "/HMAC";
+        return digest.getAlgorithm() + "/HMAC";
     }
 
-    public Digest getUnderlyingDigest()
+    public MessageDigest getUnderlyingDigest()
     {
         return digest;
     }
@@ -100,7 +105,12 @@ implements Mac
         if (key.length > BLOCK_LENGTH)
         {
             digest.update(key, 0, key.length);
-            digest.doFinal(inputPad, 0);
+            try {
+                digest.digest(inputPad, 0, digestSize);
+            } catch (DigestException de) {
+                digest.reset();
+                throw new IllegalArgumentException(de);
+            }
             for (int i = digestSize; i < inputPad.length; i++)
             {
                 inputPad[i] = 0;
@@ -133,42 +143,32 @@ implements Mac
         digest.update(inputPad, 0, inputPad.length);
     }
 
-    public int getMacSize()
-    {
+    public int getMacSize() {
         return digestSize;
     }
 
-    public void update(
-        byte in)
-    {
+    public void update(byte in) {
         digest.update(in);
     }
 
-    public void update(
-        byte[] in,
-        int inOff,
-        int len)
-    {
+    public void update(byte[] in, int inOff, int len) {
         digest.update(in, inOff, len);
     }
 
-    public int doFinal(
-        byte[] out,
-        int outOff)
-    {
+    public int doFinal(byte[] out, int outOff) {
         byte[] tmp = acquireTmp(digestSize);
         //byte[] tmp = new byte[digestSize];
-        digest.doFinal(tmp, 0);
-
-        digest.update(outputPad, 0, outputPad.length);
-        digest.update(tmp, 0, tmp.length);
-        releaseTmp(tmp);
-
-        int     len = digest.doFinal(out, outOff);
-
-        reset();
-
-        return len;
+        try {
+            digest.digest(tmp, 0, digestSize);
+            digest.update(outputPad, 0, outputPad.length);
+            digest.update(tmp, 0, tmp.length);
+            return digest.digest(out, outOff, digestSize);
+        } catch (DigestException de) {
+            throw new IllegalArgumentException(de);
+        } finally {
+            releaseTmp(tmp);
+            reset();
+        }
     }
     
     private static byte[] acquireTmp(int sz) {
diff --git a/debian/changelog b/debian/changelog
index d9cd5655288478b6bf1fd800a020a5592aebed2b..0630433829fc0ada6df7e46bab65e02adcea9433 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,27 @@
+i2p (0.9.11-1) unstable; urgency=medium
+
+  * New release
+  * Debconf: New Korean and Polish translations
+
+ -- Kill Your TV <killyourtv@i2pmail.org>  Sat, 09 Feb 2014 00:00:00 +0000
+
+i2p (0.9.10-1) unstable; urgency=medium
+
+  * New release
+  * Remove /var/lib/i2p when i2p package is purged.
+  * Bump standards version to 3.9.5 (no changes needed)
+
+ -- Kill Your TV <killyourtv@i2pmail.org>  Wed, 22 Jan 2014 16:00:24 +0000
+
+i2p (0.9.9-1) unstable; urgency=medium
+
+  * New Upstream release
+  * debconf:
+    - Updated French translation
+    - New Romanian translation
+
+ -- Kill Your TV <killyourtv@i2pmail.org>  Sat, 07 Dec 2013 18:17:24 +0000
+
 i2p (0.9.8-1) unstable; urgency=low
 
   * New Upstream Version
diff --git a/debian/patches/0001-path-substitution.patch b/debian/patches/0001-path-substitution.patch
index ac2bfe0fd8a34e24949f04b9970a37d3b42e4524..da91ad2683acbb3537a0140826c30d1e6f642b9e 100644
--- a/debian/patches/0001-path-substitution.patch
+++ b/debian/patches/0001-path-substitution.patch
@@ -71,20 +71,13 @@ Debian wrapper.config to try to prevent confusion.
  
  # Priority at which to run the wrapper.  See "man nice" for valid priorities.
  #  nice is only used if a priority is specified.
-@@ -167,69 +158,13 @@
- 
- # Do not modify anything beyond this point
- #-----------------------------------------------------------------------------
-+JAVABINARY=$(awk -F'=' '/^ *wrapper\.java\.command/{print $2}' "$WRAPPER_CONF")
-+
- if [ ! -e "$WRAPPER_CONF" ]; then
-        echo "Starting I2P Failed: Unable to find $WRAPPER_CONF"
+@@ -172,84 +163,8 @@
         exit 1
  fi
  
 -# Workaround for Gentoo
--JAVABINARY=$(awk -F'=' '/^ *wrapper\.java\.command/{print $2}' "$WRAPPER_CONF")
--
+ JAVABINARY=$(awk -F'=' '/^ *wrapper\.java\.command/{print $2}' "$WRAPPER_CONF")
+ 
 -if [ -e /etc/gentoo-release ]; then
 -    if [ $JAVABINARY = java ]; then
 -        if [ -x /etc/java-config-2/current-system-vm/bin/java ]; then
@@ -109,25 +102,46 @@ Debian wrapper.config to try to prevent confusion.
 -    echo
 -}
 -
+-freebsd10() {
+-    echo
+-    echo "The current version of the Tanuki wrapper does not"
+-    echo "support FreeBSD 10."
+-    echo
+-    echo "See https://trac.i2p2.de/ticket/1118 for more information"
+-    echo "and a workaround for this issue."
+-    echo
+-    echo "In the meantime, you may start I2P by running the script"
+-    echo "${I2P}/runplain.sh"
+-    echo
+-}
+-
 -failed() {
--        echo "**`gettext 'Failed to load the wrapper'`**"
--        case `uname -s` in
--             FreeBSD)
--                # We should never get here on recent versions of FreeBSD
--                if ! $(pkg_info -E 'libiconv*' > /dev/null 2>&1); then
--                    echo
--                    echo "The wrapper requires libiconv."
--                    echo
--                    echo "It can be installed with pkg_add -r libiconv"
--                    echo
--                fi
--                ;;
--             *)
--                echo
--                unsupported
--                ;;
--        esac
--        exit 1
+-    echo "**`gettext 'Failed to load the wrapper'`**"
+-    case `uname -s` in
+-        FreeBSD)
+-            case `uname -r` in
+-                10*|11*)
+-                    freebsd10
+-                    ;;
+-                *)
+-                    # We should never get here on recent versions of FreeBSD
+-                    if ! $(pkg_info -E 'libiconv*' > /dev/null 2>&1); then
+-                        echo
+-                        echo "The wrapper requires libiconv."
+-                        echo
+-                        echo "It can be installed with pkg_add -r libiconv"
+-                        echo
+-                    fi
+-                    ;;
+-            esac
+-            ;;
+-
+-        *)
+-            echo
+-            unsupported
+-            ;;
+-    esac
+-    exit 1
 -}
 -
 -if $(which ldd > /dev/null 2>&1); then
@@ -139,20 +153,10 @@ Debian wrapper.config to try to prevent confusion.
 -        failed
 -    fi
 -fi
--
+ 
  if [ -n "$FIXED_COMMAND" ]
  then
-     COMMAND="$FIXED_COMMAND"
-@@ -944,7 +879,7 @@
- 
-         # The string passed to eval must handles spaces in paths correctly.
-         COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.java.command=\"$JAVABINARY\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" $ANCHORPROP $STATUSPROP $COMMANDPROP $LOCKPROP $LOGPROP wrapper.script.version=3.5.22 $ADDITIONAL_PARA"
--        eval $COMMAND_LINE || failed
-+        eval $COMMAND_LINE
-     else
-         eval echo `gettext '$APP_LONG_NAME is already running.'`
-         exit 1
-@@ -1001,7 +936,6 @@
+@@ -1022,7 +937,6 @@
          if [ "X$pid" = "X" ]
          then
              eval echo " `gettext 'WARNING: $APP_LONG_NAME may have failed to start.'`"
@@ -160,7 +164,7 @@ Debian wrapper.config to try to prevent confusion.
          else
              eval echo ' running: PID:$pid'
          fi
-@@ -1804,7 +1738,7 @@
+@@ -1825,7 +1739,7 @@
  }
  
  showsetusermesg()  {
@@ -169,7 +173,7 @@ Debian wrapper.config to try to prevent confusion.
  }
  
  checkifstartingasroot() {
-@@ -1812,7 +1746,7 @@
+@@ -1833,7 +1747,7 @@
          echo "`gettext 'Running I2P as the root user is *not* recommended.'`"
          showsetusermesg
          echo
@@ -178,7 +182,7 @@ Debian wrapper.config to try to prevent confusion.
          exit 1
      fi
  }
-@@ -1877,24 +1811,10 @@
+@@ -1898,24 +1812,10 @@
              status
              ;;
  
@@ -575,20 +579,41 @@ Debian wrapper.config to try to prevent confusion.
  "true."
 --- a/installer/resources/locale/po/messages_pt_BR.po
 +++ b/installer/resources/locale/po/messages_pt_BR.po
-@@ -186,13 +186,13 @@
+@@ -187,13 +187,13 @@
  msgstr ""
  
  #: ../i2prouter:1807
 -msgid "Please edit i2prouter and set the variable RUN_AS_USER"
 -msgstr "Por favor, edite i2prouter e especifique a variável RUN_AS_USER"
 +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER"
-+msgstr "Por favor, edite /etc/default/i2p especifique a variável RUN_AS_USER"
++msgstr "Por favor, edite /etc/default/i2p e especifique a variável RUN_AS_USER"
  
  #: ../i2prouter:1812
  msgid "Running I2P as the root user is *not* recommended."
- msgstr ""
+ msgstr "Executar o roteador I2P como usuário root *não* é recomendado."
  
  #: ../i2prouter:1815
 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true."
+-msgstr "De qualquer forma, se quiser mesmo executar o roteador como root, edite i2prouter e ponha ALLOW_ROOT=true."
 +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true."
- msgstr ""
++msgstr "De qualquer forma, se quiser mesmo executar o roteador como root, edite /etc/default/i2p e ponha ALLOW_ROOT=true."
+--- a/installer/resources/locale/po/messages_pl.po
++++ b/installer/resources/locale/po/messages_pl.po
+@@ -186,13 +186,13 @@
+ msgstr "Zażądaj zrzutu wątków Java jeśli jest uruchomiona."
+ 
+ #: ../i2prouter:1807
+-msgid "Please edit i2prouter and set the variable RUN_AS_USER"
+-msgstr "ProszÄ™ edytuj i2prouter i ustaw zmiennÄ… RUN_AS_USER"
++msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER"
++msgstr "ProszÄ™ edytuj /etc/default/i2p i ustaw zmiennÄ… RUN_AS_USER"
+ 
+ #: ../i2prouter:1812
+ msgid "Running I2P as the root user is *not* recommended."
+ msgstr "Nie jest polecane uruchamianie I2P jako root."
+ 
+ #: ../i2prouter:1815
+-msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true."
+-msgstr "Aby uruchomić jako root, edytuj i2prouter i ustaw ALLOW_ROOT=true."
++msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true."
++msgstr "Aby uruchomić jako root, edytuj /etc/default/i2p i ustaw ALLOW_ROOT=true."
diff --git a/debian/po/ja.po b/debian/po/ja.po
new file mode 100644
index 0000000000000000000000000000000000000000..9bdddd9ce0584d6770ec3416bb8f8b15601f59ad
--- /dev/null
+++ b/debian/po/ja.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# plazmism <gomidori@live.jp>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P\n"
+"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
+"POT-Creation-Date: 2011-12-27 22:25+0000\n"
+"PO-Revision-Date: 2014-01-31 12:06+0000\n"
+"Last-Translator: plazmism <gomidori@live.jp>\n"
+"Language-Team: Japanese (http://www.transifex.com/projects/p/I2P/language/"
+"ja/)\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. Type: boolean
+#. Description
+#: ../i2p.templates:2001
+msgid "Should the I2P router be started at boot?"
+msgstr "I2P ルーターをブート時に起動しますか?"
+
+#. Type: boolean
+#. Description
+#: ../i2p.templates:2001
+msgid ""
+"The I2P router can be run as a daemon that starts automatically when your "
+"computer boots up. This is the recommended configuration."
+msgstr ""
+"I2P は、コンピューターのブート時に自動的に開始するデーモンとして起動できま"
+"す。これは推奨の設定です。"
+
+#. Type: string
+#. Description
+#: ../i2p.templates:3001
+msgid "I2P daemon user:"
+msgstr "I2P デーモンユーザー:"
+
+#. Type: string
+#. Description
+#: ../i2p.templates:3001
+msgid ""
+"By default I2P is configured to run under the account i2psvc when running as "
+"a daemon. To use an **existing** I2P profile you may enter a different "
+"account name here. For example, if your previous I2P installation is at /"
+"home/user/i2p, you may enter 'user' here."
+msgstr ""
+"デフォルトでは、 I2P はデーモンとして起動時、アカウント i2psvc で起動するよう"
+"設定されています。**既存の** I2P プロファイルを使用するには、ここに異なるアカ"
+"ウント名を入力してください。例えば、以前の I2P インストールが /home/user/i2p "
+"であれば、ここに 'user' と入力してください。"
+
+#. Type: string
+#. Description
+#: ../i2p.templates:3001
+msgid ""
+"Very important: If a user other than the default of 'i2psvc' is entered "
+"here, the chosen username *MUST* already exist."
+msgstr ""
+"非常に重要: 'i2psvc' のデフォルト以外のユーザーがここで入力されるなら、選択さ"
+"れるユーザー名は既存のものでなければ*なりません*。"
+
+#. Type: string
+#. Description
+#: ../i2p.templates:4001
+msgid "Memory that can be allocated to I2P:"
+msgstr "I2P に割り当てられうるメモリ:"
+
+#. Type: string
+#. Description
+#: ../i2p.templates:4001
+msgid "By default, I2P will only be allowed to use up to 128MB of RAM."
+msgstr ""
+"デフォルトでは、 I2P は最大 128MB メモリまでしか使用を許可されていません。"
+
+#. Type: string
+#. Description
+#: ../i2p.templates:4001
+msgid ""
+"High bandwidth routers, as well as routers with a lot of active torrents / "
+"plugins, may need to have this value increased."
+msgstr ""
+"高い帯域幅のルーター、またたくさんのアクティブな torrent / プラグインがある"
+"ルーターも、この値を増やす必要がある場合があります。"
diff --git a/debian/po/ko.po b/debian/po/ko.po
new file mode 100644
index 0000000000000000000000000000000000000000..825e8045de0667aadf8d0c32d27d862d2ff290f3
--- /dev/null
+++ b/debian/po/ko.po
@@ -0,0 +1,87 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# helloks <kqwe1859@gmail.com>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P\n"
+"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
+"POT-Creation-Date: 2011-12-27 22:25+0000\n"
+"PO-Revision-Date: 2014-01-27 12:28+0000\n"
+"Last-Translator: helloks <kqwe1859@gmail.com>\n"
+"Language-Team: Korean (http://www.transifex.com/projects/p/I2P/language/"
+"ko/)\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. Type: boolean
+#. Description
+#: ../i2p.templates:2001
+msgid "Should the I2P router be started at boot?"
+msgstr "I2P 라우터가 부팅시 시작되게 할까요?"
+
+#. Type: boolean
+#. Description
+#: ../i2p.templates:2001
+msgid ""
+"The I2P router can be run as a daemon that starts automatically when your "
+"computer boots up. This is the recommended configuration."
+msgstr ""
+"I2P 라우터는 컴퓨터 부팅시 자동적으로 데몬으로 실행될 수 있습니다. 설정이 권"
+"장됩니다."
+
+#. Type: string
+#. Description
+#: ../i2p.templates:3001
+msgid "I2P daemon user:"
+msgstr "I2P 데몬 유저:"
+
+#. Type: string
+#. Description
+#: ../i2p.templates:3001
+msgid ""
+"By default I2P is configured to run under the account i2psvc when running as "
+"a daemon. To use an **existing** I2P profile you may enter a different "
+"account name here. For example, if your previous I2P installation is at /"
+"home/user/i2p, you may enter 'user' here."
+msgstr ""
+"기본적으로 I2P는 데몬으로 실행시 i2psvc 계정으로 시작됩니다. **기존** I2P 프"
+"로필 적용을 위해선 다른 계정의 이름을 적어야 합니다. 예를 들어, 기존 I2P 설치"
+"가 /home/user/i2p에 되었다면, 여기에 'user'를 입력하세요."
+
+#. Type: string
+#. Description
+#: ../i2p.templates:3001
+msgid ""
+"Very important: If a user other than the default of 'i2psvc' is entered "
+"here, the chosen username *MUST* already exist."
+msgstr ""
+"중요: 기본값인 'i2psvc' 대신 다른 유저를 이용시에, 결정된 유저는 *반드시* 이"
+"미 존재해야 합니다."
+
+#. Type: string
+#. Description
+#: ../i2p.templates:4001
+msgid "Memory that can be allocated to I2P:"
+msgstr "I2P에게 할당될 메모리:"
+
+#. Type: string
+#. Description
+#: ../i2p.templates:4001
+msgid "By default, I2P will only be allowed to use up to 128MB of RAM."
+msgstr "기본적으로, I2P는 128MB의 램으로 동작합니다."
+
+#. Type: string
+#. Description
+#: ../i2p.templates:4001
+msgid ""
+"High bandwidth routers, as well as routers with a lot of active torrents / "
+"plugins, may need to have this value increased."
+msgstr ""
+"높은 대역폭의 라우터, 또는 활성화된 torrent / 플러그인을 많이 사용하는 라우터"
+"의 경우, 이 값을 증가시켜야 할 수 있습니다."
diff --git a/history.txt b/history.txt
index 0d0f4a302ecda323755858a0e8a796ff92e63b82..0333cd0f17bcb8e2d412a293f1d5d6b6ffc8dfa5 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,110 @@
+2014-02-17 zzz
+ * HMAC:
+   - Replace BC MD5 with JVM version, refactor I2PHMAC to use
+     MessageDigest instead of BC Digest (ticket #1189)
+   - Use JVM HmacSHA256 instead of I2PHMAC for Syndie since it is standard
+ * SSU:
+   - Use session key for relay request/response if available (ticket #1206)
+   - Restrict authentication with Bob's intro key to session created packet
+   - Remove packetAuthTime stats
+ * Initial support for key certificates and arbitrary types and lengths
+   of signing keys and signatures in RouterIdentities and Destinations.
+   - Fixup of Destination.create() and Destination.size()
+   - Add generic off/len methods in DSAEngine, needed for streaming
+   - Support i2cp.destination.sigType option in TunnelController and
+     I2PSocketManagerFactory
+   - Fixup of sign/verify in streaming Packet
+   - Add setting in i2ptunnel server edit page (hidden for now)
+   - Comment out cert setting on i2ptunnel server edit page
+   - Show key type on susidns details page and LS debug page
+   - Hide setting in i2ptunnel edit pages unless advanced user
+   - Only store LS with key certs to routers that support it
+   - Only store LS with more than 6 leases to routers that support it
+
+2014-02-14 zzz
+ * I2CP:
+   - Add session limit, add new status code for refused
+   - Ramdomize session ID, prevent dups
+   - Make SessionId immutable
+
+2014-02-13 zzz
+ * Router: Convert to getopt (ticket #1173)
+ * Tunnels: Change expl. OB default to 3+0
+
+2014-02-11 zzz
+ * HTTP client proxy: Don't flush after headers for a POST,
+   so the POST data is included in the SYN packet,
+   to improve speed and reliability of small POSTs
+
+2014-02-10 zzz
+Prop from i2p.i2p.zzz.test2:
+ * Addressbook: Rewrite subscriptions.txt for new default URL
+ * Build: Honor require.gettext=false for i2prouter translations
+ * Core: Add lightweight getopt command line parsing lib (ticket #1173)
+ * EepGet:
+   - Convert to getopt (ticket #1173)
+   - New option -c for clearnet (no proxy), same as -p:0
+   - Proxy option -p with host name arg only (no ':') now allowed
+   - Proxy password option is now -x, not the second arg to -u
+   - Prompt for proxy password if not supplied in options
+   - Line length option is now -l, not the second arg to -m
+   - Error on nonproxied .onion hosts
+   - Update man page, sort options (ticket #1173)
+   - Support Digest proxy authentication (ticket #1173)
+   - Move authentication parsing method from I2PTunnelHTTPClientBase
+ * EepHead, PartialEepGet, SSLEepGet: Convert to getopt (ticket #1173)
+ * EepHead, PartialEepGet:
+   - New option -c for clearnet (no proxy), same as -p:0
+   - New option -o, same as EepGet
+   - Proxy option -p with host name arg only (no ':') now allowed
+   - Add proxy auth support with -u and -x options (ticket #1173)
+ * I2Ping:
+   - Convert to getopt (ticket #1173)
+   - Add support for from/to ports
+ * i2psnark: Cache PeerID.toString()
+ * I2PTunnel:
+   - Convert to getopt (ticket #1173)
+   - Add more argument sanity checking and a usage output
+ * PrivateKeyFile:
+   - Convert to getopt (ticket #1173)
+   - New option -e for hashcash effort, replaces -h with arg
+   - Stub out -t option, to be propped from ecdsa branch
+ * Streaming:
+   - Set ports on many packets that were missing them
+   - Use connection throttling methods on pings too (ticket #1142)
+   - Add methods to set ports on pings
+   - Argument checking on ping methods
+ * SU3File: Convert to getopt (ticket #1173)
+ * UpdateManager: Convert to RouterApp and remove update hooks from context
+     (ticket #1185)
+
+2014-02-10 zzz
+ * Console:
+   - Don't reset graph settings when clicking restart or shutdown on graphs page
+   - Don't recommend guest login on trac, it's disabled
+   - Catch and remove corrupt jrb file (ticket #1186)
+   - Always set default language on /configui
+ * Transports: Reduce target connection count again to reduce
+               tunnel reject rate further
+
+* 2014-02-08 0.9.11 released
+
+2014-02-07 zzz
+ * Services:
+   - Move backup news to psi.i2p
+   - Move default addressbook subscription to i2p-projekt.i2p
+   - Remove www.i2p2.i2p from default update lists
+   - Add psi.i2p to hosts.txt
+   - Update links on help pages to avoid redirects on new website
+     and select the correct language
+ * SusiDNS: Fix whitespace issues
+
+2014-02-06 kytv
+ * Brazilian Portuguese, Danish, French, Japanese, Polish, Russian, Ukrainian
+   translation updates
+ * Updates to geoip.txt and geoipv6.dat.gz based on Maxmind GeoLite Country
+   database from 2014-02-05.
+
 2014-01-31 zzz
  * /logs: Fix encoding of wrapper log section (ticket #1193)
  * NetDB: Fix cases where corrupt RouterInfo files were not deleted (ticket #1190)
diff --git a/installer/install.xml b/installer/install.xml
index f6a6af22fa71260ae51f1c360063f085bcaa2634..7cbe31f2b31c61dbd172af2adb7ce6702dee7d91 100644
--- a/installer/install.xml
+++ b/installer/install.xml
@@ -4,7 +4,7 @@
 
     <info>
         <appname>i2p</appname>
-        <appversion>0.9.10</appversion>
+        <appversion>0.9.11</appversion>
         <authors>
             <author name="I2P" email="https://geti2p.net/"/>
         </authors>
diff --git a/installer/resources/checklist.txt b/installer/resources/checklist.txt
index db51258feab8704afa4489c863b392db818e8e23..80f4c8336a217c5d6f3eb892f1eb0e3d44896d33 100644
--- a/installer/resources/checklist.txt
+++ b/installer/resources/checklist.txt
@@ -73,17 +73,17 @@ Seed update torrents
 Notify the following people:
 	All in-network update hosts
 	PPA maintainer
-	Google code maintainer
 	news.xml maintainer
+	backup news.xml maintainer
 
 Website files to change:
-	Sync with mtn.i2p2.i2p
+	Sync with mtn.i2p-projekt.i2p
 	hosts.txt if it changed (copy from i2p.i2p mtn branch)
 	i2p2www/__init__.py (release number)
 	i2p2www/pages/downloads/list.html (checksums)
 	i2p2www/static/news/news.xml
 	New release announcement - see i2p2www/blog/README for instructions
-	Sync with mtn.i2p2.i2p
+	Sync with mtn.i2p-projekt.i2p
 
 Announce on:
          #i2p, #i2p-dev (also on freenode side)
diff --git a/installer/resources/geoip.txt b/installer/resources/geoip.txt
index a6800bdb1410adce234f7d91077e1393fd31c3ff..9ff20f66ebdd676361be8863f1b26d37e6c3cf73 100644
--- a/installer/resources/geoip.txt
+++ b/installer/resources/geoip.txt
@@ -1,5 +1,5 @@
 # Last updated based on Maxmind GeoLite Country
-# dated 2014-01-08
+# dated 2014-02-05
 # Script borrowed from Tor
 #
 # wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
@@ -250,7 +250,9 @@
 84049920,84082687,RO
 84082688,84148223,RU
 84148224,84410367,DE
-84410368,84434943,RU
+84410368,84428799,RU
+84428800,84429823,DE
+84429824,84434943,RU
 84434944,84443135,IT
 84443136,84451327,LB
 84451328,84457471,RU
@@ -268,7 +270,9 @@
 84560636,84560639,US
 84560640,84561215,NL
 84561216,84561247,US
-84561248,84561639,NL
+84561248,84561351,NL
+84561352,84561359,MY
+84561360,84561639,NL
 84561640,84561647,ES
 84561648,84561655,AF
 84561656,84561687,NL
@@ -289,13 +293,13 @@
 84564412,84564415,US
 84564416,84564663,NL
 84564664,84564671,GB
-84564672,84565247,NL
+84564672,84564871,NL
+84564872,84564879,MY
+84564880,84565247,NL
 84565248,84565311,US
 84565312,84565655,NL
 84565656,84565663,US
-84565664,84565735,NL
-84565736,84565743,GB
-84565744,84574207,NL
+84565664,84574207,NL
 84574208,84576255,FR
 84576256,84582399,GB
 84582400,84590591,DE
@@ -403,20 +407,32 @@
 86442752,86443007,GB
 86443008,86444319,FR
 86444320,86444323,ES
-86444324,86446427,FR
+86444324,86446407,FR
+86446408,86446408,DE
+86446409,86446411,FR
+86446412,86446412,DE
+86446413,86446427,FR
 86446428,86446431,DE
-86446432,86447095,FR
+86446432,86446619,FR
+86446620,86446620,DE
+86446621,86447095,FR
 86447096,86447103,ES
 86447104,86447255,FR
 86447256,86447263,PL
-86447264,86448803,FR
+86447264,86447279,FR
+86447280,86447280,DE
+86447281,86447287,FR
+86447288,86447288,DE
+86447289,86448803,FR
 86448804,86448807,FI
 86448808,86448851,FR
 86448852,86448855,IT
 86448856,86448859,PT
 86448860,86449363,FR
 86449364,86449367,DE
-86449368,86450235,FR
+86449368,86449883,FR
+86449884,86449884,DE
+86449885,86450235,FR
 86450236,86450239,GB
 86450240,86452671,FR
 86452672,86452735,GB
@@ -424,17 +440,27 @@
 86453837,86453838,PT
 86453839,86454335,FR
 86454336,86454343,DE
-86454344,86456195,FR
+86454344,86455623,FR
+86455624,86455624,DE
+86455625,86456195,FR
 86456196,86456211,DE
 86456212,86456351,FR
 86456352,86456367,CH
-86456368,86457087,FR
+86456368,86457059,FR
+86457060,86457060,DE
+86457061,86457087,FR
 86457088,86457091,DE
-86457092,86467320,FR
+86457092,86457111,FR
+86457112,86457112,DE
+86457113,86457455,FR
+86457456,86457456,DE
+86457457,86467320,FR
 86467321,86467321,FI
 86467322,86467999,FR
 86468000,86468003,PL
-86468004,86468447,FR
+86468004,86468055,FR
+86468056,86468056,DE
+86468057,86468447,FR
 86468448,86468479,CZ
 86468480,86469183,FR
 86469184,86469247,GB
@@ -442,7 +468,9 @@
 86469692,86469695,DE
 86469696,86470731,FR
 86470732,86470735,BE
-86470736,86473087,FR
+86470736,86471179,FR
+86471180,86471180,DE
+86471181,86473087,FR
 86473088,86473151,PT
 86473152,86474307,FR
 86474308,86474311,DE
@@ -593,9 +621,8 @@
 87672832,87674879,CH
 87674880,87676927,AE
 87676928,87678975,RU
-87678976,87679103,NL
-87679104,87679231,ES
-87679232,87681023,NL
+87678976,87679999,ES
+87680000,87681023,NL
 87681024,87683071,RU
 87683072,87685119,SE
 87685120,87687167,NL
@@ -688,11 +715,11 @@
 90503168,90505215,IL
 90505216,90529791,RU
 90529792,90533887,NL
-90533888,90542079,RU
-90542080,90544127,GB
+90533888,90540031,RU
+90540032,90544127,GB
 90544128,90546175,RU
-90546176,90548223,DE
-90548224,90570751,RU
+90546176,90550271,DE
+90550272,90570751,RU
 90570752,90578943,IT
 90578944,90583039,IR
 90583040,90587135,CZ
@@ -779,21 +806,27 @@
 92725248,92733439,SY
 92733440,92734735,FR
 92734736,92734739,DE
-92734740,92735999,FR
+92734740,92735615,FR
+92735616,92735616,DE
+92735617,92735875,FR
+92735876,92735876,DE
+92735877,92735999,FR
 92736000,92736255,GB
-92736256,92738719,FR
+92736256,92736479,FR
+92736480,92736480,DE
+92736481,92738719,FR
 92738720,92738727,GB
 92738728,92747711,FR
 92747712,92747775,GB
 92747776,92749067,FR
 92749068,92749071,GB
-92749072,92757311,FR
+92749072,92751711,FR
+92751712,92751712,DE
+92751713,92757311,FR
 92757312,92757375,ES
 92757376,92762127,FR
 92762128,92762135,ES
-92762136,92765443,FR
-92765444,92765447,ES
-92765448,92782687,FR
+92762136,92782687,FR
 92782688,92782719,ES
 92782720,92786827,FR
 92786828,92786831,IT
@@ -869,9 +902,7 @@
 93911040,93913087,AE
 93913088,93913327,NL
 93913328,93913335,US
-93913336,93914135,NL
-93914136,93914143,US
-93914144,93914357,NL
+93913336,93914357,NL
 93914358,93914358,GB
 93914359,93914710,NL
 93914711,93914711,GB
@@ -883,7 +914,9 @@
 93915856,93915863,US
 93915864,93915895,NL
 93915896,93915903,AT
-93915904,93916527,NL
+93915904,93916335,NL
+93916336,93916343,US
+93916344,93916527,NL
 93916528,93916543,US
 93916544,93916971,NL
 93916972,93916975,US
@@ -925,15 +958,21 @@
 93923856,93923863,US
 93923864,93924119,NL
 93924120,93924123,US
-93924124,93924591,NL
+93924124,93924407,NL
+93924408,93924415,JP
+93924416,93924591,NL
 93924592,93924599,US
 93924600,93924927,NL
 93924928,93924935,ES
-93924936,93926399,NL
+93924936,93925783,NL
+93925784,93925791,US
+93925792,93926399,NL
 93926400,93926463,US
 93926464,93926527,NL
 93926528,93926591,US
-93926592,93927231,NL
+93926592,93927143,NL
+93927144,93927151,JP
+93927152,93927231,NL
 93927232,93927247,CL
 93927248,93929471,NL
 93929472,93939711,GB
@@ -1187,9 +1226,7 @@
 100636672,100638719,NL
 100638720,100646911,UA
 100646912,100663295,RU
-100663296,134738943,US
-134738944,134739199,CA
-134739200,134874866,US
+100663296,134874866,US
 134874867,134874867,DO
 134874868,135192575,US
 135192576,135193343,MX
@@ -1201,27 +1238,15 @@
 135195392,135195647,MX
 135195648,135197951,US
 135197952,135198207,MX
-135198208,135430143,US
-135430144,135430399,CA
-135430400,135432191,US
-135432192,135434239,CA
-135434240,135441407,US
-135441408,135441663,CA
-135441664,135607039,US
+135198208,135607039,US
 135607040,135607295,CA
 135607296,135776255,US
 135776256,135776511,GU
 135776512,135790847,US
 135790848,135791615,CA
-135791616,135792639,US
-135792640,135794687,CA
-135794688,136237055,US
-136237056,136239103,CA
-136239104,136415487,US
-136415488,136415665,CA
+135791616,136415665,US
 136415666,136415666,FR
-136415667,136415743,CA
-136415744,136700159,US
+136415667,136700159,US
 136700160,136700415,IN
 136700416,152305663,US
 152305664,152338431,GB
@@ -1431,7 +1456,9 @@
 289628416,289628671,US
 289628672,289652735,GB
 289652736,289653759,NL
-289653760,289669119,GB
+289653760,289657855,GB
+289657856,289658879,AE
+289658880,289669119,GB
 289669120,289734655,FR
 289734656,289746943,GB
 289746944,289748991,US
@@ -1570,10 +1597,23 @@
 387055616,387121151,PR
 387121152,387825663,US
 387825664,387833855,CA
-387833856,391110655,US
+387833856,390733823,US
+390733824,390737919,NL
+390737920,390746111,US
+390746112,390758399,NL
+390758400,390770687,US
+390770688,390778879,NL
+390778880,390946815,US
+390946816,390955007,NL
+390955008,390995967,US
+390995968,391020543,NL
+391020544,391081983,US
+391081984,391086079,NL
+391086080,391110655,US
 391110656,391110911,IL
 391110912,391111167,GB
-391111168,391872511,US
+391111168,391114751,NL
+391114752,391872511,US
 391872512,391888895,CA
 391888896,391897087,US
 391905280,391938047,US
@@ -1583,38 +1623,19 @@
 400760832,400769023,CA
 400769024,400805887,US
 400805888,400809983,CA
-400809984,400883711,US
-400883712,400883799,CA
-400883800,400883807,US
-400883808,400883855,CA
-400883856,400883871,US
-400883872,400884255,CA
-400884256,400884287,US
-400884288,400888063,CA
-400888064,400888319,US
-400888320,400895231,CA
-400895232,400895295,US
-400895296,400895487,CA
-400895488,400895551,US
-400895552,400895999,CA
-400896000,400896511,US
-400896512,400897023,CA
-400897024,400897279,US
-400897280,400900863,CA
-400900864,400901119,US
-400901120,400902431,CA
-400902432,400902463,US
-400902464,400906495,CA
-400906496,400906751,US
-400906752,400908287,CA
-400908288,401145855,US
+400809984,400911103,US
+400911104,400911359,PA
+400911360,400911615,AU
+400911616,400911871,CR
+400911872,400912127,US
+400912128,400912383,SG
+400912384,401145855,US
 401145856,401211391,CA
 401211392,401293311,US
 401293312,401297407,CA
 401297408,401342463,US
 401342464,401346559,BB
-401346560,401375231,US
-401408000,401547263,US
+401346560,401547263,US
 401547264,401555455,CA
 401555456,402128895,US
 402128896,402169855,CA
@@ -1632,8 +1653,8 @@
 402374656,402399231,US
 402399232,402403327,CA
 402403328,402415615,US
-402415616,402419711,CA
-402419712,405012479,US
+402415616,402417663,CA
+402417664,405012479,US
 405012480,405143551,CA
 405143552,405180415,US
 405180416,405184511,CA
@@ -1648,7 +1669,7 @@
 405864448,405921791,US
 405921792,405929983,CA
 405929984,405938175,US
-405946368,405962751,CA
+405938176,405962751,CA
 405962752,405970943,US
 405979136,405995519,PR
 406003712,406011903,US
@@ -2059,9 +2080,7 @@
 520491392,520491647,IT
 520491648,520491775,IS
 520491776,520492031,IE
-520492032,520492543,GB
-520492544,520492799,IT
-520492800,520493055,GB
+520492032,520493055,GB
 520493056,520494079,IT
 520494080,520494335,FR
 520494336,520494591,IT
@@ -2140,8 +2159,7 @@
 520986624,520988671,PS
 520988672,520990719,DE
 520990720,520992767,RU
-520994816,521010175,BG
-521010176,521011199,DE
+520994816,521011199,BG
 521011200,521057279,RO
 521057280,521058303,MD
 521058304,521076735,RO
@@ -2570,13 +2588,13 @@
 531429408,531429415,IT
 531429416,531429599,GB
 531429600,531429607,IT
-531429608,531430079,GB
+531429608,531429679,GB
+531429680,531429687,IT
+531429688,531430079,GB
 531430080,531430087,IT
 531430088,531430319,GB
 531430320,531430327,IT
-531430328,531430519,GB
-531430520,531430527,IT
-531430528,531430663,GB
+531430328,531430663,GB
 531430664,531430671,IT
 531430672,531430823,GB
 531430824,531430831,IT
@@ -2660,7 +2678,10 @@
 532348928,532365311,PL
 532365312,532365567,LU
 532365568,532365823,NL
-532365824,532373503,DE
+532365824,532366079,DE
+532366080,532366335,NL
+532366336,532371455,DE
+532371456,532373503,NL
 532373504,532375551,RU
 532375552,532377599,IT
 532377600,532381695,DE
@@ -2714,7 +2735,7 @@
 533256192,533262335,RU
 533262336,533264383,ES
 533264384,533266431,RU
-533266432,533331967,FR
+533266432,533331967,NL
 533331968,533397503,UA
 533397504,533463039,KW
 533463040,533479423,RU
@@ -2724,7 +2745,9 @@
 533485568,533487615,LU
 533487616,533491711,RU
 533491712,533495807,DE
-533495808,533503999,NL
+533495808,533500159,NL
+533500160,533500415,JP
+533500416,533503999,NL
 533504000,533512191,RU
 533512192,533528575,ME
 533528576,533594111,GB
@@ -2874,9 +2897,7 @@
 534761472,534765567,BA
 534765568,534767615,UA
 534767616,534769663,HU
-534769664,534770687,NG
-534770688,534771967,IT
-534771968,534773759,NG
+534769664,534773759,IT
 534773760,536870911,DE
 536870912,539623423,US
 539623424,539624577,NL
@@ -3287,7 +3308,9 @@
 623808512,623810559,RU
 623810560,623812607,ES
 623812608,623820799,SE
-623820800,623822847,NL
+623820800,623821823,NL
+623821824,623822335,US
+623822336,623822847,NL
 623822848,623824895,GB
 623824896,623826943,CZ
 623826944,623837183,UA
@@ -3357,9 +3380,7 @@
 624579496,624579499,US
 624579500,624579527,NL
 624579528,624579531,US
-624579532,624579535,NL
-624579536,624579543,GB
-624579544,624579623,NL
+624579532,624579623,NL
 624579624,624579627,US
 624579628,624580132,NL
 624580133,624580133,GB
@@ -3861,7 +3882,7 @@
 634517504,634519551,LB
 634519552,634650623,QA
 634650624,634912767,BY
-634912768,635043839,RO
+634912768,635043839,SA
 635043840,635076607,ES
 635076608,635092991,KG
 635092992,635097087,CY
@@ -3886,9 +3907,7 @@
 635199664,635199671,IT
 635199672,635199775,GB
 635199776,635199783,IT
-635199784,635200047,GB
-635200048,635200055,IT
-635200056,635200167,GB
+635199784,635200167,GB
 635200168,635200175,IT
 635200176,635200199,GB
 635200200,635200207,IT
@@ -3904,15 +3923,15 @@
 635200432,635200439,IT
 635200440,635200631,GB
 635200632,635200639,IT
-635200640,635200903,GB
+635200640,635200727,GB
+635200728,635200735,IT
+635200736,635200903,GB
 635200904,635200911,IT
 635200912,635200959,GB
 635200960,635200967,IT
 635200968,635200991,GB
 635200992,635200999,IT
-635201000,635201071,GB
-635201072,635201079,IT
-635201080,635201087,GB
+635201000,635201087,GB
 635201088,635201095,IT
 635201096,635201159,GB
 635201160,635201167,IT
@@ -3932,7 +3951,7 @@
 635273216,635281407,UA
 635281408,635283455,RO
 635283456,635284479,DE
-635284480,635284991,RO
+635284480,635284991,A1
 635284992,635285503,US
 635285504,635287551,ME
 635287552,635289599,RU
@@ -4016,7 +4035,10 @@
 636968192,636968447,ES
 636968448,636968703,BE
 636968704,636968959,DE
-636968960,636975103,TR
+636968960,636974079,TR
+636974080,636974591,GB
+636974592,636974847,NL
+636974848,636975103,TR
 636975104,636977151,ES
 636977152,637140991,PL
 637140992,637206527,SE
@@ -4415,7 +4437,7 @@
 692975616,692977663,EG
 692977664,692978687,TZ
 692978688,692979711,ZA
-692979712,692980735,NG
+692979712,692981759,NG
 692981760,692982783,AO
 692982784,692983807,EG
 692983808,692984831,KE
@@ -4439,6 +4461,7 @@
 693005312,693006335,SD
 693006336,693007359,ZM
 693007360,693008383,NE
+693008384,693009407,CF
 693009408,693010431,GH
 693010432,693011455,ZA
 693011456,693012479,SZ
@@ -4484,6 +4507,7 @@
 693059584,693060607,NG
 693060608,693061631,TZ
 693061632,693064703,ZA
+693064704,693065727,GH
 693065728,693066751,MW
 693066752,693067775,ZA
 693067776,693068799,GH
@@ -4707,9 +4731,9 @@
 701153280,701161471,CM
 701161472,701169663,UG
 701169664,701186047,ZA
-701186048,701190136,NG
-701190137,701190137,BJ
-701190138,701202431,NG
+701186048,701189887,NG
+701189888,701190143,BJ
+701190144,701202431,NG
 701202432,701210623,NE
 701210624,701214719,ZA
 701214720,701218815,LS
@@ -4736,7 +4760,9 @@
 701366272,701374463,NG
 701374464,701382655,KE
 701382656,701390847,CI
-701390848,701399039,MU
+701390848,701392127,MU
+701392128,701392383,TZ
+701392384,701399039,MU
 701399040,701407231,EG
 701407232,701423615,ZA
 701423616,701431807,NG
@@ -4841,7 +4867,9 @@
 702291968,702296063,MZ
 702296064,702300159,GH
 702300160,702304255,NG
-702304256,702308351,SL
+702304256,702304327,SL
+702304328,702304335,NG
+702304336,702308351,SL
 702308352,702312447,SC
 702312448,702316543,KE
 702316544,702320639,TZ
@@ -4874,7 +4902,7 @@
 702427136,702429183,ZA
 702429184,702431231,TZ
 702431232,702433279,NG
-702433280,702434303,SD
+702433280,702434303,SS
 702434304,702435327,NG
 702435328,702437375,SL
 702437376,702439423,TZ
@@ -4909,6 +4937,7 @@
 702478336,702480383,AO
 702481408,702482431,TZ
 702482432,702483455,ZA
+702483456,702484479,BI
 702484480,702485503,TZ
 702485504,702486527,EG
 702486528,702487551,ZA
@@ -4976,17 +5005,23 @@
 703070208,703594495,EG
 703594496,703726591,ZA
 703726592,703727615,KE
-703727616,703729663,ZA
-703729664,703732735,LY
+703727616,703728127,TZ
+703728128,703728639,ZA
+703728640,703732735,LY
 703732736,703732991,ZA
 703732992,703733759,LY
-703733760,703737855,ZA
+703733760,703734527,CM
+703734528,703735039,ZA
+703735040,703735807,CM
+703735808,703737855,ZA
 703737856,703746047,NG
 703746048,703747071,ZA
 703747072,703748095,CD
 703748096,703748351,ZA
 703748352,703748863,GN
-703748864,703751167,ZA
+703748864,703749119,ZA
+703749120,703750143,NG
+703750144,703751167,ZA
 703751168,703751679,MG
 703751680,703752191,ZA
 703752192,703752447,MG
@@ -4995,7 +5030,8 @@
 703753216,703753727,ZA
 703753728,703754239,MG
 703754240,703755263,GH
-703755264,703758335,ZA
+703755264,703757311,ZA
+703757312,703758335,RE
 703758336,703758591,CD
 703758592,703758847,ZA
 703758848,703759103,CD
@@ -5083,7 +5119,9 @@
 772284416,772284927,RU
 772284928,772285183,UA
 772285184,772285439,UZ
-772285440,772296703,RU
+772285440,772285695,RU
+772285696,772285951,GR
+772285952,772296703,RU
 772296704,772300799,UA
 772300800,772341759,RU
 772341760,772407295,NO
@@ -5344,9 +5382,7 @@
 773646336,773648383,TR
 773648384,773650431,PL
 773650432,773652479,GB
-773652480,773652991,SK
-773652992,773653247,TR
-773653248,773653503,SK
+773652480,773653503,SK
 773653504,773654527,TR
 773654528,773656575,RU
 773656576,773658623,PL
@@ -5466,7 +5502,9 @@
 773963776,773971967,ME
 773971968,773980159,UA
 773980160,773988351,GB
-773988352,774001663,ES
+773988352,774000823,ES
+774000824,774000824,GB
+774000825,774001663,ES
 774001664,774002687,NL
 774002688,774002815,ES
 774002816,774002842,NL
@@ -5614,7 +5652,7 @@
 774161825,774161834,PF
 774161835,774161844,SB
 774161845,774161854,VU
-774161855,774161864,CW
+774161855,774161864,MX
 774161865,774161869,AR
 774161870,774161874,ES
 774161875,774161879,GE
@@ -5693,8 +5731,7 @@
 774162327,774162336,CV
 774162337,774162346,AZ
 774162347,774162366,US
-774162367,774162375,VA
-774162376,774162376,MX
+774162367,774162376,MX
 774162377,774162386,GB
 774162387,774162387,ZW
 774162388,774162395,DE
@@ -5705,21 +5742,21 @@
 774162427,774162432,VA
 774162433,774162442,GB
 774162443,774162452,BA
-774162453,774162462,WS
+774162453,774162462,BO
 774162463,774162472,SR
-774162473,774162482,PT
+774162473,774162482,IT
 774162483,774162492,CK
-774162493,774162502,KI
+774162493,774162502,IT
 774162503,774162512,NU
-774162513,774162522,TO
-774162523,774162532,CL
+774162513,774162522,BO
+774162523,774162532,DE
 774162533,774162542,TF
 774162543,774162552,GG
-774162553,774162562,LR
+774162553,774162562,MX
 774162563,774162572,MQ
 774162573,774162582,YT
 774162583,774162592,NC
-774162593,774162602,NG
+774162593,774162602,CA
 774162603,774162622,US
 774162623,774162627,MX
 774162628,774162637,GB
@@ -5764,7 +5801,8 @@
 774162929,774162933,NR
 774162934,774162938,GS
 774162939,774162942,UM
-774162943,774162964,VA
+774162943,774162944,VA
+774162945,774162964,IT
 774162965,774162966,MX
 774162967,774162967,LI
 774162968,774162969,MX
@@ -5781,13 +5819,17 @@
 774163001,774163009,BO
 774163010,774163010,VE
 774163011,774163014,BO
-774163015,774163071,VA
+774163015,774163024,RU
+774163025,774163034,UA
+774163035,774163071,VA
 774163072,774163079,GW
 774163080,774163087,LS
-774163088,774163103,ML
-774163104,774163111,PW
-774163112,774163119,SL
-774163120,774163134,TJ
+774163088,774163094,ML
+774163095,774163104,IT
+774163105,774163111,PW
+774163112,774163114,SL
+774163115,774163124,IT
+774163125,774163134,TJ
 774163135,774163139,TG
 774163140,774163144,AS
 774163145,774163149,BD
@@ -5942,7 +5984,9 @@
 778371072,778436607,RU
 778436608,778476031,RO
 778476032,778476287,MD
-778476288,778498047,RO
+778476288,778493951,RO
+778493952,778495999,NL
+778496000,778498047,RO
 778498048,778500095,NL
 778500096,778502143,RO
 778502144,778567679,GR
@@ -6561,7 +6605,9 @@
 787709952,787724287,RU
 787724288,787726335,UA
 787726336,787742719,RU
-787742720,787775487,NL
+787742720,787759103,NL
+787759104,787763199,PS
+787763200,787775487,NL
 787775488,787808255,DE
 787808256,787841023,IR
 787841024,787843071,RU
@@ -6670,11 +6716,7 @@
 788451328,788453375,FI
 788453376,788455423,RU
 788455424,788457471,FR
-788457472,788457727,NG
-788457728,788458239,IT
-788458240,788458495,NG
-788458496,788458751,IT
-788458752,788459519,NG
+788457472,788459519,IT
 788459520,788461567,RU
 788461568,788462335,JE
 788462336,788462591,GB
@@ -6865,7 +6907,9 @@
 838996992,838997247,CA
 838997248,839027967,US
 839027968,839030015,IN
-839030016,839062271,US
+839030016,839056447,US
+839056448,839056455,CN
+839056456,839062271,US
 839062272,839064063,CA
 839064064,839069183,US
 839069184,839071231,CA
@@ -6911,7 +6955,9 @@
 846546944,846547199,A1
 846547200,846561279,US
 846561280,846594047,CA
-846594048,855638015,US
+846594048,846626815,US
+846626816,846627071,CN
+846627072,855638015,US
 855638016,872415231,GB
 872415232,880877567,US
 880877568,880878079,EU
@@ -6952,28 +6998,41 @@
 922746880,956301311,US
 956301312,959447039,EU
 959447040,959512575,US
-959512576,960629507,EU
-960629508,960629508,GB
-960629509,960640769,EU
-960640770,960640770,GB
-960640771,960643365,EU
-960643366,960643367,GB
-960643368,960652799,EU
-960652800,960653055,GB
-960653056,960656895,EU
-960656896,960657023,GB
-960657024,960671743,EU
-960671744,960671999,DE
-960672000,960676607,EU
+959512576,960626687,EU
+960626688,960641023,GB
+960641024,960641279,EU
+960641280,960643330,GB
+960643331,960643331,EU
+960643332,960644351,GB
+960644352,960644863,EU
+960644864,960646399,GB
+960646400,960646911,EU
+960646912,960654335,GB
+960654336,960654591,EU
+960654592,960659455,GB
+960659456,960662015,DE
+960662016,960662271,EU
+960662272,960662783,DE
+960662784,960663039,EU
+960663040,960671487,DE
+960671488,960671743,EU
+960671744,960676607,DE
 960676608,960676863,PL
-960676864,960692223,EU
+960676864,960692223,DE
 960692224,960724991,FR
 960724992,960726783,EU
 960726784,960727039,ZA
 960727040,960727295,US
 960727296,960729343,EU
 960729344,960729599,ZA
-960729600,960741375,EU
+960729600,960733183,EU
+960733184,960733439,BE
+960733440,960733695,EU
+960733696,960733951,BE
+960733952,960734463,EU
+960734464,960737535,BE
+960737536,960737791,EU
+960737792,960741375,BE
 960741376,960749567,NL
 960749568,960757759,LU
 960757760,960888831,US
@@ -7500,9 +7559,7 @@
 1041701824,1041701831,FR
 1041701832,1041703479,GB
 1041703480,1041703487,FR
-1041703488,1041703543,GB
-1041703544,1041703551,FR
-1041703552,1041703631,GB
+1041703488,1041703631,GB
 1041703632,1041703639,FR
 1041703640,1041704415,GB
 1041704416,1041704423,FR
@@ -7800,7 +7857,9 @@
 1045037056,1045118975,GR
 1045118976,1045119231,US
 1045119232,1045135359,GR
-1045135360,1045168127,DE
+1045135360,1045136065,DE
+1045136066,1045136066,UA
+1045136067,1045168127,DE
 1045168128,1045233663,RU
 1045233664,1045241855,GB
 1045241856,1045250047,IT
@@ -7935,9 +7994,7 @@
 1046504448,1046508543,DE
 1046508544,1046511615,GB
 1046511616,1046515711,DE
-1046515712,1046519247,GB
-1046519248,1046519255,DE
-1046519256,1046525351,GB
+1046515712,1046525351,GB
 1046525352,1046525359,DE
 1046525360,1046525439,GB
 1046525440,1046525695,DE
@@ -8270,7 +8327,9 @@
 1052003584,1052003839,DE
 1052003840,1052011263,EU
 1052011264,1052012031,DE
-1052012032,1052045311,EU
+1052012032,1052017535,EU
+1052017536,1052017567,DE
+1052017568,1052045311,EU
 1052045312,1052046079,DE
 1052046080,1052049407,EU
 1052049408,1052057599,PL
@@ -8820,7 +8879,9 @@
 1062530048,1062531071,EC
 1062531072,1063053311,US
 1063053312,1063053375,CA
-1063053376,1063567359,US
+1063053376,1063057432,US
+1063057433,1063057433,CA
+1063057434,1063567359,US
 1063567360,1063575551,A2
 1063575552,1063727615,US
 1063727616,1063728127,GU
@@ -9070,12 +9131,15 @@
 1073026304,1073026559,DO
 1073026560,1073027071,PR
 1073027072,1073028095,NI
-1073028096,1073029119,US
+1073028096,1073028607,US
+1073028608,1073029119,GD
 1073029120,1073031167,PR
 1073031168,1073033215,US
 1073033216,1073035263,CW
 1073035264,1073036032,GD
-1073036033,1073039359,US
+1073036033,1073037823,US
+1073037824,1073038335,GD
+1073038336,1073039359,US
 1073039360,1073041407,GT
 1073041408,1073042431,CO
 1073042432,1073044735,US
@@ -9348,7 +9412,9 @@
 1079405440,1079405567,US
 1079405568,1079407103,CA
 1079407104,1079407359,US
-1079407360,1079413311,CA
+1079407360,1079411711,CA
+1079411712,1079411743,US
+1079411744,1079413311,CA
 1079413312,1079413343,US
 1079413344,1079415295,CA
 1079415296,1079415807,US
@@ -9437,7 +9503,9 @@
 1081445376,1081446399,CL
 1081446400,1081460735,US
 1081460736,1081462783,PA
-1081462784,1081479167,US
+1081462784,1081462856,US
+1081462857,1081462857,BR
+1081462858,1081479167,US
 1081479168,1081483263,CA
 1081483264,1081487359,US
 1081487360,1081488383,A2
@@ -9924,7 +9992,9 @@
 1110855680,1110856703,CN
 1110856704,1110857727,IN
 1110857728,1110858751,SG
-1110858752,1110863871,US
+1110858752,1110859007,US
+1110859008,1110859263,AU
+1110859264,1110863871,US
 1110863872,1110867967,JM
 1110867968,1110929407,US
 1110929408,1110933503,BM
@@ -10124,7 +10194,9 @@
 1120310016,1120310271,PH
 1120310272,1120312063,CA
 1120312064,1120312319,PH
-1120312320,1120321535,CA
+1120312320,1120317815,CA
+1120317816,1120317823,US
+1120317824,1120321535,CA
 1120321536,1120346111,US
 1120346112,1120350207,CA
 1120350208,1120373759,US
@@ -10497,7 +10569,7 @@
 1152116736,1152116991,US
 1152116992,1152117247,CA
 1152117248,1152117759,US
-1152117760,1152118015,ID
+1152117760,1152118015,IL
 1152118016,1152581631,US
 1152581632,1152614399,CA
 1152614400,1152778239,US
@@ -10508,9 +10580,11 @@
 1156263936,1156265983,CA
 1156265984,1156296703,US
 1156296704,1156300799,CA
-1156300800,1157910527,US
-1157910528,1157914623,CA
-1157914624,1157931007,US
+1156300800,1157912703,US
+1157912704,1157912831,CA
+1157912832,1157913215,US
+1157913216,1157913279,CA
+1157913280,1157931007,US
 1157931008,1157935103,BS
 1157935104,1157943295,US
 1157943296,1157947391,CA
@@ -11070,7 +11144,9 @@
 1209917440,1209925631,CA
 1209925632,1210253311,US
 1210253312,1210261503,CA
-1210261504,1210449919,US
+1210261504,1210420223,US
+1210420224,1210420479,IT
+1210420480,1210449919,US
 1210449920,1210580991,CA
 1210580992,1210925055,US
 1210925056,1210941439,CA
@@ -11205,6 +11281,7 @@
 1248939008,1248946175,US
 1248946176,1248947199,VG
 1248947200,1248956415,US
+1248956416,1248957439,CA
 1248957440,1248958463,US
 1248958464,1248959487,CA
 1248959488,1248964607,US
@@ -11279,7 +11356,9 @@
 1249335296,1249337343,CA
 1249337344,1249359871,US
 1249359872,1249361919,CA
-1249361920,1249384447,US
+1249361920,1249379327,US
+1249379328,1249380351,CA
+1249380352,1249384447,US
 1249384448,1249386495,PR
 1249386496,1249391615,US
 1249391616,1249392639,CA
@@ -11331,7 +11410,8 @@
 1249720320,1249720367,AU
 1249720368,1249720383,SG
 1249720384,1249720575,AU
-1249720576,1249720599,GB
+1249720576,1249720591,FR
+1249720592,1249720599,GB
 1249720600,1249720607,IT
 1249720608,1249720831,GB
 1249720832,1249721120,US
@@ -11787,7 +11867,9 @@
 1297072128,1297088511,PL
 1297088512,1297121279,AT
 1297121280,1297154047,SE
-1297154048,1297215487,RO
+1297154048,1297178623,RO
+1297178624,1297178879,NL
+1297178880,1297215487,RO
 1297215488,1297217535,NL
 1297217536,1297219583,RO
 1297219584,1297285119,RU
@@ -11833,7 +11915,8 @@
 1297727488,1297743871,MD
 1297743872,1297760255,DE
 1297760256,1297776639,LT
-1297776640,1297793023,DE
+1297776640,1297782783,DE
+1297782784,1297793023,US
 1297793024,1297809407,UA
 1297809408,1297825791,PL
 1297825792,1297842175,RU
@@ -12143,7 +12226,6 @@
 1307774976,1307779071,RS
 1307779072,1307787263,DK
 1307787264,1307791359,MT
-1307791360,1307795455,KZ
 1307795456,1307803647,RU
 1307803648,1307807743,DK
 1307807744,1307811839,SE
@@ -12608,9 +12690,7 @@
 1318797312,1318805503,SY
 1318805504,1318813695,PL
 1318813696,1318821887,FR
-1318821888,1318834175,RU
-1318834176,1318836223,FR
-1318836224,1318838271,RU
+1318821888,1318838271,RU
 1318838272,1318841078,IE
 1318841079,1318841079,GB
 1318841080,1318846463,IE
@@ -12910,7 +12990,6 @@
 1334738944,1334743039,CH
 1334743040,1334747135,CZ
 1334747136,1334751231,RU
-1334751232,1334755327,BH
 1334755328,1334759423,UA
 1334759424,1334763519,SE
 1334763520,1334767615,DK
@@ -14014,7 +14093,8 @@
 1357324288,1357325311,GB
 1357325312,1357327359,EU
 1357327360,1357328383,DE
-1357328384,1357335807,EU
+1357328384,1357328639,GB
+1357328640,1357335807,EU
 1357335808,1357336063,IT
 1357336064,1357340671,EU
 1357340672,1357341695,GB
@@ -14047,7 +14127,9 @@
 1357371392,1357371647,GB
 1357371648,1357372159,EU
 1357372160,1357372927,GB
-1357372928,1357381631,EU
+1357372928,1357373487,EU
+1357373488,1357373503,GB
+1357373504,1357381631,EU
 1357381632,1357414399,NO
 1357414400,1357447167,LV
 1357447168,1357479935,IE
@@ -14148,9 +14230,7 @@
 1357985016,1357985023,IT
 1357985024,1357985575,GB
 1357985576,1357985583,IT
-1357985584,1357985743,GB
-1357985744,1357985751,IT
-1357985752,1357985791,GB
+1357985584,1357985791,GB
 1357985792,1357987839,DE
 1357987840,1357989631,GB
 1357989632,1357989887,FR
@@ -14314,7 +14394,9 @@
 1358670944,1358670951,FR
 1358670952,1358670975,GB
 1358670976,1358670991,PT
-1358670992,1358675967,GB
+1358670992,1358671935,GB
+1358671936,1358671943,PT
+1358671944,1358675967,GB
 1358675968,1358676991,SE
 1358676992,1358677759,DK
 1358677760,1358679295,SE
@@ -14751,7 +14833,9 @@
 1364525312,1364525567,A2
 1364525568,1364526591,NL
 1364526592,1364528639,GB
-1364528640,1364541439,NL
+1364528640,1364529663,NL
+1364529664,1364530175,GB
+1364530176,1364541439,NL
 1364541440,1364545535,SE
 1364545536,1364579839,NL
 1364579840,1364580095,US
@@ -14953,8 +15037,8 @@
 1370182144,1370182911,NL
 1370182912,1370183167,US
 1370183168,1370185983,NL
-1370185984,1370186495,US
-1370186496,1370188799,NL
+1370185984,1370186239,GB
+1370186240,1370188799,NL
 1370188800,1370189055,US
 1370189056,1370189311,NL
 1370189312,1370189567,US
@@ -15057,8 +15141,8 @@
 1372696008,1372697343,EU
 1372697344,1372697599,DE
 1372697600,1372698879,EU
-1372698880,1372699391,DE
-1372699392,1372699903,EU
+1372698880,1372699647,DE
+1372699648,1372699903,EU
 1372699904,1372700159,DE
 1372700160,1372702719,EU
 1372702720,1372703231,DE
@@ -15345,12 +15429,13 @@
 1383596032,1384120319,FR
 1384120320,1384153087,NG
 1384153088,1384185855,FI
-1384185856,1384190975,DE
+1384185856,1384190975,EU
 1384190976,1384191231,DK
-1384191232,1384196095,DE
+1384191232,1384196095,EU
 1384196096,1384197119,CZ
-1384197120,1384202239,DE
-1384202240,1384218623,GB
+1384197120,1384204287,EU
+1384204288,1384206335,ES
+1384206336,1384218623,EU
 1384218624,1384251391,EG
 1384251392,1384267775,FI
 1384267776,1384284159,CH
@@ -15501,14 +15586,7 @@
 1388347392,1388363775,DK
 1388363776,1388371967,DE
 1388371968,1388380159,CH
-1388380160,1388388351,IT
-1388388352,1388389151,NG
-1388389152,1388389167,IT
-1388389168,1388390143,NG
-1388390144,1388390167,IT
-1388390168,1388394495,NG
-1388394496,1388395519,IT
-1388395520,1388396543,NG
+1388380160,1388396543,IT
 1388396544,1388404735,LV
 1388404736,1388412927,UA
 1388412928,1388421119,RU
@@ -16158,8 +16236,8 @@
 1404232704,1404233215,EE
 1404233216,1404234239,SE
 1404234240,1404234751,EE
-1404234752,1404235775,HR
-1404235776,1404240895,SE
+1404234752,1404239871,HR
+1404239872,1404240895,SE
 1404240896,1404241663,EE
 1404241664,1404241919,SE
 1404241920,1404242394,EE
@@ -16198,7 +16276,23 @@
 1404386048,1404387327,SE
 1404387328,1404420095,LT
 1404420096,1404436479,RU
-1404436480,1404522495,SE
+1404436480,1404502527,SE
+1404502528,1404502783,EE
+1404502784,1404507391,SE
+1404507392,1404507453,EE
+1404507454,1404507454,SE
+1404507455,1404507647,EE
+1404507648,1404507903,SE
+1404507904,1404507975,EE
+1404507976,1404507976,SE
+1404507977,1404508415,EE
+1404508416,1404509951,SE
+1404509952,1404510207,EE
+1404510208,1404515583,SE
+1404515584,1404515839,HR
+1404515840,1404517375,SE
+1404517376,1404517631,HR
+1404517632,1404522495,SE
 1404522496,1404526591,LV
 1404526592,1404538879,SE
 1404538880,1404542975,LV
@@ -16211,7 +16305,8 @@
 1404645376,1404645887,EE
 1404645888,1404677888,SE
 1404677889,1404678143,EE
-1404678144,1404764159,SE
+1404678144,1404680191,HR
+1404680192,1404764159,SE
 1404764160,1404780543,NL
 1404780544,1404796927,SE
 1404796928,1404801023,EE
@@ -16231,8 +16326,12 @@
 1404872704,1404874751,SE
 1404874752,1404875775,LV
 1404875776,1404876799,EE
-1404876800,1404895231,SE
-1404895232,1404927999,NL
+1404876800,1404887039,SE
+1404887040,1404887295,NL
+1404887296,1404887551,SE
+1404887552,1404893951,NL
+1404893952,1404894207,SE
+1404894208,1404927999,NL
 1404928000,1404944383,SE
 1404944384,1404960767,LT
 1404960768,1405026303,SE
@@ -16280,7 +16379,9 @@
 1406708736,1406709759,A2
 1406709760,1406713855,IT
 1406713856,1406717951,AT
-1406717952,1406719487,GB
+1406717952,1406718975,GB
+1406718976,1406719103,AT
+1406719104,1406719487,GB
 1406719488,1406719743,AT
 1406719744,1406719999,GB
 1406720000,1406721023,AT
@@ -16486,7 +16587,9 @@
 1410351104,1410359295,CH
 1410359296,1410367487,CZ
 1410367488,1410375679,RU
-1410375680,1410383871,DK
+1410375680,1410378015,DK
+1410378016,1410378031,NR
+1410378032,1410383871,DK
 1410383872,1410392063,NO
 1410392064,1410400255,DE
 1410400256,1410408447,RU
@@ -16774,8 +16877,7 @@
 1425080320,1425096703,IR
 1425096704,1425113087,CH
 1425113088,1425145855,NL
-1425145856,1425158143,RU
-1425158144,1425162239,UA
+1425145856,1425162239,RU
 1425162240,1425178623,CZ
 1425178624,1425195007,BG
 1425195008,1425211391,RU
@@ -16904,7 +17006,9 @@
 1427668992,1427701759,SE
 1427701760,1427739889,DE
 1427739890,1427739890,RU
-1427739891,1427767295,DE
+1427739891,1427741372,DE
+1427741373,1427741373,AT
+1427741374,1427767295,DE
 1427767296,1427800063,BE
 1427800064,1427832831,RU
 1427832832,1427865599,BE
@@ -17325,8 +17429,7 @@
 1439518720,1439527935,DE
 1439527936,1439528959,GB
 1439528960,1439529471,DE
-1439529472,1439529727,GB
-1439529728,1439529983,DE
+1439529472,1439529983,GB
 1439529984,1439530239,EG
 1439530240,1439534079,DE
 1439534080,1439535103,GB
@@ -17667,13 +17770,12 @@
 1467465792,1467465799,NL
 1467465800,1467465983,DE
 1467465984,1467466015,NL
-1467466016,1467473919,DE
+1467466016,1467466495,DE
+1467466496,1467466751,NL
+1467466752,1467472895,DE
+1467472896,1467473919,NL
 1467473920,1467482111,RU
-1467482112,1467558911,BG
-1467558912,1467559935,US
-1467559936,1467572223,BG
-1467572224,1467573247,DE
-1467573248,1467613183,BG
+1467482112,1467613183,BG
 1467613184,1467744255,DE
 1467744256,1467875327,GB
 1467875328,1467940863,BG
@@ -17878,15 +17980,9 @@
 1475706880,1475723263,RU
 1475723264,1475726079,GB
 1475726080,1475726335,RU
-1475726336,1475727807,GB
-1475727808,1475727871,FI
-1475727872,1475729151,GB
-1475729152,1475729215,AT
-1475729216,1475729663,GB
+1475726336,1475729663,GB
 1475729664,1475729671,UA
-1475729672,1475729919,GB
-1475729920,1475731455,UA
-1475731456,1475738111,GB
+1475729672,1475738111,GB
 1475738112,1475738879,RU
 1475738880,1475739647,GB
 1475739648,1475756031,BG
@@ -18148,11 +18244,10 @@
 1489534976,1489567743,RU
 1489567744,1489600511,BH
 1489600512,1489633279,RU
-1489633280,1489635327,IT
-1489635328,1489639423,EU
-1489639424,1489640447,IT
-1489640448,1489642751,EU
-1489642752,1489643519,IT
+1489633280,1489634303,FR
+1489634304,1489635327,IT
+1489635328,1489642751,EU
+1489642752,1489643519,FR
 1489643520,1489644543,EU
 1489644544,1489644799,IQ
 1489644800,1489646335,EU
@@ -18170,7 +18265,9 @@
 1489653760,1489657855,EU
 1489657856,1489659903,IT
 1489659904,1489666047,EU
-1489666048,1489698815,GB
+1489666048,1489674239,GB
+1489674240,1489676287,NL
+1489676288,1489698815,GB
 1489698816,1489731583,MT
 1489731584,1489764351,BG
 1489764352,1489797119,RU
@@ -18762,7 +18859,11 @@
 1503902224,1503902335,DE
 1503902336,1503902399,BE
 1503902400,1503902407,RO
-1503902408,1503920127,DE
+1503902408,1503903687,DE
+1503903688,1503903695,IT
+1503903696,1503903711,DE
+1503903712,1503903719,IT
+1503903720,1503920127,DE
 1503920128,1503985663,HR
 1503985664,1504018431,IR
 1504018432,1504051199,RO
@@ -19414,7 +19515,11 @@
 1519300608,1519304703,LT
 1519304704,1519321087,SE
 1519321088,1519386623,RU
-1519386624,1519452159,SE
+1519386624,1519394815,SE
+1519394816,1519398911,HR
+1519398912,1519403007,SE
+1519403008,1519411199,NL
+1519411200,1519452159,SE
 1519452160,1519517695,NL
 1519517696,1519583231,AT
 1519583232,1519648767,IT
@@ -21555,7 +21660,8 @@
 1540442368,1540442623,GB
 1540442624,1540442879,IE
 1540442880,1540443135,AT
-1540443136,1540443647,RU
+1540443136,1540443391,RU
+1540443392,1540443647,CZ
 1540443648,1540443903,FR
 1540443904,1540444159,GB
 1540444160,1540444415,RU
@@ -21785,7 +21891,7 @@
 1540598784,1540600831,UA
 1540600832,1540602879,RU
 1540602880,1540603903,BG
-1540603904,1540605951,RU
+1540603904,1540604927,RU
 1540605952,1540606975,MD
 1540606976,1540607999,UA
 1540608000,1540609023,RU
@@ -22268,7 +22374,6 @@
 1540764672,1540765695,PL
 1540765696,1540766719,RU
 1540766720,1540767743,IT
-1540767744,1540768767,GB
 1540768768,1540769791,RU
 1540769792,1540770815,IT
 1540770816,1540771839,RU
@@ -24061,10 +24166,9 @@
 1541779968,1541780479,DE
 1541780480,1541780735,ES
 1541780736,1541780991,GB
-1541780992,1541781503,RO
+1541781248,1541781503,RO
 1541781504,1541781759,TR
 1541781760,1541782015,RU
-1541782016,1541782271,RO
 1541782272,1541782527,GB
 1541782528,1541783551,RU
 1541783552,1541783807,IE
@@ -25075,7 +25179,8 @@
 1542377984,1542378495,RU
 1542378496,1542378751,DK
 1542378752,1542379007,RU
-1542379008,1542379519,GB
+1542379008,1542379263,GB
+1542379264,1542379519,A1
 1542379520,1542379775,PL
 1542379776,1542380031,RU
 1542380032,1542380287,RO
@@ -25815,7 +25920,28 @@
 1548159488,1548159999,GB
 1548160000,1548160255,NL
 1548160256,1548160511,PL
-1548160512,1548222463,NL
+1548160512,1548169215,NL
+1548169216,1548171263,DE
+1548171264,1548172287,FR
+1548172288,1548173311,GB
+1548173312,1548174335,BE
+1548174336,1548174847,LU
+1548174848,1548175359,IE
+1548175360,1548175871,ES
+1548175872,1548176383,PT
+1548176384,1548176895,IT
+1548176896,1548177407,CH
+1548177408,1548177919,AT
+1548177920,1548178431,PL
+1548178432,1548178943,DK
+1548178944,1548179455,NO
+1548179456,1548179967,SE
+1548179968,1548180479,FI
+1548180480,1548180991,SK
+1548180992,1548181503,TR
+1548181504,1548182015,US
+1548182016,1548182527,HK
+1548182528,1548222463,NL
 1548222464,1548746751,DE
 1548746752,1549271039,RO
 1549271040,1549795327,FR
@@ -25946,8 +26072,8 @@
 1558052864,1558118399,DE
 1558118400,1558151167,AT
 1558151168,1558708223,DE
-1558708224,1559232511,GB
-1559232512,1559240703,IL
+1558708224,1559236607,GB
+1559236608,1559240703,IL
 1559240704,1559248895,BA
 1559248896,1559257087,LV
 1559257088,1559265279,UA
@@ -26050,8 +26176,7 @@
 1566158848,1566162943,RU
 1566162944,1566167039,PL
 1566167040,1566171135,UA
-1566171136,1566174463,CY
-1566174464,1566175231,TR
+1566171136,1566175231,CY
 1566175232,1566179327,IE
 1566179328,1566183423,DK
 1566183424,1566187519,ES
@@ -26107,7 +26232,7 @@
 1566359552,1566363647,RU
 1566363648,1566365695,GB
 1566365696,1566367743,RU
-1566369792,1566371839,ES
+1566367744,1566371839,ES
 1566371840,1566373887,IT
 1566373888,1566375935,RS
 1566375936,1566377983,DE
@@ -26332,13 +26457,9 @@
 1568276224,1568276479,MQ
 1568276480,1568309247,DE
 1568309248,1568342015,RO
-1568342016,1568349183,BG
-1568349184,1568350207,DE
-1568350208,1568362495,BG
+1568342016,1568362495,BG
 1568362496,1568363264,RO
-1568363265,1568363519,BG
-1568363520,1568364543,US
-1568364544,1568374783,BG
+1568363265,1568374783,BG
 1568374784,1568440319,RU
 1568440320,1568473087,NO
 1568473088,1568505855,BY
@@ -26394,7 +26515,9 @@
 1570656256,1570668543,SE
 1570668544,1570686975,RU
 1570686976,1570693119,NL
-1570693120,1570701311,RU
+1570693120,1570695167,RU
+1570695168,1570696191,PL
+1570696192,1570701311,RU
 1570701312,1570717695,PL
 1570717696,1570725887,HR
 1570725888,1570734079,DE
@@ -26416,7 +26539,9 @@
 1571424512,1571424767,AM
 1571424768,1571425148,CZ
 1571425149,1571425149,RU
-1571425150,1571425279,CZ
+1571425150,1571425231,CZ
+1571425232,1571425232,RU
+1571425233,1571425279,CZ
 1571425280,1571425535,RU
 1571425536,1571425791,NL
 1571425792,1571428607,CZ
@@ -26431,14 +26556,17 @@
 1571441792,1571441919,DE
 1571441920,1571442687,CZ
 1571442688,1571443199,UA
-1571443200,1571443455,CZ
+1571443200,1571443455,RU
 1571443456,1571443711,UA
 1571443712,1571444735,CZ
 1571444736,1571446783,NL
-1571446784,1571447295,CZ
+1571446784,1571447039,GB
+1571447040,1571447295,CZ
 1571447296,1571447807,RU
 1571447808,1571448831,CZ
-1571448832,1571450879,US
+1571448832,1571449343,NL
+1571449344,1571449855,CZ
+1571449856,1571450879,RU
 1571450880,1571451903,UA
 1571451904,1571453951,CZ
 1571453952,1571454975,GB
@@ -26478,7 +26606,8 @@
 1571535872,1571538943,RU
 1571538944,1571541247,CZ
 1571541248,1571541503,UA
-1571541504,1571543551,CZ
+1571541504,1571543039,CZ
+1571543040,1571543551,NL
 1571543552,1571543807,UA
 1571543808,1571544063,CZ
 1571544064,1571545343,RU
@@ -26572,9 +26701,7 @@
 1572028416,1572028927,GB
 1572028928,1572029183,UA
 1572029184,1572030463,GB
-1572030464,1572032511,RU
-1572032512,1572034559,GB
-1572034560,1572035583,RU
+1572030464,1572035583,RU
 1572035584,1572036607,GB
 1572036608,1572042751,RU
 1572042752,1572043263,GB
@@ -27320,7 +27447,8 @@
 1589223168,1589223423,US
 1589223424,1589247999,GB
 1589248000,1589256191,NO
-1589256192,1589264383,SE
+1589256192,1589258239,SE
+1589258240,1589264383,LV
 1589264384,1589280767,NL
 1589280768,1589313535,DE
 1589313536,1589346303,LB
@@ -27594,8 +27722,11 @@
 1596850176,1596866559,CZ
 1596866560,1596887039,RU
 1596887040,1596889087,UA
-1596889088,1596899327,CZ
-1596899328,1596907519,BY
+1596889088,1596890111,CZ
+1596890112,1596890623,RU
+1596890624,1596891135,CZ
+1596891136,1596900351,RU
+1596900352,1596907519,BY
 1596907520,1596915711,RU
 1596915712,1596942335,CZ
 1596942336,1596945407,UA
@@ -27620,12 +27751,16 @@
 1596956928,1596956963,DE
 1596956964,1596956964,RU
 1596956965,1596957183,DE
-1596957184,1596957439,UA
-1596957440,1596958207,CZ
+1596957184,1596957695,UA
+1596957696,1596958207,CZ
 1596958208,1596958463,RU
 1596958464,1596958719,UA
 1596958720,1596960767,RU
-1596960768,1596961279,CZ
+1596960768,1596960768,CZ
+1596960769,1596960769,RU
+1596960770,1596960994,CZ
+1596960995,1596960995,RU
+1596960996,1596961279,CZ
 1596961280,1596961791,SK
 1596961792,1596962815,RU
 1596962816,1596963327,AM
@@ -27634,7 +27769,8 @@
 1596964096,1596964607,CZ
 1596964608,1596965887,RU
 1596965888,1596966911,KG
-1596966912,1596967423,CZ
+1596966912,1596967167,RU
+1596967168,1596967423,CZ
 1596967424,1596967935,RU
 1596967936,1596968959,UA
 1596968960,1596973055,BA
@@ -27853,7 +27989,39 @@
 1602781184,1602813951,FR
 1602813952,1602846719,RU
 1602846720,1602879487,GE
-1602879488,1602896127,RE
+1602879488,1602879743,RE
+1602879744,1602879999,FR
+1602880000,1602880767,RE
+1602880768,1602881023,FR
+1602881024,1602881279,RE
+1602881280,1602881535,FR
+1602881536,1602881791,RE
+1602881792,1602882047,FR
+1602882048,1602882815,RE
+1602882816,1602883071,FR
+1602883072,1602883839,RE
+1602883840,1602884095,FR
+1602884096,1602884351,RE
+1602884352,1602884607,FR
+1602884608,1602884863,RE
+1602884864,1602885119,FR
+1602885120,1602886399,RE
+1602886400,1602886655,FR
+1602886656,1602887935,RE
+1602887936,1602888191,FR
+1602888192,1602888959,RE
+1602888960,1602889983,FR
+1602889984,1602890751,RE
+1602890752,1602891263,FR
+1602891264,1602891519,RE
+1602891520,1602891775,FR
+1602891776,1602892287,RE
+1602892288,1602892543,FR
+1602892544,1602892799,RE
+1602892800,1602893311,FR
+1602893312,1602895359,RE
+1602895360,1602895615,FR
+1602895616,1602896127,RE
 1602896128,1602896383,FR
 1602896384,1602896639,RE
 1602896640,1602896924,FR
@@ -28070,9 +28238,7 @@
 1605112848,1605112855,IT
 1605112856,1605113087,GB
 1605113088,1605113095,IT
-1605113096,1605113223,GB
-1605113224,1605113231,IT
-1605113232,1605113383,GB
+1605113096,1605113383,GB
 1605113384,1605113391,IT
 1605113392,1605113503,GB
 1605113504,1605113511,IT
@@ -28090,7 +28256,9 @@
 1605114960,1605114967,IT
 1605114968,1605115007,GB
 1605115008,1605115015,IT
-1605115016,1605115903,GB
+1605115016,1605115863,GB
+1605115864,1605115871,IT
+1605115872,1605115903,GB
 1605115904,1605124095,RU
 1605124096,1605125263,GB
 1605125264,1605125267,DE
@@ -28174,13 +28342,13 @@
 1607585792,1607598079,DK
 1607598080,1607598335,IT
 1607598336,1607598591,EU
-1607598592,1607606015,IT
+1607598592,1607601919,IT
+1607601920,1607602175,EU
+1607602176,1607606015,IT
 1607606016,1607606271,FR
 1607606272,1607608319,IT
 1607608320,1607609343,ES
-1607609344,1607609599,EU
-1607609600,1607609855,ES
-1607609856,1607610367,EU
+1607609344,1607610367,EU
 1607610368,1607612415,IE
 1607612416,1607614463,EU
 1607614464,1607615487,FR
@@ -28274,12 +28442,14 @@
 1607983104,1607984127,GB
 1607984128,1607985151,RU
 1607985152,1607986175,PL
-1607986176,1607986687,FR
+1607986176,1607986431,FR
+1607986432,1607986687,GB
 1607986688,1607988223,RU
 1607988224,1607989247,KG
 1607989248,1607991295,RU
 1607991296,1608122367,UA
-1608122368,1608253439,RO
+1608122368,1608155135,GB
+1608155136,1608253439,RO
 1608253440,1608384511,RU
 1608384512,1608515583,DE
 1608515584,1610612735,IT
@@ -28287,9 +28457,7 @@
 1610678272,1610743807,CA
 1610743808,1611128831,US
 1611128832,1611130879,NL
-1611130880,1611169599,US
-1611169600,1611169663,IE
-1611169664,1611227135,US
+1611130880,1611227135,US
 1611227136,1611235327,CA
 1611235328,1611923455,US
 1611923456,1612185599,CA
@@ -28778,7 +28946,6 @@
 1728467968,1728468735,HK
 1728468736,1728469247,IN
 1728469248,1728469503,NZ
-1728469504,1728470015,HK
 1728470016,1728471039,JP
 1728471040,1728472063,PH
 1728472064,1728473087,KR
@@ -28977,7 +29144,6 @@
 1728653312,1728654335,NZ
 1728654336,1728655359,ID
 1728655872,1728656127,SB
-1728656128,1728656383,HK
 1728656384,1728661503,AU
 1728661504,1728662527,IN
 1728662528,1728665599,VN
@@ -29310,7 +29476,6 @@
 1728974848,1728976383,ID
 1728976384,1728976895,AU
 1728976896,1728977151,AF
-1728977408,1728977663,HK
 1728977664,1728977919,BD
 1728977920,1728978943,MY
 1728978944,1728979967,JP
@@ -29905,7 +30070,6 @@
 1729576960,1729577983,AU
 1729577984,1729578495,HK
 1729578496,1729578751,AU
-1729578752,1729579007,MY
 1729579008,1729580031,JP
 1729580032,1729581055,SG
 1729581056,1729583103,KR
@@ -30470,6 +30634,87 @@
 1730147328,1730148351,JP
 1730148352,1730149375,ID
 1730149376,1730150399,JP
+1742733312,1742734335,HK
+1742734336,1742735359,IN
+1742735360,1742736383,JP
+1742736384,1742737407,PK
+1742737408,1742738431,SG
+1742738432,1742738687,HK
+1742738688,1742738943,AU
+1742738944,1742739455,HK
+1742739456,1742740479,IN
+1742740480,1742741503,KH
+1742741504,1742743551,IN
+1742743552,1742745599,CN
+1742745600,1742745855,IN
+1742745856,1742746111,AU
+1742746112,1742746623,IN
+1742746624,1742747135,AU
+1742747136,1742747391,IN
+1742747392,1742747647,AU
+1742747648,1742748671,HK
+1742748672,1742749695,CN
+1742749696,1742750719,ID
+1742750720,1742751743,IN
+1742751744,1742752767,HK
+1742752768,1742753791,NZ
+1742753792,1742754815,CN
+1742754816,1742756863,AU
+1742756864,1742757887,JP
+1742757888,1742758911,BN
+1742758912,1742759935,ID
+1742759936,1742760191,AU
+1742760192,1742760447,IN
+1742760448,1742760703,HK
+1742760704,1742760959,NZ
+1742760960,1742761983,IN
+1742761984,1742763007,AU
+1742763008,1742764031,SG
+1742764032,1742765823,AU
+1742765824,1742766079,AF
+1742766080,1742767103,NZ
+1742767104,1742768127,TW
+1742768128,1742769663,ID
+1742769664,1742769919,AU
+1742769920,1742770175,JP
+1742770176,1742774271,IN
+1742774272,1742774527,AU
+1742774528,1742774783,NZ
+1742774784,1742775295,AU
+1742775296,1742776319,SG
+1742776320,1742777343,VN
+1742777344,1742779647,ID
+1742779648,1742779903,IN
+1742779904,1742780415,AU
+1742780416,1742782463,IN
+1742782464,1742783487,TW
+1742783488,1742784511,MY
+1742784512,1742786559,TW
+1742786560,1742788095,AU
+1742788096,1742788607,AF
+1742788608,1742789631,IN
+1742789632,1742793727,CN
+1742793728,1742796799,IN
+1742796800,1742797823,HK
+1742797824,1742798847,JP
+1742798848,1742799871,TW
+1742799872,1742800895,NZ
+1742800896,1742801919,HK
+1742801920,1742802943,IN
+1742802944,1742804991,HK
+1742804992,1742807039,IN
+1742807040,1742808063,AU
+1742808064,1742809087,PH
+1742809088,1742810111,IN
+1742810112,1742810623,AU
+1742810624,1742811135,IN
+1742811136,1742812159,PK
+1742812160,1742813183,JP
+1742813184,1742815231,IN
+1742815232,1742815743,SG
+1742815744,1742815999,ID
+1742816000,1742817279,AU
+1742817280,1742819327,IN
 1743781888,1743783935,JP
 1743783936,1743784959,IN
 1743784960,1743785983,JP
@@ -31458,6 +31703,14 @@
 1744824320,1744825343,IN
 1744825344,1744826367,VN
 1744826368,1744827391,ID
+1744827392,1744828415,JP
+1744828416,1744828927,AU
+1744828928,1744829183,SG
+1744829184,1744829439,AU
+1744829440,1744830463,HK
+1744830464,1745879039,US
+1764753408,1765801983,KE
+1765801984,1766850559,MA
 1766850560,1767899135,EG
 1767899136,1768947711,DZ
 1768947712,1769996287,NG
@@ -31544,11 +31797,25 @@
 1805049856,1805058047,CA
 1805058048,1805144063,US
 1805144064,1805148159,CA
-1805148160,1805582335,US
+1805148160,1805171231,US
+1805171232,1805171239,CA
+1805171240,1805171607,US
+1805171608,1805171615,CA
+1805171616,1805582335,US
 1805582336,1805647871,CA
 1805647872,1805713407,US
 1805713408,1805717503,CA
-1805746176,1806827519,US
+1805717504,1805721599,US
+1805721600,1805725695,CA
+1805725696,1805729791,US
+1805729792,1805733887,CA
+1805733888,1805737983,US
+1805737984,1805742079,CA
+1805742080,1806401535,US
+1806401536,1806434303,CA
+1806434304,1806843903,US
+1806893056,1806925823,US
+1806925824,1806958591,CA
 1807745024,1807917823,US
 1807917824,1807918079,VI
 1807918080,1815822335,US
@@ -31983,15 +32250,11 @@
 1835909120,1835911167,RS
 1835911168,1835913215,DE
 1835913216,1835917311,RU
-1835917312,1835917807,GB
-1835917808,1835917815,IT
-1835917816,1835917855,GB
+1835917312,1835917855,GB
 1835917856,1835917863,IT
 1835917864,1835917919,GB
 1835917920,1835917935,IT
-1835917936,1835918351,GB
-1835918352,1835918359,IT
-1835918360,1835918439,GB
+1835917936,1835918439,GB
 1835918440,1835918447,IT
 1835918448,1835918519,GB
 1835918520,1835918527,IT
@@ -32009,11 +32272,7 @@
 1835919096,1835919103,IT
 1835919104,1835919151,GB
 1835919152,1835919159,IT
-1835919160,1835919503,GB
-1835919504,1835919511,IT
-1835919512,1835919655,GB
-1835919656,1835919663,IT
-1835919664,1835919751,GB
+1835919160,1835919751,GB
 1835919752,1835919759,IT
 1835919760,1835920479,GB
 1835920480,1835920487,IT
@@ -32043,9 +32302,7 @@
 1835923520,1835923527,IT
 1835923528,1835923863,GB
 1835923864,1835923871,IT
-1835923872,1835924103,GB
-1835924104,1835924111,IT
-1835924112,1835924151,GB
+1835923872,1835924151,GB
 1835924152,1835924159,IT
 1835924160,1835924375,GB
 1835924376,1835924383,IT
@@ -33918,8 +34175,8 @@
 1996636160,1996644351,ID
 1996644352,1996652543,BT
 1996652544,1997078527,CN
-1997078528,1997086719,AU
-1997086720,1997144063,HK
+1997078528,1997094911,AU
+1997094912,1997144063,HK
 1997144064,1997176831,CN
 1997176832,1997180927,AU
 1997180928,1997185023,HK
@@ -34735,8 +34992,8 @@
 2080636928,2080702463,IN
 2080702464,2080767999,KR
 2080768000,2080776191,TW
-2080776192,2080783359,ID
-2080783360,2080784383,SG
+2080776192,2080782335,ID
+2080782336,2080784383,SG
 2080784384,2080800767,CN
 2080800768,2080817151,PH
 2080817152,2080825343,NZ
@@ -35077,9 +35334,14 @@
 2153316096,2153316351,AP
 2153316352,2153406463,US
 2153406464,2153407487,JP
-2153407488,2153407999,US
+2153407488,2153407743,HK
+2153407744,2153407999,US
 2153408000,2153408511,BR
-2153408512,2153578495,US
+2153408512,2153409791,US
+2153409792,2153410047,MX
+2153410048,2153411583,US
+2153411584,2153411839,MX
+2153411840,2153578495,US
 2153578496,2153644031,FR
 2153644032,2153906175,US
 2153906176,2153971711,GB
@@ -35143,7 +35405,7 @@
 2159607808,2159869951,US
 2159869952,2159935487,CA
 2159935488,2160525311,US
-2160525312,2160590847,GB
+2160525312,2160590847,SG
 2160590848,2160852991,US
 2160852992,2160885759,RU
 2160885760,2160893951,AT
@@ -35505,13 +35767,15 @@
 2193698816,2193701887,US
 2193701888,2193704959,RU
 2193704960,2193707007,IT
-2193707008,2193707303,GB
+2193707008,2193707151,GB
+2193707152,2193707159,IT
+2193707160,2193707303,GB
 2193707304,2193707311,IT
 2193707312,2193707407,GB
 2193707408,2193707415,IT
-2193707416,2193707487,GB
-2193707488,2193707495,IT
-2193707496,2193711103,GB
+2193707416,2193707751,GB
+2193707752,2193707759,IT
+2193707760,2193711103,GB
 2193711104,2193713151,DE
 2193713152,2193715199,ES
 2193715200,2193717247,DE
@@ -35681,7 +35945,11 @@
 2212764928,2212765183,IN
 2212765184,2212766719,FI
 2212766720,2212767743,GB
-2212767744,2212823039,FI
+2212767744,2212796415,FI
+2212796416,2212797951,NL
+2212797952,2212807679,FI
+2212807680,2212808703,US
+2212808704,2212823039,FI
 2212823040,2212954111,US
 2212954112,2213019647,GB
 2213019648,2213085183,CA
@@ -36692,8 +36960,7 @@
 2354315264,2354380799,DE
 2354380800,2354446335,NL
 2354446336,2354511871,SE
-2354511872,2354577407,CA
-2354577408,2354839551,US
+2354511872,2354839551,US
 2354839552,2354905087,TW
 2354905088,2355036159,FR
 2355036160,2355101695,US
@@ -37194,11 +37461,17 @@
 2417688576,2417754111,SE
 2417754112,2418016255,US
 2418016256,2418081791,GB
-2418081792,2418278399,US
-2418278400,2418323007,IN
+2418081792,2418312959,US
+2418312960,2418313215,IN
+2418313216,2418323007,US
 2418323008,2418323008,PH
-2418323009,2418343935,IN
-2418343936,2418606079,US
+2418323009,2418337023,US
+2418337024,2418337279,IN
+2418337280,2418338303,US
+2418338304,2418338815,IN
+2418338816,2418341887,US
+2418341888,2418342143,IN
+2418342144,2418606079,US
 2418606080,2418671615,DE
 2418671616,2418737151,US
 2418737152,2418802687,NL
@@ -37493,12 +37766,14 @@
 2457075712,2457141247,AU
 2457206784,2457272319,AU
 2457272320,2457337855,FI
-2457337856,2457342975,CZ
-2457342976,2457343999,RU
+2457337856,2457343999,RU
 2457344000,2457346047,UA
 2457346048,2457360383,RU
-2457360384,2457361407,CZ
-2457361408,2457366527,RU
+2457360384,2457360895,CZ
+2457360896,2457361151,RU
+2457361152,2457361407,CZ
+2457361408,2457365503,RU
+2457365504,2457366527,CZ
 2457366528,2457367551,GB
 2457367552,2457372671,CZ
 2457372672,2457376767,RU
@@ -37777,7 +38052,9 @@
 2479226880,2479357951,US
 2479357952,2479423487,AU
 2479423488,2479489023,GB
-2479489024,2479620095,US
+2479489024,2479585279,US
+2479585280,2479585535,A1
+2479585536,2479620095,US
 2479620096,2479685631,DE
 2479685632,2479947775,US
 2479947776,2480013311,AU
@@ -38041,7 +38318,9 @@
 2503911424,2503915519,ES
 2503915520,2503917567,IT
 2503917568,2503933951,BG
-2503933952,2506293247,US
+2503933952,2504916991,US
+2504916992,2504949759,IL
+2504949760,2506293247,US
 2506293248,2506358783,CA
 2506358784,2507124735,US
 2507124736,2507124991,IN
@@ -38129,9 +38408,7 @@
 2515205120,2515206143,US
 2515206144,2515599359,DE
 2515599360,2515664895,GB
-2515664896,2515861503,DE
-2515861504,2515927039,PL
-2515927040,2516037631,DE
+2515664896,2516037631,DE
 2516037632,2516038143,DK
 2516038144,2516058111,DE
 2516123648,2516254719,DE
@@ -38303,8 +38580,9 @@
 2546039040,2547187711,US
 2547187712,2547318783,GB
 2547318784,2547515391,US
-2547548160,2547580927,RU
-2547580928,2547646463,DE
+2547515392,2547531775,BE
+2547531776,2547539967,UA
+2547553024,2547553279,RU
 2548039680,2548563967,GB
 2548563968,2548826111,IR
 2548826112,2548829695,AT
@@ -38552,9 +38830,13 @@
 2586804992,2586805247,ES
 2586805248,2586828799,US
 2586828800,2586829055,CH
-2586829056,2586872063,US
+2586829056,2586870783,US
+2586870784,2586871807,ES
+2586871808,2586872063,US
 2586872064,2586872319,ES
-2586872320,2587017215,US
+2586872320,2586875135,US
+2586875136,2586875391,ES
+2586875392,2587017215,US
 2587017216,2587017471,IE
 2587017472,2587018239,US
 2587018240,2587018495,IE
@@ -38632,8 +38914,19 @@
 2588318720,2588319743,UG
 2588319744,2588327935,SC
 2588327936,2588328959,ML
+2588328960,2588329983,BI
+2588329984,2588332031,MA
+2588332032,2588336127,ZA
 2588344320,2588409855,MU
+2588409856,2588410879,KE
+2588410880,2588412927,ZA
+2588412928,2588413951,ST
+2588418048,2588420095,NG
+2588420096,2588422143,ZA
+2588459008,2588467199,UG
+2588467200,2588471295,TN
 2588934144,2589982719,SC
+2589982720,2590507007,SD
 2600534016,2600665087,US
 2600665088,2600730623,CA
 2600730624,2600796159,NO
@@ -39107,12 +39400,9 @@
 2667536640,2667537087,AT
 2667537088,2667537119,FR
 2667537120,2667537151,AT
-2667537152,2667537407,FR
-2667537408,2667538175,AT
-2667538176,2667538431,FR
-2667538432,2667538495,AT
-2667538496,2667538511,FR
-2667538512,2667544575,AT
+2667537152,2667541503,FR
+2667541504,2667542527,AT
+2667542528,2667544575,FR
 2667544576,2667560959,RU
 2667560960,2667565055,IT
 2667565056,2667565311,HK
@@ -39209,8 +39499,8 @@
 2673737728,2673803263,US
 2673803264,2673868799,FR
 2673868800,2674130943,US
-2674130944,2674184191,GB
-2674184192,2674188287,US
+2674130944,2674180095,GB
+2674180096,2674188287,US
 2674188288,2674249727,GB
 2674249728,2674251775,US
 2674251776,2674262015,GB
@@ -39608,7 +39898,9 @@
 2697789440,2697854975,US
 2697854976,2697889791,AU
 2697889792,2697891839,US
-2697891840,2697920511,AU
+2697891840,2697892863,AU
+2697892864,2697894143,US
+2697894144,2697920511,AU
 2697920512,2698117119,US
 2698117120,2698182655,IS
 2698182656,2698248191,DE
@@ -40014,6 +40306,24 @@
 2734373888,2734374911,CA
 2734374912,2734376959,US
 2734376960,2734379007,CA
+2734379008,2734381055,VG
+2734381056,2734386175,US
+2734386176,2734387199,AI
+2734387200,2734389247,US
+2734389248,2734390271,CA
+2734390272,2734398463,US
+2734398464,2734399487,PR
+2734399488,2734407679,US
+2734407680,2734409727,CA
+2734409728,2734435327,US
+2734435328,2734436351,CA
+2734436352,2734447615,US
+2734447616,2734448639,CA
+2734448640,2734452735,US
+2734452736,2734454783,CA
+2734454784,2734457855,US
+2734457856,2734458879,CA
+2734458880,2734460927,US
 2734686208,2734751743,CN
 2734751744,2734817279,GB
 2734817280,2734882815,US
@@ -40601,8 +40911,8 @@
 2829041920,2829058047,US
 2829058048,2829123583,CN
 2829123584,2829148159,US
-2829148160,2829148415,HK
-2829148416,2829174783,US
+2829148160,2829148671,HK
+2829148672,2829174783,US
 2829174784,2829175807,GB
 2829175808,2829176319,US
 2829176320,2829176831,DE
@@ -40943,7 +41253,9 @@
 2905002154,2905002495,GB
 2905002496,2905045247,US
 2905045248,2905045503,SG
-2905045504,2905473023,US
+2905045504,2905405679,US
+2905405680,2905405687,CN
+2905405688,2905473023,US
 2905473024,2905481215,CA
 2905481216,2913992703,US
 2913992704,2914516991,CA
@@ -41006,7 +41318,9 @@
 2917621760,2917629951,CA
 2917629952,2917653503,US
 2917653504,2917654015,GB
-2917654016,2917704191,US
+2917654016,2917700959,US
+2917700960,2917700967,CN
+2917700968,2917704191,US
 2917704192,2917704447,CA
 2917704448,2917842175,US
 2917842176,2917842431,CA
@@ -41119,7 +41433,9 @@
 2925002752,2925527039,CA
 2925527040,2926575615,US
 2926575616,2927099903,CA
-2927099904,2928175551,US
+2927099904,2927581183,US
+2927581184,2927581439,SG
+2927581440,2928175551,US
 2928175552,2928175559,VN
 2928175560,2928177151,US
 2928177152,2928181247,CA
@@ -41320,9 +41636,7 @@
 2954823396,2954823399,GB
 2954823400,2954827799,FR
 2954827800,2954827807,DE
-2954827808,2954828799,FR
-2954828800,2954828815,NL
-2954828816,2954829751,FR
+2954827808,2954829751,FR
 2954829752,2954829752,ES
 2954829753,2954829759,FR
 2954829760,2954829823,ES
@@ -41446,9 +41760,7 @@
 2956548096,2956550143,ME
 2956550144,2956554239,ES
 2956554240,2956558335,IT
-2956558336,2956574527,DE
-2956574528,2956574559,PL
-2956574560,2956574719,DE
+2956558336,2956574719,DE
 2956574720,2956576767,SE
 2956576768,2956578815,ES
 2956578816,2956582911,RU
@@ -41698,7 +42010,11 @@
 2959767552,2959769599,RS
 2959769600,2959777791,RU
 2959777792,2959781887,LV
-2959781888,2959785983,SK
+2959781888,2959782399,SK
+2959782400,2959782655,LV
+2959782656,2959783083,SK
+2959783084,2959783084,LV
+2959783085,2959785983,SK
 2959785984,2959794175,UA
 2959794176,2959796223,IL
 2959796224,2959806463,RU
@@ -41851,7 +42167,8 @@
 2960592896,2960594943,RU
 2960594944,2960596991,UA
 2960596992,2960605183,PL
-2960605184,2960629759,UA
+2960605184,2960621567,UA
+2960621568,2960629759,CZ
 2960629760,2960646143,RU
 2960646144,2960648191,KZ
 2960648192,2960650239,UA
@@ -42343,9 +42660,7 @@
 2988526416,2988526423,ES
 2988526424,2988527831,FR
 2988527832,2988527839,ES
-2988527840,2988529247,FR
-2988529248,2988529251,GB
-2988529252,2988529351,FR
+2988527840,2988529351,FR
 2988529352,2988529359,GB
 2988529360,2988529375,FR
 2988529376,2988529383,GB
@@ -42354,9 +42669,7 @@
 2988537856,2988544671,FR
 2988544672,2988544687,GB
 2988544688,2988544691,NL
-2988544692,2988546451,FR
-2988546452,2988546455,ES
-2988546456,2988547655,FR
+2988544692,2988547655,FR
 2988547656,2988547663,PL
 2988547664,2988547871,FR
 2988547872,2988547903,GB
@@ -43036,20 +43349,30 @@
 3003128832,3003129087,TT
 3003129344,3003129599,BO
 3003129600,3003129855,HN
-3003129856,3003139583,CR
+3003129856,3003138815,CR
+3003138816,3003139071,PA
+3003139072,3003139583,CR
 3003139584,3003140351,PA
 3003140352,3003140863,CR
 3003140864,3003141119,PA
-3003141120,3003148031,CR
+3003141120,3003143935,CR
+3003143936,3003144447,PA
+3003144448,3003146239,CR
+3003146240,3003146495,PA
+3003146496,3003147007,CR
+3003147008,3003147263,PA
+3003147264,3003148031,CR
 3003148032,3003148543,PA
-3003148544,3003152127,CR
+3003148544,3003149055,CR
+3003149056,3003149311,PA
+3003149312,3003152127,CR
 3003152128,3003152383,PA
 3003152384,3003154431,CR
 3003154432,3003154687,CL
 3003154688,3003154943,EC
 3003154944,3003159039,AR
 3003159040,3003159295,CO
-3003159296,3003159807,AR
+3003159296,3003160575,AR
 3003160576,3003161599,CL
 3003162624,3003170815,CR
 3003187200,3003252735,CO
@@ -43062,7 +43385,9 @@
 3004694528,3005218815,UY
 3005218816,3005349887,CO
 3005480960,3005874175,AR
-3005874176,3005879807,PA
+3005874176,3005875455,PA
+3005875456,3005875711,CO
+3005875712,3005879807,PA
 3005879808,3005880063,CO
 3005880064,3005881343,PA
 3005881344,3005881599,CO
@@ -43074,17 +43399,29 @@
 3005888000,3005888255,CO
 3005888256,3005890047,PA
 3005890048,3005890303,CO
-3005890304,3005893119,PA
+3005890304,3005891071,PA
+3005891072,3005891327,CO
+3005891328,3005893119,PA
 3005893120,3005893375,CO
 3005893376,3005893887,PA
 3005893888,3005894143,CO
 3005894144,3005894655,PA
 3005894656,3005894911,CO
-3005894912,3005903615,PA
+3005894912,3005896703,PA
+3005896704,3005896959,CO
+3005896960,3005902591,PA
+3005902592,3005902847,CO
+3005902848,3005903615,PA
 3005903616,3005903871,CO
-3005903872,3005911039,PA
+3005903872,3005905919,PA
+3005905920,3005906431,CO
+3005906432,3005906687,PA
+3005906688,3005906943,CO
+3005906944,3005911039,PA
 3005911040,3005911295,CO
-3005911296,3005915135,PA
+3005911296,3005913855,PA
+3005913856,3005914111,CO
+3005914112,3005915135,PA
 3005915136,3005918207,AR
 3005918208,3005919231,CO
 3005919232,3005923327,AR
@@ -43116,31 +43453,43 @@
 3006279168,3006279423,NI
 3006279424,3006283519,PA
 3006283520,3006283775,NI
-3006283776,3006284799,PA
+3006283776,3006284031,PA
+3006284032,3006284287,CR
+3006284288,3006284799,PA
 3006284800,3006285055,CR
 3006285056,3006285311,PA
 3006285312,3006285567,CR
 3006285568,3006285823,PA
 3006285824,3006286079,CR
-3006286080,3006288639,PA
+3006286080,3006287103,PA
+3006287104,3006287359,CR
+3006287360,3006288639,PA
 3006288640,3006288895,CR
-3006288896,3006292991,PA
+3006288896,3006291455,PA
+3006291456,3006291711,CR
+3006291712,3006292991,PA
 3006292992,3006293247,CR
 3006293248,3006296575,PA
 3006296576,3006296831,CR
 3006296832,3006308351,PA
 3006308352,3006308863,CR
-3006308864,3006311679,PA
-3006311680,3006311935,CR
-3006311936,3006321663,PA
+3006308864,3006310143,PA
+3006310144,3006310399,CR
+3006310400,3006311679,PA
+3006311680,3006312191,CR
+3006312192,3006312703,PA
+3006312704,3006312959,CR
+3006312960,3006315519,PA
+3006315520,3006315775,CR
+3006315776,3006321663,PA
 3006321664,3006321919,CR
 3006321920,3006322431,PA
 3006322432,3006323199,CR
 3006323200,3006323455,PA
 3006323456,3006323711,CR
 3006323712,3006329343,PA
-3006329344,3006329599,NI
-3006329600,3006330367,PA
+3006329344,3006329855,NI
+3006329856,3006330367,PA
 3006330368,3006330623,NI
 3006330624,3006330879,PA
 3006330880,3006331903,CR
@@ -43155,6 +43504,9 @@
 3006365696,3006431231,CO
 3006431232,3006463999,CR
 3006464000,3006480383,SV
+3006480384,3006484479,DO
+3006484480,3006488575,AR
+3006488576,3006496767,CO
 3006496768,3006500351,CR
 3006500352,3006500607,MX
 3006500608,3006506239,CR
@@ -43167,7 +43519,9 @@
 3006512896,3006513151,MX
 3006513152,3006513407,CR
 3006513408,3006513663,PA
-3006513664,3006517503,CR
+3006513664,3006514431,CR
+3006514432,3006514687,PA
+3006514688,3006517503,CR
 3006517504,3006517759,NI
 3006517760,3006518783,CR
 3006518784,3006519039,NI
@@ -43220,15 +43574,35 @@
 3007272960,3007273215,PA
 3007273216,3007274751,CR
 3007274752,3007275007,PA
-3007275008,3007281663,CR
+3007275008,3007279359,CR
+3007279360,3007279871,PA
+3007279872,3007280639,CR
+3007280640,3007280895,PA
+3007280896,3007281151,CR
+3007281152,3007281407,PA
+3007281408,3007281663,CR
 3007281664,3007281919,PA
 3007281920,3007283967,CR
 3007283968,3007284223,PA
-3007284224,3007292415,CR
+3007284224,3007286015,CR
+3007286016,3007286271,PA
+3007286272,3007286783,CR
+3007286784,3007287295,PA
+3007287296,3007287551,CR
+3007287552,3007287807,MX
+3007287808,3007289087,CR
+3007289088,3007289343,MX
+3007289344,3007292415,CR
 3007292416,3007292671,MX
-3007292672,3007294207,CR
+3007292672,3007293439,CR
+3007293440,3007293695,MX
+3007293696,3007294207,CR
 3007294208,3007294463,MX
-3007294464,3007299583,CR
+3007294464,3007294719,CR
+3007294720,3007294975,MX
+3007294976,3007296767,CR
+3007296768,3007297023,MX
+3007297024,3007299583,CR
 3007299584,3007301631,PA
 3007301632,3007305727,AR
 3007305728,3007307775,BZ
@@ -43254,10 +43628,10 @@
 3025607168,3025607423,SG
 3025607424,3025607679,HK
 3025607680,3025608191,IN
-3025608192,3025608199,JP
-3025608200,3025616895,IN
-3025616896,3025617151,SG
-3025617152,3025618943,IN
+3025608192,3025608203,JP
+3025608204,3025616895,IN
+3025616896,3025617407,SG
+3025617408,3025618943,IN
 3025618944,3025619455,SG
 3025619456,3025620991,IN
 3025620992,3025621247,PH
@@ -43268,8 +43642,8 @@
 3025625472,3025625599,IN
 3025625600,3025625855,SG
 3025625856,3025629439,IN
-3025629440,3025629463,HK
-3025629464,3025631239,IN
+3025629440,3025629467,HK
+3025629468,3025631239,IN
 3025631240,3025631247,AU
 3025631248,3025633535,IN
 3025633536,3025633791,HK
@@ -43550,7 +43924,15 @@
 3039166464,3039231999,PA
 3039297536,3039363071,PY
 3039363072,3039412223,BZ
-3039412224,3039420415,CL
+3039412224,3039412991,CL
+3039412992,3039413247,BR
+3039413248,3039415295,CL
+3039415296,3039415807,BR
+3039415808,3039417087,CL
+3039417088,3039417343,BR
+3039417344,3039419647,CL
+3039419648,3039420159,BR
+3039420160,3039420415,CL
 3039420416,3039428607,AR
 3039428608,3039559679,CL
 3039559680,3039821823,AR
@@ -43602,7 +43984,9 @@
 3048144896,3048210431,EC
 3048210432,3048275967,PE
 3048275968,3048292351,AR
-3048292352,3048308735,BZ
+3048292352,3048292607,BZ
+3048292608,3048293375,HN
+3048293376,3048308735,BZ
 3048308736,3048325119,BO
 3048325120,3048331263,AR
 3048331264,3048332287,GY
@@ -43647,9 +44031,9 @@
 3050504192,3050569727,EC
 3051356160,3051373055,CR
 3051373056,3051373311,PA
-3051373312,3051375103,CR
-3051375104,3051375359,PA
-3051375360,3051376895,CR
+3051373312,3051374847,CR
+3051374848,3051375615,PA
+3051375616,3051376895,CR
 3051376896,3051377151,PA
 3051377152,3051379455,CR
 3051379456,3051379711,PA
@@ -43703,7 +44087,9 @@
 3051973888,3051974143,PA
 3051974144,3051974399,CR
 3051974400,3051974655,PA
-3051974656,3051995135,CR
+3051974656,3051976191,CR
+3051976192,3051976447,PA
+3051976448,3051995135,CR
 3051995136,3052011519,PE
 3052011520,3052273663,CO
 3052273664,3052404735,AR
@@ -43927,15 +44313,20 @@
 3082158080,3082166271,CN
 3082166272,3082174463,JP
 3082174464,3082178559,PH
-3082178560,3082179583,HK
 3082179584,3082181631,IN
 3082181632,3082182655,ID
 3082182656,3082190847,LA
 3082190848,3082289151,JP
 3082289152,3087007743,CN
-3087007744,3088711167,US
+3087007744,3088629759,US
+3088629760,3088633855,NL
+3088633856,3088711167,US
 3088711168,3088711423,AU
-3088711424,3091202047,US
+3088711424,3090325503,US
+3090325504,3090329599,NL
+3090329600,3090389503,US
+3090389504,3090389631,CA
+3090389632,3091202047,US
 3091202048,3091726335,CA
 3091726336,3091955711,US
 3091955712,3091959807,CA
@@ -43943,7 +44334,15 @@
 3091976192,3091980287,CA
 3091980288,3092569343,US
 3092569344,3092569599,AU
-3092569600,3093168127,US
+3092569600,3092615167,US
+3092615168,3092619263,NL
+3092619264,3092623359,US
+3092623360,3092631551,NL
+3092631552,3092643839,US
+3092643840,3092647935,NL
+3092647936,3092688895,US
+3092688896,3092692991,NL
+3092692992,3093168127,US
 3093168128,3093200895,CA
 3093200896,3093213183,US
 3093213184,3093217279,CA
@@ -44033,8 +44432,7 @@
 3103921152,3103922175,CH
 3103922176,3103923199,NL
 3103923200,3103923711,SE
-3103923712,3103923967,NL
-3103923968,3103924223,SE
+3103923712,3103924223,NL
 3103924224,3103925247,RU
 3103925248,3103926271,PL
 3103926272,3103927295,CZ
@@ -44062,7 +44460,8 @@
 3103950848,3103951871,GB
 3103951872,3103952895,DE
 3103952896,3103953919,IT
-3103953920,3103954943,NL
+3103953920,3103954431,NL
+3103954432,3103954943,ES
 3103954944,3103955967,SE
 3103955968,3103956991,AT
 3103956992,3103958015,DE
@@ -44341,8 +44740,8 @@
 3104247808,3104248831,AT
 3104248832,3104250879,CZ
 3104250880,3104251903,RU
-3104251904,3104252159,SE
-3104252160,3104252927,NL
+3104251904,3104252415,SE
+3104252416,3104252927,NL
 3104252928,3104253951,FR
 3104253952,3104254975,RU
 3104254976,3104255999,CZ
@@ -44687,8 +45086,7 @@
 3104622592,3104623615,GB
 3104623616,3104624639,FR
 3104624640,3104625663,RU
-3104625664,3104626687,BY
-3104626688,3104627711,NL
+3104625664,3104627711,NL
 3104627712,3104628735,LB
 3104628736,3104629759,TR
 3104629760,3104630783,RU
@@ -44829,7 +45227,7 @@
 3104778240,3104779263,TR
 3104779264,3104780287,PL
 3104780288,3104782335,FR
-3104782336,3104783359,US
+3104782336,3104783359,NL
 3104783360,3104784383,RU
 3104784384,3104785407,BA
 3104785408,3104786431,FR
@@ -45117,7 +45515,7 @@
 3105091584,3105092607,FR
 3105092608,3105093631,UA
 3105093632,3105094655,SE
-3105094656,3105097727,GB
+3105095680,3105097727,GB
 3105097728,3105098751,FR
 3105098752,3105099775,SE
 3105099776,3105100799,FR
@@ -45895,10 +46293,8 @@
 3105931264,3105932287,EU
 3105932288,3105933311,SE
 3105933312,3105933343,GB
-3105933344,3105933351,IT
-3105933352,3105933359,GB
-3105933360,3105933367,IT
-3105933368,3105933463,GB
+3105933344,3105933359,IT
+3105933360,3105933463,GB
 3105933464,3105933471,IT
 3105933472,3105933591,GB
 3105933592,3105933599,IT
@@ -45975,7 +46371,7 @@
 3106003968,3106004991,EU
 3106004992,3106006015,CH
 3106006016,3106007039,RU
-3106007040,3106008063,TR
+3106007040,3106008063,CY
 3106008064,3106009087,RU
 3106009088,3106010111,GB
 3106010112,3106011135,RU
@@ -46612,6 +47008,135 @@
 3106698240,3106699263,BG
 3106699264,3106700287,RU
 3106700288,3106701311,BG
+3106701312,3106702335,NL
+3106702336,3106703359,DE
+3106703360,3106704383,NL
+3106704384,3106705407,FR
+3106705408,3106706431,GR
+3106706432,3106707455,DE
+3106707456,3106708479,LB
+3106708480,3106709503,LI
+3106709504,3106710527,NL
+3106710528,3106711551,RU
+3106711552,3106712575,NL
+3106712576,3106713599,PL
+3106713600,3106714623,DE
+3106714624,3106715647,IT
+3106715648,3106716671,SE
+3106716672,3106717695,CZ
+3106717696,3106718719,TR
+3106718720,3106719743,CH
+3106719744,3106720767,DE
+3106720768,3106722815,AT
+3106722816,3106723839,IT
+3106723840,3106724863,PL
+3106724864,3106725887,IT
+3106725888,3106726911,NL
+3106726912,3106727935,AM
+3106727936,3106728959,ES
+3106728960,3106729983,RU
+3106729984,3106731007,IS
+3106731008,3106732031,NL
+3106732032,3106735103,GB
+3106735104,3106737151,IE
+3106737152,3106738175,RO
+3106738176,3106739199,DE
+3106739200,3106740223,DK
+3106740224,3106741247,GB
+3106741248,3106742271,NL
+3106742272,3106743295,FR
+3106743296,3106744319,NO
+3106744320,3106745343,SM
+3106745344,3106746367,NL
+3106746368,3106747391,DK
+3106747392,3106748415,BE
+3106748416,3106749439,CZ
+3106749440,3106750463,RU
+3106750464,3106751487,BG
+3106751488,3106752511,IT
+3106752512,3106753535,ES
+3106753536,3106754559,IS
+3106754560,3106755583,RU
+3106755584,3106756607,SE
+3106756608,3106757631,DE
+3106757632,3106758655,RU
+3106758656,3106759679,GB
+3106759680,3106760703,RU
+3106760704,3106761727,IE
+3106761728,3106762751,GB
+3106762752,3106763775,DE
+3106763776,3106764799,NL
+3106764800,3106765823,SE
+3106765824,3106766847,CZ
+3106766848,3106767871,SE
+3106767872,3106768895,DE
+3106768896,3106769919,CZ
+3106769920,3106770943,EE
+3106770944,3106771967,RU
+3106771968,3106772991,DK
+3106772992,3106774015,BG
+3106774016,3106775039,AE
+3106775040,3106776063,GB
+3106776064,3106777087,ES
+3106777088,3106778111,GB
+3106778112,3106779135,FR
+3106779136,3106780159,NO
+3106780160,3106781183,FR
+3106781184,3106782207,DK
+3106782208,3106783231,IR
+3106783232,3106784255,SC
+3106784256,3106785279,HU
+3106785280,3106786303,CZ
+3106786304,3106787327,DE
+3106787328,3106788351,IT
+3106788352,3106789375,AT
+3106789376,3106790399,PL
+3106790400,3106792447,GB
+3106792448,3106793471,FR
+3106793472,3106794495,AT
+3106794496,3106795519,CH
+3106795520,3106796543,DE
+3106796544,3106797567,UA
+3106797568,3106798591,DE
+3106798592,3106799615,FR
+3106799616,3106800639,IR
+3106800640,3106801663,GR
+3106801664,3106804735,RU
+3106804736,3106805759,EE
+3106805760,3106806783,IT
+3106806784,3106807807,NL
+3106807808,3106808831,HR
+3106808832,3106809855,DK
+3106809856,3106810879,TR
+3106810880,3106812927,RU
+3106812928,3106813951,TR
+3106813952,3106814975,CH
+3106814976,3106815999,MD
+3106816000,3106817023,NL
+3106817024,3106818047,IT
+3106818048,3106819071,IE
+3106819072,3106820095,BE
+3106820096,3106824191,CH
+3106824192,3106825215,RU
+3106825216,3106826239,IT
+3106826240,3106827263,PL
+3106827264,3106828287,IR
+3106828288,3106829311,GB
+3106829312,3106830335,NL
+3106830336,3106831359,US
+3106831360,3106832383,ES
+3106832384,3106833407,DE
+3106833408,3106834431,NO
+3106834432,3106835455,DE
+3106835456,3106836479,IT
+3106836480,3106837503,KW
+3106837504,3106838527,UA
+3106838528,3106839551,RU
+3106839552,3106840575,NL
+3106840576,3106841599,BG
+3106841600,3106842623,FR
+3106842624,3106843647,PL
+3106843648,3106844671,GB
 3120562176,3120594943,CO
 3120594944,3120599039,AR
 3120599040,3120601087,EC
@@ -46741,10 +47266,13 @@
 3126855808,3126855935,US
 3126855936,3126857855,AR
 3126857856,3126857983,US
-3126857984,3126870015,AR
+3126857984,3126858495,AR
+3126858496,3126858623,US
+3126858624,3126870015,AR
 3126870016,3126874111,VE
 3126874112,3126878207,CR
-3126878208,3126886399,PA
+3126878208,3126882303,PA
+3126882304,3126886399,US
 3126886400,3126918143,AR
 3126918144,3126919167,HN
 3126919168,3127115775,CO
@@ -46772,7 +47300,9 @@
 3130314752,3130315775,CL
 3130315776,3130316799,CR
 3130316800,3130318847,CW
-3130318848,3130327039,AR
+3130318848,3130319871,AR
+3130319872,3130320895,RU
+3130320896,3130327039,AR
 3130327040,3130458111,DO
 3130458112,3130523647,GT
 3130523648,3130654719,AR
@@ -47273,7 +47803,9 @@
 3163186535,3163186535,FR
 3163186536,3163186673,DE
 3163186674,3163186674,FR
-3163186675,3163193343,DE
+3163186675,3163192621,DE
+3163192622,3163192622,EG
+3163192623,3163193343,DE
 3163193344,3163226111,MD
 3163226112,3163258879,SA
 3163258880,3163291647,SY
@@ -47529,7 +48061,9 @@
 3187940964,3187940967,HN
 3187940968,3187943127,GT
 3187943128,3187943135,HN
-3187943136,3187946111,GT
+3187943136,3187945971,GT
+3187945972,3187945975,HN
+3187945976,3187946111,GT
 3187946112,3187946239,HN
 3187946240,3187946639,GT
 3187946640,3187946647,HN
@@ -47606,7 +48140,9 @@
 3188490240,3188498431,CO
 3188498432,3188517119,AR
 3188517120,3188517247,US
-3188517248,3188523007,AR
+3188517248,3188518271,AR
+3188518272,3188518399,US
+3188518400,3188523007,AR
 3188523008,3188539391,CO
 3188539392,3188543487,CL
 3188543488,3188545535,PA
@@ -47661,8 +48197,8 @@
 3191132160,3191136255,AR
 3191136256,3191144447,DO
 3191144448,3191152639,SV
-3191152640,3191154687,NI
-3191154688,3191156735,SV
+3191152640,3191155711,NI
+3191155712,3191156735,SV
 3191156736,3191169023,HN
 3191169024,3191193599,SV
 3191193600,3191209983,HN
@@ -47677,9 +48213,13 @@
 3191472128,3191603199,TT
 3191603200,3191607807,CO
 3191607808,3191608319,CL
-3191608320,3191611391,CO
+3191608320,3191610623,CO
+3191610624,3191610879,PE
+3191610880,3191611391,CO
 3191611392,3191619583,VE
-3191619584,3191648255,CO
+3191619584,3191647743,CO
+3191647744,3191647807,AR
+3191647808,3191648255,CO
 3191648256,3191649791,US
 3191649792,3191650303,CO
 3191650304,3191650815,US
@@ -47688,30 +48228,29 @@
 3191651840,3191670015,CO
 3191670016,3191670271,AR
 3191670272,3191676927,CO
-3191676928,3191679487,AR
+3191676928,3191677439,AR
+3191677440,3191677695,US
+3191677696,3191678463,AR
+3191678464,3191678719,US
+3191678720,3191679487,AR
 3191679488,3191679743,US
 3191679744,3191679999,AR
 3191680000,3191680255,US
 3191680256,3191680511,AR
 3191680512,3191680767,US
 3191680768,3191683327,AR
-3191683328,3191683583,US
-3191683584,3191683839,AR
-3191683840,3191684095,US
-3191684096,3191684351,AR
-3191684352,3191684607,US
+3191683328,3191684607,US
 3191684608,3191684863,AR
 3191684864,3191685119,US
 3191685120,3191685631,AR
 3191685632,3191685887,US
-3191685888,3191688703,AR
+3191685888,3191687167,AR
+3191687168,3191688703,CO
 3191688704,3191693311,US
 3191693312,3191695871,CO
 3191695872,3191696127,US
 3191696128,3191696383,CO
-3191696384,3191696895,US
-3191696896,3191697407,CO
-3191697408,3191701503,US
+3191696384,3191701503,US
 3191701504,3191702527,CO
 3191702528,3191703039,US
 3191703040,3191704063,CO
@@ -47720,12 +48259,12 @@
 3191704832,3191705343,US
 3191705344,3191705599,CO
 3191705600,3191705855,US
-3191705856,3191706367,CO
-3191706368,3191706623,US
-3191706624,3191720447,CO
-3191720448,3191721215,AR
-3191721216,3191721983,CO
-3191721984,3191722495,AR
+3191705856,3191706111,CO
+3191706112,3191706623,US
+3191706624,3191719935,CO
+3191719936,3191721215,AR
+3191721216,3191721471,CO
+3191721472,3191722495,AR
 3191722496,3191725055,CO
 3191725056,3191725311,AR
 3191725312,3191726079,CO
@@ -47738,7 +48277,9 @@
 3191730944,3191731199,AR
 3191731200,3191732479,CO
 3191732480,3191732735,AR
-3191732736,3191734271,CO
+3191732736,3191734079,CO
+3191734080,3191734143,US
+3191734144,3191734271,CO
 3191734272,3191799807,SV
 3191799808,3191865343,EC
 3191865344,3191930879,UY
@@ -47754,8 +48295,8 @@
 3193438208,3193569279,CW
 3193569280,3193579263,CO
 3193579264,3193579519,EC
-3193579520,3193582847,CO
-3193582848,3193583103,EC
+3193579520,3193582591,CO
+3193582592,3193583103,EC
 3193583104,3193599999,CO
 3193600000,3193600255,EC
 3193600256,3193605375,CO
@@ -47763,16 +48304,18 @@
 3193605632,3193606143,CO
 3193606144,3193606399,EC
 3193606400,3193606655,CO
-3193606656,3193606911,EC
-3193606912,3193617151,CO
+3193606656,3193607167,EC
+3193607168,3193617151,CO
 3193617152,3193617407,EC
 3193617408,3193622527,CO
-3193622528,3193623295,EC
-3193623296,3193625599,CO
+3193622528,3193623551,EC
+3193623552,3193625599,CO
 3193625600,3193625855,EC
 3193625856,3193626111,CO
 3193626112,3193626623,US
-3193626624,3193634815,CO
+3193626624,3193629439,CO
+3193629440,3193629695,EC
+3193629696,3193634815,CO
 3193634816,3193700351,CL
 3193700352,3193722751,HN
 3193722752,3193722879,GT
@@ -47793,18 +48336,28 @@
 3193740032,3193740287,US
 3193740288,3193741311,AR
 3193741312,3193741823,US
-3193741824,3193742591,AR
+3193741824,3193742079,AR
+3193742080,3193742335,US
+3193742336,3193742591,AR
 3193742592,3193742719,US
 3193742720,3193743231,AR
 3193743232,3193743359,US
-3193743360,3193745279,AR
+3193743360,3193743743,AR
+3193743744,3193743871,US
+3193743872,3193743999,AR
+3193744000,3193744127,US
+3193744128,3193745279,AR
 3193745280,3193745407,US
-3193745408,3193746751,AR
+3193745408,3193746431,AR
+3193746432,3193746687,US
+3193746688,3193746751,AR
 3193746752,3193746815,US
-3193746816,3193747199,AR
+3193746816,3193746879,AR
+3193746880,3193746943,US
+3193746944,3193747199,AR
 3193747200,3193747455,US
-3193747456,3193747839,AR
-3193747840,3193748223,US
+3193747456,3193747583,AR
+3193747584,3193748223,US
 3193748224,3193748863,AR
 3193748864,3193748991,US
 3193748992,3193749503,AR
@@ -47821,7 +48374,9 @@
 3193753088,3193753343,US
 3193753344,3193754623,AR
 3193754624,3193754751,US
-3193754752,3193765887,AR
+3193754752,3193755135,AR
+3193755136,3193755263,US
+3193755264,3193765887,AR
 3193765888,3193774079,TT
 3193774080,3193775103,PA
 3193775104,3193776127,GY
@@ -47868,8 +48423,8 @@
 3194134528,3194135551,AR
 3194135552,3194136575,GT
 3194136576,3194137087,BR
-3194137088,3194140671,AR
-3194140672,3194142719,CR
+3194137088,3194140159,AR
+3194140160,3194142719,CR
 3194142720,3194159103,CL
 3194159104,3194165247,HN
 3194165248,3194175487,SV
@@ -47948,8 +48503,8 @@
 3194662400,3194663167,AR
 3194663168,3194663423,US
 3194663424,3194663679,AR
-3194663680,3194664191,US
-3194664192,3194664959,AR
+3194663680,3194664447,US
+3194664448,3194664959,AR
 3194664960,3194665215,US
 3194665216,3194665471,AR
 3194665472,3194665727,US
@@ -48147,7 +48702,9 @@
 3196223488,3196305407,EC
 3196305408,3196321791,CO
 3196321792,3196583935,UY
-3196583936,3196846079,AR
+3196583936,3196690687,AR
+3196690688,3196690943,UY
+3196690944,3196846079,AR
 3196846080,3196977151,PA
 3196977152,3197042687,VE
 3197042688,3197075455,CO
@@ -48226,17 +48783,23 @@
 3201560576,3201561599,PY
 3201561600,3201562623,AR
 3201562624,3201563647,CL
-3201563648,3201564671,PA
+3201563648,3201564287,PA
+3201564288,3201564415,GB
+3201564416,3201564671,PA
 3201564672,3201630207,NI
 3201630208,3201695743,TT
 3201695744,3201761279,EC
 3201761280,3201826815,CL
-3201826816,3201859583,AR
+3201826816,3201851391,AR
+3201851392,3201855487,EC
+3201855488,3201859583,PE
 3201859584,3201863679,CO
 3201863680,3201865727,CL
 3201865728,3201867775,AR
 3201867776,3201869823,PE
-3201869824,3201870847,AR
+3201869824,3201869855,AR
+3201869856,3201869871,PE
+3201869872,3201870847,AR
 3201870848,3201871103,PE
 3201871104,3201871871,AR
 3201871872,3201875967,PE
@@ -48270,18 +48833,35 @@
 3203538688,3203538943,CO
 3203538944,3203539967,BZ
 3203539968,3203543551,CO
-3203543552,3203544063,GT
-3203544064,3203545087,CO
+3203543552,3203544575,GT
+3203544576,3203545087,CO
 3203545088,3203545599,GT
 3203545600,3203547135,CO
 3203547136,3203549183,PA
-3203549184,3203661823,CO
+3203549184,3203561471,CO
+3203561472,3203562495,SV
+3203562496,3203564031,CO
+3203564032,3203564287,PA
+3203564288,3203661823,CO
 3203661824,3203923967,AR
 3203923968,3204448255,CO
+3204448256,3206545407,BR
 3208642560,3210739711,CO
 3210739712,3210805247,CL
 3210805248,3210809343,PA
+3210809344,3210810367,VE
+3210810368,3210811391,PA
+3210811392,3210817535,AR
+3210817536,3210821631,PE
+3210821632,3210822655,EC
+3210822656,3210825727,AR
+3210825728,3210827775,BZ
+3210827776,3210829823,DO
+3210829824,3210830847,AR
+3210838016,3210870783,AR
 3210870784,3210903551,CO
+3210903552,3210919935,PE
+3210936320,3211067391,EC
 3211264000,3211788287,CO
 3211788288,3212836863,CL
 3212836864,3221225471,BR
@@ -51229,13 +51809,26 @@
 3233451520,3233451775,GB
 3233451776,3233452543,CA
 3233452544,3233452799,US
-3233452800,3233455743,CA
+3233452800,3233453567,CA
+3233453568,3233453823,IT
+3233453824,3233455743,CA
 3233455744,3233455775,US
-3233455776,3233457855,CA
+3233455776,3233456127,CA
+3233456128,3233456383,LV
+3233456384,3233456639,UA
+3233456640,3233457855,CA
 3233457856,3233457863,US
-3233457864,3233459199,CA
+3233457864,3233458687,CA
+3233458688,3233458943,HU
+3233458944,3233459199,BG
 3233459200,3233459455,US
-3233459456,3233463967,CA
+3233459456,3233460223,CA
+3233460224,3233460479,US
+3233460480,3233460735,CA
+3233460736,3233460991,US
+3233460992,3233463295,CA
+3233463296,3233463551,US
+3233463552,3233463967,CA
 3233463968,3233463999,US
 3233464000,3233464063,CA
 3233464064,3233484799,US
@@ -51496,7 +52089,11 @@
 3234193664,3234201599,CA
 3234201600,3234203647,US
 3234203648,3234205695,BR
-3234205696,3234238975,US
+3234205696,3234232319,US
+3234232320,3234232575,EG
+3234232576,3234232831,US
+3234232832,3234233087,BR
+3234233088,3234238975,US
 3234238976,3234239487,MY
 3234239488,3234240255,US
 3234240256,3234240383,EU
@@ -51680,7 +52277,9 @@
 3236069376,3236102143,CA
 3236102144,3236106239,PH
 3236106240,3236139007,US
-3236139008,3236143103,CA
+3236139008,3236142079,CA
+3236142080,3236142335,US
+3236142336,3236143103,CA
 3236143104,3236167679,US
 3236167680,3236175871,CA
 3236175872,3236200447,US
@@ -51787,13 +52386,22 @@
 3237041664,3237041791,US
 3237041792,3237043199,CA
 3237043200,3237043455,US
-3237043456,3237047295,CA
+3237043456,3237043967,CA
+3237043968,3237044223,CH
+3237044224,3237045759,CA
+3237045760,3237046015,US
+3237046016,3237047039,CA
+3237047040,3237047295,FR
 3237047296,3237047551,US
-3237047552,3237050367,CA
-3237050368,3237050879,US
-3237050880,3237051391,CA
+3237047552,3237047807,IE
+3237047808,3237048319,CA
+3237048320,3237048575,US
+3237048576,3237050367,CA
+3237050368,3237051135,US
+3237051136,3237051391,CA
 3237051392,3237051903,US
-3237051904,3237052415,CA
+3237051904,3237052159,TR
+3237052160,3237052415,CA
 3237052416,3237154815,US
 3237154816,3237155839,ES
 3237155840,3237156863,AU
@@ -52145,7 +52753,6 @@
 3239079424,3239079679,FR
 3239079680,3239079935,MD
 3239079936,3239088127,DE
-3239088384,3239088639,GB
 3239088640,3239088895,DK
 3239088896,3239089151,IL
 3239089152,3239089407,RO
@@ -52211,7 +52818,7 @@
 3239130112,3239130367,RU
 3239130368,3239130623,JO
 3239130624,3239130879,PL
-3239131136,3239133183,DE
+3239132160,3239133183,DE
 3239133184,3239133439,CH
 3239133440,3239133695,GB
 3239133696,3239133951,ES
@@ -52337,7 +52944,7 @@
 3239301120,3239302143,FR
 3239302144,3239303167,PL
 3239303168,3239304191,FR
-3239304192,3239305215,SI
+3239304192,3239305215,HR
 3239305216,3239306239,NL
 3239306240,3239307263,UA
 3239307264,3239308287,EG
@@ -52434,7 +53041,6 @@
 3239539456,3239539711,BE
 3239539712,3239539967,GB
 3239539968,3239540223,SE
-3239540224,3239540479,GR
 3239540480,3239540735,DE
 3239540736,3239540991,GB
 3239540992,3239541247,FR
@@ -52556,7 +53162,6 @@
 3239697920,3239698431,PL
 3239698432,3239706367,DE
 3239706368,3239706623,UA
-3239706624,3239706879,RU
 3239706880,3239707135,NL
 3239707392,3239707647,UA
 3239707648,3239707903,GB
@@ -52669,7 +53274,6 @@
 3239832576,3239834111,RU
 3239834112,3239834623,UA
 3239834624,3239835135,AT
-3239835648,3239836159,RU
 3239836160,3239836671,DK
 3239836672,3239837183,DE
 3239837184,3239837695,SE
@@ -52725,7 +53329,6 @@
 3239883520,3239883775,RU
 3239883776,3239884031,DE
 3239884032,3239884287,RU
-3239884288,3239884543,GB
 3239884544,3239884799,FR
 3239884800,3239885055,UA
 3239885056,3239885311,CH
@@ -52815,7 +53418,6 @@
 3239978752,3239979007,RU
 3239979264,3239979519,GB
 3239979520,3239979775,DE
-3239979776,3239980031,SI
 3239980032,3239996415,DE
 3239996416,3239996671,GB
 3239996672,3239996927,PL
@@ -52882,9 +53484,7 @@
 3240117248,3240118271,EU
 3240118272,3240120319,ES
 3240120320,3240120831,IR
-3240120832,3240125439,GB
-3240125440,3240125695,RO
-3240125696,3240165375,GB
+3240120832,3240165375,GB
 3240165376,3240165887,PL
 3240165888,3240166399,ES
 3240166400,3240166911,PL
@@ -52921,9 +53521,7 @@
 3240184320,3240184831,RU
 3240184832,3240185343,GB
 3240185344,3240185855,FR
-3240185856,3240187391,RU
-3240187392,3240187903,UA
-3240187904,3240188415,RU
+3240185856,3240188415,RU
 3240188416,3240188927,RO
 3240188928,3240189439,MD
 3240189440,3240189951,RO
@@ -52975,7 +53573,6 @@
 3240216064,3240216575,GB
 3240216576,3240217087,RO
 3240217088,3240217599,UA
-3240217600,3240218111,RU
 3240218112,3240218623,UA
 3240218624,3240219135,NL
 3240219136,3240219647,AT
@@ -53089,7 +53686,8 @@
 3240296448,3240296703,RO
 3240296704,3240302847,GB
 3240302848,3240303103,UA
-3240303104,3240304639,GB
+3240303104,3240303359,GB
+3240303616,3240304639,GB
 3240304640,3240305663,RU
 3240305664,3240305919,PL
 3240305920,3240306175,EU
@@ -53236,7 +53834,6 @@
 3240698368,3240698623,GB
 3240698624,3240699135,SI
 3240699136,3240699391,DE
-3240699392,3240699647,UA
 3240699648,3240699903,NO
 3240699904,3240700159,LT
 3240700160,3240700415,AT
@@ -53273,7 +53870,6 @@
 3240719360,3240719871,DE
 3240719872,3240720383,SE
 3240720384,3240720895,DE
-3240720896,3240721407,RO
 3240721408,3240721919,DE
 3240721920,3240722431,RO
 3240722432,3240723455,UA
@@ -53344,7 +53940,6 @@
 3240792576,3240792831,CH
 3240792832,3240793087,PL
 3240793088,3240793343,UA
-3240793344,3240793599,RU
 3240793600,3240794111,FR
 3240794112,3240794367,GB
 3240794368,3240794879,PL
@@ -53504,7 +54099,6 @@
 3241083136,3241084927,CH
 3241084928,3241085183,AP
 3241085184,3241100799,CH
-3241100800,3241101055,UA
 3241101056,3241101311,DK
 3241101312,3241101567,RO
 3241101568,3241101823,DE
@@ -53587,8 +54181,10 @@
 3241499904,3241500159,DE
 3241500160,3241500671,GB
 3241500672,3241501439,BE
-3241501440,3241501695,EU
-3241501696,3241502719,BE
+3241501440,3241501440,GB
+3241501441,3241501695,EU
+3241501696,3241501696,GB
+3241501697,3241502463,BE
 3241503232,3241503487,RS
 3241503488,3241508095,BE
 3241508096,3241508351,NL
@@ -53672,7 +54268,6 @@
 3243509760,3243510015,RU
 3243510016,3243510271,NL
 3243510272,3243511807,CZ
-3243511808,3243512063,GB
 3243512064,3243512319,UA
 3243512320,3243512575,FR
 3243512576,3243512831,UA
@@ -53711,7 +54306,6 @@
 3243527936,3243528191,PL
 3243528192,3243529215,CZ
 3243529216,3243529471,BE
-3243529472,3243529727,GB
 3243529728,3243529983,BG
 3243529984,3243530239,GB
 3243530496,3243530751,FR
@@ -53722,7 +54316,6 @@
 3243532288,3243536383,CZ
 3243536384,3243536639,AT
 3243536896,3243537151,CZ
-3243537152,3243537407,RO
 3243537408,3243537919,CZ
 3243538432,3243544063,CZ
 3243544064,3243544319,GB
@@ -53763,7 +54356,6 @@
 3244100608,3244102655,UA
 3244102656,3244103679,CH
 3244103680,3244104703,BG
-3244104704,3244105727,DE
 3244105728,3244107775,GB
 3244107776,3244108799,RO
 3244108800,3244109823,GB
@@ -54539,7 +55131,7 @@
 3245168640,3245168895,AT
 3245168896,3245169151,RU
 3245169152,3245169407,IT
-3245169408,3245169919,PL
+3245169408,3245169663,PL
 3245169920,3245170175,PT
 3245170176,3245170431,GB
 3245170432,3245170687,CH
@@ -54680,7 +55272,6 @@
 3245251328,3245251583,MT
 3245251584,3245251839,UA
 3245251840,3245252095,NL
-3245252096,3245252351,BE
 3245252352,3245252607,BG
 3245252608,3245253631,UA
 3245253632,3245254143,LV
@@ -54733,7 +55324,6 @@
 3245288960,3245289215,IT
 3245289216,3245289471,AT
 3245289472,3245290495,UA
-3245290496,3245291519,LU
 3245291520,3245292543,DE
 3245292544,3245293567,UA
 3245293568,3245294079,FI
@@ -54798,7 +55388,7 @@
 3245333504,3245334527,SI
 3245334528,3245334783,HU
 3245334784,3245335039,BE
-3245335040,3245335551,GB
+3245335296,3245335551,GB
 3245335552,3245335807,NL
 3245335808,3245336063,RO
 3245336064,3245336575,GB
@@ -54922,7 +55512,6 @@
 3247086592,3247087615,DE
 3247087616,3247088639,IT
 3247088640,3247089663,DE
-3247089664,3247090687,RO
 3247091712,3247092735,RU
 3247092736,3247093759,DE
 3247093760,3247094783,UA
@@ -54979,7 +55568,7 @@
 3247337984,3247338239,UA
 3247338240,3247338495,PL
 3247338496,3247338751,SI
-3247338752,3247339519,GB
+3247339008,3247339519,GB
 3247339520,3247340543,FI
 3247340544,3247340799,UA
 3247340800,3247341055,CH
@@ -54993,7 +55582,7 @@
 3247347456,3247347711,IL
 3247347712,3247347967,FI
 3247347968,3247348223,HU
-3247348224,3247348991,FI
+3247348224,3247348735,FI
 3247348992,3247349247,DE
 3247349248,3247349503,FR
 3247349504,3247349759,UA
@@ -55198,7 +55787,8 @@
 3248522240,3248524287,NO
 3248525312,3248525567,DE
 3248525568,3248525823,DK
-3248525824,3248528895,NO
+3248525824,3248527871,NO
+3248528384,3248528895,NO
 3248528896,3248529151,RU
 3248529152,3248529407,BG
 3248529408,3248540671,NO
@@ -55232,7 +55822,7 @@
 3248752384,3248752639,NL
 3248752640,3248752895,DE
 3248752896,3248753151,TR
-3248753152,3248753663,GB
+3248753408,3248753663,GB
 3248753664,3248753919,FR
 3248753920,3248754431,GB
 3248754432,3248754687,AT
@@ -55250,9 +55840,7 @@
 3248787712,3248787967,CH
 3248787968,3248788223,RU
 3248788224,3248788479,ES
-3248788480,3248788735,FR
-3248788736,3248788991,UA
-3248788992,3248789503,FR
+3248788480,3248789503,FR
 3248789760,3248790015,FR
 3248790016,3248790271,DE
 3248790272,3248790527,DK
@@ -55543,7 +56131,9 @@
 3249845760,3249846271,DE
 3249846272,3249850623,SE
 3249850624,3249850879,GB
-3249850880,3249855487,SE
+3249850880,3249854719,SE
+3249854720,3249854975,US
+3249854976,3249855487,SE
 3249855488,3249856511,NL
 3249856512,3249859583,SE
 3249859584,3249860095,DE
@@ -55649,7 +56239,7 @@
 3250194176,3250194431,DE
 3250194432,3250194687,FR
 3250194688,3250194943,UA
-3250194944,3250195455,RO
+3250194944,3250195199,RO
 3250195456,3250195711,DE
 3250195712,3250196223,GB
 3250196224,3250196479,UA
@@ -55667,7 +56257,7 @@
 3250234112,3250234367,GR
 3250234368,3250239743,AT
 3250239744,3250239999,DE
-3250240000,3250245631,AT
+3250240000,3250241535,AT
 3250245632,3250245887,TR
 3250245888,3250246143,AT
 3250246144,3250246399,GB
@@ -55762,7 +56352,6 @@
 3250417664,3250418175,IT
 3250418176,3250418687,DE
 3250418688,3250419199,PL
-3250419200,3250419711,NO
 3250419712,3250420223,RU
 3250420224,3250420735,IR
 3250420736,3250421247,FR
@@ -55779,7 +56368,6 @@
 3250425344,3250425599,TR
 3250425600,3250425855,FR
 3250425856,3250426111,LT
-3250426112,3250426367,NO
 3250426368,3250426623,AT
 3250426624,3250426879,BE
 3250426880,3250427135,JO
@@ -55794,7 +56382,6 @@
 3250588800,3250588927,CY
 3250588928,3250589183,GB
 3250589184,3250589439,DE
-3250589472,3250589503,NL
 3250589504,3250589567,HR
 3250589568,3250589631,RU
 3250589632,3250589695,NO
@@ -55860,7 +56447,7 @@
 3250748416,3250749439,UA
 3250749440,3250749695,GH
 3250749696,3250749951,EU
-3250749952,3250750463,RO
+3250750208,3250750463,RO
 3250750464,3250750537,FR
 3250750538,3250750541,EU
 3250750542,3250751487,FR
@@ -55884,7 +56471,6 @@
 3250847744,3250978815,DE
 3250978816,3251044351,HR
 3251044352,3251109887,FI
-3251109888,3251110143,SI
 3251110144,3251110655,BG
 3251110656,3251110911,IT
 3251110912,3251111167,FR
@@ -55895,9 +56481,7 @@
 3251112192,3251112447,SK
 3251112448,3251112703,RU
 3251112704,3251112959,SE
-3251112960,3251113215,BG
-3251113216,3251113471,VG
-3251113472,3251113983,BG
+3251112960,3251113983,BG
 3251114496,3251114751,RU
 3251114752,3251115007,RO
 3251115008,3251115263,PL
@@ -55925,7 +56509,6 @@
 3251123712,3251124223,RU
 3251124736,3251125247,FR
 3251125248,3251125759,BE
-3251125760,3251126271,RU
 3251126272,3251126783,UA
 3251126784,3251127295,PL
 3251127296,3251127807,UA
@@ -55976,7 +56559,6 @@
 3251148032,3251148287,RU
 3251148288,3251148543,EU
 3251148544,3251148799,UA
-3251148800,3251149055,HU
 3251149056,3251149311,NL
 3251149312,3251149567,DE
 3251149568,3251149823,IE
@@ -56035,7 +56617,6 @@
 3251165696,3251165951,DE
 3251165952,3251166207,UA
 3251166208,3251166463,CH
-3251166464,3251166719,RU
 3251166720,3251166975,FR
 3251166976,3251167231,CH
 3251167232,3251167487,LV
@@ -56053,15 +56634,12 @@
 3251171328,3251171839,DE
 3251171840,3251172095,RO
 3251172096,3251172351,ES
-3251172352,3251172607,RO
 3251172608,3251172863,GB
 3251172864,3251173119,UA
 3251173120,3251173375,SA
 3251173376,3251173631,UA
 3251173632,3251173887,DE
 3251173888,3251174143,DK
-3251174144,3251174399,RU
-3251174400,3251174655,RO
 3251174656,3251174911,DE
 3251174912,3251175167,RO
 3251175168,3251175423,UA
@@ -56146,10 +56724,8 @@
 3251213760,3251213823,CY
 3251213824,3251213887,GB
 3251213888,3251214015,CY
-3251214016,3251214079,UA
 3251214080,3251214143,CY
 3251214144,3251214207,AF
-3251214208,3251214271,RU
 3251214272,3251214335,DE
 3251214336,3251214463,RU
 3251214464,3251214591,UA
@@ -56193,7 +56769,6 @@
 3251234816,3251235839,RO
 3251235840,3251236863,DE
 3251236864,3251237887,BG
-3251237888,3251238911,DK
 3251238912,3251239935,FR
 3251239936,3251240959,EU
 3251240960,3251241215,BE
@@ -56260,7 +56835,6 @@
 3251315712,3251317759,RU
 3251317760,3251318783,PL
 3251318784,3251319807,UA
-3251319808,3251320831,HU
 3251320832,3251321855,PL
 3251321856,3251322879,RU
 3251322880,3251331319,GB
@@ -56349,8 +56923,8 @@
 3252289792,3252291327,GR
 3252291328,3252291583,SK
 3252291584,3252293631,FR
-3252293632,3252297983,DE
-3252297984,3252313599,GR
+3252293632,3252297727,DE
+3252297728,3252313599,GR
 3252313600,3252313855,SI
 3252313856,3252314111,DE
 3252314112,3252314623,GR
@@ -56398,7 +56972,7 @@
 3252355072,3252355327,GB
 3252355328,3252356351,LT
 3252356352,3252356863,EU
-3252356864,3252358911,LT
+3252357120,3252358911,LT
 3252358912,3252359167,DE
 3252359168,3252362239,DK
 3252362240,3252362495,PL
@@ -56428,7 +57002,6 @@
 3252385280,3252385535,GB
 3252385536,3252385791,RO
 3252385792,3252386047,GB
-3252386048,3252386303,SI
 3252386304,3252386559,GB
 3252386560,3252386815,BE
 3252386816,3252387071,UA
@@ -56439,9 +57012,7 @@
 3252404224,3252405759,NO
 3252405760,3252409663,LT
 3252409664,3252409679,CD
-3252409680,3252409791,LT
-3252409792,3252409823,BI
-3252409824,3252415487,LT
+3252409680,3252415487,LT
 3252415488,3252415743,US
 3252415744,3252421631,LT
 3252421632,3252423679,NO
@@ -56543,7 +57114,6 @@
 3252642816,3252643071,NL
 3252643072,3252643327,RO
 3252643328,3252643583,CH
-3252643584,3252643839,AT
 3252643840,3252682751,CH
 3252682752,3252813823,HU
 3252813824,3252830207,RO
@@ -56563,7 +57133,7 @@
 3252906496,3252906751,GB
 3252906752,3252907007,FR
 3252907008,3252907263,AT
-3252907264,3252907775,RO
+3252907520,3252907775,RO
 3252907776,3252908031,GB
 3252908032,3252908287,PL
 3252908288,3252908543,AT
@@ -56572,7 +57142,6 @@
 3252909312,3252909567,DE
 3252909568,3252909823,GB
 3252909824,3252910335,UA
-3252910336,3252910591,NL
 3252910848,3252911103,PL
 3252911104,3252911359,DE
 3252911360,3252911615,RU
@@ -56623,7 +57192,6 @@
 3252982016,3252982271,RO
 3252982272,3252982527,DE
 3252982528,3252982783,FR
-3252982784,3252983039,UA
 3252983040,3252983551,DE
 3252983552,3252983807,SI
 3252983808,3252984063,BG
@@ -56652,7 +57220,9 @@
 3253388288,3253388799,FR
 3253388800,3253389055,SE
 3253389056,3253389823,FR
-3253389824,3253398271,SE
+3253389824,3253395455,SE
+3253395456,3253395967,IT
+3253395968,3253398271,SE
 3253398272,3253398783,FR
 3253398784,3253399039,SE
 3253399040,3253399295,FR
@@ -56708,8 +57278,7 @@
 3253462528,3253463039,US
 3253463040,3253464063,GB
 3253464064,3253469183,SE
-3253469184,3253471231,AO
-3253471232,3253534719,PT
+3253469184,3253534719,PT
 3253534720,3253600255,GB
 3253601280,3253602303,FI
 3253602304,3253603327,DE
@@ -56755,7 +57324,6 @@
 3253646336,3253647359,PL
 3253647360,3253648383,DK
 3253648384,3253649407,IL
-3253649408,3253650431,UA
 3253650432,3253651455,DE
 3253651456,3253652479,PL
 3253652480,3253653503,LI
@@ -56764,7 +57332,6 @@
 3253657600,3253658623,UA
 3253658624,3253659647,DE
 3253659648,3253660671,GB
-3253660672,3253661695,NO
 3253661696,3253662719,NL
 3253662720,3253663743,RO
 3253663744,3253664767,NL
@@ -57225,7 +57792,6 @@
 3254838016,3254838271,GE
 3254838528,3254838783,CH
 3254838784,3254839039,AT
-3254839040,3254839295,RU
 3254839296,3254839551,DE
 3254839552,3254839807,PL
 3254839808,3254840063,BE
@@ -57272,7 +57838,7 @@
 3254888960,3254889471,RU
 3254889472,3254890495,SK
 3254890496,3254890751,DE
-3254891008,3254891519,RO
+3254891008,3254891263,RO
 3254891520,3254891775,GB
 3254891776,3254892031,DE
 3254892032,3254892287,GB
@@ -57436,7 +58002,7 @@
 3255236608,3255236863,GB
 3255236864,3255237119,DE
 3255237120,3255237375,AT
-3255237376,3255237887,SE
+3255237632,3255237887,SE
 3255237888,3255238143,ES
 3255238144,3255238399,GB
 3255238400,3255238655,QA
@@ -57467,7 +58033,6 @@
 3255318272,3255318527,RU
 3255318528,3255318783,UA
 3255318784,3255319295,DE
-3255319296,3255319551,UA
 3255319552,3255319807,BG
 3255319808,3255320063,AT
 3255320064,3255320319,BE
@@ -57530,7 +58095,6 @@
 3255382528,3255383039,UA
 3255383040,3255383551,PL
 3255383552,3255384063,CH
-3255384064,3255384575,RO
 3255384576,3255385087,AT
 3255385088,3255385599,RO
 3255385600,3255386111,FR
@@ -57675,7 +58239,6 @@
 3256353536,3256385535,CH
 3256385536,3256393727,AT
 3256393728,3256394239,DE
-3256394240,3256394751,UA
 3256394752,3256395263,PL
 3256395264,3256395775,GB
 3256395776,3256396287,TR
@@ -57822,7 +58385,6 @@
 3256792490,3256792490,EU
 3256792491,3256792575,CH
 3256792576,3256792831,NL
-3256792832,3256793087,DE
 3256793088,3256793343,GB
 3256793344,3256793599,DE
 3256793600,3256793855,GB
@@ -58017,7 +58579,6 @@
 3257548800,3257554943,GB
 3257554944,3257555199,CH
 3257555200,3257556991,GB
-3257556992,3257557503,MW
 3257557504,3257558015,LU
 3257558016,3257559551,RO
 3257559552,3257560063,UA
@@ -58138,7 +58699,6 @@
 3258074112,3258074879,DE
 3258074880,3258075135,IL
 3258075136,3258075391,RO
-3258075392,3258075647,BG
 3258075648,3258075903,FR
 3258075904,3258076159,PL
 3258076160,3258076415,BG
@@ -58157,7 +58717,6 @@
 3258080000,3258080255,BE
 3258080256,3258080511,FR
 3258080512,3258080767,DE
-3258080768,3258081023,GB
 3258081024,3258081279,FR
 3258081280,3258081535,NL
 3258081536,3258081791,BE
@@ -58291,7 +58850,7 @@
 3258504960,3258505215,IL
 3258505216,3258506495,CH
 3258506496,3258506751,DE
-3258506752,3258515455,CH
+3258507008,3258515455,CH
 3258515456,3258580991,FR
 3258580992,3258646527,RU
 3258646528,3258690559,DE
@@ -58375,7 +58934,7 @@
 3258904064,3258941439,GB
 3258941440,3258943487,PL
 3258943488,3258944511,BG
-3258944512,3258946559,RU
+3258944512,3258945535,RU
 3258946560,3258947583,CH
 3258948608,3258949631,RU
 3258949632,3258972159,GR
@@ -58523,7 +59082,6 @@
 3260547840,3260548095,PL
 3260548096,3260548351,IE
 3260548352,3260548607,DK
-3260548608,3260548863,RO
 3260548864,3260549119,CH
 3260549120,3260549375,AT
 3260549376,3260549631,CH
@@ -58567,7 +59125,6 @@
 3260602880,3260603903,UA
 3260603904,3260604415,FR
 3260604416,3260604927,PL
-3260604928,3260605439,RO
 3260605440,3260605951,BG
 3260605952,3260606463,NL
 3260606464,3260607487,SE
@@ -58813,7 +59370,7 @@
 3262050816,3262051071,CH
 3262051072,3262051583,GB
 3262051584,3262051839,FR
-3262051840,3262052351,DE
+3262052096,3262052351,DE
 3262052352,3262052607,UA
 3262052608,3262052863,IL
 3262052864,3262053119,GB
@@ -58878,7 +59435,7 @@
 3262152704,3262185471,AT
 3262185472,3262200575,DE
 3262200576,3262200831,EU
-3262200832,3262224895,DE
+3262200832,3262224383,DE
 3262224896,3262225151,AT
 3262225152,3262227711,DE
 3262227712,3262227967,RO
@@ -58941,13 +59498,11 @@
 3262440960,3262441471,IL
 3262441472,3262441983,UA
 3262441984,3262442495,DE
-3262442496,3262443007,RO
 3262443008,3262443519,UA
 3262443520,3262444031,ES
 3262444032,3262444543,AT
 3262444544,3262445055,UA
 3262445056,3262445567,RO
-3262445568,3262446079,PL
 3262446592,3262447103,PL
 3262447104,3262447615,GB
 3262447616,3262460415,PT
@@ -59149,7 +59704,6 @@
 3263074816,3263075327,RO
 3263075328,3263075839,IT
 3263075840,3263076351,SE
-3263076352,3263076863,RO
 3263077376,3263077887,FR
 3263077888,3263078399,DE
 3263079424,3263080447,PL
@@ -59295,7 +59849,6 @@
 3264017920,3264018175,NL
 3264018176,3264018431,FR
 3264018432,3264018687,HU
-3264018688,3264018943,GB
 3264018944,3264019199,PL
 3264019200,3264019967,GB
 3264019968,3264020223,AT
@@ -59396,7 +59949,9 @@
 3264345088,3264346111,NL
 3264346112,3264347135,SE
 3264347136,3264348159,DE
-3264348160,3264375039,FR
+3264348160,3264372223,FR
+3264372224,3264372735,EU
+3264372736,3264375039,FR
 3264375040,3264376063,SE
 3264376064,3264376319,HR
 3264376320,3264376575,UA
@@ -60212,9 +60767,7 @@
 3268242880,3268243071,GB
 3268243072,3268243327,EU
 3268243328,3268243391,GB
-3268243392,3268243743,EU
-3268243744,3268243775,GB
-3268243776,3268244775,EU
+3268243392,3268244775,EU
 3268244776,3268244783,GB
 3268244784,3268244791,EU
 3268244792,3268244799,GB
@@ -60326,7 +60879,9 @@
 3268271912,3268271919,GB
 3268271920,3268271927,EU
 3268271928,3268271935,GB
-3268271936,3268272703,EU
+3268271936,3268272639,EU
+3268272640,3268272671,GB
+3268272672,3268272703,EU
 3268272704,3268272711,GB
 3268272712,3268272727,EU
 3268272728,3268272735,GB
@@ -60635,7 +61190,6 @@
 3270650624,3270651391,FR
 3270651392,3270651647,DE
 3270651648,3270651903,FR
-3270651904,3270652415,IT
 3270652416,3270652671,DK
 3270652672,3270652927,CH
 3270652928,3270653183,PL
@@ -60795,7 +61349,8 @@
 3271740416,3271740927,UA
 3271740928,3271741439,RU
 3271741440,3271741951,PL
-3271741952,3271743999,RU
+3271741952,3271742463,RU
+3271742976,3271743999,RU
 3271744000,3271744511,RO
 3271744512,3271745023,AT
 3271745024,3271745535,PL
@@ -60807,7 +61362,6 @@
 3271748096,3271748607,GR
 3271748608,3271749119,UA
 3271749120,3271750143,RU
-3271750144,3271750655,UA
 3271750656,3271751167,GB
 3271751168,3271751679,RO
 3271751680,3271752191,NL
@@ -60872,7 +61426,6 @@
 3271927296,3271927551,NO
 3271927552,3271927807,GB
 3271928064,3271928319,GB
-3271928320,3271928575,RU
 3271928576,3271928831,CH
 3271928832,3271929087,IE
 3271929088,3271929343,LB
@@ -60940,7 +61493,7 @@
 3272110080,3272110335,SE
 3272110336,3272110591,CH
 3272110848,3272111103,LV
-3272111104,3272111871,GB
+3272111104,3272111615,GB
 3272111872,3272112383,RO
 3272112384,3272113151,DE
 3272113152,3272113407,FR
@@ -61079,8 +61632,7 @@
 3272221952,3272222207,GB
 3272222208,3272222463,ES
 3272222464,3272222719,NL
-3272222720,3272222975,EU
-3272222976,3272223015,GB
+3272222720,3272223015,GB
 3272223016,3272223023,EU
 3272223024,3272223039,GB
 3272223040,3272223231,EU
@@ -61089,16 +61641,10 @@
 3272223504,3272223519,EU
 3272223520,3272223551,HK
 3272223552,3272223743,EU
-3272223744,3272223775,GI
-3272223776,3272223807,EU
-3272223808,3272223815,CY
-3272223816,3272223823,EU
-3272223824,3272223839,GB
-3272223840,3272223999,EU
-3272224000,3272224255,GB
-3272224256,3272224383,GI
-3272224384,3272224511,EU
-3272224512,3272225279,GB
+3272223744,3272224255,GB
+3272224256,3272224767,EU
+3272224768,3272225023,GB
+3272225024,3272225279,EU
 3272225280,3272225535,IT
 3272225536,3272225791,GB
 3272225792,3272225855,EU
@@ -61143,7 +61689,6 @@
 3272265216,3272265471,AT
 3272265472,3272265727,DK
 3272265728,3272265983,DE
-3272265984,3272266239,GB
 3272266240,3272266495,UA
 3272266496,3272266751,SE
 3272266752,3272267007,NL
@@ -61208,7 +61753,6 @@
 3272476160,3272476415,RO
 3272476672,3272476927,DE
 3272476928,3272477183,GR
-3272477184,3272477439,GB
 3272477440,3272477695,PL
 3272477696,3272477951,RU
 3272477952,3272478207,RO
@@ -61248,7 +61792,6 @@
 3272540160,3272605695,CH
 3272605696,3272613887,BE
 3272613888,3272622079,RU
-3272622080,3272623103,RO
 3272623104,3272624127,DE
 3272624128,3272625151,RU
 3272625152,3272626175,UA
@@ -61309,7 +61852,6 @@
 3272903424,3272903679,AT
 3272903680,3272904191,RU
 3272904192,3272904447,SI
-3272904448,3272904703,BE
 3272904704,3272904959,NL
 3272904960,3272905215,RO
 3272905216,3272905727,CH
@@ -61355,7 +61897,7 @@
 3273029888,3273029897,GB
 3273029898,3273029898,EU
 3273029899,3273030143,GB
-3273030144,3273030655,RU
+3273030400,3273030655,RU
 3273030656,3273031679,PL
 3273031680,3273032191,GB
 3273032192,3273033215,UA
@@ -61642,7 +62184,6 @@
 3273392128,3273392639,PL
 3273392640,3273393663,RO
 3273394176,3273394687,RO
-3273394688,3273395199,RU
 3273395200,3273395711,DE
 3273395712,3273396223,RU
 3273396224,3273396735,PL
@@ -62242,7 +62783,6 @@
 3275117582,3275117582,EU
 3275117583,3275120639,DK
 3275120640,3275137023,SE
-3275137024,3275137535,DE
 3275137536,3275138047,UA
 3275138048,3275138559,DE
 3275138560,3275139071,UA
@@ -62394,8 +62934,8 @@
 3275485232,3275485247,EU
 3275485248,3275485375,GB
 3275485376,3275485407,EU
-3275485408,3275485415,GB
-3275485416,3275485439,EU
+3275485408,3275485423,GB
+3275485424,3275485439,EU
 3275485440,3275485695,GB
 3275485696,3275488767,EU
 3275488768,3275489279,CZ
@@ -62468,7 +63008,7 @@
 3275537920,3275538431,IT
 3275538432,3275539455,CH
 3275539456,3275540479,GB
-3275540480,3275542527,UA
+3275540480,3275541503,UA
 3275542528,3275543551,DE
 3275543552,3275544575,NL
 3275544576,3275545599,PL
@@ -62534,7 +63074,6 @@
 3275751936,3275759615,AT
 3275759616,3275775999,NL
 3275776000,3275784191,DE
-3275784192,3275784703,RO
 3275784704,3275785215,PL
 3275785216,3275785727,RO
 3275785728,3275786239,CH
@@ -62546,7 +63085,6 @@
 3275788800,3275789311,AT
 3275789312,3275789823,UA
 3275789824,3275790335,PL
-3275790336,3275790847,MD
 3275790848,3275791359,UA
 3275791360,3275791871,RU
 3275791872,3275792383,PL
@@ -62595,7 +63133,6 @@
 3275904000,3275904255,RU
 3275904256,3275904511,CH
 3275904512,3275904767,PL
-3275904768,3275905023,RU
 3275905024,3275905279,PL
 3275905280,3275905535,RU
 3275905536,3275905791,NL
@@ -63046,7 +63583,6 @@
 3277160448,3277176831,NL
 3277176832,3277177087,SI
 3277177088,3277177343,GB
-3277177344,3277177599,RO
 3277177600,3277178111,PL
 3277178368,3277178623,UA
 3277178624,3277178879,PL
@@ -63201,7 +63737,6 @@
 3277380608,3277381119,RU
 3277381120,3277381631,KW
 3277381632,3277382143,RU
-3277382144,3277382655,MD
 3277382656,3277383167,GB
 3277383680,3277384191,PL
 3277384704,3277385215,GB
@@ -63223,10 +63758,11 @@
 3277403216,3277403231,GB
 3277403232,3277403279,FR
 3277403280,3277403295,DE
-3277403296,3277403391,GB
-3277403392,3277403407,FR
-3277403408,3277403423,GB
-3277403424,3277403439,FR
+3277403296,3277403311,FR
+3277403312,3277403327,GB
+3277403328,3277403359,FR
+3277403360,3277403391,GB
+3277403392,3277403439,FR
 3277403440,3277403647,GB
 3277403648,3277403807,ES
 3277403808,3277404159,GB
@@ -63235,8 +63771,8 @@
 3277404512,3277404527,GB
 3277404528,3277404649,IT
 3277404650,3277404671,GB
-3277404672,3277404719,CH
-3277404720,3277404943,GB
+3277404672,3277404735,CH
+3277404736,3277404943,GB
 3277404944,3277404959,NL
 3277404960,3277405183,GB
 3277405184,3277405263,SE
@@ -63363,7 +63899,6 @@
 3277821952,3277822207,RO
 3277822208,3277822463,ES
 3277822464,3277822719,PL
-3277822720,3277822975,RU
 3277822976,3277823231,SG
 3277823232,3277823487,UA
 3277823488,3277823743,SI
@@ -63625,7 +64160,6 @@
 3279030272,3279030783,RU
 3279030784,3279031295,DE
 3279031296,3279031807,NL
-3279031808,3279032319,RO
 3279032320,3279032831,HU
 3279032832,3279033343,FR
 3279033344,3279033855,RU
@@ -63641,7 +64175,6 @@
 3279054336,3279054847,GB
 3279054848,3279055359,RU
 3279055360,3279055871,SA
-3279056384,3279056895,GB
 3279056896,3279057151,RU
 3279057152,3279057407,GB
 3279057408,3279057919,FR
@@ -63651,8 +64184,7 @@
 3279060480,3279060991,PL
 3279060992,3279069183,UA
 3279069184,3279077375,PL
-3279077376,3279084543,ES
-3279084544,3279085567,IT
+3279077376,3279085567,ES
 3279085568,3279089663,NL
 3279089664,3279093759,KG
 3279093760,3279123455,FR
@@ -63804,7 +64336,6 @@
 3280128000,3280128255,SE
 3280128256,3280128511,GB
 3280128512,3280129023,HU
-3280129024,3280129279,RU
 3280129280,3280129535,LV
 3280129536,3280129791,SA
 3280129792,3280130047,FR
@@ -63890,7 +64421,6 @@
 3280586240,3280586751,DE
 3280586752,3280587263,RU
 3280587264,3280587775,UA
-3280587776,3280588287,RO
 3280588288,3280588799,UA
 3280588800,3280589311,PL
 3280589312,3280590335,DE
@@ -63954,7 +64484,7 @@
 3280662528,3280666623,DE
 3280666624,3280732159,NO
 3280732160,3280764927,DE
-3280764928,3280765951,TJ
+3280764928,3280765183,TJ
 3280765952,3280766975,DK
 3280766976,3280767999,AT
 3280768000,3280769023,FR
@@ -64069,7 +64599,6 @@
 3281338368,3281338623,PL
 3281338624,3281338879,SA
 3281338880,3281339135,FR
-3281339136,3281339391,RO
 3281339392,3281339647,PL
 3281339648,3281339903,GB
 3281339904,3281340159,UA
@@ -64113,7 +64642,6 @@
 3281351680,3281351935,TR
 3281351936,3281352191,UA
 3281352192,3281352447,PL
-3281352448,3281352703,RO
 3281352704,3281352959,EU
 3281352960,3281353215,GB
 3281353216,3281353471,DE
@@ -64376,7 +64904,6 @@
 3283487744,3283487999,CH
 3283488000,3283488255,NL
 3283488256,3283488511,PL
-3283488512,3283488767,RU
 3283488768,3283489279,FR
 3283489280,3283489535,DE
 3283489536,3283489791,PL
@@ -64531,7 +65058,7 @@
 3283985920,3283986431,AT
 3283986944,3283987455,AT
 3283987456,3283987967,GB
-3283987968,3283988991,RO
+3283988480,3283988991,RO
 3283988992,3283989503,FR
 3283989504,3283990015,RU
 3283990016,3283990527,SE
@@ -64621,7 +65148,6 @@
 3284047616,3284047871,NL
 3284047872,3284048127,UA
 3284048128,3284048383,DK
-3284048384,3284048639,GB
 3284048640,3284049151,FR
 3284049152,3284049407,UA
 3284049408,3284049663,SI
@@ -64769,7 +65295,7 @@
 3284684288,3284684799,FR
 3284684800,3284685311,DE
 3284685312,3284685823,NL
-3284685824,3284686335,US
+3284685824,3284686335,DE
 3284686336,3284686847,RO
 3284686848,3284687359,PL
 3284687360,3284687871,UA
@@ -65078,7 +65604,9 @@
 3285912448,3285913647,EU
 3285913648,3285913655,IE
 3285913656,3285913659,GB
-3285913660,3285917695,EU
+3285913660,3285913663,EU
+3285913664,3285913679,GB
+3285913680,3285917695,EU
 3285917696,3285917703,GB
 3285917704,3285919743,EU
 3285919744,3285921791,QA
@@ -65088,7 +65616,9 @@
 3285926432,3285926463,CH
 3285926464,3285928303,EU
 3285928304,3285928311,GB
-3285928312,3285935871,EU
+3285928312,3285931527,EU
+3285931528,3285931535,DE
+3285931536,3285935871,EU
 3285935872,3285936127,GB
 3285936128,3285939135,EU
 3285939136,3285939175,GB
@@ -65341,7 +65871,6 @@
 3286921216,3286922239,UA
 3286922240,3286923263,GB
 3286923264,3286924287,CM
-3286924288,3286925311,UA
 3286925312,3286925823,DE
 3286925824,3286926079,RO
 3286926080,3286926335,LV
@@ -65441,7 +65970,6 @@
 3287173120,3287173631,RU
 3287173632,3287174143,NL
 3287174144,3287174655,SE
-3287174656,3287175167,GB
 3287175168,3287176191,RO
 3287176192,3287176703,BG
 3287176704,3287177215,NL
@@ -65473,7 +66001,6 @@
 3287215616,3287215871,DE
 3287215872,3287216127,RU
 3287216128,3287216639,GB
-3287216640,3287216895,MD
 3287217152,3287217407,NL
 3287217408,3287217663,PL
 3287217664,3287217919,RU
@@ -65547,7 +66074,6 @@
 3287462656,3287462911,UA
 3287462912,3287463167,FR
 3287463168,3287463423,IT
-3287463424,3287463679,RO
 3287463680,3287463935,PL
 3287463936,3287464191,AT
 3287464192,3287464447,SK
@@ -65606,7 +66132,6 @@
 3287637504,3287638015,PL
 3287638528,3287639039,DE
 3287639040,3287639551,GB
-3287639552,3287640063,RU
 3287640064,3287640575,PL
 3287640576,3287641087,SI
 3287641088,3287641599,EU
@@ -65722,7 +66247,6 @@
 3287740416,3287740927,BG
 3287740928,3287741439,RO
 3287741440,3287741951,CH
-3287742464,3287742975,RU
 3287742976,3287743487,RO
 3287743488,3287743999,DE
 3287744000,3287744511,FR
@@ -65822,7 +66346,6 @@
 3287956480,3287956735,BG
 3287956736,3287956991,SE
 3287956992,3287957247,UA
-3287957248,3287957503,GB
 3287957504,3287965695,AM
 3287965696,3287973887,RS
 3287973888,3287982079,CZ
@@ -65935,7 +66458,7 @@
 3288514560,3288522751,EG
 3288530944,3288532991,JM
 3288532992,3288534527,PR
-3288534528,3288535039,EG
+3288534528,3288535039,MG
 3288535040,3288539135,CW
 3288539136,3288543487,US
 3288543488,3288543743,AP
@@ -66229,7 +66752,8 @@
 3291287552,3291291647,ZA
 3291291648,3291295743,TZ
 3291295744,3291299839,NG
-3291299840,3291316223,ZA
+3291299840,3291315199,ZA
+3291315200,3291316223,UG
 3291316224,3291324415,TZ
 3291324416,3291325439,AO
 3291325440,3291326463,BW
@@ -66284,17 +66808,11 @@
 3291435008,3291439103,A2
 3291439104,3291447295,NG
 3291447296,3291463679,CI
-3291480064,3291482111,DE
-3291482112,3291484159,SC
-3291484160,3291488255,DE
+3291480064,3291488255,DE
 3291488256,3291496447,SC
-3291496448,3291504639,US
-3291504640,3291508735,SC
-3291508736,3291512831,US
+3291496448,3291512831,US
 3291512832,3291529215,SC
-3291529216,3291533311,US
-3291533312,3291535359,SC
-3291535360,3291545599,US
+3291529216,3291545599,US
 3291545600,3291545855,CI
 3291545856,3291546111,GM
 3291742208,3292004351,US
@@ -66314,22 +66832,17 @@
 3301181440,3301182463,SE
 3301182464,3301212159,SC
 3301212160,3301214207,SE
-3301214208,3301244927,SC
+3301214208,3301215231,SC
+3301215232,3301216255,SE
+3301216256,3301244927,SC
 3301244928,3301246975,SE
 3301246976,3301311487,SC
-3301311488,3301312511,SA
-3301312512,3301313535,SE
-3301313536,3301318655,SC
-3301318656,3301324799,SE
-3301324800,3301326847,SA
-3301326848,3301330943,SE
-3301330944,3301335039,SC
-3301335040,3301343231,SE
-3301343232,3301345279,SC
-3301345280,3301365759,SE
-3301365760,3301367807,SC
-3301367808,3301371903,SE
-3301371904,3301441535,SC
+3301311488,3301313535,SE
+3301313536,3301314559,SC
+3301314560,3301315583,SE
+3301315584,3301318655,SC
+3301318656,3301375999,SE
+3301376000,3301441535,SC
 3301441536,3301445631,ZA
 3301445632,3301453823,KE
 3301453824,3301457919,ML
@@ -66414,6 +66927,7 @@
 3302544384,3302544639,CM
 3302544640,3302544895,MU
 3302544896,3302545151,GH
+3302545152,3302545407,ZA
 3302548480,3302548991,GH
 3302548992,3302549503,ZA
 3302549504,3302550015,KE
@@ -66478,9 +66992,7 @@
 3302957312,3302957567,MZ
 3302957568,3302957823,GM
 3304062976,3304456191,SC
-3304456192,3304464383,NG
-3304464384,3304468479,SC
-3304468480,3304521727,NG
+3304456192,3304521727,NG
 3304521728,3304587263,SC
 3304587264,3305111551,ZA
 3305111552,3305130239,TN
@@ -66654,7 +67166,7 @@
 3320307712,3320308735,CV
 3320308736,3320309759,LY
 3320309760,3320310783,ZA
-3320310784,3320311807,SD
+3320310784,3320311807,SS
 3320311808,3320312831,BJ
 3320312832,3320313855,ZM
 3320313856,3320314879,BI
@@ -66959,7 +67471,11 @@
 3325224672,3325224675,US
 3325224676,3325225671,CA
 3325225672,3325225675,US
-3325225676,3325229591,CA
+3325225676,3325226592,CA
+3325226593,3325226593,US
+3325226594,3325226949,CA
+3325226950,3325226950,US
+3325226951,3325229591,CA
 3325229592,3325229599,US
 3325229600,3325230319,CA
 3325230320,3325230323,US
@@ -67186,7 +67702,9 @@
 3328617984,3328618239,CA
 3328618240,3328629503,US
 3328629504,3328629759,EU
-3328629760,3328630783,US
+3328629760,3328630015,US
+3328630016,3328630271,CA
+3328630272,3328630783,US
 3328630784,3328631807,CA
 3328631808,3328638975,US
 3328638976,3328704511,CA
@@ -67200,15 +67718,15 @@
 3328826815,3330621183,US
 3330621184,3330623743,CA
 3330623744,3330624255,US
+3330624256,3330624511,CA
 3330624512,3330625535,US
 3330625536,3330627071,GB
 3330627072,3330640895,US
 3330640896,3330641151,CH
-3330641152,3330641663,US
-3330641920,3330646527,US
+3330641152,3330646527,US
 3330646528,3330647295,CA
 3330647296,3330647807,US
-3330648064,3330649343,US
+3330648064,3330649599,US
 3330649600,3330649855,CA
 3330649856,3330662911,US
 3330662912,3330663167,GB
@@ -67222,8 +67740,7 @@
 3330726656,3330726911,CA
 3330726912,3330754559,US
 3330754560,3330754815,CA
-3330754816,3330755071,US
-3330755328,3330763519,US
+3330754816,3330763519,US
 3330763520,3330763775,CA
 3330763776,3330765823,US
 3330765824,3330766335,CA
@@ -67285,7 +67802,9 @@
 3331798272,3331798527,AU
 3331798528,3331818495,US
 3331818496,3331818751,MX
-3331818752,3331853823,US
+3331818752,3331840111,US
+3331840112,3331840115,CA
+3331840116,3331853823,US
 3331853824,3331854079,AP
 3331854080,3331868161,US
 3331868162,3331868162,EU
@@ -67310,6 +67829,7 @@
 3332440320,3332460543,CA
 3332460544,3332460799,US
 3332460800,3332461311,CA
+3332461312,3332461567,US
 3332461568,3332462335,CA
 3332462336,3332462591,US
 3332462592,3332473855,CA
@@ -67461,7 +67981,7 @@
 3334006528,3334006783,NL
 3334006784,3334007551,US
 3334007552,3334007807,EU
-3334007808,3334019583,US
+3334007808,3334020095,US
 3334020096,3334021119,CA
 3334021120,3334138623,US
 3334138624,3334138879,BM
@@ -67825,8 +68345,8 @@
 3343109120,3343127551,US
 3343127552,3343127807,GB
 3343127808,3343153151,US
-3343153152,3343155199,CA
-3343155200,3343167487,US
+3343153152,3343154943,CA
+3343154944,3343167487,US
 3343167488,3343169535,CA
 3343169536,3343171583,US
 3343171584,3343172607,BM
@@ -68064,6 +68584,7 @@
 3349545984,3349551103,CA
 3349551104,3349553663,US
 3349553664,3349608447,CA
+3349608448,3349609471,US
 3349609472,3349610239,CA
 3349610240,3349614591,US
 3349614592,3349617663,CA
@@ -68543,7 +69064,7 @@
 3355905536,3355905791,PY
 3355905792,3355906047,AR
 3355906048,3355910143,CL
-3355910144,3355918335,CW
+3355910144,3355918335,SX
 3355918336,3355923455,EC
 3355923456,3355924479,UY
 3355924480,3355926527,TT
@@ -68762,8 +69283,8 @@
 3356338176,3356339967,SV
 3356339968,3356341247,HN
 3356341248,3356341759,SV
-3356341760,3356342015,HN
-3356342016,3356343039,SV
+3356341760,3356342271,HN
+3356342272,3356343039,SV
 3356343040,3356343551,HN
 3356343552,3356344319,SV
 3356344320,3356360703,CO
@@ -68911,7 +69432,9 @@
 3357452800,3357453055,NI
 3357453056,3357453071,GT
 3357453072,3357453079,SV
-3357453080,3357453311,GT
+3357453080,3357453135,GT
+3357453136,3357453151,SV
+3357453152,3357453311,GT
 3357453312,3357453567,HN
 3357453568,3357454591,GT
 3357454592,3357454847,NI
@@ -68952,7 +69475,9 @@
 3357479216,3357479223,CO
 3357479224,3357479551,AR
 3357479552,3357479679,CO
-3357479680,3357479871,AR
+3357479680,3357479863,AR
+3357479864,3357479867,CO
+3357479868,3357479871,AR
 3357479872,3357479879,CO
 3357479880,3357480103,AR
 3357480104,3357480111,CO
@@ -69019,7 +69544,9 @@
 3358131984,3358132031,CO
 3358132032,3358132087,AR
 3358132088,3358132095,CO
-3358132096,3358132607,AR
+3358132096,3358132127,AR
+3358132128,3358132135,CO
+3358132136,3358132607,AR
 3358132608,3358132735,CO
 3358132736,3358132991,AR
 3358132992,3358133119,EC
@@ -69040,8 +69567,8 @@
 3358150424,3358150431,CO
 3358150432,3358150495,AR
 3358150496,3358150655,CO
-3358150656,3358150783,EC
-3358150784,3358151263,AR
+3358150656,3358150911,EC
+3358150912,3358151263,AR
 3358151264,3358151271,EC
 3358151272,3358151423,AR
 3358151424,3358151551,EC
@@ -69062,8 +69589,8 @@
 3358153600,3358153663,PR
 3358153664,3358153703,AR
 3358153704,3358153711,PR
-3358153712,3358153855,AR
-3358153856,3358153983,EC
+3358153712,3358153727,AR
+3358153728,3358153983,EC
 3358153984,3358154239,US
 3358154240,3358154751,CL
 3358154752,3358158847,PE
@@ -69084,7 +69611,9 @@
 3358457856,3358523391,PA
 3358523392,3358529535,VE
 3358529536,3358530303,AR
-3358530304,3358534399,VE
+3358530304,3358532607,VE
+3358532608,3358532863,AR
+3358532864,3358534399,VE
 3358534400,3358534655,AR
 3358534656,3358535167,VE
 3358535168,3358535679,AR
@@ -69287,12 +69816,16 @@
 3360399360,3360403455,BO
 3360405504,3360407551,HN
 3360407552,3360423935,PA
-3360423936,3360686079,MX
-3360686080,3360705791,AR
-3360705792,3360706047,US
+3360423936,3360456447,MX
+3360456448,3360456703,US
+3360456704,3360686079,MX
+3360686080,3360705535,AR
+3360705536,3360706047,US
 3360706048,3360707071,AR
 3360707072,3360707327,US
-3360707328,3360708223,AR
+3360707328,3360707583,AR
+3360707584,3360708095,US
+3360708096,3360708223,AR
 3360708224,3360708351,US
 3360708352,3360708991,AR
 3360708992,3360709247,US
@@ -69330,7 +69863,9 @@
 3361071456,3361071471,CO
 3361071472,3361071631,VE
 3361071632,3361071635,CO
-3361071636,3361072767,VE
+3361071636,3361072127,VE
+3361072128,3361072639,CO
+3361072640,3361072767,VE
 3361072768,3361072895,CO
 3361072896,3361074431,VE
 3361074432,3361074687,CO
@@ -69377,16 +69912,18 @@
 3362324480,3362324735,AR
 3362324736,3362324991,US
 3362324992,3362328063,AR
-3362328064,3362328319,US
-3362328320,3362337279,AR
+3362328064,3362328575,US
+3362328576,3362337279,AR
 3362337280,3362338047,US
 3362338048,3362342143,AR
 3362342144,3362342399,PA
-3362342400,3362344447,AR
+3362342400,3362343423,AR
+3362343424,3362343679,US
+3362343680,3362344447,AR
 3362344448,3362344703,US
 3362344704,3362344959,AR
-3362344960,3362347007,US
-3362347008,3362348799,AR
+3362344960,3362346751,US
+3362346752,3362348799,AR
 3362348800,3362349055,US
 3362349056,3362351103,CR
 3362351104,3362353151,AR
@@ -69507,8 +70044,8 @@
 3363504128,3363512319,PE
 3363512320,3363554047,AR
 3363554048,3363554175,US
-3363554176,3363556095,AR
-3363556096,3363556223,US
+3363554176,3363555839,AR
+3363555840,3363556223,US
 3363556224,3363556351,AR
 3363556352,3363556607,US
 3363556608,3363557375,AR
@@ -69545,7 +70082,9 @@
 3380506880,3380507135,BR
 3380507136,3383754751,MX
 3383754752,3384147967,AR
-3384147968,3384156159,US
+3384147968,3384154879,US
+3384154880,3384155135,HN
+3384155136,3384156159,US
 3384156160,3384160255,PA
 3384160256,3384164351,US
 3384164352,3384183807,PA
@@ -69603,11 +70142,7 @@
 3386645248,3386645503,CL
 3386645504,3386645759,AR
 3386645760,3386646015,CR
-3386646016,3386647551,CO
-3386647552,3386647679,VE
-3386647680,3386647743,CO
-3386647744,3386648063,VE
-3386648064,3386649855,CO
+3386646016,3386649855,CO
 3386649856,3386650111,VE
 3386650112,3386650623,CO
 3386650624,3386652671,VE
@@ -69648,10 +70183,12 @@
 3387555840,3387568127,AR
 3387568128,3387572223,PE
 3387572224,3387573375,AR
-3387573376,3387573631,CO
-3387573632,3387574015,AR
+3387573376,3387573759,CO
+3387573760,3387574015,AR
 3387574016,3387574143,CO
-3387574144,3387575295,AR
+3387574144,3387574783,AR
+3387574784,3387575039,CO
+3387575040,3387575295,AR
 3387575296,3387575423,CO
 3387575424,3387575807,AR
 3387575808,3387576063,CO
@@ -69661,16 +70198,7 @@
 3387584512,3387588607,PE
 3387588608,3387600895,AR
 3387600896,3387604991,CO
-3387604992,3387606271,AR
-3387606272,3387606399,EC
-3387606400,3387607295,AR
-3387607296,3387607551,EC
-3387607552,3387608319,AR
-3387608320,3387608447,EC
-3387608448,3387608575,AR
-3387608576,3387608831,EC
-3387608832,3387609087,AR
-3387609088,3387613183,EC
+3387604992,3387613183,EC
 3387613184,3387617279,VE
 3387617280,3387619327,CO
 3387619328,3387686911,AR
@@ -69845,7 +70373,6 @@
 3389306880,3389307135,SG
 3389307136,3389307647,ID
 3389307904,3389308159,AU
-3389308160,3389308415,KH
 3389308416,3389308671,AU
 3389308672,3389308927,PH
 3389308928,3389317119,HK
@@ -70946,7 +71473,7 @@
 3393856898,3393857023,SG
 3393857024,3393857535,NZ
 3393857536,3393858047,HK
-3393858048,3393858559,ID
+3393858304,3393858559,ID
 3393858560,3393858815,AU
 3393858816,3393859071,ID
 3393859072,3393859327,AU
@@ -72467,7 +72994,9 @@
 3406528256,3406528511,AU
 3406528512,3406528767,HK
 3406528768,3406529023,AU
-3406529024,3406530047,HK
+3406529024,3406529535,HK
+3406529536,3406529791,IL
+3406529792,3406530047,HK
 3406530048,3406530303,SG
 3406530304,3406530559,HK
 3406530560,3406531583,CN
@@ -73594,7 +74123,9 @@
 3409462272,3409462783,CN
 3409462784,3409465855,AU
 3409465856,3409466879,CN
-3409466880,3409469183,AU
+3409466880,3409467903,AU
+3409467904,3409468415,HK
+3409468416,3409469183,AU
 3409469184,3409469439,CN
 3409469440,3409473023,AU
 3409473024,3409473279,CN
@@ -74333,7 +74864,6 @@
 3415814656,3415815167,TH
 3415815168,3415816191,IN
 3415816192,3415817215,JP
-3415817216,3415817727,ID
 3415818240,3415822335,JP
 3415822336,3415826431,MY
 3415826432,3415834623,ID
@@ -74979,7 +75509,9 @@
 3423651840,3423653887,CA
 3423653888,3423705599,US
 3423705600,3423705855,CA
-3423705856,3423797503,US
+3423705856,3423725423,US
+3423725424,3423725427,CA
+3423725428,3423797503,US
 3423797504,3423801087,CA
 3423801088,3423801343,US
 3423801344,3423827711,CA
@@ -75482,7 +76014,8 @@
 3448717312,3448717567,AU
 3448717568,3448838143,US
 3448838144,3448838399,CA
-3448838400,3448989695,US
+3448838400,3448987647,US
+3448987648,3448989695,IN
 3448989696,3448990719,HK
 3448990720,3448991743,IN
 3448991744,3449161983,US
@@ -76031,7 +76564,9 @@
 3464550400,3464626175,US
 3464626176,3464626687,CA
 3464626688,3464627199,US
-3464627968,3464630271,CA
+3464627968,3464628735,CA
+3464628736,3464628991,US
+3464628992,3464630271,CA
 3464630272,3464631295,US
 3464631296,3464650751,CA
 3464650752,3464664063,US
@@ -76575,7 +77110,8 @@
 3493900372,3493900375,GB
 3493900376,3493901023,US
 3493901024,3493901031,HK
-3493901032,3493936127,US
+3493901032,3493928959,US
+3493931008,3493936127,US
 3493936128,3493937151,CA
 3493937152,3493939455,US
 3493939456,3493939711,CA
@@ -77287,7 +77823,8 @@
 3515596800,3515613183,CA
 3515613184,3515711487,US
 3515711488,3515731967,CA
-3515731968,3515744255,US
+3515731968,3515736063,US
+3515736064,3515744255,DE
 3515744256,3515760639,CA
 3515760640,3515844095,US
 3515844096,3515844607,GB
@@ -78107,13 +78644,7 @@
 3559276544,3559284735,GB
 3559284736,3559288831,RU
 3559288832,3559289855,AZ
-3559289856,3559291391,RU
-3559291392,3559291443,AZ
-3559291444,3559291444,RU
-3559291445,3559291445,AZ
-3559291446,3559291446,RU
-3559291447,3559291647,AZ
-3559291648,3559292927,RU
+3559289856,3559292927,RU
 3559292928,3559301119,JO
 3559301120,3559305215,GB
 3559305216,3559305471,US
@@ -78928,8 +79459,8 @@
 3564889635,3564892735,GB
 3564892736,3564892751,NL
 3564892752,3564894207,GB
-3564894208,3564895232,NL
-3564895233,3564896255,GB
+3564894208,3564895487,NL
+3564895488,3564896255,GB
 3564896256,3564904447,RU
 3564904448,3564912639,DE
 3564912640,3564920831,BG
@@ -79921,8 +80452,8 @@
 3576085712,3576086015,EU
 3576086016,3576086143,GB
 3576086144,3576086367,EU
-3576086368,3576086431,GB
-3576086432,3576086495,EU
+3576086368,3576086399,GB
+3576086400,3576086495,EU
 3576086496,3576086527,GB
 3576086528,3576086567,EU
 3576086568,3576086571,GB
@@ -80217,7 +80748,8 @@
 3580272640,3580276735,SE
 3580276736,3580280831,NL
 3580280832,3580329983,RU
-3580329984,3580338687,SE
+3580329984,3580338175,NL
+3580338176,3580338687,SE
 3580338688,3580339711,HR
 3580339712,3580340223,EE
 3580340224,3580344319,LT
@@ -80761,7 +81293,9 @@
 3585286144,3585288959,NO
 3585288960,3585291007,GB
 3585291008,3585292543,NO
-3585292544,3585293263,GB
+3585292544,3585292863,GB
+3585292864,3585292895,NO
+3585292896,3585293263,GB
 3585293264,3585293271,ZA
 3585293272,3585294335,GB
 3585294336,3585302527,DE
@@ -80845,7 +81379,9 @@
 3585875968,3585884159,CH
 3585884160,3585892351,IQ
 3585892352,3585900543,DE
-3585900544,3585908735,NO
+3585900544,3585906687,NO
+3585906688,3585907711,CZ
+3585907712,3585908735,NO
 3585908736,3585908991,FR
 3585908992,3585909759,GF
 3585909760,3585910271,FR
@@ -81023,12 +81559,19 @@
 3587242672,3587242679,DE
 3587242680,3587244031,GB
 3587244032,3587260415,IT
-3587260416,3587284991,DE
+3587260416,3587278591,DE
+3587278592,3587279359,US
+3587279360,3587279615,DE
+3587279616,3587280383,US
+3587280384,3587281151,DE
+3587281152,3587284991,US
 3587284992,3587285216,EU
 3587285217,3587285217,US
 3587285218,3587285523,EU
 3587285524,3587285524,A2
-3587285525,3587293183,EU
+3587285525,3587291135,EU
+3587291136,3587292159,FR
+3587292160,3587293183,EU
 3587293184,3587309567,IT
 3587309568,3587325951,GB
 3587325952,3587342335,RU
@@ -81686,12 +82229,9 @@
 3633548800,3633548927,A2
 3633548928,3633552127,US
 3633552128,3633552383,A2
-3633552384,3633750015,US
-3633754112,3633757439,US
+3633552384,3633757439,US
 3633757440,3633757695,IN
-3633757696,3633815551,US
-3633815552,3633819647,CA
-3633819648,3633881087,US
+3633757696,3633881087,US
 3633881088,3633885183,CW
 3633885184,3633889279,US
 3633889280,3633893375,CA
@@ -81747,19 +82287,33 @@
 3635656704,3635657727,JP
 3635657728,3635660799,US
 3635660800,3635662847,HK
-3635662848,3635741951,US
+3635662848,3635740671,US
+3635740672,3635740927,CA
+3635740928,3635741439,US
+3635741440,3635741695,CA
+3635741696,3635741951,US
 3635741952,3635745535,CA
 3635745536,3635746047,US
 3635746048,3635765759,CA
 3635765760,3635768575,US
 3635768576,3635771391,CA
-3635771392,3635774207,US
+3635771392,3635771647,US
+3635771648,3635771903,CA
+3635771904,3635772415,US
+3635772416,3635772671,CA
+3635772672,3635772927,US
+3635772928,3635773951,CA
+3635773952,3635774207,US
 3635774208,3635781119,CA
 3635781120,3635783167,US
 3635783168,3635799551,CA
 3635799552,3635800063,US
 3635800064,3635804159,CA
-3635804160,3635871743,US
+3635804160,3635804671,US
+3635804672,3635805439,CA
+3635805440,3635805455,US
+3635805456,3635806207,CA
+3635806208,3635871743,US
 3635871744,3635879935,CA
 3635879936,3635892223,US
 3635892224,3635895785,CA
@@ -82102,9 +82656,7 @@
 3641769984,3641774079,NO
 3641774080,3641778175,DE
 3641778176,3641782271,PL
-3641782272,3641784319,BG
-3641784320,3641784575,GB
-3641784576,3641786367,BG
+3641782272,3641786367,GB
 3641786368,3641790463,SE
 3641790464,3641794559,LT
 3641794560,3641798655,RS
@@ -82550,11 +83102,34 @@
 3645657088,3645661183,SE
 3645661184,3645665279,DE
 3645665280,3645669375,PL
-3645669376,3645670911,PT
+3645669376,3645669599,ES
+3645669600,3645669887,PT
+3645669888,3645670399,ES
+3645670400,3645670427,PT
+3645670428,3645670429,ES
+3645670430,3645670430,PT
+3645670431,3645670433,ES
+3645670434,3645670436,PT
+3645670437,3645670441,ES
+3645670442,3645670456,PT
+3645670457,3645670460,ES
+3645670461,3645670508,PT
+3645670509,3645670509,ES
+3645670510,3645670527,PT
+3645670528,3645670655,ES
+3645670656,3645670911,PT
 3645670912,3645673471,ES
 3645673472,3645673535,PT
 3645673536,3645674239,ES
-3645674240,3645676799,PT
+3645674240,3645674271,PT
+3645674272,3645675007,ES
+3645675008,3645675519,PT
+3645675520,3645675759,ES
+3645675760,3645675775,PT
+3645675776,3645676015,ES
+3645676016,3645676031,PT
+3645676032,3645676543,ES
+3645676544,3645676799,PT
 3645676800,3645677567,ES
 3645677568,3645681663,AT
 3645681664,3645685759,RU
@@ -83039,7 +83614,9 @@
 3650929856,3650929863,DE
 3650929864,3650930431,GB
 3650930432,3650930687,DE
-3650930688,3650939599,GB
+3650930688,3650932943,GB
+3650932944,3650932975,IT
+3650932976,3650939599,GB
 3650939600,3650939607,FR
 3650939608,3650939615,TR
 3650939616,3650944579,GB
diff --git a/installer/resources/geoipv6.dat.gz b/installer/resources/geoipv6.dat.gz
index f0f2bdcfb601ab1fa140317f86f3496fccdade10..b74ec54a3f7c21cccd25227ee4136223950695cc 100644
Binary files a/installer/resources/geoipv6.dat.gz and b/installer/resources/geoipv6.dat.gz differ
diff --git a/installer/resources/hosts.txt b/installer/resources/hosts.txt
index 49a0250317175b5115277aecf47410d71e445625..0356d50ff69fe635d880c0eb3c1fcf221130b2c8 100644
--- a/installer/resources/hosts.txt
+++ b/installer/resources/hosts.txt
@@ -351,3 +351,5 @@ open4you.i2p=kvx2~4uxYZRqvfzfgT5i5JdXpk~d9HFc7l-pH4aH5yFdlSgolgW2Nekt6tVLqlpkIzz
 salt.i2p=6V5XXGZN69jV~QhveTsA4by1Ct8Q9qljltW825zuxHAsjwZWV7vngzbucllm1mDjJmE~zPq5YMho9klEgK~Ep8LIWBZ6owbB~bj5NETD2GZgGKyqN0TkwymzUFTfmqGqRxkMdTrK0poCajdTTCq5ukrmpXFz2-~twJFlQoMufaZBPcG-NqKs10c2aehUl7UbOmzr5zYHfjjtwOgf3acXnF8PRmA8tFHLD6DHA4k9YJCBVi1w6Eskeasb-sW~7DYoJc~je7xocpxJO~GziLz2fQO~2cdI5BOFmhPfOQaMhR1WFE3MRSbLEt2zNXhNlZWTCrS-Oj4c2p6qtRNRsDQvxzBZwOzRzvucB2K3WMFreY7qfS-WS5LWJxl95~DsHGwf~sqqAQF8q02gBw2Ap6kel-tijjAMXxrJw09XIQy0LbV7g1qYHG-quZRdWpEMe-LTstSmwN0C1v39QwOQhwgqYFz~OJ1HikINdf9H4Syz2HnaNDT-AOYztdUdB6z7Lwt6AAAA
 no.i2p=8jISadUQuR~kZ9YzZxfQwSQRdhY~gkTSgy4l33jKOAraoqSmb~IcoeN5xOXyhtX8gxKEb03-48zPZnso83TwcTFg66~Cu38a59fG0h~vy~WIY5x5CwfkoCFqYmo4OzdnTY-2TcQ2ZN44VA6Sx48UXjEsSdrvn0SfaeMAW5It-N6MAV23Qgc5NgRTVJ6YS74FnRZCy6uGU-RPz1HQQIH~byW-NHBmXAW2Bmv2Kq3bHVHY9tb4d8yfrhlnaf3bfhLeELUbtBnXhLd3Zs2kX6Afz7ofDkpmaygYO6XA8QNIVcM2ub6-jSdsly~EXBtRDzF0WSbT9v8rvpop5TxjwXAnTjbS09Qq8x2Bl8wfkkPz45beN0Je7wrxp0SBk5DHhhvVbbyFUS7bDn1~aTvE7Ujq8ael3myR56jb8NlYiXaiJYgwPXpXx5gSDf8rBaDIdJsSSHWv~DqOfJ1BkhADCEfGZ3QMFY7uWrXGuj0J3OYEvonV-deMoh6pYKtgcFiewJgjAAAA
 i2pjump.i2p=ouBpQCfwiBcdoZD3vMNT8HXB091kwgI766U6sdWhstY6~7Aixpo8JsNaSO1LV01I20kEzAgmWP8cf5469gSa-YeXAjhKSQPtUgQiKCoRhv2virj--~ecvv4OhyIzCiYoWMMFHV50c02Lg~EE8LGbEkIbRXUZaIWlYwnLC-MzPtuSXhFjHW03h0v~QGeIlYFr8nkpBayqdB8SLkieKygnlOgLRSehmHWZeA0yIz1aCpDuTrZAmAdb3ZwcNm0fxWl~AEpELZ-ax8x6Ibb0kHgPxP1lRr1J7MH~yYXrkymqIPEj-sNLavlAN5oEK6~A45hLd-IENfQ9v-AlntZMon~zeDvxDwHqyKy4OOCbHV7LmitYryEZTVoQNDPPHa6o0pnkBjaPWEnJoDqzU~s-alViTYwR7qkGZMxSp~tej~TngU8GUYEHn4kdTnni0~RTY~50ZyI~2~2ESUCIfFWHzYKQXclzt-uxmNsCL7npmD1-MKZUQ1ECwPR2xKv5vqJwO5ZKAAAA
+psi.i2p=a11l91etedRW5Kl2GhdDI9qiRBbDRAQY6TWJb8KlSc0P9WUrEviABAAltqDU1DFJrRhMAZg5i6rWGszkJrF-pWLQK9JOH33l4~mQjB8Hkt83l9qnNJPUlGlh9yIfBY40CQ0Ermy8gzjHLayUpypDJFv2V6rHLwxAQeaXJu8YXbyvCucEu9i6HVO49akXW9YSxcZEqxK04wZnjBqhHGlVbehleMqTx9nkd0pUpBZz~vIaG9matUSHinopEo6Wegml9FEz~FEaQpPknKuMAGGSNFVJb0NtaOQSAocAOg1nLKh80v232Y8sJOHG63asSJoBa6bGwjIHftsqD~lEmVV4NkgNPybmvsD1SCbMQ2ExaCXFPVQV-yJhIAPN9MRVT9cSBT2GCq-vpMwdJ5Nf0iPR3M-Ak961JUwWXPYTL79toXCgxDX2~nZ5QFRV490YNnfB7LQu10G89wG8lzS9GWf2i-nk~~ez0Lq0dH7qQokFXdUkPc7bvSrxqkytrbd-h8O8AAAA
+irc.dg.i2p=bunRitjuWmSGkf5UV7pnjMRIxmP7fuHy9SgDfAA0M~4TWoBr4Ji4m5AyMGzhAdNaQW6c2-0CIe~RCDZ~vcN-BSNpaqzd80gKhXYxqUQQB83XRWDdLz-z0H~Y15k90p~n0GUSzsjlZctkYglNMyQ8MAUIpUEiLz6MVwArZqUI-CDOE664ZazcGtSKfBLZKycHsSj6WfLbwl2-R5Zv4f5Xisv9Hd0b8BsqJEWn1AmBMhM7p8l7okM2ZcRnC5ypzBdLfLSdkGJ5dEZAJIxz-GhtB8rJ3e0jJkbFjknGrJfxbwt~5n00nVuiUNMro2JRxQ7w~VzMw~lYRq~1B5TMtaKRDhxk7pnv5MxmVBFNhcT~hImcyxfT7GfIPzYU9s~uiFReoSjAOJZv-rKq4Oyeyz-Pa6lcg-c3MtuTXjJ2BMX2dA5Jw0FFVDDMOdDL2b1lwtyseQQkGtc15i4EtNy6iJrkbqAnIhO86E2C3jDf~yt2FlDlcbx6dkflJ3y3j2Wu9DAgAAAA
diff --git a/installer/resources/i2prouter b/installer/resources/i2prouter
index 2aa84353dfa32db68ccda70d1332ccc14b06ac74..c1e37e201ae16228a21770fbbdd8302221c494b7 100644
--- a/installer/resources/i2prouter
+++ b/installer/resources/i2prouter
@@ -199,25 +199,46 @@ unsupported() {
     echo
 }
 
+freebsd10() {
+    echo
+    echo "The current version of the Tanuki wrapper does not"
+    echo "support FreeBSD 10."
+    echo
+    echo "See https://trac.i2p2.de/ticket/1118 for more information"
+    echo "and a workaround for this issue."
+    echo
+    echo "In the meantime, you may start I2P by running the script"
+    echo "${I2P}/runplain.sh"
+    echo
+}
+
 failed() {
-        echo "**`gettext 'Failed to load the wrapper'`**"
-        case `uname -s` in
-             FreeBSD)
-                # We should never get here on recent versions of FreeBSD
-                if ! $(pkg_info -E 'libiconv*' > /dev/null 2>&1); then
-                    echo
-                    echo "The wrapper requires libiconv."
-                    echo
-                    echo "It can be installed with pkg_add -r libiconv"
-                    echo
-                fi
-                ;;
-             *)
-                echo
-                unsupported
-                ;;
-        esac
-        exit 1
+    echo "**`gettext 'Failed to load the wrapper'`**"
+    case `uname -s` in
+        FreeBSD)
+            case `uname -r` in
+                10*|11*)
+                    freebsd10
+                    ;;
+                *)
+                    # We should never get here on recent versions of FreeBSD
+                    if ! $(pkg_info -E 'libiconv*' > /dev/null 2>&1); then
+                        echo
+                        echo "The wrapper requires libiconv."
+                        echo
+                        echo "It can be installed with pkg_add -r libiconv"
+                        echo
+                    fi
+                    ;;
+            esac
+            ;;
+
+        *)
+            echo
+            unsupported
+            ;;
+    esac
+    exit 1
 }
 
 if $(which ldd > /dev/null 2>&1); then
@@ -919,8 +940,8 @@ launchdinternal() {
         create_config_dir
 
         # The string passed to eval must handles spaces in paths correctly.
-        COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.java.command=\"$JAVABINARY\" wrapper.displayname=\"$APP_LONG_NAME\" wrapper.daemonize=TRUE $ANCHORPROP $IGNOREPROP $STATUSPROP $COMMANDPROP $LOCKPROP $LOGPROP wrapper.script.version=3.5.22 $ADDITIONAL_PARA"
-        eval $COMMAND_LINE
+        COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.java.command=\"$JAVABINARY\" wrapper.displayname=\"$APP_LONG_NAME\" wrapper.daemonize=TRUE $ANCHORPROP $IGNOREPROP $STATUSPROP $COMMANDPROP $LOCKPROP $LOGPROP $ADDITIONAL_PARA"
+        eval $COMMAND_LINE || failed
     else
         eval echo `gettext '$APP_LONG_NAME is already running.'`
         exit 1
@@ -943,7 +964,7 @@ console() {
         create_config_dir
 
         # The string passed to eval must handles spaces in paths correctly.
-        COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.java.command=\"$JAVABINARY\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" $ANCHORPROP $STATUSPROP $COMMANDPROP $LOCKPROP $LOGPROP wrapper.script.version=3.5.22 $ADDITIONAL_PARA"
+        COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.java.command=\"$JAVABINARY\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" $ANCHORPROP $STATUSPROP $COMMANDPROP $LOCKPROP $LOGPROP $ADDITIONAL_PARA"
         eval $COMMAND_LINE || failed
     else
         eval echo `gettext '$APP_LONG_NAME is already running.'`
@@ -1066,8 +1087,8 @@ start() {
         create_config_dir
 
         # The string passed to eval must handles spaces in paths correctly.
-        COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.java.command=\"$JAVABINARY\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" wrapper.daemonize=TRUE $ANCHORPROP $IGNOREPROP $STATUSPROP $COMMANDPROP $LOCKPROP $LOGPROP wrapper.script.version=3.5.22 $ADDITIONAL_PARA"
-        eval $COMMAND_LINE
+        COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.java.command=\"$JAVABINARY\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" wrapper.daemonize=TRUE $ANCHORPROP $IGNOREPROP $STATUSPROP $COMMANDPROP $LOCKPROP $LOGPROP $ADDITIONAL_PARA"
+        eval $COMMAND_LINE || failed
     else
         eval echo `gettext '$APP_LONG_NAME is already running.'`
         exit 1
@@ -1773,7 +1794,7 @@ showUsage() {
             if [ -n "$PASS_THROUGH" ] ; then
                 echo "${MSG} $0 [ console {JavaAppArgs} | start {JavaAppArgs} | stop | restart {JavaAppArgs} | condrestart {JavaAppArgs} | status | install | remove | dump ]"
             else
-                echo "${MSG} $0 [ console | start | stop | restart | condrestart | status | install | remove | dump ]"
+                echo "${MSG} $0 [ console | start | stop | graceful | restart | condrestart | status | install | remove | dump ]"
         fi
     fi
 
diff --git a/installer/resources/initialNews/initialNews.xml b/installer/resources/initialNews/initialNews.xml
index 63199b99961bb7c551cc501482ca8bd3a8f7e408..37a0e1a3a02fff443d63b48af02ed2cc27b2e576 100644
--- a/installer/resources/initialNews/initialNews.xml
+++ b/installer/resources/initialNews/initialNews.xml
@@ -11,10 +11,10 @@ _("While you are waiting, please {0}adjust your bandwidth settings{1} on the {2}
 _("Also you can setup your browser to use the I2P proxy to reach eepsites.")
 _("Just enter 127.0.0.1 (or localhost) port 4444 as a http proxy into your browser settings.")
 _("Do not use SOCKS for this.")
-_("More information can be found on the {0}I2P browser proxy setup page{1}.", "<a href=\"https://www.i2p2.de/htproxyports.html\">", "</a>")
+_("More information can be found on the {0}I2P browser proxy setup page{1}.", "<a href=\"https://geti2p.net/about/browser-config\">", "</a>")
 </p>
 <p>
-_("Once you have a \"shared clients\" destination listed on the left, please {0}check out{1} our {2}FAQ{3}.", "<b>", "</b>", "<a href=\"http://www.i2p2.i2p/faq.html\">", "</a>")
+_("Once you have a \"shared clients\" destination listed on the left, please {0}check out{1} our {2}FAQ{3}.", "<b>", "</b>", "<a href=\"http://i2p-project.i2p/faq\">", "</a>")
 </p>
 <p>
 _("Point your IRC client to {0}localhost:6668{1} and say hi to us on {2}#i2p-help{3} or {4}#i2p{5}.", "<b>", "</b>", "<a href=\"irc://127.0.0.1:6668/i2p-help\">", "</a>", "<a href=\"irc://127.0.0.1:6668/i2p\">", "</a>")
diff --git a/installer/resources/locale/po/messages_pl.po b/installer/resources/locale/po/messages_pl.po
new file mode 100644
index 0000000000000000000000000000000000000000..f345ede4fbbb598a95c8a51a190b510c8ab31dc5
--- /dev/null
+++ b/installer/resources/locale/po/messages_pl.po
@@ -0,0 +1,198 @@
+# I2P
+# Copyright (C) 2012 The I2P Project
+# This file is distributed under the same license as the routerconsole package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# 
+# Translators:
+# sebx, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-11-19 23:51+0000\n"
+"PO-Revision-Date: 2014-02-05 22:18+0000\n"
+"Last-Translator: sebx\n"
+"Language-Team: Polish (http://www.transifex.com/projects/p/I2P/language/pl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pl\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../i2prouter:203
+msgid "Failed to load the wrapper"
+msgstr "Nie udało uruchomić się osłony"
+
+#: ../i2prouter:925 ../i2prouter:949 ../i2prouter:1023 ../i2prouter:1051
+#: ../i2prouter:1072
+#, sh-format
+msgid "$APP_LONG_NAME is already running."
+msgstr "$APP_LONG_NAME jest już uruchomione."
+
+#: ../i2prouter:936
+#, sh-format
+msgid "Running $APP_LONG_NAME"
+msgstr "Uruchomione $APP_LONG_NAME"
+
+#: ../i2prouter:956
+#, sh-format
+msgid "Waiting for $APP_LONG_NAME"
+msgstr "Czeka na $APP_LONG_NAME"
+
+#: ../i2prouter:1003
+#, sh-format
+msgid "WARNING: $APP_LONG_NAME may have failed to start."
+msgstr "UWAGA: $APP_LONG_NAME mogło się nie uruchomić."
+
+#: ../i2prouter:1017 ../i2prouter:1045 ../i2prouter:1251 ../i2prouter:1540
+msgid "Must be root to perform this action."
+msgstr "Musisz mieć prawa roota, aby wykonać daną czynność."
+
+#: ../i2prouter:1061
+#, sh-format
+msgid "Starting $APP_LONG_NAME"
+msgstr "Trwa uruchamianie $APP_LONG_NAME"
+
+#: ../i2prouter:1083
+#, sh-format
+msgid "Stopping $APP_LONG_NAME"
+msgstr "Zatrzymywanie $APP_LONG_NAME"
+
+#: ../i2prouter:1087 ../i2prouter:1155 ../i2prouter:1708
+#, sh-format
+msgid "$APP_LONG_NAME was not running."
+msgstr "$APP_LONG_NAME nie było uruchomione."
+
+#: ../i2prouter:1100 ../i2prouter:1108 ../i2prouter:1170 ../i2prouter:1178
+#, sh-format
+msgid "Unable to stop $APP_LONG_NAME."
+msgstr "Nie można zatrzymać $APP_LONG_NAME."
+
+#: ../i2prouter:1126
+#, sh-format
+msgid "Waiting for $APP_LONG_NAME to exit"
+msgstr "Trwa czekanie na wyłączenie $APP_LONG_NAME"
+
+#: ../i2prouter:1140
+#, sh-format
+msgid "Failed to stop $APP_LONG_NAME."
+msgstr "Nie udało się wyłączyć $APP_LONG_NAME."
+
+#: ../i2prouter:1143
+#, sh-format
+msgid "Stopped $APP_LONG_NAME."
+msgstr "Zatrzymano $APP_LONG_NAME."
+
+#: ../i2prouter:1151
+#, sh-format
+msgid "Stopping $APP_LONG_NAME gracefully"
+msgstr "Zatrzymywanie $APP_LONG_NAME"
+
+#: ../i2prouter:1197
+#, sh-format
+msgid "$APP_LONG_NAME is not running."
+msgstr " $APP_LONG_NAME nie jest włączone."
+
+#: ../i2prouter:1202
+#, sh-format
+msgid "$APP_LONG_NAME is running: PID:$pid"
+msgstr "$APP_LONG_NAME jest uruchomione: PID:$pid"
+
+#: ../i2prouter:1205
+#, sh-format
+msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS"
+msgstr "$APP_LONG_NAME jest uruchomione: PID:$pid, Osłona:$STATUS, Java:$JAVASTATUS"
+
+#: ../i2prouter:1258 ../i2prouter:1270 ../i2prouter:1289 ../i2prouter:1306
+#: ../i2prouter:1373 ../i2prouter:1393 ../i2prouter:1407 ../i2prouter:1421
+#: ../i2prouter:1449 ../i2prouter:1487 ../i2prouter:1522
+#, sh-format
+msgid "The $APP_LONG_NAME daemon is already installed."
+msgstr "The $APP_LONG_NAME daemon jest już zainstalowany."
+
+#: ../i2prouter:1261 ../i2prouter:1276 ../i2prouter:1378 ../i2prouter:1410
+#: ../i2prouter:1424 ../i2prouter:1438 ../i2prouter:1452 ../i2prouter:1490
+#: ../i2prouter:1525
+#, sh-format
+msgid "Installing the $APP_LONG_NAME daemon"
+msgstr "Instalacja deamona $APP_LONG_NAME"
+
+#: ../i2prouter:1532
+#, sh-format
+msgid "Install not currently supported for $DIST_OS"
+msgstr "Instalacja nie jest obecnie obsługiwana dla $DIST_OS"
+
+#: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584
+#: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643
+#: ../i2prouter:1661 ../i2prouter:1674 ../i2prouter:1688
+#, sh-format
+msgid "Removing $APP_LONG_NAME daemon"
+msgstr "Usuwanie deamona $APP_LONG_NAME"
+
+#: ../i2prouter:1554 ../i2prouter:1569 ../i2prouter:1578 ../i2prouter:1588
+#: ../i2prouter:1599 ../i2prouter:1612 ../i2prouter:1624 ../i2prouter:1637
+#: ../i2prouter:1655 ../i2prouter:1668 ../i2prouter:1682 ../i2prouter:1693
+#, sh-format
+msgid "The $APP_LONG_NAME daemon is not currently installed."
+msgstr "Deamon $APP_LONG_NAME nie jest obecnie zainstalowany."
+
+#: ../i2prouter:1697
+#, sh-format
+msgid "Remove not currently supported for $DIST_OS"
+msgstr "Usunięcie obecnie jest jest obsługiwane dla $DIST_OS"
+
+#: ../i2prouter:1784
+msgid "Commands:"
+msgstr "Polecenia:"
+
+#: ../i2prouter:1785
+msgid "Launch in the current console."
+msgstr "Odpal w obecnej konsoli."
+
+#: ../i2prouter:1786
+msgid "Start in the background as a daemon process."
+msgstr "Uruchom w tle jako proces deamon."
+
+#: ../i2prouter:1787
+msgid "Stop if running as a daemon or in another console."
+msgstr "Zatrzymaj jeśli jest uruchomione jako deamon lub jest uruchomione w innej konsoli."
+
+#: ../i2prouter:1788
+msgid "Stop gracefully, may take up to 11 minutes."
+msgstr "Wdzięczne zatrzymanie może potrwać nawet 11 minut."
+
+#: ../i2prouter:1789
+msgid "Stop if running and then start."
+msgstr "Zatrzymaj jeśli działa i uruchom ponownie."
+
+#: ../i2prouter:1790
+msgid "Restart only if already running."
+msgstr "Zrestartuj tylko wtedy jeśli jest już uruchomione."
+
+#: ../i2prouter:1791
+msgid "Query the current status."
+msgstr "Zbadaj aktualny stan."
+
+#: ../i2prouter:1792
+msgid "Install to start automatically when system boots."
+msgstr "Zainstaluj aby uruchomić automatycznie przy starcie systemu."
+
+#: ../i2prouter:1793
+msgid "Uninstall."
+msgstr "Odinstaluj."
+
+#: ../i2prouter:1794
+msgid "Request a Java thread dump if running."
+msgstr "Zażądaj zrzutu wątków Java jeśli jest uruchomiona."
+
+#: ../i2prouter:1807
+msgid "Please edit i2prouter and set the variable RUN_AS_USER"
+msgstr "ProszÄ™ edytuj i2prouter i ustaw zmiennÄ… RUN_AS_USER"
+
+#: ../i2prouter:1812
+msgid "Running I2P as the root user is *not* recommended."
+msgstr "Nie jest polecane uruchamianie I2P jako root."
+
+#: ../i2prouter:1815
+msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true."
+msgstr "Aby uruchomić jako root, edytuj i2prouter i ustaw ALLOW_ROOT=true."
diff --git a/installer/resources/locale/po/messages_pt_BR.po b/installer/resources/locale/po/messages_pt_BR.po
index 5a1fe48e4ae0152bc26e77300c22bd8f614b59ac..150a70c83a948ba9bb9fef55a324b1c23ea5dac8 100644
--- a/installer/resources/locale/po/messages_pt_BR.po
+++ b/installer/resources/locale/po/messages_pt_BR.po
@@ -5,12 +5,13 @@
 # 
 # Translators:
 # blueboy, 2013
+# blueboy, 2014
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-11-19 23:51+0000\n"
-"PO-Revision-Date: 2013-11-23 17:30+0000\n"
+"PO-Revision-Date: 2014-01-31 16:45+0000\n"
 "Last-Translator: blueboy\n"
 "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
@@ -120,7 +121,7 @@ msgstr ""
 #: ../i2prouter:1532
 #, sh-format
 msgid "Install not currently supported for $DIST_OS"
-msgstr ""
+msgstr "A instalação não possui atualmente suporte para $DIST_OS"
 
 #: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584
 #: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643
@@ -151,11 +152,11 @@ msgstr ""
 
 #: ../i2prouter:1786
 msgid "Start in the background as a daemon process."
-msgstr ""
+msgstr "Inicializar executando ao fundo, como um processo daemon."
 
 #: ../i2prouter:1787
 msgid "Stop if running as a daemon or in another console."
-msgstr ""
+msgstr "Pare se estiver sendo executado como um daemon ou em um outro console."
 
 #: ../i2prouter:1788
 msgid "Stop gracefully, may take up to 11 minutes."
@@ -163,11 +164,11 @@ msgstr ""
 
 #: ../i2prouter:1789
 msgid "Stop if running and then start."
-msgstr ""
+msgstr "Pare, se estiver sendo executado, e então inicialize."
 
 #: ../i2prouter:1790
 msgid "Restart only if already running."
-msgstr ""
+msgstr "Reinicialize apenas se já estiver sendo executado."
 
 #: ../i2prouter:1791
 msgid "Query the current status."
@@ -191,8 +192,8 @@ msgstr "Por favor, edite i2prouter e especifique a variável RUN_AS_USER"
 
 #: ../i2prouter:1812
 msgid "Running I2P as the root user is *not* recommended."
-msgstr ""
+msgstr "Executar o roteador I2P como usuário root *não* é recomendado."
 
 #: ../i2prouter:1815
 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true."
-msgstr ""
+msgstr "De qualquer forma, se quiser mesmo executar o roteador como root, edite i2prouter e ponha ALLOW_ROOT=true."
diff --git a/installer/resources/man/eepget.1 b/installer/resources/man/eepget.1
index 920a4db60a3ca786add4d2f09d2b57f73fffb258..8e4a4e3c45b66356dfd877ebf15e9ac582e4bed4 100644
--- a/installer/resources/man/eepget.1
+++ b/installer/resources/man/eepget.1
@@ -1,4 +1,4 @@
-.TH EEEPGET 1 "April 19, 2012" "" "Eepget - I2P Downloader"
+.TH EEEPGET 1 "February 5, 2014" "" "Eepget - I2P Downloader"
 
 .SH NAME
 Eepget \- I2P downloader
@@ -21,15 +21,39 @@ from the point of interruption.
 
 .SH OPTIONS
 .B
-\fB\-p\fR proxy_host:port
+\fB\-c\fR
 .TP
-Specify an I2P proxy server (eeproxy) to use. If this option is not specified, eepget will use 127.0.0.1:4444. Specify \fB\-p\fR :0 to disable the eeproxy.
+Clearnet. Do not use a proxy. Same as \fB\-p\fR :0 .
+.TP
+
+.B
+\fB\-e\fR etag
+.TP
+Sets the etag value in the request headers.
+.TP
+
+.B
+\fB\-h\fR name=value
+.TP
+Adds an arbitrary request header with the given name and value.
+.TP
+
+.B
+\fB\-l\fR lineLen
+.TP
+Controls the progress display. \fB\ lineLen \fP is the length of one progress line in characters. The default is 40.
+.TP
+
+.B
+\fB\-m\fR markSize
+.TP
+Controls the progress display. \fB\ markSize \fP is the number of bytes one '#' character represents. The default is 1024.
 .TP
 
 .B
 \fB\-n\fR retries
 .TP
-Specify the number of times to retry downloading if the download isn't successful. If this option is not specified, eepget will retry downloading the file 3 times.
+Specify the number of times to retry downloading if the download isn't successful. If this option is not specified, eepget will retry downloading the file 5 times.
 .TP
 
 .B
@@ -39,15 +63,28 @@ Sets the output file to write to. If this option is not given, the output filena
 .TP
 
 .B
-\fB\-m\fR markSize lineLen
+\fB\-p\fR proxy_host[:port]
 .TP
-Controls the progress display. \fB\ markSize \fP is the number of bytes one '#' character represents. \fB\ lineLen \fP is the length of one progress line in characters. The defaults are 1024 and 40.
+Specify an I2P proxy server (eeproxy) to use. If the port is not specified, eepget will use 4444. If this option is not specified, eepget will use 127.0.0.1:4444. Specify \fB\-c\fR or \fB\-p\fR :0 to disable the eeproxy.
 .TP
 
 .B
 \fB\-t\fR seconds
 .TP
 Sets the inactivity timeout. The default is 60 seconds.
+.TP
+
+.B
+\fB\-u\fR username
+.TP
+Sets the username for proxy authorization, if required.
+.TP
+
+.B
+\fB\-x\fR password
+.TP
+Sets the password for proxy authorization, if required. If a username is specified but not a password, EepGet will prompt for the password.
+.TP
 
 .SH EXIT STATUS
 
@@ -56,5 +93,5 @@ exits with status zero upon successful transfer and non-zero if there were probl
 
 .SH "SEE ALSO"
 
-wget(1)
+curl(1) wget(1)
 
diff --git a/installer/resources/readme/readme.html b/installer/resources/readme/readme.html
index 8a57eab544dd9938f7edc9e0a293902fb38c2a5c..3fd02fca52a1655b3cbead7ac8c2b92a75da87b6 100644
--- a/installer/resources/readme/readme.html
+++ b/installer/resources/readme/readme.html
@@ -25,7 +25,6 @@
   And of course you're entirely free to run your own servers over I2P in whatever flavor you choose, or if you're a developer write your own <a href="http://www.i2p2.i2p/applications.html" target="_blank">I2P applications</a> (both <a href="https://secure.wikimedia.org/wikipedia/en/wiki/User_Datagram_Protocol" target="_blank">UDP</a> and <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Transmission_Control_Protocol" target="_blank">TCP</a> protocols are <a href="http://www.i2p2.i2p/techintro.html#op.transport" target="_blank">provisioned</a>), and <a href="http://www.i2p2.i2p/streaming.html" target="_blank">realtime streaming</a> is also possible.
   We also provide full access to the <a href="http://docs.i2p2.de/javadoc/" target="_blank">Java API</a>.</li>
 <li class="tidylist"><b>Forums &amp; Blogging</b><br>If you're looking to run your own blog or forum, you might be interested in <a href="http://syndie.i2p2.de/" target="_blank">Syndie</a>, a distributed forum and blogging platform for I2P [Needs developers!].
-  There's also an I2P plugin port of the Java-based <a href="http://pebble.sourceforge.net/" target="_blank">pebble</a> blogging platform ported to I2P by zzz, available on <a href="http://plugins.i2p/" target="_blank">plugins.i2p</a>.
   And, of course, all normal blogging, forum and cms software will run over I2P, though you're advised to take extra precautions with security when setting up and to keep all associated software (e.g. Php, MySql, Python, Apache) up to date and locked-down!
   Also, there are quite a few community run forums on I2P in various languages; see <a href="#eepsites">below</a> for some suggestions.</li>
   <li class="tidylist"><a name="plugins"></a><b>Plugins for I2P</b><br>Extend the usefulness of I2P by installing plugins&hellip; blogging, chatting, file sharing and other plugins have already been written or ported and await your <a href="http://plugins.i2p/plugins/" target="_blank">installation</a>!
diff --git a/installer/resources/readme/readme_fr.html b/installer/resources/readme/readme_fr.html
index 73b8d07b6d079f407f3c1b01f16243754a0a9edb..216947d3c6ccea81a0c15170b867273ba05bee9a 100644
--- a/installer/resources/readme/readme_fr.html
+++ b/installer/resources/readme/readme_fr.html
@@ -1,5 +1,4 @@
 <div lang="fr">
-(traduction de mars 2011 - cliquez sur le drapeau ci-dessus pour l'original en anglais)
 <ul class="links"><li class="tidylist"><b>Démarrage&hellip;</b><br>Si vous venez juste de lancer I2P, le nombre de 
 <i>pairs actifs</i> indiqués dans la section <i>Pairs</i> du "Panneau de surveillance" sur la  gauche devrait 
 commencer à augmenter dans les prochaines minutes et vous verrez alors en bas du panneau une <i>destination locale</i> 
@@ -76,9 +75,7 @@ Nous fournissons aussi un accès complet à l'<a href="http://docs.i2p2.de/javad
 <li class="tidylist"><b>Forums &amp; Blogs</b><br>Si vous cherchez à faire votre propre blog ou forum , vous pourriez 
 être intéressé par <a href="http://syndie.i2p2.de/" target="_blank">Syndie</a>, une plateforme décentralisée de 
 forum et blog pour I2P [Nids de développeurs! (prononcez à l'anglaise)].
-On trouve également en greffon I2P, un portage réalisé par zzz de la plateforme de blog Java 
-<a href="http://pebble.sourceforge.net/" target="_blank">pebble</a>. Il est disponible sur 
-<a href="http://plugins.i2p/" target="_blank">plugins.i2p</a>. Bien entendu, tous les logiciels de blog, forum et 
+Bien entendu, tous les logiciels de blog, forum et 
 cms fonctionnent sur I2P, bien qu'il vous soit conseillé de faire très attention à la sécurité quand vous les 
 configurez et de tenir tous les logiciels associés (p.e. Php, MySql, Python, Apache) bien à jour et verrouillés! 
 Vous trouverez aussi un petit nombre de forums I2P dans diverses langues: voir <a href="#eepsites">plus bas</a> 
diff --git a/installer/resources/readme/readme_nl.html b/installer/resources/readme/readme_nl.html
index f45b943ea871c7d7d65d3b404501c11d9caf5a39..3197e9f357aae1c64870d2c238681bd3d611a372 100644
--- a/installer/resources/readme/readme_nl.html
+++ b/installer/resources/readme/readme_nl.html
@@ -18,7 +18,7 @@ Deze accounts kunnen tevens email versturen en ontvangen naar en van het normale
 <li class="tidylist"><b>Anonieme Chat</b><br>Start je IRC Client (bijv. mIRC, Chatzilla, Pidgin, XChat)
 en maak verbinding met de <a href="irc://127.0.0.1:6668/i2p">server</a> op <code>127.0.0.1 port 6668</code>. Je hoeft geen proxy in te stellen in je IRC client; I2P bied een lokale IRC tunnel aan (geconfigureerd in je IRC client als IRC server of host op afstand. Je lokale I2P IRC tunnel op <code>localhost:6668</code> zal je verbinden met een van de twee IRC servers die gehost worden op I2P door Postman en Badger, geen van beide partijen weet echter wat de identiteit of IP van de ander is, en je moeder, Internet Provider of overheid kan deze gesprekken niet onderscheppen! Eenmaal verbonden zijn <code>#i2p-help</code>,<code>#i2p</code>,<code>#i2p-chat</code> en <code>#i2p-dev</code> onder meer een aantal kanalen die je mogelijk zou willen bezoeken (/join). Er is ook een <a href="http://echelon.i2p/qti2pmessenger/">Instant Messenger</a> gebaseerd op I2P voor ongecensureerde en onaftapbare anonieme chat, alsmede alternatieve IRC servers, Jabber servers, website-based chat, en meer. En, je bent natuurlijk vrij om je eigen servers op I2P te draaien in welke variant dan ook, of als ontwikkelaar zijnde je eigen <a href="http://www.i2p2.i2p/applications.html" target="_blank">I2P applicaties</a> (zowel <a href="https://secure.wikimedia.org/wikipedia/en/wiki/User_Datagram_Protocol" target="_blanK">UDP</a> en <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Transmission_Control_Protocol" target="_blank">TCP</a> protocollen worden <a href="http://www.i2p2.i2p/techintro.html#op.transport" target="_blank">ondersteund</a>), en <a href="http://www.i2p2.i2p/streaming.html" target="_blank">realtime streaming</a> behoort ook tot de mogelijkheden. Ook bieden we volledige toegang tot de <a href="http://docs.i2p2.de/javadoc/" target="_blank">op Java gebaseerde API</a>.</li>
 
-<li class="tidylist"><b>Forums &amp; Blogging</b><br>Als je opzoek bent om je eigen blog of forum te draaien ben je misschien geïnteresseerd in <a href="http://syndie.i2p2.de/" target="_blank">Syndie</a>, een distributed forum en blogging platform voor I2P [Ontwikkelaars gezocht!]. Er is ook een I2P plugin van het op Java gebaseerde <a href="http://pebble.sourceforge.net/" target="_blank">pebble</a> blogging platform geport naar I2P door zzz, beschikbaar op <a href="http://plugins.i2p/" target="_blank">plugins.i2p</a>. En, natuurlijk zullen alle normale blogging, forum en CMS software werken op I2P, wel word je geadviseerd extra veiligheidsmaatregelen te nemen bij het opzetten en alle gerelateerde software (bijv. PHP, MySQL, Python, Apache) up-to-date te houden en goed beveiligd! Ook zijn er reeds een aantal forums op I2P in verschillende talen; zie <a href="#eepsites">hier onder</a> voor enkele suggesties.</li>
+<li class="tidylist"><b>Forums &amp; Blogging</b><br>Als je opzoek bent om je eigen blog of forum te draaien ben je misschien geïnteresseerd in <a href="http://syndie.i2p2.de/" target="_blank">Syndie</a>, een distributed forum en blogging platform voor I2P [Ontwikkelaars gezocht!]. En, natuurlijk zullen alle normale blogging, forum en CMS software werken op I2P, wel word je geadviseerd extra veiligheidsmaatregelen te nemen bij het opzetten en alle gerelateerde software (bijv. PHP, MySQL, Python, Apache) up-to-date te houden en goed beveiligd! Ook zijn er reeds een aantal forums op I2P in verschillende talen; zie <a href="#eepsites">hier onder</a> voor enkele suggesties.</li>
 
 <li class="tidylist"><a name="plugins"></a><b>Plugins voor I2P</b><br>Breid de gebruiks mogelijkheden van I2P uit door het installeren van plugins &hellip; blogging, chatting, file sharing en andere plugins zijn al geschreven of geport en wachten op <a href="http://plugins.i2p/plugins/" target="_blank">installatie</a>! Surf naar de plugins en gerelateerde info op <a href="http://plugins.i2p/" target="_blank">plugins.i2p</a>. Als je een <a href="http://plugins.i2p/developers/" target="_blank">ontwikkelaar</a> bent is er een compleet taal-agnostisch framework beschikbaar voor het schrijven van eigen plugins, geleverd met  <a href="http://www.i2p2.i2p/plugins.html" target="_blank">documentatie</a>; I2P plugins kunnen geprogrammeerd worden in elke taal.</li>
 </ul>
diff --git a/installer/resources/readme/readme_ru.html b/installer/resources/readme/readme_ru.html
index eb183a460090a83215da9baa56e665eec25007cc..e78f4d461b83a0616dbf0aef4b263087c7b8b98d 100644
--- a/installer/resources/readme/readme_ru.html
+++ b/installer/resources/readme/readme_ru.html
@@ -18,7 +18,7 @@
       <li class="tidylist"><b>Анонимный чат</b><br>Запустите ваш IRC-клиент (Chatzilla, Pidgin, XChat и т.п.)
         и соединитесь с <a href="irc://127.0.0.1:6668/i2p">сервером</a> на <code>127.0.0.1 порт 6668</code>. Вам не нужно настраивать прокси в IRC-клиенте; I2P предоставляет преднастроенный IRC-туннель (настраиваемый в вашем IRC-клиенте как IRC-сервер). Ваш локальный I2P IRC-туннель на <code>localhost:6668</code> направит вас на один из двух IRC-серверов, поддерживаемых Postman-ом и Badger-ом, но ни вы и ни они не знают, где расположен другой сервер, и ни ваша мама, ни провайдер, ни госорганы не могут перехватить ваши разговоры! Когда вы зайдёте в irc, возможно вам захочется зайти на некоторые из этих каналов - <code>#i2p-help</code>,<code>#i2p</code>,<code>#i2p-chat</code> и <code>#i2p-dev</code>. Так же здесь имеется I2P-ориентированный <a href="http://echelon.i2p/qti2pmessenger">клиент обмена мгновенными сообщениями</a> для неотслеживаемого и безцензурного анонимного общения, который можно считать альтернативой IRC и Jabber-серверам, веб-чатам. И, конечно, вы всецело вольны запускать ваши собственные серверы поверх I2P в любом режиме как вы хотите, или, если вы программист, можете написать собственные <a href="http://www.i2p2.de/applications.html" target="_blank">I2P-приложения</a> (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/User_Datagram_Protocol" target="_blanK">udp</a> и <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Transmission_Control_Protocol" target="_blank">tcp</a> протоколы <a href="http://www.i2p2.i2p/techintro.html#op.transport" target="_blank">предоставлены</a>), и <a href="http://www.i2p2.de/streaming.html" target="_blank">потоковая передача в реальном времени</a> так же возможна. Ещё мы предоставляем полный доступ к <a href="http://docs.i2p2.de/javadoc/" target="_blank"> java-based api</a>.</li>
 
-      <li class="tidylist"><b>Форумы и блоги</b><br>Если вы намереваетесь запустить собственный блог или форум, возможно вы заинтересуетесь <a href="http://syndie.i2p2.de/" target="_blank">Syndie</a>, распределённой платформой для форума или ведения блога в I2P [нужны разработчики!]. Ещё есть порт <a href="http://pebble.sourceforge.net/" target="_blank">pebble</a> - написанной на Java блоггинг-платформы, выполненный zzz в виде плагина для I2P, доступен на <a href="http://plugins.i2p" target="_blank">plugins.i2p</a>. И, конечно, все обычные блоги, форумы и CMS будут работать через I2P, но будте аккуратны при их настройке, уделите должное внимание безопасности, в том числе и связанному софту (php, MySQL, Python, Apache и т.д.). Так же, в I2P есть несколько форумов на разных языках, поддерживаемых  сообществом; <a href="#eepsites">ниже</a> имеется несколько ссылок.</li>
+      <li class="tidylist"><b>Форумы и блоги</b><br>Если вы намереваетесь запустить собственный блог или форум, возможно вы заинтересуетесь <a href="http://syndie.i2p2.de/" target="_blank">Syndie</a>, распределённой платформой для форума или ведения блога в I2P [нужны разработчики!]. И, конечно, все обычные блоги, форумы и CMS будут работать через I2P, но будте аккуратны при их настройке, уделите должное внимание безопасности, в том числе и связанному софту (php, MySQL, Python, Apache и т.д.). Так же, в I2P есть несколько форумов на разных языках, поддерживаемых  сообществом; <a href="#eepsites">ниже</a> имеется несколько ссылок.</li>
 
       <li class="tidylist"><a name="plugins"></a><b>Плагины для I2P</b><br>Повысьте полезность I2P установив плагины&hellip; блоггинг, чат, обмен файлами и другие плагины уже были написаны или портированы и ждут когда вы их <a href="http://plugins.i2p/plugins/" target="_blank">установите</a>! Смотрите плагины и сопутствующую информацию на <a href="http://plugins.i2p" target="_blank">plugins.i2p</a>. Если вы <a href="http://plugins.i2p/developers/" target="_blank">программист</a>, полный языконезависимый фреймворк для написания плагинов доступен и <a href="http://www.i2p2.i2p/plugins.html" target="_blank">документирован</a>; I2P плагины могут быть написаны на любом языке.</li>
 </ul>
diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java
index ebdcdc16388bee03d1a23271081e734bafd4a4be..04dae1e8f79829c1aa60ec67d58225f4099e0d46 100644
--- a/router/java/src/net/i2p/router/Router.java
+++ b/router/java/src/net/i2p/router/Router.java
@@ -23,6 +23,8 @@ import java.util.Set;
 import java.util.TimeZone;
 import java.util.concurrent.ConcurrentHashMap;
 
+import gnu.getopt.Getopt;
+
 import net.i2p.data.Certificate;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
@@ -1103,11 +1105,39 @@ public class Router implements RouterClock.ClockShiftListener {
         _isAlive = true;
     }
 
+    /**
+     *  Usage: Router [rebuild]
+     *  No other options allowed, for now
+     *
+     *  @param args non-null
+     *  @throws IllegalArgumentException
+     */
     public static void main(String args[]) {
+        boolean error = false;
+        Getopt g = new Getopt("router", args, "");
+        int c;
+        while ((c = g.getopt()) != -1) {
+            switch (c) {
+                default:
+                    error = true;
+            }
+        }
+        boolean rebuild = false;
+        int remaining = args.length - g.getOptind();
+        if (remaining > 1) {
+            error = true;
+        } else if (remaining == 1) {
+            rebuild = args[g.getOptind()].equals("rebuild");;
+            if (!rebuild)
+                error = true;
+        }
+        if (error)
+            throw new IllegalArgumentException();
+
         System.out.println("Starting I2P " + RouterVersion.FULL_VERSION);
         //verifyWrapperConfig();
         Router r = new Router();
-        if ( (args != null) && (args.length == 1) && ("rebuild".equals(args[0])) ) {
+        if (rebuild) {
             r.rebuildNewIdentity();
         } else {
             // This is here so that we can get the directory location from the context
@@ -1288,7 +1318,7 @@ public class Router implements RouterClock.ClockShiftListener {
             String line;
             while ( (line = in.readLine()) != null) {
                 String fl = line.trim();
-                if (fl.startsWith("..") || fl.startsWith("#") || fl.length() == 0)
+                if (fl.contains("..") || fl.startsWith("#") || fl.length() == 0)
                     continue;
                 File df = new File(fl);
                 if (df.isAbsolute())
@@ -1299,13 +1329,11 @@ public class Router implements RouterClock.ClockShiftListener {
                         System.out.println("INFO: File [" + fl + "] deleted");
                 }
             }
-            fis.close();
-            fis = null;
-            if (deleteFile.delete())
-                System.out.println("INFO: File [" + DELETE_FILE + "] deleted");
         } catch (IOException ioe) {
         } finally {
             if (fis != null) try { fis.close(); } catch (IOException ioe) {}
+            if (deleteFile.delete())
+                System.out.println("INFO: File [" + DELETE_FILE + "] deleted");
         }
     }
 
diff --git a/router/java/src/net/i2p/router/RouterContext.java b/router/java/src/net/i2p/router/RouterContext.java
index ba837ccf2de7ba4623f0a38b068a02d7d812f4dd..0afd98a7b571d2c1bdcd0ca89b9c1e435040b60b 100644
--- a/router/java/src/net/i2p/router/RouterContext.java
+++ b/router/java/src/net/i2p/router/RouterContext.java
@@ -67,7 +67,7 @@ public class RouterContext extends I2PAppContext {
     private final Set<Runnable> _finalShutdownTasks;
     // split up big lock on this to avoid deadlocks
     private volatile boolean _initialized;
-    private final Object _lock1 = new Object(), _lock2 = new Object(), _lock3 = new Object();
+    private final Object _lock1 = new Object(), _lock2 = new Object();
 
     private static final List<RouterContext> _contexts = new CopyOnWriteArrayList<RouterContext>();
     
@@ -546,42 +546,6 @@ public class RouterContext extends I2PAppContext {
         return _internalClientManager;
     }
 
-    /**
-     *  The controller of router, plugin, and other updates.
-     *  @return The manager if it is registered, else null
-     *  @since 0.9.4
-     */
-    @Override
-    public UpdateManager updateManager() {
-        return _updateManager;
-    }
-
-    /**
-     *  Register as the update manager.
-     *  @throws IllegalStateException if one was already registered
-     *  @since 0.9.4
-     */
-    public void registerUpdateManager(UpdateManager mgr) {
-        synchronized(_lock3) {
-            if (_updateManager != null)
-                throw new IllegalStateException();
-            _updateManager = mgr;
-        }
-    }
-
-    /**
-     *  Unregister the update manager.
-     *  @throws IllegalStateException if it was not registered
-     *  @since 0.9.4
-     */
-    public void unregisterUpdateManager(UpdateManager mgr) {
-        synchronized(_lock3) {
-            if (_updateManager != mgr)
-                throw new IllegalStateException();
-            _updateManager = null;
-        }
-    }
-
     /**
      *  The RouterAppManager.
      *  @return the manager
diff --git a/router/java/src/net/i2p/router/RouterLaunch.java b/router/java/src/net/i2p/router/RouterLaunch.java
index 7bbfed86d59aae92780d60a2e42c4965c981e32e..5ebe0e16b097fb888212c6d1bd527f457f36a08e 100644
--- a/router/java/src/net/i2p/router/RouterLaunch.java
+++ b/router/java/src/net/i2p/router/RouterLaunch.java
@@ -10,6 +10,13 @@ package net.i2p.router;
  */
 public class RouterLaunch {
 
+    /**
+     *  Usage: RouterLaunch [rebuild]
+     *  No other options allowed, for now
+     *
+     *  @param args non-null
+     *  @throws IllegalArgumentException
+     */
     public static void main(String args[]) {
 	Router.main(args);
     }
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 47667df539bd297c62e69b6a952beec675fc634a..a6204817e3d9e640632604f1432a96320e1992ce 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 = 9;
+    public final static long BUILD = 8;
 
     /** for example "-test" */
-    public final static String EXTRA = "-rc";
+    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 bc9e73c6e9b261d920518b788b19dd9ba5c1621d..133c2600bf4f8fd0d8f674c795fa83678a62a1eb 100644
--- a/router/java/src/net/i2p/router/TunnelPoolSettings.java
+++ b/router/java/src/net/i2p/router/TunnelPoolSettings.java
@@ -69,9 +69,9 @@ public class TunnelPoolSettings {
     private static final int    DEFAULT_LENGTH_VARIANCE = 0;
     /** expl only */
     private static final int    DEFAULT_IB_EXPL_LENGTH = 2;
-    private static final int    DEFAULT_OB_EXPL_LENGTH = 2;
+    private static final int    DEFAULT_OB_EXPL_LENGTH = isSlow ? 2 : 3;
     private static final int    DEFAULT_IB_EXPL_LENGTH_VARIANCE = isSlow ? 0 : 1;
-    private static final int    DEFAULT_OB_EXPL_LENGTH_VARIANCE = isSlow ? 0 : 1;
+    private static final int    DEFAULT_OB_EXPL_LENGTH_VARIANCE = 0;
 
     public static final boolean DEFAULT_ALLOW_ZERO_HOP = true;
     public static final int     DEFAULT_IP_RESTRICTION = 2;    // class B (/16)
diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
index 5fa987de5bba554aacd1954e865509e7564a2892..8f3a216e508828188c3e980f68d0950fe1f61ea7 100644
--- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
+++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
@@ -218,9 +218,21 @@ class ClientConnectionRunner {
      */
     public Hash getDestHash() { return _destHashCache; }
     
-    /** current client's sessionId */
+    /**
+     * @return current client's sessionId or null if not yet set
+     */
     SessionId getSessionId() { return _sessionId; }
-    void setSessionId(SessionId id) { if (id != null) _sessionId = id; }
+
+    /**
+     *  To be called only by ClientManager.
+     *
+     *  @throws IllegalStateException if already set
+     */
+    void setSessionId(SessionId id) {
+        if (_sessionId != null)
+            throw new IllegalStateException();
+        _sessionId = id;
+    }
 
     /** data for the current leaseRequest, or null if there is no active leaseSet request */
     LeaseRequestState getLeaseRequest() { return _leaseRequest; }
@@ -263,7 +275,14 @@ class ClientConnectionRunner {
         _messages.remove(id); 
     }
     
-    void sessionEstablished(SessionConfig config) {
+    /**
+     *  Caller must send a SessionStatusMessage to the client with the returned code.
+     *  Caller must call disconnectClient() on failure.
+     *  Side effect: Sets the session ID.
+     *
+     *  @return SessionStatusMessage return code, 1 for success, != 1 for failure
+     */
+    public int sessionEstablished(SessionConfig config) {
         _destHashCache = config.getDestination().calculateHash();
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("SessionEstablished called for destination " + _destHashCache.toBase64());
@@ -293,7 +312,7 @@ class ClientConnectionRunner {
         } else {
             _log.error("SessionEstablished called for twice for destination " + _destHashCache.toBase64().substring(0,4));
         }
-        _manager.destinationEstablished(this);
+        return _manager.destinationEstablished(this);
     }
     
     /** 
diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java
index 02b60d3e3b97900f91305005ab4da83f7ebdcffb..9ece4d6c59302f1dc9fe795c068f0616506a30c0 100644
--- a/router/java/src/net/i2p/router/client/ClientManager.java
+++ b/router/java/src/net/i2p/router/client/ClientManager.java
@@ -27,6 +27,8 @@ import net.i2p.data.i2cp.I2CPMessage;
 import net.i2p.data.i2cp.MessageId;
 import net.i2p.data.i2cp.MessageStatusMessage;
 import net.i2p.data.i2cp.SessionConfig;
+import net.i2p.data.i2cp.SessionId;
+import net.i2p.data.i2cp.SessionStatusMessage;
 import net.i2p.internal.I2CPMessageQueue;
 import net.i2p.router.ClientManagerFacade;
 import net.i2p.router.ClientMessage;
@@ -52,6 +54,7 @@ class ClientManager {
     private final Map<Hash, ClientConnectionRunner>  _runnersByHash;
     // ClientConnectionRunner for clients w/out a Dest yet
     private final Set<ClientConnectionRunner> _pendingRunners;
+    private final Set<SessionId> _runnerSessionIds;
     protected final RouterContext _ctx;
     protected final int _port;
     protected volatile boolean _isStarted;
@@ -65,6 +68,14 @@ class ClientManager {
 
     private static final long REQUEST_LEASESET_TIMEOUT = 60*1000;
 
+    /** 2 bytes, save 65535 for unknown */
+    private static final int MAX_SESSION_ID = 65534;
+    private static final String PROP_MAX_SESSIONS = "i2cp.maxSessions";
+    private static final int DEFAULT_MAX_SESSIONS = 100;
+    /** 65535 */
+    public static final SessionId UNKNOWN_SESSION_ID = new SessionId(MAX_SESSION_ID + 1);
+
+
     /**
      *  Does not start the listeners.
      *  Caller must call start()
@@ -79,6 +90,7 @@ class ClientManager {
         _runners = new ConcurrentHashMap<Destination, ClientConnectionRunner>();
         _runnersByHash = new ConcurrentHashMap<Hash, ClientConnectionRunner>();
         _pendingRunners = new HashSet<ClientConnectionRunner>();
+        _runnerSessionIds = new HashSet<SessionId>();
         _port = port;
         // following are for RequestLeaseSetJob
         _ctx.statManager().createRateStat("client.requestLeaseSetSuccess", "How frequently the router requests successfully a new leaseSet?", "ClientMessages", new long[] { 60*60*1000 });
@@ -182,6 +194,9 @@ class ClientManager {
             // after connection establishment
             Destination dest = runner.getConfig().getDestination();
             synchronized (_runners) {
+                SessionId id = runner.getSessionId();
+                if (id != null)
+                    _runnerSessionIds.remove(id);
                 _runners.remove(dest);
                 _runnersByHash.remove(dest.calculateHash());
             }
@@ -189,9 +204,13 @@ class ClientManager {
     }
     
     /**
-     * Add to the clients list. Check for a dup destination.
+     *  Add to the clients list. Check for a dup destination.
+     *  Side effect: Sets the session ID of the runner.
+     *  Caller must call runner.disconnectClient() on failure.
+     *
+     *  @return SessionStatusMessage return code, 1 for success, != 1 for failure
      */
-    public void destinationEstablished(ClientConnectionRunner runner) {
+    public int destinationEstablished(ClientConnectionRunner runner) {
         Destination dest = runner.getConfig().getDestination();
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("DestinationEstablished called for destination " + dest.calculateHash().toBase64());
@@ -199,20 +218,51 @@ class ClientManager {
         synchronized (_pendingRunners) {
             _pendingRunners.remove(runner);
         }
-        boolean fail = false;
+        int rv;
         synchronized (_runners) {
-            fail = _runnersByHash.containsKey(dest.calculateHash());
-            if (!fail) {
-                _runners.put(dest, runner);
-                _runnersByHash.put(dest.calculateHash(), runner);
+            boolean fail = _runnersByHash.containsKey(dest.calculateHash());
+            if (fail) {
+                rv = SessionStatusMessage.STATUS_INVALID;
+            } else {
+                SessionId id = locked_getNextSessionId();
+                if (id != null) {
+                    runner.setSessionId(id);
+                    _runners.put(dest, runner);
+                    _runnersByHash.put(dest.calculateHash(), runner);
+                    rv = SessionStatusMessage.STATUS_CREATED;
+                } else {
+                    rv = SessionStatusMessage.STATUS_REFUSED;
+                }
             }
         }
-        if (fail) {
+        if (rv == SessionStatusMessage.STATUS_INVALID) {
             _log.log(Log.CRIT, "Client attempted to register duplicate destination " + dest.calculateHash().toBase64());
-            runner.disconnectClient("Duplicate destination");
+        } else if (rv == SessionStatusMessage.STATUS_REFUSED) {
+            _log.error("Max sessions exceeded " + dest.calculateHash().toBase64());
         }
+        return rv;
     }
     
+    /**
+     *  Generate a new random, unused sessionId. Caller must synch on _runners.
+     *  @return null on failure
+     *  @since 0.9.12
+     */
+    private SessionId locked_getNextSessionId() { 
+        int max = Math.max(1, Math.min(2048, _ctx.getProperty(PROP_MAX_SESSIONS, DEFAULT_MAX_SESSIONS)));
+        if (_runnerSessionIds.size() >= max) {
+            _log.logAlways(Log.WARN, "Session refused, max is " + max + ", increase " + PROP_MAX_SESSIONS);
+            return null;
+        }
+        for (int i = 0; i < 100; i++) {
+            SessionId id = new SessionId(_ctx.random().nextInt(MAX_SESSION_ID + 1));
+            if (_runnerSessionIds.add(id))
+                return id; 
+        }
+        _log.logAlways(Log.WARN, "Session refused, can't find id slot");
+        return null;
+    }
+
     /**
      * Distribute message to a local or remote destination.
      * @param flags ignored for local
diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
index 7707813a3702849328bb155b5ec2341ac34ce4f8..a2f506b3a602efd057587e6bd95b497156ccf501 100644
--- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
+++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
@@ -197,6 +197,7 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
         } else {
             if (_log.shouldLog(Log.ERROR))
                 _log.error("Signature verification *FAILED* on a create session message.  Hijack attempt?");
+            // For now, we do NOT send a SessionStatusMessage - see javadoc above
             _runner.disconnectClient("Invalid signature on CreateSessionMessage");
             return;
         }
@@ -206,10 +207,11 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
         if (!checkAuth(inProps))
             return;
 
-        SessionId sessionId = new SessionId();
-        sessionId.setSessionId(getNextSessionId()); 
-        _runner.setSessionId(sessionId);
-        sendStatusMessage(SessionStatusMessage.STATUS_CREATED);
+        SessionId id = _runner.getSessionId();
+        if (id != null) {
+            _runner.disconnectClient("Already have session " + id);
+            return;
+        }
 
         // Copy over the whole config structure so we don't later corrupt it on
         // the client side if we change settings or later get a
@@ -219,10 +221,25 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
         Properties props = new Properties();
         props.putAll(in.getOptions());
         cfg.setOptions(props);
-        _runner.sessionEstablished(cfg);
+        int status = _runner.sessionEstablished(cfg);
+        if (status != SessionStatusMessage.STATUS_CREATED) {
+            // For now, we do NOT send a SessionStatusMessage - see javadoc above
+            if (_log.shouldLog(Log.ERROR))
+                _log.error("Session establish failed: code = " + status);
+            String msg;
+            if (status == SessionStatusMessage.STATUS_INVALID)
+                msg = "duplicate destination";
+            else if (status == SessionStatusMessage.STATUS_REFUSED)
+                msg = "session limit exceeded";
+            else
+                msg = "unknown error";
+            _runner.disconnectClient(msg);
+            return;
+        }
+        sendStatusMessage(status);
 
-        if (_log.shouldLog(Log.DEBUG))
-            _log.debug("after sessionEstablished for " + _runner.getDestHash());
+        if (_log.shouldLog(Log.INFO))
+            _log.info("Session " + _runner.getSessionId() + " established for " + _runner.getDestHash());
         startCreateSessionJob();
     }
     
@@ -410,7 +427,10 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
     
     private void sendStatusMessage(int status) {
         SessionStatusMessage msg = new SessionStatusMessage();
-        msg.setSessionId(_runner.getSessionId());
+        SessionId id = _runner.getSessionId();
+        if (id == null)
+            id = ClientManager.UNKNOWN_SESSION_ID;
+        msg.setSessionId(id);
         msg.setStatus(status);
         try {
             _runner.doSend(msg);
@@ -435,23 +455,8 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
             _runner.doSend(msg);
         } catch (I2CPMessageException ime) {
             if (_log.shouldLog(Log.WARN))
-                _log.warn("Error writing out the session status message", ime);
+                _log.warn("Error writing bw limits msg", ime);
         }
     }
 
-    // this *should* be mod 65536, but UnsignedInteger is still b0rked.  FIXME
-    private final static int MAX_SESSION_ID = 32767;
-
-    private static volatile int _id = RandomSource.getInstance().nextInt(MAX_SESSION_ID); // sessionId counter
-    private final static Object _sessionIdLock = new Object();
-    
-    /** generate a new sessionId */
-    private final static int getNextSessionId() { 
-        synchronized (_sessionIdLock) {
-            int id = (++_id)%MAX_SESSION_ID;
-            if (_id >= MAX_SESSION_ID)
-                _id = 0; 
-            return id; 
-        }
-    }
 }
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
index d837c1f1cb41f7f742034526ba139d07af58829f..ad2322c47813250de0dc05ab632cca101a9f51a6 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
@@ -12,8 +12,10 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
+import net.i2p.data.Certificate;
 import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
+import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterInfo;
 import net.i2p.data.TunnelId;
 import net.i2p.data.i2np.DatabaseStoreMessage;
@@ -163,6 +165,18 @@ class StoreJob extends JobImpl {
                     if (_log.shouldLog(Log.INFO))
                         _log.info(getJobId() + ": Error selecting closest hash that wasnt a router! " + peer + " : " + ds);
                     _state.addSkipped(peer);
+                } else if (_state.getData().getType() == DatabaseEntry.KEY_TYPE_LEASESET &&
+                           ((LeaseSet)_state.getData()).getDestination().getCertificate().getCertificateType() == Certificate.CERTIFICATE_TYPE_KEY &&
+                           !supportsKeyCerts((RouterInfo)ds)) {
+                    if (_log.shouldLog(Log.INFO))
+                        _log.info(getJobId() + ": Skipping router that doesn't support key certs " + peer + " : " + ds);
+                    _state.addSkipped(peer);
+                } else if (_state.getData().getType() == DatabaseEntry.KEY_TYPE_LEASESET &&
+                           ((LeaseSet)_state.getData()).getLeaseCount() > 6 &&
+                           !supportsBigLeaseSets((RouterInfo)ds)) {
+                    if (_log.shouldLog(Log.INFO))
+                        _log.info(getJobId() + ": Skipping router that doesn't support big leasesets " + peer + " : " + ds);
+                    _state.addSkipped(peer);
                 } else {
                     int peerTimeout = _facade.getPeerTimeout(peer);
 
@@ -487,6 +501,32 @@ class StoreJob extends JobImpl {
         return VersionComparator.comp(v, MIN_ENCRYPTION_VERSION) >= 0;
     }
 
+    private static final String MIN_KEYCERT_VERSION = "0.9.12";
+
+    /**
+     * Does he support key certs (assumed with a non-DSA key)?
+     * @since 0.9.12
+     */
+    private static boolean supportsKeyCerts(RouterInfo ri) {
+        String v = ri.getOption("router.version");
+        if (v == null)
+            return false;
+        return VersionComparator.comp(v, MIN_KEYCERT_VERSION) >= 0;
+    }
+
+    private static final String MIN_BIGLEASESET_VERSION = "0.9";
+
+    /**
+     * Does he support more than 6 leasesets?
+     * @since 0.9.12
+     */
+    private static boolean supportsBigLeaseSets(RouterInfo ri) {
+        String v = ri.getOption("router.version");
+        if (v == null)
+            return false;
+        return VersionComparator.comp(v, MIN_BIGLEASESET_VERSION) >= 0;
+    }
+
     /**
      * Called after sending a dbStore to a peer successfully, 
      * marking the store as successful
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 43cdba3bac1d06adc43384358bf791ab1039c154..d4fd7521acaab9ba5719aa4be396cf2e8e0ef8dd 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
@@ -211,7 +211,7 @@ class EventPumper implements Runnable {
                         int failsafeInvalid = 0;
 
                         // Increase allowed idle time if we are well under allowed connections, otherwise decrease
-                        if (_transport.haveCapacity(45))
+                        if (_transport.haveCapacity(33))
                             _expireIdleWriteTime = Math.min(_expireIdleWriteTime + 1000, MAX_EXPIRE_IDLE_TIME);
                         else
                             _expireIdleWriteTime = Math.max(_expireIdleWriteTime - 3000, MIN_EXPIRE_IDLE_TIME);
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 01ae042caab4766d540911c61e4ff2c3b65117e3..4117edb14fd8b2a630c7a6d9a854729b0e986f94 100644
--- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
@@ -411,13 +411,34 @@ class IntroductionManager {
         // TODO throttle based on alice identity and/or intro tag?
 
         _context.statManager().addRateData("udp.receiveRelayRequest", 1, 0);
-        byte key[] = new byte[SessionKey.KEYSIZE_BYTES];
-        reader.getRelayRequestReader().readAliceIntroKey(key, 0);
-        SessionKey aliceIntroKey = new SessionKey(key);
+
         // send that peer an introduction for alice
         _transport.send(_builder.buildRelayIntro(alice, charlie, reader.getRelayRequestReader()));
+
         // send alice back charlie's info
-        _transport.send(_builder.buildRelayResponse(alice, charlie, reader.getRelayRequestReader().readNonce(), aliceIntroKey));
+        // lookup session so we can use session key if available
+        SessionKey cipherKey = null;
+        SessionKey macKey = null;
+        PeerState aliceState = _transport.getPeerState(alice);
+        if (aliceState != null) {
+            // established session (since 0.9.12)
+            cipherKey = aliceState.getCurrentCipherKey();
+            macKey = aliceState.getCurrentMACKey();
+        }
+        if (cipherKey == null || macKey == null) {
+            // no session, use intro key (was only way before 0.9.12)
+            byte key[] = new byte[SessionKey.KEYSIZE_BYTES];
+            reader.getRelayRequestReader().readAliceIntroKey(key, 0);
+            cipherKey = new SessionKey(key);
+            macKey = cipherKey;
+            if (_log.shouldLog(Log.INFO))
+                _log.info("Sending relay response (w/ intro key) to " + alice);
+        } else {
+            if (_log.shouldLog(Log.INFO))
+                _log.info("Sending relay response (in-session) to " + alice);
+        }
+        _transport.send(_builder.buildRelayResponse(alice, charlie, reader.getRelayRequestReader().readNonce(),
+                                                    cipherKey, macKey));
     }
 
     /**
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 9d14a4a23d8c51c707d53e60763deb64500b1975..d81674bb0b2613015c829b8a6c65f1070271da60 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java
@@ -96,6 +96,7 @@ class OutboundEstablishState {
     /**
      *  @param claimedAddress an IP/port based RemoteHostId, or null if unknown
      *  @param remoteHostId non-null, == claimedAddress if direct, or a hash-based one if indirect
+     *  @param introKey Bob's introduction key, as published in the netdb
      *  @param addr non-null
      */
     public OutboundEstablishState(RouterContext ctx, RemoteHostId claimedAddress,
@@ -163,6 +164,10 @@ class OutboundEstablishState {
     }
     
     public RouterIdentity getRemoteIdentity() { return _remotePeer; }
+
+    /**
+     *  Bob's introduction key, as published in the netdb
+     */
     public SessionKey getIntroKey() { return _introKey; }
     
     /** caller must synch - only call once */
@@ -327,8 +332,8 @@ class OutboundEstablishState {
      */
     private void decryptSignature() {
         if (_receivedEncryptedSignature == null) throw new NullPointerException("encrypted signature is null! this=" + this.toString());
-        else if (_sessionKey == null) throw new NullPointerException("SessionKey is null!");
-        else if (_receivedIV == null) throw new NullPointerException("IV is null!");
+        if (_sessionKey == null) throw new NullPointerException("SessionKey is null!");
+        if (_receivedIV == null) throw new NullPointerException("IV is null!");
         _context.aes().decrypt(_receivedEncryptedSignature, 0, _receivedEncryptedSignature, 0, 
                                _sessionKey, _receivedIV, _receivedEncryptedSignature.length);
         byte signatureBytes[] = new byte[Signature.SIGNATURE_BYTES];
diff --git a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
index 647c207ae2489fbb367115e4b22614c145e6d982..c70177b9dbd8eed5254b7d779d46ac6024c36397 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
@@ -957,7 +957,8 @@ class PacketBuilder {
      * 
      * @return ready to send packet, or null if there was a problem
      */
-    public UDPPacket buildPeerTestToAlice(InetAddress aliceIP, int alicePort, SessionKey aliceIntroKey, SessionKey charlieIntroKey, long nonce) {
+    public UDPPacket buildPeerTestToAlice(InetAddress aliceIP, int alicePort,
+                                          SessionKey aliceIntroKey, SessionKey charlieIntroKey, long nonce) {
         UDPPacket packet = buildPacketHeader(PEER_TEST_FLAG_BYTE);
         DatagramPacket pkt = packet.getPacket();
         byte data[] = pkt.getData();
@@ -1031,7 +1032,9 @@ class PacketBuilder {
      * 
      * @return ready to send packet, or null if there was a problem
      */
-    public UDPPacket buildPeerTestToBob(InetAddress bobIP, int bobPort, InetAddress aliceIP, int alicePort, SessionKey aliceIntroKey, long nonce, SessionKey bobCipherKey, SessionKey bobMACKey) {
+    public UDPPacket buildPeerTestToBob(InetAddress bobIP, int bobPort, InetAddress aliceIP, int alicePort,
+                                        SessionKey aliceIntroKey, long nonce,
+                                        SessionKey bobCipherKey, SessionKey bobMACKey) {
         UDPPacket packet = buildPacketHeader(PEER_TEST_FLAG_BYTE);
         DatagramPacket pkt = packet.getPacket();
         byte data[] = pkt.getData();
@@ -1100,7 +1103,34 @@ class PacketBuilder {
                 // TODO implement some sort of introducer banlist
                 continue;
             }
-            rv.add(buildRelayRequest(iaddr, iport, ikey, tag, ourIntroKey, state.getIntroNonce(), true));
+
+            // lookup session so we can use session key if available
+            SessionKey cipherKey = null;
+            SessionKey macKey = null;
+            // first look up by ikey, it is equal to router hash for now
+            PeerState bobState = transport.getPeerState(Hash.create(ikey));
+            if (bobState == null) {
+                RemoteHostId rhid = new RemoteHostId(iaddr.getAddress(), iport);
+                bobState = transport.getPeerState(rhid);
+            }
+            if (bobState != null) {
+                // established session (since 0.9.12)
+                cipherKey = bobState.getCurrentCipherKey();
+                macKey = bobState.getCurrentMACKey();
+            }
+            if (cipherKey == null || macKey == null) {
+                // no session, use intro key (was only way before 0.9.12)
+                cipherKey = new SessionKey(ikey);
+                macKey = cipherKey;
+                if (_log.shouldLog(Log.INFO))
+                    _log.info("Sending relay request (w/ intro key) to " + iaddr + ":" + iport);
+            } else {
+                if (_log.shouldLog(Log.INFO))
+                    _log.info("Sending relay request (in-session) to " + iaddr + ":" + iport);
+            }
+
+            rv.add(buildRelayRequest(iaddr, iport, cipherKey, macKey, tag,
+                                     ourIntroKey, state.getIntroNonce()));
         }
         return rv;
     }
@@ -1110,8 +1140,9 @@ class PacketBuilder {
      *  send a RelayRequest over IPv6
      *
      */
-    private UDPPacket buildRelayRequest(InetAddress introHost, int introPort, byte introKey[],
-                                        long introTag, SessionKey ourIntroKey, long introNonce, boolean encrypt) {
+    private UDPPacket buildRelayRequest(InetAddress introHost, int introPort,
+                                        SessionKey cipherKey, SessionKey macKey,
+                                        long introTag, SessionKey ourIntroKey, long introNonce) {
         UDPPacket packet = buildPacketHeader(PEER_RELAY_REQUEST_FLAG_BYTE);
         DatagramPacket pkt = packet.getPacket();
         byte data[] = pkt.getData();
@@ -1121,9 +1152,6 @@ class PacketBuilder {
         byte ourIP[] = getOurExplicitIP();
         int ourPort = getOurExplicitPort();
         
-        if (_log.shouldLog(Log.INFO))
-            _log.info("Sending intro relay request to " + introHost + ":" + introPort); // + " regarding " + state.getRemoteIdentity().calculateHash().toBase64());
-        
         // now for the body
         DataHelper.toLong(data, off, 4, introTag);
         off += 4;
@@ -1160,8 +1188,7 @@ class PacketBuilder {
         off = pad1(data, off);
         off = pad2(data, off);
         pkt.setLength(off);
-        if (encrypt)
-            authenticate(packet, new SessionKey(introKey), new SessionKey(introKey));
+        authenticate(packet, cipherKey, macKey);
         setTo(packet, introHost, introPort);
         packet.setMessageType(TYPE_RREQ);
         return packet;
@@ -1214,7 +1241,8 @@ class PacketBuilder {
      */
     private static final byte PEER_RELAY_RESPONSE_FLAG_BYTE = (UDPPacket.PAYLOAD_TYPE_RELAY_RESPONSE << 4);
     
-    UDPPacket buildRelayResponse(RemoteHostId alice, PeerState charlie, long nonce, SessionKey aliceIntroKey) {
+    UDPPacket buildRelayResponse(RemoteHostId alice, PeerState charlie, long nonce,
+                                 SessionKey cipherKey, SessionKey macKey) {
         InetAddress aliceAddr = null;
         try {
             aliceAddr = InetAddress.getByAddress(alice.getIP());
@@ -1228,7 +1256,7 @@ class PacketBuilder {
         int off = HEADER_SIZE;
         
         if (_log.shouldLog(Log.INFO))
-            _log.info("Sending relay response to " + alice + " for " + charlie + " with alice's intro key " + aliceIntroKey);
+            _log.info("Sending relay response to " + alice + " for " + charlie + " with key " + cipherKey);
 
         // now for the body
         byte charlieIP[] = charlie.getRemoteIP();
@@ -1255,7 +1283,7 @@ class PacketBuilder {
         off = pad1(data, off);
         off = pad2(data, off);
         pkt.setLength(off);
-        authenticate(packet, aliceIntroKey, aliceIntroKey);
+        authenticate(packet, cipherKey, macKey);
         setTo(packet, aliceAddr, alice.getPort());
         packet.setMessageType(TYPE_RESP);
         return packet;
@@ -1416,7 +1444,7 @@ class PacketBuilder {
      * @param iv IV to deliver
      */
     private void authenticate(UDPPacket packet, SessionKey cipherKey, SessionKey macKey, byte[] iv) {
-        long before = System.currentTimeMillis();
+        //long before = System.currentTimeMillis();
         DatagramPacket pkt = packet.getPacket();
         int off = pkt.getOffset();
         int hmacOff = off;
@@ -1454,9 +1482,10 @@ class PacketBuilder {
         System.arraycopy(ba, 0, data, hmacOff, UDPPacket.MAC_SIZE);
         SimpleByteCache.release(ba);
         System.arraycopy(iv, 0, data, hmacOff + UDPPacket.MAC_SIZE, UDPPacket.IV_SIZE);
-        long timeToAuth = System.currentTimeMillis() - before;
-        _context.statManager().addRateData("udp.packetAuthTime", timeToAuth, timeToAuth);
-        if (timeToAuth > 100)
-            _context.statManager().addRateData("udp.packetAuthTimeSlow", timeToAuth, timeToAuth);
+        // avg. 0.06 ms on a 2005-era PC
+        //long timeToAuth = System.currentTimeMillis() - before;
+        //_context.statManager().addRateData("udp.packetAuthTime", timeToAuth, timeToAuth);
+        //if (timeToAuth > 100)
+        //    _context.statManager().addRateData("udp.packetAuthTimeSlow", timeToAuth, timeToAuth);
     }
 }
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 5d3df1926ab5c38bcf21c7192e79146c82155700..8ad73330e47858314452db2ee4e5eaccec407729 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
@@ -47,6 +47,8 @@ class PacketHandler {
     /** let packets be up to 30s slow */
     private static final long GRACE_PERIOD = Router.CLOCK_FUDGE_FACTOR + 30*1000;
     
+    private enum AuthType { NONE, INTRO, BOBINTRO, SESSION }
+
     PacketHandler(RouterContext ctx, UDPTransport transport, EstablishmentManager establisher,
                   InboundMessageFragments inbound, PeerTestManager testManager, IntroductionManager introManager) {
         _context = ctx;
@@ -319,7 +321,7 @@ class PacketHandler {
          */
         private void receivePacket(UDPPacketReader reader, UDPPacket packet, PeerState state) {
             _state = 17;
-            boolean isStray = false;
+            AuthType auth = AuthType.NONE;
             boolean isValid = packet.validate(state.getCurrentMACKey());
             if (!isValid) {
                 _state = 18;
@@ -341,7 +343,7 @@ class PacketHandler {
                         if (_log.shouldLog(Log.DEBUG))
                             _log.debug("Validation with existing con failed, but validation as reestablish/stray passed");
                         packet.decrypt(_transport.getIntroKey());
-                        isStray = true;
+                        auth = AuthType.INTRO;
                     } else {
                         _state = 21;
                         InboundEstablishState est = _establisher.getInboundState(packet.getRemoteHost());
@@ -360,14 +362,16 @@ class PacketHandler {
                 } else {
                     _state = 23;
                     packet.decrypt(state.getNextCipherKey());
+                    auth = AuthType.SESSION;
                 }
             } else {
                 _state = 24;
                 packet.decrypt(state.getCurrentCipherKey());
+                auth = AuthType.SESSION;
             }
 
             _state = 25;
-            handlePacket(reader, packet, state, null, null, !isStray);
+            handlePacket(reader, packet, state, null, null, auth);
             _state = 26;
         }
 
@@ -436,7 +440,7 @@ class PacketHandler {
                                 buf.append(" CHANGED PORT TO ").append(newPort).append(" AND HANDLED");
                                 _log.warn(buf.toString());
                             }
-                            handlePacket(reader, packet, state, null, null, true);
+                            handlePacket(reader, packet, state, null, null, AuthType.SESSION);
                             return;
                         }
                         if (_log.shouldLog(Log.WARN))
@@ -475,7 +479,7 @@ class PacketHandler {
             //  80 byte Peer Test
             _state = 29;
             packet.decrypt(_transport.getIntroKey());
-            handlePacket(reader, packet, null, null, null, false);
+            handlePacket(reader, packet, null, null, null, AuthType.INTRO);
             _state = 30;
         }
 
@@ -512,7 +516,7 @@ class PacketHandler {
 
                     _state = 32;
                     packet.decrypt(state.getCipherKey());
-                    handlePacket(reader, packet, null, null, null, true);
+                    handlePacket(reader, packet, null, null, null, AuthType.SESSION);
                     return;
                 } else {
                     if (_log.shouldLog(Log.WARN))
@@ -552,11 +556,12 @@ class PacketHandler {
                 _state = 36;
                 isValid = packet.validate(state.getMACKey());
                 if (isValid) {
+                    // this should be the Session Confirmed packet
                     if (_log.shouldLog(Log.INFO))
                         _log.info("Valid introduction packet received for outbound established con: " + packet);
                     _state = 37;
                     packet.decrypt(state.getCipherKey());
-                    handlePacket(reader, packet, null, state, null, true);
+                    handlePacket(reader, packet, null, state, null, AuthType.SESSION);
                     _state = 38;
                     return;
                 }
@@ -566,10 +571,11 @@ class PacketHandler {
             isValid = packet.validate(state.getIntroKey());
             if (isValid) {
                 if (_log.shouldLog(Log.INFO))
-                    _log.info("Valid introduction packet received for outbound established con with old intro key: " + packet);
+                    _log.info("Valid packet received for " + state + " with Bob's intro key: " + packet);
                 _state = 39;
                 packet.decrypt(state.getIntroKey());
-                handlePacket(reader, packet, null, state, null, true);
+                // the only packet we should be getting with Bob's intro key is Session Created
+                handlePacket(reader, packet, null, state, null, AuthType.BOBINTRO);
                 _state = 40;
                 return;
             } else {
@@ -592,11 +598,11 @@ class PacketHandler {
          * @param state non-null if fully established
          * @param outState non-null if outbound establishing in process
          * @param inState unused always null, TODO use for 48-byte destroys during inbound establishment
-         * @param isAuthenticated true if a state key was used, false if our own intro key was used
+         * @param auth what type of authentication succeeded
          */
         private void handlePacket(UDPPacketReader reader, UDPPacket packet, PeerState state,
                                   OutboundEstablishState outState, InboundEstablishState inState,
-                                  boolean isAuthenticated) {
+                                  AuthType auth) {
             _state = 43;
             reader.initialize(packet);
             _state = 44;
@@ -608,7 +614,7 @@ class PacketHandler {
             if (state != null) {
                 if (_log.shouldLog(Log.DEBUG))
                     _log.debug("Received packet from " + state.getRemoteHostId().toString() + " with skew " + skew);
-                if (isAuthenticated)
+                if (auth == AuthType.SESSION)
                     state.adjustClockSkew(skew);
             }
             _context.statManager().addRateData("udp.receivePacketSkew", skew, packet.getLifetime());
@@ -645,14 +651,19 @@ class PacketHandler {
             switch (type) {
                 case UDPPacket.PAYLOAD_TYPE_SESSION_REQUEST:
                     _state = 47;
+                    if (auth == AuthType.BOBINTRO) {
+                        if (_log.shouldLog(Log.WARN))
+                            _log.warn("Dropping type " + type + " auth " + auth + ": " + packet);
+                        break;
+                    }
                     _establisher.receiveSessionRequest(from, reader);
                     //_context.statManager().addRateData("udp.receivePacketSize.sessionRequest", packet.getPacket().getLength(), packet.getLifetime());
                     break;
                 case UDPPacket.PAYLOAD_TYPE_SESSION_CONFIRMED:
                     _state = 48;
-                    if (!isAuthenticated) {
+                    if (auth != AuthType.SESSION) {
                         if (_log.shouldLog(Log.WARN))
-                            _log.warn("Dropping unauthenticated type " + type + ": " + packet);
+                            _log.warn("Dropping type " + type + " auth " + auth + ": " + packet);
                         break;
                     }
                     _establisher.receiveSessionConfirmed(from, reader);
@@ -660,9 +671,10 @@ class PacketHandler {
                     break;
                 case UDPPacket.PAYLOAD_TYPE_SESSION_CREATED:
                     _state = 49;
-                    if (!isAuthenticated) {
+                    // this is the only type that allows BOBINTRO
+                    if (auth != AuthType.BOBINTRO && auth != AuthType.SESSION) {
                         if (_log.shouldLog(Log.WARN))
-                            _log.warn("Dropping unauthenticated type " + type + ": " + packet);
+                            _log.warn("Dropping type " + type + " auth " + auth + ": " + packet);
                         break;
                     }
                     _establisher.receiveSessionCreated(from, reader);
@@ -670,9 +682,9 @@ class PacketHandler {
                     break;
                 case UDPPacket.PAYLOAD_TYPE_DATA:
                     _state = 50;
-                    if (!isAuthenticated) {
+                    if (auth != AuthType.SESSION) {
                         if (_log.shouldLog(Log.WARN))
-                            _log.warn("Dropping unauthenticated type " + type + ": " + packet);
+                            _log.warn("Dropping type " + type + " auth " + auth + ": " + packet);
                         break;
                     }
                     if (outState != null)
@@ -681,8 +693,8 @@ class PacketHandler {
                         _log.debug("Received new DATA packet from " + state + ": " + packet);
                     if (state != null) {
                         UDPPacketReader.DataReader dr = reader.getDataReader();
-                        if (_log.shouldLog(Log.INFO)) {
-                            StringBuilder msg = new StringBuilder();
+                        if (_log.shouldLog(Log.DEBUG)) {
+                            StringBuilder msg = new StringBuilder(512);
                             msg.append("Receive ").append(System.identityHashCode(packet));
                             msg.append(" from ").append(state.getRemotePeer().toBase64()).append(" ").append(state.getRemoteHostId());
                             for (int i = 0; i < dr.readFragmentCount(); i++) {
@@ -692,7 +704,7 @@ class PacketHandler {
                                     msg.append("*");
                             }
                             msg.append(": ").append(dr.toString());
-                            _log.info(msg.toString());
+                            _log.debug(msg.toString());
                         }
                         //packet.beforeReceiveFragments();
                         _inbound.receiveData(state, dr);
@@ -709,21 +721,31 @@ class PacketHandler {
                     break;
                 case UDPPacket.PAYLOAD_TYPE_TEST:
                     _state = 51;
+                    if (auth == AuthType.BOBINTRO) {
+                        if (_log.shouldLog(Log.WARN))
+                            _log.warn("Dropping type " + type + " auth " + auth + ": " + packet);
+                        break;
+                    }
                     if (_log.shouldLog(Log.DEBUG))
                         _log.debug("Received test packet: " + reader + " from " + from);
                     _testManager.receiveTest(from, reader);
                     //_context.statManager().addRateData("udp.receivePacketSize.test", packet.getPacket().getLength(), packet.getLifetime());
                     break;
                 case UDPPacket.PAYLOAD_TYPE_RELAY_REQUEST:
+                    if (auth == AuthType.BOBINTRO) {
+                        if (_log.shouldLog(Log.WARN))
+                            _log.warn("Dropping type " + type + " auth " + auth + ": " + packet);
+                        break;
+                    }
                     if (_log.shouldLog(Log.INFO))
                         _log.info("Received relay request packet: " + reader + " from " + from);
                     _introManager.receiveRelayRequest(from, reader);
                     //_context.statManager().addRateData("udp.receivePacketSize.relayRequest", packet.getPacket().getLength(), packet.getLifetime());
                     break;
                 case UDPPacket.PAYLOAD_TYPE_RELAY_INTRO:
-                    if (!isAuthenticated) {
+                    if (auth != AuthType.SESSION) {
                         if (_log.shouldLog(Log.WARN))
-                            _log.warn("Dropping unauthenticated type " + type + ": " + packet);
+                            _log.warn("Dropping type " + type + " auth " + auth + ": " + packet);
                         break;
                     }
                     if (_log.shouldLog(Log.INFO))
@@ -732,6 +754,11 @@ class PacketHandler {
                     //_context.statManager().addRateData("udp.receivePacketSize.relayIntro", packet.getPacket().getLength(), packet.getLifetime());
                     break;
                 case UDPPacket.PAYLOAD_TYPE_RELAY_RESPONSE:
+                    if (auth == AuthType.BOBINTRO) {
+                        if (_log.shouldLog(Log.WARN))
+                            _log.warn("Dropping type " + type + " auth " + auth + ": " + packet);
+                        break;
+                    }
                     if (_log.shouldLog(Log.INFO))
                         _log.info("Received relay response packet: " + reader + " from " + from);
                     _establisher.receiveRelayResponse(from, reader);
@@ -739,7 +766,10 @@ class PacketHandler {
                     break;
                 case UDPPacket.PAYLOAD_TYPE_SESSION_DESTROY:
                     _state = 53;
-                    if (!isAuthenticated)
+                    if (auth == AuthType.BOBINTRO) {
+                        if (_log.shouldLog(Log.WARN))
+                            _log.warn("Dropping type " + type + " auth " + auth + ": " + packet);
+                    } else if (auth != AuthType.SESSION)
                         _establisher.receiveSessionDestroy(from);  // drops
                     else if (outState != null)
                         _establisher.receiveSessionDestroy(from, outState);
@@ -751,7 +781,7 @@ class PacketHandler {
                 default:
                     _state = 52;
                     if (_log.shouldLog(Log.WARN))
-                        _log.warn("Unknown payload type: " + type);
+                        _log.warn("Dropping type " + type + " auth " + auth + ": " + packet);
                     _context.statManager().addRateData("udp.droppedInvalidUnknown", packet.getLifetime(), packet.getExpiration());
                     return;
             }
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 ba80cb35a86594616db904548bde012ace411941..6b454dd5c1aea1934dc0bf204bba64c38ff9bc7d 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
@@ -266,8 +266,9 @@ class PeerTestManager {
         if (!expired()) {
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Sending test to Bob: " + test);
-            _transport.send(_packetBuilder.buildPeerTestFromAlice(test.getBobIP(), test.getBobPort(), test.getBobCipherKey(), test.getBobMACKey(), //_bobIntroKey, 
-                            test.getNonce(), _transport.getIntroKey()));
+            _transport.send(_packetBuilder.buildPeerTestFromAlice(test.getBobIP(), test.getBobPort(),
+                                                                  test.getBobCipherKey(), test.getBobMACKey(), //_bobIntroKey, 
+                                                                  test.getNonce(), _transport.getIntroKey()));
         } else {
             _currentTest = null;
         }
@@ -279,8 +280,9 @@ class PeerTestManager {
         if (!expired()) {
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Sending test to Charlie: " + test);
-            _transport.send(_packetBuilder.buildPeerTestFromAlice(test.getCharlieIP(), test.getCharliePort(), test.getCharlieIntroKey(), 
-                            test.getNonce(), _transport.getIntroKey()));
+            _transport.send(_packetBuilder.buildPeerTestFromAlice(test.getCharlieIP(), test.getCharliePort(),
+                                                                  test.getCharlieIntroKey(), 
+                                                                  test.getNonce(), _transport.getIntroKey()));
         } else {
             _currentTest = null;
         }
@@ -695,10 +697,13 @@ class PeerTestManager {
                 _context.simpleScheduler().addEvent(new RemoveTest(nonce), MAX_CHARLIE_LIFETIME);
             }
 
-            UDPPacket packet = _packetBuilder.buildPeerTestToBob(bobIP, from.getPort(), aliceIP, alicePort, aliceIntroKey, nonce, state.getBobCipherKey(), state.getBobMACKey());
+            UDPPacket packet = _packetBuilder.buildPeerTestToBob(bobIP, from.getPort(), aliceIP, alicePort,
+                                                                 aliceIntroKey, nonce,
+                                                                 state.getBobCipherKey(), state.getBobMACKey());
             _transport.send(packet);
             
-            packet = _packetBuilder.buildPeerTestToAlice(aliceIP, alicePort, aliceIntroKey, _transport.getIntroKey(), nonce);
+            packet = _packetBuilder.buildPeerTestToAlice(aliceIP, alicePort, aliceIntroKey,
+                                                         _transport.getIntroKey(), nonce);
             _transport.send(packet);
         } catch (UnknownHostException uhe) {
             if (_log.shouldLog(Log.WARN))
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPPacket.java b/router/java/src/net/i2p/router/transport/udp/UDPPacket.java
index a3cdf57a007c92187b80181139f7ef3bdbb6e0e5..252490cfc666cad5fcbdf4c10bbafbeb1b268e51 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPPacket.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPPacket.java
@@ -7,8 +7,10 @@ import java.util.Queue;
 import java.util.concurrent.LinkedBlockingQueue;
 
 import net.i2p.I2PAppContext;
+import net.i2p.data.Base64;
 import net.i2p.data.DataHelper;
 import net.i2p.data.SessionKey;
+import net.i2p.router.RouterContext;
 import net.i2p.router.util.CDQEntry;
 import net.i2p.util.Addresses;
 import net.i2p.util.Log;
@@ -206,24 +208,32 @@ class UDPPacket implements CDQEntry {
             off += 2;
 
             eq = _context.hmac().verify(macKey, _validateBuf, 0, off, _data, _packet.getOffset(), MAC_SIZE);
-            /*
-            Hash hmac = _context.hmac().calculate(macKey, buf.getData(), 0, off);
 
-            if (_log.shouldLog(Log.DEBUG)) {
-                StringBuilder str = new StringBuilder(128);
-                str.append(_packet.getLength()).append(" byte packet received, payload length ");
-                str.append(payloadLength);
-                str.append("\nIV: ").append(Base64.encode(buf.getData(), payloadLength, IV_SIZE));
-                str.append("\nIV2: ").append(Base64.encode(_data, MAC_SIZE, IV_SIZE));
-                str.append("\nlen: ").append(DataHelper.fromLong(buf.getData(), payloadLength + IV_SIZE, 2));
-                str.append("\nMAC key: ").append(macKey.toBase64());
-                str.append("\ncalc HMAC: ").append(Base64.encode(hmac.getData()));
-                str.append("\nread HMAC: ").append(Base64.encode(_data, _packet.getOffset(), MAC_SIZE));
-                str.append("\nraw: ").append(Base64.encode(_data, _packet.getOffset(), _packet.getLength()));
-                _log.debug(str.toString());
+            if (!eq) {
+                // this is relatively frequent, as you can get old keys in PacketHandler.
+                Log log = _context.logManager().getLog(UDPPacket.class);
+                if (log.shouldLog(Log.INFO)) {
+                    byte[] calc = new byte[32];
+                    _context.hmac().calculate(macKey, _validateBuf, 0, off, calc, 0);
+                    StringBuilder str = new StringBuilder(512);
+                    str.append("Bad HMAC:\n\t");
+                    str.append(_packet.getLength()).append(" byte pkt, ");
+                    str.append(payloadLength).append(" byte payload");
+                    str.append("\n\tFrom: ").append(getRemoteHost().toString());
+                    str.append("\n\tIV:   ").append(Base64.encode(_validateBuf, payloadLength, IV_SIZE));
+                    str.append("\n\tIV2:  ").append(Base64.encode(_data, MAC_SIZE, IV_SIZE));
+                    str.append("\n\tGiven Len: ").append(DataHelper.fromLong(_validateBuf, payloadLength + IV_SIZE, 2));
+                    str.append("\n\tCalc HMAC: ").append(Base64.encode(calc, 0, MAC_SIZE));
+                    str.append("\n\tRead HMAC: ").append(Base64.encode(_data, _packet.getOffset(), MAC_SIZE));
+                    str.append("\n\tUsing key: ").append(macKey.toBase64());
+                    if (DataHelper.eq(macKey.getData(), 0, ((RouterContext)_context).routerHash().getData(), 0, 32))
+                        str.append(" (Intro)");
+                    else
+                        str.append(" (Session)");
+                    str.append("\n\tRaw:       ").append(Base64.encode(_data, _packet.getOffset(), _packet.getLength()));
+                    log.info(str.toString(), new Exception());
+                }
             }
-            eq = DataHelper.eq(hmac.getData(), 0, _data, _packet.getOffset(), MAC_SIZE);
-             */
         } else {
             //if (_log.shouldLog(Log.WARN))
             //    _log.warn("Payload length is " + payloadLength);
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java
index 6a82fcebd5d6c4bbe261189eb4c5f9e0623f6456..affaf09df8cd4655c33cb8fd75d7ee84068f590b 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java
@@ -51,7 +51,7 @@ class UDPPacketReader {
         initialize(packet.getPacket().getData(), off, len);
     }
     
-    public void initialize(byte message[], int payloadOffset, int payloadLength) {
+    private void initialize(byte message[], int payloadOffset, int payloadLength) {
         _message = message;
         _payloadBeginOffset = payloadOffset;
         _payloadLength = payloadLength;
@@ -106,7 +106,8 @@ class UDPPacketReader {
     
     @Override
     public String toString() {
-        switch (readPayloadType()) {
+        int type = readPayloadType();
+        switch (type) {
             case UDPPacket.PAYLOAD_TYPE_DATA:
                 return _dataReader.toString();
             case UDPPacket.PAYLOAD_TYPE_SESSION_CONFIRMED:
@@ -126,7 +127,7 @@ class UDPPacketReader {
             case UDPPacket.PAYLOAD_TYPE_SESSION_DESTROY:
                 return "Session destroyed packet";
             default:
-                return "Other packet type...";
+                return "Unknown packet type " + type;
         }
     }
     
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 1be488e2759fba95e3656358b6e7b1f60eb15e0d..3a2f001c2e84dc3622c61b50ac29c69eeadee439 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -261,8 +261,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         _context.statManager().createRateStat("udp.dropPeerDroplist", "How many peers currently have their packets dropped outright when a new peer is added to the list?", "udp", RATES);
         _context.statManager().createRateStat("udp.dropPeerConsecutiveFailures", "How many consecutive failed sends to a peer did we attempt before giving up and reestablishing a new session (lifetime is inactivity perood)", "udp", RATES);
         // following are for PacketBuider
-        _context.statManager().createRateStat("udp.packetAuthTime", "How long it takes to encrypt and MAC a packet for sending", "udp", RATES);
-        _context.statManager().createRateStat("udp.packetAuthTimeSlow", "How long it takes to encrypt and MAC a packet for sending (when its slow)", "udp", RATES);
+        //_context.statManager().createRateStat("udp.packetAuthTime", "How long it takes to encrypt and MAC a packet for sending", "udp", RATES);
+        //_context.statManager().createRateStat("udp.packetAuthTimeSlow", "How long it takes to encrypt and MAC a packet for sending (when its slow)", "udp", RATES);
 
         _context.simpleScheduler().addPeriodicEvent(new PingIntroducers(), MIN_EXPIRE_TIMEOUT * 3 / 4);
     }
@@ -2846,7 +2846,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
 
         public void timeReached() {
             // Increase allowed idle time if we are well under allowed connections, otherwise decrease
-            if (haveCapacity(45)) {
+            if (haveCapacity(33)) {
                 long inc;
                 // don't adjust too quickly if we are looping fast
                 if (_lastLoopShort)
diff --git a/router/java/src/net/i2p/router/tunnel/BuildMessageGenerator.java b/router/java/src/net/i2p/router/tunnel/BuildMessageGenerator.java
index e956f4364bd7f4bce3830d227fdd5af05a95af1c..42aae3ce38fe23ad8b58edc8f49c5264edd859b9 100644
--- a/router/java/src/net/i2p/router/tunnel/BuildMessageGenerator.java
+++ b/router/java/src/net/i2p/router/tunnel/BuildMessageGenerator.java
@@ -55,7 +55,9 @@ public abstract class BuildMessageGenerator {
      *
      * @param msg out parameter
      */
-    public static void createRecord(int recordNum, int hop, TunnelBuildMessage msg, TunnelCreatorConfig cfg, Hash replyRouter, long replyTunnel, I2PAppContext ctx, PublicKey peerKey) {
+    public static void createRecord(int recordNum, int hop, TunnelBuildMessage msg,
+                                    TunnelCreatorConfig cfg, Hash replyRouter,
+                                    long replyTunnel, I2PAppContext ctx, PublicKey peerKey) {
         byte encrypted[] = new byte[TunnelBuildMessage.RECORD_SIZE];
         //Log log = ctx.logManager().getLog(BuildMessageGenerator.class);
         if (peerKey != null) {
@@ -79,7 +81,8 @@ public abstract class BuildMessageGenerator {
         msg.setRecord(recordNum, new ByteArray(encrypted));
     }
     
-    private static BuildRequestRecord createUnencryptedRecord(I2PAppContext ctx, TunnelCreatorConfig cfg, int hop, Hash replyRouter, long replyTunnel) {
+    private static BuildRequestRecord createUnencryptedRecord(I2PAppContext ctx, TunnelCreatorConfig cfg, int hop,
+                                                              Hash replyRouter, long replyTunnel) {
         //Log log = ctx.logManager().getLog(BuildMessageGenerator.class);
         if (hop < cfg.getLength()) {
             // ok, now lets fill in some data
@@ -143,7 +146,8 @@ public abstract class BuildMessageGenerator {
      * Encrypt the records so their hop ident is visible at the appropriate times
      * @param order list of hop #s as Integers.  For instance, if (order.get(1) is 4), it is peer cfg.getPeer(4)
      */
-    public static void layeredEncrypt(I2PAppContext ctx, TunnelBuildMessage msg, TunnelCreatorConfig cfg, List<Integer> order) {
+    public static void layeredEncrypt(I2PAppContext ctx, TunnelBuildMessage msg,
+                                      TunnelCreatorConfig cfg, List<Integer> order) {
         //Log log = ctx.logManager().getLog(BuildMessageGenerator.class);
         // encrypt the records so that the right elements will be visible at the right time
         for (int i = 0; i < msg.getRecordCount(); i++) {
diff --git a/router/java/src/net/i2p/router/tunnel/HopProcessor.java b/router/java/src/net/i2p/router/tunnel/HopProcessor.java
index b24ad0c5e2306b6cd9f9f6215c9eb54f8894406c..fa2f5f3fa394f24a8d6fde9461d69a92e44ea47f 100644
--- a/router/java/src/net/i2p/router/tunnel/HopProcessor.java
+++ b/router/java/src/net/i2p/router/tunnel/HopProcessor.java
@@ -20,13 +20,15 @@ class HopProcessor {
     private final IVValidator _validator;
         
     /** helpful flag for debugging */
-    static final boolean USE_ENCRYPTION = true;
+    //static final boolean USE_ENCRYPTION = true;
     /**
-     * as of i2p 0.6, the tunnel crypto will change by encrypting the IV both before 
+     * as of i2p 0.6, the tunnel crypto changed  to encrypt the IV both before 
      * and after using it at each hop so as to prevent a certain type of replay/confirmation 
      * attack.
+     *
+     * See: http://osdir.com/ml/network.i2p/2005-07/msg00031.html
      */
-    static final boolean USE_DOUBLE_IV_ENCRYPTION = true;
+    //static final boolean USE_DOUBLE_IV_ENCRYPTION = true;
     static final int IV_LENGTH = 16;
     
     /** @deprecated unused */
@@ -83,12 +85,12 @@ class HopProcessor {
             //_log.debug("IV received: " + Base64.encode(iv));
             //_log.debug("Before:" + Base64.encode(orig, IV_LENGTH, orig.length - IV_LENGTH));
         }
-        if (USE_ENCRYPTION) {
-            if (USE_DOUBLE_IV_ENCRYPTION) 
+        //if (USE_ENCRYPTION) {
+            //if (USE_DOUBLE_IV_ENCRYPTION) 
                 updateIV(orig, offset);
             encrypt(orig, offset, length);
             updateIV(orig, offset);
-        }
+        //}
         //if (_log.shouldLog(Log.DEBUG)) {
             //_log.debug("Data after processing: " + Base64.encode(orig, IV_LENGTH, orig.length - IV_LENGTH));
             //_log.debug("IV sent: " + Base64.encode(orig, 0, IV_LENGTH));
diff --git a/router/java/src/net/i2p/router/tunnel/InboundEndpointProcessor.java b/router/java/src/net/i2p/router/tunnel/InboundEndpointProcessor.java
index cda394fa54e48e08c994ae73b00629ce29956e07..88aa6da71ad9b68947bff3fd893346b632f83106 100644
--- a/router/java/src/net/i2p/router/tunnel/InboundEndpointProcessor.java
+++ b/router/java/src/net/i2p/router/tunnel/InboundEndpointProcessor.java
@@ -19,7 +19,7 @@ class InboundEndpointProcessor {
     private final TunnelCreatorConfig _config;
     private final IVValidator _validator;    
     
-    static final boolean USE_ENCRYPTION = HopProcessor.USE_ENCRYPTION;
+    //static final boolean USE_ENCRYPTION = HopProcessor.USE_ENCRYPTION;
     
     /** @deprecated unused */
     public InboundEndpointProcessor(RouterContext ctx, TunnelCreatorConfig cfg) {
@@ -67,7 +67,7 @@ class InboundEndpointProcessor {
         }
         
         // inbound endpoints and outbound gateways have to undo the crypto in the same way
-        if (USE_ENCRYPTION)
+        //if (USE_ENCRYPTION)
             decrypt(_context, _config, iv, orig, offset, length);
         
         SimpleByteCache.release(iv);
diff --git a/router/java/src/net/i2p/router/tunnel/InboundSender.java b/router/java/src/net/i2p/router/tunnel/InboundSender.java
index 9ab0a61d13c056731ec0be92e09eb55a2820800a..0e00b6b3983eef5cce8a9fe1ec001c30c3e91441 100644
--- a/router/java/src/net/i2p/router/tunnel/InboundSender.java
+++ b/router/java/src/net/i2p/router/tunnel/InboundSender.java
@@ -10,14 +10,14 @@ import net.i2p.I2PAppContext;
 class InboundSender implements TunnelGateway.Sender {
     private final InboundGatewayProcessor _processor;
     
-    static final boolean USE_ENCRYPTION = HopProcessor.USE_ENCRYPTION;
+    //static final boolean USE_ENCRYPTION = HopProcessor.USE_ENCRYPTION;
     
     public InboundSender(I2PAppContext ctx, HopConfig config) {
         _processor = new InboundGatewayProcessor(ctx, config);
     }
     
     public long sendPreprocessed(byte[] preprocessed, TunnelGateway.Receiver receiver) {
-        if (USE_ENCRYPTION)
+        //if (USE_ENCRYPTION)
             _processor.process(preprocessed, 0, preprocessed.length);
         return receiver.receiveEncrypted(preprocessed);
     }
diff --git a/router/java/src/net/i2p/router/tunnel/OutboundGatewayProcessor.java b/router/java/src/net/i2p/router/tunnel/OutboundGatewayProcessor.java
index 8acb0e5bbb32d9101c8ff036c4cd843fbd6bd7e4..c6a08ccef077c55d5dfca709814866109de579c9 100644
--- a/router/java/src/net/i2p/router/tunnel/OutboundGatewayProcessor.java
+++ b/router/java/src/net/i2p/router/tunnel/OutboundGatewayProcessor.java
@@ -16,7 +16,7 @@ class OutboundGatewayProcessor {
     private final Log _log;
     private final TunnelCreatorConfig _config;
         
-    static final boolean USE_ENCRYPTION = HopProcessor.USE_ENCRYPTION;
+    //static final boolean USE_ENCRYPTION = HopProcessor.USE_ENCRYPTION;
 
     public OutboundGatewayProcessor(I2PAppContext ctx, TunnelCreatorConfig cfg) {
         _context = ctx;
@@ -42,7 +42,7 @@ class OutboundGatewayProcessor {
             _log.debug("Orig random IV: " + Base64.encode(iv));
             //_log.debug("data:  " + Base64.encode(orig, iv.length, length - iv.length));
         }
-        if (USE_ENCRYPTION)
+        //if (USE_ENCRYPTION)
             decrypt(_context, _config, iv, orig, offset, length);
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("finished processing the preprocessed data");
@@ -97,7 +97,7 @@ class OutboundGatewayProcessor {
             cur = xf;
         }
         
-        if (HopProcessor.USE_DOUBLE_IV_ENCRYPTION)
+        //if (HopProcessor.USE_DOUBLE_IV_ENCRYPTION)
             ctx.aes().decryptBlock(orig, offset, config.getIVKey(), orig, offset);
     }
 }
diff --git a/router/java/src/net/i2p/router/tunnel/OutboundSender.java b/router/java/src/net/i2p/router/tunnel/OutboundSender.java
index 3842f7a5123429d162682922b6e6f8f2001d2ec2..961c29031f610d2bfe0c9f24fc0fa3d4fb9194ca 100644
--- a/router/java/src/net/i2p/router/tunnel/OutboundSender.java
+++ b/router/java/src/net/i2p/router/tunnel/OutboundSender.java
@@ -15,7 +15,7 @@ class OutboundSender implements TunnelGateway.Sender {
     private final TunnelCreatorConfig _config;
     private final OutboundGatewayProcessor _processor;
     
-    static final boolean USE_ENCRYPTION = HopProcessor.USE_ENCRYPTION;
+    //static final boolean USE_ENCRYPTION = HopProcessor.USE_ENCRYPTION;
     
     public OutboundSender(I2PAppContext ctx, TunnelCreatorConfig config) {
         _context = ctx;
@@ -27,7 +27,7 @@ class OutboundSender implements TunnelGateway.Sender {
     public long sendPreprocessed(byte[] preprocessed, TunnelGateway.Receiver receiver) {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("preprocessed data going out " + _config + ": " + Base64.encode(preprocessed));
-        if (USE_ENCRYPTION)
+        //if (USE_ENCRYPTION)
             _processor.process(preprocessed, 0, preprocessed.length);
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("after wrapping up the preprocessed data on " + _config);
diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java b/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java
index 65ae2be276655a9c8bdaffe637f7691c74853382..fbfca2bcc9b879063329679b560526534db6dc17 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java
@@ -248,7 +248,9 @@ abstract class BuildRequestor {
      *  then use that, otherwise the old 8-entry version.
      *  @return null on error
      */
-    private static TunnelBuildMessage createTunnelBuildMessage(RouterContext ctx, TunnelPool pool, PooledTunnelCreatorConfig cfg, TunnelInfo pairedTunnel, BuildExecutor exec) {
+    private static TunnelBuildMessage createTunnelBuildMessage(RouterContext ctx, TunnelPool pool,
+                                                               PooledTunnelCreatorConfig cfg,
+                                                               TunnelInfo pairedTunnel, BuildExecutor exec) {
         Log log = ctx.logManager().getLog(BuildRequestor.class);
         long replyTunnel = 0;
         Hash replyRouter = null;
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 38a7e1253a8f9dab5d75619c831f87a7ba98e62f..e76058c8ef6d8a8a83d927d1cabc6e8ca2627d7b 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
@@ -1137,7 +1137,8 @@ public class TunnelPool {
             peers = Collections.singletonList(_context.routerHash());
         }
 
-        PooledTunnelCreatorConfig cfg = new PooledTunnelCreatorConfig(_context, peers.size(), settings.isInbound(), settings.getDestination());
+        PooledTunnelCreatorConfig cfg = new PooledTunnelCreatorConfig(_context, peers.size(),
+                                                settings.isInbound(), settings.getDestination());
         cfg.setTunnelPool(this);
         // peers list is ordered endpoint first, but cfg.getPeer() is ordered gateway first
         for (int i = 0; i < peers.size(); i++) {