diff --git a/.mtn-ignore b/.mtn-ignore
new file mode 100644
index 0000000000000000000000000000000000000000..b0fd2e40a5d11eeb1d34ef8274c151dcaa27b0ca
--- /dev/null
+++ b/.mtn-ignore
@@ -0,0 +1,24 @@
+# Just to try and prevent some noob disasters.
+# Use mtn add --no-respect-ignore foo.jar to ignore this ignore list
+_jsp\.java$
+\.bz2$
+\.class$
+\.diff$
+\.exe$
+\.fba$
+\.gz$
+\.jar$
+\.out$
+\.patch$
+\.sig$
+\.sud$
+\.su2$
+\.tar$
+\.war$
+\.zip$
+^\.
+^build/
+^pkg-temp/
+~$
+/build/
+/classes/
diff --git a/.tx/config b/.tx/config
new file mode 100644
index 0000000000000000000000000000000000000000..060c32625f9406ae6c54df4c83f443ef2cbcade9
--- /dev/null
+++ b/.tx/config
@@ -0,0 +1,67 @@
+[I2P.i2ptunnel]
+source_file = apps/i2ptunnel/locale/messages_en.po
+source_lang = en
+trans.ar = apps/i2ptunnel/locale/messages_ar.po
+trans.de = apps/i2ptunnel/locale/messages_de.po
+trans.es = apps/i2ptunnel/locale/messages_es.po
+trans.fr = apps/i2ptunnel/locale/messages_fr.po
+trans.nl = apps/i2ptunnel/locale/messages_nl.po
+trans.ru = apps/i2ptunnel/locale/messages_ru.po
+trans.zh_CN = apps/i2ptunnel/locale/messages_zh.po
+
+[I2P.routerconsole]
+source_file = apps/routerconsole/locale/messages_en.po
+source_lang = en
+trans.ar = apps/routerconsole/locale/messages_ar.po
+trans.de = apps/routerconsole/locale/messages_de.po
+trans.es = apps/routerconsole/locale/messages_es.po
+trans.fr = apps/routerconsole/locale/messages_fr.po
+trans.nl = apps/routerconsole/locale/messages_nl.po
+trans.ru = apps/routerconsole/locale/messages_ru.po
+trans.zh_CN = apps/routerconsole/locale/messages_zh.po
+
+[I2P.i2psnark]
+source_file = apps/i2psnark/locale/messages_en.po
+source_lang = en
+trans.ar = apps/i2psnark/locale/messages_ar.po
+trans.de = apps/i2psnark/locale/messages_de.po
+trans.es = apps/i2psnark/locale/messages_es.po
+trans.fr = apps/i2psnark/locale/messages_fr.po
+trans.nl = apps/i2psnark/locale/messages_nl.po
+trans.pt = apps/i2psnark/locale/messages_pt.po
+trans.ru = apps/i2psnark/locale/messages_ru.po
+trans.zh_CN = apps/i2psnark/locale/messages_zh.po
+
+[I2P.susidns]
+source_file = apps/susidns/locale/messages_en.po
+source_lang = en
+trans.ar = apps/susidns/locale/messages_ar.po
+trans.de = apps/susidns/locale/messages_de.po
+trans.es = apps/susidns/locale/messages_es.po
+trans.fr = apps/susidns/locale/messages_fr.po
+trans.nl = apps/susidns/locale/messages_nl.po
+trans.ru = apps/susidns/locale/messages_ru.po
+trans.zh_CN = apps/susidns/locale/messages_zh.po
+
+[I2P.desktopgui]
+source_file = apps/desktopgui/locale/messages_en.po
+source_lang = en
+trans.ar = apps/desktopgui/locale/messages_ar.po
+trans.de = apps/desktopgui/locale/messages_de.po
+trans.es = apps/desktopgui/locale/messages_es.po
+trans.fr = apps/desktopgui/locale/messages_fr.po
+trans.nl = apps/desktopgui/locale/messages_nl.po
+trans.ru = apps/desktopgui/locale/messages_ru.po
+trans.zh_CN = apps/desktopgui/locale/messages_zh.po
+
+[I2P.susimail]
+source_file = apps/susimail/locale/messages_en.po
+source_lang = en
+trans.de = apps/susimail/locale/messages_de.po
+trans.es = apps/susimail/locale/messages_es.po
+trans.fr = apps/susimail/locale/messages_fr.po
+trans.nl = apps/susimail/locale/messages_nl.po
+
+[main]
+host = http://www.transifex.net
+
diff --git a/apps/BOB/src/net/i2p/BOB/BOB.java b/apps/BOB/src/net/i2p/BOB/BOB.java
index 2c689f65db73925149e56aafc64cfe7f62fb8906..60bf2b9ff65839f7d0f5716c894f336cb52b54e8 100644
--- a/apps/BOB/src/net/i2p/BOB/BOB.java
+++ b/apps/BOB/src/net/i2p/BOB/BOB.java
@@ -120,6 +120,7 @@ public class BOB {
 	public final static String PROP_CONFIG_LOCATION = "BOB.config";
 	public final static String PROP_BOB_PORT = "BOB.port";
 	public final static String PROP_BOB_HOST = "BOB.host";
+	public final static String PROP_CFG_VER = "BOB.CFG.VER";
 	private static NamedDB database;
 	private static Properties props = new Properties();
 	private static AtomicBoolean spin = new AtomicBoolean(true);
@@ -209,30 +210,41 @@ public class BOB {
 			// Global router and client API configurations that are missing are set to defaults here.
 			if (!props.containsKey(I2PClient.PROP_TCP_HOST)) {
 				props.setProperty(I2PClient.PROP_TCP_HOST, "localhost");
+				save = true;
 			}
 			if (!props.containsKey(I2PClient.PROP_TCP_PORT)) {
 				props.setProperty(I2PClient.PROP_TCP_PORT, "7654");
-			}
-			if (!props.containsKey(I2PClient.PROP_RELIABILITY)) {
-				props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_BEST_EFFORT);
+				save = true;
 			}
 			if (!props.containsKey(PROP_BOB_PORT)) {
 				props.setProperty(PROP_BOB_PORT, "2827"); // 0xB0B
+				save = true;
 			}
 			if (!props.containsKey("inbound.length")) {
 				props.setProperty("inbound.length", "1");
+				save = true;
 			}
 			if (!props.containsKey("outbound.length")) {
 				props.setProperty("outbound.length", "1");
+				save = true;
 			}
 			if (!props.containsKey("inbound.lengthVariance")) {
 				props.setProperty("inbound.lengthVariance", "0");
+				save = true;
 			}
 			if (!props.containsKey("outbound.lengthVariance")) {
 				props.setProperty("outbound.lengthVariance", "0");
+				save = true;
 			}
 			if (!props.containsKey(PROP_BOB_HOST)) {
 				props.setProperty(PROP_BOB_HOST, "localhost");
+				save = true;
+			}
+			// PROP_RELIABILITY_NONE, PROP_RELIABILITY_BEST_EFFORT, PROP_RELIABILITY_GUARANTEED
+			if (!props.containsKey(PROP_CFG_VER)) {
+				props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_NONE);
+				props.setProperty(PROP_CFG_VER,"1");
+				save = true;
 			}
 			if (save) {
 				File cfg = new File(configLocation);
diff --git a/apps/BOB/src/net/i2p/BOB/DoCMDS.java b/apps/BOB/src/net/i2p/BOB/DoCMDS.java
index 9894530d810118552bdbe8bae3a43a0c70386673..e070826d05b739ecc3eefdaf8fccba46062c7132 100644
--- a/apps/BOB/src/net/i2p/BOB/DoCMDS.java
+++ b/apps/BOB/src/net/i2p/BOB/DoCMDS.java
@@ -32,11 +32,12 @@ import java.net.Socket;
 import java.util.Properties;
 import java.util.StringTokenizer;
 import java.util.concurrent.atomic.AtomicBoolean;
+import net.i2p.I2PAppContext;
 import net.i2p.I2PException;
 import net.i2p.client.I2PClientFactory;
-import net.i2p.data.DataFormatException;
+//import net.i2p.data.DataFormatException;
 import net.i2p.data.Destination;
-import net.i2p.i2ptunnel.I2PTunnel;
+//import net.i2p.i2ptunnel.I2PTunnel;
 import net.i2p.util.Log;
 // needed only for debugging.
 // import java.util.logging.Level;
@@ -52,7 +53,7 @@ public class DoCMDS implements Runnable {
 
 	// FIX ME
 	// I need a better way to do versioning, but this will do for now.
-	public static final String BMAJ = "00",  BMIN = "00",  BREV = "0E",  BEXT = "";
+	public static final String BMAJ = "00",  BMIN = "00",  BREV = "0F",  BEXT = "";
 	public static final String BOBversion = BMAJ + "." + BMIN + "." + BREV + BEXT;
 	private Socket server;
 	private Properties props;
@@ -106,7 +107,7 @@ public class DoCMDS implements Runnable {
 	private static final String C_visit = "visit";
 	private static final String C_zap = "zap";
 
-	/* all the coomands available, plus description */
+	/* all the commands available, plus description */
 	private static final String C_ALL[][] = {
 		{C_help, C_help + " <command> * Get help on a command."},
 		{C_clear, C_clear + " * Clear the current nickname out of the list."},
@@ -456,11 +457,14 @@ public class DoCMDS implements Runnable {
 									String reply = null;
 									if (Arg.endsWith(".i2p")) {
 										try {
-											try {
-												dest = I2PTunnel.destFromName(Arg);
-											} catch (DataFormatException ex) {
+											//try {
+												//dest = I2PTunnel.destFromName(Arg);
+											//} catch (DataFormatException ex) {
+											//}
+											dest = I2PAppContext.getGlobalContext().namingService().lookup(Arg);
+											if(dest != null) {
+												reply = dest.toBase64();
 											}
-											reply = dest.toBase64();
 										} catch (NullPointerException npe) {
 											// Could not find the destination!?
 										}
@@ -958,7 +962,7 @@ public class DoCMDS implements Runnable {
 										} catch (Exception e) {
 											break die;
 										}
-// Finally say OK.
+										// Finally say OK.
 										out.println("OK Nickname set to " + Arg);
 									}
 
@@ -1468,7 +1472,7 @@ public class DoCMDS implements Runnable {
 					} // die
 					out.print("ERROR A really bad error just happened, ");
 				} // quit
-// Say goodbye.
+				// Say goodbye.
 
 				out.println("OK Bye!");
 
diff --git a/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java b/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java
index a537d942f8769d7476140fafbfa9cb28f9a5aed7..0e00f1c50e421dbe3ddd2686f8985a680117dec1 100644
--- a/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java
+++ b/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java
@@ -36,7 +36,8 @@ import net.i2p.client.streaming.I2PSocket;
 import net.i2p.client.streaming.I2PSocketManager;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Destination;
-import net.i2p.i2ptunnel.I2PTunnel;
+//import net.i2p.i2ptunnel.I2PTunnel;
+import net.i2p.I2PAppContext;
 
 /**
  *
@@ -146,11 +147,11 @@ public class TCPtoI2P implements Runnable {
 				input = line.toLowerCase();
 				Destination dest = null;
 				if (input.endsWith(".i2p")) {
-					try {
-						dest = I2PTunnel.destFromName(input);
+					//dest = I2PTunnel.destFromName(input);
+					dest = I2PAppContext.getGlobalContext().namingService().lookup(input);
+					if (dest != null) {
 						line = dest.toBase64();
-					} catch (NullPointerException npe) {
-						// Could not find the destination!?
+					} else {
 						Emsg("Can't find destination: " + input, out);
 						return;
 					}
diff --git a/apps/addressbook/build.xml b/apps/addressbook/build.xml
index 6332c5bcc6d6345d0c42103bf94faf3a949725ee..30750a231fcb8d95bb4bce5572d5ae315f6b96e5 100644
--- a/apps/addressbook/build.xml
+++ b/apps/addressbook/build.xml
@@ -38,6 +38,7 @@
 
 	<target name="compile" depends="init, depend">
 		<javac debug="true" deprecation="on" source="1.5" target="1.5" 
+                       includeAntRuntime="false"
                        srcdir="${src}" destdir="${build}">
             <compilerarg line="${javac.compilerargs}" />
             <classpath>
@@ -47,27 +48,52 @@
 		</javac>
 	</target>
 
-	<target name="jar" depends="compile">
+        <!-- unused for now, as we oddly ship addressbook as a .war -->
+	<target name="jar" depends="compile, changes">
 		<jar basedir="${build}" destfile="${dist}/${jar}">
 			<manifest>
 				<attribute name="Main-Class" value="addressbook.Daemon"/>
+		                <attribute name="Build-Date" value="${build.timestamp}" />
+		                <attribute name="Base-Revision" value="${workspace.version}" />
+		                <attribute name="Workspace-Changes" value="${workspace.changes}" />
 			</manifest>
 		</jar>
 	</target>
 	
-	<target name="war" depends="compile" unless="war.uptodate">
+	<target name="war" depends="compile, changes, warUpToDate" unless="war.uptodate">
 		<mkdir dir="${dist}/tmp"/>
 		<mkdir dir="${dist}/tmp/WEB-INF"/>
 		<mkdir dir="${dist}/tmp/WEB-INF/classes"/>
 		<copy todir="${dist}/tmp/WEB-INF/classes">
 			<fileset dir="${build}"/>
 		</copy>
-		<war basedir="${dist}/tmp" webxml="web.xml" destfile="${dist}/${war}"/>
+		<war basedir="${dist}/tmp" webxml="web.xml" destfile="${dist}/${war}">
+			<manifest>
+		                <attribute name="Build-Date" value="${build.timestamp}" />
+		                <attribute name="Base-Revision" value="${workspace.version}" />
+		                <attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
+			</manifest>
+		</war>
 		<delete dir="${dist}/tmp"/>
 	</target>
 	
-        <uptodate property="war.uptodate" targetfile="${dist}/${war}">
-            <srcfiles dir= "." includes="${build}/**/*.class, web.xml"/>
-        </uptodate>
+	<target name="warUpToDate">
+	        <uptodate property="war.uptodate" targetfile="${dist}/${war}">
+		            <srcfiles dir= "." includes="${build}/**/*.class, web.xml"/>
+	        </uptodate>
+	</target>
 
+	<target name="changes">
+	        <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" >
+	            <arg value="list" />
+	            <arg value="changed" />
+	            <arg value="." />
+	        </exec>
+		<!-- \n in an attribute value generates an invalid manifest -->
+		<exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+			<arg value="-s" />
+			<arg value="[:space:]" />
+			<arg value="," />
+		</exec>
+	</target>
 </project>
diff --git a/apps/desktopgui/README b/apps/desktopgui/README
new file mode 100644
index 0000000000000000000000000000000000000000..569ca580a9b62c6337508ab9e5c9490174cd6dfd
--- /dev/null
+++ b/apps/desktopgui/README
@@ -0,0 +1,13 @@
+Current setup:
+* Build desktopgui:
+    * 'ant jar' in the desktopgui directory
+    OR
+    * 'ant desktopgui' in the i2p.i2p directory
+* Place desktopgui.jar in the $I2P/lib/ directory.
+* Add to .i2p/clients.config:
+    #Desktopgui
+    clientApp.6.args=
+    clientApp.6.delay=5
+    clientApp.6.main=net.i2p.desktopgui.Main
+    clientApp.6.name=desktopgui
+    clientApp.6.startOnLoad=true
diff --git a/apps/desktopgui/TODO b/apps/desktopgui/TODO
new file mode 100644
index 0000000000000000000000000000000000000000..c05b8dcd8ad210120c449b4ff57489ae3c30b493
--- /dev/null
+++ b/apps/desktopgui/TODO
@@ -0,0 +1,55 @@
+HIGH PRIORITY:
+- Allow desktopgui to start, stop and restart I2P. - DONE
+- Correct logging system - DONE
+- Internationalisation:
+    * Add strings - DONE
+    * Add Windows support - NEED TO CHECK
+    * Might need some kind of trigger to reload the menu (for live language switching) - DONE
+    * Language choice is not actually set as a parameter in I2P config?
+        As a result, desktopgui always starts with the default, unless you manually set the language.
+        DONE - uses routerconsole.lang -- this parameter is now updated in routerconsole as well
+- Check if we're inside I2P without using a command-line parameter - DONE
+- Modify installer to set I2P directory parameter; or use $I2P? - Is already there
+- Include in installer - TODO
+- Start desktopgui without adding to clients.config and without adding a dependency on routerconsole!
+  * One possibility:
+        Adding some kind of 'ApplicationManager' that allows starting applications.
+        Extra remark: ApplicationManager should also allow stopping certain applications from launching.
+        Suggestion:
+            * ApplicationManager reads/writes clients.config
+            * ApplicationManager itself: independent from clients.config?
+            * Upon reboot, ApplicationManager could add a new application to clients.config _if_ the 'application.manager.version' is not there, or is smaller than the current version.
+            * ApplicationManager can be the clients.config backend for routerconsole, so routerconsole is not the dependency.
+            * API:
+                - addConfig(args, name, ...)
+                - removeConfig(int)
+                - removeConfig(ConfigFilter)
+                    ConfigFilter() {
+                        boolean filterArgs(String args);
+                        boolean filterMain(String main);
+                        ...
+                    }
+                - editConfig(args, name, ..., ConfigFilter)
+                - editConfig(args, name, ..., int)
+                - editConfigArgs(args, ConfigFilter)
+                - editConfigArgs(args, int)
+                - ...
+ * For now: added in the routerconsole startup (like the old SysTray. - DONE
+    Possible migration path: startup ApplicationManager in routerconsole the first time.
+- Check bug: restart is happening instead of shutdown!
+- Check build order (for example: first desktopgui, only later routerconsole)
+- Fix tabs versus spaces ;-)
+- Add check for Java version 6 in RouterConsoleRunner!
+UNKNOWN:
+- API to allow applications to add themselves to the menu?
+    * registerApplication(); -- should return a positive number on success, -1 on failure
+    * unregisterApplication(int); -- should return nothing (or bool for success?), and the parameter should be the number given when registering the application
+- Fetch I2P localhost from the core I2P application? 
+- Use I2PAppContext::appDir (something like that) for desktopgui data.
+- Consider SWT as option
+    * Check core/java/src/net/i2p/util/FileUtil.java for dynamic jar loading
+    * Possible logic:
+        - First try to load SWT (has the most options and is not ugly)
+        - Then load AWT
+- Access router.jar from other JVM? Is this possible? -- no: use I2CP with auth (not ready yet)
+- Start desktopgui with another user than the user starting I2P (required for daemon usage).
diff --git a/apps/desktopgui/build.xml b/apps/desktopgui/build.xml
index 8138f14c5e67919bebe59581408cf0263e61c937..9a2bb13fb676f2f047f3206fdc40e014e8928271 100644
--- a/apps/desktopgui/build.xml
+++ b/apps/desktopgui/build.xml
@@ -1,119 +1,108 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- You may freely edit this file. See commented blocks below for -->
-<!-- some examples of how to customize the build. -->
-<!-- (If you delete it and reopen the project it will be recreated.) -->
-<!-- By default, only the Clean and Build commands use this build script. -->
-<!-- Commands such as Run, Debug, and Test only use this build script if -->
-<!-- the Compile on Save feature is turned off for the project. -->
-<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
-<!-- in the project's Project Properties dialog box.-->
-<project name="desktopgui" default="default" basedir=".">
-    <description>Builds, tests, and runs the project desktopgui.</description>
-    <import file="nbproject/build-impl.xml"/>
-    <!--
+<project basedir="." default="all" name="desktopgui">
 
-    There exist several targets which are by default empty and which can be 
-    used for execution of your tasks. These targets are usually executed 
-    before and after some main targets. They are: 
+	<property name="src" value="src"/>
+	<property name="build" value="build"/>
+	<property name="dist"  location="dist"/>
+	<property name="jar" value="desktopgui.jar"/>
+	<property name="resources" value="resources"/>
+    <property name="javadoc" value="javadoc"/>
 
-      -pre-init:                 called before initialization of project properties
-      -post-init:                called after initialization of project properties
-      -pre-compile:              called before javac compilation
-      -post-compile:             called after javac compilation
-      -pre-compile-single:       called before javac compilation of single file
-      -post-compile-single:      called after javac compilation of single file
-      -pre-compile-test:         called before javac compilation of JUnit tests
-      -post-compile-test:        called after javac compilation of JUnit tests
-      -pre-compile-test-single:  called before javac compilation of single JUnit test
-      -post-compile-test-single: called after javac compilation of single JUunit test
-      -pre-jar:                  called before JAR building
-      -post-jar:                 called after JAR building
-      -post-clean:               called after cleaning build products
+	<property name="javac.compilerargs" value=""/>
 
-    (Targets beginning with '-' are not intended to be called on their own.)
+	<target name="init">
+		<mkdir dir="${build}"/>
+        <mkdir dir="${build}/${resources}"/>
+        <mkdir dir="${build}/${javadoc}"/>
+		<mkdir dir="${dist}"/>
+	</target>
 
-    Example of inserting an obfuscator after compilation could look like this:
+	<target name="clean">
+		<delete dir="${build}"/>
+		<delete dir="${dist}"/>
+	</target>
 
-        <target name="-post-compile">
-            <obfuscate>
-                <fileset dir="${build.classes.dir}"/>
-            </obfuscate>
-        </target>
+	<target name="compile" depends="init">
+		<javac debug="true" deprecation="on" source="1.5" target="1.5" 
+                       includeAntRuntime="false"
+                       srcdir="${src}" destdir="${build}">
+            <compilerarg line="${javac.compilerargs}" />
+            <classpath>
+                <pathelement location="../../core/java/build/i2p.jar" />
+                <!-- doesn't matter if we're not on win32, we just need the java classes, not the platform-dependent code -->
+                <pathelement location="../../installer/lib/wrapper/win32/wrapper.jar" />
+            	<pathelement location="../../router/java/build/router.jar" />
+            </classpath>
+		</javac>
+        <copy todir="${build}/desktopgui/${resources}">
+            <fileset dir="${resources}" />
+        </copy>
+	</target>
 
-    For list of available properties check the imported 
-    nbproject/build-impl.xml file. 
+	<target name="jar" depends="compile">
+        <exec executable="sh" osfamily="unix" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
+        </exec>
+        <exec executable="sh" osfamily="mac" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
+        </exec>
+		<!-- multi-lang is optional -->
+        <exec executable="sh" osfamily="windows" failifexecutionfails="false" >
+            <arg value="./bundle-messages.sh" />
+        </exec>
+        <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="." />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
+		<jar basedir="${build}" destfile="${dist}/${jar}">
+			<manifest>
+				<attribute name="Main-Class" value="net.i2p.desktopgui.Main"/>
+				<attribute name="Build-Date" value="${build.timestamp}" />
+				<attribute name="Base-Revision" value="${workspace.version}" />
+				<attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
+			</manifest>
+		</jar>
+	</target>
 
-
-    Another way to customize the build is by overriding existing main targets.
-    The targets of interest are: 
-
-      -init-macrodef-javac:     defines macro for javac compilation
-      -init-macrodef-junit:     defines macro for junit execution
-      -init-macrodef-debug:     defines macro for class debugging
-      -init-macrodef-java:      defines macro for class execution
-      -do-jar-with-manifest:    JAR building (if you are using a manifest)
-      -do-jar-without-manifest: JAR building (if you are not using a manifest)
-      run:                      execution of project 
-      -javadoc-build:           Javadoc generation
-      test-report:              JUnit report generation
-
-    An example of overriding the target for project execution could look like this:
-
-        <target name="run" depends="BOB-impl.jar">
-            <exec dir="bin" executable="launcher.exe">
-                <arg file="${dist.jar}"/>
-            </exec>
-        </target>
-
-    Notice that the overridden target depends on the jar target and not only on 
-    the compile target as the regular run target does. Again, for a list of available 
-    properties which you can use, check the target you are overriding in the
-    nbproject/build-impl.xml file. 
-
-    -->
-    <property name="build_src" location="src"/>
-    <property name="build_bin" location="bin"/>
-    <property name="build_dist" location="dist"/>
-    <property name="build_lib" location="lib"/>
-    <property name="build_i2pref" location="../../build"/>
-    <property name="build_routerconsole" location="../routerconsole/java/build/"/>
-    <property name="build_i2ptunnel" location="../i2ptunnel/java/build/"/>
-	
-    <path id="build_classpath">
-        <fileset dir="${build_lib}" includes="**/*.jar"/>
-        <fileset dir="${build_i2pref}" includes="**/*.jar"/>
-        <fileset dir="${build_routerconsole}" includes="**/*.jar"/>
-        <fileset dir="${build_i2ptunnel}" includes="**/*.jar"/>
-    </path>
-    <target name="build_init">
-        <!-- Create the time stamp -->
-        <tstamp/>
-  	    <mkdir dir="${build_dist}"/>
-  	    <mkdir dir="${build_bin}"/>
-    </target>
-    <target name="build_compile" depends="build_init"
-        description="compile the source " >
-        <!-- Compile the java code from ${src} into ${bin} -->
-        <javac srcdir="${build_src}" destdir="${build_bin}"  classpathref="build_classpath"/>
-	    <copy todir="${build_bin}">
-	        <fileset dir="${build_src}">
-		        <exclude name="**/*.java"/>
-	        </fileset>
-	    </copy>
+    <target name="javadoc">
+        <mkdir dir="${build}" />
+        <mkdir dir="${build}/${javadoc}" />
+        <javadoc 
+            sourcepath="${src}" destdir="${build}/${javadoc}" 
+            packagenames="*" 
+            use="true" 
+            splitindex="true" 
+            windowtitle="Desktopgui">
+            <classpath>
+                <pathelement location="../../router/java/build/router.jar" />
+                <pathelement location="../../core/java/build/i2p.jar" />
+            </classpath>
+        </javadoc>
     </target>
-    <target name="build_jar" depends="build_compile"
-        description="generate the distribution" >
-        <!-- Create the distribution directory -->
-        <mkdir dir="${build_dist}/lib"/>
 
-        <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
-        <zip destfile="${build_dist}/desktopgui.jar" basedir="${build_bin}" />
+    <target name="poupdate">
+        <exec executable="sh" osfamily="unix" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
+            <arg value="-p" />
+        </exec>
+        <exec executable="sh" osfamily="mac" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
+            <arg value="-p" />
+        </exec>
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
+            <arg value="-p" />
+        </exec>
     </target>
 
-    <target name="build_clean"
-        description="clean up" >
-        <!-- Delete the ${build} and ${dist} directory trees -->
-        <delete dir="${build_bin}"/>
-        <delete dir="${build_dist}"/>
-    </target>
+	<target name="dist" depends="jar" />	
+	<target name="all" depends="jar" />
 </project>
+
diff --git a/apps/desktopgui/bundle-messages.sh b/apps/desktopgui/bundle-messages.sh
new file mode 100644
index 0000000000000000000000000000000000000000..420fb5945785eaf118d52cddd4b56298bf38e49a
--- /dev/null
+++ b/apps/desktopgui/bundle-messages.sh
@@ -0,0 +1,111 @@
+#
+# Update messages_xx.po and messages_xx.class files,
+# from both java and jsp sources.
+# Requires installed programs xgettext, msgfmt, msgmerge, and find.
+#
+# usage:
+#    bundle-messages.sh (generates the resource bundle from the .po file)
+#    bundle-messages.sh -p (updates the .po file from the source tags, then generates the resource bundle)
+#
+# zzz - public domain
+# Mathiasdm - modifications for desktopgui
+#
+CLASS=net.i2p.desktopgui.messages
+TMPFILE=build/javafiles.txt
+export TZ=UTC
+
+if [ "$1" = "-p" ]
+then
+	POUPDATE=1
+fi
+
+# on windows, one must specify the path of commnad find
+# since windows has its own retarded version of find.
+if which find|grep -q -i windows ; then
+	export PATH=.:/bin:/usr/local/bin:$PATH
+fi
+# Fast mode - update ondemond
+# set LG2 to the language you need in envrionment varibales to enable this
+
+# add ../java/ so the refs will work in the po file
+JPATHS="src"
+for i in locale/messages_*.po
+do
+	# get language
+	LG=${i#locale/messages_}
+	LG=${LG%.po}
+	
+	# skip, if specified
+	if [ $LG2 ]; then
+		[ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only.
+	fi
+
+	if [ "$POUPDATE" = "1" ]
+	then
+		# make list of java files newer than the .po file
+		find $JPATHS -name *.java -newer $i > $TMPFILE
+	fi
+
+	if [ -s build/net/i2p/desktopgui/messages_$LG.class -a \
+	     build/net/i2p/desktopgui/messages_$LG.class -nt $i -a \
+	     ! -s $TMPFILE ]
+	then
+		continue
+	fi
+
+	if [ "$POUPDATE" = "1" ]
+	then
+	 	echo "Updating the $i file from the tags..."
+		# extract strings from java and jsp files, and update messages.po files
+		# translate calls must be one of the forms:
+		# _("foo")
+		# _x("foo")
+		# intl._("foo")
+		# intl.title("foo")
+		# handler._("foo")
+		# formhandler._("foo")
+		# net.i2p.router.web.Messages.getString("foo")
+		# In a jsp, you must use a helper or handler that has the context set.
+		# To start a new translation, copy the header from an old translation to the new .po file,
+		# then ant distclean updater.
+		find $JPATHS -name *.java > $TMPFILE
+		xgettext -f $TMPFILE -F -L java --from-code=UTF-8 --add-comments\
+	                 --keyword=_ --keyword=_x --keyword=intl._ --keyword=intl.title \
+	                 --keyword=handler._ --keyword=formhandler._ \
+	                 --keyword=net.i2p.router.web.Messages.getString \
+		         -o ${i}t
+		if [ $? -ne 0 ]
+		then
+			echo 'Warning - xgettext failed, not updating translations'
+			rm -f ${i}t
+			break
+		fi
+		msgmerge -U --backup=none $i ${i}t
+		if [ $? -ne 0 ]
+		then
+			echo 'Warning - msgmerge failed, not updating translations'
+			rm -f ${i}t
+			break
+		fi
+		rm -f ${i}t
+		# so we don't do this again
+		touch $i
+	fi
+
+    if [ "$LG" != "en" ]
+    then
+        # only generate for non-source language
+        echo "Generating ${CLASS}_$LG ResourceBundle..."
+
+        # convert to class files in build
+        msgfmt --java --statistics -r $CLASS -l $LG -d build $i
+        if [ $? -ne 0 ]
+        then
+            echo 'Warning - msgfmt failed, not updating translations'
+            break
+        fi
+    fi
+done
+rm -f $TMPFILE
+# todo: return failure
+exit 0
diff --git a/apps/desktopgui/desktopgui/resources/howto/howto.html b/apps/desktopgui/desktopgui/resources/howto/howto.html
deleted file mode 100644
index ea1b025c7b01ab4563d70a7db4396ee341ab9d69..0000000000000000000000000000000000000000
--- a/apps/desktopgui/desktopgui/resources/howto/howto.html
+++ /dev/null
@@ -1,261 +0,0 @@
-<html>
-    <head>
-        <title>Small Guide to I2P</title>
-    </head>
-    <body>
-        <h1>Small Guide to I2P</h1>
-
-        <h2>So, what's this all about?</h2>
-
-        <p>I2P builds up a new net inside the usual internet, connecting nodes together 
-        via encrypted connections.
-        It is a JAVA prgram with its most used part (the encryption of the data) written
-        in handoptimized assembler code.
-        It will use your bandwith, your RAM and your CPU. It will use them all up if you
-        do not limit it.
-        I2P will route unknown traffic through your node, even stuff you dislike.
-        As that data is encrypted, nobody knows whats data went to or drom your node.
-        </p>
-
-        <p>
-        First, ALWAYS use the latest stable release.
-        Development releases are called "mtn version" and are marked with a -, e.g. 
-        0.6.5-1. Those are usually useable by all but could do harm to your I2P 
-        experience.
-        You can get the latest MTN builds from my eepsite echelon.i2p, but always
-        remember: I built them, you need to trust me not to changed the code!
-        After you get the right "i2pupdate.zip" file, put that file into the I2P
-        directory and hit restart on the router console http://127.0.0.1:7657.
-        Do NOT deflate the zip file!
-        </p>
-
-        <p>
-        I2P is very dynamic - after startup it tries to get known to other I2P routers
-        and measures their speed - you need to wait some 10-120 minutes until your
-        I2P router knows enough other ones to obtain full power of I2P.
-        </p>
-
-        <h2>Filesharing</h2>
-
-        <p>
-        I2P is able to do anonymous filesharing.
-        But as there are NO gateways between real net and I2P, you can only share/
-        download torrents from within I2P. Look e.g. postman.i2p or planet.i2p.
-        You CANNOT use azureus, utorrent or any other usual client.
-        You cannot download anonymous torrents from mininova, piratebay or else.
-        You need to use I2P internal torrents and I2P aware programs like 
-        I2Psnark (builtin, suitable for 1-20 torrents)
-        I2PRufus (external, python, high CPU load, suitable >20 torrents) http://echelon.i2p/i2prufus
-        I2P-BT (external, python) 
-        I2PsnarkXL (mod of I2Psnark made by fwd)
-        </p>
-
-        <p>
-        There are also gnutella and edonkey clients:
-        i2phex for gnutella (http://echelon.i2p/i2phex)
-        imule for edonkey (http://echelon.i2p/imule)
-        </p>
-
-        <p>
-        Remember, as I2P uses other routers to route your traffic via 1-6 other PCs,
-        your transferrates in P2P are slower than in usual internet.
-        But you are anonymous, no one can easily (within 2 months-2 years) get your IP!
-        torrents inside of I2P reaches up to 50 kb/sec, usual are 10-20 kb/sec per torrent
-        i2phex reaches up to 20 kb/sec, usually 5-10 kb/sec
-        imule in times reaches 10 kb/sec, usually 5-10 kb/sec
-        </p>
-
-        <p>
-        In I2PHex and imule you can just tell "share file or directory", in torrent
-        you need to create a .torrent file and upload that (and ONLY that small .torrent)
-        file to the trackers like tracker.postman.i2p/
-        </p>
-
-        <p>
-        I2P is a smaller net (1000 users) which grows slowly. As of which amount of shared
-        data will slowly rise.
-        </p>
-
-        <p>
-        I2P is anonymous and it does not censor - there is no administrator.
-        There IS unwanted stuff like kiddyporn, nazism, or else.
-        If you dislike all this, do not use I2P.
-        There is NO way to prohibite this stuff to appear in a anonymous net like I2P.
-        (as that stuff is available shows the anonymity and transfer function of I2P
-        is working well enough)
-        You can delete the destinations in question from your local hosts.txt file (or
-        deface them) which will partly prevent you to reach those bad sies by accident.
-        </p>
-         
-        <h2>Internet (the websites)</h2>
-
-        <p>         
-        Only one outproxy (gateway I2P - webpages in usual Internet) is working.
-        It is NOT official from I2P, I2P does work without.
-        If that outproxy is slow, offline, gone,.. I2P still works on and cannot do
-        anything to change that failure.
-        That outproxy translates usual internet webpages into the I2P net and you can 
-        reach them via your Router.
-        The best way for usual webpages is TOR, not that outproxy.
-        Remember: the owner of the outproxy got ALL traffic from all I2P users
-        visiting Internet pages and will risk that into the police!
-        </p>
-        
-        <p>
-        This proxy is false.i2p. In newer I2P routers it is enabled, but not in
-        older ones. Go to http://127.0.0.1:7657/i2ptunnel/index.jsp tunnels page and
-        click on the eepProxy tunnel. Change the entry for the "Outproxies" to false.i2p
-        and save.  On the tunnels page, stop the epproxy tunnel and start it again,
-        now your router will use the false.i2p outproxy. 
-        </p>
-        
-        <p>
-        No other (known) gateways are setup and running. No one we know will run
-        the gateway for torrent or any other P2P data (and risk his life).
-        </p>
-        
-        <h2>Bandwidth</h2>
-        
-        <p>http://127.0.0.1:7657/config.jsp</p>
-        
-        <p>Setup your bandwith wisely. Know your linespeed!</p>
-        
-        <p>
-        E.g. most common terms are:
-        1Mbit = roughly 100 kbyte/sec
-        10 MBit = roughly 1100 kbyte/sec
-        512 kbit = roughly 50 kbyte/sec
-        or in germany:
-        16000er = roughly 1500 kbyte/sec
-        6000er = roughly 600 kbyte/sec
-        1000er = roughly 100 kb/sec
-        </p>        
-        
-        <p>
-        Set your bandwith limits to 10% under your line speed and burst  rate to
-        your line speed.
-        Set the bandwith share percentage to:
-        >80% if lowest bandwith setting is >50k
-        >50% if lowest bandwith setting is >30k
-        >20% if lowest bandwith setting is >16k
-        </p>
-        
-        <p>There is no shared bandwith under 16k.</p>
-        
-        <p>
-        Limit your participating tunnels (shared bandwith) on:
-        http://127.0.0.1:7657/configadvanced.jsp
-        with the line:
-        router.maxParticipatingTunnels=500
-        </p>
-        
-        <p>
-        2000 is for roughly 600 kb/sec - very high value with high CPU load
-        1000 is for roughly 300 kb/sec
-        600 is a good value for 150-200kb/sec
-        300 is roughly 90 kb/sec
-        150 roughly 50 kb/sec 
-        Remember: even failed tunnel requests will result in a part tunnel on the hops in between!
-        Those said, there are far more part tunnels unused than used in the live net under load, which 
-        results in slower bandwith per tunnel in the end.
-        It is wise to first limit the bandwith and afterwards the part tunnels, e.g. set some more part
-        tunnels and let I2P reach the bandwith limit instead of the part tunnels limit!
-        </p>
-        
-        <h2>What is shared bandwidth?</h2>
-         
-        <p>
-        I2P transports your date from the client to the server through 1-6 hops 
-        (other I2P routers). Each of this hops sees the data from you as "participating
-        tunnel" - which is the shared bandwith of them.
-        With this in mind, I2P needs some amount of this shared bandwith at some 
-        amount of routers.
-        Share as much as you are able of - others will thank you!
-        </p>
-        
-        <p>
-        With the "share percentage" set like above, you will obtain enough speed for
-        your own traffic and obtain some participating tunnels (if >16kb/sec) with some 
-        noise traffic to hide your traffic in the stream.
-        </p>
-        
-        <p>
-        With release 0.6.5 there is some method to prefer your own traffic ahead
-        of shared traffic which will result in better experience to you!
-        </p>
-        
-        <h2>Addressbook</h2>
-
-        <p>
-        I2P uses a local addressbook to link short DNS names with the internal used 512bit
-        hashes (which are destination IDs).
-        Those links are saved insside the hosts.txt and userhosts.txt files in the i2p 
-        directory.
-        Hosts which are not in those files cannot be reached via the short DNS names
-        and a error message with "jumper links" will appear. Those links will ask
-        some hosts services and forward to the correct site (if the site is known to them).
-        Those hosts services just made a form to add new "hosts" and those results public
-        available.
-        You can subscribe to those hosts service and let your hosts.txt file be updated
-        automatic. Go to http://127.0.0.1:7657/susidns/subscriptions.jsp SusiDNS
-        and enter the hosts services into the textbox (and save afterwards):
-        http://www.i2p2.i2p/hosts.txt
-        http://stats.i2p/cgi-bin/newhosts.txt
-        http://tino.i2p/hosts.txt
-        http://i2host.i2p/cgi-bin/i2hostag
-        You can add one of them, two or all. 
-        SusiDNS will now ask those hosts for new entries to the hosts.txt and those
-        will be added to your hosts.txt. The userhosts.txt will ONLY be updated by
-        yourself (the user) and not be published into the net!
-        Remember, names once set could not be changed! If you loose your key (destination
-        ID) to your eepsite, service,..., there is no way to change the linking 
-        between the DNS name and the (lost) destination ID automatic! Only manual by each 
-        user itself - great topic to discuss of need to renew DNS hostnames.
-        As this subscription will not update old entries, you can "deface" unwanted 
-        eepsites with a false key and if you hit the bad name in browser by accident, 
-        you will not see the bad stuff!
-        </p>
-
-        <h2>Out of Memory errors </h2>
-
-        <p>
-        If your router hits the Out of Memory error - check your logs!
-        Usual point for OOM are to much torrents in i2psnark - i2psnark is a real
-        memory hogg and >10 torrents it requiers hell a lot of memory!
-        </p>
-
-        <p>
-        Maybe it is possible for you to increase the wrapper memory config.
-        This ONLY works if you start the I2P service restartable with console
-        (on Windows).
-        In I2P directory edit the wrapper.config file and change the values:
-        wrapper.java.maxmemory=256 (or even to 512, IF possible)
-        Afterwards shutdown I2P complete (the service) and restart it.
-        </p>
-
-        <h2>Blocklists</h2>
-
-        <p>
-        Sometimes attackers trying to flood the I2P net and try to do some harm.
-        And some folks setting localnet IPs as their internet reachable address.
-        To prevent those bad router to harm the local router, I2P implemented
-        a local blocklist system. It is NOT integrated automatic as it could 
-        really harm your I2P experience if setup the wrong way.
-        The way to enable blocklists is:
-        Get the file http://zzz.i2p/files/blocklist.txt and copy this file into the
-        I2P directory.
-        On http://127.0.0.1:7657/configadvanced.jsp set the option 
-        router.blocklist.enable=true - click on Apply and restart the router 
-        with the restart link left on router console.
-        The blockfile.txt file follows a special order, you´ll get it if you read it.
-        The first entry is the reason to be shown on http://127.0.0.1:7657/profiles.jsp
-        at the bottom in the shitlist section.
-        The second entry is the IP or the dest ID of a router.
-        Right now there are only private subnets in the blocklist AND one chinese router
-        which floods the floodfill DB while restarting every few minutes with a different
-        router ID and far to less bandwith for being a floodfill router.
-        </p>
-
-        <p>(By echelon -- echelon.i2p )</p>
-    </body>
-</html>
diff --git a/apps/desktopgui/lib/appframework.jar b/apps/desktopgui/lib/appframework.jar
deleted file mode 100644
index 0b8ff0145f010a8e1e9bfe065704cb4ad675f761..0000000000000000000000000000000000000000
Binary files a/apps/desktopgui/lib/appframework.jar and /dev/null differ
diff --git a/apps/desktopgui/lib/swing-worker.jar b/apps/desktopgui/lib/swing-worker.jar
deleted file mode 100644
index bcdd9d9102c05f881b9283b252c29d98a0187691..0000000000000000000000000000000000000000
Binary files a/apps/desktopgui/lib/swing-worker.jar and /dev/null differ
diff --git a/apps/desktopgui/locale/messages_ar.po b/apps/desktopgui/locale/messages_ar.po
new file mode 100644
index 0000000000000000000000000000000000000000..e908adb7041099a540cc9fd08bba798f3f5eb89a
--- /dev/null
+++ b/apps/desktopgui/locale/messages_ar.po
@@ -0,0 +1,55 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the desktopgui package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P desktopgui\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-20 11:53+0000\n"
+"PO-Revision-Date: 2011-02-26 19:46-0000\n"
+"Last-Translator: hamada <hamada@mail.i2p>\n"
+"Language-Team: duck <duck@mail.i2p>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:23
+msgid "Start I2P"
+msgstr "ابدأ I2P"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "I2P is starting!"
+msgstr "جاري تشغيل I2P"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "Starting"
+msgstr "جاري البدأ"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:26
+msgid "Launch I2P Browser"
+msgstr " تشغيل متصفح I2P"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:50
+msgid "Configure desktopgui"
+msgstr "اعدادات"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:67
+msgid "Restart I2P"
+msgstr "اعادة تشغيل"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:85
+msgid "Stop I2P"
+msgstr "توقيف I2P"
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44
+msgid "Tray icon configuration"
+msgstr "اعدادات الأيقونة"
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47
+msgid "Should tray icon be enabled?"
+msgstr "هل ترغب في تفعيل الأيقونة؟"
+
diff --git a/apps/desktopgui/locale/messages_de.po b/apps/desktopgui/locale/messages_de.po
new file mode 100644
index 0000000000000000000000000000000000000000..7963075df58038ba79ccbc965b514a9499261c24
--- /dev/null
+++ b/apps/desktopgui/locale/messages_de.po
@@ -0,0 +1,55 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the desktopgui package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P\n"
+"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
+"POT-Creation-Date: 2011-03-03 18:29+0000\n"
+"PO-Revision-Date: 2011-03-22 15:49+0000\n"
+"Last-Translator: blabla <blabla@trash-mail.com>\n"
+"Language-Team: German <>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:23
+msgid "Start I2P"
+msgstr "I2P starten"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "I2P is starting!"
+msgstr "I2P startet gerade!"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "Starting"
+msgstr "Startend"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:26
+msgid "Launch I2P Browser"
+msgstr "I2P-Browser öffnen"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:50
+msgid "Configure desktopgui"
+msgstr "Desktopgui konfigurieren"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:67
+msgid "Restart I2P"
+msgstr "I2P neustarten"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:85
+msgid "Stop I2P"
+msgstr "I2P beenden"
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44
+msgid "Tray icon configuration"
+msgstr "Systemleistensymbol konfigurieren"
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47
+msgid "Should tray icon be enabled?"
+msgstr "Systemleistensymbol aktivieren?"
diff --git a/apps/desktopgui/locale/messages_en.po b/apps/desktopgui/locale/messages_en.po
new file mode 100644
index 0000000000000000000000000000000000000000..e92250e67838d65d527ba1f8d41f82f1c54f4982
--- /dev/null
+++ b/apps/desktopgui/locale/messages_en.po
@@ -0,0 +1,55 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the desktopgui package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P desktopgui\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-03 18:29+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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:23
+msgid "Start I2P"
+msgstr ""
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "I2P is starting!"
+msgstr ""
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "Starting"
+msgstr ""
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:26
+msgid "Launch I2P Browser"
+msgstr ""
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:50
+msgid "Configure desktopgui"
+msgstr ""
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:67
+msgid "Restart I2P"
+msgstr ""
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:85
+msgid "Stop I2P"
+msgstr ""
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44
+msgid "Tray icon configuration"
+msgstr ""
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47
+msgid "Should tray icon be enabled?"
+msgstr ""
diff --git a/apps/desktopgui/locale/messages_es.po b/apps/desktopgui/locale/messages_es.po
new file mode 100644
index 0000000000000000000000000000000000000000..a458f3ad7861a77c7b478c6751f92cd63a67bf6e
--- /dev/null
+++ b/apps/desktopgui/locale/messages_es.po
@@ -0,0 +1,56 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the desktopgui package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P\n"
+"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
+"POT-Creation-Date: 2011-03-03 18:29+0000\n"
+"PO-Revision-Date: 2011-04-02 23:57+0100\n"
+"Last-Translator: mixxy <m1xxy@mail.i2p>\n"
+"Language-Team: Spanish (Castilian) <None>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:23
+msgid "Start I2P"
+msgstr "Iniciar I2P"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "I2P is starting!"
+msgstr "I2P está iniciando!"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "Starting"
+msgstr "Iniciando"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:26
+msgid "Launch I2P Browser"
+msgstr "Lanzar navegador I2P"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:50
+msgid "Configure desktopgui"
+msgstr "Configurar desktopgui"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:67
+msgid "Restart I2P"
+msgstr "Reiniciar I2P"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:85
+msgid "Stop I2P"
+msgstr "Detener I2P"
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44
+msgid "Tray icon configuration"
+msgstr "Configuración del ícono de la barra de tareas"
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47
+msgid "Should tray icon be enabled?"
+msgstr "¿Debería estar activado el ícono de la barra de tareas?"
+
diff --git a/apps/desktopgui/locale/messages_fr.po b/apps/desktopgui/locale/messages_fr.po
new file mode 100644
index 0000000000000000000000000000000000000000..f816891d03f6ebd93fc17273c67ecd1dcc5489a1
--- /dev/null
+++ b/apps/desktopgui/locale/messages_fr.po
@@ -0,0 +1,56 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the desktopgui package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P desktopgui\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-03 18:29+0000\n"
+"PO-Revision-Date: 2011-03-30 21:58+0100\n"
+"Last-Translator: magma <magma@mail.i2p>\n"
+"Language-Team: duck <duck@mail.i2p>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:23
+msgid "Start I2P"
+msgstr "Démarrer I2P"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "I2P is starting!"
+msgstr "I2P démarre!"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "Starting"
+msgstr "Démarrage"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:26
+msgid "Launch I2P Browser"
+msgstr "Lancer le navigateur"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:50
+msgid "Configure desktopgui"
+msgstr "Configurer l'interface de bureau"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:67
+msgid "Restart I2P"
+msgstr "Redémarrer I2P"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:85
+msgid "Stop I2P"
+msgstr "Arrêter I2P"
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44
+msgid "Tray icon configuration"
+msgstr "Configuration de l'icône de notification"
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47
+msgid "Should tray icon be enabled?"
+msgstr "Activer l'icône de notification"
+
diff --git a/apps/desktopgui/locale/messages_nl.po b/apps/desktopgui/locale/messages_nl.po
new file mode 100644
index 0000000000000000000000000000000000000000..26973bd7835569075ef06edd41bc6eabc865faed
--- /dev/null
+++ b/apps/desktopgui/locale/messages_nl.po
@@ -0,0 +1,55 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the desktopgui package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P\n"
+"Report-Msgid-Bugs-To: http://trac.i2p2.de/\n"
+"POT-Creation-Date: 2011-02-20 11:53+0000\n"
+"PO-Revision-Date: 2011-02-20 12:15+0000\n"
+"Last-Translator: ducki2p <ducki2p@gmail.com>\n"
+"Language-Team: Dutch <>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:23
+msgid "Start I2P"
+msgstr "I2P starten"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "I2P is starting!"
+msgstr "I2P is aan het starten!"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "Starting"
+msgstr "Bezig met starten"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:26
+msgid "Launch I2P Browser"
+msgstr "Start I2P Browser"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:50
+msgid "Configure desktopgui"
+msgstr "Configureer desktopgui"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:67
+msgid "Restart I2P"
+msgstr "I2P herstarten"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:85
+msgid "Stop I2P"
+msgstr "I2P stoppen"
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44
+msgid "Tray icon configuration"
+msgstr "Systeemvak icoon configuratie"
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47
+msgid "Should tray icon be enabled?"
+msgstr "Systeemvak icoon inschakelen?"
diff --git a/apps/desktopgui/locale/messages_ru.po b/apps/desktopgui/locale/messages_ru.po
new file mode 100644
index 0000000000000000000000000000000000000000..aa5a21a62a888f9bac1c683cc954c2908d35f608
--- /dev/null
+++ b/apps/desktopgui/locale/messages_ru.po
@@ -0,0 +1,56 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the desktopgui package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P desktopgui\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-19 17:26+0000\n"
+"PO-Revision-Date: 2011-02-23 10:23+0500\n"
+"Last-Translator: Hidden Z <hiddenz@mail.i2p>\n"
+"Language-Team: duck <duck@mail.i2p>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:23
+msgid "Start I2P"
+msgstr "Запустить I2P"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "I2P is starting!"
+msgstr "I2P запускается!"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "Starting"
+msgstr "Запускается"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:26
+msgid "Launch I2P Browser"
+msgstr "Запустить I2P браузер"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:50
+msgid "Configure desktopgui"
+msgstr "Настроить desktopgui"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:67
+msgid "Restart I2P"
+msgstr "Перезапустить I2P"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:85
+msgid "Stop I2P"
+msgstr "Остановить I2P"
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44
+msgid "Tray icon configuration"
+msgstr "Настройка иконки в трее"
+
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47
+msgid "Should tray icon be enabled?"
+msgstr "Отображать ли иконку в трее?"
+
diff --git a/apps/desktopgui/locale/messages_zh.po b/apps/desktopgui/locale/messages_zh.po
new file mode 100644
index 0000000000000000000000000000000000000000..0cb5229f85e168a757ed2ededd57b173033177a2
--- /dev/null
+++ b/apps/desktopgui/locale/messages_zh.po
@@ -0,0 +1,50 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-16 17:10+0000\n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:23
+msgid "Start I2P"
+msgstr "启动 I2P"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "I2P is starting!"
+msgstr "正在启动 I2P !"
+
+#: src/net/i2p/desktopgui/ExternalTrayManager.java:38
+msgid "Starting"
+msgstr "正在启动"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:26
+msgid "Launch I2P Browser"
+msgstr "正在启动I2P浏览器"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:50
+msgid "Configure desktopgui"
+msgstr "界面设置"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:67
+msgid "Restart I2P"
+msgstr "重启 I2P"
+
+#: src/net/i2p/desktopgui/InternalTrayManager.java:85
+msgid "Stop I2P"
+msgstr "停止 I2P"
+
+#. Translate interface
+#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:26
+msgid "Should tray icon be enabled?"
+msgstr "显示托盘图标。"
+
+#~ msgid "Browser not found"
+#~ msgstr "Browser niet gevonden"
+#~ msgid "The default browser for your system was not found."
+#~ msgstr "De standaard webbrowser voor je systeem werd niet gevonden."
+
diff --git a/apps/desktopgui/manifest.mf b/apps/desktopgui/manifest.mf
deleted file mode 100644
index 328e8e5bc3b7f1f7bad2bc0751a933e00c801983..0000000000000000000000000000000000000000
--- a/apps/desktopgui/manifest.mf
+++ /dev/null
@@ -1,3 +0,0 @@
-Manifest-Version: 1.0
-X-COMMENT: Main-Class will be added automatically by build
-
diff --git a/apps/desktopgui/nbproject/build-impl.xml b/apps/desktopgui/nbproject/build-impl.xml
deleted file mode 100644
index 039f8788f1ca19268562c37f54c28030b53894f8..0000000000000000000000000000000000000000
--- a/apps/desktopgui/nbproject/build-impl.xml
+++ /dev/null
@@ -1,642 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-*** GENERATED FROM project.xml - DO NOT EDIT  ***
-***         EDIT ../build.xml INSTEAD         ***
-
-For the purpose of easier reading the script
-is divided into following sections:
-
-  - initialization
-  - compilation
-  - jar
-  - execution
-  - debugging
-  - javadoc
-  - junit compilation
-  - junit execution
-  - junit debugging
-  - applet
-  - cleanup
-
-        -->
-<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="desktopgui-impl">
-    <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
-    <!-- 
-                ======================
-                INITIALIZATION SECTION 
-                ======================
-            -->
-    <target name="-pre-init">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target depends="-pre-init" name="-init-private">
-        <property file="nbproject/private/config.properties"/>
-        <property file="nbproject/private/configs/${config}.properties"/>
-        <property file="nbproject/private/private.properties"/>
-    </target>
-    <target depends="-pre-init,-init-private" name="-init-user">
-        <property file="${user.properties.file}"/>
-        <!-- The two properties below are usually overridden -->
-        <!-- by the active platform. Just a fallback. -->
-        <property name="default.javac.source" value="1.4"/>
-        <property name="default.javac.target" value="1.4"/>
-    </target>
-    <target depends="-pre-init,-init-private,-init-user" name="-init-project">
-        <property file="nbproject/configs/${config}.properties"/>
-        <property file="nbproject/project.properties"/>
-    </target>
-    <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
-        <available file="${manifest.file}" property="manifest.available"/>
-        <condition property="manifest.available+main.class">
-            <and>
-                <isset property="manifest.available"/>
-                <isset property="main.class"/>
-                <not>
-                    <equals arg1="${main.class}" arg2="" trim="true"/>
-                </not>
-            </and>
-        </condition>
-        <condition property="manifest.available+main.class+mkdist.available">
-            <and>
-                <istrue value="${manifest.available+main.class}"/>
-                <isset property="libs.CopyLibs.classpath"/>
-            </and>
-        </condition>
-        <condition property="have.tests">
-            <or>
-                <available file="${test.src.dir}"/>
-            </or>
-        </condition>
-        <condition property="have.sources">
-            <or>
-                <available file="${src.dir}"/>
-            </or>
-        </condition>
-        <condition property="netbeans.home+have.tests">
-            <and>
-                <isset property="netbeans.home"/>
-                <isset property="have.tests"/>
-            </and>
-        </condition>
-        <condition property="no.javadoc.preview">
-            <and>
-                <isset property="javadoc.preview"/>
-                <isfalse value="${javadoc.preview}"/>
-            </and>
-        </condition>
-        <property name="run.jvmargs" value=""/>
-        <property name="javac.compilerargs" value=""/>
-        <property name="work.dir" value="${basedir}"/>
-        <condition property="no.deps">
-            <and>
-                <istrue value="${no.dependencies}"/>
-            </and>
-        </condition>
-        <property name="javac.debug" value="true"/>
-        <property name="javadoc.preview" value="true"/>
-        <property name="application.args" value=""/>
-        <property name="source.encoding" value="${file.encoding}"/>
-        <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
-            <and>
-                <isset property="javadoc.encoding"/>
-                <not>
-                    <equals arg1="${javadoc.encoding}" arg2=""/>
-                </not>
-            </and>
-        </condition>
-        <property name="javadoc.encoding.used" value="${source.encoding}"/>
-        <property name="includes" value="**"/>
-        <property name="excludes" value=""/>
-        <property name="do.depend" value="false"/>
-        <condition property="do.depend.true">
-            <istrue value="${do.depend}"/>
-        </condition>
-        <condition else="" property="javac.compilerargs.jaxws" value="-Djava.endorsed.dirs='${jaxws.endorsed.dir}'">
-            <and>
-                <isset property="jaxws.endorsed.dir"/>
-                <available file="nbproject/jaxws-build.xml"/>
-            </and>
-        </condition>
-    </target>
-    <target name="-post-init">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
-        <fail unless="src.dir">Must set src.dir</fail>
-        <fail unless="test.src.dir">Must set test.src.dir</fail>
-        <fail unless="build.dir">Must set build.dir</fail>
-        <fail unless="dist.dir">Must set dist.dir</fail>
-        <fail unless="build.classes.dir">Must set build.classes.dir</fail>
-        <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
-        <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
-        <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
-        <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
-        <fail unless="dist.jar">Must set dist.jar</fail>
-    </target>
-    <target name="-init-macrodef-property">
-        <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
-            <attribute name="name"/>
-            <attribute name="value"/>
-            <sequential>
-                <property name="@{name}" value="${@{value}}"/>
-            </sequential>
-        </macrodef>
-    </target>
-    <target name="-init-macrodef-javac">
-        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute default="${src.dir}" name="srcdir"/>
-            <attribute default="${build.classes.dir}" name="destdir"/>
-            <attribute default="${javac.classpath}" name="classpath"/>
-            <attribute default="${includes}" name="includes"/>
-            <attribute default="${excludes}" name="excludes"/>
-            <attribute default="${javac.debug}" name="debug"/>
-            <attribute default="/does/not/exist" name="sourcepath"/>
-            <element name="customize" optional="true"/>
-            <sequential>
-                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}">
-                    <classpath>
-                        <path path="@{classpath}"/>
-                    </classpath>
-                    <compilerarg line="${javac.compilerargs} ${javac.compilerargs.jaxws}"/>
-                    <customize/>
-                </javac>
-            </sequential>
-        </macrodef>
-        <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute default="${src.dir}" name="srcdir"/>
-            <attribute default="${build.classes.dir}" name="destdir"/>
-            <attribute default="${javac.classpath}" name="classpath"/>
-            <sequential>
-                <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
-                    <classpath>
-                        <path path="@{classpath}"/>
-                    </classpath>
-                </depend>
-            </sequential>
-        </macrodef>
-        <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute default="${build.classes.dir}" name="destdir"/>
-            <sequential>
-                <fail unless="javac.includes">Must set javac.includes</fail>
-                <pathconvert pathsep="," property="javac.includes.binary">
-                    <path>
-                        <filelist dir="@{destdir}" files="${javac.includes}"/>
-                    </path>
-                    <globmapper from="*.java" to="*.class"/>
-                </pathconvert>
-                <delete>
-                    <files includes="${javac.includes.binary}"/>
-                </delete>
-            </sequential>
-        </macrodef>
-    </target>
-    <target name="-init-macrodef-junit">
-        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute default="${includes}" name="includes"/>
-            <attribute default="${excludes}" name="excludes"/>
-            <attribute default="**" name="testincludes"/>
-            <sequential>
-                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true">
-                    <batchtest todir="${build.test.results.dir}">
-                        <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
-                            <filename name="@{testincludes}"/>
-                        </fileset>
-                    </batchtest>
-                    <classpath>
-                        <path path="${run.test.classpath}"/>
-                    </classpath>
-                    <syspropertyset>
-                        <propertyref prefix="test-sys-prop."/>
-                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
-                    </syspropertyset>
-                    <formatter type="brief" usefile="false"/>
-                    <formatter type="xml"/>
-                    <jvmarg line="${run.jvmargs}"/>
-                </junit>
-            </sequential>
-        </macrodef>
-    </target>
-    <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
-        <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
-            <attribute default="${main.class}" name="name"/>
-            <attribute default="${debug.classpath}" name="classpath"/>
-            <attribute default="" name="stopclassname"/>
-            <sequential>
-                <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
-                    <classpath>
-                        <path path="@{classpath}"/>
-                    </classpath>
-                </nbjpdastart>
-            </sequential>
-        </macrodef>
-        <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
-            <attribute default="${build.classes.dir}" name="dir"/>
-            <sequential>
-                <nbjpdareload>
-                    <fileset dir="@{dir}" includes="${fix.classes}">
-                        <include name="${fix.includes}*.class"/>
-                    </fileset>
-                </nbjpdareload>
-            </sequential>
-        </macrodef>
-    </target>
-    <target name="-init-debug-args">
-        <property name="version-output" value="java version &quot;${ant.java.version}"/>
-        <condition property="have-jdk-older-than-1.4">
-            <or>
-                <contains string="${version-output}" substring="java version &quot;1.0"/>
-                <contains string="${version-output}" substring="java version &quot;1.1"/>
-                <contains string="${version-output}" substring="java version &quot;1.2"/>
-                <contains string="${version-output}" substring="java version &quot;1.3"/>
-            </or>
-        </condition>
-        <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
-            <istrue value="${have-jdk-older-than-1.4}"/>
-        </condition>
-        <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
-            <os family="windows"/>
-        </condition>
-        <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
-            <isset property="debug.transport"/>
-        </condition>
-    </target>
-    <target depends="-init-debug-args" name="-init-macrodef-debug">
-        <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
-            <attribute default="${main.class}" name="classname"/>
-            <attribute default="${debug.classpath}" name="classpath"/>
-            <element name="customize" optional="true"/>
-            <sequential>
-                <java classname="@{classname}" dir="${work.dir}" fork="true">
-                    <jvmarg line="${debug-args-line}"/>
-                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
-                    <jvmarg line="${run.jvmargs}"/>
-                    <classpath>
-                        <path path="@{classpath}"/>
-                    </classpath>
-                    <syspropertyset>
-                        <propertyref prefix="run-sys-prop."/>
-                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
-                    </syspropertyset>
-                    <customize/>
-                </java>
-            </sequential>
-        </macrodef>
-    </target>
-    <target name="-init-macrodef-java">
-        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
-            <attribute default="${main.class}" name="classname"/>
-            <element name="customize" optional="true"/>
-            <sequential>
-                <java classname="@{classname}" dir="${work.dir}" fork="true">
-                    <jvmarg line="${run.jvmargs}"/>
-                    <classpath>
-                        <path path="${run.classpath}"/>
-                    </classpath>
-                    <syspropertyset>
-                        <propertyref prefix="run-sys-prop."/>
-                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
-                    </syspropertyset>
-                    <customize/>
-                </java>
-            </sequential>
-        </macrodef>
-    </target>
-    <target name="-init-presetdef-jar">
-        <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
-            <jar compress="${jar.compress}" jarfile="${dist.jar}">
-                <j2seproject1:fileset dir="${build.classes.dir}"/>
-            </jar>
-        </presetdef>
-    </target>
-    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar" name="init"/>
-    <!--
-                ===================
-                COMPILATION SECTION
-                ===================
-            -->
-    <target depends="init" name="deps-jar" unless="no.deps"/>
-    <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
-    <target depends="init" name="-check-automatic-build">
-        <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
-    </target>
-    <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
-        <antcall target="clean"/>
-    </target>
-    <target depends="init,deps-jar" name="-pre-pre-compile">
-        <mkdir dir="${build.classes.dir}"/>
-    </target>
-    <target name="-pre-compile">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target if="do.depend.true" name="-compile-depend">
-        <j2seproject3:depend/>
-    </target>
-    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile">
-        <j2seproject3:javac/>
-        <copy todir="${build.classes.dir}">
-            <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
-        </copy>
-    </target>
-    <target name="-post-compile">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
-    <target name="-pre-compile-single">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
-        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
-        <j2seproject3:force-recompile/>
-        <j2seproject3:javac excludes="" includes="${javac.includes}" sourcepath="${src.dir}"/>
-    </target>
-    <target name="-post-compile-single">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
-    <!--
-                ====================
-                JAR BUILDING SECTION
-                ====================
-            -->
-    <target depends="init" name="-pre-pre-jar">
-        <dirname file="${dist.jar}" property="dist.jar.dir"/>
-        <mkdir dir="${dist.jar.dir}"/>
-    </target>
-    <target name="-pre-jar">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target depends="init,compile,-pre-pre-jar,-pre-jar" name="-do-jar-without-manifest" unless="manifest.available">
-        <j2seproject1:jar/>
-    </target>
-    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class">
-        <j2seproject1:jar manifest="${manifest.file}"/>
-    </target>
-    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
-        <j2seproject1:jar manifest="${manifest.file}">
-            <j2seproject1:manifest>
-                <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
-            </j2seproject1:manifest>
-        </j2seproject1:jar>
-        <echo>To run this application from the command line without Ant, try:</echo>
-        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
-        <property location="${dist.jar}" name="dist.jar.resolved"/>
-        <pathconvert property="run.classpath.with.dist.jar">
-            <path path="${run.classpath}"/>
-            <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
-        </pathconvert>
-        <echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
-    </target>
-    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries">
-        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
-        <pathconvert property="run.classpath.without.build.classes.dir">
-            <path path="${run.classpath}"/>
-            <map from="${build.classes.dir.resolved}" to=""/>
-        </pathconvert>
-        <pathconvert pathsep=" " property="jar.classpath">
-            <path path="${run.classpath.without.build.classes.dir}"/>
-            <chainedmapper>
-                <flattenmapper/>
-                <globmapper from="*" to="lib/*"/>
-            </chainedmapper>
-        </pathconvert>
-        <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
-        <copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
-            <fileset dir="${build.classes.dir}"/>
-            <manifest>
-                <attribute name="Main-Class" value="${main.class}"/>
-                <attribute name="Class-Path" value="${jar.classpath}"/>
-            </manifest>
-        </copylibs>
-        <echo>To run this application from the command line without Ant, try:</echo>
-        <property location="${dist.jar}" name="dist.jar.resolved"/>
-        <echo>java -jar "${dist.jar.resolved}"</echo>
-    </target>
-    <target name="-post-jar">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
-    <!--
-                =================
-                EXECUTION SECTION
-                =================
-            -->
-    <target depends="init,compile" description="Run a main class." name="run">
-        <j2seproject1:java>
-            <customize>
-                <arg line="${application.args}"/>
-            </customize>
-        </j2seproject1:java>
-    </target>
-    <target name="-do-not-recompile">
-        <property name="javac.includes.binary" value=""/>
-    </target>
-    <target depends="init,-do-not-recompile,compile-single" name="run-single">
-        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
-        <j2seproject1:java classname="${run.class}"/>
-    </target>
-    <!--
-                =================
-                DEBUGGING SECTION
-                =================
-            -->
-    <target depends="init" if="netbeans.home" name="-debug-start-debugger">
-        <j2seproject1:nbjpdastart name="${debug.class}"/>
-    </target>
-    <target depends="init,compile" name="-debug-start-debuggee">
-        <j2seproject3:debug>
-            <customize>
-                <arg line="${application.args}"/>
-            </customize>
-        </j2seproject3:debug>
-    </target>
-    <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
-    <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
-        <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
-    </target>
-    <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
-    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
-        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
-        <j2seproject3:debug classname="${debug.class}"/>
-    </target>
-    <target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
-    <target depends="init" name="-pre-debug-fix">
-        <fail unless="fix.includes">Must set fix.includes</fail>
-        <property name="javac.includes" value="${fix.includes}.java"/>
-    </target>
-    <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
-        <j2seproject1:nbjpdareload/>
-    </target>
-    <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
-    <!--
-                ===============
-                JAVADOC SECTION
-                ===============
-            -->
-    <target depends="init" name="-javadoc-build">
-        <mkdir dir="${dist.javadoc.dir}"/>
-        <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
-            <classpath>
-                <path path="${javac.classpath}"/>
-            </classpath>
-            <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
-                <filename name="**/*.java"/>
-            </fileset>
-        </javadoc>
-    </target>
-    <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
-        <nbbrowse file="${dist.javadoc.dir}/index.html"/>
-    </target>
-    <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
-    <!--
-                =========================
-                JUNIT COMPILATION SECTION
-                =========================
-            -->
-    <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
-        <mkdir dir="${build.test.classes.dir}"/>
-    </target>
-    <target name="-pre-compile-test">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target if="do.depend.true" name="-compile-test-depend">
-        <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
-    </target>
-    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
-        <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
-        <copy todir="${build.test.classes.dir}">
-            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
-        </copy>
-    </target>
-    <target name="-post-compile-test">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
-    <target name="-pre-compile-test-single">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
-        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
-        <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
-        <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
-        <copy todir="${build.test.classes.dir}">
-            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
-        </copy>
-    </target>
-    <target name="-post-compile-test-single">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
-    <!--
-                =======================
-                JUNIT EXECUTION SECTION
-                =======================
-            -->
-    <target depends="init" if="have.tests" name="-pre-test-run">
-        <mkdir dir="${build.test.results.dir}"/>
-    </target>
-    <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
-        <j2seproject3:junit testincludes="**/*Test.java"/>
-    </target>
-    <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
-        <fail if="tests.failed">Some tests failed; see details above.</fail>
-    </target>
-    <target depends="init" if="have.tests" name="test-report"/>
-    <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
-    <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
-    <target depends="init" if="have.tests" name="-pre-test-run-single">
-        <mkdir dir="${build.test.results.dir}"/>
-    </target>
-    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
-        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
-        <j2seproject3:junit excludes="" includes="${test.includes}"/>
-    </target>
-    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
-        <fail if="tests.failed">Some tests failed; see details above.</fail>
-    </target>
-    <target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
-    <!--
-                =======================
-                JUNIT DEBUGGING SECTION
-                =======================
-            -->
-    <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
-        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
-        <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
-        <delete file="${test.report.file}"/>
-        <mkdir dir="${build.test.results.dir}"/>
-        <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
-            <customize>
-                <syspropertyset>
-                    <propertyref prefix="test-sys-prop."/>
-                    <mapper from="test-sys-prop.*" to="*" type="glob"/>
-                </syspropertyset>
-                <arg value="${test.class}"/>
-                <arg value="showoutput=true"/>
-                <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
-                <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
-            </customize>
-        </j2seproject3:debug>
-    </target>
-    <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
-        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
-    </target>
-    <target depends="init,-do-not-recompile,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
-    <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
-        <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
-    </target>
-    <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
-    <!--
-                =========================
-                APPLET EXECUTION SECTION
-                =========================
-            -->
-    <target depends="init,compile-single" name="run-applet">
-        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
-        <j2seproject1:java classname="sun.applet.AppletViewer">
-            <customize>
-                <arg value="${applet.url}"/>
-            </customize>
-        </j2seproject1:java>
-    </target>
-    <!--
-                =========================
-                APPLET DEBUGGING  SECTION
-                =========================
-            -->
-    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
-        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
-        <j2seproject3:debug classname="sun.applet.AppletViewer">
-            <customize>
-                <arg value="${applet.url}"/>
-            </customize>
-        </j2seproject3:debug>
-    </target>
-    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
-    <!--
-                ===============
-                CLEANUP SECTION
-                ===============
-            -->
-    <target depends="init" name="deps-clean" unless="no.deps"/>
-    <target depends="init" name="-do-clean">
-        <delete dir="${build.dir}"/>
-        <delete dir="${dist.dir}"/>
-    </target>
-    <target name="-post-clean">
-        <!-- Empty placeholder for easier customization. -->
-        <!-- You can override this target in the ../build.xml file. -->
-    </target>
-    <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
-</project>
diff --git a/apps/desktopgui/nbproject/genfiles.properties b/apps/desktopgui/nbproject/genfiles.properties
deleted file mode 100644
index f6b0f837bcfabb640d6b0fd4fb85db89aa0b70da..0000000000000000000000000000000000000000
--- a/apps/desktopgui/nbproject/genfiles.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-build.xml.data.CRC32=c4b345cd
-build.xml.script.CRC32=9785bb9a
-build.xml.stylesheet.CRC32=be360661
-# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
-# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=f630f8db
-nbproject/build-impl.xml.script.CRC32=8c02c081
-nbproject/build-impl.xml.stylesheet.CRC32=65b8de21
diff --git a/apps/desktopgui/nbproject/project.properties b/apps/desktopgui/nbproject/project.properties
deleted file mode 100644
index a02ea82072b17a2b6c5cc87f068911a19a639f32..0000000000000000000000000000000000000000
--- a/apps/desktopgui/nbproject/project.properties
+++ /dev/null
@@ -1,81 +0,0 @@
-application.desc=An anonymous communication network.
-application.homepage=http://www.i2p2.de
-application.title=I2P Desktop GUI
-application.vendor=I2P Developers
-build.classes.dir=${build.dir}/classes
-build.classes.excludes=**/*.java,**/*.form
-# This directory is removed when the project is cleaned:
-build.dir=build
-build.generated.dir=${build.dir}/generated
-# Only compile against the classpath explicitly listed here:
-build.sysclasspath=ignore
-build.test.classes.dir=${build.dir}/test/classes
-build.test.results.dir=${build.dir}/test/results
-debug.classpath=\
-    ${run.classpath}
-debug.test.classpath=\
-    ${run.test.classpath}
-# This directory is removed when the project is cleaned:
-dist.dir=dist
-dist.jar=${dist.dir}/desktopgui.jar
-dist.javadoc.dir=${dist.dir}/javadoc
-excludes=
-file.reference.appframework.jar=lib/appframework.jar
-file.reference.i2p.jar=../../core/java/build/i2p.jar
-file.reference.i2ptunnel.jar=../i2ptunnel/java/build/i2ptunnel.jar
-file.reference.router.jar=../../router/java/build/router.jar
-file.reference.routerconsole.jar=../routerconsole/java/build/routerconsole.jar
-file.reference.swing-worker.jar=lib/swing-worker.jar
-includes=**
-jar.compress=false
-javac.classpath=\
-    ${file.reference.router.jar}:\
-    ${file.reference.appframework.jar}:\
-    ${file.reference.swing-worker.jar}:\
-    ${file.reference.i2p.jar}:\
-    ${file.reference.routerconsole.jar}:\
-    ${file.reference.i2ptunnel.jar}
-# Space-separated list of extra javac options
-javac.compilerargs=
-javac.deprecation=false
-javac.source=1.6
-javac.target=1.6
-javac.test.classpath=\
-    ${javac.classpath}:\
-    ${build.classes.dir}:\
-    ${libs.junit.classpath}:\
-    ${libs.junit_4.classpath}
-javadoc.additionalparam=
-javadoc.author=false
-javadoc.encoding=${source.encoding}
-javadoc.encoding.used=${javadoc.encoding}
-javadoc.noindex=false
-javadoc.nonavbar=false
-javadoc.notree=false
-javadoc.private=false
-javadoc.splitindex=true
-javadoc.use=true
-javadoc.version=false
-javadoc.windowtitle=
-jnlp.codebase.type=local
-jnlp.codebase.url=file:/home/mathias/Documenten/Programmeren/i2p_monotone/repo/i2p.i2p/apps/desktopgui/dist/
-jnlp.enabled=false
-jnlp.offline-allowed=false
-jnlp.signed=false
-main.class=net.i2p.desktopgui.desktopgui.Main
-manifest.file=manifest.mf
-meta.inf.dir=${src.dir}/META-INF
-platform.active=default_platform
-run.classpath=\
-    ${javac.classpath}:\
-    ${build.classes.dir}
-# Space-separated list of JVM arguments used when running the project
-# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
-# or test-sys-prop.name=value to set system properties for unit tests):
-run.jvmargs=
-run.test.classpath=\
-    ${javac.test.classpath}:\
-    ${build.test.classes.dir}
-source.encoding=UTF-8
-src.dir=src
-test.src.dir=test
diff --git a/apps/desktopgui/nbproject/project.xml b/apps/desktopgui/nbproject/project.xml
deleted file mode 100644
index 9dba9493c19d106655401d5e0fabc02381858ef8..0000000000000000000000000000000000000000
--- a/apps/desktopgui/nbproject/project.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://www.netbeans.org/ns/project/1">
-    <type>org.netbeans.modules.java.j2seproject</type>
-    <configuration>
-        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
-            <name>desktopgui</name>
-            <minimum-ant-version>1.6.5</minimum-ant-version>
-            <source-roots>
-                <root id="src.dir"/>
-            </source-roots>
-            <test-roots>
-                <root id="test.src.dir"/>
-            </test-roots>
-        </data>
-        <swingapp xmlns="http://www.netbeans.org/ns/form-swingapp/1">
-            <application-class name="net.i2p.desktopgui.desktopgui.Main"/>
-        </swingapp>
-    </configuration>
-</project>
diff --git a/apps/desktopgui/desktopgui/resources/logo/logo.jpg b/apps/desktopgui/resources/images/logo.jpg
similarity index 100%
rename from apps/desktopgui/desktopgui/resources/logo/logo.jpg
rename to apps/desktopgui/resources/images/logo.jpg
diff --git a/apps/desktopgui/resources/images/logo.png b/apps/desktopgui/resources/images/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad89a98643d2fd0a323a9beadd1a70f05de9d159
Binary files /dev/null and b/apps/desktopgui/resources/images/logo.png differ
diff --git a/apps/desktopgui/desktopgui/resources/logo/logo_green.jpg b/apps/desktopgui/resources/images/logo_green.jpg
similarity index 100%
rename from apps/desktopgui/desktopgui/resources/logo/logo_green.jpg
rename to apps/desktopgui/resources/images/logo_green.jpg
diff --git a/apps/desktopgui/desktopgui/resources/logo/logo_orange.jpg b/apps/desktopgui/resources/images/logo_orange.jpg
similarity index 100%
rename from apps/desktopgui/desktopgui/resources/logo/logo_orange.jpg
rename to apps/desktopgui/resources/images/logo_orange.jpg
diff --git a/apps/desktopgui/desktopgui/resources/logo/logo_red.jpg b/apps/desktopgui/resources/images/logo_red.jpg
similarity index 100%
rename from apps/desktopgui/desktopgui/resources/logo/logo_red.jpg
rename to apps/desktopgui/resources/images/logo_red.jpg
diff --git a/apps/desktopgui/src/META-INF/services/org.jdesktop.application.Application b/apps/desktopgui/src/META-INF/services/org.jdesktop.application.Application
deleted file mode 100644
index 6cd2ac1fb1e0d136a361ca63d6a74783b33fddb7..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/META-INF/services/org.jdesktop.application.Application
+++ /dev/null
@@ -1 +0,0 @@
-desktopgui.Main
\ No newline at end of file
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..6fea46fef5fb117801e05b57c4f23210b581404f
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java
@@ -0,0 +1,52 @@
+package net.i2p.desktopgui;
+
+import java.awt.MenuItem;
+import java.awt.PopupMenu;
+import java.awt.TrayIcon;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.SwingWorker;
+
+import net.i2p.desktopgui.router.RouterManager;
+import net.i2p.util.Log;
+
+public class ExternalTrayManager extends TrayManager {
+	
+    private final static Log log = new Log(ExternalTrayManager.class);
+
+    protected ExternalTrayManager() {}
+
+    @Override
+    public PopupMenu getMainMenu() {
+        PopupMenu popup = new PopupMenu();
+        MenuItem startItem = new MenuItem(_("Start I2P"));
+        startItem.addActionListener(new ActionListener() {
+
+            @Override
+            public void actionPerformed(ActionEvent arg0) {
+                new SwingWorker<Object, Object>() {
+
+                    @Override
+                    protected Object doInBackground() throws Exception {
+                        RouterManager.start();
+                        return null;
+                    }
+                    
+                    @Override
+                    protected void done() {
+                        trayIcon.displayMessage(_("Starting"), _("I2P is starting!"), TrayIcon.MessageType.INFO);
+                        //Hide the tray icon.
+                        //We cannot stop the desktopgui program entirely,
+                        //since that risks killing the I2P process as well.
+                        tray.remove(trayIcon);
+                    }
+                    
+                }.execute();
+            }
+            
+        });
+        popup.add(startItem);
+        return popup;
+    }
+}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..e1247dde6c53a44a8731ffd3446f38763ac077f8
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java
@@ -0,0 +1,113 @@
+package net.i2p.desktopgui;
+
+import java.awt.MenuItem;
+import java.awt.PopupMenu;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.SwingWorker;
+import net.i2p.desktopgui.gui.DesktopguiConfigurationFrame;
+
+import net.i2p.desktopgui.router.RouterManager;
+import net.i2p.desktopgui.util.BrowseException;
+import net.i2p.desktopgui.util.I2PDesktop;
+import net.i2p.util.Log;
+
+public class InternalTrayManager extends TrayManager {
+	
+	private final static Log log = new Log(InternalTrayManager.class);
+
+    protected InternalTrayManager() {}
+
+    @Override
+    public PopupMenu getMainMenu() {
+        PopupMenu popup = new PopupMenu();
+        
+        MenuItem browserLauncher = new MenuItem(_("Launch I2P Browser"));
+        browserLauncher.addActionListener(new ActionListener() {
+            
+            @Override
+            public void actionPerformed(ActionEvent arg0) {
+                new SwingWorker<Object, Object>() {
+
+                    @Override
+                    protected Object doInBackground() throws Exception {
+                        return null;
+                    }
+                    
+                    @Override
+                    protected void done() {
+                        try {
+                            I2PDesktop.browse("http://localhost:7657");
+                        } catch (BrowseException e1) {
+                            log.log(Log.WARN, "Failed to open browser!", e1);
+                        }    
+                    }
+                    
+                }.execute();
+            }
+        });
+        MenuItem desktopguiConfigurationLauncher = new MenuItem(_("Configure desktopgui"));
+        desktopguiConfigurationLauncher.addActionListener(new ActionListener() {
+
+            @Override
+            public void actionPerformed(ActionEvent arg0) {
+                new SwingWorker<Object, Object>() {
+
+                    @Override
+                    protected Object doInBackground() throws Exception {
+                        new DesktopguiConfigurationFrame().setVisible(true);
+                        return null;
+                    }
+
+                }.execute();
+            }
+
+        });
+        MenuItem restartItem = new MenuItem(_("Restart I2P"));
+        restartItem.addActionListener(new ActionListener() {
+
+            @Override
+            public void actionPerformed(ActionEvent arg0) {
+                new SwingWorker<Object, Object>() {
+
+                    @Override
+                    protected Object doInBackground() throws Exception {
+                        RouterManager.restart();
+                        return null;
+                    }
+                    
+                }.execute();
+                
+            }
+            
+        });
+        MenuItem stopItem = new MenuItem(_("Stop I2P"));
+        stopItem.addActionListener(new ActionListener() {
+
+            @Override
+            public void actionPerformed(ActionEvent arg0) {
+                new SwingWorker<Object, Object>() {
+                    
+                    @Override
+                    protected Object doInBackground() throws Exception {
+                        RouterManager.shutDown();
+                        return null;
+                    }
+                    
+                }.execute();
+                
+            }
+            
+        });
+        
+        popup.add(browserLauncher);
+        popup.addSeparator();
+        popup.add(desktopguiConfigurationLauncher);
+        popup.addSeparator();
+        popup.add(restartItem);
+        popup.add(stopItem);
+        
+        return popup;
+    }
+}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/Main.java b/apps/desktopgui/src/net/i2p/desktopgui/Main.java
new file mode 100644
index 0000000000000000000000000000000000000000..993970e30c8a32c1c5407eda8910eea1a6fc586b
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/Main.java
@@ -0,0 +1,125 @@
+package net.i2p.desktopgui;
+
+/*
+ * Main.java
+ */
+
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+import java.awt.GraphicsEnvironment;
+
+import net.i2p.I2PAppContext;
+import net.i2p.desktopgui.router.RouterManager;
+import net.i2p.desktopgui.util.*;
+import net.i2p.util.Log;
+import net.i2p.util.Translate;
+import net.i2p.util.I2PProperties.I2PPropertyCallback;
+
+/**
+ * The main class of the application.
+ */
+public class Main {
+    
+    ///Manages the lifetime of the tray icon.
+    private TrayManager trayManager = null;
+    private final static Log log = new Log(Main.class);
+
+    /**
+     * Start the tray icon code (loads tray icon in the tray area).
+     * @throws Exception 
+     */
+    public void startUp() throws Exception {
+        trayManager = TrayManager.getInstance();
+        trayManager.startManager();
+        
+        if(RouterManager.inI2P()) {
+            RouterManager.getRouterContext().addPropertyCallback(new I2PPropertyCallback() {
+
+                @Override
+                public void propertyChanged(String arg0, String arg1) {
+                    if(arg0.equals(Translate.PROP_LANG)) {
+                        trayManager.languageChanged();
+                    }
+                }
+                
+            });
+        }
+    }
+    
+    public static void main(String[] args) {
+        beginStartup(args);
+    }
+
+    /**
+     * Main method launching the application.
+     */
+    public static void beginStartup(String[] args) {
+        try {
+            String headless = System.getProperty("java.awt.headless");
+            boolean isHeadless = Boolean.parseBoolean(headless);
+            if(isHeadless) {
+            	log.warn("Headless environment: not starting desktopgui!");
+                return;
+            }
+        }
+        catch(Exception e) {
+            return;
+        }
+        try {
+            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+        } catch (ClassNotFoundException ex) {
+            log.log(Log.ERROR, null, ex);
+        } catch (InstantiationException ex) {
+            log.log(Log.ERROR, null, ex);
+        } catch (IllegalAccessException ex) {
+            log.log(Log.ERROR, null, ex);
+        } catch (UnsupportedLookAndFeelException ex) {
+            log.log(Log.ERROR, null, ex);
+        }
+        
+        ConfigurationManager.getInstance().loadArguments(args);
+        
+        final Main main = new Main();
+        
+        main.launchForeverLoop();
+        //We'll be doing GUI work, so let's stay in the event dispatcher thread.
+        SwingUtilities.invokeLater(new Runnable() {
+
+            @Override
+            public void run() {
+                try {
+                    main.startUp();
+                }
+                catch(Exception e) {
+                    log.error("Failed while running desktopgui!", e);
+                }
+                
+            }
+            
+        });
+
+    }
+    
+    /**
+     * Avoids the app terminating because no Window is opened anymore.
+     * More info: http://java.sun.com/javase/6/docs/api/java/awt/doc-files/AWTThreadIssues.html#Autoshutdown
+     */
+    public void launchForeverLoop() {
+       Runnable r = new Runnable() {
+            public void run() {
+                try {
+                    Object o = new Object();
+                    synchronized (o) {
+                        o.wait();
+                    }
+                } catch (InterruptedException ie) {
+                }
+            }
+        };
+        Thread t = new Thread(r);
+        t.setDaemon(false);
+        t.start();
+    }
+    
+}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..1a29d8871bd201201967ad7a3020816920aec42e
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java
@@ -0,0 +1,97 @@
+package net.i2p.desktopgui;
+
+import java.awt.AWTException;
+import java.awt.Desktop;
+import java.awt.Image;
+import java.awt.MenuItem;
+import java.awt.PopupMenu;
+import java.awt.SystemTray;
+import java.awt.Toolkit;
+import java.awt.TrayIcon;
+import java.awt.Desktop.Action;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import javax.swing.SwingWorker;
+
+import net.i2p.desktopgui.i18n.DesktopguiTranslator;
+import net.i2p.desktopgui.router.RouterManager;
+import net.i2p.desktopgui.util.BrowseException;
+import net.i2p.desktopgui.util.ConfigurationManager;
+import net.i2p.desktopgui.util.I2PDesktop;
+import net.i2p.util.Log;
+
+/**
+ * Manages the tray icon life.
+ */
+public abstract class TrayManager {
+
+    private static TrayManager instance = null;
+    ///The tray area, or null if unsupported
+    protected SystemTray tray = null;
+    ///Our tray icon, or null if unsupported
+    protected TrayIcon trayIcon = null;
+    private final static Log log = new Log(TrayManager.class);
+    
+    /**
+     * Instantiate tray manager.
+     */
+    protected TrayManager() {}
+    
+    protected static TrayManager getInstance() {
+        if(instance == null) {
+            boolean inI2P = RouterManager.inI2P();
+            if(inI2P) {
+                instance = new InternalTrayManager();
+            }
+            else {
+                instance = new ExternalTrayManager();
+            }
+        }
+        return instance;
+    }
+
+    /**
+     * Add the tray icon to the system tray and start everything up.
+     */
+    protected void startManager() {
+        if(SystemTray.isSupported()) {
+            tray = SystemTray.getSystemTray();
+            trayIcon = new TrayIcon(getTrayImage(), "I2P", getMainMenu());
+            trayIcon.setImageAutoSize(true); //Resize image to fit the system tray
+            try {
+                tray.add(trayIcon);
+            } catch (AWTException e) {
+                log.log(Log.WARN, "Problem creating system tray icon!", e);
+            }
+        }
+    }
+    
+    protected void languageChanged() {
+        trayIcon.setPopupMenu(getMainMenu());
+    }
+    
+    /**
+     * Build a popup menu, adding callbacks to the different items.
+     * @return popup menu
+     */
+    protected abstract PopupMenu getMainMenu();
+    
+    /**
+     * Get tray icon image from the desktopgui resources in the jar file.
+     * @return image used for the tray icon
+     */
+    private Image getTrayImage() {
+        URL url = getClass().getResource("/desktopgui/resources/images/logo.png");
+        Image image = Toolkit.getDefaultToolkit().getImage(url);
+        return image;
+    }
+    
+    protected static String _(String s) {
+        return DesktopguiTranslator._(s);
+    }
+}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java
deleted file mode 100644
index 21f0e04cf92ce3c2a0ca783cc239419e22c69aa3..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-
-package net.i2p.desktopgui.desktopgui;
-
-/**
- *
- * @author mathias
- */
-public class GUIVersion {
-    public static final String VERSION = "0.0.2";
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/Main.java b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/Main.java
deleted file mode 100644
index c3078163d4c64ff29d6c58927c3c3e71ddf3efd3..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/Main.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package net.i2p.desktopgui.desktopgui;
-
-/*
- * Main.java
- */
-
-
-
-import net.i2p.desktopgui.gui.Tray;
-import net.i2p.desktopgui.gui.SpeedSelector;
-import java.awt.SystemTray;
-import java.util.Properties;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.swing.UIManager;
-import javax.swing.UnsupportedLookAndFeelException;
-import org.jdesktop.application.Application;
-import org.jdesktop.application.SingleFrameApplication;
-import net.i2p.desktopgui.persistence.PropertyManager;
-
-/**
- * The main class of the application.
- */
-public class Main extends SingleFrameApplication {
-
-    /**
-     * At startup create and show the main frame of the application.
-     */
-    @Override protected void startup() {
-        Properties props = PropertyManager.loadProps();
-        
-        //First load: present screen with information (to help choose I2P settings)
-        if(props.getProperty(FIRSTLOAD).equals("true")) {
-            props.setProperty(FIRSTLOAD, "false");
-            PropertyManager.saveProps(props);
-            new SpeedSelector(); //Start speed selector GUI
-        }
-        
-        if(SystemTray.isSupported()) {
-            tray = new Tray();
-        }
-        else { //Alternative if SystemTray is not supported on the platform
-        }
-    }
-
-    /**
-     * This method is to initialize the specified window by injecting resources.
-     * Windows shown in our application come fully initialized from the GUI
-     * builder, so this additional configuration is not needed.
-     */
-    @Override protected void configureWindow(java.awt.Window root) {
-    }
-
-    /**
-     * A convenient static getter for the application instance.
-     * @return the instance of Main
-     */
-    public static Main getApplication() {
-        return Application.getInstance(Main.class);
-    }
-
-    /**
-     * Main method launching the application.
-     */
-    public static void main(String[] args) {
-        System.setProperty("java.awt.headless", "false");  //Make sure I2P is running in GUI mode for our application
-        try {
-            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
-        } catch (ClassNotFoundException ex) {
-            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
-        } catch (InstantiationException ex) {
-            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
-        } catch (IllegalAccessException ex) {
-            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
-        } catch (UnsupportedLookAndFeelException ex) {
-            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
-        }
-        
-        Main main = getApplication();
-        main.launchForeverLoop();
-        main.startup();
-    }
-    
-    /**
-     * Avoids the app terminating because no Window is opened anymore.
-     * More info: http://java.sun.com/javase/6/docs/api/java/awt/doc-files/AWTThreadIssues.html#Autoshutdown
-     */
-    public void launchForeverLoop() {
-       Runnable r = new Runnable() {
-            public void run() {
-                try {
-                    Object o = new Object();
-                    synchronized (o) {
-                        o.wait();
-                    }
-                } catch (InterruptedException ie) {
-                }
-            }
-        };
-        Thread t = new Thread(r);
-        t.setDaemon(false);
-        t.start();
-    }
-    
-    private Tray tray = null;
-    ///Indicates if this is the first time the application loads
-    ///(is only true at the very start of loading the first time!)
-    private static final String FIRSTLOAD = "firstLoad";
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main.properties b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main.properties
deleted file mode 100644
index fb7218ceaeb440ed2c318fd278e546db25b1f12e..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-# Application global resources
-
-Application.name = desktopgui
-Application.title = I2P Desktop GUI
-Application.version = 0.7.1
-Application.vendor = I2P Developers
-Application.homepage = http://www.i2p2.de
-Application.description = An anonymous communication network.
-Application.vendorId = I2P
-Application.id = desktopgui
-Application.lookAndFeel = system
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main_nl_BE.properties b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main_nl_BE.properties
deleted file mode 100644
index 81107aca914da828f44581523375ef8ff4500e89..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main_nl_BE.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-# Application global resources
-
-Application.name = desktopgui
-Application.title = I2P Desktop GUI
-Application.version = 0.7.1
-Application.vendor = I2P Ontwikkelaars
-Application.homepage = http://www.i2p2.de
-Application.description = Een anoniem communicatienetwerk.
-Application.vendorId = I2P
-Application.id = desktopgui
-Application.lookAndFeel = system
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form
deleted file mode 100644
index 0f07284d5a2f6d0733b4a3212295202ed18b1da4..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form
+++ /dev/null
@@ -1,396 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
-  <Properties>
-    <Property name="defaultCloseOperation" type="int" value="3"/>
-    <Property name="title" type="java.lang.String" resourceKey="Form.title"/>
-    <Property name="name" type="java.lang.String" value="Form" noResource="true"/>
-  </Properties>
-  <SyntheticProperties>
-    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
-  </SyntheticProperties>
-  <AuxValues>
-    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
-    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
-    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
-    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
-    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,2,48,0,0,2,48"/>
-  </AuxValues>
-
-  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
-    <Property name="useNullLayout" type="boolean" value="true"/>
-  </Layout>
-  <SubComponents>
-    <Component class="javax.swing.JLabel" name="tunnelNameLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="tunnelNameLabel.text"/>
-        <Property name="name" type="java.lang.String" value="tunnelNameLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="20" width="120" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="tunnelTypeLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="tunnelTypeLabel.text"/>
-        <Property name="name" type="java.lang.String" value="tunnelTypeLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="50" width="120" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="tunnelPortLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="tunnelPortLabel.text"/>
-        <Property name="name" type="java.lang.String" value="tunnelPortLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="80" width="110" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="tunnelDestinationLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="tunnelDestinationLabel.text"/>
-        <Property name="name" type="java.lang.String" value="tunnelDestinationLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="110" width="110" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="tunnelProfileLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="tunnelProfileLabel.text"/>
-        <Property name="name" type="java.lang.String" value="tunnelProfileLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="140" width="110" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JCheckBox" name="delayConnect">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="delayConnect.text"/>
-        <Property name="name" type="java.lang.String" value="delayConnect" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="170" width="160" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JCheckBox" name="sharedClient">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="sharedClient.text"/>
-        <Property name="name" type="java.lang.String" value="sharedClient" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="200" width="160" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JCheckBox" name="autoStart">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="autoStart.text"/>
-        <Property name="name" type="java.lang.String" value="autoStart" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="230" width="160" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JSeparator" name="jSeparator1">
-      <Properties>
-        <Property name="name" type="java.lang.String" value="jSeparator1" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="0" y="510" width="750" height="10"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="tunnelDepthLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="tunnelDepthLabel.text"/>
-        <Property name="name" type="java.lang.String" value="tunnelDepthLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="280" width="160" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="depthVarianceLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="depthVarianceLabel.text"/>
-        <Property name="name" type="java.lang.String" value="depthVarianceLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="310" width="160" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="tunnelCountLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="tunnelCountLabel.text"/>
-        <Property name="name" type="java.lang.String" value="tunnelCountLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="340" width="160" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="backupTunnelCountLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="backupTunnelCountLabel.text"/>
-        <Property name="name" type="java.lang.String" value="backupTunnelCountLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="370" width="170" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JSeparator" name="jSeparator2">
-      <Properties>
-        <Property name="name" type="java.lang.String" value="jSeparator2" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="0" y="260" width="750" height="10"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JCheckBox" name="reduceIdle">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="reduceIdle.text"/>
-        <Property name="name" type="java.lang.String" value="reduceIdle" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="420" width="300" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JCheckBox" name="closeIdle">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="closeIdle.text"/>
-        <Property name="name" type="java.lang.String" value="closeIdle" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="450" width="370" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JCheckBox" name="delayIdle">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="delayIdle.text"/>
-        <Property name="name" type="java.lang.String" value="delayIdle" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="480" width="400" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JSeparator" name="jSeparator3">
-      <Properties>
-        <Property name="name" type="java.lang.String" value="jSeparator3" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="0" y="400" width="760" height="10"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JButton" name="save">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="save.text"/>
-        <Property name="name" type="java.lang.String" value="save" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="saveActionPerformed"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="10" y="520" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JButton" name="cancel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="cancel.text"/>
-        <Property name="name" type="java.lang.String" value="cancel" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelActionPerformed"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="60" y="520" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JTextField" name="tunnelName">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="tunnelName.text"/>
-        <Property name="name" type="java.lang.String" value="tunnelName" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="200" y="20" width="340" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="tunnelType">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="tunnelType.text"/>
-        <Property name="name" type="java.lang.String" value="tunnelType" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="200" y="50" width="340" height="20"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JTextField" name="tunnelPort">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="tunnelPort.text"/>
-        <Property name="name" type="java.lang.String" value="tunnelPort" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="200" y="70" width="340" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JTextField" name="tunnelDestination">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="tunnelDestination.text"/>
-        <Property name="name" type="java.lang.String" value="tunnelDestination" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="200" y="100" width="340" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JComboBox" name="tunnelProfile">
-      <Properties>
-        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-          <StringArray count="2">
-            <StringItem index="0" value="Interactive connection (Instant messaging)"/>
-            <StringItem index="1" value="Bulk connection (Downloads, websites...)"/>
-          </StringArray>
-        </Property>
-        <Property name="name" type="java.lang.String" value="tunnelProfile" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="200" y="130" width="340" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JComboBox" name="tunnelDepth">
-      <Properties>
-        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-          <StringArray count="4">
-            <StringItem index="0" value="0 hop tunnel (no anonymity, low latency)"/>
-            <StringItem index="1" value="1 hop tunnel (low anonymity, low latency)"/>
-            <StringItem index="2" value="2 hop tunnel (medium anonymity, medium latency)"/>
-            <StringItem index="3" value="3 hop tunnel (high anonymity, high latency)"/>
-          </StringArray>
-        </Property>
-        <Property name="name" type="java.lang.String" value="tunnelDepth" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="200" y="280" width="350" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JComboBox" name="depthVariance">
-      <Properties>
-        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-          <StringArray count="5">
-            <StringItem index="0" value="0 hop variance (no random, good performance)"/>
-            <StringItem index="1" value="+ 0-1 hop variance (slightly random, lower performance)"/>
-            <StringItem index="2" value="+ 0-2 hop variance (very random, lower performance)"/>
-            <StringItem index="3" value="+/- 0-1 hop variance (slightly random, standard performance)"/>
-            <StringItem index="4" value="+/- 0-2 hop variance (not recommended)"/>
-          </StringArray>
-        </Property>
-        <Property name="name" type="java.lang.String" value="depthVariance" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="200" y="310" width="350" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JComboBox" name="tunnelCount">
-      <Properties>
-        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-          <StringArray count="3">
-            <StringItem index="0" value="1 tunnel (low bandwidth usage, low reliability)"/>
-            <StringItem index="1" value="2 tunnels (standard bandwidth usage, standard reliability)"/>
-            <StringItem index="2" value="3 tunnels (high bandwidth usage, high reliability)"/>
-          </StringArray>
-        </Property>
-        <Property name="name" type="java.lang.String" value="tunnelCount" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="200" y="340" width="350" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JComboBox" name="backupTunnelCount">
-      <Properties>
-        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-          <StringArray count="4">
-            <StringItem index="0" value="0 backup tunnels (no redundancy, no resource usage)"/>
-            <StringItem index="1" value="1 backup tunnel (low redundancy, low resource usage)"/>
-            <StringItem index="2" value="2 backup tunnels (medium redundancy, medium resource usage)"/>
-            <StringItem index="3" value="3 backup tunnels (high redundancy, high resource usage)"/>
-          </StringArray>
-        </Property>
-        <Property name="name" type="java.lang.String" value="backupTunnelCount" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="200" y="370" width="350" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JButton" name="changeTunnelState">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="changeTunnelState.text"/>
-        <Property name="name" type="java.lang.String" value="changeTunnelState" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="160" y="520" width="150" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-  </SubComponents>
-</Form>
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.java
deleted file mode 100644
index b7102b3ce18702fdef58c51662f2db1014a13d0c..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- * ClientTunnelWindow.java
- *
- * Created on 10-jun-2009, 16:49:12
- */
-
-package net.i2p.desktopgui.gui;
-
-import net.i2p.i2ptunnel.web.EditBean;
-import java.awt.event.ActionListener;
-
-/**
- *
- * @author mathias
- */
-public class ClientTunnelWindow extends javax.swing.JFrame {
-
-    /** Creates new form ClientTunnelWindow */
-    public ClientTunnelWindow(int tunnelNumber, ActionListener al) {
-        initComponents();
-        this.tunnelNumber = tunnelNumber;
-        this.al = al;
-        extraInitComponents();
-        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
-        this.setSize(600, 600);
-        this.setLocationRelativeTo(null);
-        this.requestFocus();
-        this.changeTunnelState.setVisible(false); //TODO: implement tunnel state change
-        this.setVisible(true);
-    }
-
-    public void extraInitComponents() {
-        EditBean bean = new EditBean();
-        if(!bean.isClient(tunnelNumber)) {
-            this.dispose();
-        }
-        else {
-            this.tunnelName.setText(bean.getTunnelName(tunnelNumber));
-            this.tunnelType.setText(bean.getTunnelType(tunnelNumber));
-            this.tunnelPort.setText(bean.getClientPort(tunnelNumber));
-            this.tunnelDestination.setText(bean.getClientDestination(tunnelNumber));
-
-            if(bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) {
-                tunnelProfile.setVisible(false);
-                tunnelProfileLabel.setVisible(false);
-                this.delayConnect.setVisible(false);
-                this.sharedClient.setVisible(false);
-                this.autoStart.setVisible(false);
-            }
-            else {
-                if(bean.isInteractive(tunnelNumber)) {
-                    tunnelProfile.setSelectedIndex(TUNNEL_INTERACTIVE);
-                }
-                else {
-                    tunnelProfile.setSelectedIndex(TUNNEL_BULK);
-                }
-
-                this.delayConnect.setSelected(bean.shouldDelay(tunnelNumber));
-                this.sharedClient.setSelected(bean.isSharedClient(tunnelNumber));
-                this.autoStart.setSelected(bean.startAutomatically(tunnelNumber));
-            }
-
-            this.tunnelDepth.setSelectedIndex(bean.getTunnelDepth(tunnelNumber, 2));
-
-            int variance = bean.getTunnelVariance(tunnelNumber, 0);
-            if(variance == 0) {
-                this.depthVariance.setSelectedIndex(0);
-            }
-            else if(variance == 1) {
-                this.depthVariance.setSelectedIndex(1);
-            }
-            else if(variance == 2) {
-                this.depthVariance.setSelectedIndex(2);
-            }
-            else if(variance == -1) {
-                this.depthVariance.setSelectedIndex(3);
-            }
-            else if(variance == -2) {
-                this.depthVariance.setSelectedIndex(4);
-            }
-
-            int tunnelQuantity = bean.getTunnelQuantity(tunnelNumber, 2) - 1;
-            if(tunnelQuantity >= 0 && tunnelQuantity <= 2) {
-                this.tunnelCount.setSelectedIndex(tunnelQuantity);
-            }
-
-            int backupTunnelQuantity = bean.getTunnelBackupQuantity(tunnelNumber, 0);
-            if(backupTunnelQuantity >= 0 && backupTunnelQuantity <= 3) {
-                this.backupTunnelCount.setSelectedIndex(backupTunnelQuantity);
-            }
-
-            
-            if(bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) {
-                this.reduceIdle.setVisible(false);
-                this.closeIdle.setVisible(false);
-                this.delayIdle.setVisible(false);
-            }
-            else {
-                this.reduceIdle.setSelected(bean.getReduce(tunnelNumber));
-                this.closeIdle.setSelected(bean.getClose(tunnelNumber));
-                this.delayIdle.setSelected(bean.getDelayOpen(tunnelNumber));
-            }
-        }
-    }
-
-    /** This method is called from within the constructor to
-     * initialize the form.
-     * WARNING: Do NOT modify this code. The content of this method is
-     * always regenerated by the Form Editor.
-     */
-    @SuppressWarnings("unchecked")
-    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
-    private void initComponents() {
-
-        tunnelNameLabel = new javax.swing.JLabel();
-        tunnelTypeLabel = new javax.swing.JLabel();
-        tunnelPortLabel = new javax.swing.JLabel();
-        tunnelDestinationLabel = new javax.swing.JLabel();
-        tunnelProfileLabel = new javax.swing.JLabel();
-        delayConnect = new javax.swing.JCheckBox();
-        sharedClient = new javax.swing.JCheckBox();
-        autoStart = new javax.swing.JCheckBox();
-        jSeparator1 = new javax.swing.JSeparator();
-        tunnelDepthLabel = new javax.swing.JLabel();
-        depthVarianceLabel = new javax.swing.JLabel();
-        tunnelCountLabel = new javax.swing.JLabel();
-        backupTunnelCountLabel = new javax.swing.JLabel();
-        jSeparator2 = new javax.swing.JSeparator();
-        reduceIdle = new javax.swing.JCheckBox();
-        closeIdle = new javax.swing.JCheckBox();
-        delayIdle = new javax.swing.JCheckBox();
-        jSeparator3 = new javax.swing.JSeparator();
-        save = new javax.swing.JButton();
-        cancel = new javax.swing.JButton();
-        tunnelName = new javax.swing.JTextField();
-        tunnelType = new javax.swing.JLabel();
-        tunnelPort = new javax.swing.JTextField();
-        tunnelDestination = new javax.swing.JTextField();
-        tunnelProfile = new javax.swing.JComboBox();
-        tunnelDepth = new javax.swing.JComboBox();
-        depthVariance = new javax.swing.JComboBox();
-        tunnelCount = new javax.swing.JComboBox();
-        backupTunnelCount = new javax.swing.JComboBox();
-        changeTunnelState = new javax.swing.JButton();
-
-        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
-        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(ClientTunnelWindow.class);
-        setTitle(resourceMap.getString("Form.title")); // NOI18N
-        setName("Form"); // NOI18N
-        getContentPane().setLayout(null);
-
-        tunnelNameLabel.setText(resourceMap.getString("tunnelNameLabel.text")); // NOI18N
-        tunnelNameLabel.setName("tunnelNameLabel"); // NOI18N
-        getContentPane().add(tunnelNameLabel);
-        tunnelNameLabel.setBounds(20, 20, 120, 17);
-
-        tunnelTypeLabel.setText(resourceMap.getString("tunnelTypeLabel.text")); // NOI18N
-        tunnelTypeLabel.setName("tunnelTypeLabel"); // NOI18N
-        getContentPane().add(tunnelTypeLabel);
-        tunnelTypeLabel.setBounds(20, 50, 120, 17);
-
-        tunnelPortLabel.setText(resourceMap.getString("tunnelPortLabel.text")); // NOI18N
-        tunnelPortLabel.setName("tunnelPortLabel"); // NOI18N
-        getContentPane().add(tunnelPortLabel);
-        tunnelPortLabel.setBounds(20, 80, 110, 17);
-
-        tunnelDestinationLabel.setText(resourceMap.getString("tunnelDestinationLabel.text")); // NOI18N
-        tunnelDestinationLabel.setName("tunnelDestinationLabel"); // NOI18N
-        getContentPane().add(tunnelDestinationLabel);
-        tunnelDestinationLabel.setBounds(20, 110, 110, 17);
-
-        tunnelProfileLabel.setText(resourceMap.getString("tunnelProfileLabel.text")); // NOI18N
-        tunnelProfileLabel.setName("tunnelProfileLabel"); // NOI18N
-        getContentPane().add(tunnelProfileLabel);
-        tunnelProfileLabel.setBounds(20, 140, 110, 17);
-
-        delayConnect.setText(resourceMap.getString("delayConnect.text")); // NOI18N
-        delayConnect.setName("delayConnect"); // NOI18N
-        getContentPane().add(delayConnect);
-        delayConnect.setBounds(20, 170, 160, 22);
-
-        sharedClient.setText(resourceMap.getString("sharedClient.text")); // NOI18N
-        sharedClient.setName("sharedClient"); // NOI18N
-        getContentPane().add(sharedClient);
-        sharedClient.setBounds(20, 200, 160, 22);
-
-        autoStart.setText(resourceMap.getString("autoStart.text")); // NOI18N
-        autoStart.setName("autoStart"); // NOI18N
-        getContentPane().add(autoStart);
-        autoStart.setBounds(20, 230, 160, 22);
-
-        jSeparator1.setName("jSeparator1"); // NOI18N
-        getContentPane().add(jSeparator1);
-        jSeparator1.setBounds(0, 510, 750, 10);
-
-        tunnelDepthLabel.setText(resourceMap.getString("tunnelDepthLabel.text")); // NOI18N
-        tunnelDepthLabel.setName("tunnelDepthLabel"); // NOI18N
-        getContentPane().add(tunnelDepthLabel);
-        tunnelDepthLabel.setBounds(20, 280, 160, 17);
-
-        depthVarianceLabel.setText(resourceMap.getString("depthVarianceLabel.text")); // NOI18N
-        depthVarianceLabel.setName("depthVarianceLabel"); // NOI18N
-        getContentPane().add(depthVarianceLabel);
-        depthVarianceLabel.setBounds(20, 310, 160, 17);
-
-        tunnelCountLabel.setText(resourceMap.getString("tunnelCountLabel.text")); // NOI18N
-        tunnelCountLabel.setName("tunnelCountLabel"); // NOI18N
-        getContentPane().add(tunnelCountLabel);
-        tunnelCountLabel.setBounds(20, 340, 160, 17);
-
-        backupTunnelCountLabel.setText(resourceMap.getString("backupTunnelCountLabel.text")); // NOI18N
-        backupTunnelCountLabel.setName("backupTunnelCountLabel"); // NOI18N
-        getContentPane().add(backupTunnelCountLabel);
-        backupTunnelCountLabel.setBounds(20, 370, 170, 17);
-
-        jSeparator2.setName("jSeparator2"); // NOI18N
-        getContentPane().add(jSeparator2);
-        jSeparator2.setBounds(0, 260, 750, 10);
-
-        reduceIdle.setText(resourceMap.getString("reduceIdle.text")); // NOI18N
-        reduceIdle.setName("reduceIdle"); // NOI18N
-        getContentPane().add(reduceIdle);
-        reduceIdle.setBounds(20, 420, 300, 22);
-
-        closeIdle.setText(resourceMap.getString("closeIdle.text")); // NOI18N
-        closeIdle.setName("closeIdle"); // NOI18N
-        getContentPane().add(closeIdle);
-        closeIdle.setBounds(20, 450, 370, 22);
-
-        delayIdle.setText(resourceMap.getString("delayIdle.text")); // NOI18N
-        delayIdle.setName("delayIdle"); // NOI18N
-        getContentPane().add(delayIdle);
-        delayIdle.setBounds(20, 480, 400, 22);
-
-        jSeparator3.setName("jSeparator3"); // NOI18N
-        getContentPane().add(jSeparator3);
-        jSeparator3.setBounds(0, 400, 760, 10);
-
-        save.setText(resourceMap.getString("save.text")); // NOI18N
-        save.setName("save"); // NOI18N
-        save.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                saveActionPerformed(evt);
-            }
-        });
-        getContentPane().add(save);
-        save.setBounds(10, 520, 44, 29);
-
-        cancel.setText(resourceMap.getString("cancel.text")); // NOI18N
-        cancel.setName("cancel"); // NOI18N
-        cancel.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                cancelActionPerformed(evt);
-            }
-        });
-        getContentPane().add(cancel);
-        cancel.setBounds(60, 520, 55, 29);
-
-        tunnelName.setText(resourceMap.getString("tunnelName.text")); // NOI18N
-        tunnelName.setName("tunnelName"); // NOI18N
-        getContentPane().add(tunnelName);
-        tunnelName.setBounds(200, 20, 340, 27);
-
-        tunnelType.setText(resourceMap.getString("tunnelType.text")); // NOI18N
-        tunnelType.setName("tunnelType"); // NOI18N
-        getContentPane().add(tunnelType);
-        tunnelType.setBounds(200, 50, 340, 20);
-
-        tunnelPort.setText(resourceMap.getString("tunnelPort.text")); // NOI18N
-        tunnelPort.setName("tunnelPort"); // NOI18N
-        getContentPane().add(tunnelPort);
-        tunnelPort.setBounds(200, 70, 340, 27);
-
-        tunnelDestination.setText(resourceMap.getString("tunnelDestination.text")); // NOI18N
-        tunnelDestination.setName("tunnelDestination"); // NOI18N
-        getContentPane().add(tunnelDestination);
-        tunnelDestination.setBounds(200, 100, 340, 27);
-
-        tunnelProfile.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Interactive connection (Instant messaging)", "Bulk connection (Downloads, websites...)" }));
-        tunnelProfile.setName("tunnelProfile"); // NOI18N
-        getContentPane().add(tunnelProfile);
-        tunnelProfile.setBounds(200, 130, 340, 27);
-
-        tunnelDepth.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 hop tunnel (no anonymity, low latency)", "1 hop tunnel (low anonymity, low latency)", "2 hop tunnel (medium anonymity, medium latency)", "3 hop tunnel (high anonymity, high latency)" }));
-        tunnelDepth.setName("tunnelDepth"); // NOI18N
-        getContentPane().add(tunnelDepth);
-        tunnelDepth.setBounds(200, 280, 350, 27);
-
-        depthVariance.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 hop variance (no random, good performance)", "+ 0-1 hop variance (slightly random, lower performance)", "+ 0-2 hop variance (very random, lower performance)", "+/- 0-1 hop variance (slightly random, standard performance)", "+/- 0-2 hop variance (not recommended)" }));
-        depthVariance.setName("depthVariance"); // NOI18N
-        getContentPane().add(depthVariance);
-        depthVariance.setBounds(200, 310, 350, 27);
-
-        tunnelCount.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1 tunnel (low bandwidth usage, low reliability)", "2 tunnels (standard bandwidth usage, standard reliability)", "3 tunnels (high bandwidth usage, high reliability)" }));
-        tunnelCount.setName("tunnelCount"); // NOI18N
-        getContentPane().add(tunnelCount);
-        tunnelCount.setBounds(200, 340, 350, 27);
-
-        backupTunnelCount.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 backup tunnels (no redundancy, no resource usage)", "1 backup tunnel (low redundancy, low resource usage)", "2 backup tunnels (medium redundancy, medium resource usage)", "3 backup tunnels (high redundancy, high resource usage)" }));
-        backupTunnelCount.setName("backupTunnelCount"); // NOI18N
-        getContentPane().add(backupTunnelCount);
-        backupTunnelCount.setBounds(200, 370, 350, 27);
-
-        changeTunnelState.setText(resourceMap.getString("changeTunnelState.text")); // NOI18N
-        changeTunnelState.setName("changeTunnelState"); // NOI18N
-        getContentPane().add(changeTunnelState);
-        changeTunnelState.setBounds(160, 520, 150, 29);
-
-        pack();
-    }// </editor-fold>//GEN-END:initComponents
-
-    private void saveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveActionPerformed
-        EditBean bean = new EditBean();
-        if(!bean.isClient(tunnelNumber)) {
-            al.actionPerformed(evt);
-            this.dispose();
-        }
-        else {
-            bean.setTunnel("" + tunnelNumber);
-            bean.setName(tunnelName.getText());
-            bean.setPort(tunnelPort.getText());
-            bean.setTargetDestination(tunnelDestination.getText());
-            if(!bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) {
-                if(tunnelProfile.getSelectedIndex() == TUNNEL_INTERACTIVE) {
-                    bean.setProfile("interactive");
-                }
-                else {
-                    bean.setProfile("bulk");
-                }
-
-                if(delayConnect.isSelected()) {
-                    bean.setConnectDelay("true");
-                }
-                else {
-                    bean.setConnectDelay("false");
-                }
-
-                if(sharedClient.isSelected()) {
-                    bean.setShared(true);
-                }
-                else {
-                    bean.setShared(false);
-                }
-
-                if(autoStart.isSelected()) {
-                    bean.setStartOnLoad("true");
-                }
-                else {
-                }
-            }
-            bean.setTunnelDepth("" + tunnelDepth.getSelectedIndex());
-
-            int variance = depthVariance.getSelectedIndex();
-            if(variance >= 0 && variance <= 2) {
-                bean.setTunnelVariance("" + variance);
-            }
-            else if(variance == 3) {
-                bean.setTunnelVariance("-1");
-            }
-            else if(variance == 4) {
-                bean.setTunnelVariance("-2");
-            }
-
-            bean.setTunnelQuantity("" + tunnelCount.getSelectedIndex() + 1);
-
-            bean.setTunnelBackupQuantity("" + backupTunnelCount.getSelectedIndex());
-
-            if(!bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) {
-                if(reduceIdle.isSelected()) {
-                    bean.setReduce("true");
-                }
-                else {
-                }
-
-                if(closeIdle.isSelected()) {
-                    bean.setClose("true");
-                }
-                else {
-                }
-
-                if(delayIdle.isSelected()) {
-                    bean.setDelayOpen("true");
-                }
-            }
-            
-        }
-        
-        al.actionPerformed(evt);
-        this.dispose();
-}//GEN-LAST:event_saveActionPerformed
-
-    private void cancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelActionPerformed
-        al.actionPerformed(evt);
-        this.dispose();
-    }//GEN-LAST:event_cancelActionPerformed
-
-    // Variables declaration - do not modify//GEN-BEGIN:variables
-    private javax.swing.JCheckBox autoStart;
-    private javax.swing.JComboBox backupTunnelCount;
-    private javax.swing.JLabel backupTunnelCountLabel;
-    private javax.swing.JButton cancel;
-    private javax.swing.JButton changeTunnelState;
-    private javax.swing.JCheckBox closeIdle;
-    private javax.swing.JCheckBox delayConnect;
-    private javax.swing.JCheckBox delayIdle;
-    private javax.swing.JComboBox depthVariance;
-    private javax.swing.JLabel depthVarianceLabel;
-    private javax.swing.JSeparator jSeparator1;
-    private javax.swing.JSeparator jSeparator2;
-    private javax.swing.JSeparator jSeparator3;
-    private javax.swing.JCheckBox reduceIdle;
-    private javax.swing.JButton save;
-    private javax.swing.JCheckBox sharedClient;
-    private javax.swing.JComboBox tunnelCount;
-    private javax.swing.JLabel tunnelCountLabel;
-    private javax.swing.JComboBox tunnelDepth;
-    private javax.swing.JLabel tunnelDepthLabel;
-    private javax.swing.JTextField tunnelDestination;
-    private javax.swing.JLabel tunnelDestinationLabel;
-    private javax.swing.JTextField tunnelName;
-    private javax.swing.JLabel tunnelNameLabel;
-    private javax.swing.JTextField tunnelPort;
-    private javax.swing.JLabel tunnelPortLabel;
-    private javax.swing.JComboBox tunnelProfile;
-    private javax.swing.JLabel tunnelProfileLabel;
-    private javax.swing.JLabel tunnelType;
-    private javax.swing.JLabel tunnelTypeLabel;
-    // End of variables declaration//GEN-END:variables
-    private int tunnelNumber;
-    private ActionListener al;
-    private static final int TUNNEL_INTERACTIVE = 0;
-    private static final int TUNNEL_BULK = 1;
-    private static final String TYPE_STREAMR_CLIENT = "Streamr client";
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java
new file mode 100644
index 0000000000000000000000000000000000000000..ae45bf24712da3d906c94a7287b89902d15f3d78
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java
@@ -0,0 +1,132 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * ConfigurationFrame.java
+ *
+ * Created on Feb 16, 2011, 8:03:14 AM
+ */
+
+package net.i2p.desktopgui.gui;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.i2p.desktopgui.i18n.DesktopguiTranslator;
+import net.i2p.desktopgui.router.RouterManager;
+
+/**
+ *
+ * @author mathias
+ */
+public class DesktopguiConfigurationFrame extends javax.swing.JFrame {
+
+    /** Creates new form ConfigurationFrame */
+    public DesktopguiConfigurationFrame() {
+        initComponents();
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        desktopguiEnabled = new javax.swing.JCheckBox();
+        okButton = new javax.swing.JButton();
+        cancelButton = new javax.swing.JButton();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        setTitle(_("Tray icon configuration"));
+
+        desktopguiEnabled.setSelected(true);
+        desktopguiEnabled.setText(_("Should tray icon be enabled?"));
+        desktopguiEnabled.setActionCommand("shouldDesktopguiBeEnabled");
+
+        okButton.setText("OK");
+        okButton.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mouseReleased(java.awt.event.MouseEvent evt) {
+                okButtonMouseReleased(evt);
+            }
+        });
+
+        cancelButton.setText("Cancel");
+        cancelButton.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mouseReleased(java.awt.event.MouseEvent evt) {
+                cancelButtonMouseReleased(evt);
+            }
+        });
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+        getContentPane().setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(desktopguiEnabled)
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(okButton)
+                        .addGap(18, 18, 18)
+                        .addComponent(cancelButton)))
+                .addContainerGap(237, Short.MAX_VALUE))
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(desktopguiEnabled)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(okButton)
+                    .addComponent(cancelButton))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+    private void cancelButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cancelButtonMouseReleased
+        System.out.println("Cancelling configuration change.");
+        this.dispose();
+    }//GEN-LAST:event_cancelButtonMouseReleased
+
+    private void okButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_okButtonMouseReleased
+        configureDesktopgui();
+    }//GEN-LAST:event_okButtonMouseReleased
+
+    protected static String _(String s) {
+        return DesktopguiTranslator._(s);
+    }
+
+    private void configureDesktopgui() {
+        String property = "desktopgui.enabled";
+        String value;
+        if(!desktopguiEnabled.isSelected()) {
+            value = "false";
+            System.out.println("Disabling desktopgui");
+        }
+        else {
+            value = "true";
+            System.out.println("Enabling desktopgui");
+        }
+        try {
+            RouterManager.getRouterContext().setProperty(property, value);
+        } catch (Exception ex) {
+            Logger.getLogger(DesktopguiConfigurationFrame.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        System.out.println("Applying desktopgui configuration!");
+        this.dispose();
+    }
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton cancelButton;
+    private javax.swing.JCheckBox desktopguiEnabled;
+    private javax.swing.JButton okButton;
+    // End of variables declaration//GEN-END:variables
+
+}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form
deleted file mode 100644
index 589f5cee2ef35593e0fb482cfe581b4374d13f99..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form
+++ /dev/null
@@ -1,645 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
-  <NonVisualComponents>
-    <Component class="javax.swing.ButtonGroup" name="updateButtonGroup">
-    </Component>
-  </NonVisualComponents>
-  <Properties>
-    <Property name="defaultCloseOperation" type="int" value="3"/>
-    <Property name="title" type="java.lang.String" resourceKey="Form.title"/>
-    <Property name="name" type="java.lang.String" value="Form" noResource="true"/>
-  </Properties>
-  <SyntheticProperties>
-    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
-  </SyntheticProperties>
-  <AuxValues>
-    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
-    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
-    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
-    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
-  </AuxValues>
-
-  <Layout>
-    <DimensionLayout dim="0">
-      <Group type="103" groupAlignment="0" attributes="0">
-          <Component id="applyPanel" alignment="0" max="32767" attributes="0"/>
-          <Group type="102" attributes="0">
-              <EmptySpace min="12" pref="12" max="12" attributes="0"/>
-              <Component id="settingsPanel" pref="566" max="32767" attributes="0"/>
-          </Group>
-      </Group>
-    </DimensionLayout>
-    <DimensionLayout dim="1">
-      <Group type="103" groupAlignment="0" attributes="0">
-          <Group type="102" alignment="1" attributes="0">
-              <Component id="settingsPanel" max="32767" attributes="0"/>
-              <EmptySpace max="-2" attributes="0"/>
-              <Component id="applyPanel" min="-2" max="-2" attributes="0"/>
-          </Group>
-      </Group>
-    </DimensionLayout>
-  </Layout>
-  <SubComponents>
-    <Container class="javax.swing.JPanel" name="applyPanel">
-      <Properties>
-        <Property name="name" type="java.lang.String" value="applyPanel" noResource="true"/>
-      </Properties>
-
-      <Layout>
-        <DimensionLayout dim="0">
-          <Group type="103" groupAlignment="0" attributes="0">
-              <Group type="102" alignment="1" attributes="0">
-                  <EmptySpace pref="475" max="32767" attributes="0"/>
-                  <Component id="ok" min="-2" max="-2" attributes="0"/>
-                  <EmptySpace max="-2" attributes="0"/>
-                  <Component id="cancel" min="-2" max="-2" attributes="0"/>
-                  <EmptySpace max="-2" attributes="0"/>
-              </Group>
-          </Group>
-        </DimensionLayout>
-        <DimensionLayout dim="1">
-          <Group type="103" groupAlignment="0" attributes="0">
-              <Group type="102" alignment="0" attributes="0">
-                  <Group type="103" groupAlignment="3" attributes="0">
-                      <Component id="cancel" alignment="3" min="-2" max="-2" attributes="0"/>
-                      <Component id="ok" alignment="3" min="-2" max="-2" attributes="0"/>
-                  </Group>
-                  <EmptySpace pref="14" max="32767" attributes="0"/>
-              </Group>
-          </Group>
-        </DimensionLayout>
-      </Layout>
-      <SubComponents>
-        <Component class="javax.swing.JToggleButton" name="cancel">
-          <Properties>
-            <Property name="text" type="java.lang.String" resourceKey="cancel.text"/>
-            <Property name="name" type="java.lang.String" value="cancel" noResource="true"/>
-          </Properties>
-          <Events>
-            <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="cancelMouseClicked"/>
-          </Events>
-        </Component>
-        <Component class="javax.swing.JToggleButton" name="ok">
-          <Properties>
-            <Property name="text" type="java.lang.String" resourceKey="ok.text"/>
-            <Property name="name" type="java.lang.String" value="ok" noResource="true"/>
-          </Properties>
-          <Events>
-            <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="okMouseClicked"/>
-          </Events>
-        </Component>
-      </SubComponents>
-    </Container>
-    <Container class="javax.swing.JTabbedPane" name="settingsPanel">
-      <Properties>
-        <Property name="name" type="java.lang.String" value="settingsPanel" noResource="true"/>
-      </Properties>
-
-      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
-      <SubComponents>
-        <Container class="javax.swing.JPanel" name="speedPanel">
-          <Properties>
-            <Property name="name" type="java.lang.String" value="speedPanel" noResource="true"/>
-          </Properties>
-          <Constraints>
-            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
-              <JTabbedPaneConstraints tabName="Speed">
-                <Property name="tabTitle" type="java.lang.String" resourceKey="speedPanel.TabConstraints.tabTitle"/>
-              </JTabbedPaneConstraints>
-            </Constraint>
-          </Constraints>
-
-          <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
-            <Property name="useNullLayout" type="boolean" value="true"/>
-          </Layout>
-          <SubComponents>
-            <Component class="javax.swing.JLabel" name="uploadSpeedLabel">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="uploadSpeedLabel.text"/>
-                <Property name="name" type="java.lang.String" value="uploadSpeedLabel" noResource="true"/>
-              </Properties>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-                  <AbsoluteConstraints x="20" y="20" width="140" height="30"/>
-                </Constraint>
-              </Constraints>
-            </Component>
-            <Component class="javax.swing.JLabel" name="downloadSpeedLabel">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="downloadSpeedLabel.text"/>
-                <Property name="name" type="java.lang.String" value="downloadSpeedLabel" noResource="true"/>
-              </Properties>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-                  <AbsoluteConstraints x="20" y="60" width="140" height="30"/>
-                </Constraint>
-              </Constraints>
-            </Component>
-            <Component class="javax.swing.JTextField" name="uploadspeed">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="uploadspeed.text"/>
-                <Property name="name" type="java.lang.String" value="uploadspeed" noResource="true"/>
-              </Properties>
-              <Events>
-                <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyReleased"/>
-              </Events>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-                  <AbsoluteConstraints x="160" y="20" width="-1" height="-1"/>
-                </Constraint>
-              </Constraints>
-            </Component>
-            <Component class="javax.swing.JTextField" name="downloadspeed">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="downloadspeed.text"/>
-                <Property name="name" type="java.lang.String" value="downloadspeed" noResource="true"/>
-              </Properties>
-              <Events>
-                <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyReleased"/>
-              </Events>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-                  <AbsoluteConstraints x="160" y="60" width="-1" height="-1"/>
-                </Constraint>
-              </Constraints>
-            </Component>
-            <Component class="javax.swing.JComboBox" name="uploadkbps">
-              <Properties>
-                <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-                  <StringArray count="2">
-                    <StringItem index="0" value="kbps"/>
-                    <StringItem index="1" value="kBps"/>
-                  </StringArray>
-                </Property>
-                <Property name="name" type="java.lang.String" value="uploadkbps" noResource="true"/>
-              </Properties>
-              <Events>
-                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="uploadkbpsActionPerformed"/>
-              </Events>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-                  <AbsoluteConstraints x="240" y="20" width="-1" height="-1"/>
-                </Constraint>
-              </Constraints>
-            </Component>
-            <Component class="javax.swing.JComboBox" name="downloadkbps">
-              <Properties>
-                <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-                  <StringArray count="2">
-                    <StringItem index="0" value="kbps"/>
-                    <StringItem index="1" value="kBps"/>
-                  </StringArray>
-                </Property>
-                <Property name="name" type="java.lang.String" value="downloadkbps" noResource="true"/>
-              </Properties>
-              <Events>
-                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="downloadkbpsActionPerformed"/>
-              </Events>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-                  <AbsoluteConstraints x="240" y="60" width="-1" height="-1"/>
-                </Constraint>
-              </Constraints>
-            </Component>
-            <Component class="javax.swing.JLabel" name="uploadUsageLabel">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="uploadUsageLabel.text"/>
-                <Property name="name" type="java.lang.String" value="uploadUsageLabel" noResource="true"/>
-              </Properties>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-                  <AbsoluteConstraints x="330" y="20" width="-1" height="30"/>
-                </Constraint>
-              </Constraints>
-            </Component>
-            <Component class="javax.swing.JLabel" name="downloadUsageLabel">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/>
-                <Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/>
-              </Properties>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-                  <AbsoluteConstraints x="330" y="60" width="-1" height="30"/>
-                </Constraint>
-              </Constraints>
-            </Component>
-            <Component class="javax.swing.JTextField" name="uploadgb">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="uploadgb.text"/>
-                <Property name="name" type="java.lang.String" value="uploadgb" noResource="true"/>
-              </Properties>
-              <Events>
-                <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/>
-              </Events>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-                  <AbsoluteConstraints x="440" y="20" width="60" height="-1"/>
-                </Constraint>
-              </Constraints>
-            </Component>
-            <Component class="javax.swing.JTextField" name="downloadgb">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="downloadgb.text"/>
-                <Property name="name" type="java.lang.String" value="downloadgb" noResource="true"/>
-              </Properties>
-              <Events>
-                <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/>
-              </Events>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-                  <AbsoluteConstraints x="440" y="60" width="60" height="-1"/>
-                </Constraint>
-              </Constraints>
-            </Component>
-            <Component class="javax.swing.JLabel" name="gbUploadLabel">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="gbUploadLabel.text"/>
-                <Property name="name" type="java.lang.String" value="gbUploadLabel" noResource="true"/>
-              </Properties>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-                  <AbsoluteConstraints x="510" y="20" width="-1" height="30"/>
-                </Constraint>
-              </Constraints>
-            </Component>
-            <Component class="javax.swing.JLabel" name="gbDownloadLabel">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="gbDownloadLabel.text"/>
-                <Property name="name" type="java.lang.String" value="gbDownloadLabel" noResource="true"/>
-              </Properties>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-                  <AbsoluteConstraints x="510" y="60" width="-1" height="30"/>
-                </Constraint>
-              </Constraints>
-            </Component>
-            <Component class="javax.swing.JLabel" name="uploadDownloadExplanation">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="uploadDownloadExplanation.text"/>
-                <Property name="name" type="java.lang.String" value="uploadDownloadExplanation" noResource="true"/>
-              </Properties>
-              <Constraints>
-                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-                  <AbsoluteConstraints x="20" y="100" width="520" height="70"/>
-                </Constraint>
-              </Constraints>
-            </Component>
-          </SubComponents>
-        </Container>
-        <Container class="javax.swing.JPanel" name="updatesPanel">
-          <Properties>
-            <Property name="name" type="java.lang.String" value="updatesPanel" noResource="true"/>
-          </Properties>
-          <Constraints>
-            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
-              <JTabbedPaneConstraints tabName="Updates">
-                <Property name="tabTitle" type="java.lang.String" resourceKey="updatesPanel.TabConstraints.tabTitle"/>
-              </JTabbedPaneConstraints>
-            </Constraint>
-          </Constraints>
-
-          <Layout>
-            <DimensionLayout dim="0">
-              <Group type="103" groupAlignment="0" attributes="0">
-                  <Group type="102" attributes="0">
-                      <Group type="103" groupAlignment="0" attributes="0">
-                          <Group type="102" alignment="0" attributes="0">
-                              <EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
-                              <Group type="103" groupAlignment="0" attributes="0">
-                                  <Component id="updateMethod" alignment="0" min="-2" max="-2" attributes="0"/>
-                                  <Group type="102" alignment="0" attributes="0">
-                                      <Component id="checkUpdates" min="-2" max="-2" attributes="0"/>
-                                      <EmptySpace type="separate" max="-2" attributes="0"/>
-                                      <Component id="updateNow" min="-2" max="-2" attributes="0"/>
-                                  </Group>
-                              </Group>
-                          </Group>
-                          <Group type="102" alignment="0" attributes="0">
-                              <EmptySpace min="40" pref="40" max="40" attributes="0"/>
-                              <Group type="103" groupAlignment="0" max="-2" attributes="0">
-                                  <Component id="updateInform" alignment="0" pref="377" max="32767" attributes="1"/>
-                                  <Component id="updateDownload" alignment="0" max="32767" attributes="1"/>
-                                  <Component id="updateDownloadRestart" alignment="0" max="32767" attributes="1"/>
-                              </Group>
-                          </Group>
-                      </Group>
-                      <EmptySpace min="-2" max="-2" attributes="0"/>
-                  </Group>
-                  <Group type="102" alignment="1" attributes="0">
-                      <EmptySpace pref="339" max="32767" attributes="0"/>
-                      <Component id="advancedUpdateConfig" min="-2" max="-2" attributes="0"/>
-                      <EmptySpace max="-2" attributes="0"/>
-                  </Group>
-              </Group>
-            </DimensionLayout>
-            <DimensionLayout dim="1">
-              <Group type="103" groupAlignment="0" attributes="0">
-                  <Group type="102" attributes="0">
-                      <EmptySpace max="-2" attributes="0"/>
-                      <Component id="updateMethod" min="-2" max="-2" attributes="0"/>
-                      <EmptySpace type="unrelated" max="-2" attributes="0"/>
-                      <Component id="updateInform" min="-2" max="-2" attributes="0"/>
-                      <EmptySpace max="-2" attributes="0"/>
-                      <Component id="updateDownload" min="-2" max="-2" attributes="0"/>
-                      <EmptySpace max="-2" attributes="0"/>
-                      <Component id="updateDownloadRestart" min="-2" max="-2" attributes="0"/>
-                      <EmptySpace type="separate" max="-2" attributes="0"/>
-                      <Group type="103" groupAlignment="3" attributes="0">
-                          <Component id="checkUpdates" alignment="3" min="-2" max="-2" attributes="0"/>
-                          <Component id="updateNow" alignment="3" min="-2" max="-2" attributes="0"/>
-                      </Group>
-                      <EmptySpace pref="181" max="32767" attributes="0"/>
-                      <Component id="advancedUpdateConfig" min="-2" max="-2" attributes="0"/>
-                      <EmptySpace max="-2" attributes="0"/>
-                  </Group>
-              </Group>
-            </DimensionLayout>
-          </Layout>
-          <SubComponents>
-            <Component class="javax.swing.JLabel" name="updateMethod">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="updateMethod.text"/>
-                <Property name="name" type="java.lang.String" value="updateMethod" noResource="true"/>
-              </Properties>
-            </Component>
-            <Component class="javax.swing.JRadioButton" name="updateInform">
-              <Properties>
-                <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
-                  <ComponentRef name="updateButtonGroup"/>
-                </Property>
-                <Property name="text" type="java.lang.String" resourceKey="updateInform.text"/>
-                <Property name="name" type="java.lang.String" value="updateInform" noResource="true"/>
-              </Properties>
-            </Component>
-            <Component class="javax.swing.JRadioButton" name="updateDownload">
-              <Properties>
-                <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
-                  <ComponentRef name="updateButtonGroup"/>
-                </Property>
-                <Property name="text" type="java.lang.String" resourceKey="updateDownload.text"/>
-                <Property name="name" type="java.lang.String" value="updateDownload" noResource="true"/>
-              </Properties>
-            </Component>
-            <Component class="javax.swing.JRadioButton" name="updateDownloadRestart">
-              <Properties>
-                <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
-                  <ComponentRef name="updateButtonGroup"/>
-                </Property>
-                <Property name="text" type="java.lang.String" resourceKey="updateDownloadRestart.text"/>
-                <Property name="name" type="java.lang.String" value="updateDownloadRestart" noResource="true"/>
-              </Properties>
-            </Component>
-            <Component class="javax.swing.JToggleButton" name="checkUpdates">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="checkUpdates.text"/>
-                <Property name="name" type="java.lang.String" value="checkUpdates" noResource="true"/>
-              </Properties>
-              <Events>
-                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="checkUpdatesActionPerformed"/>
-              </Events>
-            </Component>
-            <Component class="javax.swing.JToggleButton" name="updateNow">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="updateNow.text"/>
-                <Property name="name" type="java.lang.String" value="updateNow" noResource="true"/>
-              </Properties>
-              <Events>
-                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="updateNowActionPerformed"/>
-              </Events>
-            </Component>
-            <Component class="javax.swing.JToggleButton" name="advancedUpdateConfig">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="advancedUpdateConfig.text"/>
-                <Property name="name" type="java.lang.String" value="advancedUpdateConfig" noResource="true"/>
-              </Properties>
-              <Events>
-                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="advancedUpdateConfigActionPerformed"/>
-              </Events>
-            </Component>
-          </SubComponents>
-        </Container>
-        <Container class="javax.swing.JPanel" name="tunnelPanel">
-          <Properties>
-            <Property name="name" type="java.lang.String" value="tunnelPanel" noResource="true"/>
-          </Properties>
-          <Constraints>
-            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
-              <JTabbedPaneConstraints tabName="Tunnels/Services">
-                <Property name="tabTitle" type="java.lang.String" resourceKey="tunnelPanel.TabConstraints.tabTitle"/>
-              </JTabbedPaneConstraints>
-            </Constraint>
-          </Constraints>
-
-          <Layout>
-            <DimensionLayout dim="0">
-              <Group type="103" groupAlignment="0" attributes="0">
-                  <Group type="102" alignment="1" attributes="0">
-                      <EmptySpace max="-2" attributes="0"/>
-                      <Group type="103" groupAlignment="1" attributes="0">
-                          <Component id="tunnelsExplanation" alignment="0" pref="538" max="32767" attributes="0"/>
-                          <Component id="serverFrame" alignment="1" pref="538" max="32767" attributes="0"/>
-                          <Component id="clientTunnelLabel" alignment="0" min="-2" max="-2" attributes="0"/>
-                          <Component id="clientFrame" alignment="0" pref="538" max="32767" attributes="0"/>
-                          <Component id="serverTunnelLabel" alignment="0" min="-2" max="-2" attributes="0"/>
-                      </Group>
-                      <EmptySpace max="-2" attributes="0"/>
-                  </Group>
-              </Group>
-            </DimensionLayout>
-            <DimensionLayout dim="1">
-              <Group type="103" groupAlignment="0" attributes="0">
-                  <Group type="102" alignment="0" attributes="0">
-                      <EmptySpace min="-2" max="-2" attributes="0"/>
-                      <Component id="clientTunnelLabel" min="-2" max="-2" attributes="0"/>
-                      <EmptySpace min="-2" max="-2" attributes="0"/>
-                      <Component id="clientFrame" pref="119" max="32767" attributes="0"/>
-                      <EmptySpace min="-2" max="-2" attributes="0"/>
-                      <Component id="serverTunnelLabel" min="-2" max="-2" attributes="0"/>
-                      <EmptySpace min="-2" max="-2" attributes="0"/>
-                      <Component id="serverFrame" pref="122" max="32767" attributes="0"/>
-                      <EmptySpace max="-2" attributes="0"/>
-                      <Component id="tunnelsExplanation" min="-2" pref="45" max="-2" attributes="0"/>
-                      <EmptySpace min="-2" pref="32" max="-2" attributes="0"/>
-                  </Group>
-              </Group>
-            </DimensionLayout>
-          </Layout>
-          <SubComponents>
-            <Container class="javax.swing.JScrollPane" name="clientFrame">
-              <Properties>
-                <Property name="name" type="java.lang.String" value="clientFrame" noResource="true"/>
-              </Properties>
-
-              <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
-              <SubComponents>
-                <Component class="javax.swing.JTable" name="clientTable">
-                  <Properties>
-                    <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
-                      <Table columnCount="4" rowCount="0">
-                        <Column editable="true" title="Name" type="java.lang.Object"/>
-                        <Column editable="true" title="Type" type="java.lang.Object"/>
-                        <Column editable="true" title="Address" type="java.lang.Object"/>
-                        <Column editable="true" title="Status" type="java.lang.Object"/>
-                      </Table>
-                    </Property>
-                    <Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor">
-                      <TableColumnModel selectionModel="0">
-                        <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
-                          <Title resourceKey="clientTable.columnModel.title0"/>
-                          <Editor/>
-                          <Renderer/>
-                        </Column>
-                        <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
-                          <Title resourceKey="clientTable.columnModel.title1"/>
-                          <Editor/>
-                          <Renderer/>
-                        </Column>
-                        <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
-                          <Title resourceKey="clientTable.columnModel.title2"/>
-                          <Editor/>
-                          <Renderer/>
-                        </Column>
-                        <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
-                          <Title resourceKey="clientTable.columnModel.title3"/>
-                          <Editor/>
-                          <Renderer/>
-                        </Column>
-                      </TableColumnModel>
-                    </Property>
-                    <Property name="name" type="java.lang.String" value="clientTable" noResource="true"/>
-                    <Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor">
-                      <TableHeader reorderingAllowed="true" resizingAllowed="true"/>
-                    </Property>
-                  </Properties>
-                  <Events>
-                    <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="clientTableMouseClicked"/>
-                  </Events>
-                </Component>
-              </SubComponents>
-            </Container>
-            <Container class="javax.swing.JScrollPane" name="serverFrame">
-              <Properties>
-                <Property name="name" type="java.lang.String" value="serverFrame" noResource="true"/>
-              </Properties>
-
-              <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
-              <SubComponents>
-                <Component class="javax.swing.JTable" name="serverTable">
-                  <Properties>
-                    <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
-                      <Table columnCount="3" rowCount="4">
-                        <Column editable="true" title="Name" type="java.lang.Object"/>
-                        <Column editable="true" title="Address" type="java.lang.Object"/>
-                        <Column editable="true" title="Status" type="java.lang.Object"/>
-                      </Table>
-                    </Property>
-                    <Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor">
-                      <TableColumnModel selectionModel="0">
-                        <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
-                          <Title resourceKey="serverTable.columnModel.title0"/>
-                          <Editor/>
-                          <Renderer/>
-                        </Column>
-                        <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
-                          <Title resourceKey="serverTable.columnModel.title1"/>
-                          <Editor/>
-                          <Renderer/>
-                        </Column>
-                        <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
-                          <Title resourceKey="serverTable.columnModel.title2"/>
-                          <Editor/>
-                          <Renderer/>
-                        </Column>
-                      </TableColumnModel>
-                    </Property>
-                    <Property name="name" type="java.lang.String" value="serverTable" noResource="true"/>
-                    <Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor">
-                      <TableHeader reorderingAllowed="true" resizingAllowed="true"/>
-                    </Property>
-                  </Properties>
-                  <Events>
-                    <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="serverTableMouseClicked"/>
-                  </Events>
-                </Component>
-              </SubComponents>
-            </Container>
-            <Component class="javax.swing.JLabel" name="tunnelsExplanation">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="tunnelsExplanation.text"/>
-                <Property name="name" type="java.lang.String" value="tunnelsExplanation" noResource="true"/>
-              </Properties>
-            </Component>
-            <Component class="javax.swing.JLabel" name="clientTunnelLabel">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="clientTunnelLabel.text"/>
-                <Property name="name" type="java.lang.String" value="clientTunnelLabel" noResource="true"/>
-              </Properties>
-            </Component>
-            <Component class="javax.swing.JLabel" name="serverTunnelLabel">
-              <Properties>
-                <Property name="text" type="java.lang.String" resourceKey="serverTunnelLabel.text"/>
-                <Property name="name" type="java.lang.String" value="serverTunnelLabel" noResource="true"/>
-              </Properties>
-            </Component>
-          </SubComponents>
-        </Container>
-        <Container class="javax.swing.JPanel" name="networkPanel">
-          <Properties>
-            <Property name="name" type="java.lang.String" value="networkPanel" noResource="true"/>
-          </Properties>
-          <Constraints>
-            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
-              <JTabbedPaneConstraints tabName="Network">
-                <Property name="tabTitle" type="java.lang.String" resourceKey="networkPanel.TabConstraints.tabTitle"/>
-              </JTabbedPaneConstraints>
-            </Constraint>
-          </Constraints>
-
-          <Layout>
-            <DimensionLayout dim="0">
-              <Group type="103" groupAlignment="0" attributes="0">
-                  <EmptySpace min="0" pref="562" max="32767" attributes="0"/>
-              </Group>
-            </DimensionLayout>
-            <DimensionLayout dim="1">
-              <Group type="103" groupAlignment="0" attributes="0">
-                  <EmptySpace min="0" pref="388" max="32767" attributes="0"/>
-              </Group>
-            </DimensionLayout>
-          </Layout>
-        </Container>
-        <Container class="javax.swing.JPanel" name="advancedPanel">
-          <Properties>
-            <Property name="name" type="java.lang.String" value="advancedPanel" noResource="true"/>
-          </Properties>
-          <Constraints>
-            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
-              <JTabbedPaneConstraints tabName="Advanced">
-                <Property name="tabTitle" type="java.lang.String" resourceKey="advancedPanel.TabConstraints.tabTitle"/>
-              </JTabbedPaneConstraints>
-            </Constraint>
-          </Constraints>
-
-          <Layout>
-            <DimensionLayout dim="0">
-              <Group type="103" groupAlignment="0" attributes="0">
-                  <EmptySpace min="0" pref="562" max="32767" attributes="0"/>
-              </Group>
-            </DimensionLayout>
-            <DimensionLayout dim="1">
-              <Group type="103" groupAlignment="0" attributes="0">
-                  <EmptySpace min="0" pref="388" max="32767" attributes="0"/>
-              </Group>
-            </DimensionLayout>
-          </Layout>
-        </Container>
-      </SubComponents>
-    </Container>
-  </SubComponents>
-</Form>
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java
deleted file mode 100644
index 3e4a17fd21d33f3c4555e141c9e10544dc8aae9e..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java
+++ /dev/null
@@ -1,839 +0,0 @@
-/*
- * GeneralConfiguration.java
- *
- * Created on 10 april 2009, 19:04
- */
-
-package net.i2p.desktopgui.gui;
-
-import java.awt.Desktop;
-import java.awt.event.ActionEvent;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import net.i2p.desktopgui.router.configuration.SpeedHelper;
-import javax.swing.JComboBox;
-import javax.swing.ButtonModel;
-import javax.swing.JTextField;
-import net.i2p.desktopgui.router.RouterHelper;
-import net.i2p.desktopgui.router.configuration.SpeedHandler;
-import net.i2p.desktopgui.router.configuration.UpdateHelper;
-import net.i2p.router.web.NewsFetcher;
-import net.i2p.desktopgui.router.configuration.UpdateHandler;
-import java.util.Date;
-import javax.swing.SwingWorker;
-import net.i2p.i2ptunnel.web.IndexBean;
-import javax.swing.table.DefaultTableModel;
-import java.awt.event.ActionListener;
-
-/**
- *
- * @author  mathias
- */
-public class GeneralConfiguration extends javax.swing.JFrame {
-
-    /** Creates new form GeneralConfiguration */
-    public GeneralConfiguration() {
-        initComponents();
-        extraInitComponents();
-        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
-        this.setLocationRelativeTo(null);
-        this.requestFocus();
-        this.setVisible(true);
-    }
-    
-    private void extraInitComponents() {
-        initSpeedTab();
-        initUpdateTab();
-        initTunnelTab();
-    }
-
-    private void initSpeedTab() {
-        try {
-            String inbound = SpeedHelper.getInboundBandwidth();
-            String outbound = SpeedHelper.getOutboundBandwidth();
-
-            initSpeeds("" + Integer.parseInt(inbound)*8, "" + Integer.parseInt(outbound)*8);
-            initUsage("" + Integer.parseInt(inbound), "" + Integer.parseInt(outbound));
-        }
-        catch(Exception e) {
-            e.printStackTrace();
-            System.out.println("Exception noticed, probably running desktopgui in a debugger instead of along with I2P!?");
-            initSpeeds("100", "100");
-            initUsage("12", "12");
-        }
-    }
-
-    private void initUpdateTab() {
-        //Set update policy
-        String updatePolicy = UpdateHelper.getUpdatePolicy();
-        if(updatePolicy.equals(UpdateHelper.NOTIFY_UPDATE_POLICY)) {
-            updateButtonGroup.setSelected(updateInform.getModel(), true);
-        }
-        else if(updatePolicy.equals(UpdateHelper.DOWNLOAD_UPDATE_POLICY)) {
-            updateButtonGroup.setSelected(updateDownload.getModel(), true);
-        }
-        else if(updatePolicy.equals(UpdateHelper.INSTALL_UPDATE_POLICY)) {
-            updateButtonGroup.setSelected(updateDownloadRestart.getModel(), true);
-        }
-        else {
-            System.out.println("desktopgui: no updates for you!");
-        }
-
-        //Check if an update is available
-        //TODO: move this method out of the routerconsole so desktopgui doesn't depend on routerconsole!!!
-        if(NewsFetcher.getInstance(RouterHelper.getContext()).updateAvailable()) {
-            updateNow.setVisible(true);
-        }
-        else {
-            updateNow.setVisible(false);
-        }
-    }
-
-    private void initTunnelTab() {
-        while(((DefaultTableModel) clientTable.getModel()).getRowCount() > 0) {
-            ((DefaultTableModel) clientTable.getModel()).removeRow(0);
-        }
-        while(((DefaultTableModel) serverTable.getModel()).getRowCount() > 0) {
-            ((DefaultTableModel) serverTable.getModel()).removeRow(0);
-        }
-        IndexBean bean = new IndexBean();
-        for(int i=0; i<bean.getTunnelCount(); i++) {
-            if(bean.isClient(i)) {
-                Object[] row = {bean.getTunnelName(i), bean.getTunnelType(i),
-                                bean.getClientInterface(i) + ":" + bean.getClientPort(i),
-                                getTunnelStatus(bean.getTunnelStatus(i))};
-                ((DefaultTableModel) clientTable.getModel()).addRow(row);
-            }
-            else {
-                Object[] row = {bean.getTunnelName(i),
-                                bean.getServerTarget(i),
-                                getTunnelStatus(bean.getTunnelStatus(i))};
-                ((DefaultTableModel) serverTable.getModel()).addRow(row);
-            }
-        }
-    }
-
-    public String getTunnelStatus(int status) {
-        if(status == IndexBean.NOT_RUNNING) {
-            return "Not running";
-        }
-        else if(status == IndexBean.RUNNING) {
-            return "Running";
-        }
-        else if(status == IndexBean.STANDBY) {
-            return "Standby";
-        }
-        else if(status == IndexBean.STARTING) {
-            return "Starting";
-        }
-        else {
-            return "Error: status not found";
-        }
-    }
-
-    /** This method is called from within the constructor to
-     * initialize the form.
-     * WARNING: Do NOT modify this code. The content of this method is
-     * always regenerated by the Form Editor.
-     */
-    @SuppressWarnings("unchecked")
-    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
-    private void initComponents() {
-
-        updateButtonGroup = new javax.swing.ButtonGroup();
-        applyPanel = new javax.swing.JPanel();
-        cancel = new javax.swing.JToggleButton();
-        ok = new javax.swing.JToggleButton();
-        settingsPanel = new javax.swing.JTabbedPane();
-        speedPanel = new javax.swing.JPanel();
-        uploadSpeedLabel = new javax.swing.JLabel();
-        downloadSpeedLabel = new javax.swing.JLabel();
-        uploadspeed = new javax.swing.JTextField();
-        downloadspeed = new javax.swing.JTextField();
-        uploadkbps = new javax.swing.JComboBox();
-        downloadkbps = new javax.swing.JComboBox();
-        uploadUsageLabel = new javax.swing.JLabel();
-        downloadUsageLabel = new javax.swing.JLabel();
-        uploadgb = new javax.swing.JTextField();
-        downloadgb = new javax.swing.JTextField();
-        gbUploadLabel = new javax.swing.JLabel();
-        gbDownloadLabel = new javax.swing.JLabel();
-        uploadDownloadExplanation = new javax.swing.JLabel();
-        updatesPanel = new javax.swing.JPanel();
-        updateMethod = new javax.swing.JLabel();
-        updateInform = new javax.swing.JRadioButton();
-        updateDownload = new javax.swing.JRadioButton();
-        updateDownloadRestart = new javax.swing.JRadioButton();
-        checkUpdates = new javax.swing.JToggleButton();
-        updateNow = new javax.swing.JToggleButton();
-        advancedUpdateConfig = new javax.swing.JToggleButton();
-        tunnelPanel = new javax.swing.JPanel();
-        clientFrame = new javax.swing.JScrollPane();
-        clientTable = new javax.swing.JTable();
-        serverFrame = new javax.swing.JScrollPane();
-        serverTable = new javax.swing.JTable();
-        tunnelsExplanation = new javax.swing.JLabel();
-        clientTunnelLabel = new javax.swing.JLabel();
-        serverTunnelLabel = new javax.swing.JLabel();
-        networkPanel = new javax.swing.JPanel();
-        advancedPanel = new javax.swing.JPanel();
-
-        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
-        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(GeneralConfiguration.class);
-        setTitle(resourceMap.getString("Form.title")); // NOI18N
-        setName("Form"); // NOI18N
-
-        applyPanel.setName("applyPanel"); // NOI18N
-
-        cancel.setText(resourceMap.getString("cancel.text")); // NOI18N
-        cancel.setName("cancel"); // NOI18N
-        cancel.addMouseListener(new java.awt.event.MouseAdapter() {
-            public void mouseClicked(java.awt.event.MouseEvent evt) {
-                cancelMouseClicked(evt);
-            }
-        });
-
-        ok.setText(resourceMap.getString("ok.text")); // NOI18N
-        ok.setName("ok"); // NOI18N
-        ok.addMouseListener(new java.awt.event.MouseAdapter() {
-            public void mouseClicked(java.awt.event.MouseEvent evt) {
-                okMouseClicked(evt);
-            }
-        });
-
-        javax.swing.GroupLayout applyPanelLayout = new javax.swing.GroupLayout(applyPanel);
-        applyPanel.setLayout(applyPanelLayout);
-        applyPanelLayout.setHorizontalGroup(
-            applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, applyPanelLayout.createSequentialGroup()
-                .addContainerGap(475, Short.MAX_VALUE)
-                .addComponent(ok)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(cancel)
-                .addContainerGap())
-        );
-        applyPanelLayout.setVerticalGroup(
-            applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(applyPanelLayout.createSequentialGroup()
-                .addGroup(applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
-                    .addComponent(cancel)
-                    .addComponent(ok))
-                .addContainerGap(14, Short.MAX_VALUE))
-        );
-
-        settingsPanel.setName("settingsPanel"); // NOI18N
-
-        speedPanel.setName("speedPanel"); // NOI18N
-        speedPanel.setLayout(null);
-
-        uploadSpeedLabel.setText(resourceMap.getString("uploadSpeedLabel.text")); // NOI18N
-        uploadSpeedLabel.setName("uploadSpeedLabel"); // NOI18N
-        speedPanel.add(uploadSpeedLabel);
-        uploadSpeedLabel.setBounds(20, 20, 140, 30);
-
-        downloadSpeedLabel.setText(resourceMap.getString("downloadSpeedLabel.text")); // NOI18N
-        downloadSpeedLabel.setName("downloadSpeedLabel"); // NOI18N
-        speedPanel.add(downloadSpeedLabel);
-        downloadSpeedLabel.setBounds(20, 60, 140, 30);
-
-        uploadspeed.setText(resourceMap.getString("uploadspeed.text")); // NOI18N
-        uploadspeed.setName("uploadspeed"); // NOI18N
-        uploadspeed.addKeyListener(new java.awt.event.KeyAdapter() {
-            public void keyReleased(java.awt.event.KeyEvent evt) {
-                speedKeyReleased(evt);
-            }
-        });
-        speedPanel.add(uploadspeed);
-        uploadspeed.setBounds(160, 20, 77, 27);
-
-        downloadspeed.setText(resourceMap.getString("downloadspeed.text")); // NOI18N
-        downloadspeed.setName("downloadspeed"); // NOI18N
-        downloadspeed.addKeyListener(new java.awt.event.KeyAdapter() {
-            public void keyReleased(java.awt.event.KeyEvent evt) {
-                speedKeyReleased(evt);
-            }
-        });
-        speedPanel.add(downloadspeed);
-        downloadspeed.setBounds(160, 60, 77, 27);
-
-        uploadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
-        uploadkbps.setName("uploadkbps"); // NOI18N
-        uploadkbps.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                uploadkbpsActionPerformed(evt);
-            }
-        });
-        speedPanel.add(uploadkbps);
-        uploadkbps.setBounds(240, 20, 68, 27);
-
-        downloadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
-        downloadkbps.setName("downloadkbps"); // NOI18N
-        downloadkbps.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                downloadkbpsActionPerformed(evt);
-            }
-        });
-        speedPanel.add(downloadkbps);
-        downloadkbps.setBounds(240, 60, 68, 27);
-
-        uploadUsageLabel.setText(resourceMap.getString("uploadUsageLabel.text")); // NOI18N
-        uploadUsageLabel.setName("uploadUsageLabel"); // NOI18N
-        speedPanel.add(uploadUsageLabel);
-        uploadUsageLabel.setBounds(330, 20, 97, 30);
-
-        downloadUsageLabel.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N
-        downloadUsageLabel.setName("downloadUsageLabel"); // NOI18N
-        speedPanel.add(downloadUsageLabel);
-        downloadUsageLabel.setBounds(330, 60, 97, 30);
-
-        uploadgb.setText(resourceMap.getString("uploadgb.text")); // NOI18N
-        uploadgb.setName("uploadgb"); // NOI18N
-        uploadgb.addKeyListener(new java.awt.event.KeyAdapter() {
-            public void keyReleased(java.awt.event.KeyEvent evt) {
-                monthKeyReleased(evt);
-            }
-        });
-        speedPanel.add(uploadgb);
-        uploadgb.setBounds(440, 20, 60, 27);
-
-        downloadgb.setText(resourceMap.getString("downloadgb.text")); // NOI18N
-        downloadgb.setName("downloadgb"); // NOI18N
-        downloadgb.addKeyListener(new java.awt.event.KeyAdapter() {
-            public void keyReleased(java.awt.event.KeyEvent evt) {
-                monthKeyReleased(evt);
-            }
-        });
-        speedPanel.add(downloadgb);
-        downloadgb.setBounds(440, 60, 60, 27);
-
-        gbUploadLabel.setText(resourceMap.getString("gbUploadLabel.text")); // NOI18N
-        gbUploadLabel.setName("gbUploadLabel"); // NOI18N
-        speedPanel.add(gbUploadLabel);
-        gbUploadLabel.setBounds(510, 20, 19, 30);
-
-        gbDownloadLabel.setText(resourceMap.getString("gbDownloadLabel.text")); // NOI18N
-        gbDownloadLabel.setName("gbDownloadLabel"); // NOI18N
-        speedPanel.add(gbDownloadLabel);
-        gbDownloadLabel.setBounds(510, 60, 19, 30);
-
-        uploadDownloadExplanation.setText(resourceMap.getString("uploadDownloadExplanation.text")); // NOI18N
-        uploadDownloadExplanation.setName("uploadDownloadExplanation"); // NOI18N
-        speedPanel.add(uploadDownloadExplanation);
-        uploadDownloadExplanation.setBounds(20, 100, 520, 70);
-
-        settingsPanel.addTab(resourceMap.getString("speedPanel.TabConstraints.tabTitle"), speedPanel); // NOI18N
-
-        updatesPanel.setName("updatesPanel"); // NOI18N
-
-        updateMethod.setText(resourceMap.getString("updateMethod.text")); // NOI18N
-        updateMethod.setName("updateMethod"); // NOI18N
-
-        updateButtonGroup.add(updateInform);
-        updateInform.setText(resourceMap.getString("updateInform.text")); // NOI18N
-        updateInform.setName("updateInform"); // NOI18N
-
-        updateButtonGroup.add(updateDownload);
-        updateDownload.setText(resourceMap.getString("updateDownload.text")); // NOI18N
-        updateDownload.setName("updateDownload"); // NOI18N
-
-        updateButtonGroup.add(updateDownloadRestart);
-        updateDownloadRestart.setText(resourceMap.getString("updateDownloadRestart.text")); // NOI18N
-        updateDownloadRestart.setName("updateDownloadRestart"); // NOI18N
-
-        checkUpdates.setText(resourceMap.getString("checkUpdates.text")); // NOI18N
-        checkUpdates.setName("checkUpdates"); // NOI18N
-        checkUpdates.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                checkUpdatesActionPerformed(evt);
-            }
-        });
-
-        updateNow.setText(resourceMap.getString("updateNow.text")); // NOI18N
-        updateNow.setName("updateNow"); // NOI18N
-        updateNow.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                updateNowActionPerformed(evt);
-            }
-        });
-
-        advancedUpdateConfig.setText(resourceMap.getString("advancedUpdateConfig.text")); // NOI18N
-        advancedUpdateConfig.setName("advancedUpdateConfig"); // NOI18N
-        advancedUpdateConfig.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                advancedUpdateConfigActionPerformed(evt);
-            }
-        });
-
-        javax.swing.GroupLayout updatesPanelLayout = new javax.swing.GroupLayout(updatesPanel);
-        updatesPanel.setLayout(updatesPanelLayout);
-        updatesPanelLayout.setHorizontalGroup(
-            updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(updatesPanelLayout.createSequentialGroup()
-                .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                    .addGroup(updatesPanelLayout.createSequentialGroup()
-                        .addGap(20, 20, 20)
-                        .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                            .addComponent(updateMethod)
-                            .addGroup(updatesPanelLayout.createSequentialGroup()
-                                .addComponent(checkUpdates)
-                                .addGap(18, 18, 18)
-                                .addComponent(updateNow))))
-                    .addGroup(updatesPanelLayout.createSequentialGroup()
-                        .addGap(40, 40, 40)
-                        .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
-                            .addComponent(updateInform, javax.swing.GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE)
-                            .addComponent(updateDownload, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
-                            .addComponent(updateDownloadRestart, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
-                .addContainerGap())
-            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, updatesPanelLayout.createSequentialGroup()
-                .addContainerGap(339, Short.MAX_VALUE)
-                .addComponent(advancedUpdateConfig)
-                .addContainerGap())
-        );
-        updatesPanelLayout.setVerticalGroup(
-            updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(updatesPanelLayout.createSequentialGroup()
-                .addContainerGap()
-                .addComponent(updateMethod)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
-                .addComponent(updateInform)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(updateDownload)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(updateDownloadRestart)
-                .addGap(18, 18, 18)
-                .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
-                    .addComponent(checkUpdates)
-                    .addComponent(updateNow))
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 181, Short.MAX_VALUE)
-                .addComponent(advancedUpdateConfig)
-                .addContainerGap())
-        );
-
-        settingsPanel.addTab(resourceMap.getString("updatesPanel.TabConstraints.tabTitle"), updatesPanel); // NOI18N
-
-        tunnelPanel.setName("tunnelPanel"); // NOI18N
-
-        clientFrame.setName("clientFrame"); // NOI18N
-
-        clientTable.setModel(new javax.swing.table.DefaultTableModel(
-            new Object [][] {
-
-            },
-            new String [] {
-                "Name", "Type", "Address", "Status"
-            }
-        ));
-        clientTable.setName("clientTable"); // NOI18N
-        clientTable.addMouseListener(new java.awt.event.MouseAdapter() {
-            public void mouseClicked(java.awt.event.MouseEvent evt) {
-                clientTableMouseClicked(evt);
-            }
-        });
-        clientFrame.setViewportView(clientTable);
-        clientTable.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("clientTable.columnModel.title0")); // NOI18N
-        clientTable.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("clientTable.columnModel.title1")); // NOI18N
-        clientTable.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("clientTable.columnModel.title2")); // NOI18N
-        clientTable.getColumnModel().getColumn(3).setHeaderValue(resourceMap.getString("clientTable.columnModel.title3")); // NOI18N
-
-        serverFrame.setName("serverFrame"); // NOI18N
-
-        serverTable.setModel(new javax.swing.table.DefaultTableModel(
-            new Object [][] {
-                {null, null, null},
-                {null, null, null},
-                {null, null, null},
-                {null, null, null}
-            },
-            new String [] {
-                "Name", "Address", "Status"
-            }
-        ));
-        serverTable.setName("serverTable"); // NOI18N
-        serverTable.addMouseListener(new java.awt.event.MouseAdapter() {
-            public void mouseClicked(java.awt.event.MouseEvent evt) {
-                serverTableMouseClicked(evt);
-            }
-        });
-        serverFrame.setViewportView(serverTable);
-        serverTable.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("serverTable.columnModel.title0")); // NOI18N
-        serverTable.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("serverTable.columnModel.title1")); // NOI18N
-        serverTable.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("serverTable.columnModel.title2")); // NOI18N
-
-        tunnelsExplanation.setText(resourceMap.getString("tunnelsExplanation.text")); // NOI18N
-        tunnelsExplanation.setName("tunnelsExplanation"); // NOI18N
-
-        clientTunnelLabel.setText(resourceMap.getString("clientTunnelLabel.text")); // NOI18N
-        clientTunnelLabel.setName("clientTunnelLabel"); // NOI18N
-
-        serverTunnelLabel.setText(resourceMap.getString("serverTunnelLabel.text")); // NOI18N
-        serverTunnelLabel.setName("serverTunnelLabel"); // NOI18N
-
-        javax.swing.GroupLayout tunnelPanelLayout = new javax.swing.GroupLayout(tunnelPanel);
-        tunnelPanel.setLayout(tunnelPanelLayout);
-        tunnelPanelLayout.setHorizontalGroup(
-            tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, tunnelPanelLayout.createSequentialGroup()
-                .addContainerGap()
-                .addGroup(tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
-                    .addComponent(tunnelsExplanation, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
-                    .addComponent(serverFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
-                    .addComponent(clientTunnelLabel, javax.swing.GroupLayout.Alignment.LEADING)
-                    .addComponent(clientFrame, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
-                    .addComponent(serverTunnelLabel, javax.swing.GroupLayout.Alignment.LEADING))
-                .addContainerGap())
-        );
-        tunnelPanelLayout.setVerticalGroup(
-            tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(tunnelPanelLayout.createSequentialGroup()
-                .addContainerGap()
-                .addComponent(clientTunnelLabel)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(clientFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 119, Short.MAX_VALUE)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(serverTunnelLabel)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(serverFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 122, Short.MAX_VALUE)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(tunnelsExplanation, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
-                .addGap(32, 32, 32))
-        );
-
-        settingsPanel.addTab(resourceMap.getString("tunnelPanel.TabConstraints.tabTitle"), tunnelPanel); // NOI18N
-
-        networkPanel.setName("networkPanel"); // NOI18N
-
-        javax.swing.GroupLayout networkPanelLayout = new javax.swing.GroupLayout(networkPanel);
-        networkPanel.setLayout(networkPanelLayout);
-        networkPanelLayout.setHorizontalGroup(
-            networkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGap(0, 562, Short.MAX_VALUE)
-        );
-        networkPanelLayout.setVerticalGroup(
-            networkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGap(0, 388, Short.MAX_VALUE)
-        );
-
-        settingsPanel.addTab(resourceMap.getString("networkPanel.TabConstraints.tabTitle"), networkPanel); // NOI18N
-
-        advancedPanel.setName("advancedPanel"); // NOI18N
-
-        javax.swing.GroupLayout advancedPanelLayout = new javax.swing.GroupLayout(advancedPanel);
-        advancedPanel.setLayout(advancedPanelLayout);
-        advancedPanelLayout.setHorizontalGroup(
-            advancedPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGap(0, 562, Short.MAX_VALUE)
-        );
-        advancedPanelLayout.setVerticalGroup(
-            advancedPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGap(0, 388, Short.MAX_VALUE)
-        );
-
-        settingsPanel.addTab(resourceMap.getString("advancedPanel.TabConstraints.tabTitle"), advancedPanel); // NOI18N
-
-        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
-        getContentPane().setLayout(layout);
-        layout.setHorizontalGroup(
-            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addComponent(applyPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
-            .addGroup(layout.createSequentialGroup()
-                .addGap(12, 12, 12)
-                .addComponent(settingsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 566, Short.MAX_VALUE))
-        );
-        layout.setVerticalGroup(
-            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
-                .addComponent(settingsPanel)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(applyPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
-        );
-
-        pack();
-    }// </editor-fold>//GEN-END:initComponents
-
-    private void speedKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_speedKeyReleased
-    try {
-        String upload = "";
-        if(uploadkbps.getSelectedIndex() == KILOBIT)
-            upload = "" + Integer.parseInt(uploadspeed.getText())/8;
-        else
-            upload = uploadspeed.getText();
-        String download = "";
-        if(downloadkbps.getSelectedIndex() == KILOBIT)
-            download = "" + Integer.parseInt(downloadspeed.getText())/8;
-        else
-            download = downloadspeed.getText();
-        initUsage(upload, download);
-    }
-    catch(NumberFormatException e) {
-        e.printStackTrace();
-        return;
-    }
-}//GEN-LAST:event_speedKeyReleased
-
-private void uploadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadkbpsActionPerformed
-    kbpsSwitchPerformed(uploadkbps, uploadspeed);
-}//GEN-LAST:event_uploadkbpsActionPerformed
-
-private void downloadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downloadkbpsActionPerformed
-    kbpsSwitchPerformed(downloadkbps, downloadspeed);
-}//GEN-LAST:event_downloadkbpsActionPerformed
-
-private void monthKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_monthKeyReleased
-    try {
-        int uploadMonthValue = Integer.parseInt(uploadgb.getText());
-        int downloadMonthValue = Integer.parseInt(downloadgb.getText());
-
-        String upload = "";
-        String burstUpload = "";
-        String download = "";
-        String burstDownload = "";
-
-        if(uploadkbps.getSelectedIndex() == KILOBIT)
-            upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue)*8; //kbit
-        else
-            upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue); //kbyte
-
-        if(downloadkbps.getSelectedIndex() == KILOBIT)
-            download = "" + SpeedHelper.calculateSpeed(downloadMonthValue)*8; //kbit
-        else
-            download = "" + SpeedHelper.calculateSpeed(downloadMonthValue); //kbyte
-
-        initSpeeds(upload, download);
-    }
-    catch(NumberFormatException e) {
-        e.printStackTrace();
-        return;
-    }
-}//GEN-LAST:event_monthKeyReleased
-
-private void cancelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cancelMouseClicked
-    this.dispose();
-}//GEN-LAST:event_cancelMouseClicked
-
-private void okMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_okMouseClicked
-    saveSpeeds();
-    saveUpdatePolicy();
-    this.dispose();
-}//GEN-LAST:event_okMouseClicked
-
-private void checkUpdatesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkUpdatesActionPerformed
-    long current = new Date().getTime();
-    if(current < newsLastFetched + 5*60*1000) {
-        return;
-    }
-    checkUpdates.setText("Checking for updates");
-    checkUpdates.setEnabled(false);
-    newsLastFetched = current;
-    SwingWorker sw = new SwingWorker() {
-
-            @Override
-            protected Object doInBackground() throws Exception {
-                NewsFetcher.getInstance(RouterHelper.getContext()).fetchNews();
-                return null;
-            }
-
-            @Override
-            protected void done() {
-                checkUpdates.setText("Check for updates now");
-                checkUpdates.setEnabled(true);
-                if(NewsFetcher.getInstance(RouterHelper.getContext()).updateAvailable()) {
-                    updateNow.setVisible(true);
-                }
-            }
-
-    };
-}//GEN-LAST:event_checkUpdatesActionPerformed
-
-private void updateNowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateNowActionPerformed
-    SwingWorker sw = new SwingWorker() {
-
-            @Override
-            protected Object doInBackground() throws Exception {
-                new net.i2p.router.web.UpdateHandler().update();
-                return null;
-            }
-        
-    };
-    updateNow.setEnabled(false);
-    updateNow.setText("Updating...");
-    checkUpdates.setEnabled(false);
-
-}//GEN-LAST:event_updateNowActionPerformed
-
-private void advancedUpdateConfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_advancedUpdateConfigActionPerformed
-    try {
-        Desktop.getDesktop().browse(new URI("http://127.0.0.1:7657/configupdate.jsp"));
-    } catch (URISyntaxException ex) {
-        Logger.getLogger(GeneralConfiguration.class.getName()).log(Level.SEVERE, null, ex);
-    }
-    catch (IOException ex) {
-            Logger.getLogger(GeneralConfiguration.class.getName()).log(Level.SEVERE, null, ex);
-    }
-}//GEN-LAST:event_advancedUpdateConfigActionPerformed
-
-private void clientTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_clientTableMouseClicked
-    int row = clientTable.getSelectedRow();
-    if(row == -1) { //No selected row
-        return;
-    }
-    else {
-        IndexBean bean = new IndexBean();
-        /*
-         * TODO: This is not entirely good: if one adds/removes a tunnel without desktopgui, this number will be wrong
-         */
-        int clientNumber = 0;
-        int i = 0;
-        for(clientNumber=0; clientNumber<bean.getTunnelCount(); clientNumber++) {
-            if(bean.isClient(clientNumber)) {
-                if(i == row) {
-                    break;
-                }
-                i++;
-            }
-        }
-        new ClientTunnelWindow(clientNumber, new ActionListener() {
-
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    initTunnelTab();
-                }
-            
-        });
-    }
-}//GEN-LAST:event_clientTableMouseClicked
-
-private void serverTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_serverTableMouseClicked
-    int row = serverTable.getSelectedRow();
-    if(row == -1) { //No selected row
-        return;
-    }
-    else {
-        IndexBean bean = new IndexBean();
-        /*
-         * TODO: This is not entirely good: if one adds/removes a tunnel without desktopgui, this number will be wrong
-         */
-        int serverNumber = 0;
-        int i = 0;
-        for(serverNumber=0; serverNumber<bean.getTunnelCount(); serverNumber++) {
-            if(!bean.isClient(serverNumber)) {
-                if(i == row) {
-                    break;
-                }
-                i++;
-            }
-        }
-        new ServerTunnelWindow(serverNumber, new ActionListener() {
-
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    initTunnelTab();
-                }
-
-        });
-    }
-}//GEN-LAST:event_serverTableMouseClicked
-
-    protected void initUsage(String upload, String download) {
-        uploadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(upload)));
-        downloadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(download)));
-    }
-
-    protected void initSpeeds(String upload, String download) {
-        uploadspeed.setText(upload);
-        downloadspeed.setText(download);
-    }
-
-    private void kbpsSwitchPerformed(JComboBox kbps, JTextField speed) {
-        int index = kbps.getSelectedIndex();
-        int previous = Integer.parseInt(speed.getText());
-        if(index == KILOBIT) {
-            speed.setText("" + previous*8);
-        }
-        else {
-            speed.setText("" + previous/8);
-        }
-    }
-
-    protected void saveSpeeds() {
-        int maxDownload = Integer.parseInt(downloadspeed.getText());
-        int maxUpload = Integer.parseInt(uploadspeed.getText());
-        if(uploadkbps.getSelectedIndex() == KILOBIT) {
-            SpeedHandler.setOutboundBandwidth(maxUpload/8);
-            SpeedHandler.setOutboundBurstBandwidth(maxUpload/8);
-        }
-        else {
-            SpeedHandler.setOutboundBandwidth(maxUpload);
-            SpeedHandler.setOutboundBurstBandwidth(maxUpload);
-        }
-        if(downloadkbps.getSelectedIndex() == KILOBIT) {
-            SpeedHandler.setInboundBandwidth(maxDownload/8);
-            SpeedHandler.setInboundBurstBandwidth(maxDownload/8);
-        }
-        else {
-            SpeedHandler.setInboundBandwidth(maxDownload);
-            SpeedHandler.setInboundBurstBandwidth(maxDownload);
-        }
-    }
-
-    protected void saveUpdatePolicy() {
-        ButtonModel policyButton = updateButtonGroup.getSelection();
-        if(policyButton.equals(updateInform.getModel())) {
-            UpdateHandler.setUpdatePolicy(UpdateHelper.NOTIFY_UPDATE_POLICY);
-        }
-        else if(policyButton.equals(updateDownload.getModel())) {
-            UpdateHandler.setUpdatePolicy(UpdateHelper.DOWNLOAD_UPDATE_POLICY);
-        }
-        else if(policyButton.equals(updateDownloadRestart.getModel())) {
-            UpdateHandler.setUpdatePolicy(UpdateHelper.INSTALL_UPDATE_POLICY);
-        }
-    }
-
-    // Variables declaration - do not modify//GEN-BEGIN:variables
-    private javax.swing.JPanel advancedPanel;
-    private javax.swing.JToggleButton advancedUpdateConfig;
-    private javax.swing.JPanel applyPanel;
-    private javax.swing.JToggleButton cancel;
-    private javax.swing.JToggleButton checkUpdates;
-    private javax.swing.JScrollPane clientFrame;
-    private javax.swing.JTable clientTable;
-    private javax.swing.JLabel clientTunnelLabel;
-    private javax.swing.JLabel downloadSpeedLabel;
-    private javax.swing.JLabel downloadUsageLabel;
-    private javax.swing.JTextField downloadgb;
-    private javax.swing.JComboBox downloadkbps;
-    private javax.swing.JTextField downloadspeed;
-    private javax.swing.JLabel gbDownloadLabel;
-    private javax.swing.JLabel gbUploadLabel;
-    private javax.swing.JPanel networkPanel;
-    private javax.swing.JToggleButton ok;
-    private javax.swing.JScrollPane serverFrame;
-    private javax.swing.JTable serverTable;
-    private javax.swing.JLabel serverTunnelLabel;
-    private javax.swing.JTabbedPane settingsPanel;
-    private javax.swing.JPanel speedPanel;
-    private javax.swing.JPanel tunnelPanel;
-    private javax.swing.JLabel tunnelsExplanation;
-    private javax.swing.ButtonGroup updateButtonGroup;
-    private javax.swing.JRadioButton updateDownload;
-    private javax.swing.JRadioButton updateDownloadRestart;
-    private javax.swing.JRadioButton updateInform;
-    private javax.swing.JLabel updateMethod;
-    private javax.swing.JToggleButton updateNow;
-    private javax.swing.JPanel updatesPanel;
-    private javax.swing.JLabel uploadDownloadExplanation;
-    private javax.swing.JLabel uploadSpeedLabel;
-    private javax.swing.JLabel uploadUsageLabel;
-    private javax.swing.JTextField uploadgb;
-    private javax.swing.JComboBox uploadkbps;
-    private javax.swing.JTextField uploadspeed;
-    // End of variables declaration//GEN-END:variables
-
-    public static final int KILOBIT = 0;
-    public static final int KILOBYTE = 1;
-
-    private long newsLastFetched = 0;
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/JPopupTrayIcon.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/JPopupTrayIcon.java
deleted file mode 100644
index 1f62df2c27099c0863608ec181204dbe1d3473d2..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/JPopupTrayIcon.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
-* Created on Sep 15, 2008  5:51:33 PM
-*/
-
-/*
- * This class is part of fishfarm project: https://fishfarm.dev.java.net/
- * It is licensed under the GPL version 2.0 with Classpath Exception.
- * 
- * Copyright (C) 2008  Michael Bien
- * 
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU 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 General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- * 
- */
-
-package net.i2p.desktopgui.gui;
-
-import java.awt.Dimension;
-import java.awt.Frame;
-import java.awt.GraphicsEnvironment;
-import java.awt.Image;
-import java.awt.Point;
-import java.awt.PopupMenu;
-import java.awt.TrayIcon;
-import java.awt.Window;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import javax.swing.JDialog;
-import javax.swing.JPopupMenu;
-import javax.swing.JWindow;
-import javax.swing.RootPaneContainer;
-import javax.swing.event.PopupMenuEvent;
-import javax.swing.event.PopupMenuListener;
-import java.util.Date;
-
-
-
-/**
- * JPopupMenu compatible TrayIcon based on Alexander Potochkin's JXTrayIcon
- * (http://weblogs.java.net/blog/alexfromsun/archive/2008/02/jtrayicon_updat.html)
- * but uses a JWindow instead of a JDialog to workaround some bugs on linux.
- *
- * @author Michael Bien
- */
-public class JPopupTrayIcon extends TrayIcon {
-
-    private JPopupMenu menu;
-    
-    private Window window;
-    private PopupMenuListener popupListener;
-    
-    private final static boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().contains("windows");
-
-    private static MouseEvent previous = null;
-    private static Date previousTime = new Date();
-    private static Date time = new Date();
-
-    public JPopupTrayIcon(Image image) {
-        super(image);
-        init();
-    }
-
-    public JPopupTrayIcon(Image image, String tooltip) {
-        super(image, tooltip);
-        init();
-    }
-
-    public JPopupTrayIcon(Image image, String tooltip, PopupMenu popup) {
-        super(image, tooltip, popup);
-        init();
-    }
-
-    public JPopupTrayIcon(Image image, String tooltip, JPopupMenu popup) {
-        super(image, tooltip);
-        init();
-        setJPopupMenu(popup);
-    }
-
-
-    private final void init() {
-
-
-        popupListener = new PopupMenuListener() {
-
-            @Override
-            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
-                //System.out.println("popupMenuWillBecomeVisible");
-            }
-
-            @Override
-            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
-                //System.out.println("popupMenuWillBecomeInvisible");
-                if(window != null) {
-                    window.dispose();
-                    window = null;
-                }
-            }
-
-            @Override
-            public void popupMenuCanceled(PopupMenuEvent e) {
-//                System.out.println("popupMenuCanceled");
-                if(window != null) {
-                    window.dispose();
-                    window = null;
-                }
-            }
-        };
-
-        addMouseListener(new MouseAdapter() {
-            @Override
-            public void mousePressed(MouseEvent e) {
-                //System.out.println("Pressed " + e.getPoint());
-                showJPopupMenu(e, previous);
-                previous = e;
-                previousTime = time;
-                time = new Date();
-            }
-
-            @Override
-            public void mouseReleased(MouseEvent e) {
-                //System.out.println("Released " + e.getPoint());
-                showJPopupMenu(e, previous);
-                previous = e;
-                previousTime = time;
-                time = new Date();
-            }
-        });
-
-    }
-
-    private final void showJPopupMenu(MouseEvent e, MouseEvent previous) {
-        if((e.isPopupTrigger() || previous.isPopupTrigger()) && (time.getTime() - previousTime.getTime() < 1000) && menu != null) {
-            if (window == null) {
-
-                if(IS_WINDOWS) {
-                    window = new JDialog((Frame)null);
-                    ((JDialog)window).setUndecorated(true);
-                }else{
-                    window = new JWindow((Frame)null);
-                }
-                window.setAlwaysOnTop(true);
-                Dimension size = menu.getPreferredSize();
-
-                Point centerPoint = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
-                if(e.getY() > centerPoint.getY())
-                    window.setLocation(e.getX(), e.getY() - size.height);
-                else
-                    window.setLocation(e.getX(), e.getY());
-
-                window.setVisible(true);
-                
-                menu.show(((RootPaneContainer)window).getContentPane(), 0, 0);
-
-                // popup works only for focused windows
-                window.toFront();
-
-            }
-        }
-    }
-
-
-    public final JPopupMenu getJPopupMenu() {
-        return menu;
-    }
-
-    public final void setJPopupMenu(JPopupMenu menu) {
-        if (this.menu != null) {
-            this.menu.removePopupMenuListener(popupListener);
-        }
-        this.menu = menu;
-        menu.addPopupMenuListener(popupListener);
-    }
-
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.form
deleted file mode 100644
index ed2441319e9e731b289d75c220c71dbf87c906db..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.form
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
-  <Properties>
-    <Property name="defaultCloseOperation" type="int" value="3"/>
-    <Property name="title" type="java.lang.String" resourceKey="Form.title"/>
-    <Property name="name" type="java.lang.String" value="Form" noResource="true"/>
-  </Properties>
-  <SyntheticProperties>
-    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
-  </SyntheticProperties>
-  <AuxValues>
-    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
-    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
-    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
-    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
-  </AuxValues>
-
-  <Layout>
-    <DimensionLayout dim="0">
-      <Group type="103" groupAlignment="0" attributes="0">
-          <Group type="102" alignment="0" attributes="0">
-              <EmptySpace min="12" pref="12" max="12" attributes="0"/>
-              <Component id="explanationText" min="-2" pref="561" max="-2" attributes="0"/>
-              <EmptySpace max="-2" attributes="0"/>
-          </Group>
-          <Component id="textScroll" alignment="1" pref="722" max="32767" attributes="0"/>
-          <Group type="102" alignment="0" attributes="0">
-              <EmptySpace max="-2" attributes="0"/>
-              <Component id="refreshButton" min="-2" max="-2" attributes="0"/>
-              <EmptySpace type="separate" max="-2" attributes="0"/>
-              <Component id="clearButton" min="-2" max="-2" attributes="0"/>
-              <EmptySpace pref="587" max="32767" attributes="0"/>
-          </Group>
-      </Group>
-    </DimensionLayout>
-    <DimensionLayout dim="1">
-      <Group type="103" groupAlignment="0" attributes="0">
-          <Group type="102" alignment="0" attributes="0">
-              <EmptySpace min="-2" max="-2" attributes="0"/>
-              <Component id="explanationText" min="-2" pref="45" max="-2" attributes="0"/>
-              <EmptySpace type="unrelated" max="-2" attributes="0"/>
-              <Group type="103" groupAlignment="3" attributes="0">
-                  <Component id="refreshButton" alignment="3" min="-2" max="-2" attributes="0"/>
-                  <Component id="clearButton" alignment="3" min="-2" max="-2" attributes="0"/>
-              </Group>
-              <EmptySpace min="-2" pref="14" max="-2" attributes="0"/>
-              <Component id="textScroll" pref="330" max="32767" attributes="0"/>
-          </Group>
-      </Group>
-    </DimensionLayout>
-  </Layout>
-  <SubComponents>
-    <Container class="javax.swing.JScrollPane" name="textScroll">
-      <Properties>
-        <Property name="name" type="java.lang.String" value="textScroll" noResource="true"/>
-      </Properties>
-      <AuxValues>
-        <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
-      </AuxValues>
-
-      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
-      <SubComponents>
-        <Component class="javax.swing.JTextArea" name="logText">
-          <Properties>
-            <Property name="columns" type="int" value="20"/>
-            <Property name="rows" type="int" value="5"/>
-            <Property name="name" type="java.lang.String" value="logText" noResource="true"/>
-          </Properties>
-        </Component>
-      </SubComponents>
-    </Container>
-    <Component class="javax.swing.JLabel" name="explanationText">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="explanationText.text"/>
-        <Property name="name" type="java.lang.String" value="explanationText" noResource="true"/>
-      </Properties>
-    </Component>
-    <Component class="javax.swing.JButton" name="refreshButton">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="refreshButton.text"/>
-        <Property name="name" type="java.lang.String" value="refreshButton" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="refreshButtonActionPerformed"/>
-      </Events>
-    </Component>
-    <Component class="javax.swing.JButton" name="clearButton">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="clearButton.text"/>
-        <Property name="name" type="java.lang.String" value="clearButton" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="clearButtonActionPerformed"/>
-      </Events>
-    </Component>
-  </SubComponents>
-</Form>
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.java
deleted file mode 100644
index 1edf85b3bf0d169647fceacd52a33e671f90d025..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * LogViewer.java
- *
- * Created on 10 april 2009, 19:17
- */
-
-package net.i2p.desktopgui.gui;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.swing.WindowConstants;
-
-/**
- *
- * @author  mathias
- */
-public class LogViewer extends javax.swing.JFrame {
-
-    /** Creates new form LogViewer */
-    public LogViewer() {
-        initComponents();
-        readLogText();
-        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
-        this.setVisible(true);
-    }
-    
-    private void readLogText() {
-        Thread t = new Thread(new Runnable() {
-
-            @Override
-            public void run() {
-                String s = "";
-                File f = new File(LOGLOCATION);
-                if(f.exists()) {
-                    try {
-                        BufferedReader br = new BufferedReader(new FileReader(f));
-                        while(true) {
-                            String line = br.readLine();
-                            if(line != null)
-                                s += JTEXTNEWLINE + line;
-                            else
-                                break;
-                        }
-                    }
-                    catch(Exception e) {
-                        s = "An error has occurred while loading the logfiles:" + JTEXTNEWLINE + e.getMessage();
-                    }
-                }
-                logText.setText(s);
-            }
-            
-        });
-        t.start();
-    }
-
-    /** This method is called from within the constructor to
-     * initialize the form.
-     * WARNING: Do NOT modify this code. The content of this method is
-     * always regenerated by the Form Editor.
-     */
-    @SuppressWarnings("unchecked")
-    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
-    private void initComponents() {
-
-        textScroll = new javax.swing.JScrollPane();
-        logText = new javax.swing.JTextArea();
-        explanationText = new javax.swing.JLabel();
-        refreshButton = new javax.swing.JButton();
-        clearButton = new javax.swing.JButton();
-
-        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
-        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(LogViewer.class);
-        setTitle(resourceMap.getString("Form.title")); // NOI18N
-        setName("Form"); // NOI18N
-
-        textScroll.setName("textScroll"); // NOI18N
-
-        logText.setColumns(20);
-        logText.setRows(5);
-        logText.setName("logText"); // NOI18N
-        textScroll.setViewportView(logText);
-
-        explanationText.setText(resourceMap.getString("explanationText.text")); // NOI18N
-        explanationText.setName("explanationText"); // NOI18N
-
-        refreshButton.setText(resourceMap.getString("refreshButton.text")); // NOI18N
-        refreshButton.setName("refreshButton"); // NOI18N
-        refreshButton.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                refreshButtonActionPerformed(evt);
-            }
-        });
-
-        clearButton.setText(resourceMap.getString("clearButton.text")); // NOI18N
-        clearButton.setName("clearButton"); // NOI18N
-        clearButton.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                clearButtonActionPerformed(evt);
-            }
-        });
-
-        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
-        getContentPane().setLayout(layout);
-        layout.setHorizontalGroup(
-            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(layout.createSequentialGroup()
-                .addGap(12, 12, 12)
-                .addComponent(explanationText, javax.swing.GroupLayout.PREFERRED_SIZE, 561, javax.swing.GroupLayout.PREFERRED_SIZE)
-                .addContainerGap())
-            .addComponent(textScroll, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 722, Short.MAX_VALUE)
-            .addGroup(layout.createSequentialGroup()
-                .addContainerGap()
-                .addComponent(refreshButton)
-                .addGap(18, 18, 18)
-                .addComponent(clearButton)
-                .addContainerGap(587, Short.MAX_VALUE))
-        );
-        layout.setVerticalGroup(
-            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(layout.createSequentialGroup()
-                .addContainerGap()
-                .addComponent(explanationText, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
-                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
-                    .addComponent(refreshButton)
-                    .addComponent(clearButton))
-                .addGap(14, 14, 14)
-                .addComponent(textScroll, javax.swing.GroupLayout.DEFAULT_SIZE, 330, Short.MAX_VALUE))
-        );
-
-        pack();
-    }// </editor-fold>//GEN-END:initComponents
-
-private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearButtonActionPerformed
-    File f = new File(LOGLOCATION);
-    f.delete();
-    try {
-        f.createNewFile();//GEN-LAST:event_clearButtonActionPerformed
-    } catch (IOException ex) {
-        Logger.getLogger(LogViewer.class.getName()).log(Level.SEVERE, null, ex);
-    }
-    readLogText();
-}
-
-private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed
-    readLogText();
-}//GEN-LAST:event_refreshButtonActionPerformed
-
-
-    // Variables declaration - do not modify//GEN-BEGIN:variables
-    private javax.swing.JButton clearButton;
-    private javax.swing.JLabel explanationText;
-    private javax.swing.JTextArea logText;
-    private javax.swing.JButton refreshButton;
-    private javax.swing.JScrollPane textScroll;
-    // End of variables declaration//GEN-END:variables
-
-    private static final String LOGLOCATION = "wrapper.log";
-    private static final String JTEXTNEWLINE = "\n";
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.form
deleted file mode 100644
index 303f49a7f68b67995621c760150d1a2e77235564..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.form
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
-  <Properties>
-    <Property name="defaultCloseOperation" type="int" value="3"/>
-    <Property name="name" type="java.lang.String" value="Form" noResource="true"/>
-  </Properties>
-  <SyntheticProperties>
-    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
-  </SyntheticProperties>
-  <AuxValues>
-    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
-    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
-    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
-    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
-    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
-  </AuxValues>
-
-  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
-    <Property name="useNullLayout" type="boolean" value="true"/>
-  </Layout>
-  <SubComponents>
-    <Component class="javax.swing.JLabel" name="jLabel1">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="jLabel1.text"/>
-        <Property name="name" type="java.lang.String" value="jLabel1" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="10" y="10" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-  </SubComponents>
-</Form>
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.java
deleted file mode 100644
index 76521014869bf37649706565488696e5f2a0d129..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-
-/*
- * ServerTunnelWindow.java
- *
- * Created on 11-jun-2009, 14:55:53
- */
-
-package net.i2p.desktopgui.gui;
-
-import java.awt.event.ActionListener;
-
-/**
- *
- * @author mathias
- */
-public class ServerTunnelWindow extends javax.swing.JFrame {
-
-    /** Creates new form ServerTunnelWindow */
-    public ServerTunnelWindow(int tunnelNumber, ActionListener al) {
-        initComponents();
-        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
-        this.setSize(600, 600);
-        this.setLocationRelativeTo(null);
-        this.requestFocus();
-        this.setVisible(true);
-    }
-
-    /** This method is called from within the constructor to
-     * initialize the form.
-     * WARNING: Do NOT modify this code. The content of this method is
-     * always regenerated by the Form Editor.
-     */
-    @SuppressWarnings("unchecked")
-    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
-    private void initComponents() {
-
-        jLabel1 = new javax.swing.JLabel();
-
-        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
-        setName("Form"); // NOI18N
-        getContentPane().setLayout(null);
-
-        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(ServerTunnelWindow.class);
-        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
-        jLabel1.setName("jLabel1"); // NOI18N
-        getContentPane().add(jLabel1);
-        jLabel1.setBounds(10, 10, 43, 17);
-
-        pack();
-    }// </editor-fold>//GEN-END:initComponents
-
-    // Variables declaration - do not modify//GEN-BEGIN:variables
-    private javax.swing.JLabel jLabel1;
-    // End of variables declaration//GEN-END:variables
-
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.form
deleted file mode 100644
index 5ee7b94ac85c39d02589ebb8741493ec98026232..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.form
+++ /dev/null
@@ -1,179 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
-  <Properties>
-    <Property name="defaultCloseOperation" type="int" value="2"/>
-    <Property name="title" type="java.lang.String" resourceKey="Form.title"/>
-    <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
-      <Dimension value="[610, 330]"/>
-    </Property>
-    <Property name="name" type="java.lang.String" value="Form" noResource="true"/>
-    <Property name="resizable" type="boolean" value="false"/>
-  </Properties>
-  <SyntheticProperties>
-    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
-  </SyntheticProperties>
-  <AuxValues>
-    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
-    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
-    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
-    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
-    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,56,0,0,2,102"/>
-  </AuxValues>
-
-  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
-    <Property name="useNullLayout" type="boolean" value="true"/>
-  </Layout>
-  <SubComponents>
-    <Component class="javax.swing.JButton" name="nextButton">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="nextButton.text"/>
-        <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
-          <Dimension value="[72, 29]"/>
-        </Property>
-        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
-          <Dimension value="[72, 29]"/>
-        </Property>
-        <Property name="name" type="java.lang.String" value="nextButton" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="nextButtonMouseClicked"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="440" y="250" width="90" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="uploadLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="uploadLabel.text"/>
-        <Property name="name" type="java.lang.String" value="uploadLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="60" width="-1" height="30"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="downloadLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="downloadLabel.text"/>
-        <Property name="name" type="java.lang.String" value="downloadLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="110" width="-1" height="30"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JComboBox" name="uploadChoice">
-      <Properties>
-        <Property name="editable" type="boolean" value="true"/>
-        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-          <StringArray count="11">
-            <StringItem index="0" value="100"/>
-            <StringItem index="1" value="200"/>
-            <StringItem index="2" value="500"/>
-            <StringItem index="3" value="1000"/>
-            <StringItem index="4" value="2000"/>
-            <StringItem index="5" value="4000"/>
-            <StringItem index="6" value="8000"/>
-            <StringItem index="7" value="10000"/>
-            <StringItem index="8" value="20000"/>
-            <StringItem index="9" value="50000"/>
-            <StringItem index="10" value="100000"/>
-          </StringArray>
-        </Property>
-        <Property name="selectedIndex" type="int" value="3"/>
-        <Property name="name" type="java.lang.String" value="uploadChoice" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="300" y="60" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JComboBox" name="downloadChoice">
-      <Properties>
-        <Property name="editable" type="boolean" value="true"/>
-        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-          <StringArray count="11">
-            <StringItem index="0" value="100"/>
-            <StringItem index="1" value="200"/>
-            <StringItem index="2" value="500"/>
-            <StringItem index="3" value="1000"/>
-            <StringItem index="4" value="2000"/>
-            <StringItem index="5" value="4000"/>
-            <StringItem index="6" value="8000"/>
-            <StringItem index="7" value="10000"/>
-            <StringItem index="8" value="20000"/>
-            <StringItem index="9" value="50000"/>
-            <StringItem index="10" value="100000"/>
-          </StringArray>
-        </Property>
-        <Property name="selectedIndex" type="int" value="3"/>
-        <Property name="name" type="java.lang.String" value="downloadChoice" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="300" y="110" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="speedExplanation">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="speedExplanation.text"/>
-        <Property name="name" type="java.lang.String" value="speedExplanation" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="160" width="570" height="60"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JComboBox" name="uploadkbps">
-      <Properties>
-        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-          <StringArray count="2">
-            <StringItem index="0" value="kbps"/>
-            <StringItem index="1" value="kBps"/>
-          </StringArray>
-        </Property>
-        <Property name="name" type="java.lang.String" value="uploadKbit" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="uploadkbpsActionPerformed"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="470" y="60" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JComboBox" name="downloadkbps">
-      <Properties>
-        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-          <StringArray count="2">
-            <StringItem index="0" value="kbps"/>
-            <StringItem index="1" value="kBps"/>
-          </StringArray>
-        </Property>
-        <Property name="name" type="java.lang.String" value="downloadKbit" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="downloadkbpsActionPerformed"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="470" y="110" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-  </SubComponents>
-</Form>
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.java
deleted file mode 100644
index 335812e2a99a1ce4dcdd5dd7f58eb3d1e3d25b02..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * ProfileSelector.java
- *
- * Created on 3 april 2009, 13:57
- */
-
-package net.i2p.desktopgui.gui;
-
-import java.awt.Point;
-import java.util.Properties;
-import javax.swing.JComboBox;
-import javax.swing.JTextField;
-import net.i2p.desktopgui.persistence.PropertyManager;
-import net.i2p.desktopgui.util.IntegerVerifier;
-
-/**
- *
- * @author  mathias
- */
-public class SpeedSelector extends javax.swing.JFrame {
-
-    /** Creates new form ProfileSelector */
-    public SpeedSelector() {
-        this.props = PropertyManager.getProps();
-        initComponents();
-        initComponentsCustom();
-        initSpeeds(props);
-        this.setVisible(true);
-        this.setLocationRelativeTo(null);
-        this.requestFocus();
-    }
-    
-    public SpeedSelector(Point point) {
-        this();
-        this.setLocation(point);
-    }
-    
-    public void initComponentsCustom() {
-        ((JTextField)uploadChoice.getEditor().getEditorComponent()).setInputVerifier(new IntegerVerifier()); 
-        ((JTextField)downloadChoice.getEditor().getEditorComponent()).setInputVerifier(new IntegerVerifier()); 
-    }
-
-    /** This method is called from within the constructor to
-     * initialize the form.
-     * WARNING: Do NOT modify this code. The content of this method is
-     * always regenerated by the Form Editor.
-     */
-    @SuppressWarnings("unchecked")
-    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
-    private void initComponents() {
-
-        nextButton = new javax.swing.JButton();
-        uploadLabel = new javax.swing.JLabel();
-        downloadLabel = new javax.swing.JLabel();
-        uploadChoice = new javax.swing.JComboBox();
-        downloadChoice = new javax.swing.JComboBox();
-        speedExplanation = new javax.swing.JLabel();
-        uploadkbps = new javax.swing.JComboBox();
-        downloadkbps = new javax.swing.JComboBox();
-
-        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
-        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(SpeedSelector.class);
-        setTitle(resourceMap.getString("Form.title")); // NOI18N
-        setMinimumSize(new java.awt.Dimension(610, 330));
-        setName("Form"); // NOI18N
-        setResizable(false);
-        getContentPane().setLayout(null);
-
-        nextButton.setText(resourceMap.getString("nextButton.text")); // NOI18N
-        nextButton.setMaximumSize(new java.awt.Dimension(72, 29));
-        nextButton.setMinimumSize(new java.awt.Dimension(72, 29));
-        nextButton.setName("nextButton"); // NOI18N
-        nextButton.addMouseListener(new java.awt.event.MouseAdapter() {
-            public void mouseClicked(java.awt.event.MouseEvent evt) {
-                nextButtonMouseClicked(evt);
-            }
-        });
-        getContentPane().add(nextButton);
-        nextButton.setBounds(440, 250, 90, 29);
-
-        uploadLabel.setText(resourceMap.getString("uploadLabel.text")); // NOI18N
-        uploadLabel.setName("uploadLabel"); // NOI18N
-        getContentPane().add(uploadLabel);
-        uploadLabel.setBounds(20, 60, 246, 30);
-
-        downloadLabel.setText(resourceMap.getString("downloadLabel.text")); // NOI18N
-        downloadLabel.setName("downloadLabel"); // NOI18N
-        getContentPane().add(downloadLabel);
-        downloadLabel.setBounds(20, 110, 263, 30);
-
-        uploadChoice.setEditable(true);
-        uploadChoice.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "100", "200", "500", "1000", "2000", "4000", "8000", "10000", "20000", "50000", "100000" }));
-        uploadChoice.setSelectedIndex(3);
-        uploadChoice.setName("uploadChoice"); // NOI18N
-        getContentPane().add(uploadChoice);
-        uploadChoice.setBounds(300, 60, 154, 27);
-
-        downloadChoice.setEditable(true);
-        downloadChoice.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "100", "200", "500", "1000", "2000", "4000", "8000", "10000", "20000", "50000", "100000" }));
-        downloadChoice.setSelectedIndex(3);
-        downloadChoice.setName("downloadChoice"); // NOI18N
-        getContentPane().add(downloadChoice);
-        downloadChoice.setBounds(300, 110, 154, 27);
-
-        speedExplanation.setText(resourceMap.getString("speedExplanation.text")); // NOI18N
-        speedExplanation.setName("speedExplanation"); // NOI18N
-        getContentPane().add(speedExplanation);
-        speedExplanation.setBounds(20, 160, 570, 60);
-
-        uploadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
-        uploadkbps.setName("uploadKbit"); // NOI18N
-        uploadkbps.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                uploadkbpsActionPerformed(evt);
-            }
-        });
-        getContentPane().add(uploadkbps);
-        uploadkbps.setBounds(470, 60, 68, 27);
-
-        downloadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
-        downloadkbps.setName("downloadKbit"); // NOI18N
-        downloadkbps.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                downloadkbpsActionPerformed(evt);
-            }
-        });
-        getContentPane().add(downloadkbps);
-        downloadkbps.setBounds(470, 110, 68, 27);
-
-        pack();
-    }// </editor-fold>//GEN-END:initComponents
-
-private void nextButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_nextButtonMouseClicked
-    if(uploadkbps.getSelectedIndex() == KILOBIT)
-        props.setProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE, uploadChoice.getSelectedItem().toString());
-    else
-        props.setProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE, "" + Integer.parseInt(uploadChoice.getSelectedItem().toString())*8);
-    if(downloadkbps.getSelectedIndex() == KILOBIT)
-        props.setProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE, downloadChoice.getSelectedItem().toString());
-    else
-        props.setProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE, "" + Integer.parseInt(downloadChoice.getSelectedItem().toString())*8);
-    PropertyManager.saveProps(props);
-    new SpeedSelector2(this.getLocationOnScreen());
-    this.dispose();
-}//GEN-LAST:event_nextButtonMouseClicked
-
-private void uploadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadkbpsActionPerformed
-    kbpsSwitchPerformed(uploadkbps, uploadChoice);
-}//GEN-LAST:event_uploadkbpsActionPerformed
-
-private void downloadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downloadkbpsActionPerformed
-    kbpsSwitchPerformed(downloadkbps, downloadChoice);
-}//GEN-LAST:event_downloadkbpsActionPerformed
-
-private void kbpsSwitchPerformed(JComboBox kbps, JComboBox speed) {
-    int index = kbps.getSelectedIndex();
-    int previous = Integer.parseInt(speed.getSelectedItem().toString());
-    if(index == KILOBIT) {
-        speed.setSelectedItem("" + previous*8);
-    }
-    else {
-        speed.setSelectedItem("" + previous/8);
-    }
-}
-
-private void initSpeeds(Properties props) {
-    String up = props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE);
-    String down = props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE);
-    
-    if(up == null)
-        props.setProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE, "1000");
-    if(down == null)
-        props.setProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE, "1000");
-    
-    uploadChoice.setSelectedItem(props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE));
-    downloadChoice.setSelectedItem(props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE));
-}
-
-
-    // Variables declaration - do not modify//GEN-BEGIN:variables
-    private javax.swing.JComboBox downloadChoice;
-    private javax.swing.JLabel downloadLabel;
-    private javax.swing.JComboBox downloadkbps;
-    private javax.swing.JButton nextButton;
-    private javax.swing.JLabel speedExplanation;
-    private javax.swing.JComboBox uploadChoice;
-    private javax.swing.JLabel uploadLabel;
-    private javax.swing.JComboBox uploadkbps;
-    // End of variables declaration//GEN-END:variables
-
-    Properties props;
-    private static final int KILOBIT = 0;
-    private static final int KILOBYTE = 1;
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.form
deleted file mode 100644
index 54f5fa7262dc3a23f793f4180dc0d1acb83f6cb4..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.form
+++ /dev/null
@@ -1,118 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
-  <NonVisualComponents>
-    <Component class="javax.swing.ButtonGroup" name="buttonGroup1">
-    </Component>
-  </NonVisualComponents>
-  <Properties>
-    <Property name="defaultCloseOperation" type="int" value="2"/>
-    <Property name="title" type="java.lang.String" resourceKey="Form.title"/>
-    <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
-      <Dimension value="[610, 330]"/>
-    </Property>
-    <Property name="name" type="java.lang.String" value="Form" noResource="true"/>
-    <Property name="resizable" type="boolean" value="false"/>
-  </Properties>
-  <SyntheticProperties>
-    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
-  </SyntheticProperties>
-  <AuxValues>
-    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
-    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
-    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
-    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
-    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,2,105"/>
-  </AuxValues>
-
-  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
-    <Property name="useNullLayout" type="boolean" value="true"/>
-  </Layout>
-  <SubComponents>
-    <Component class="javax.swing.JButton" name="nextButton">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="nextButton.text"/>
-        <Property name="name" type="java.lang.String" value="nextButton" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="nextButtonMouseClicked"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="440" y="250" width="90" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JButton" name="returnButton">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="returnButton.text"/>
-        <Property name="name" type="java.lang.String" value="returnButton" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="returnButtonMouseClicked"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="336" y="250" width="90" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="questionLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="questionLabel.text"/>
-        <Property name="name" type="java.lang.String" value="questionLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="30" y="40" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JRadioButton" name="browseButton">
-      <Properties>
-        <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
-          <ComponentRef name="buttonGroup1"/>
-        </Property>
-        <Property name="text" type="java.lang.String" resourceKey="browseButton.text"/>
-        <Property name="actionCommand" type="java.lang.String" resourceKey="browseButton.actionCommand"/>
-        <Property name="name" type="java.lang.String" value="browseButton" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="40" y="120" width="-1" height="40"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JRadioButton" name="downloadButton">
-      <Properties>
-        <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
-          <ComponentRef name="buttonGroup1"/>
-        </Property>
-        <Property name="text" type="java.lang.String" resourceKey="downloadButton.text"/>
-        <Property name="actionCommand" type="java.lang.String" resourceKey="downloadButton.actionCommand"/>
-        <Property name="name" type="java.lang.String" value="downloadButton" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="40" y="70" width="-1" height="40"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="jLabel1">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="jLabel1.text"/>
-        <Property name="name" type="java.lang.String" value="jLabel1" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="30" y="170" width="530" height="70"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-  </SubComponents>
-</Form>
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.java
deleted file mode 100644
index 772d16918a58a6edf6d65601f708dc8768c35c01..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * ProfileSelector2.java
- *
- * Created on 3 april 2009, 14:36
- */
-
-package net.i2p.desktopgui.gui;
-
-import java.awt.Point;
-import java.util.Enumeration;
-import java.util.Properties;
-import javax.swing.AbstractButton;
-import net.i2p.desktopgui.persistence.PropertyManager;
-
-/**
- *
- * @author  mathias
- */
-public class SpeedSelector2 extends javax.swing.JFrame {
-    Properties props;
-
-    /** Creates new form ProfileSelector2 */
-    public SpeedSelector2(Point point) {
-        this.props = PropertyManager.getProps();
-        initComponents();
-        this.setLocation(point);
-        loadButtonSelection();
-        this.setVisible(true);
-        this.requestFocus();
-    }
-
-    /** This method is called from within the constructor to
-     * initialize the form.
-     * WARNING: Do NOT modify this code. The content of this method is
-     * always regenerated by the Form Editor.
-     */
-    @SuppressWarnings("unchecked")
-    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
-    private void initComponents() {
-
-        buttonGroup1 = new javax.swing.ButtonGroup();
-        nextButton = new javax.swing.JButton();
-        returnButton = new javax.swing.JButton();
-        questionLabel = new javax.swing.JLabel();
-        browseButton = new javax.swing.JRadioButton();
-        downloadButton = new javax.swing.JRadioButton();
-        jLabel1 = new javax.swing.JLabel();
-
-        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
-        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(SpeedSelector2.class);
-        setTitle(resourceMap.getString("Form.title")); // NOI18N
-        setMinimumSize(new java.awt.Dimension(610, 330));
-        setName("Form"); // NOI18N
-        setResizable(false);
-        getContentPane().setLayout(null);
-
-        nextButton.setText(resourceMap.getString("nextButton.text")); // NOI18N
-        nextButton.setName("nextButton"); // NOI18N
-        nextButton.addMouseListener(new java.awt.event.MouseAdapter() {
-            public void mouseClicked(java.awt.event.MouseEvent evt) {
-                nextButtonMouseClicked(evt);
-            }
-        });
-        getContentPane().add(nextButton);
-        nextButton.setBounds(440, 250, 90, 29);
-
-        returnButton.setText(resourceMap.getString("returnButton.text")); // NOI18N
-        returnButton.setName("returnButton"); // NOI18N
-        returnButton.addMouseListener(new java.awt.event.MouseAdapter() {
-            public void mouseClicked(java.awt.event.MouseEvent evt) {
-                returnButtonMouseClicked(evt);
-            }
-        });
-        getContentPane().add(returnButton);
-        returnButton.setBounds(336, 250, 90, 29);
-
-        questionLabel.setText(resourceMap.getString("questionLabel.text")); // NOI18N
-        questionLabel.setName("questionLabel"); // NOI18N
-        getContentPane().add(questionLabel);
-        questionLabel.setBounds(30, 40, 265, 17);
-
-        buttonGroup1.add(browseButton);
-        browseButton.setText(resourceMap.getString("browseButton.text")); // NOI18N
-        browseButton.setActionCommand(resourceMap.getString("browseButton.actionCommand")); // NOI18N
-        browseButton.setName("browseButton"); // NOI18N
-        getContentPane().add(browseButton);
-        browseButton.setBounds(40, 120, 520, 40);
-
-        buttonGroup1.add(downloadButton);
-        downloadButton.setText(resourceMap.getString("downloadButton.text")); // NOI18N
-        downloadButton.setActionCommand(resourceMap.getString("downloadButton.actionCommand")); // NOI18N
-        downloadButton.setName("downloadButton"); // NOI18N
-        getContentPane().add(downloadButton);
-        downloadButton.setBounds(40, 70, 499, 40);
-
-        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
-        jLabel1.setName("jLabel1"); // NOI18N
-        getContentPane().add(jLabel1);
-        jLabel1.setBounds(30, 170, 530, 70);
-
-        pack();
-    }// </editor-fold>//GEN-END:initComponents
-
-private void returnButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_returnButtonMouseClicked
-    saveButtonSelection();
-    PropertyManager.saveProps(props);
-    new SpeedSelector(this.getLocationOnScreen());
-    this.dispose();
-}//GEN-LAST:event_returnButtonMouseClicked
-
-private void nextButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_nextButtonMouseClicked
-    saveButtonSelection();
-    PropertyManager.saveProps(props);
-    new SpeedSelector3(this.getLocationOnScreen(), this.getSize());
-    this.dispose();
-}//GEN-LAST:event_nextButtonMouseClicked
-
-private void loadButtonSelection() {
-    
-    Enumeration<AbstractButton> elements = buttonGroup1.getElements();
-    while(elements.hasMoreElements()) {
-        AbstractButton button = elements.nextElement();
-        if(button == null)
-            continue;
-        if(props.getProperty(SpeedSelectorConstants.USERTYPE) == null)
-            break;
-        String type = button.getActionCommand();
-        if(type.equals(props.getProperty(SpeedSelectorConstants.USERTYPE))) {
-            button.setSelected(true);
-            break;
-        }
-    }
-}
-
-private void saveButtonSelection() {
-    Enumeration<AbstractButton> elements = buttonGroup1.getElements();
-    while(elements.hasMoreElements()) {
-        AbstractButton button = elements.nextElement();
-        if(button == null)
-            continue;
-        if(button.isSelected()) {
-            String type = button.getActionCommand();
-            props.setProperty(SpeedSelectorConstants.USERTYPE, type);
-            break;
-        }
-    }
-}
-
-    // Variables declaration - do not modify//GEN-BEGIN:variables
-    private javax.swing.JRadioButton browseButton;
-    private javax.swing.ButtonGroup buttonGroup1;
-    private javax.swing.JRadioButton downloadButton;
-    private javax.swing.JLabel jLabel1;
-    private javax.swing.JButton nextButton;
-    private javax.swing.JLabel questionLabel;
-    private javax.swing.JButton returnButton;
-    // End of variables declaration//GEN-END:variables
-
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.form
deleted file mode 100644
index 8e4aa5b4e8d19b460b4eb3a21575ac3a309fa496..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.form
+++ /dev/null
@@ -1,338 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
-  <Properties>
-    <Property name="defaultCloseOperation" type="int" value="2"/>
-    <Property name="title" type="java.lang.String" resourceKey="Form.title"/>
-    <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
-      <Dimension value="[670, 330]"/>
-    </Property>
-    <Property name="name" type="java.lang.String" value="Form" noResource="true"/>
-    <Property name="resizable" type="boolean" value="false"/>
-  </Properties>
-  <SyntheticProperties>
-    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
-  </SyntheticProperties>
-  <AuxValues>
-    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
-    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
-    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
-    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
-    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,74,0,0,2,-108"/>
-  </AuxValues>
-
-  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
-    <Property name="useNullLayout" type="boolean" value="true"/>
-  </Layout>
-  <SubComponents>
-    <Component class="javax.swing.JButton" name="finishButton">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="finishButton.text"/>
-        <Property name="name" type="java.lang.String" value="finishButton" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="finishButtonMouseClicked"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="440" y="250" width="90" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JButton" name="previousButton">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="previousButton.text"/>
-        <Property name="name" type="java.lang.String" value="previousButton" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="previousButtonMouseClicked"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="336" y="250" width="90" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="settingsInfo">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="settingsInfo.text"/>
-        <Property name="name" type="java.lang.String" value="settingsInfo" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="30" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="uploadLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="uploadLabel.text"/>
-        <Property name="name" type="java.lang.String" value="uploadLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="70" width="140" height="30"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="downloadLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="downloadLabel.text"/>
-        <Property name="name" type="java.lang.String" value="downloadLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="340" y="70" width="160" height="30"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="uploadBurstLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="uploadBurstLabel.text"/>
-        <Property name="name" type="java.lang.String" value="uploadBurstLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="110" width="140" height="30"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="downloadBurstLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="downloadBurstLabel.text"/>
-        <Property name="name" type="java.lang.String" value="downloadBurstLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="340" y="110" width="160" height="30"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="uploadUsageLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="uploadUsageLabel.text"/>
-        <Property name="name" type="java.lang.String" value="uploadUsageLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="150" width="140" height="30"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="downloadUsageLabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/>
-        <Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="340" y="150" width="160" height="30"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JTextField" name="uploadField">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="uploadField.text"/>
-        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
-          <Dimension value="[77, 27]"/>
-        </Property>
-        <Property name="name" type="java.lang.String" value="uploadField" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedFieldKeyReleased"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="160" y="70" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JTextField" name="uploadBurstField">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="uploadBurstField.text"/>
-        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
-          <Dimension value="[77, 27]"/>
-        </Property>
-        <Property name="name" type="java.lang.String" value="uploadBurstField" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="160" y="110" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JTextField" name="downloadField">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="downloadField.text"/>
-        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
-          <Dimension value="[77, 27]"/>
-        </Property>
-        <Property name="name" type="java.lang.String" value="downloadField" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedFieldKeyReleased"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="500" y="70" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JTextField" name="downloadBurstField">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="downloadBurstField.text"/>
-        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
-          <Dimension value="[77, 27]"/>
-        </Property>
-        <Property name="name" type="java.lang.String" value="downloadBurstField" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="500" y="110" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JComboBox" name="kbpsBurstDownload">
-      <Properties>
-        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-          <StringArray count="2">
-            <StringItem index="0" value="kbps"/>
-            <StringItem index="1" value="kBps"/>
-          </StringArray>
-        </Property>
-        <Property name="name" type="java.lang.String" value="kbpsBurstDownload" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsBurstDownloadActionPerformed"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="580" y="110" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JComboBox" name="kbpsUpload">
-      <Properties>
-        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-          <StringArray count="2">
-            <StringItem index="0" value="kbps"/>
-            <StringItem index="1" value="kBps"/>
-          </StringArray>
-        </Property>
-        <Property name="name" type="java.lang.String" value="kbpsUpload" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsUploadActionPerformed"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="240" y="70" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JComboBox" name="kbpsBurstUpload">
-      <Properties>
-        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-          <StringArray count="2">
-            <StringItem index="0" value="kbps"/>
-            <StringItem index="1" value="kBps"/>
-          </StringArray>
-        </Property>
-        <Property name="name" type="java.lang.String" value="kbpsBurstUpload" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsBurstUploadActionPerformed"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="240" y="110" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JComboBox" name="kbpsDownload">
-      <Properties>
-        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
-          <StringArray count="2">
-            <StringItem index="0" value="kbps"/>
-            <StringItem index="1" value="kBps"/>
-          </StringArray>
-        </Property>
-        <Property name="name" type="java.lang.String" value="kbpsDownload" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsDownloadActionPerformed"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="580" y="70" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="uploadGB">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="uploadUsageLabel.text"/>
-        <Property name="name" type="java.lang.String" value="uploadUsageLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="240" y="150" width="45" height="30"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JTextField" name="uploadMonth">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="uploadMonth.text"/>
-        <Property name="name" type="java.lang.String" value="uploadMonth" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="160" y="150" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JTextField" name="downloadMonth">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="downloadMonth.text"/>
-        <Property name="name" type="java.lang.String" value="downloadMonth" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/>
-      </Events>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="500" y="150" width="-1" height="-1"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="downloadGB">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/>
-        <Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="580" y="150" width="40" height="30"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-    <Component class="javax.swing.JLabel" name="explanation">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="explanation.text"/>
-        <Property name="name" type="java.lang.String" value="explanation" noResource="true"/>
-      </Properties>
-      <Constraints>
-        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
-          <AbsoluteConstraints x="20" y="180" width="600" height="70"/>
-        </Constraint>
-      </Constraints>
-    </Component>
-  </SubComponents>
-</Form>
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.java
deleted file mode 100644
index 933ad3ff2f9489714d1db00c73be96c466d86580..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.java
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * ProfileSelector3.java
- *
- * Created on 3 april 2009, 15:17
- */
-
-package net.i2p.desktopgui.gui;
-
-import java.awt.Dimension;
-import java.awt.Point;
-import java.util.Properties;
-import javax.swing.JComboBox;
-import javax.swing.JTextField;
-import net.i2p.desktopgui.persistence.PropertyManager;
-import net.i2p.desktopgui.router.configuration.SpeedHandler;
-import net.i2p.desktopgui.router.configuration.SpeedHelper;
-
-/**
- *
- * @author  mathias
- */
-public class SpeedSelector3 extends javax.swing.JFrame {
-    Properties props;
-
-    /** Creates new form ProfileSelector3 */
-    public SpeedSelector3(Point point, Dimension dimension) {
-        this.props = PropertyManager.getProps();
-        initComponents();
-        this.setLocation(point);
-        this.setSize(dimension);
-        initSpeeds();
-        initUsage();
-        this.setVisible(true);
-        this.requestFocus();
-    }
-
-    /** This method is called from within the constructor to
-     * initialize the form.
-     * WARNING: Do NOT modify this code. The content of this method is
-     * always regenerated by the Form Editor.
-     */
-    @SuppressWarnings("unchecked")
-    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
-    private void initComponents() {
-
-        finishButton = new javax.swing.JButton();
-        previousButton = new javax.swing.JButton();
-        settingsInfo = new javax.swing.JLabel();
-        uploadLabel = new javax.swing.JLabel();
-        downloadLabel = new javax.swing.JLabel();
-        uploadBurstLabel = new javax.swing.JLabel();
-        downloadBurstLabel = new javax.swing.JLabel();
-        uploadUsageLabel = new javax.swing.JLabel();
-        downloadUsageLabel = new javax.swing.JLabel();
-        uploadField = new javax.swing.JTextField();
-        uploadBurstField = new javax.swing.JTextField();
-        downloadField = new javax.swing.JTextField();
-        downloadBurstField = new javax.swing.JTextField();
-        kbpsBurstDownload = new javax.swing.JComboBox();
-        kbpsUpload = new javax.swing.JComboBox();
-        kbpsBurstUpload = new javax.swing.JComboBox();
-        kbpsDownload = new javax.swing.JComboBox();
-        uploadGB = new javax.swing.JLabel();
-        uploadMonth = new javax.swing.JTextField();
-        downloadMonth = new javax.swing.JTextField();
-        downloadGB = new javax.swing.JLabel();
-        explanation = new javax.swing.JLabel();
-
-        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
-        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(SpeedSelector3.class);
-        setTitle(resourceMap.getString("Form.title")); // NOI18N
-        setMinimumSize(new java.awt.Dimension(670, 330));
-        setName("Form"); // NOI18N
-        setResizable(false);
-        getContentPane().setLayout(null);
-
-        finishButton.setText(resourceMap.getString("finishButton.text")); // NOI18N
-        finishButton.setName("finishButton"); // NOI18N
-        finishButton.addMouseListener(new java.awt.event.MouseAdapter() {
-            public void mouseClicked(java.awt.event.MouseEvent evt) {
-                finishButtonMouseClicked(evt);
-            }
-        });
-        getContentPane().add(finishButton);
-        finishButton.setBounds(440, 250, 90, 29);
-
-        previousButton.setText(resourceMap.getString("previousButton.text")); // NOI18N
-        previousButton.setName("previousButton"); // NOI18N
-        previousButton.addMouseListener(new java.awt.event.MouseAdapter() {
-            public void mouseClicked(java.awt.event.MouseEvent evt) {
-                previousButtonMouseClicked(evt);
-            }
-        });
-        getContentPane().add(previousButton);
-        previousButton.setBounds(336, 250, 90, 29);
-
-        settingsInfo.setText(resourceMap.getString("settingsInfo.text")); // NOI18N
-        settingsInfo.setName("settingsInfo"); // NOI18N
-        getContentPane().add(settingsInfo);
-        settingsInfo.setBounds(20, 30, 532, 17);
-
-        uploadLabel.setText(resourceMap.getString("uploadLabel.text")); // NOI18N
-        uploadLabel.setName("uploadLabel"); // NOI18N
-        getContentPane().add(uploadLabel);
-        uploadLabel.setBounds(20, 70, 140, 30);
-
-        downloadLabel.setText(resourceMap.getString("downloadLabel.text")); // NOI18N
-        downloadLabel.setName("downloadLabel"); // NOI18N
-        getContentPane().add(downloadLabel);
-        downloadLabel.setBounds(340, 70, 160, 30);
-
-        uploadBurstLabel.setText(resourceMap.getString("uploadBurstLabel.text")); // NOI18N
-        uploadBurstLabel.setName("uploadBurstLabel"); // NOI18N
-        getContentPane().add(uploadBurstLabel);
-        uploadBurstLabel.setBounds(20, 110, 140, 30);
-
-        downloadBurstLabel.setText(resourceMap.getString("downloadBurstLabel.text")); // NOI18N
-        downloadBurstLabel.setName("downloadBurstLabel"); // NOI18N
-        getContentPane().add(downloadBurstLabel);
-        downloadBurstLabel.setBounds(340, 110, 160, 30);
-
-        uploadUsageLabel.setText(resourceMap.getString("uploadUsageLabel.text")); // NOI18N
-        uploadUsageLabel.setName("uploadUsageLabel"); // NOI18N
-        getContentPane().add(uploadUsageLabel);
-        uploadUsageLabel.setBounds(20, 150, 140, 30);
-
-        downloadUsageLabel.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N
-        downloadUsageLabel.setName("downloadUsageLabel"); // NOI18N
-        getContentPane().add(downloadUsageLabel);
-        downloadUsageLabel.setBounds(340, 150, 160, 30);
-
-        uploadField.setText(resourceMap.getString("uploadField.text")); // NOI18N
-        uploadField.setMinimumSize(new java.awt.Dimension(77, 27));
-        uploadField.setName("uploadField"); // NOI18N
-        uploadField.addKeyListener(new java.awt.event.KeyAdapter() {
-            public void keyReleased(java.awt.event.KeyEvent evt) {
-                speedFieldKeyReleased(evt);
-            }
-        });
-        getContentPane().add(uploadField);
-        uploadField.setBounds(160, 70, 77, 27);
-
-        uploadBurstField.setText(resourceMap.getString("uploadBurstField.text")); // NOI18N
-        uploadBurstField.setMinimumSize(new java.awt.Dimension(77, 27));
-        uploadBurstField.setName("uploadBurstField"); // NOI18N
-        getContentPane().add(uploadBurstField);
-        uploadBurstField.setBounds(160, 110, 77, 27);
-
-        downloadField.setText(resourceMap.getString("downloadField.text")); // NOI18N
-        downloadField.setMinimumSize(new java.awt.Dimension(77, 27));
-        downloadField.setName("downloadField"); // NOI18N
-        downloadField.addKeyListener(new java.awt.event.KeyAdapter() {
-            public void keyReleased(java.awt.event.KeyEvent evt) {
-                speedFieldKeyReleased(evt);
-            }
-        });
-        getContentPane().add(downloadField);
-        downloadField.setBounds(500, 70, 77, 27);
-
-        downloadBurstField.setText(resourceMap.getString("downloadBurstField.text")); // NOI18N
-        downloadBurstField.setMinimumSize(new java.awt.Dimension(77, 27));
-        downloadBurstField.setName("downloadBurstField"); // NOI18N
-        getContentPane().add(downloadBurstField);
-        downloadBurstField.setBounds(500, 110, 77, 27);
-
-        kbpsBurstDownload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
-        kbpsBurstDownload.setName("kbpsBurstDownload"); // NOI18N
-        kbpsBurstDownload.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                kbpsBurstDownloadActionPerformed(evt);
-            }
-        });
-        getContentPane().add(kbpsBurstDownload);
-        kbpsBurstDownload.setBounds(580, 110, 68, 27);
-
-        kbpsUpload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
-        kbpsUpload.setName("kbpsUpload"); // NOI18N
-        kbpsUpload.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                kbpsUploadActionPerformed(evt);
-            }
-        });
-        getContentPane().add(kbpsUpload);
-        kbpsUpload.setBounds(240, 70, 68, 27);
-
-        kbpsBurstUpload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
-        kbpsBurstUpload.setName("kbpsBurstUpload"); // NOI18N
-        kbpsBurstUpload.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                kbpsBurstUploadActionPerformed(evt);
-            }
-        });
-        getContentPane().add(kbpsBurstUpload);
-        kbpsBurstUpload.setBounds(240, 110, 68, 27);
-
-        kbpsDownload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
-        kbpsDownload.setName("kbpsDownload"); // NOI18N
-        kbpsDownload.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                kbpsDownloadActionPerformed(evt);
-            }
-        });
-        getContentPane().add(kbpsDownload);
-        kbpsDownload.setBounds(580, 70, 68, 27);
-
-        uploadGB.setText(resourceMap.getString("uploadUsageLabel.text")); // NOI18N
-        uploadGB.setName("uploadUsageLabel"); // NOI18N
-        getContentPane().add(uploadGB);
-        uploadGB.setBounds(240, 150, 45, 30);
-
-        uploadMonth.setText(resourceMap.getString("uploadMonth.text")); // NOI18N
-        uploadMonth.setName("uploadMonth"); // NOI18N
-        uploadMonth.addKeyListener(new java.awt.event.KeyAdapter() {
-            public void keyReleased(java.awt.event.KeyEvent evt) {
-                monthKeyReleased(evt);
-            }
-        });
-        getContentPane().add(uploadMonth);
-        uploadMonth.setBounds(160, 150, 77, 27);
-
-        downloadMonth.setText(resourceMap.getString("downloadMonth.text")); // NOI18N
-        downloadMonth.setName("downloadMonth"); // NOI18N
-        downloadMonth.addKeyListener(new java.awt.event.KeyAdapter() {
-            public void keyReleased(java.awt.event.KeyEvent evt) {
-                monthKeyReleased(evt);
-            }
-        });
-        getContentPane().add(downloadMonth);
-        downloadMonth.setBounds(500, 150, 77, 27);
-
-        downloadGB.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N
-        downloadGB.setName("downloadUsageLabel"); // NOI18N
-        getContentPane().add(downloadGB);
-        downloadGB.setBounds(580, 150, 40, 30);
-
-        explanation.setText(resourceMap.getString("explanation.text")); // NOI18N
-        explanation.setName("explanation"); // NOI18N
-        getContentPane().add(explanation);
-        explanation.setBounds(20, 180, 600, 70);
-
-        pack();
-    }// </editor-fold>//GEN-END:initComponents
-
-private void previousButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_previousButtonMouseClicked
-    saveSpeeds();
-    PropertyManager.saveProps(props);
-    new SpeedSelector2(this.getLocationOnScreen());
-    this.dispose();
-}//GEN-LAST:event_previousButtonMouseClicked
-
-private void finishButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_finishButtonMouseClicked
-    saveSpeeds();
-    PropertyManager.saveProps(props);
-    
-    int maxDownload = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXDOWNLOAD));
-    int maxUpload = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXUPLOAD));
-    int maxUploadBurst = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXUPLOADBURST));
-    int maxDownloadBurst = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXDOWNLOADBURST));
-    
-     //Working in kB, not kb!
-    SpeedHandler.setInboundBandwidth(maxDownload/8);
-    SpeedHandler.setOutboundBandwidth(maxUpload/8);
-    SpeedHandler.setInboundBurstBandwidth(maxDownloadBurst/8);
-    SpeedHandler.setOutboundBurstBandwidth(maxUploadBurst/8);
-    
-    this.dispose();
-}//GEN-LAST:event_finishButtonMouseClicked
-
-private void speedFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_speedFieldKeyReleased
-    try {
-        String upload = "";
-        if(kbpsUpload.getSelectedIndex() == KILOBIT)
-            upload = uploadField.getText();
-        else
-            upload = "" + Integer.parseInt(uploadField.getText())*8;
-        String download = "";
-        if(kbpsDownload.getSelectedIndex() == KILOBIT)
-            download = downloadField.getText();
-        else
-            download = "" + Integer.parseInt(downloadField.getText())*8;
-        initUsage(upload, download);
-    }
-    catch(NumberFormatException e) {
-        return;
-    }
-}//GEN-LAST:event_speedFieldKeyReleased
-
-private void kbpsUploadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsUploadActionPerformed
-    kbpsSwitchPerformed(kbpsUpload, uploadField);
-}//GEN-LAST:event_kbpsUploadActionPerformed
-
-private void kbpsBurstUploadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsBurstUploadActionPerformed
-    kbpsSwitchPerformed(kbpsBurstUpload, uploadBurstField);
-}//GEN-LAST:event_kbpsBurstUploadActionPerformed
-
-private void kbpsDownloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsDownloadActionPerformed
-    kbpsSwitchPerformed(kbpsDownload, downloadField);
-}//GEN-LAST:event_kbpsDownloadActionPerformed
-
-private void kbpsBurstDownloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsBurstDownloadActionPerformed
-    kbpsSwitchPerformed(kbpsBurstDownload, downloadBurstField);
-}//GEN-LAST:event_kbpsBurstDownloadActionPerformed
-
-private void monthKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_monthKeyReleased
-    try {
-        int uploadMonthValue = Integer.parseInt(uploadMonth.getText());
-        int downloadMonthValue = Integer.parseInt(downloadMonth.getText());
-        
-        String upload = "";
-        String burstUpload = "";
-        String download = "";
-        String burstDownload = "";
-        
-        if(kbpsUpload.getSelectedIndex() == KILOBIT)
-            upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue)*8; //kbit
-        else
-            upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue); //kbyte
-        
-        if(kbpsBurstUpload.getSelectedIndex() == KILOBIT)
-            burstUpload = "" + SpeedHelper.calculateSpeed(uploadMonthValue)*8; //kbit
-        else
-            burstUpload = "" + SpeedHelper.calculateSpeed(uploadMonthValue); //kbyte
-        
-        if(kbpsDownload.getSelectedIndex() == KILOBIT)
-            download = "" + SpeedHelper.calculateSpeed(downloadMonthValue)*8; //kbit
-        else
-            download = "" + SpeedHelper.calculateSpeed(downloadMonthValue); //kbyte
-        
-        if(kbpsBurstDownload.getSelectedIndex() == KILOBIT)
-            burstDownload = "" + SpeedHelper.calculateSpeed(downloadMonthValue)*8; //kbit
-        else
-            burstDownload = "" + SpeedHelper.calculateSpeed(downloadMonthValue); //kbyte
-        
-        initSpeeds(upload, burstUpload, download, burstDownload);
-    }
-    catch(NumberFormatException e) {
-        e.printStackTrace();
-        return;
-    }
-}//GEN-LAST:event_monthKeyReleased
-
-private void kbpsSwitchPerformed(JComboBox kbps, JTextField speed) {
-    int index = kbps.getSelectedIndex();
-    int previous = Integer.parseInt(speed.getText());
-    if(index == KILOBIT) {
-        speed.setText("" + previous*8);
-    }
-    else {
-        speed.setText("" + previous/8);
-    }
-}
-
-    protected void initSpeeds() {
-        String up = "" + SpeedHelper.calculateSpeed(
-                props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE));
-        String upBurst = "" + SpeedHelper.calculateSpeed(
-                props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE));
-        String down = "" + SpeedHelper.calculateSpeed(
-                props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE));
-        String downBurst = "" + SpeedHelper.calculateSpeed(
-                props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE));
-        String userType = props.getProperty(SpeedSelectorConstants.USERTYPE);
-        
-        initSpeeds(up, upBurst, down, downBurst);
-    }
-    
-    protected void initSpeeds(String up, String upBurst, String down, String downBurst) {
-        uploadField.setText(up);
-        uploadBurstField.setText(upBurst);
-        downloadField.setText(down);
-        downloadBurstField.setText(downBurst);
-    }
-    
-    protected void saveSpeeds() {
-        if(kbpsUpload.getSelectedIndex() == KILOBIT)
-            props.setProperty(SpeedSelectorConstants.MAXUPLOAD, uploadField.getText());
-        else
-            props.setProperty(SpeedSelectorConstants.MAXUPLOAD, "" + Integer.parseInt(uploadField.getText())*8);
-        if(kbpsBurstUpload.getSelectedIndex() == KILOBIT)
-            props.setProperty(SpeedSelectorConstants.MAXUPLOADBURST, uploadBurstField.getText());
-        else
-            props.setProperty(SpeedSelectorConstants.MAXUPLOADBURST, "" + Integer.parseInt(uploadBurstField.getText())*8);
-        if(kbpsDownload.getSelectedIndex() == KILOBIT)
-            props.setProperty(SpeedSelectorConstants.MAXDOWNLOAD, downloadField.getText());
-        else
-            props.setProperty(SpeedSelectorConstants.MAXDOWNLOAD, "" + Integer.parseInt(downloadField.getText())*8);
-        if(kbpsBurstDownload.getSelectedIndex() == KILOBIT)
-            props.setProperty(SpeedSelectorConstants.MAXDOWNLOADBURST, downloadBurstField.getText());
-        else
-            props.setProperty(SpeedSelectorConstants.MAXDOWNLOADBURST, "" + Integer.parseInt(downloadBurstField.getText())*8);
-    }
-    
-    protected void initUsage(String upload, String download) {
-        uploadMonth.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(upload)/8));
-        downloadMonth.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(download)/8));
-    }
-    
-    protected void initUsage() {
-        String upload = "";
-        if(kbpsUpload.getSelectedIndex() == KILOBIT)
-            upload = uploadField.getText();
-        else
-            upload = "" + Integer.parseInt(uploadField.getText())/8;
-        String download = "";
-        if(kbpsDownload.getSelectedIndex() == KILOBIT)
-            download = downloadField.getText();
-        else
-            download = "" + Integer.parseInt(downloadField.getText())/8;
-        initUsage(upload, download);
-    }
-
-    // Variables declaration - do not modify//GEN-BEGIN:variables
-    private javax.swing.JTextField downloadBurstField;
-    private javax.swing.JLabel downloadBurstLabel;
-    private javax.swing.JTextField downloadField;
-    private javax.swing.JLabel downloadGB;
-    private javax.swing.JLabel downloadLabel;
-    private javax.swing.JTextField downloadMonth;
-    private javax.swing.JLabel downloadUsageLabel;
-    private javax.swing.JLabel explanation;
-    private javax.swing.JButton finishButton;
-    private javax.swing.JComboBox kbpsBurstDownload;
-    private javax.swing.JComboBox kbpsBurstUpload;
-    private javax.swing.JComboBox kbpsDownload;
-    private javax.swing.JComboBox kbpsUpload;
-    private javax.swing.JButton previousButton;
-    private javax.swing.JLabel settingsInfo;
-    private javax.swing.JTextField uploadBurstField;
-    private javax.swing.JLabel uploadBurstLabel;
-    private javax.swing.JTextField uploadField;
-    private javax.swing.JLabel uploadGB;
-    private javax.swing.JLabel uploadLabel;
-    private javax.swing.JTextField uploadMonth;
-    private javax.swing.JLabel uploadUsageLabel;
-    // End of variables declaration//GEN-END:variables
-
-    private static final int KILOBIT = 0;
-    private static final int KILOBYTE = 1;
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelectorConstants.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelectorConstants.java
deleted file mode 100644
index 1088f6957f27bdba770c02a26ecb3f0fee19c1a1..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelectorConstants.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.i2p.desktopgui.gui;
-
-/**
- *
- * @author mathias
- */
-public class SpeedSelectorConstants {
-    ///Maximum upload speed for the internet connection
-    public static final String MAXUPLOADCAPABLE = "maxUploadCapable";
-    ///Maximum download speed for the internet connection
-    public static final String MAXDOWNLOADCAPABLE = "maxDownloadCapable";
-    
-    //User profile type: what behaviour does this user have while using IP2?
-    public static final String USERTYPE = "userType";
-    
-    //Maximum upload speed for I2P
-    public static final String MAXUPLOAD = "maxUpload";
-    //Maximum upload burst speed for I2P
-    public static final String MAXUPLOADBURST = "maxUploadBurst";
-    
-    //Maximum download speed for I2P
-    public static final String MAXDOWNLOAD = "maxDownload";
-    //Maximum download burst speed for I2P
-    public static final String MAXDOWNLOADBURST = "maxDownloadBurst";
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/Tray.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/Tray.java
deleted file mode 100644
index 02fb5b2df8449d070e81defaaff0f864e66760d3..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/Tray.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-
-package net.i2p.desktopgui.gui;
-
-import net.i2p.desktopgui.desktopgui.*;
-import java.awt.AWTException;
-import java.awt.Desktop;
-import java.awt.Image;
-import java.awt.SystemTray;
-import java.awt.Toolkit;
-import java.awt.TrayIcon;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import javax.swing.JPopupMenu;
-import net.i2p.desktopgui.router.RouterHandler;
-import net.i2p.desktopgui.router.RouterHelper;
-import net.i2p.desktopgui.router.configuration.PeerHelper;
-
-/**
- *
- * @author mathias
- */
-public class Tray {
-
-    public Tray() {
-        tray = SystemTray.getSystemTray();
-        loadSystemTray();
-    }
-    
-    private void loadSystemTray() {
-
-        Image image = Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo.jpg");
-
-        final JPopupMenu popup = new JPopupMenu();
-
-        //Create menu items to put in the popup menu
-        JMenuItem browserLauncher = new JMenuItem("Launch browser");
-        browserLauncher.addActionListener(new ActionListener() {
-
-            @Override
-            public void actionPerformed(ActionEvent arg0) {
-                if(Desktop.isDesktopSupported()) {
-                    Desktop desktop = Desktop.getDesktop();
-                    try {
-                        if(desktop.isSupported(Desktop.Action.BROWSE)) {
-                            desktop.browse(new URI("http://localhost:7657"));
-                        }
-                        else {
-                            trayIcon.displayMessage("Browser not found", "The default browser for your system was not found.", TrayIcon.MessageType.WARNING);
-                        }
-                    } catch (URISyntaxException ex) {
-                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
-                    } catch(IOException ex) {
-                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
-                    }
-                }
-            }
-
-        });
-        JMenuItem howto = new JMenuItem("How to use I2P");
-        howto.addActionListener(new ActionListener() {
-
-            @Override
-            public void actionPerformed(ActionEvent arg0) {
-                if(Desktop.isDesktopSupported()) {
-                    Desktop desktop = Desktop.getDesktop();
-                    try {
-                        File f = new File("desktopgui/resources/howto/howto.html");
-                        System.out.println(new URI(null, null, null, 0, "file://" + f.getAbsolutePath(), null, null));
-                        desktop.browse(new URI(null, null, null, 0, "file://" + f.getAbsolutePath(), null, null));
-                        //desktop.browse(new URI("file://" + f.getAbsolutePath()));
-                    } catch (URISyntaxException ex) {
-                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
-                    } catch(IOException ex) {
-                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
-                    }
-                }
-            }
-            
-        });
-        JMenu config = new JMenu("Configuration");
-        JMenuItem speedConfig = new JMenuItem("Speed");
-        speedConfig.addActionListener(new ActionListener() {
-
-            @Override
-            public void actionPerformed(ActionEvent arg0) {
-                (new SpeedSelector()).setVisible(true);
-            }
-            
-        });
-        JMenuItem generalConfig = new JMenuItem("General Configuration");
-        generalConfig.addActionListener(new ActionListener() {
-
-            @Override
-            public void actionPerformed(ActionEvent arg0) {
-                new GeneralConfiguration();
-            }
-            
-        });
-        JMenuItem advancedConfig = new JMenuItem("Advanced Configuration");
-        advancedConfig.addActionListener(new ActionListener() {
-
-            @Override
-            public void actionPerformed(ActionEvent arg0) {
-                if(Desktop.isDesktopSupported()) {
-                    Desktop desktop = Desktop.getDesktop();
-                    try {
-                        desktop.browse(new URI("http://localhost:7657/config.jsp"));
-                    } catch (URISyntaxException ex) {
-                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
-                    } catch(IOException ex) {
-                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
-                    }
-                }
-            }
-
-        });
-        JMenuItem viewLog = new JMenuItem("View log");
-        viewLog.addActionListener(new ActionListener() {
-
-            @Override
-            public void actionPerformed(ActionEvent arg0) {
-                new LogViewer();
-            }
-            
-        });
-        JMenuItem version = new JMenuItem("Version");
-        version.addActionListener(new ActionListener() {
-
-            @Override
-            public void actionPerformed(ActionEvent arg0) {
-                new Version();
-            }
-            
-        });
-        JMenuItem shutdown = new JMenuItem("Shutdown I2P");
-        shutdown.addActionListener(new ActionListener() {
-
-            @Override
-            public void actionPerformed(ActionEvent arg0) {
-                RouterHandler.setStatus(RouterHandler.SHUTDOWN_GRACEFULLY);
-                long shutdownTime = RouterHelper.getGracefulShutdownTimeRemaining();
-                System.out.println("Shutdowntime remaining: " + shutdownTime);
-                if(shutdownTime>0) {
-                    trayIcon.displayMessage("Shutting down...", "Shutdown time remaining: " + shutdownTime/1000 + " seconds."
-                            + System.getProperty("line.separator") + "Shutdown will not happen immediately, because we are still participating in the network.", TrayIcon.MessageType.INFO);
-                }
-                else {
-                    trayIcon.displayMessage("Shutting down...", "Shutting down immediately.", TrayIcon.MessageType.INFO);
-                }
-            }
-
-        });
-        
-        //Add menu items to popup menu
-        popup.add(browserLauncher);
-        popup.add(howto);
-        
-        popup.addSeparator();
-        
-        config.add(speedConfig);
-        config.add(generalConfig);
-        config.add(advancedConfig);
-        popup.add(config);
-        
-        popup.addSeparator();
-        
-        popup.add(viewLog);
-        popup.add(version);
-        
-        popup.addSeparator();
-        
-        popup.add(shutdown);
-
-        //Add tray icon
-        trayIcon = new JPopupTrayIcon(image, "I2P: the anonymous network", popup);
-        
-        try {
-            tray.add(trayIcon);
-        } catch (AWTException ex) {
-            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
-        }
-        
-        PeerHelper.addReachabilityListener(new ActionListener() {
-
-            @Override
-            public void actionPerformed(ActionEvent arg0) {
-                updateTooltip();
-            }
-            
-        });
-        PeerHelper.addActivePeerListener(new ActionListener() {
-
-            @Override
-            public void actionPerformed(ActionEvent arg0) {
-                updateTooltip();
-                int activePeers = PeerHelper.getActivePeers();
-                if(activePeers == 0)
-                    trayIcon.setImage(Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo_red.jpg"));
-                else if(activePeers < 10)
-                    trayIcon.setImage(Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo_orange.jpg"));
-                else
-                    trayIcon.setImage(Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo_green.jpg"));
-                
-            }
-            
-        });
-    }
-    
-    public void updateTooltip() {
-        trayIcon.setToolTip("I2P Network status: " + PeerHelper.getReachability() + " / " + "Active Peers: " + PeerHelper.getActivePeers());
-    }
-    
-    private SystemTray tray = null;
-    private JPopupTrayIcon trayIcon = null;
-    
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.form
deleted file mode 100644
index 32ab90b311d119e3fa4034aa8480e47ccbc3cdec..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.form
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
-  <Properties>
-    <Property name="defaultCloseOperation" type="int" value="2"/>
-    <Property name="title" type="java.lang.String" resourceKey="Form.title"/>
-    <Property name="name" type="java.lang.String" value="Form" noResource="true"/>
-  </Properties>
-  <SyntheticProperties>
-    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
-  </SyntheticProperties>
-  <AuxValues>
-    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
-    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
-    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
-    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
-    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
-    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
-  </AuxValues>
-
-  <Layout>
-    <DimensionLayout dim="0">
-      <Group type="103" groupAlignment="0" attributes="0">
-          <Group type="102" attributes="0">
-              <EmptySpace max="-2" attributes="0"/>
-              <Group type="103" groupAlignment="0" attributes="0">
-                  <Group type="102" alignment="0" attributes="0">
-                      <Group type="103" groupAlignment="1" max="-2" attributes="0">
-                          <Component id="I2Plabel" alignment="0" max="32767" attributes="0"/>
-                          <Component id="GUILabel" alignment="0" max="32767" attributes="1"/>
-                      </Group>
-                      <EmptySpace type="separate" max="-2" attributes="0"/>
-                      <Group type="103" groupAlignment="0" attributes="0">
-                          <Component id="I2PVersion" pref="126" max="32767" attributes="0"/>
-                          <Component id="GUIVersion" pref="126" max="32767" attributes="0"/>
-                      </Group>
-                  </Group>
-                  <Component id="okButton" alignment="1" min="-2" max="-2" attributes="0"/>
-              </Group>
-              <EmptySpace max="-2" attributes="0"/>
-          </Group>
-      </Group>
-    </DimensionLayout>
-    <DimensionLayout dim="1">
-      <Group type="103" groupAlignment="0" attributes="0">
-          <Group type="102" alignment="0" attributes="0">
-              <EmptySpace max="-2" attributes="0"/>
-              <Group type="103" groupAlignment="0" attributes="0">
-                  <Component id="I2Plabel" min="-2" max="-2" attributes="0"/>
-                  <Component id="I2PVersion" min="-2" max="-2" attributes="0"/>
-              </Group>
-              <EmptySpace max="-2" attributes="0"/>
-              <Group type="103" groupAlignment="0" attributes="0">
-                  <Component id="GUILabel" min="-2" max="-2" attributes="0"/>
-                  <Component id="GUIVersion" min="-2" max="-2" attributes="0"/>
-              </Group>
-              <EmptySpace max="32767" attributes="0"/>
-              <Component id="okButton" min="-2" max="-2" attributes="0"/>
-              <EmptySpace max="-2" attributes="0"/>
-          </Group>
-      </Group>
-    </DimensionLayout>
-  </Layout>
-  <SubComponents>
-    <Component class="javax.swing.JButton" name="okButton">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="okButton.text"/>
-        <Property name="name" type="java.lang.String" value="okButton" noResource="true"/>
-      </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="okButtonActionPerformed"/>
-      </Events>
-    </Component>
-    <Component class="javax.swing.JLabel" name="I2Plabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="I2Plabel.text"/>
-        <Property name="name" type="java.lang.String" value="I2Plabel" noResource="true"/>
-      </Properties>
-    </Component>
-    <Component class="javax.swing.JLabel" name="GUILabel">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="GUILabel.text"/>
-        <Property name="name" type="java.lang.String" value="GUILabel" noResource="true"/>
-      </Properties>
-    </Component>
-    <Component class="javax.swing.JLabel" name="I2PVersion">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="I2PVersion.text"/>
-        <Property name="name" type="java.lang.String" value="I2PVersion" noResource="true"/>
-      </Properties>
-    </Component>
-    <Component class="javax.swing.JLabel" name="GUIVersion">
-      <Properties>
-        <Property name="text" type="java.lang.String" resourceKey="GUIVersion.text"/>
-        <Property name="name" type="java.lang.String" value="GUIVersion" noResource="true"/>
-      </Properties>
-    </Component>
-  </SubComponents>
-</Form>
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.java
deleted file mode 100644
index 25a38d6b8ffa7785db79aee870680e9ed9fcd818..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Version.java
- *
- * Created on 13 april 2009, 13:48
- */
-
-package net.i2p.desktopgui.gui;
-
-import javax.swing.JFrame;
-import net.i2p.desktopgui.router.RouterHelper;
-
-/**
- *
- * @author  mathias
- */
-public class Version extends javax.swing.JDialog {
-
-    public Version() {
-        this(new JFrame(), true);
-    }
-    
-    
-    private Version(java.awt.Frame parent, boolean modal) {
-        super(parent, modal);
-        initComponents();
-        String i2pVersion = RouterHelper.getVersion();
-        String guiVersion = net.i2p.desktopgui.desktopgui.GUIVersion.VERSION;
-        this.I2PVersion.setText("<html><h1>" + i2pVersion + "</h1></html>");
-        this.GUIVersion.setText("<html><h1>" + guiVersion + "</h1></html>");
-        this.setVisible(true);
-    }
-
-    /** This method is called from within the constructor to
-     * initialize the form.
-     * WARNING: Do NOT modify this code. The content of this method is
-     * always regenerated by the Form Editor.
-     */
-    @SuppressWarnings("unchecked")
-    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
-    private void initComponents() {
-
-        okButton = new javax.swing.JButton();
-        I2Plabel = new javax.swing.JLabel();
-        GUILabel = new javax.swing.JLabel();
-        I2PVersion = new javax.swing.JLabel();
-        GUIVersion = new javax.swing.JLabel();
-
-        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
-        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(Version.class);
-        setTitle(resourceMap.getString("Form.title")); // NOI18N
-        setName("Form"); // NOI18N
-
-        okButton.setText(resourceMap.getString("okButton.text")); // NOI18N
-        okButton.setName("okButton"); // NOI18N
-        okButton.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                okButtonActionPerformed(evt);
-            }
-        });
-
-        I2Plabel.setText(resourceMap.getString("I2Plabel.text")); // NOI18N
-        I2Plabel.setName("I2Plabel"); // NOI18N
-
-        GUILabel.setText(resourceMap.getString("GUILabel.text")); // NOI18N
-        GUILabel.setName("GUILabel"); // NOI18N
-
-        I2PVersion.setText(resourceMap.getString("I2PVersion.text")); // NOI18N
-        I2PVersion.setName("I2PVersion"); // NOI18N
-
-        GUIVersion.setText(resourceMap.getString("GUIVersion.text")); // NOI18N
-        GUIVersion.setName("GUIVersion"); // NOI18N
-
-        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
-        getContentPane().setLayout(layout);
-        layout.setHorizontalGroup(
-            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(layout.createSequentialGroup()
-                .addContainerGap()
-                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                    .addGroup(layout.createSequentialGroup()
-                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
-                            .addComponent(I2Plabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
-                            .addComponent(GUILabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
-                        .addGap(18, 18, 18)
-                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                            .addComponent(I2PVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE)
-                            .addComponent(GUIVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE)))
-                    .addComponent(okButton, javax.swing.GroupLayout.Alignment.TRAILING))
-                .addContainerGap())
-        );
-        layout.setVerticalGroup(
-            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(layout.createSequentialGroup()
-                .addContainerGap()
-                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                    .addComponent(I2Plabel)
-                    .addComponent(I2PVersion))
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                    .addComponent(GUILabel)
-                    .addComponent(GUIVersion))
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
-                .addComponent(okButton)
-                .addContainerGap())
-        );
-
-        pack();
-    }// </editor-fold>//GEN-END:initComponents
-
-private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
-    this.dispose();
-}//GEN-LAST:event_okButtonActionPerformed
-
-
-    // Variables declaration - do not modify//GEN-BEGIN:variables
-    private javax.swing.JLabel GUILabel;
-    private javax.swing.JLabel GUIVersion;
-    private javax.swing.JLabel I2PVersion;
-    private javax.swing.JLabel I2Plabel;
-    private javax.swing.JButton okButton;
-    // End of variables declaration//GEN-END:variables
-
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ClientTunnelWindow.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ClientTunnelWindow.properties
deleted file mode 100644
index ca036e197e1752d288ae5f38e2c12e0b7ab84718..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ClientTunnelWindow.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-# To change this template, choose Tools | Templates
-# and open the template in the editor.
-
-Form.title=Client Tunnel Configuration
-tunnelNameLabel.text=Name:
-tunnelTypeLabel.text=Type:
-tunnelType.text=jLabel10
-tunnelName.text=jTextField1
-tunnelPortLabel.text=Port:
-tunnelPort.text=jTextField2
-tunnelDestination.text=jTextField3
-tunnelDestinationLabel.text=Destination:
-tunnelProfileLabel.text=Profile:
-delayConnect.text=Delay connect
-sharedClient.text=Shared client
-autoStart.text=Auto start
-tunnelDepthLabel.text=Tunnel depth:
-depthVarianceLabel.text=Depth variance:
-tunnelCountLabel.text=Tunnel count:
-backupTunnelCountLabel.text=Backup tunnel count:
-reduceIdle.text=Reduce tunnel count when idle
-closeIdle.text=Close tunnels when idle
-delayIdle.text=Delay opening of tunnels when idle
-save.text=Save
-cancel.text=Cancel
-changeTunnelState.text=Start Tunnel
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties
deleted file mode 100644
index d53ac80d03922b090f0c3b028547339d3d982367..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties
+++ /dev/null
@@ -1,37 +0,0 @@
-cancel.text=Cancel
-ok.text=OK
-Form.title=General Configuration
-speedPanel.TabConstraints.tabTitle=Speed
-updatesPanel.TabConstraints.tabTitle=Updates
-tunnelPanel.TabConstraints.tabTitle=Tunnels/Services
-networkPanel.TabConstraints.tabTitle=Network
-advancedPanel.TabConstraints.tabTitle=Advanced
-uploadSpeedLabel.text=Upload speed:
-downloadSpeedLabel.text=Download speed:
-uploadspeed.text=jTextField1
-downloadspeed.text=jTextField2
-uploadgb.text=jTextField3
-downloadgb.text=jTextField4
-updateMethod.text=What is your preferred automatic update setting?
-updateInform.text=Only inform about updates (not advised)
-updateDownload.text=Download and verify update file, do not restart
-updateDownloadRestart.text=Download, verify and restart
-checkUpdates.text=Check for updates now
-updateNow.text=Update available: update now
-advancedUpdateConfig.text=Advanced update configuration
-clientTunnelLabel.text=Client tunnels:
-serverTunnelLabel.text=Server tunnels:
-tunnelsExplanation.text=Click on a tunnel to view and change its configuration. + Tunnel explanation
-uploadUsageLabel.text=Monthly usage:
-downloadUsageLabel.text=Monthly usage:
-gbUploadLabel.text=GB
-gbDownloadLabel.text=GB
-uploadDownloadExplanation.text=Explanation ...
-clientTable.columnModel.title3=Status
-clientTable.columnModel.title2=Address
-clientTable.columnModel.title1=Type
-clientTable.columnModel.title0=Name
-serverTable.columnModel.title0=Name
-serverTable.columnModel.title3=Title 4
-serverTable.columnModel.title2=Status
-serverTable.columnModel.title1=Address
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/LogViewer.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/LogViewer.properties
deleted file mode 100644
index d4ef5bf0e0c6c495848c2cd8f8988133c684121e..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/LogViewer.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-refreshButton.text=Refresh
-clearButton.text=Clear
-explanationText.text=Explanation ...
-Form.title=View Logs
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ServerTunnelWindow.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ServerTunnelWindow.properties
deleted file mode 100644
index 683f3caa7fe17a5d055e58ce56d0c6887975e50e..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ServerTunnelWindow.properties
+++ /dev/null
@@ -1 +0,0 @@
-jLabel1.text=Name:
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector.properties
deleted file mode 100644
index 00eb6c973db4796bd1dc942a21e542398244d456..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-
-Form.title=I2P Speed Configuration
-nextButton.text=Next
-uploadLabel.text=What is your maximum upload speed?
-downloadLabel.text=What is your maximum download speed?
-speedExplanation.text=<html>The maximum speed is set by your provider. It can be given in <b>kilobit (kbps)</b> or <b>kilobyte (kBps)</b>.<br />One kilobyte equals eight kilobit.</html>
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector2.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector2.properties
deleted file mode 100644
index 909518ada2f2c92286a3ad909f4971148a8ad494..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector2.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-returnButton.text=Previous
-Form.title=I2P Speed Configuration
-questionLabel.text=Which of these descriptions fits you best?
-browseButton.text=Browsing: I want to use I2P to browse websites anonymously, no heavy usage.
-downloadButton.text=Downloading: I want to use I2P for downloads and filesharing, heavy usage.
-nextButton.text=Next
-browseButton.actionCommand=Browsing
-downloadButton.actionCommand=Downloading
-jLabel1.text=<html>I2P can be used for many different purposes. Here, we present two possible descriptions. If you use a lot of bandwidth in I2P (for example using downloading), please check the <b>downloading</b> option. If your bandwidth usage is limited, please check the <b>browsing</b> option.</html>
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector3.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector3.properties
deleted file mode 100644
index 6dca3ca51603dd9a6667aea2588bda0812aecd5f..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector3.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-Form.title=I2P Configuration
-previousButton.text=Previous
-finishButton.text=Finish
-uploadLabel.text=Upload Speed:
-uploadBurstLabel.text=Burst Upload Speed:
-downloadLabel.text=Download Speed:
-downloadBurstLabel.text=Burst Download Speed:
-uploadUsageLabel.text=GB
-downloadUsageLabel.text=GB
-uploadField.text=jTextField1
-uploadBurstField.text=jTextField2
-downloadField.text=jTextField4
-downloadBurstField.text=jTextField5
-uploadMonth.text=jTextField1
-downloadMonth.text=jTextField2
-settingsInfo.text=The profile information your entered, indicates that these are your optimal settings:
-explanation.text=<html>We give a suggested upload and download speed. If your provider imposes a monthly bandwidth limit (usually given in <b>gigabyte (GB)</b>), please enter a value lower than that limit. If you run I2P only 50% of the time, you can double the bandwidth limit to use the same amount as when you are online 100% of the time.</html>
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/Version.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/Version.properties
deleted file mode 100644
index c2030bb2d838b6859ded31c3fee5ef30beeba8f0..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/Version.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-okButton.text=OK
-I2Plabel.text=<html><h1>I2P Version:</h1></html>
-GUILabel.text=<html><h1>GUI Version:</h1></html>
-I2PVersion.text=jLabel3
-GUIVersion.text=jLabel4
-Form.title=Version
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java b/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java
new file mode 100644
index 0000000000000000000000000000000000000000..e95cbc01f28d438b290cd89e8a33a6867d9881d7
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java
@@ -0,0 +1,26 @@
+package net.i2p.desktopgui.i18n;
+
+import net.i2p.I2PAppContext;
+import net.i2p.util.Translate;
+
+public class DesktopguiTranslator {
+    
+    private static final String BUNDLE_NAME = "net.i2p.desktopgui.messages";
+    
+    private static I2PAppContext ctx;
+    
+    private static I2PAppContext getRouterContext() {
+        if(ctx == null) {
+            ctx = I2PAppContext.getCurrentContext();
+        }
+        return ctx;
+    }
+    
+    public static String _(String s) {
+        return Translate.getString(s, getRouterContext(), BUNDLE_NAME);
+    }
+
+    public static String _(String s, Object o) {
+        return Translate.getString(s, o, getRouterContext(), BUNDLE_NAME);
+    }
+}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/package.html b/apps/desktopgui/src/net/i2p/desktopgui/package.html
new file mode 100644
index 0000000000000000000000000000000000000000..ac1c91503b610f29092e04b1a82715dc7b71fba4
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/package.html
@@ -0,0 +1,5 @@
+<html>
+    <body>
+        <p>Desktopgui is a graphical interface to I2P that allows managing the lifecycle of I2P from the system tray.</p>
+    </body>
+</html>
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/persistence/PropertyManager.java b/apps/desktopgui/src/net/i2p/desktopgui/persistence/PropertyManager.java
deleted file mode 100644
index 770bd09570f16b90522e0042c183f792ccd58737..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/persistence/PropertyManager.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package net.i2p.desktopgui.persistence;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Properties;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- *
- * @author mathias
- */
-public class PropertyManager {
-    
-    public static void setProps(Properties props) {
-        PropertyManager.props = props;
-    }
-    
-    public static Properties getProps() {
-        return props;
-    }
-    
-    public static Properties loadProps() {
-        Properties defaultProps = new Properties();
-        defaultProps.setProperty("firstLoad", "true");
-
-        // create application properties with default
-        Properties applicationProps = new Properties(defaultProps);
-
-        // now load properties from last invocation
-        FileInputStream in;
-        try {
-            in = new FileInputStream(PROPSLOCATION);
-            applicationProps.load(in);
-            in.close();
-        } catch (FileNotFoundException ex) {
-            //Nothing serious, just means it's being loaded for the first time.
-        } catch(IOException ex) {
-            Logger.getLogger(PropertyManager.class.getName()).log(Level.INFO, null, ex);
-        }
-        props = applicationProps;
-        return applicationProps;
-    }
-    
-    public static void saveProps(Properties props) {
-        FileOutputStream out;
-        try {
-            File d = new File(PROPSDIRECTORY);
-            if(!d.exists())
-                d.mkdir();
-            File f = new File(PROPSLOCATION);
-            if(!f.exists())
-                f.createNewFile();
-            out = new FileOutputStream(f);
-            props.store(out, PROPSLOCATION);
-        } catch (FileNotFoundException ex) {
-            Logger.getLogger(PropertyManager.class.getName()).log(Level.SEVERE, null, ex);
-        } catch(IOException ex) {
-            Logger.getLogger(PropertyManager.class.getName()).log(Level.SEVERE, null, ex);
-        }
-    }
-    
-    private static Properties props;
-    
-    ///Location where we store the Application Properties
-    public static final String PROPSDIRECTORY = "desktopgui";
-    public static final String PROPSFILENAME = "appProperties";
-    public static final String PROPSLOCATION = PROPSDIRECTORY + File.separator + PROPSFILENAME;
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHandler.java b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHandler.java
deleted file mode 100644
index 022c5c8149659087f48433ee05b7ced2a9dfa7ef..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHandler.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-
-package net.i2p.desktopgui.router;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import net.i2p.router.RouterContext;
-
-/**
- *
- * @author mathias
- */
-public class RouterHandler {
-    public static final int SHUTDOWN_GRACEFULLY = 0;
-    public static void setStatus(int status) {
-        if(status == SHUTDOWN_GRACEFULLY) {
-            Thread t = new Thread(new Runnable() {
-
-                public void run() {
-                    RouterContext context = RouterHelper.getContext();
-                    context.router().shutdownGracefully();
-                    while(context.router().getShutdownTimeRemaining()>0)
-                        try {
-                            Thread.sleep(context.router().getShutdownTimeRemaining());
-                        } catch (InterruptedException ex) {
-                            Logger.getLogger(RouterHandler.class.getName()).log(Level.SEVERE, null, ex);
-                        }
-                    System.exit(0);
-                }
-                
-            });
-            t.start();
-        }
-    }
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHelper.java b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHelper.java
deleted file mode 100644
index 2da95f0c6a86d41f4e975532d689fc438922fa0a..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHelper.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package net.i2p.desktopgui.router;
-
-import net.i2p.router.RouterContext;
-import net.i2p.router.RouterVersion;
-
-/**
- *
- * @author mathias
- */
-public class RouterHelper {
-    public static RouterContext getContext() {
-        return (RouterContext) RouterContext.listContexts().get(0);
-    }
-    
-    public static long getGracefulShutdownTimeRemaining() {
-        return RouterHelper.getContext().router().getShutdownTimeRemaining();
-    }
-    
-    public static String getVersion() {
-        return (RouterVersion.VERSION + "-" + RouterVersion.BUILD);
-    }
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..63f6ad588aaf02b4aa8dfee167a70165ffd7f820
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java
@@ -0,0 +1,98 @@
+package net.i2p.desktopgui.router;
+
+import java.io.IOException;
+
+import org.tanukisoftware.wrapper.WrapperManager;
+
+import net.i2p.I2PAppContext;
+import net.i2p.desktopgui.i18n.DesktopguiTranslator;
+import net.i2p.desktopgui.util.ConfigurationManager;
+import net.i2p.router.Router;
+import net.i2p.router.RouterContext;
+import net.i2p.util.Log;
+
+/**
+ * Handle communications with the router instance.
+ * @author mathias
+ *
+ */
+public class RouterManager {
+	
+	private final static Log log = new Log(RouterManager.class);
+	private static I2PAppContext context = I2PAppContext.getCurrentContext();
+	
+	public static I2PAppContext getAppContext() {
+		return context;
+	}
+	
+	public static RouterContext getRouterContext() throws Exception {
+		if(context.isRouterContext()) {
+			return (RouterContext) context;
+		}
+		else {
+			throw new Exception("No RouterContext available!");
+		}
+	}
+	
+	private static Router getRouter() {
+		try {
+			return getRouterContext().router();
+		} catch (Exception e) {
+	        log.error("Failed to get router. Why did we request it if no RouterContext is available?", e);
+            return null;
+        }
+    }
+    
+    /**
+     * Start an I2P router instance.
+     * This method has limited knowledge
+     * (there is no I2P instance running to collect information from).
+     * 
+     * It determines the I2P location using the I2PAppContext.
+     */
+    public static void start() {
+        try {
+            //TODO: set/get PID
+            String separator = System.getProperty("file.separator");
+            String location = getAppContext().getBaseDir().getAbsolutePath();
+            
+            Runtime.getRuntime().exec(location + separator + "i2psvc " + location + separator + "wrapper.config");
+        } catch (IOException e) {
+            log.log(Log.WARN, "Failed to start I2P", e);
+        }
+    }
+    
+    /**
+     * Restart the running I2P instance.
+     */
+    public static void restart() {
+        if(inI2P()) {
+            getRouter().restart();
+        }
+    }
+
+    /**
+     * Stop the running I2P instance.
+     */
+    public static void shutDown() {
+        if(inI2P()) {
+            Thread t = new Thread(new Runnable() {
+
+                @Override
+                public void run() {
+                    WrapperManager.signalStopped(Router.EXIT_HARD);    
+                }
+                
+            });
+            t.start();
+            getRouter().shutdown(Router.EXIT_HARD);
+        }
+    }
+    
+    /**
+     * Check if we are running inside I2P.
+     */
+    public static boolean inI2P() {
+        return context.isRouterContext();
+    }
+}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/PeerHelper.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/PeerHelper.java
deleted file mode 100644
index 74df2b3d99ec0186ebda188743feb25bdbafa195..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/PeerHelper.java
+++ /dev/null
@@ -1,165 +0,0 @@
-package net.i2p.desktopgui.router.configuration;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Timer;
-import java.util.TimerTask;
-import net.i2p.data.RouterAddress;
-import net.i2p.router.CommSystemFacade;
-import net.i2p.router.RouterContext;
-import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
-import net.i2p.router.transport.ntcp.NTCPAddress;
-import net.i2p.desktopgui.router.RouterHelper;
-
-/**
- * Part of the code imported and adapted from the I2P Router Console (which is licensed as public domain)
- */
-public class PeerHelper {
-    public static String getReachability() {
-        RouterContext context = RouterHelper.getContext();
-        if (context.router().getUptime() > 60*1000
-                && (!context.router().gracefulShutdownInProgress())
-                && !context.clientManager().isAlive())
-            return "ERROR: Client Manager I2CP Error - check logs";  // not a router problem but the user should know
-        if (!context.clock().getUpdatedSuccessfully())
-            return "ERROR: ClockSkew";
-        if (context.router().isHidden())
-            return "Hidden";
-
-        int status = context.commSystem().getReachabilityStatus();
-        switch (status) {
-            case CommSystemFacade.STATUS_OK:
-                RouterAddress ra = context.router().getRouterInfo().getTargetAddress("NTCP");
-                if (ra == null || (new NTCPAddress(ra)).isPubliclyRoutable())
-                    return "OK";
-                return "ERROR: Private TCP Address";
-            case CommSystemFacade.STATUS_DIFFERENT:
-                return "ERROR: You are behind a symmetric NAT.";
-            case CommSystemFacade.STATUS_REJECT_UNSOLICITED:
-                if (context.router().getRouterInfo().getTargetAddress("NTCP") != null)
-                    return "WARNING: You are behind a firewall and have Inbound TCP Enabled";
-                if (((FloodfillNetworkDatabaseFacade)context.netDb()).floodfillEnabled())
-                    return "WARNING: You are behind a firewall and are a floodfill router";
-                if (context.router().getRouterInfo().getCapabilities().indexOf('O') >= 0)
-                    return "WARNING: You are behind a firewall and are a fast router";
-                return "Firewalled";
-            case CommSystemFacade.STATUS_HOSED:
-                return "ERROR: The UDP port is already in use. Set i2np.udp.internalPort=xxxx to a different value in the advanced config and restart";
-            case CommSystemFacade.STATUS_UNKNOWN: // fallthrough
-            default:
-                ra = context.router().getRouterInfo().getTargetAddress("SSU");
-                if (ra == null && context.router().getUptime() > 5*60*1000) {
-                    if (context.getProperty(PROP_I2NP_NTCP_HOSTNAME) == null ||
-                        context.getProperty(PROP_I2NP_NTCP_PORT) == null)
-                        return "ERROR: UDP is disabled and the inbound TCP host/port combination is not set";
-                    else
-                        return "WARNING: You are behind a firewall and have UDP Disabled";
-                }
-                return "Testing";
-        }
-    }
-    
-    /**
-     * How many peers we are talking to now
-     *
-     */
-    public static int getActivePeers() {
-        RouterContext context = RouterHelper.getContext();
-        if (context == null) 
-            return 0;
-        else
-            return context.commSystem().countActivePeers();
-    }
-    
-    public static void addActivePeerListener(ActionListener listener) {
-        synchronized(activePeerListeners) {
-            activePeerListeners.add(listener);
-            if(activePeerTimer == null) {
-                activePeerTimer = new Timer();
-                TimerTask t = new TimerTask() {
-                    private int activePeers = 0;
-
-                    @Override
-                    public void run() {
-                        int newActivePeers = getActivePeers();
-                        if(!(activePeers == newActivePeers)) {
-                            synchronized(activePeerListeners) {
-                                for(int i=0; i<activePeerListeners.size(); i++) {
-                                    activePeerListeners.get(i).actionPerformed(new ActionEvent(this, 0, ""));
-                                }
-                            }
-                            activePeers = newActivePeers;
-                        }
-                    }
-                };
-                activePeerTimer.schedule(t, 0, 60*1000);
-            }
-        }
-    }
-    
-    public static void removeActivePeerListener(ActionListener listener) {
-        synchronized(activePeerListeners) {
-            activePeerListeners.remove(listener);
-            if(activePeerListeners.size() == 0) {
-                activePeerTimer.cancel();
-                activePeerTimer = null;
-            }
-        }
-    }
-    
-    
-    
-    public static void addReachabilityListener(ActionListener listener) {
-        synchronized(reachabilityListeners) {
-            reachabilityListeners.add(listener);
-            if(reachabilityTimer == null) {
-                reachabilityTimer = new Timer();
-                TimerTask t = new TimerTask() {
-                    
-                    private String reachability = "";
-
-                    @Override
-                    public void run() {
-                        String newReachability = getReachability();
-                        if(!reachability.equals(newReachability)) {
-                            synchronized(reachabilityListeners) {
-                                for(int i=0; i<reachabilityListeners.size(); i++) {
-                                    reachabilityListeners.get(i).actionPerformed(new ActionEvent(this, 0, ""));
-                                }
-                            }
-                            reachability = newReachability;
-                        }
-                    }
-                    
-                };
-                reachabilityTimer.schedule(t, 0, 60*1000);
-            }
-        }
-    }
-    
-    public static void removeReachabilityListener(ActionListener listener) {
-        synchronized(reachabilityListeners) {
-            reachabilityListeners.remove(listener);
-            if(reachabilityListeners.size() == 0) {
-                reachabilityTimer.cancel();
-                reachabilityTimer = null;
-            }
-        }
-    }
-    
-    private static List<ActionListener> reachabilityListeners = new ArrayList<ActionListener>();
-    private static Timer reachabilityTimer = null;
-    
-    private static List<ActionListener> activePeerListeners = new ArrayList<ActionListener>();
-    private static Timer activePeerTimer = null;
-    
-    /** copied from various private components */
-    public final static String PROP_I2NP_UDP_PORT = "i2np.udp.port";
-    public final static String PROP_I2NP_INTERNAL_UDP_PORT = "i2np.udp.internalPort";
-    public final static String PROP_I2NP_NTCP_HOSTNAME = "i2np.ntcp.hostname";
-    public final static String PROP_I2NP_NTCP_PORT = "i2np.ntcp.port";
-    public final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoport";
-    public final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoip";
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHandler.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHandler.java
deleted file mode 100644
index 8fd67565787d35322c96c2eb82207ff0e1769118..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHandler.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package net.i2p.desktopgui.router.configuration;
-
-import net.i2p.router.RouterContext;
-import net.i2p.router.transport.FIFOBandwidthRefiller;
-import net.i2p.desktopgui.router.RouterHelper;
-
-/**
- *
- * @author mathias
- */
-public class SpeedHandler {
-
-    public static void setInboundBandwidth(int kbytes) {
-        context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH, "" + kbytes);
-        context.router().saveConfig();
-    }
-    
-    public static void setOutboundBandwidth(int kbytes) {
-        context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH, "" + kbytes);
-        context.router().saveConfig();
-    }
-    
-    public static void setInboundBurstBandwidth(int kbytes) {
-        context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BURST_BANDWIDTH, "" + kbytes);
-        context.router().saveConfig();
-    }
-    
-    public static void setOutboundBurstBandwidth(int kbytes) {
-        context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BURST_BANDWIDTH, "" + kbytes);
-        context.router().saveConfig();
-    }
-    
-    private static final RouterContext context = RouterHelper.getContext();
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHelper.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHelper.java
deleted file mode 100644
index 51b8b5a6f6e45455a7c8d8f2c22cb2148208eda1..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHelper.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package net.i2p.desktopgui.router.configuration;
-
-import net.i2p.router.transport.FIFOBandwidthRefiller;
-import net.i2p.desktopgui.router.RouterHelper;
-
-/**
- *
- * @author mathias
- */
-public class SpeedHelper {
-    public static final String USERTYPE_BROWSING = "Browsing";
-    public static final String USERTYPE_DOWNLOADING = "Downloading";
-    
-    public static int calculateSpeed(String capable, String profile) {
-        int capableSpeed = Integer.parseInt(capable);
-        int advisedSpeed = capableSpeed;
-        if(capableSpeed > 1000) {
-            if(profile.equals(USERTYPE_BROWSING)) //Don't overdo usage for people just wanting to browse (we don't want to drive them away due to resource hogging)
-                advisedSpeed *= 0.6;
-            else if(profile.equals(USERTYPE_DOWNLOADING))
-                advisedSpeed *= 0.8;
-        }
-        else
-            advisedSpeed *= 0.6; //Lower available bandwidth: don't hog all the bandwidth
-        return advisedSpeed;
-    }
-    
-    public static int calculateMonthlyUsage(int kbytes) {
-        return (int) ((((long)kbytes)*3600*24*31)/1000000);
-    }
-    
-    public static int calculateSpeed(int gigabytes) {
-        return (int) (((long)gigabytes)*1000000/31/24/3600);
-    }
-    
-    public static String getInboundBandwidth() {
-        return RouterHelper.getContext().router().getConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH);
-    }
-
-    public static String getOutboundBandwidth() {
-        return RouterHelper.getContext().router().getConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH);
-    }
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHandler.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHandler.java
deleted file mode 100644
index e913f5e518a82420a4b3dc8e43ea5a748733a364..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHandler.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-
-package net.i2p.desktopgui.router.configuration;
-
-import net.i2p.desktopgui.router.RouterHelper;
-
-/**
- *
- * @author mathias
- */
-public class UpdateHandler {
-    public static void setUpdatePolicy(String policy) {
-        RouterHelper.getContext().router().setConfigSetting(UpdateHelper.PROP_UPDATE_POLICY, policy);
-        RouterHelper.getContext().router().saveConfig();
-    }
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHelper.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHelper.java
deleted file mode 100644
index 6e28db108cd52dab592862d417a857934783c542..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHelper.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package net.i2p.desktopgui.router.configuration;
-
-import net.i2p.desktopgui.router.RouterHelper;
-
-/**
- *
- * @author mathias
- */
-public class UpdateHelper {
-
-    public static final String PROP_NEWS_URL = "router.newsURL";
-    public static final String DEFAULT_NEWS_URL = "http://echelon.i2p/i2p/news.xml";
-
-    public static final String PROP_REFRESH_FREQUENCY = "router.newsRefreshFrequency";
-    public static final String DEFAULT_REFRESH_FREQUENCY = 24*60*60*1000 + "";
-
-    public static final String PROP_UPDATE_POLICY = "router.updatePolicy";
-    public static final String NOTIFY_UPDATE_POLICY = "notify";
-    public static final String DOWNLOAD_UPDATE_POLICY = "download";
-    public static final String INSTALL_UPDATE_POLICY = "install";
-    public static final String DEFAULT_UPDATE_POLICY = DOWNLOAD_UPDATE_POLICY;
-
-    public static final String PROP_SHOULD_PROXY = "router.updateThroughProxy";
-    public static final String DEFAULT_SHOULD_PROXY = Boolean.TRUE.toString();
-    public static final String PROP_PROXY_HOST = "router.updateProxyHost";
-    public static final String DEFAULT_PROXY_HOST = "127.0.0.1";
-    public static final String PROP_PROXY_PORT = "router.updateProxyPort";
-    public static final String DEFAULT_PROXY_PORT = "4444";
-
-    public static final String PROP_UPDATE_URL = "router.updateURL";
-    public static final String DEFAULT_UPDATE_URL =
-    "http://echelon.i2p/i2p/i2pupdate.sud\r\n" +
-    "http://stats.i2p/i2p/i2pupdate.sud\r\n" +
-    "http://www.i2p2.i2p/_static/i2pupdate.sud\r\n" +
-    "http://update.postman.i2p/i2pupdate.sud" ;
-
-    public static final String PROP_TRUSTED_KEYS = "router.trustedUpdateKeys";
-
-    public static String getNewsURL() {
-        String url = RouterHelper.getContext().getProperty(PROP_NEWS_URL);
-        if(url == null) {
-            return DEFAULT_NEWS_URL;
-        }
-        else {
-            return url;
-        }
-    }
-
-    public static String getUpdatePolicy() {
-        String policy = null;
-        try {
-            policy = RouterHelper.getContext().getProperty(PROP_UPDATE_POLICY);
-        }
-        catch(Exception e) {
-            e.printStackTrace();
-        }
-        System.out.println("Policy: " + policy);
-        if(policy == null) {
-            return DEFAULT_UPDATE_POLICY;
-        }
-        else {
-            return policy;
-        }
-    }
-}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/util/BrowseException.java b/apps/desktopgui/src/net/i2p/desktopgui/util/BrowseException.java
new file mode 100644
index 0000000000000000000000000000000000000000..a5e4f4350c7f5af98d643219323fdc8ce108c80e
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/util/BrowseException.java
@@ -0,0 +1,23 @@
+package net.i2p.desktopgui.util;
+
+public class BrowseException extends Exception {
+
+	private static final long serialVersionUID = 1L;
+	
+	public BrowseException() {
+        super();
+    }
+    
+    public BrowseException(String s) {
+        super(s);
+    }
+    
+    public BrowseException(String s, Throwable t) {
+        super(s, t);
+    }
+    
+    public BrowseException(Throwable t) {
+        super(t);
+    }
+    
+}
\ No newline at end of file
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/util/ConfigurationManager.java b/apps/desktopgui/src/net/i2p/desktopgui/util/ConfigurationManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..d514f314a150470c4fb7bc3e0dc74a71a3f3028c
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/util/ConfigurationManager.java
@@ -0,0 +1,103 @@
+package net.i2p.desktopgui.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Manage the configuration of desktopgui.
+ * @author mathias
+ *
+ */
+public class ConfigurationManager {
+	
+	private static ConfigurationManager instance;
+	///Configurations with a String as value
+	private Map<String, String> stringConfigurations = new HashMap<String, String>();
+	///Configurations with a Boolean as value
+	private Map<String, Boolean> booleanConfigurations = new HashMap<String, Boolean>();
+
+	private ConfigurationManager() {}
+	
+	public static ConfigurationManager getInstance() {
+		if(instance == null) {
+			instance = new ConfigurationManager();
+		}
+		return instance;
+	}
+	
+	/**
+	 * Collects arguments of the form --word, --word=otherword and -blah
+	 * to determine user parameters.
+	 * @param args Command line arguments to the application
+	 */
+	public void loadArguments(String[] args) {
+		for(int i=0; i<args.length; i++) {
+			String arg = args[i];
+			if(arg.startsWith("--")) {
+				arg = arg.substring(2);
+				if(arg.length() < 1) {
+					continue;
+				}
+				int equals = arg.indexOf('=');
+				if(equals != -1 && equals < arg.length() - 1) { //String configuration
+					loadStringConfiguration(arg, equals);
+				}
+				else { //Boolean configuration
+					loadBooleanConfiguration(arg);
+				}
+			}
+			else if(arg.startsWith("-")) { //Boolean configuration
+				loadBooleanConfiguration(arg);
+			}
+		}
+	}
+	
+	/**
+	 * Add a boolean configuration.
+	 * @param arg The key we wish to add as a configuration.
+	 */
+	public void loadBooleanConfiguration(String arg) {
+		booleanConfigurations.put(arg, Boolean.TRUE);
+	}
+	
+	/**
+	 * Add a String configuration which consists a key and a value.
+	 * @param arg String of the form substring1=substring2.
+	 * @param equalsPosition Position of the '=' element.
+	 */
+	public void loadStringConfiguration(String arg, int equalsPosition) {
+		String key = arg.substring(0, equalsPosition);
+		String value = arg.substring(equalsPosition+1);
+		stringConfigurations.put(key, value);
+	}
+	
+	/**
+	 * Check if a specific boolean configuration exists.
+	 * @param arg The key for the configuration.
+	 * @param defaultValue If the configuration is not found, we use a default value.
+	 * @return The value of a configuration: true if found, defaultValue if not found.
+	 */
+	public boolean getBooleanConfiguration(String arg, boolean defaultValue) {
+		Boolean value = ((Boolean) booleanConfigurations.get("startWithI2P"));
+		System.out.println(value);
+		if(value != null) {
+			return value;
+		}
+		return defaultValue;
+	}
+	
+	/**
+	 * Get a specific String configuration.
+	 * @param arg The key for the configuration.
+	 * @param defaultValue If the configuration is not found, we use a default value.
+	 * @return The value of the configuration, or the defaultValue.
+	 */
+	public String getStringConfiguration(String arg, String defaultValue) {
+		String value = stringConfigurations.get(arg);
+		System.out.println(value);
+		if(value != null) {
+			return value;
+		}
+		return defaultValue;
+	}
+}
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/util/I2PDesktop.java b/apps/desktopgui/src/net/i2p/desktopgui/util/I2PDesktop.java
new file mode 100644
index 0000000000000000000000000000000000000000..ad6e14cb315d8265f873a4ebe9cd04a87825eb7e
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/util/I2PDesktop.java
@@ -0,0 +1,35 @@
+package net.i2p.desktopgui.util;
+
+import java.awt.Desktop;
+import java.awt.TrayIcon;
+import java.awt.Desktop.Action;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import net.i2p.desktopgui.router.RouterManager;
+import net.i2p.util.Log;
+
+public class I2PDesktop {
+    
+    private final static Log log = new Log(I2PDesktop.class);
+    
+    public static void browse(String url) throws BrowseException {
+        if(Desktop.isDesktopSupported()) {
+            Desktop desktop = Desktop.getDesktop();
+            if(desktop.isSupported(Action.BROWSE)) {
+                try {
+                    desktop.browse(new URI(url));
+                } catch (Exception e) {
+                    throw new BrowseException();
+                }
+            }
+            else {
+                throw new BrowseException();
+            }
+        }
+        else {
+            throw new BrowseException();
+        }
+    }
+}
\ No newline at end of file
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/util/IntegerVerifier.java b/apps/desktopgui/src/net/i2p/desktopgui/util/IntegerVerifier.java
deleted file mode 100644
index 7cc0fb46ae5ccd8b676a5f33137909e3d5c36dd9..0000000000000000000000000000000000000000
--- a/apps/desktopgui/src/net/i2p/desktopgui/util/IntegerVerifier.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package net.i2p.desktopgui.util;
-
-import javax.swing.InputVerifier;
-import javax.swing.JComponent;
-import javax.swing.JTextField;
-
-/**
- *
- * @author mathias
- */
-
-public class IntegerVerifier extends InputVerifier {
-
-    @Override
-    public boolean verify(JComponent arg0) {
-        JTextField jtf = (JTextField) arg0;
-        return verify(jtf.getText());
-    }
-
-    @Override
-    public boolean shouldYieldFocus(JComponent input) {
-        return verify(input);
-    }
-    
-    public static boolean verify(String s) {
-        for(int i=0;i<s.length();i++)
-            if(s.charAt(i) > '9' || s.charAt(i) < '0')
-                return false;
-        return true;
-    }
-    
-}
\ No newline at end of file
diff --git a/apps/i2psnark/_icons/magnet.png b/apps/i2psnark/_icons/magnet.png
new file mode 100644
index 0000000000000000000000000000000000000000..3430f2e5a9c08050cb90248f42315876fd04cb6a
Binary files /dev/null and b/apps/i2psnark/_icons/magnet.png differ
diff --git a/apps/i2psnark/java/bmsg.sh b/apps/i2psnark/java/bmsg.sh
deleted file mode 100644
index b9d294b32336537241eb2f9953fb65673c93b524..0000000000000000000000000000000000000000
--- a/apps/i2psnark/java/bmsg.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Update messages_xx.po and messages_xx.class files,
-# from both java and jsp sources.
-# Requires installed programs xgettext, msgfmt, msgmerge, and find.
-# zzz - public domain
-#
-
-## launching sh.exe with -login parameter will open a shell with the current path always pointing to \bin\
-## need to cd into our orignal path - where we call sh.exe from.
-
-cd $CALLFROM
-## echo $PWD
-
-## except this everything is the same with bundle-message.sh
-## walking - public domain :-D
-
-source bundle-messages.sh $PARAS
\ No newline at end of file
diff --git a/apps/i2psnark/java/build.xml b/apps/i2psnark/java/build.xml
index 90f5cd6fe8f3c5c8b6ec2649f17016d1f7abad9b..e500dcc614fbbc4626266a302acb9b2d5e7ce136 100644
--- a/apps/i2psnark/java/build.xml
+++ b/apps/i2psnark/java/build.xml
@@ -30,18 +30,41 @@
             srcdir="./src" 
             debug="true" deprecation="on" source="1.5" target="1.5" 
             destdir="./build/obj" 
+            includeAntRuntime="false"
             classpath="../../../core/java/build/i2p.jar:../../jetty/jettylib/org.mortbay.jetty.jar:../../jetty/jettylib/javax.servlet.jar:../../ministreaming/java/build/mstreaming.jar" >
             <compilerarg line="${javac.compilerargs}" />
         </javac>
     </target>
-    <target name="jar" depends="builddep, compile">
+
+    <target name="jar" depends="builddep, compile, jarUpToDate" unless="jar.uptodate" >
+        <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value=".." />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
         <jar destfile="./build/i2psnark.jar" basedir="./build/obj" includes="**/*.class" excludes="**/I2PSnarkServlet*.class **/messages_*.class">
             <manifest>
                 <attribute name="Main-Class" value="org.klomp.snark.Snark" />
                 <attribute name="Class-Path" value="i2p.jar mstreaming.jar streaming.jar" />
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
             </manifest>
         </jar>
     </target>    
+    
+    <target name="jarUpToDate">
+        <uptodate property="jar.uptodate" targetfile="build/i2psnark.jar" >
+            <srcfiles dir= "build/obj" includes="**/*.class" excludes="**/I2PSnarkServlet*.class **/messages_*.class" />
+        </uptodate>
+    </target>    
+
     <!-- Ideally we would include
       -  only include the servlet, everything else is in the jar.
       -  However, the wrapper.config classpath in existing installs
@@ -49,25 +72,36 @@
       -  So we must continue to duplicate everything in the war.
           <classes dir="./build/obj" includes="**/I2PSnarkServlet*.class" />
      -->
-    <target name="war" depends="jar, bundle"> 
+    <target name="war" depends="jar, bundle, warUpToDate" unless="war.uptodate" > 
         <war destfile="../i2psnark.war" webxml="../web.xml" basedir="../" includes="_icons/*" >
           <!-- include only the web stuff, as of 0.7.12 the router will add i2psnark.jar to the classpath for the war -->
           <classes dir="./build/obj" includes="**/web/*.class" />
+            <manifest>
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
+            </manifest>
         </war>
     </target>
     
+    <target name="warUpToDate">
+        <uptodate property="war.uptodate" targetfile="../i2psnark.war" >
+            <srcfiles dir= "." includes="build/obj/org/klomp/snark/web/*.class ../_icons/* ../web.xml" />
+        </uptodate>
+    </target>
+    
     <target name="bundle" depends="compile">
         <!-- Update the messages_*.po files.
              We need to supply the bat file for windows, and then change the fail property to true -->
-        <exec executable="sh" osfamily="unix" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="unix" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="sh" osfamily="mac" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="mac" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="false" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+		<!-- multi-lang is optional -->
+        <exec executable="sh" osfamily="windows" failifexecutionfails="false" >
+            <arg value="./bundle-messages.sh" />
         </exec>
     </target>
 
@@ -81,9 +115,8 @@
             <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="true" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
     </target>
diff --git a/apps/i2psnark/java/bundle-messages.bat b/apps/i2psnark/java/bundle-messages.bat
deleted file mode 100644
index 90feca972a6457eebf97f9bdbea6028ac88d7789..0000000000000000000000000000000000000000
--- a/apps/i2psnark/java/bundle-messages.bat
+++ /dev/null
@@ -1,26 +0,0 @@
-@echo off
-set Callfrom=%cd%
-set Paras=%1
-
-rem before calling make sure you have msys and mingw 's "bin" path 
-rem in your current searching path
-rem type "set path" to check 
-if not exist ..\locale\*.only goto updateALL
-
-rem put a messages_xx.only(eg messages_zh.only) into locale folder
-rem this script will only touch the po file(eg zh) you specified, leaving other po files untact.
-
-for %%i in (..\locale\*.only) do set PO=%%~ni
-echo [Notice] Yu choose to Ony update the choosen file: %PO%.po 
-for %%i in (..\locale\*.po) do if not %%~ni==%PO% ren %%i %%~ni.po-
-
-call sh --login %cd%\bmsg.sh
-
-for %%i in (..\locale\*.po-) do if not %%~ni==%PO% ren %%i %%~ni.po
-goto end
-
-:updateALL
-call sh --login %cd%\bmsg.sh
-
-:end
-echo End of Message Bundling
\ No newline at end of file
diff --git a/apps/i2psnark/java/bundle-messages.sh b/apps/i2psnark/java/bundle-messages.sh
index c09aa811f94817e645cbc5b37c37870b058c2d31..64fc69f838a0765df2ac7e5e30a49d125a6e462d 100755
--- a/apps/i2psnark/java/bundle-messages.sh
+++ b/apps/i2psnark/java/bundle-messages.sh
@@ -18,6 +18,14 @@ then
 	POUPDATE=1
 fi
 
+# on windows, one must specify the path of commnad find
+# since windows has its own retarded version of find.
+if which find|grep -q -i windows ; then
+	export PATH=.:/bin:/usr/local/bin:$PATH
+fi
+# Fast mode - update ondemond
+# set LG2 to the language you need in envrionment varibales to enable this
+
 # add ../java/ so the refs will work in the po file
 JPATHS="../java/src"
 for i in ../locale/messages_*.po
@@ -26,6 +34,11 @@ do
 	LG=${i#../locale/messages_}
 	LG=${LG%.po}
 
+	# skip, if specified
+	if [ $LG2 ]; then
+		[ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only.
+	fi
+
 	if [ "$POUPDATE" = "1" ]
 	then
 		# make list of java files newer than the .po file
@@ -70,15 +83,19 @@ do
 		touch $i
 	fi
 
-	echo "Generating ${CLASS}_$LG ResourceBundle..."
+    if [ "$LG" != "en" ]
+    then
+        # only generate for non-source language
+        echo "Generating ${CLASS}_$LG ResourceBundle..."
 
-	# convert to class files in build/obj
-	msgfmt --java --statistics -r $CLASS -l $LG -d build/obj $i
-	if [ $? -ne 0 ]
-	then
-		echo 'Warning - msgfmt failed, not updating translations'
-		break
-	fi
+        # convert to class files in build/obj
+        msgfmt --java --statistics -r $CLASS -l $LG -d build/obj $i
+        if [ $? -ne 0 ]
+        then
+            echo 'Warning - msgfmt failed, not updating translations'
+            break
+        fi
+    fi
 done
 rm -f $TMPFILE
 # todo: return failure
diff --git a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java
index 52099d1d2e67bc5e657260ccb598a55369bf35a0..b4ba0f2996acd956d728a8e2d792d7a47dd16024 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java
@@ -137,6 +137,11 @@ public class ConnectionAcceptor implements Runnable
                     }
                 }
             } else {
+                if (socket.getPeerDestination().equals(_util.getMyDestination())) {
+                    _util.debug("Incoming connection from myself", Snark.ERROR);
+                    try { socket.close(); } catch (IOException ioe) {}
+                    continue;
+                }
                 Thread t = new I2PAppThread(new Handler(socket), "I2PSnark incoming connection");
                 t.start();
             }
@@ -174,11 +179,8 @@ public class ConnectionAcceptor implements Runnable
           try {
               InputStream in = _socket.getInputStream();
               OutputStream out = _socket.getOutputStream();
-
-              if (true) {
-                  in = new BufferedInputStream(in);
-                  //out = new BufferedOutputStream(out);
-              }
+              // this is for the readahead in PeerAcceptor.connection()
+              in = new BufferedInputStream(in);
               if (_log.shouldLog(Log.DEBUG))
                   _log.debug("Handling socket from " + _socket.getPeerDestination().calculateHash().toBase64());
               peeracceptor.connection(_socket, in, out);
diff --git a/apps/i2psnark/java/src/org/klomp/snark/CoordinatorListener.java b/apps/i2psnark/java/src/org/klomp/snark/CoordinatorListener.java
index a86afa781b6c32d7cd64bbd4d1d6920153c8aaa0..478c17bb507832aa2bdcd12a799513e870714380 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/CoordinatorListener.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/CoordinatorListener.java
@@ -31,6 +31,12 @@ public interface CoordinatorListener
    */
   void peerChange(PeerCoordinator coordinator, Peer peer);
 
+  /**
+   * Called when the PeerCoordinator got the MetaInfo via magnet.
+   * @since 0.8.4
+   */
+  void gotMetaInfo(PeerCoordinator coordinator, MetaInfo metainfo);
+
   public boolean overUploadLimit(int uploaders);
   public boolean overUpBWLimit();
   public boolean overUpBWLimit(long total);
diff --git a/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java b/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3770070f4e99436f747a1ca8aee559b64bc51f5
--- /dev/null
+++ b/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java
@@ -0,0 +1,361 @@
+package org.klomp.snark;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.i2p.I2PAppContext;
+import net.i2p.data.DataHelper;
+import net.i2p.util.Log;
+
+import org.klomp.snark.bencode.BDecoder;
+import org.klomp.snark.bencode.BEncoder;
+import org.klomp.snark.bencode.BEValue;
+import org.klomp.snark.bencode.InvalidBEncodingException;
+
+/**
+ * REF: BEP 10 Extension Protocol
+ * @since 0.8.2
+ * @author zzz
+ */
+abstract class ExtensionHandler {
+
+    private static final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(ExtensionHandler.class);
+
+    public static final int ID_HANDSHAKE = 0;
+    public static final int ID_METADATA = 1;
+    public static final String TYPE_METADATA = "ut_metadata";
+    public static final int ID_PEX = 2;
+    /** not ut_pex since the compact format is different */
+    public static final String TYPE_PEX = "i2p_pex";
+    /** Pieces * SHA1 Hash length, + 25% extra for file names, benconding overhead, etc */
+    private static final int MAX_METADATA_SIZE = Storage.MAX_PIECES * 20 * 5 / 4;
+    private static final int PARALLEL_REQUESTS = 3;
+
+
+  /**
+   *  @param metasize -1 if unknown
+   *  @return bencoded outgoing handshake message
+   */
+    public static byte[] getHandshake(int metasize) {
+        Map<String, Object> handshake = new HashMap();
+        Map<String, Integer> m = new HashMap();
+        m.put(TYPE_METADATA, Integer.valueOf(ID_METADATA));
+        m.put(TYPE_PEX, Integer.valueOf(ID_PEX));
+        if (metasize >= 0)
+            handshake.put("metadata_size", Integer.valueOf(metasize));
+        handshake.put("m", m);
+        handshake.put("p", Integer.valueOf(6881));
+        handshake.put("v", "I2PSnark");
+        handshake.put("reqq", Integer.valueOf(5));
+        return BEncoder.bencode(handshake);
+    }
+
+    public static void handleMessage(Peer peer, PeerListener listener, int id, byte[] bs) {
+        if (_log.shouldLog(Log.INFO))
+            _log.info("Got extension msg " + id + " length " + bs.length + " from " + peer);
+        if (id == ID_HANDSHAKE)
+            handleHandshake(peer, listener, bs);
+        else if (id == ID_METADATA)
+            handleMetadata(peer, listener, bs);
+        else if (id == ID_PEX)
+            handlePEX(peer, listener, bs);
+        else if (_log.shouldLog(Log.INFO))
+            _log.info("Unknown extension msg " + id + " from " + peer);
+    }
+
+    private static void handleHandshake(Peer peer, PeerListener listener, byte[] bs) {
+        if (_log.shouldLog(Log.DEBUG))
+            _log.debug("Got handshake msg from " + peer);
+        try {
+            // this throws NPE on missing keys
+            InputStream is = new ByteArrayInputStream(bs);
+            BDecoder dec = new BDecoder(is);
+            BEValue bev = dec.bdecodeMap();
+            Map<String, BEValue> map = bev.getMap();
+            peer.setHandshakeMap(map);
+            Map<String, BEValue> msgmap = map.get("m").getMap();
+
+            if (msgmap.get(TYPE_PEX) != null) {
+                if (_log.shouldLog(Log.WARN))
+                    _log.debug("Peer supports PEX extension: " + peer);
+                // peer state calls peer listener calls sendPEX()
+            }
+
+            MagnetState state = peer.getMagnetState();
+
+            if (msgmap.get(TYPE_METADATA) == null) {
+                if (_log.shouldLog(Log.WARN))
+                    _log.debug("Peer does not support metadata extension: " + peer);
+                // drop if we need metainfo and we haven't found anybody yet
+                synchronized(state) {
+                    if (!state.isInitialized()) {
+                        _log.debug("Dropping peer, we need metadata! " + peer);
+                        peer.disconnect();
+                    }
+                }
+                return;
+            }
+
+            BEValue msize = map.get("metadata_size");
+            if (msize == null) {
+                if (_log.shouldLog(Log.WARN))
+                    _log.debug("Peer does not have the metainfo size yet: " + peer);
+                // drop if we need metainfo and we haven't found anybody yet
+                synchronized(state) {
+                    if (!state.isInitialized()) {
+                        _log.debug("Dropping peer, we need metadata! " + peer);
+                        peer.disconnect();
+                    }
+                }
+                return;
+            }
+            int metaSize = msize.getInt();
+            if (_log.shouldLog(Log.WARN))
+                _log.debug("Got the metainfo size: " + metaSize);
+
+            int remaining;
+            synchronized(state) {
+                if (state.isComplete())
+                    return;
+
+                if (state.isInitialized()) {
+                    if (state.getSize() != metaSize) {
+                        if (_log.shouldLog(Log.WARN))
+                            _log.debug("Wrong metainfo size " + metaSize + " from: " + peer);
+                        peer.disconnect();
+                        return;
+                    }
+                } else {
+                    // initialize it
+                    if (metaSize > MAX_METADATA_SIZE) {
+                        if (_log.shouldLog(Log.WARN))
+                            _log.debug("Huge metainfo size " + metaSize + " from: " + peer);
+                        peer.disconnect(false);
+                        return;
+                    }
+                    if (_log.shouldLog(Log.INFO))
+                        _log.info("Initialized state, metadata size = " + metaSize + " from " + peer);
+                    state.initialize(metaSize);
+                }
+                remaining = state.chunksRemaining();
+            }
+
+            // send requests for chunks
+            int count = Math.min(remaining, PARALLEL_REQUESTS);
+            for (int i = 0; i < count; i++) {
+                int chk;
+                synchronized(state) {
+                    chk = state.getNextRequest();
+                }
+                if (_log.shouldLog(Log.INFO))
+                    _log.info("Request chunk " + chk + " from " + peer);
+                sendRequest(peer, chk);
+            }
+        } catch (Exception e) {
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("Handshake exception from " + peer, e);
+        }
+    }
+
+    private static final int TYPE_REQUEST = 0;
+    private static final int TYPE_DATA = 1;
+    private static final int TYPE_REJECT = 2;
+
+    private static final int CHUNK_SIZE = 16*1024;
+
+    /**
+     * REF: BEP 9
+     * @since 0.8.4
+     */
+    private static void handleMetadata(Peer peer, PeerListener listener, byte[] bs) {
+        if (_log.shouldLog(Log.DEBUG))
+            _log.debug("Got metadata msg from " + peer);
+        try {
+            InputStream is = new ByteArrayInputStream(bs);
+            BDecoder dec = new BDecoder(is);
+            BEValue bev = dec.bdecodeMap();
+            Map<String, BEValue> map = bev.getMap();
+            int type = map.get("msg_type").getInt();
+            int piece = map.get("piece").getInt();
+
+            MagnetState state = peer.getMagnetState();
+            if (type == TYPE_REQUEST) {
+                if (_log.shouldLog(Log.DEBUG))
+                    _log.debug("Got request for " + piece + " from: " + peer);
+                byte[] pc;
+                synchronized(state) {
+                    pc = state.getChunk(piece);
+                }
+                sendPiece(peer, piece, pc);
+                // Do this here because PeerConnectionOut only reports for PIECE messages
+                peer.uploaded(pc.length);
+                listener.uploaded(peer, pc.length);
+            } else if (type == TYPE_DATA) {
+                int size = map.get("total_size").getInt();
+                if (_log.shouldLog(Log.DEBUG))
+                    _log.debug("Got data for " + piece + " length " + size + " from: " + peer);
+                boolean done;
+                int chk = -1;
+                synchronized(state) {
+                    if (state.isComplete())
+                        return;
+                    int len = is.available();
+                    if (len != size) {
+                        // probably fatal
+                        if (_log.shouldLog(Log.WARN))
+                            _log.warn("total_size " + size + " but avail data " + len);
+                    }
+                    peer.downloaded(len);
+                    listener.downloaded(peer, len);
+                    done = state.saveChunk(piece, bs, bs.length - len, len);
+                    if (_log.shouldLog(Log.INFO))
+                        _log.info("Got chunk " + piece + " from " + peer);
+                    if (!done)
+                        chk = state.getNextRequest();
+                }
+                // out of the lock
+                if (done) {
+                    // Done!
+                    // PeerState will call the listener (peer coord), who will
+                    // check to see if the MagnetState has it
+                    if (_log.shouldLog(Log.WARN))
+                        _log.warn("Got last chunk from " + peer);
+                } else {
+                    // get the next chunk
+                    if (_log.shouldLog(Log.INFO))
+                        _log.info("Request chunk " + chk + " from " + peer);
+                    sendRequest(peer, chk);
+                }
+            } else if (type == TYPE_REJECT) {
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn("Got reject msg from " + peer);
+                peer.disconnect(false);
+            } else {
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn("Got unknown metadata msg from " + peer);
+                peer.disconnect(false);
+            }
+        } catch (Exception e) {
+            if (_log.shouldLog(Log.WARN))
+                _log.info("Metadata ext. msg. exception from " + peer, e);
+            // fatal ?
+            peer.disconnect(false);
+        }
+    }
+
+    private static void sendRequest(Peer peer, int piece) {
+        sendMessage(peer, TYPE_REQUEST, piece);
+    }
+
+    private static void sendReject(Peer peer, int piece) {
+        sendMessage(peer, TYPE_REJECT, piece);
+    }
+
+    /** REQUEST and REJECT are the same except for message type */
+    private static void sendMessage(Peer peer, int type, int piece) {
+        Map<String, Object> map = new HashMap();
+        map.put("msg_type", Integer.valueOf(type));
+        map.put("piece", Integer.valueOf(piece));
+        byte[] payload = BEncoder.bencode(map);
+        try {
+            int hisMsgCode = peer.getHandshakeMap().get("m").getMap().get(TYPE_METADATA).getInt();
+            peer.sendExtension(hisMsgCode, payload);
+        } catch (Exception e) {
+            // NPE, no metadata capability
+            if (_log.shouldLog(Log.WARN))
+                _log.info("Metadata send req msg exception to " + peer, e);
+        }
+    }
+
+    private static void sendPiece(Peer peer, int piece, byte[] data) {
+        Map<String, Object> map = new HashMap();
+        map.put("msg_type", Integer.valueOf(TYPE_DATA));
+        map.put("piece", Integer.valueOf(piece));
+        map.put("total_size", Integer.valueOf(data.length));
+        byte[] dict = BEncoder.bencode(map);
+        byte[] payload = new byte[dict.length + data.length];
+        System.arraycopy(dict, 0, payload, 0, dict.length);
+        System.arraycopy(data, 0, payload, dict.length, data.length);
+        try {
+            int hisMsgCode = peer.getHandshakeMap().get("m").getMap().get(TYPE_METADATA).getInt();
+            peer.sendExtension(hisMsgCode, payload);
+        } catch (Exception e) {
+            // NPE, no metadata caps
+            if (_log.shouldLog(Log.WARN))
+                _log.info("Metadata send piece msg exception to " + peer, e);
+        }
+    }
+
+    private static final int HASH_LENGTH = 32;
+
+    /**
+     * Can't find a published standard for this anywhere.
+     * See the libtorrent code.
+     * Here we use the "added" key as a single string of concatenated
+     * 32-byte peer hashes.
+     * added.f and dropped unsupported
+     * @since 0.8.4
+     */
+    private static void handlePEX(Peer peer, PeerListener listener, byte[] bs) {
+        if (_log.shouldLog(Log.DEBUG))
+            _log.debug("Got PEX msg from " + peer);
+        try {
+            InputStream is = new ByteArrayInputStream(bs);
+            BDecoder dec = new BDecoder(is);
+            BEValue bev = dec.bdecodeMap();
+            Map<String, BEValue> map = bev.getMap();
+            byte[] ids = map.get("added").getBytes();
+            if (ids.length < HASH_LENGTH)
+                return;
+            int len = Math.min(ids.length, (I2PSnarkUtil.MAX_CONNECTIONS - 1) * HASH_LENGTH);
+            List<PeerID> peers = new ArrayList(len / HASH_LENGTH);
+            for (int off = 0; off < len; off += HASH_LENGTH) {
+                byte[] hash = new byte[HASH_LENGTH];
+                System.arraycopy(ids, off, hash, 0, HASH_LENGTH);
+                if (DataHelper.eq(hash, peer.getPeerID().getDestHash()))
+                    continue;
+                PeerID pID = new PeerID(hash);
+                peers.add(pID);
+            }
+            // could include ourselves, listener must remove
+            listener.gotPeers(peer, peers);
+        } catch (Exception e) {
+            if (_log.shouldLog(Log.WARN))
+                _log.info("PEX msg exception from " + peer, e);
+            //peer.disconnect(false);
+        }
+    }
+
+    /**
+     * added.f and dropped unsupported
+     * @param pList non-null
+     * @since 0.8.4
+     */
+    public static void sendPEX(Peer peer, List<Peer> pList) {
+        if (pList.isEmpty())
+            return;
+        Map<String, Object> map = new HashMap();
+        byte[] peers = new byte[HASH_LENGTH * pList.size()];
+        int off = 0;
+        for (Peer p : pList) {
+            System.arraycopy(p.getPeerID().getDestHash(), 0, peers, off, HASH_LENGTH);
+            off += HASH_LENGTH;
+        }
+        map.put("added", peers);
+        byte[] payload = BEncoder.bencode(map);
+        try {
+            int hisMsgCode = peer.getHandshakeMap().get("m").getMap().get(TYPE_PEX).getInt();
+            peer.sendExtension(hisMsgCode, payload);
+        } catch (Exception e) {
+            // NPE, no PEX caps
+            if (_log.shouldLog(Log.WARN))
+                _log.info("PEX msg exception to " + peer, e);
+        }
+    }
+
+}
diff --git a/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandshake.java b/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandshake.java
deleted file mode 100644
index fb69b044d284a7414f74b3e58a0b5773fd1c8419..0000000000000000000000000000000000000000
--- a/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandshake.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.klomp.snark;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.klomp.snark.bencode.BEncoder;
-import org.klomp.snark.bencode.BEValue;
-
-/**
- * REF: BEP 10 Extension Protocol
- * @since 0.8.2
- */
-class ExtensionHandshake {
-
-    private static final byte[] _payload = buildPayload();
-
-  /**
-   *  @return bencoded data
-   */
-    static byte[] getPayload() {
-        return _payload;
-    }
-
-    /** just a test for now */
-    private static byte[] buildPayload() {
-        Map<String, Object> handshake = new HashMap();
-        Map<String, Integer> m = new HashMap();
-        m.put("foo", Integer.valueOf(99));
-        m.put("bar", Integer.valueOf(101));
-        handshake.put("m", m);
-        handshake.put("p", Integer.valueOf(6881));
-        handshake.put("v", "I2PSnark");
-        handshake.put("reqq", Integer.valueOf(5));
-        return BEncoder.bencode(handshake);
-    }
-}
diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
index b36c0fdcbf493cb682fb3bc28d5d56f7b744027f..6f35f66bdfba4d7a50b4e81f7ed314c1098b8b00 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
@@ -34,6 +34,9 @@ import net.i2p.util.SimpleScheduler;
 import net.i2p.util.SimpleTimer;
 import net.i2p.util.Translate;
 
+import org.klomp.snark.dht.DHT;
+//import org.klomp.snark.dht.KRPC;
+
 /**
  * I2P specific helpers for I2PSnark
  * We use this class as a sort of context for i2psnark
@@ -58,6 +61,8 @@ public class I2PSnarkUtil {
     private int _maxConnections;
     private File _tmpDir;
     private int _startupDelay;
+    private boolean _shouldUseOT;
+    private DHT _dht;
 
     public static final int DEFAULT_STARTUP_DELAY = 3;
     public static final String PROP_USE_OPENTRACKERS = "i2psnark.useOpentrackers";
@@ -66,6 +71,9 @@ public class I2PSnarkUtil {
     public static final String DEFAULT_OPENTRACKERS = "http://tracker.welterde.i2p/a";
     public static final int DEFAULT_MAX_UP_BW = 8;  //KBps
     public static final int MAX_CONNECTIONS = 16; // per torrent
+    private static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond";
+    //private static final boolean ENABLE_DHT = true;
+
     public I2PSnarkUtil(I2PAppContext ctx) {
         _context = ctx;
         _log = _context.logManager().getLog(Snark.class);
@@ -78,6 +86,7 @@ public class I2PSnarkUtil {
         _maxUpBW = DEFAULT_MAX_UP_BW;
         _maxConnections = MAX_CONNECTIONS;
         _startupDelay = DEFAULT_STARTUP_DELAY;
+        _shouldUseOT = DEFAULT_USE_OPENTRACKERS;
         // This is used for both announce replies and .torrent file downloads,
         // so it must be available even if not connected to I2CP.
         // so much for multiple instances
@@ -124,9 +133,21 @@ public class I2PSnarkUtil {
         _configured = true;
     }
     
+    /**
+     *  @param limit KBps
+     */
     public void setMaxUpBW(int limit) {
         _maxUpBW = limit;
+        _opts.put(PROP_MAX_BW, Integer.toString(limit * (1024 * 6 / 5)));   // add a little for overhead
         _configured = true;
+        if (_manager != null) {
+            I2PSession sess = _manager.getSession();
+            if (sess != null) {
+                Properties newProps = new Properties();
+                newProps.putAll(_opts);
+                sess.updateOptions(newProps);
+            }
+        }
     }
     
     public void setMaxConnections(int limit) {
@@ -146,6 +167,10 @@ public class I2PSnarkUtil {
     public int getEepProxyPort() { return _proxyPort; }
     public boolean getEepProxySet() { return _shouldProxy; }
     public int getMaxUploaders() { return _maxUploaders; }
+
+    /**
+     *  @return KBps
+     */
     public int getMaxUpBW() { return _maxUpBW; }
     public int getMaxConnections() { return _maxConnections; }
     public int getStartupDelay() { return _startupDelay; }  
@@ -158,7 +183,7 @@ public class I2PSnarkUtil {
             // try to find why reconnecting after stop
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Connecting to I2P", new Exception("I did it"));
-            Properties opts = new Properties();
+            Properties opts = _context.getProperties();
             if (_opts != null) {
                 for (Iterator iter = _opts.keySet().iterator(); iter.hasNext(); ) {
                     String key = (String)iter.next();
@@ -187,10 +212,20 @@ public class I2PSnarkUtil {
             //    opts.setProperty("i2p.streaming.readTimeout", "120000");
             _manager = I2PSocketManagerFactory.createManager(_i2cpHost, _i2cpPort, opts);
         }
+        // FIXME this only instantiates krpc once, left stuck with old manager
+        //if (ENABLE_DHT && _manager != null && _dht == null)
+        //    _dht = new KRPC(_context, _manager.getSession());
         return (_manager != null);
     }
     
+    /**
+     * @return null if disabled or not started
+     * @since 0.8.4
+     */
+    public DHT getDHT() { return _dht; }
+
     public boolean connected() { return _manager != null; }
+
     /**
      * Destroy the destination itself
      */
@@ -214,6 +249,8 @@ public class I2PSnarkUtil {
         Destination addr = peer.getAddress();
         if (addr == null)
             throw new IOException("Null address");
+        if (addr.equals(getMyDestination()))
+            throw new IOException("Attempt to connect to myself");
         Hash dest = addr.calculateHash();
         if (_shitlist.contains(dest))
             throw new IOException("Not trying to contact " + dest.toBase64() + ", as they are shitlisted");
@@ -287,15 +324,23 @@ public class I2PSnarkUtil {
     }
     
     String getOurIPString() {
+        Destination dest = getMyDestination();
+        if (dest != null)
+            return dest.toBase64();
+        return "unknown";
+    }
+
+    /**
+     *  @return dest or null
+     *  @since 0.8.4
+     */
+    Destination getMyDestination() {
         if (_manager == null)
-            return "unknown";
+            return null;
         I2PSession sess = _manager.getSession();
-        if (sess != null) {
-            Destination dest = sess.getMyDestination();
-            if (dest != null)
-                return dest.toBase64();
-        }
-        return "unknown";
+        if (sess != null)
+            return sess.getMyDestination();
+        return null;
     }
 
     /** Base64 only - static (no naming service) */
@@ -400,10 +445,10 @@ public class I2PSnarkUtil {
 
     /** comma delimited list open trackers to use as backups */
     /** sorted map of name to announceURL=baseURL */
-    public List getOpenTrackers() { 
+    public List<String> getOpenTrackers() { 
         if (!shouldUseOpenTrackers())
             return null;
-        List rv = new ArrayList(1);
+        List<String> rv = new ArrayList(1);
         String trackers = getOpenTrackerString();
         StringTokenizer tok = new StringTokenizer(trackers, ", ");
         while (tok.hasMoreTokens())
@@ -414,11 +459,27 @@ public class I2PSnarkUtil {
         return rv;
     }
     
+    public void setUseOpenTrackers(boolean yes) {
+        _shouldUseOT = yes;
+    }
+
     public boolean shouldUseOpenTrackers() {
-        String rv = (String) _opts.get(PROP_USE_OPENTRACKERS);
-        if (rv == null)
-            return DEFAULT_USE_OPENTRACKERS;
-        return Boolean.valueOf(rv).booleanValue();
+        return _shouldUseOT;
+    }
+
+    /**
+     *  Like DataHelper.toHexString but ensures no loss of leading zero bytes
+     *  @since 0.8.4
+     */
+    public static String toHex(byte[] b) {
+        StringBuilder buf = new StringBuilder(40);
+        for (int i = 0; i < b.length; i++) {
+            int bi = b[i] & 0xff;
+            if (bi < 16)
+                buf.append('0');
+            buf.append(Integer.toHexString(bi));
+        }
+        return buf.toString();
     }
 
     /** hook between snark's logger and an i2p log */
diff --git a/apps/i2psnark/java/src/org/klomp/snark/MagnetState.java b/apps/i2psnark/java/src/org/klomp/snark/MagnetState.java
new file mode 100644
index 0000000000000000000000000000000000000000..da89f5577a643b4bf5a3e6f5e5453972e083825a
--- /dev/null
+++ b/apps/i2psnark/java/src/org/klomp/snark/MagnetState.java
@@ -0,0 +1,211 @@
+package org.klomp.snark;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+import net.i2p.I2PAppContext;
+import net.i2p.data.DataHelper;
+
+import org.klomp.snark.bencode.BDecoder;
+import org.klomp.snark.bencode.BEValue;
+
+/**
+ * Simple state for the download of the metainfo, shared between
+ * Peer and ExtensionHandler.
+ *
+ * Nothing is synchronized here!
+ * Caller must synchronize on this for everything!
+ *
+ * Reference: BEP 9
+ *
+ * @since 0.8.4
+ * author zzz
+ */
+class MagnetState {
+    public static final int CHUNK_SIZE = 16*1024;
+    private static final Random random = I2PAppContext.getGlobalContext().random();
+
+    private final byte[] infohash;
+    private boolean complete;
+    /** if false, nothing below is valid */
+    private boolean isInitialized;
+
+    private int metaSize;
+    private int totalChunks;
+    /** bitfield for the metainfo chunks - will remain null if we start out complete */
+    private BitField requested;
+    private BitField have;
+    /** bitfield for the metainfo */
+    private byte[] metainfoBytes;
+    /** only valid when finished */
+    private MetaInfo metainfo;
+
+    /**
+     *  @param meta null for new magnet
+     */
+    public MagnetState(byte[] iHash, MetaInfo meta) {
+        infohash = iHash;
+        if (meta != null) {
+            metainfo = meta;
+            initialize(meta.getInfoBytes().length);
+            complete = true;
+        }
+    }
+
+    /**
+     *  Call this for a new magnet when you have the size
+     *  @throws IllegalArgumentException
+     */
+    public void initialize(int size) {
+        if (isInitialized)
+            throw new IllegalArgumentException("already set");
+        isInitialized = true;
+        metaSize = size;
+        totalChunks = (size + (CHUNK_SIZE - 1)) / CHUNK_SIZE;
+        if (metainfo != null) {
+            metainfoBytes = metainfo.getInfoBytes();
+        } else {
+            // we don't need these if complete
+            have = new BitField(totalChunks);
+            requested = new BitField(totalChunks);
+            metainfoBytes = new byte[metaSize];
+        }
+    }
+
+    /**
+     *  Call this for a new magnet when the download is complete.
+     *  @throws IllegalArgumentException
+     */
+    public void setMetaInfo(MetaInfo meta) {
+        metainfo = meta;
+    }
+
+    /**
+     *  @throws IllegalArgumentException
+     */
+    public MetaInfo getMetaInfo() {
+        if (!complete)
+            throw new IllegalArgumentException("not complete");
+        return metainfo;
+    }
+
+    /**
+     *  @throws IllegalArgumentException
+     */
+    public int getSize() {
+        if (!isInitialized)
+            throw new IllegalArgumentException("not initialized");
+        return metaSize;
+    }
+
+    public boolean isInitialized() {
+        return isInitialized;
+    }
+
+    public boolean isComplete() {
+        return complete;
+    }
+
+    public int chunkSize(int chunk) {
+        return Math.min(CHUNK_SIZE, metaSize - (chunk * CHUNK_SIZE));
+    }
+
+    /** @return chunk count */
+    public int chunksRemaining() {
+        if (!isInitialized)
+            throw new IllegalArgumentException("not initialized");
+        if (complete)
+            return 0;
+        return totalChunks - have.count();
+    }
+
+    /** @return chunk number */
+    public int getNextRequest() {
+        if (!isInitialized)
+            throw new IllegalArgumentException("not initialized");
+        if (complete)
+            throw new IllegalArgumentException("complete");
+        int rand = random.nextInt(totalChunks);
+        for (int i = 0; i < totalChunks; i++) {
+            int chk = (i + rand) % totalChunks; 
+            if (!(have.get(chk) || requested.get(chk))) {
+                requested.set(chk);
+                return chk; 
+            }
+        }
+        // all requested - end game
+        for (int i = 0; i < totalChunks; i++) {
+            int chk = (i + rand) % totalChunks; 
+            if (!have.get(chk))
+                return chk; 
+        }
+        throw new IllegalArgumentException("complete");
+    }
+
+    /**
+     *  @throws IllegalArgumentException
+     */
+    public byte[] getChunk(int chunk) {
+        if (!complete)
+            throw new IllegalArgumentException("not complete");
+        if (chunk < 0 || chunk >= totalChunks)
+            throw new IllegalArgumentException("bad chunk number");
+        int size = chunkSize(chunk);
+        byte[] rv = new byte[size];
+        System.arraycopy(metainfoBytes, chunk * CHUNK_SIZE, rv, 0, size);
+        // use meta.getInfoBytes() so we don't save it in memory
+        return rv;
+    }
+
+    /**
+     *  @return true if this was the last piece
+     *  @throws NPE, IllegalArgumentException, IOException, ...
+     */
+    public boolean saveChunk(int chunk, byte[] data, int off, int length) throws Exception {
+        if (!isInitialized)
+            throw new IllegalArgumentException("not initialized");
+        if (chunk < 0 || chunk >= totalChunks)
+            throw new IllegalArgumentException("bad chunk number");
+        if (have.get(chunk))
+            return false;  // shouldn't happen if synced
+        int size = chunkSize(chunk);
+        if (size != length)
+            throw new IllegalArgumentException("bad chunk length");
+        System.arraycopy(data, off, metainfoBytes, chunk * CHUNK_SIZE, size);
+        have.set(chunk);
+        boolean done = have.complete();
+        if (done) {
+            metainfo = buildMetaInfo();
+            complete = true;
+        }
+        return done;
+    }
+
+    /**
+     *  @return true if this was the last piece
+     *  @throws NPE, IllegalArgumentException, IOException, ...
+     */
+    public MetaInfo buildMetaInfo() throws Exception {
+        // top map has nothing in it but the info map (no announce)
+        Map<String, BEValue> map = new HashMap();
+        InputStream is = new ByteArrayInputStream(metainfoBytes);
+        BDecoder dec = new BDecoder(is);
+        BEValue bev = dec.bdecodeMap();
+        map.put("info", bev);
+        MetaInfo newmeta = new MetaInfo(map);
+        if (!DataHelper.eq(newmeta.getInfoHash(), infohash)) {
+            // Disaster. Start over. ExtensionHandler will catch
+            // the IOE and disconnect the peer, hopefully we will
+            // find a new peer.
+            // TODO: Count fails and give up eventually
+            have = new BitField(totalChunks);
+            requested = new BitField(totalChunks);
+            throw new IOException("info hash mismatch");
+        }
+        return newmeta;
+    }
+}
diff --git a/apps/i2psnark/java/src/org/klomp/snark/Message.java b/apps/i2psnark/java/src/org/klomp/snark/Message.java
index a9d1e23f2532508d0f5a904d14f45253328e4497..b4344f3ba588a68049fd08aa52bda99da4d3e3b6 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Message.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Message.java
@@ -53,6 +53,7 @@ class Message
 
   // Used for HAVE, REQUEST, PIECE and CANCEL messages.
   // low byte used for EXTENSION message
+  // low two bytes used for PORT message
   int piece;
 
   // Used for REQUEST, PIECE and CANCEL messages.
@@ -67,7 +68,8 @@ class Message
   // Used to do deferred fetch of data
   DataLoader dataLoader;
 
-  SimpleTimer.TimedEvent expireEvent;
+  // now unused
+  //SimpleTimer.TimedEvent expireEvent;
   
   /** Utility method for sending a message through a DataStream. */
   void sendMessage(DataOutputStream dos) throws IOException
@@ -103,10 +105,13 @@ class Message
     if (type == REQUEST || type == CANCEL)
       datalen += 4;
 
-    // length is 1 byte
+    // msg type is 1 byte
     if (type == EXTENSION)
       datalen += 1;
 
+    if (type == PORT)
+      datalen += 2;
+
     // add length of data for piece or bitfield array.
     if (type == BITFIELD || type == PIECE || type == EXTENSION)
       datalen += len;
@@ -130,6 +135,9 @@ class Message
     if (type == EXTENSION)
         dos.writeByte((byte) piece & 0xff);
 
+    if (type == PORT)
+        dos.writeShort(piece & 0xffff);
+
     // Send actual data
     if (type == BITFIELD || type == PIECE || type == EXTENSION)
       dos.write(data, off, len);
@@ -160,6 +168,8 @@ class Message
         return "PIECE(" + piece + "," + begin + "," + length + ")";
       case CANCEL:
         return "CANCEL(" + piece + "," + begin + "," + length + ")";
+      case PORT:
+        return "PORT(" + piece + ")";
       case EXTENSION:
         return "EXTENSION(" + piece + ',' + data.length + ')';
       default:
diff --git a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java
index ad2680045f19256d440de1db1860d482c925892c..5889db89ec3a91f03dd54edc173e164fd07c907d 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java
@@ -20,11 +20,13 @@
 
 package org.klomp.snark;
 
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -33,6 +35,7 @@ import java.util.Map;
 import net.i2p.I2PAppContext;
 import net.i2p.crypto.SHA1;
 import net.i2p.data.Base64;
+import net.i2p.data.DataHelper;
 import net.i2p.util.Log;
 
 import org.klomp.snark.bencode.BDecoder;
@@ -53,37 +56,49 @@ public class MetaInfo
   private final byte[] info_hash;
   private final String name;
   private final String name_utf8;
-  private final List files;
-  private final List files_utf8;
-  private final List lengths;
+  private final List<List<String>> files;
+  private final List<List<String>> files_utf8;
+  private final List<Long> lengths;
   private final int piece_length;
   private final byte[] piece_hashes;
   private final long length;
-  private final Map infoMap;
+  private Map<String, BEValue> infoMap;
 
-  private byte[] torrentdata;
-
-  MetaInfo(String announce, String name, String name_utf8, List files, List lengths,
+  /**
+   *  Called by Storage when creating a new torrent from local data
+   *
+   *  @param announce may be null
+   *  @param files null for single-file torrent
+   *  @param lengths null for single-file torrent
+   */
+  MetaInfo(String announce, String name, String name_utf8, List<List<String>> files, List<Long> lengths,
            int piece_length, byte[] piece_hashes, long length)
   {
     this.announce = announce;
     this.name = name;
     this.name_utf8 = name_utf8;
-    this.files = files;
+    this.files = files == null ? null : Collections.unmodifiableList(files);
     this.files_utf8 = null;
-    this.lengths = lengths;
+    this.lengths = lengths == null ? null : Collections.unmodifiableList(lengths);
     this.piece_length = piece_length;
     this.piece_hashes = piece_hashes;
     this.length = length;
 
+    // TODO if we add a parameter for other keys
+    //if (other != null) {
+    //    otherInfo = new HashMap(2);
+    //    otherInfo.putAll(other);
+    //}
+
     this.info_hash = calculateInfoHash();
-    infoMap = null;
+    //infoMap = null;
   }
 
   /**
    * Creates a new MetaInfo from the given InputStream.  The
    * InputStream must start with a correctly bencoded dictonary
    * describing the torrent.
+   * Caller must close the stream.
    */
   public MetaInfo(InputStream in) throws IOException
   {
@@ -94,56 +109,69 @@ public class MetaInfo
    * Creates a new MetaInfo from the given BDecoder.  The BDecoder
    * must have a complete dictionary describing the torrent.
    */
-  public MetaInfo(BDecoder be) throws IOException
+  private MetaInfo(BDecoder be) throws IOException
   {
     // Note that evaluation order matters here...
     this(be.bdecodeMap().getMap());
+    byte[] origInfohash = be.get_special_map_digest();
+    // shouldn't ever happen
+    if (!DataHelper.eq(origInfohash, info_hash))
+        throw new InvalidBEncodingException("Infohash mismatch, please report");
   }
 
   /**
    * Creates a new MetaInfo from a Map of BEValues and the SHA1 over
    * the original bencoded info dictonary (this is a hack, we could
    * reconstruct the bencoded stream and recalculate the hash). Will
-   * throw a InvalidBEncodingException if the given map does not
-   * contain a valid announce string or info dictonary.
+   * NOT throw a InvalidBEncodingException if the given map does not
+   * contain a valid announce string.
+   * WILL throw a InvalidBEncodingException if the given map does not
+   * contain a valid info dictionary.
    */
-  public MetaInfo(Map m) throws InvalidBEncodingException
+  public MetaInfo(Map<String, BEValue> m) throws InvalidBEncodingException
   {
     if (_log.shouldLog(Log.DEBUG))
         _log.debug("Creating a metaInfo: " + m, new Exception("source"));
-    BEValue val = (BEValue)m.get("announce");
-    if (val == null)
-        throw new InvalidBEncodingException("Missing announce string");
-    this.announce = val.getString();
+    BEValue val = m.get("announce");
+    // Disabled check, we can get info from a magnet now
+    if (val == null) {
+        //throw new InvalidBEncodingException("Missing announce string");
+        this.announce = null;
+    } else {
+        this.announce = val.getString();
+    }
 
-    val = (BEValue)m.get("info");
+    val = m.get("info");
     if (val == null)
         throw new InvalidBEncodingException("Missing info map");
-    Map info = val.getMap();
-    infoMap = info;
+    Map<String, BEValue> info = val.getMap();
+    infoMap = Collections.unmodifiableMap(info);
 
-    val = (BEValue)info.get("name");
+    val = info.get("name");
     if (val == null)
         throw new InvalidBEncodingException("Missing name string");
     name = val.getString();
+    // We could silently replace the '/', but that messes up the info hash, so just throw instead.
+    if (name.indexOf('/') >= 0)
+        throw new InvalidBEncodingException("Invalid name containing '/' " + name);
 
-    val = (BEValue)info.get("name.utf-8");
+    val = info.get("name.utf-8");
     if (val != null)
         name_utf8 = val.getString();
     else
         name_utf8 = null;
 
-    val = (BEValue)info.get("piece length");
+    val = info.get("piece length");
     if (val == null)
         throw new InvalidBEncodingException("Missing piece length number");
     piece_length = val.getInt();
 
-    val = (BEValue)info.get("pieces");
+    val = info.get("pieces");
     if (val == null)
         throw new InvalidBEncodingException("Missing piece bytes");
     piece_hashes = val.getBytes();
 
-    val = (BEValue)info.get("length");
+    val = info.get("length");
     if (val != null)
       {
         // Single file case.
@@ -155,44 +183,61 @@ public class MetaInfo
     else
       {
         // Multi file case.
-        val = (BEValue)info.get("files");
+        val = info.get("files");
         if (val == null)
           throw new InvalidBEncodingException
             ("Missing length number and/or files list");
 
-        List list = val.getList();
+        List<BEValue> list = val.getList();
         int size = list.size();
         if (size == 0)
           throw new InvalidBEncodingException("zero size files list");
 
-        files = new ArrayList(size);
-        files_utf8 = new ArrayList(size);
-        lengths = new ArrayList(size);
+        List<List<String>> m_files = new ArrayList(size);
+        List<List<String>> m_files_utf8 = new ArrayList(size);
+        List<Long> m_lengths = new ArrayList(size);
         long l = 0;
         for (int i = 0; i < list.size(); i++)
           {
-            Map desc = ((BEValue)list.get(i)).getMap();
-            val = (BEValue)desc.get("length");
+            Map<String, BEValue> desc = list.get(i).getMap();
+            val = desc.get("length");
             if (val == null)
               throw new InvalidBEncodingException("Missing length number");
             long len = val.getLong();
-            lengths.add(new Long(len));
+            if (len < 0)
+              throw new InvalidBEncodingException("Negative file length");
+            m_lengths.add(Long.valueOf(len));
+            // check for overflowing the long
+            long oldTotal = l;
             l += len;
+            if (l < oldTotal)
+              throw new InvalidBEncodingException("Huge total length");
 
             val = (BEValue)desc.get("path");
             if (val == null)
               throw new InvalidBEncodingException("Missing path list");
-            List path_list = val.getList();
+            List<BEValue> path_list = val.getList();
             int path_length = path_list.size();
             if (path_length == 0)
               throw new InvalidBEncodingException("zero size file path list");
 
-            List file = new ArrayList(path_length);
-            Iterator it = path_list.iterator();
-            while (it.hasNext())
-              file.add(((BEValue)it.next()).getString());
+            List<String> file = new ArrayList(path_length);
+            Iterator<BEValue> it = path_list.iterator();
+            while (it.hasNext()) {
+                String s = it.next().getString();
+                // We could throw an IBEE, but just silently replace instead.
+                if (s.indexOf('/') >= 0)
+                    s = s.replace("/", "_");
+                file.add(s);
+            }
+
+            // quick dup check - case sensitive, etc. - Storage does a better job
+            for (int j = 0; j < i; j++) {
+                if (file.equals(m_files.get(j)))
+                    throw new InvalidBEncodingException("Duplicate file path " + DataHelper.toString(file));
+            }
 
-            files.add(file);
+            m_files.add(Collections.unmodifiableList(file));
             
             val = (BEValue)desc.get("path.utf-8");
             if (val != null) {
@@ -202,19 +247,45 @@ public class MetaInfo
                     file = new ArrayList(path_length);
                     it = path_list.iterator();
                     while (it.hasNext())
-                        file.add(((BEValue)it.next()).getString());
-                    files_utf8.add(file);
+                        file.add(it.next().getString());
+                    m_files_utf8.add(Collections.unmodifiableList(file));
                 }
             }
           }
+        files = Collections.unmodifiableList(m_files);
+        files_utf8 = Collections.unmodifiableList(m_files_utf8);
+        lengths = Collections.unmodifiableList(m_lengths);
         length = l;
       }
 
     info_hash = calculateInfoHash();
   }
 
+  /**
+   * Efficiently returns the name and the 20 byte SHA1 hash of the info dictionary in a torrent file
+   * Caller must close stream.
+   *
+   * @param infoHashOut 20-byte out parameter
+   * @since 0.8.5
+   */
+  public static String getNameAndInfoHash(InputStream in, byte[] infoHashOut) throws IOException {
+      BDecoder bd = new BDecoder(in);
+      Map<String, BEValue> m = bd.bdecodeMap().getMap();
+      BEValue ibev = m.get("info");
+      if (ibev == null)
+          throw new InvalidBEncodingException("Missing info map");
+      Map<String, BEValue> i = ibev.getMap();
+      BEValue rvbev = i.get("name");
+      if (rvbev == null)
+          throw new InvalidBEncodingException("Missing name");
+      byte[] h = bd.get_special_map_digest();
+      System.arraycopy(h, 0, infoHashOut, 0, 20);
+      return rvbev.getString();
+  }
+
   /**
    * Returns the string representing the URL of the tracker for this torrent.
+   * @return may be null!
    */
   public String getAnnounce()
   {
@@ -253,9 +324,8 @@ public class MetaInfo
    * a single name. It has the same size as the list returned by
    * getLengths().
    */
-  public List getFiles()
+  public List<List<String>> getFiles()
   {
-    // XXX - Immutable?
     return files;
   }
 
@@ -264,9 +334,8 @@ public class MetaInfo
    * files, or null if it is a single file. It has the same size as
    * the list returned by getFiles().
    */
-  public List getLengths()
+  public List<Long> getLengths()
   {
-    // XXX - Immutable?
     return lengths;
   }
 
@@ -303,11 +372,13 @@ public class MetaInfo
    */
   public boolean checkPiece(int piece, byte[] bs, int off, int length)
   {
-    if (true)
+    //if (true)
         return fast_checkPiece(piece, bs, off, length);
-    else
-        return orig_checkPiece(piece, bs, off, length);
+    //else
+    //    return orig_checkPiece(piece, bs, off, length);
   }
+
+/****
   private boolean orig_checkPiece(int piece, byte[] bs, int off, int length) {
     // Check digest
     MessageDigest sha1;
@@ -327,6 +398,7 @@ public class MetaInfo
         return false;
     return true;
   }
+****/
   
   private boolean fast_checkPiece(int piece, byte[] bs, int off, int length) {
     SHA1 sha1 = new SHA1();
@@ -350,7 +422,7 @@ public class MetaInfo
     @Override
   public String toString()
   {
-    return "MetaInfo[info_hash='" + hexencode(info_hash)
+    return "MetaInfo[info_hash='" + I2PSnarkUtil.toHex(info_hash)
       + "', announce='" + announce
       + "', name='" + name
       + "', files=" + files
@@ -360,23 +432,6 @@ public class MetaInfo
       + "']";
   }
 
-  /**
-   * Encode a byte array as a hex encoded string.
-   */
-  private static String hexencode(byte[] bs)
-  {
-    StringBuilder sb = new StringBuilder(bs.length*2);
-    for (int i = 0; i < bs.length; i++)
-      {
-        int c = bs[i] & 0xFF;
-        if (c < 16)
-          sb.append('0');
-        sb.append(Integer.toHexString(c));
-      }
-
-    return sb.toString();
-  }
-
   /**
    * Creates a copy of this MetaInfo that shares everything except the
    * announce URL.
@@ -388,33 +443,43 @@ public class MetaInfo
                         piece_hashes, length);
   }
 
-  public byte[] getTorrentData()
+  /**
+   *  Called by servlet to save a new torrent file generated from local data
+   */
+  public synchronized byte[] getTorrentData()
   {
-    if (torrentdata == null)
-      {
         Map m = new HashMap();
-        m.put("announce", announce);
+        if (announce != null)
+            m.put("announce", announce);
         Map info = createInfoMap();
         m.put("info", info);
-        torrentdata = BEncoder.bencode(m);
-      }
-    return torrentdata;
+        // don't save this locally, we should only do this once
+        return BEncoder.bencode(m);
   }
 
-  private Map createInfoMap()
+  /** @since 0.8.4 */
+  public synchronized byte[] getInfoBytes() {
+    if (infoMap == null)
+        createInfoMap();
+    return BEncoder.bencode(infoMap);
+  }
+
+  /** @return an unmodifiable view of the Map */
+  private Map<String, BEValue> createInfoMap()
   {
+    // If we loaded this metainfo from a file, we have the map, and we must use it
+    // or else we will lose any non-standard keys and corrupt the infohash.
+    if (infoMap != null)
+        return Collections.unmodifiableMap(infoMap);
+    // otherwise we must create it
     Map info = new HashMap();
-    if (infoMap != null) {
-        info.putAll(infoMap);
-        return info;
-    }
     info.put("name", name);
     if (name_utf8 != null)
         info.put("name.utf-8", name_utf8);
     info.put("piece length", Integer.valueOf(piece_length));
     info.put("pieces", piece_hashes);
     if (files == null)
-      info.put("length", new Long(length));
+      info.put("length", Long.valueOf(length));
     else
       {
         List l = new ArrayList();
@@ -429,26 +494,29 @@ public class MetaInfo
           }
         info.put("files", l);
       }
-    return info;
+
+    // TODO if we add the ability for other keys in the first constructor
+    //if (otherInfo != null)
+    //    info.putAll(otherInfo);
+
+    infoMap = info;
+    return Collections.unmodifiableMap(infoMap);
   }
 
   private byte[] calculateInfoHash()
   {
-    Map info = createInfoMap();
-    StringBuilder buf = new StringBuilder(128);
-    buf.append("info: ");
-    for (Iterator iter = info.entrySet().iterator(); iter.hasNext(); ) {
-        Map.Entry entry = (Map.Entry)iter.next();
-        String key = (String)entry.getKey();
-        Object val = entry.getValue();
-        buf.append(key).append('=');
-        if (val instanceof byte[])
-            buf.append(Base64.encode((byte[])val, true));
-        else
+    Map<String, BEValue> info = createInfoMap();
+    if (_log.shouldLog(Log.DEBUG)) {
+        StringBuilder buf = new StringBuilder(128);
+        buf.append("info: ");
+        for (Map.Entry<String, BEValue> entry : info.entrySet()) {
+            String key = entry.getKey();
+            Object val = entry.getValue();
+            buf.append(key).append('=');
             buf.append(val.toString());
-    }
-    if (_log.shouldLog(Log.DEBUG))
+        }
         _log.debug(buf.toString());
+    }
     byte[] infoBytes = BEncoder.bencode(info);
     //_log.debug("info bencoded: [" + Base64.encode(infoBytes, true) + "]");
     try
@@ -456,7 +524,7 @@ public class MetaInfo
         MessageDigest digest = MessageDigest.getInstance("SHA");
         byte hash[] = digest.digest(infoBytes);
         if (_log.shouldLog(Log.DEBUG))
-            _log.debug("info hash: [" + net.i2p.data.Base64.encode(hash) + "]");
+            _log.debug("info hash: " + I2PSnarkUtil.toHex(hash));
         return hash;
       }
     catch(NoSuchAlgorithmException nsa)
@@ -465,5 +533,23 @@ public class MetaInfo
       }
   }
 
-  
+  /** @since 0.8.5 */
+  public static void main(String[] args) {
+      if (args.length <= 0) {
+          System.err.println("Usage: MetaInfo files...");
+          return;
+      }
+      for (int i = 0; i < args.length; i++) {
+          InputStream in = null;
+          try {
+              in = new FileInputStream(args[i]);
+              MetaInfo meta = new MetaInfo(in);
+              System.out.println(args[i] + " InfoHash: " + I2PSnarkUtil.toHex(meta.getInfoHash()));
+          } catch (IOException ioe) {
+              System.err.println("Error in file " + args[i] + ": " + ioe);
+          } finally {
+              try { if (in != null) in.close(); } catch (IOException ioe) {}
+          }
+      }
+  }
 }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/Peer.java b/apps/i2psnark/java/src/org/klomp/snark/Peer.java
index cd46bbf8b6a4b26da32515e6335700bf6fdaeef7..5489148121228bab903e2c4ac79ef7c1c03b979b 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Peer.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Peer.java
@@ -20,7 +20,6 @@
 
 package org.klomp.snark;
 
-import java.io.BufferedInputStream;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -28,28 +27,44 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
+import net.i2p.I2PAppContext;
 import net.i2p.client.streaming.I2PSocket;
+import net.i2p.data.DataHelper;
+import net.i2p.data.Destination;
 import net.i2p.util.Log;
 
+import org.klomp.snark.bencode.BEValue;
+
 public class Peer implements Comparable
 {
-  private Log _log = new Log(Peer.class);
+  private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(Peer.class);
   // Identifying property, the peer id of the other side.
   private final PeerID peerID;
 
   private final byte[] my_id;
-  final MetaInfo metainfo;
+  private final byte[] infohash;
+  /** will start out null in magnet mode */
+  private MetaInfo metainfo;
+  private Map<String, BEValue> handshakeMap;
 
   // The data in/output streams set during the handshake and used by
   // the actual connections.
   private DataInputStream din;
   private DataOutputStream dout;
 
+  /** running counters */
+  private long downloaded;
+  private long uploaded;
+
   // Keeps state for in/out connections.  Non-null when the handshake
   // was successful, the connection setup and runs
   PeerState state;
 
+  /** shared across all peers on this torrent */
+  MagnetState magnetState;
+
   private I2PSocket sock;
   
   private boolean deregister = true;
@@ -64,18 +79,22 @@ public class Peer implements Comparable
   static final long OPTION_EXTENSION = 0x0000000000100000l;
   static final long OPTION_FAST      = 0x0000000000000004l;
   static final long OPTION_DHT       = 0x0000000000000001l;
+  /** we use a different bit since the compact format is different */
+  static final long OPTION_I2P_DHT   = 0x0000000040000000l;
+  static final long OPTION_AZMP      = 0x1000000000000000l;
   private long options;
 
   /**
    * Outgoing connection.
    * Creates a disconnected peer given a PeerID, your own id and the
    * relevant MetaInfo.
+   * @param metainfo null if in magnet mode
    */
-  public Peer(PeerID peerID, byte[] my_id, MetaInfo metainfo)
-    throws IOException
+  public Peer(PeerID peerID, byte[] my_id, byte[] infohash, MetaInfo metainfo)
   {
     this.peerID = peerID;
     this.my_id = my_id;
+    this.infohash = infohash;
     this.metainfo = metainfo;
     _id = ++__id;
     //_log.debug("Creating a new peer with " + peerID.toString(), new Exception("creating"));
@@ -89,12 +108,14 @@ public class Peer implements Comparable
    * get the remote peer id. To completely start the connection call
    * the connect() method.
    *
+   * @param metainfo null if in magnet mode
    * @exception IOException when an error occurred during the handshake.
    */
-  public Peer(final I2PSocket sock, InputStream in, OutputStream out, byte[] my_id, MetaInfo metainfo)
+  public Peer(final I2PSocket sock, InputStream in, OutputStream out, byte[] my_id, byte[] infohash, MetaInfo metainfo)
     throws IOException
   {
     this.my_id = my_id;
+    this.infohash = infohash;
     this.metainfo = metainfo;
     this.sock = sock;
 
@@ -102,7 +123,7 @@ public class Peer implements Comparable
     this.peerID = new PeerID(id, sock.getPeerDestination());
     _id = ++__id;
     if (_log.shouldLog(Log.DEBUG))
-        _log.debug("Creating a new peer with " + peerID.toString(), new Exception("creating " + _id));
+        _log.debug("Creating a new peer " + peerID.toString(), new Exception("creating " + _id));
   }
 
   /**
@@ -192,7 +213,7 @@ public class Peer implements Comparable
    * If the given BitField is non-null it is send to the peer as first
    * message.
    */
-  public void runConnection(I2PSnarkUtil util, PeerListener listener, BitField bitfield)
+  public void runConnection(I2PSnarkUtil util, PeerListener listener, BitField bitfield, MagnetState mState)
   {
     if (state != null)
       throw new IllegalStateException("Peer already started");
@@ -212,19 +233,8 @@ public class Peer implements Comparable
                 throw new IOException("Unable to reach " + peerID);
             }
             InputStream in = sock.getInputStream();
-            OutputStream out = sock.getOutputStream(); //new BufferedOutputStream(sock.getOutputStream());
-            if (true) {
-                // buffered output streams are internally synchronized, so we can't get through to the underlying
-                // I2PSocket's MessageOutputStream to close() it if we are blocking on a write(...).  Oh, and the
-                // buffer is unnecessary anyway, as unbuffered access lets the streaming lib do the 'right thing'.
-                //out = new BufferedOutputStream(out);
-                in = new BufferedInputStream(sock.getInputStream());
-            }
-            //BufferedInputStream bis
-            //  = new BufferedInputStream(sock.getInputStream());
-            //BufferedOutputStream bos
-            //  = new BufferedOutputStream(sock.getOutputStream());
-            byte [] id = handshake(in, out); //handshake(bis, bos);
+            OutputStream out = sock.getOutputStream();
+            byte [] id = handshake(in, out);
             byte [] expected_id = peerID.getID();
             if (expected_id == null) {
                 peerID.setID(id);
@@ -243,14 +253,29 @@ public class Peer implements Comparable
                 _log.debug("Already have din [" + sock + "] with " + toString());
           }
         
+        // bad idea?
+        if (metainfo == null && (options & OPTION_EXTENSION) == 0) {
+            if (_log.shouldLog(Log.INFO))
+                _log.info("Peer does not support extensions and we need metainfo, dropping");
+            throw new IOException("Peer does not support extensions and we need metainfo, dropping");
+        }
+
         PeerConnectionIn in = new PeerConnectionIn(this, din);
         PeerConnectionOut out = new PeerConnectionOut(this, dout);
         PeerState s = new PeerState(this, listener, metainfo, in, out);
         
         if ((options & OPTION_EXTENSION) != 0) {
             if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Peer supports extensions, sending test message");
-            out.sendExtension(0, ExtensionHandshake.getPayload());
+                _log.debug("Peer supports extensions, sending reply message");
+            int metasize = metainfo != null ? metainfo.getInfoBytes().length : -1;
+            out.sendExtension(0, ExtensionHandler.getHandshake(metasize));
+        }
+
+        if ((options & OPTION_I2P_DHT) != 0 && util.getDHT() != null) {
+            if (_log.shouldLog(Log.DEBUG))
+                _log.debug("Peer supports DHT, sending PORT message");
+            int port = util.getDHT().getPort();
+            out.sendPort(port);
         }
 
         // Send our bitmap
@@ -259,6 +284,7 @@ public class Peer implements Comparable
     
         // We are up and running!
         state = s;
+        magnetState = mState;
         listener.connected(this);
   
         if (_log.shouldLog(Log.DEBUG))
@@ -293,7 +319,7 @@ public class Peer implements Comparable
    * Sets DataIn/OutputStreams, does the handshake and returns the id
    * reported by the other side.
    */
-  private byte[] handshake(InputStream in, OutputStream out) //BufferedInputStream bis, BufferedOutputStream bos)
+  private byte[] handshake(InputStream in, OutputStream out)
     throws IOException
   {
     din = new DataInputStream(in);
@@ -303,10 +329,13 @@ public class Peer implements Comparable
     dout.write(19);
     dout.write("BitTorrent protocol".getBytes("UTF-8"));
     // Handshake write - options
-    dout.writeLong(OPTION_EXTENSION);
+    long myOptions = OPTION_EXTENSION;
+    // FIXME get util here somehow
+    //if (util.getDHT() != null)
+    //    myOptions |= OPTION_I2P_DHT;
+    dout.writeLong(myOptions);
     // Handshake write - metainfo hash
-    byte[] shared_hash = metainfo.getInfoHash();
-    dout.write(shared_hash);
+    dout.write(infohash);
     // Handshake write - peer id
     dout.write(my_id);
     dout.flush();
@@ -334,7 +363,7 @@ public class Peer implements Comparable
     // Handshake read - metainfo hash
     bs = new byte[20];
     din.readFully(bs);
-    if (!Arrays.equals(shared_hash, bs))
+    if (!Arrays.equals(infohash, bs))
       throw new IOException("Unexpected MetaInfo hash");
 
     // Handshake read - peer id
@@ -342,8 +371,11 @@ public class Peer implements Comparable
     if (_log.shouldLog(Log.DEBUG))
         _log.debug("Read the remote side's hash and peerID fully from " + toString());
 
+    if (DataHelper.eq(my_id, bs))
+        throw new IOException("Connected to myself");
+
     if (options != 0) {
-        // send them something
+        // send them something in runConnection() above
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Peer supports options 0x" + Long.toString(options, 16) + ": " + toString());
     }
@@ -351,6 +383,55 @@ public class Peer implements Comparable
     return bs;
   }
 
+  /** @since 0.8.4 */
+  public long getOptions() {
+      return options;
+  }
+
+  /** @since 0.8.4 */
+  public Destination getDestination() {
+      if (sock == null)
+          return null;
+      return sock.getPeerDestination();
+  }
+
+  /**
+   *  Shared state across all peers, callers must sync on returned object
+   *  @return non-null
+   *  @since 0.8.4
+   */
+  public MagnetState getMagnetState() {
+      return magnetState;
+  }
+
+  /** @return could be null @since 0.8.4 */
+  public Map<String, BEValue> getHandshakeMap() {
+      return handshakeMap;
+  }
+
+  /** @since 0.8.4 */
+  public void setHandshakeMap(Map<String, BEValue> map) {
+      handshakeMap = map;
+  }
+
+  /** @since 0.8.4 */
+  public void sendExtension(int type, byte[] payload) {
+    PeerState s = state;
+    if (s != null)
+        s.out.sendExtension(type, payload);
+  }
+
+  /**
+   *  Switch from magnet mode to normal mode
+   *  @since 0.8.4
+   */
+  public void setMetaInfo(MetaInfo meta) {
+    metainfo = meta;
+    PeerState s = state;
+    if (s != null)
+        s.setMetaInfo(meta);
+  }
+
   public boolean isConnected()
   {
     return state != null;
@@ -513,14 +594,29 @@ public class Peer implements Comparable
     return (s == null) || s.choked;
   }
 
+  /**
+   * Increment the counter.
+   * @since 0.8.4
+   */
+  public void downloaded(int size) {
+      downloaded += size;
+  }
+
+  /**
+   * Increment the counter.
+   * @since 0.8.4
+   */
+  public void uploaded(int size) {
+      uploaded += size;
+  }
+
   /**
    * Returns the number of bytes that have been downloaded.
    * Can be reset to zero with <code>resetCounters()</code>/
    */
   public long getDownloaded()
   {
-    PeerState s = state;
-    return (s != null) ? s.downloaded : 0;
+      return downloaded;
   }
 
   /**
@@ -529,8 +625,7 @@ public class Peer implements Comparable
    */
   public long getUploaded()
   {
-    PeerState s = state;
-    return (s != null) ? s.uploaded : 0;
+      return uploaded;
   }
 
   /**
@@ -538,12 +633,8 @@ public class Peer implements Comparable
    */
   public void resetCounters()
   {
-    PeerState s = state;
-    if (s != null)
-      {
-        s.downloaded = 0;
-        s.uploaded = 0;
-      }
+      downloaded = 0;
+      uploaded = 0;
   }
   
   public long getInactiveTime() {
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java
index 58ef3ae2db01c25582f858fcc26a74a095a46e41..0adb13d9b78f41a7735de614f8333fa0374f14c1 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java
@@ -88,12 +88,11 @@ public class PeerAcceptor
     }
     if (coordinator != null) {
         // single torrent capability
-        MetaInfo meta = coordinator.getMetaInfo();
-        if (DataHelper.eq(meta.getInfoHash(), peerInfoHash)) {
+        if (DataHelper.eq(coordinator.getInfoHash(), peerInfoHash)) {
             if (coordinator.needPeers())
               {
                 Peer peer = new Peer(socket, in, out, coordinator.getID(),
-                                     coordinator.getMetaInfo());
+                                     coordinator.getInfoHash(), coordinator.getMetaInfo());
                 coordinator.addPeer(peer);
               }
             else
@@ -101,26 +100,25 @@ public class PeerAcceptor
         } else {
           // its for another infohash, but we are only single torrent capable.  b0rk.
             throw new IOException("Peer wants another torrent (" + Base64.encode(peerInfoHash) 
-                                  + ") while we only support (" + Base64.encode(meta.getInfoHash()) + ")");
+                                  + ") while we only support (" + Base64.encode(coordinator.getInfoHash()) + ")");
         }
     } else {
         // multitorrent capable, so lets see what we can handle
         for (Iterator iter = coordinators.iterator(); iter.hasNext(); ) {
             PeerCoordinator cur = (PeerCoordinator)iter.next();
-            MetaInfo meta = cur.getMetaInfo();
-            
-            if (DataHelper.eq(meta.getInfoHash(), peerInfoHash)) {
+
+            if (DataHelper.eq(cur.getInfoHash(), peerInfoHash)) {
                 if (cur.needPeers())
                   {
                     Peer peer = new Peer(socket, in, out, cur.getID(),
-                                         cur.getMetaInfo());
+                                         cur.getInfoHash(), cur.getMetaInfo());
                     cur.addPeer(peer);
                     return;
                   }
                 else 
                   {
                     if (_log.shouldLog(Log.DEBUG))
-                      _log.debug("Rejecting new peer for " + cur.snark.torrent);
+                      _log.debug("Rejecting new peer for " + cur.getName());
                     socket.close();
                     return;
                   }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java
index aa9cf2187db0d855dd306199125d939f710ef64d..5d7b6d66db947808fde63b67e859c85dbec3191d 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java
@@ -37,7 +37,8 @@ class PeerCheckerTask extends TimerTask
   private static final long KILOPERSECOND = 1024*(PeerCoordinator.CHECK_PERIOD/1000);
 
   private final PeerCoordinator coordinator;
-  public I2PSnarkUtil _util;
+  private final I2PSnarkUtil _util;
+  private int _runCount;
 
   PeerCheckerTask(I2PSnarkUtil util, PeerCoordinator coordinator)
   {
@@ -49,12 +50,10 @@ class PeerCheckerTask extends TimerTask
 
   public void run()
   {
+        _runCount++;
         List<Peer> peerList = coordinator.peerList();
         if (peerList.isEmpty() || coordinator.halted()) {
-          coordinator.peerCount = 0;
-          coordinator.interestedAndChoking = 0;
           coordinator.setRateHistory(0, 0);
-          coordinator.uploaders = 0;
           if (coordinator.halted())
             cancel();
           return;
@@ -206,7 +205,14 @@ class PeerCheckerTask extends TimerTask
                   }
               }
             peer.retransmitRequests();
+            // send PEX
+            if ((_runCount % 17) == 0 && !peer.isCompleted())
+                coordinator.sendPeers(peer);
             peer.keepAlive();
+            // announce them to local tracker (TrackerClient does this too)
+            if (_util.getDHT() != null && (_runCount % 5) == 0) {
+                _util.getDHT().announce(coordinator.getInfoHash(), peer.getPeerID().getDestHash());
+            }
           }
 
         // Resync actual uploaders value
@@ -247,8 +253,14 @@ class PeerCheckerTask extends TimerTask
 	coordinator.setRateHistory(uploaded, downloaded);
 
         // close out unused files, but we don't need to do it every time
-        if (random.nextInt(4) == 0)
-            coordinator.getStorage().cleanRAFs();
+        Storage storage = coordinator.getStorage();
+        if (storage != null && (_runCount % 4) == 0) {
+                storage.cleanRAFs();
+        }
 
+        // announce ourselves to local tracker (TrackerClient does this too)
+        if (_util.getDHT() != null && (_runCount % 16) == 0) {
+            _util.getDHT().announce(coordinator.getInfoHash());
+        }
   }
 }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java
index 43bb9a7122ea121615b0646a2c096e1a20931e43..33da75263e9f20e69e3c9f2d3f932e9b9354b6c1 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java
@@ -32,6 +32,13 @@ class PeerConnectionIn implements Runnable
   private final Peer peer;
   private final DataInputStream din;
 
+  // The max length of a complete message in bytes.
+  // The biggest is the piece message, for which the length is the
+  // request size (32K) plus 9. (we could also check if Storage.MAX_PIECES / 8
+  // in the bitfield message is bigger but it's currently 5000/8 = 625 so don't bother)
+  private static final int MAX_MSG_SIZE = Math.max(PeerState.PARTSIZE + 9,
+                                                   MagnetState.CHUNK_SIZE + 100);  // 100 for the ext msg dictionary
+
   private Thread thread;
   private volatile boolean quit;
 
@@ -77,20 +84,16 @@ class PeerConnectionIn implements Runnable
             int len;
         
             // Wait till we hear something...
-            // The length of a complete message in bytes.
-            // The biggest is the piece message, for which the length is the
-            // request size (32K) plus 9. (we could also check if Storage.MAX_PIECES / 8
-            // in the bitfield message is bigger but it's currently 5000/8 = 625 so don't bother)
             int i = din.readInt();
             lastRcvd = System.currentTimeMillis();
-            if (i < 0 || i > PeerState.PARTSIZE + 9)
+            if (i < 0 || i > MAX_MSG_SIZE)
               throw new IOException("Unexpected length prefix: " + i);
 
             if (i == 0)
               {
                 ps.keepAliveMessage();
                 if (_log.shouldLog(Log.DEBUG)) 
-                    _log.debug("Received keepalive from " + peer + " on " + peer.metainfo.getName());
+                    _log.debug("Received keepalive from " + peer);
                 continue;
               }
             
@@ -102,35 +105,35 @@ class PeerConnectionIn implements Runnable
               case 0:
                 ps.chokeMessage(true);
                 if (_log.shouldLog(Log.DEBUG)) 
-                    _log.debug("Received choke from " + peer + " on " + peer.metainfo.getName());
+                    _log.debug("Received choke from " + peer);
                 break;
               case 1:
                 ps.chokeMessage(false);
                 if (_log.shouldLog(Log.DEBUG)) 
-                    _log.debug("Received unchoke from " + peer + " on " + peer.metainfo.getName());
+                    _log.debug("Received unchoke from " + peer);
                 break;
               case 2:
                 ps.interestedMessage(true);
                 if (_log.shouldLog(Log.DEBUG)) 
-                    _log.debug("Received interested from " + peer + " on " + peer.metainfo.getName());
+                    _log.debug("Received interested from " + peer);
                 break;
               case 3:
                 ps.interestedMessage(false);
                 if (_log.shouldLog(Log.DEBUG)) 
-                    _log.debug("Received not interested from " + peer + " on " + peer.metainfo.getName());
+                    _log.debug("Received not interested from " + peer);
                 break;
               case 4:
                 piece = din.readInt();
                 ps.haveMessage(piece);
                 if (_log.shouldLog(Log.DEBUG)) 
-                    _log.debug("Received havePiece(" + piece + ") from " + peer + " on " + peer.metainfo.getName());
+                    _log.debug("Received havePiece(" + piece + ") from " + peer);
                 break;
               case 5:
                 byte[] bitmap = new byte[i-1];
                 din.readFully(bitmap);
                 ps.bitfieldMessage(bitmap);
                 if (_log.shouldLog(Log.DEBUG)) 
-                    _log.debug("Received bitmap from " + peer + " on " + peer.metainfo.getName() + ": size=" + (i-1) /* + ": " + ps.bitfield */ );
+                    _log.debug("Received bitmap from " + peer  + ": size=" + (i-1) /* + ": " + ps.bitfield */ );
                 break;
               case 6:
                 piece = din.readInt();
@@ -138,7 +141,7 @@ class PeerConnectionIn implements Runnable
                 len = din.readInt();
                 ps.requestMessage(piece, begin, len);
                 if (_log.shouldLog(Log.DEBUG)) 
-                    _log.debug("Received request(" + piece + "," + begin + ") from " + peer + " on " + peer.metainfo.getName());
+                    _log.debug("Received request(" + piece + "," + begin + ") from " + peer);
                 break;
               case 7:
                 piece = din.readInt();
@@ -152,7 +155,7 @@ class PeerConnectionIn implements Runnable
                     din.readFully(piece_bytes, begin, len);
                     ps.pieceMessage(req);
                     if (_log.shouldLog(Log.DEBUG)) 
-                        _log.debug("Received data(" + piece + "," + begin + ") from " + peer + " on " + peer.metainfo.getName());
+                        _log.debug("Received data(" + piece + "," + begin + ") from " + peer);
                   }
                 else
                   {
@@ -160,7 +163,7 @@ class PeerConnectionIn implements Runnable
                     piece_bytes = new byte[len];
                     din.readFully(piece_bytes);
                     if (_log.shouldLog(Log.DEBUG)) 
-                        _log.debug("Received UNWANTED data(" + piece + "," + begin + ") from " + peer + " on " + peer.metainfo.getName());
+                        _log.debug("Received UNWANTED data(" + piece + "," + begin + ") from " + peer);
                   }
                 break;
               case 8:
@@ -169,22 +172,28 @@ class PeerConnectionIn implements Runnable
                 len = din.readInt();
                 ps.cancelMessage(piece, begin, len);
                 if (_log.shouldLog(Log.DEBUG)) 
-                    _log.debug("Received cancel(" + piece + "," + begin + ") from " + peer + " on " + peer.metainfo.getName());
+                    _log.debug("Received cancel(" + piece + "," + begin + ") from " + peer);
+                break;
+              case 9:  // PORT message
+                int port = din.readUnsignedShort();
+                ps.portMessage(port);
+                if (_log.shouldLog(Log.DEBUG)) 
+                    _log.debug("Received port message from " + peer);
                 break;
               case 20:  // Extension message
                 int id = din.readUnsignedByte();
                 byte[] payload = new byte[i-2];
                 din.readFully(payload);
-                ps.extensionMessage(id, payload);
                 if (_log.shouldLog(Log.DEBUG)) 
-                    _log.debug("Received extension message from " + peer + " on " + peer.metainfo.getName());
+                    _log.debug("Received extension message from " + peer);
+                ps.extensionMessage(id, payload);
                 break;
               default:
                 byte[] bs = new byte[i-1];
                 din.readFully(bs);
                 ps.unknownMessage(b, bs);
                 if (_log.shouldLog(Log.DEBUG)) 
-                    _log.debug("Received unknown message from " + peer + " on " + peer.metainfo.getName());
+                    _log.debug("Received unknown message from " + peer);
               }
           }
       }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java
index 38cb29e3b445dcae98e8589a59690af494b02c88..225edd4923a3c73fcd83633edfc9e3bda06cfe8d 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java
@@ -29,8 +29,8 @@ import java.util.List;
 import net.i2p.I2PAppContext;
 import net.i2p.util.I2PAppThread;
 import net.i2p.util.Log;
-import net.i2p.util.SimpleScheduler;
-import net.i2p.util.SimpleTimer;
+//import net.i2p.util.SimpleScheduler;
+//import net.i2p.util.SimpleTimer;
 
 class PeerConnectionOut implements Runnable
 {
@@ -124,34 +124,34 @@ class PeerConnectionOut implements Runnable
                           {
                             if (state.choking) {
                               it.remove();
-                              SimpleTimer.getInstance().removeEvent(nm.expireEvent);
+                              //SimpleTimer.getInstance().removeEvent(nm.expireEvent);
                             }
                             nm = null;
                           }
                         else if (nm.type == Message.REQUEST && state.choked)
                           {
                             it.remove();
-                            SimpleTimer.getInstance().removeEvent(nm.expireEvent);
+                            //SimpleTimer.getInstance().removeEvent(nm.expireEvent);
                             nm = null;
                           }
                           
                         if (m == null && nm != null)
                           {
                             m = nm;
-                            SimpleTimer.getInstance().removeEvent(nm.expireEvent);
+                            //SimpleTimer.getInstance().removeEvent(nm.expireEvent);
                             it.remove();
                           }
                       }
                     if (m == null && !sendQueue.isEmpty()) {
                       m = (Message)sendQueue.remove(0);
-                      SimpleTimer.getInstance().removeEvent(m.expireEvent);
+                      //SimpleTimer.getInstance().removeEvent(m.expireEvent);
                     }
                   }
               }
             if (m != null)
               {
                 if (_log.shouldLog(Log.DEBUG))
-                    _log.debug("Send " + peer + ": " + m + " on " + peer.metainfo.getName());
+                    _log.debug("Send " + peer + ": " + m);
 
                 // This can block for quite a while.
                 // To help get slow peers going, and track the bandwidth better,
@@ -241,6 +241,8 @@ class PeerConnectionOut implements Runnable
   
   /** remove messages not sent in 3m */
   private static final int SEND_TIMEOUT = 3*60*1000;
+
+/*****
   private class RemoveTooSlow implements SimpleTimer.TimedEvent {
       private Message _m;
       public RemoveTooSlow(Message m) {
@@ -258,6 +260,7 @@ class PeerConnectionOut implements Runnable
               _log.info("Took too long to send " + _m + " to " + peer);
       }
   }
+*****/
 
   /**
    * Removes a particular message type from the queue.
@@ -474,7 +477,8 @@ class PeerConnectionOut implements Runnable
     m.off = 0;
     m.len = length;
     // since we have the data already loaded, queue a timeout to remove it
-    SimpleScheduler.getInstance().addEvent(new RemoveTooSlow(m), SEND_TIMEOUT);
+    // no longer prefetched
+    //SimpleScheduler.getInstance().addEvent(new RemoveTooSlow(m), SEND_TIMEOUT);
     addMessage(m);
   }
 
@@ -547,4 +551,12 @@ class PeerConnectionOut implements Runnable
     m.len = bytes.length;
     addMessage(m);
   }
+
+  /** @since 0.8.4 */
+  void sendPort(int port) {
+    Message m = new Message();
+    m.type = Message.PORT;
+    m.piece = port;
+    addMessage(m);
+  }
 }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
index 8026f34f6826b51c7e703465642e847f54655fe8..11f0fff86f0e44b3591b9c8b62061877a62da121 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
@@ -27,33 +27,59 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Queue;
 import java.util.Random;
+import java.util.Set;
 import java.util.concurrent.LinkedBlockingQueue;
 
 import net.i2p.I2PAppContext;
+import net.i2p.data.DataHelper;
+import net.i2p.data.Destination;
+import net.i2p.util.ConcurrentHashSet;
 import net.i2p.util.I2PAppThread;
 import net.i2p.util.Log;
 import net.i2p.util.SimpleTimer2;
 
+import org.klomp.snark.bencode.BEValue;
+import org.klomp.snark.bencode.InvalidBEncodingException;
+import org.klomp.snark.dht.DHT;
+
 /**
  * Coordinates what peer does what.
  */
 public class PeerCoordinator implements PeerListener
 {
   private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(PeerCoordinator.class);
-  final MetaInfo metainfo;
-  final Storage storage;
-  final Snark snark;
+
+  /**
+   * External use by PeerMonitorTask only.
+   * Will be null when in magnet mode.
+   */
+  MetaInfo metainfo;
+
+  /**
+   * External use by PeerMonitorTask only.
+   * Will be null when in magnet mode.
+   */
+  Storage storage;
+  private final Snark snark;
 
   // package local for access by CheckDownLoadersTask
   final static long CHECK_PERIOD = 40*1000; // 40 seconds
   final static int MAX_UPLOADERS = 6;
 
-  // Approximation of the number of current uploaders.
-  // Resynced by PeerChecker once in a while.
-  int uploaders = 0;
-  int interestedAndChoking = 0;
+  /**
+   * Approximation of the number of current uploaders.
+   * Resynced by PeerChecker once in a while.
+   * External use by PeerCheckerTask only.
+   */
+  int uploaders;
+
+  /**
+   * External use by PeerCheckerTask only.
+   */
+  int interestedAndChoking;
 
   // final static int MAX_DOWNLOADERS = MAX_CONNECTIONS;
   // int downloaders = 0;
@@ -61,19 +87,29 @@ public class PeerCoordinator implements PeerListener
   private long uploaded;
   private long downloaded;
   final static int RATE_DEPTH = 3; // make following arrays RATE_DEPTH long
-  private long uploaded_old[] = {-1,-1,-1};
-  private long downloaded_old[] = {-1,-1,-1};
+  private final long uploaded_old[] = {-1,-1,-1};
+  private final long downloaded_old[] = {-1,-1,-1};
 
-  // synchronize on this when changing peers or downloaders
-  // This is a Queue, not a Set, because PeerCheckerTask keeps things in order for choking/unchoking
+  /**
+   * synchronize on this when changing peers or downloaders.
+   * This is a Queue, not a Set, because PeerCheckerTask keeps things in order for choking/unchoking.
+   * External use by PeerMonitorTask only.
+   */
   final Queue<Peer> peers;
+
+  /**
+   * Peers we heard about via PEX
+   */
+  private final Set<PeerID> pexPeers;
+
   /** estimate of the peers, without requiring any synchronization */
-  volatile int peerCount;
+  private volatile int peerCount;
 
   /** Timer to handle all periodical tasks. */
   private final CheckEvent timer;
 
   private final byte[] id;
+  private final byte[] infohash;
 
   /** The wanted pieces. We could use a TreeSet but we'd have to clear and re-add everything
    *  when priorities change.
@@ -85,18 +121,21 @@ public class PeerCoordinator implements PeerListener
 
   private boolean halted = false;
 
+  private final MagnetState magnetState;
   private final CoordinatorListener listener;
-  public I2PSnarkUtil _util;
+  private final I2PSnarkUtil _util;
   private static final Random _random = I2PAppContext.getGlobalContext().random();
   
-  public String trackerProblems = null;
-  public int trackerSeenPeers = 0;
-
-  public PeerCoordinator(I2PSnarkUtil util, byte[] id, MetaInfo metainfo, Storage storage,
+  /**
+   *  @param metainfo null if in magnet mode
+   *  @param storage null if in magnet mode
+   */
+  public PeerCoordinator(I2PSnarkUtil util, byte[] id, byte[] infohash, MetaInfo metainfo, Storage storage,
                          CoordinatorListener listener, Snark torrent)
   {
     _util = util;
     this.id = id;
+    this.infohash = infohash;
     this.metainfo = metainfo;
     this.storage = storage;
     this.listener = listener;
@@ -106,6 +145,8 @@ public class PeerCoordinator implements PeerListener
     setWantedPieces();
     partialPieces = new ArrayList(getMaxConnections() + 1);
     peers = new LinkedBlockingQueue();
+    magnetState = new MagnetState(infohash, metainfo);
+    pexPeers = new ConcurrentHashSet();
 
     // Install a timer to check the uploaders.
     // Randomize the first start time so multiple tasks are spread out,
@@ -133,6 +174,8 @@ public class PeerCoordinator implements PeerListener
   // only called externally from Storage after the double-check fails
   public void setWantedPieces()
   {
+    if (metainfo == null || storage == null)
+        return;
     // Make a list of pieces
       synchronized(wantedPieces) {
           wantedPieces.clear();
@@ -153,7 +196,6 @@ public class PeerCoordinator implements PeerListener
   }
 
   public Storage getStorage() { return storage; }
-  public CoordinatorListener getListener() { return listener; }
 
   // for web page detailed stats
   public List<Peer> peerList()
@@ -166,8 +208,16 @@ public class PeerCoordinator implements PeerListener
     return id;
   }
 
+  public String getName()
+  {
+    return snark.getName();
+  }
+
   public boolean completed()
   {
+    // FIXME return metainfo complete status
+    if (storage == null)
+        return false;
     return storage.complete();
   }
 
@@ -184,9 +234,12 @@ public class PeerCoordinator implements PeerListener
 
   /**
    * Returns how many bytes are still needed to get the complete file.
+   * @return -1 if in magnet mode
    */
   public long getLeft()
   {
+    if (metainfo == null | storage == null)
+        return -1;
     // XXX - Only an approximation.
     return ((long) storage.needed()) * metainfo.getPieceLength(0);
   }
@@ -271,6 +324,12 @@ public class PeerCoordinator implements PeerListener
     return metainfo;
   }
 
+  /** @since 0.8.4 */
+  public byte[] getInfoHash()
+  {
+    return infohash;
+  }
+
   public boolean needPeers()
   {
         return !halted && peers.size() < getMaxConnections();
@@ -281,6 +340,8 @@ public class PeerCoordinator implements PeerListener
    *  @return 512K: 16; 1M: 11; 2M: 6
    */
   private int getMaxConnections() {
+    if (metainfo == null)
+        return 6;
     int size = metainfo.getPieceLength(0);
     int max = _util.getMaxConnections();
     if (size <= 512*1024 || completed())
@@ -355,8 +416,19 @@ public class PeerCoordinator implements PeerListener
           }
         else
           {
-            if (_log.shouldLog(Log.INFO))
-              _log.info("New connection to peer: " + peer + " for " + metainfo.getName());
+            if (_log.shouldLog(Log.INFO)) {
+                // just for logging
+                String name;
+                if (metainfo == null)
+                    name = "Magnet";
+                else
+                    name = metainfo.getName();
+               _log.info("New connection to peer: " + peer + " for " + name);
+            }
+
+            // We may have gotten the metainfo after the peer was created.
+            if (metainfo != null)
+                peer.setMetaInfo(metainfo);
 
             // Add it to the beginning of the list.
             // And try to optimistically make it a uploader.
@@ -415,17 +487,27 @@ public class PeerCoordinator implements PeerListener
 
     if (need_more)
       {
-        if (_log.shouldLog(Log.DEBUG))
-            _log.debug("Adding a peer " + peer.getPeerID().toString() + " for " + metainfo.getName(), new Exception("add/run"));
-
+        if (_log.shouldLog(Log.DEBUG)) {
+            // just for logging
+            String name;
+            if (metainfo == null)
+                name = "Magnet";
+            else
+                name = metainfo.getName();
+            _log.debug("Adding a peer " + peer.getPeerID().toString() + " for " + name, new Exception("add/run"));
+        }
         // Run the peer with us as listener and the current bitfield.
         final PeerListener listener = this;
-        final BitField bitfield = storage.getBitField();
+        final BitField bitfield;
+        if (storage != null)
+            bitfield = storage.getBitField();
+        else
+            bitfield = null;
         Runnable r = new Runnable()
           {
             public void run()
             {
-              peer.runConnection(_util, listener, bitfield);
+              peer.runConnection(_util, listener, bitfield, magnetState);
             }
           };
         String threadName = "Snark peer " + peer.toString();
@@ -486,11 +568,6 @@ public class PeerCoordinator implements PeerListener
         interestedAndChoking = count;
   }
 
-  public byte[] getBitMap()
-  {
-    return storage.getBitField().getFieldBytes();
-  }
-
   /**
    * @return true if we still want the given piece
    */
@@ -647,6 +724,8 @@ public class PeerCoordinator implements PeerListener
    *  @since 0.8.1
    */
   public void updatePiecePriorities() {
+      if (storage == null)
+          return;
       int[] pri = storage.getPiecePriorities();
       if (pri == null) {
           _log.debug("Updated piece priorities called but no priorities to set?");
@@ -708,11 +787,15 @@ public class PeerCoordinator implements PeerListener
   /**
    * Returns a byte array containing the requested piece or null of
    * the piece is unknown.
+   *
+   * @throws RuntimeException on IOE getting the data
    */
   public byte[] gotRequest(Peer peer, int piece, int off, int len)
   {
     if (halted)
       return null;
+    if (metainfo == null || storage == null)
+        return null;
 
     try
       {
@@ -721,8 +804,11 @@ public class PeerCoordinator implements PeerListener
     catch (IOException ioe)
       {
         snark.stopTorrent();
-        _log.error("Error reading the storage for " + metainfo.getName(), ioe);
-        throw new RuntimeException("B0rked");
+        String msg = "Error reading the storage (piece " + piece + ") for " + metainfo.getName() + ": " + ioe;
+        _log.error(msg, ioe);
+        SnarkManager.instance().addMessage(msg);
+        SnarkManager.instance().addMessage("Fatal storage error: Stopping torrent " + metainfo.getName());
+        throw new RuntimeException(msg, ioe);
       }
   }
 
@@ -752,9 +838,13 @@ public class PeerCoordinator implements PeerListener
    * Returns false if the piece is no good (according to the hash).
    * In that case the peer that supplied the piece should probably be
    * blacklisted.
+   *
+   * @throws RuntimeException on IOE saving the piece
    */
   public boolean gotPiece(Peer peer, int piece, byte[] bs)
   {
+    if (metainfo == null || storage == null)
+        return true;
     if (halted) {
       _log.info("Got while-halted piece " + piece + "/" + metainfo.getPieces() +" from " + peer + " for " + metainfo.getName());
       return true; // We don't actually care anymore.
@@ -793,8 +883,11 @@ public class PeerCoordinator implements PeerListener
         catch (IOException ioe)
           {
             snark.stopTorrent();
-            _log.error("Error writing storage for " + metainfo.getName(), ioe);
-            throw new RuntimeException("B0rked");
+            String msg = "Error writing storage (piece " + piece + ") for " + metainfo.getName() + ": " + ioe;
+            _log.error(msg, ioe);
+            SnarkManager.instance().addMessage(msg);
+            SnarkManager.instance().addMessage("Fatal storage error: Stopping torrent " + metainfo.getName());
+            throw new RuntimeException(msg, ioe);
           }
         wantedPieces.remove(p);
       }
@@ -951,6 +1044,8 @@ public class PeerCoordinator implements PeerListener
    *  @since 0.8.2
    */
   public PartialPiece getPartialPiece(Peer peer, BitField havePieces) {
+      if (metainfo == null)
+          return null;
       synchronized(wantedPieces) {
           // sorts by remaining bytes, least first
           Collections.sort(partialPieces);
@@ -1057,6 +1152,107 @@ public class PeerCoordinator implements PeerListener
       }
   }
 
+  /**
+   *  PeerListener callback
+   *  @since 0.8.4
+   */
+  public void gotExtension(Peer peer, int id, byte[] bs) {
+      if (_log.shouldLog(Log.DEBUG))
+          _log.debug("Got extension message " + id + " from " + peer);
+      // basic handling done in PeerState... here we just check if we are done
+      if (metainfo == null && id == ExtensionHandler.ID_METADATA) {
+          synchronized (magnetState) {
+              if (magnetState.isComplete()) {
+                  if (_log.shouldLog(Log.WARN))
+                      _log.warn("Got completed metainfo via extension");
+                  metainfo = magnetState.getMetaInfo();
+                  listener.gotMetaInfo(this, metainfo);
+              }
+          }
+      } else if (id == ExtensionHandler.ID_HANDSHAKE) {
+          sendPeers(peer);
+      }
+  }
+
+  /**
+   *  Send a PEX message to the peer, if he supports PEX.
+   *  This just sends everybody we are connected to, we don't
+   *  track new vs. old peers yet.
+   *  @since 0.8.4
+   */
+  void sendPeers(Peer peer) {
+      Map<String, BEValue> handshake = peer.getHandshakeMap();
+      if (handshake == null)
+          return;
+      BEValue bev = handshake.get("m");
+      if (bev == null)
+          return;
+      try {
+          if (bev.getMap().get(ExtensionHandler.TYPE_PEX) != null) {
+              List<Peer> pList = peerList();
+              pList.remove(peer);
+              if (!pList.isEmpty())
+                  ExtensionHandler.sendPEX(peer, pList);
+          }
+      } catch (InvalidBEncodingException ibee) {}
+  }
+
+  /**
+   *  Sets the storage after transition out of magnet mode
+   *  Snark calls this after we call gotMetaInfo()
+   *  @since 0.8.4
+   */
+  public void setStorage(Storage stg) {
+      storage = stg;
+      setWantedPieces();
+      // ok we should be in business
+      for (Peer p : peers) {
+          p.setMetaInfo(metainfo);
+      }
+  }
+
+  /**
+   *  PeerListener callback
+   *  Tell the DHT to ping it, this will get back the node info
+   *  @since 0.8.4
+   */
+  public void gotPort(Peer peer, int port) {
+      DHT dht = _util.getDHT();
+      if (dht != null)
+          dht.ping(peer.getDestination(), port);
+  }
+
+  /**
+   *  PeerListener callback
+   *  @since 0.8.4
+   */
+  public void gotPeers(Peer peer, List<PeerID> peers) {
+      if (completed() || !needPeers())
+          return;
+      Destination myDest = _util.getMyDestination();
+      if (myDest == null)
+          return;
+      byte[] myHash = myDest.calculateHash().getData();
+      List<Peer> pList = peerList();
+      for (PeerID id : peers) {
+           if (peerIDInList(id, pList) != null)
+               continue;
+           if (DataHelper.eq(myHash, id.getDestHash()))
+               continue;
+           pexPeers.add(id);
+      }
+      // TrackerClient will poll for pexPeers and do the add in its thread,
+      // rather than running another thread here.
+  }
+
+  /**
+   *  Called by TrackerClient
+   *  @since 0.8.4
+   */
+  Set<PeerID> getPEXPeers() {
+      return pexPeers;
+  }
+
   /** Return number of allowed uploaders for this torrent.
    ** Check with Snark to see if we are over the total upload limit.
    */
@@ -1072,6 +1268,14 @@ public class PeerCoordinator implements PeerListener
         return MAX_UPLOADERS;
   }
 
+  /**
+   *  @return current
+   *  @since 0.8.4
+   */
+  public int getUploaders() {
+      return uploaders;
+  }
+
   public boolean overUpBWLimit()
   {
     if (listener != null)
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerListener.java b/apps/i2psnark/java/src/org/klomp/snark/PeerListener.java
index 975c12c1062c7096c51d5da5e0c2b4290838a74e..c7650a55249d4cf485598a97ccc968080fede24a 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerListener.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerListener.java
@@ -179,4 +179,32 @@ interface PeerListener
    * @since 0.8.2
    */
   PartialPiece getPartialPiece(Peer peer, BitField havePieces);
+
+  /**
+   * Called when an extension message is received.
+   *
+   * @param peer the Peer that got the message.
+   * @param id the message ID
+   * @param bs the message payload
+   * @since 0.8.4
+   */
+  void gotExtension(Peer peer, int id, byte[] bs);
+
+  /**
+   * Called when a port message is received.
+   *
+   * @param peer the Peer that got the message.
+   * @param port the port
+   * @since 0.8.4
+   */
+  void gotPort(Peer peer, int port);
+
+  /**
+   * Called when peers are received via PEX
+   *
+   * @param peer the Peer that got the message.
+   * @param pIDList the peer IDs (dest hashes)
+   * @since 0.8.4
+   */
+  void gotPeers(Peer peer, List<PeerID> pIDList);
 }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java
index 5551bc90eb3284ccbf3c84c629d391bb15860d7c..111ddbbe61095716afb728fe84eea237e3cc685e 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java
@@ -32,15 +32,13 @@ import java.util.Set;
 import net.i2p.I2PAppContext;
 import net.i2p.util.Log;
 
-import org.klomp.snark.bencode.BDecoder;
-import org.klomp.snark.bencode.BEValue;
-
 class PeerState implements DataLoader
 {
   private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(PeerState.class);
   private final Peer peer;
+  /** Fixme, used by Peer.disconnect() to get to the coordinator */
   final PeerListener listener;
-  private final MetaInfo metainfo;
+  private MetaInfo metainfo;
 
   // Interesting and choking describes whether we are interested in or
   // are choking the other side.
@@ -52,10 +50,6 @@ class PeerState implements DataLoader
   boolean interested = false;
   boolean choked = true;
 
-  // Package local for use by Peer.
-  long downloaded;
-  long uploaded;
-
   /** the pieces the peer has */
   BitField bitfield;
 
@@ -74,6 +68,9 @@ class PeerState implements DataLoader
   public final static int PARTSIZE = 16*1024; // outbound request
   private final static int MAX_PARTSIZE = 64*1024; // Don't let anybody request more than this
 
+  /**
+   * @param metainfo null if in magnet mode
+   */
   PeerState(Peer peer, PeerListener listener, MetaInfo metainfo,
             PeerConnectionIn in, PeerConnectionOut out)
   {
@@ -135,6 +132,9 @@ class PeerState implements DataLoader
   {
     if (_log.shouldLog(Log.DEBUG))
       _log.debug(peer + " rcv have(" + piece + ")");
+    // FIXME we will lose these until we get the metainfo
+    if (metainfo == null)
+        return;
     // Sanity check
     if (piece < 0 || piece >= metainfo.getPieces())
       {
@@ -172,8 +172,15 @@ class PeerState implements DataLoader
           }
         
         // XXX - Check for weird bitfield and disconnect?
-        bitfield = new BitField(bitmap, metainfo.getPieces());
+        // FIXME will have to regenerate the bitfield after we know exactly
+        // how many pieces there are, as we don't know how many spare bits there are.
+        if (metainfo == null)
+            bitfield = new BitField(bitmap, bitmap.length * 8);
+        else
+            bitfield = new BitField(bitmap, metainfo.getPieces());
       }
+    if (metainfo == null)
+        return;
     boolean interest = listener.gotBitField(peer, bitfield);
     setInteresting(interest);
     if (bitfield.complete() && !interest) {
@@ -191,6 +198,8 @@ class PeerState implements DataLoader
     if (_log.shouldLog(Log.DEBUG))
       _log.debug(peer + " rcv request("
                   + piece + ", " + begin + ", " + length + ") ");
+    if (metainfo == null)
+        return;
     if (choking)
       {
         if (_log.shouldLog(Log.INFO))
@@ -273,7 +282,7 @@ class PeerState implements DataLoader
    */
   void uploaded(int size)
   {
-    uploaded += size;
+    peer.uploaded(size);
     listener.uploaded(peer, size);
   }
 
@@ -293,7 +302,7 @@ class PeerState implements DataLoader
   void pieceMessage(Request req)
   {
     int size = req.len;
-    downloaded += size;
+    peer.downloaded(size);
     listener.downloaded(peer, size);
 
     if (_log.shouldLog(Log.DEBUG))
@@ -314,9 +323,6 @@ class PeerState implements DataLoader
           {
             if (_log.shouldLog(Log.WARN))
               _log.warn("Got BAD " + req.piece + " from " + peer);
-            // XXX ARGH What now !?!
-            // FIXME Why would we set downloaded to 0?
-            downloaded = 0;
           }
       }
 
@@ -360,7 +366,6 @@ class PeerState implements DataLoader
           _log.info("Unrequested 'piece: " + piece + ", "
                       + begin + ", " + length + "' received from "
                       + peer);
-        downloaded = 0; // XXX - punishment?
         return null;
       }
 
@@ -385,7 +390,6 @@ class PeerState implements DataLoader
                           + begin + ", "
                           + length + "' received from "
                           + peer);
-            downloaded = 0; // XXX - punishment?
             return null;
           }
 
@@ -485,22 +489,40 @@ class PeerState implements DataLoader
   /** @since 0.8.2 */
   void extensionMessage(int id, byte[] bs)
   {
-      if (id == 0) {
-          InputStream is = new ByteArrayInputStream(bs);
-          try {
-              BDecoder dec = new BDecoder(is);
-              BEValue bev = dec.bdecodeMap();
-              Map map = bev.getMap();
-              if (_log.shouldLog(Log.DEBUG))
-                  _log.debug("Got extension handshake message " + bev.toString());
-          } catch (Exception e) {
-              if (_log.shouldLog(Log.DEBUG))
-                  _log.debug("Failed extension decode", e);
-          }
+      ExtensionHandler.handleMessage(peer, listener, id, bs);
+      // Peer coord will get metadata from MagnetState,
+      // verify, and then call gotMetaInfo()
+      listener.gotExtension(peer, id, bs);
+  }
+
+  /**
+   *  Switch from magnet mode to normal mode.
+   *  If we already have the metainfo, this does nothing.
+   *  @param meta non-null
+   *  @since 0.8.4
+   */
+  public void setMetaInfo(MetaInfo meta) {
+      if (metainfo != null)
+          return;
+      BitField oldBF = bitfield;
+      if (oldBF != null) {
+          if (oldBF.size() != meta.getPieces())
+              // fix bitfield, it was too big by 1-7 bits
+              bitfield = new BitField(oldBF.getFieldBytes(), meta.getPieces());
+          // else no extra
       } else {
-          if (_log.shouldLog(Log.DEBUG))
-              _log.debug("Got extended message type: " + id + " length: " + bs.length);
+          // it will be initialized later
+          //bitfield = new BitField(meta.getPieces());
       }
+      metainfo = meta;
+      if (bitfield != null && bitfield.count() > 0)
+          setInteresting(true);
+  }
+
+  /** @since 0.8.4 */
+  void portMessage(int port)
+  {
+      listener.gotPort(peer, port);
   }
 
   void unknownMessage(int type, byte[] bs)
@@ -619,6 +641,8 @@ class PeerState implements DataLoader
     // no bitfield yet? nothing to request then.
     if (bitfield == null)
         return;
+    if (metainfo == null)
+        return;
     boolean more_pieces = true;
     while (more_pieces)
       {
diff --git a/apps/i2psnark/java/src/org/klomp/snark/Piece.java b/apps/i2psnark/java/src/org/klomp/snark/Piece.java
index 6855d36a0ed293069ec7d3cdd1d5b4141e45a20c..dd48508a9a3ba761e22fb122c5c8d0d4197e23f9 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Piece.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Piece.java
@@ -35,8 +35,8 @@ class Piece implements Comparable {
     
     @Override
     public boolean equals(Object o) {
+        if (o == null) return false;
         if (o instanceof Piece) {
-            if (o == null) return false;
             return this.id == ((Piece)o).id;
         }
         return false;
diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java
index 31105a2693a6906d84114b8bc8a6af5bd2126115..c43679ed398e13a38ea4fe30a0c79a76ad73933e 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java
@@ -26,6 +26,7 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Properties;
@@ -39,8 +40,6 @@ import net.i2p.client.streaming.I2PServerSocket;
 import net.i2p.data.Destination;
 import net.i2p.util.I2PThread;
 
-import org.klomp.snark.bencode.BDecoder;
-
 /**
  * Main Snark program startup class.
  *
@@ -107,11 +106,13 @@ public class Snark
           } catch (Throwable t) {
               System.out.println("OOM in the OOM");
           }
-          System.exit(0);
+          //System.exit(0);
       }
       
   }
   
+/******** No, not maintaining a command-line client
+
   public static void main(String[] args)
   {
     System.out.println(copyright);
@@ -235,19 +236,28 @@ public class Snark
       }
   }
 
+***********/
+
   public static final String PROP_MAX_CONNECTIONS = "i2psnark.maxConnections";
-  public String torrent;
-  public MetaInfo meta;
-  public Storage storage;
-  public PeerCoordinator coordinator;
-  public ConnectionAcceptor acceptor;
-  public TrackerClient trackerclient;
-  public String rootDataDir = ".";
-  public CompleteListener completeListener;
-  public boolean stopped;
-  byte[] id;
-  public I2PSnarkUtil _util;
-  private PeerCoordinatorSet _peerCoordinatorSet;
+
+  /** most of these used to be public, use accessors below instead */
+  private String torrent;
+  private MetaInfo meta;
+  private Storage storage;
+  private PeerCoordinator coordinator;
+  private ConnectionAcceptor acceptor;
+  private TrackerClient trackerclient;
+  private String rootDataDir = ".";
+  private final CompleteListener completeListener;
+  private boolean stopped;
+  private byte[] id;
+  private byte[] infoHash;
+  private String additionalTrackerURL;
+  private final I2PSnarkUtil _util;
+  private final PeerCoordinatorSet _peerCoordinatorSet;
+  private String trackerProblems;
+  private int trackerSeenPeers;
+
 
   /** from main() via parseArguments() single torrent */
   Snark(I2PSnarkUtil util, String torrent, String ip, int user_port,
@@ -306,31 +316,7 @@ public class Snark
     stopped = true;
     activity = "Network setup";
 
-    // "Taking Three as the subject to reason about--
-    // A convenient number to state--
-    // We add Seven, and Ten, and then multiply out
-    // By One Thousand diminished by Eight.
-    //
-    // "The result we proceed to divide, as you see,
-    // By Nine Hundred and Ninety Two:
-    // Then subtract Seventeen, and the answer must be
-    // Exactly and perfectly true.
-
-    // Create a new ID and fill it with something random.  First nine
-    // zeros bytes, then three bytes filled with snark and then
-    // sixteen random bytes.
-    byte snark = (((3 + 7 + 10) * (1000 - 8)) / 992) - 17;
-    id = new byte[20];
-    Random random = I2PAppContext.getGlobalContext().random();
-    int i;
-    for (i = 0; i < 9; i++)
-      id[i] = 0;
-    id[i++] = snark;
-    id[i++] = snark;
-    id[i++] = snark;
-    while (i < 20)
-      id[i++] = (byte)random.nextInt(256);
-
+    id = generateID();
     debug("My peer id: " + PeerID.idencode(id), Snark.INFO);
 
     int port;
@@ -372,7 +358,8 @@ public class Snark
                 in = new FileInputStream(torrentFile);
             }
           }
-        meta = new MetaInfo(new BDecoder(in));
+        meta = new MetaInfo(in);
+        infoHash = meta.getInfoHash();
       }
     catch(IOException ioe)
       {
@@ -406,6 +393,8 @@ public class Snark
          */
         else
           fatal("Cannot open '" + torrent + "'", ioe);
+      } catch (OutOfMemoryError oom) {
+          fatal("ERROR - Out of memory, cannot create torrent " + torrent + ": " + oom.getMessage());
       } finally {
           if (in != null)
               try { in.close(); } catch (IOException ioe) {}
@@ -457,6 +446,66 @@ public class Snark
     if (start)
         startTorrent();
   }
+
+  /**
+   *  multitorrent, magnet
+   *
+   *  @param torrent a fake name for now (not a file name)
+   *  @param ih 20-byte info hash
+   *  @param trackerURL may be null
+   *  @since 0.8.4
+   */
+  public Snark(I2PSnarkUtil util, String torrent, byte[] ih, String trackerURL,
+        CompleteListener complistener, PeerCoordinatorSet peerCoordinatorSet,
+        ConnectionAcceptor connectionAcceptor, boolean start, String rootDir)
+  {
+    completeListener = complistener;
+    _util = util;
+    _peerCoordinatorSet = peerCoordinatorSet;
+    acceptor = connectionAcceptor;
+    this.torrent = torrent;
+    this.infoHash = ih;
+    this.additionalTrackerURL = trackerURL;
+    this.rootDataDir = rootDir;
+    stopped = true;
+    id = generateID();
+
+    // All we have is an infoHash
+    // meta remains null
+    // storage remains null
+
+    if (start)
+        startTorrent();
+  }
+
+  private static byte[] generateID() {
+    // "Taking Three as the subject to reason about--
+    // A convenient number to state--
+    // We add Seven, and Ten, and then multiply out
+    // By One Thousand diminished by Eight.
+    //
+    // "The result we proceed to divide, as you see,
+    // By Nine Hundred and Ninety Two:
+    // Then subtract Seventeen, and the answer must be
+    // Exactly and perfectly true.
+
+    // Create a new ID and fill it with something random.  First nine
+    // zeros bytes, then three bytes filled with snark and then
+    // sixteen random bytes.
+    byte snark = (((3 + 7 + 10) * (1000 - 8)) / 992) - 17;
+    byte[] rv = new byte[20];
+    Random random = I2PAppContext.getGlobalContext().random();
+    int i;
+    for (i = 0; i < 9; i++)
+      rv[i] = 0;
+    rv[i++] = snark;
+    rv[i++] = snark;
+    rv[i++] = snark;
+    while (i < 20)
+      rv[i++] = (byte)random.nextInt(256);
+    return rv;
+  }
+
   /**
    * Start up contacting peers and querying the tracker
    */
@@ -473,7 +522,7 @@ public class Snark
         }
         debug("Starting PeerCoordinator, ConnectionAcceptor, and TrackerClient", NOTICE);
         activity = "Collecting pieces";
-        coordinator = new PeerCoordinator(_util, id, meta, storage, this, this);
+        coordinator = new PeerCoordinator(_util, id, infoHash, meta, storage, this, this);
         if (_peerCoordinatorSet != null) {
             // multitorrent
             _peerCoordinatorSet.add(coordinator);
@@ -486,7 +535,8 @@ public class Snark
             // single torrent
             acceptor = new ConnectionAcceptor(_util, serversocket, new PeerAcceptor(coordinator));
         }
-        trackerclient = new TrackerClient(_util, meta, coordinator);
+        // TODO pass saved closest DHT nodes to the tracker? or direct to the coordinator?
+        trackerclient = new TrackerClient(_util, meta, additionalTrackerURL, coordinator, this);
     }
 
     stopped = false;
@@ -496,8 +546,7 @@ public class Snark
         // restart safely, so lets build a new one to replace the old
         if (_peerCoordinatorSet != null)
             _peerCoordinatorSet.remove(coordinator);
-        PeerCoordinator newCoord = new PeerCoordinator(_util, coordinator.getID(), coordinator.getMetaInfo(), 
-                                                       coordinator.getStorage(), coordinator.getListener(), this);
+        PeerCoordinator newCoord = new PeerCoordinator(_util, id, infoHash, meta, storage, this, this);
         if (_peerCoordinatorSet != null)
             _peerCoordinatorSet.add(newCoord);
         coordinator = newCoord;
@@ -506,22 +555,23 @@ public class Snark
     if (!trackerclient.started() && !coordinatorChanged) {
         trackerclient.start();
     } else if (trackerclient.halted() || coordinatorChanged) {
-        try
-          {
-            storage.reopen(rootDataDir);
-          }
-        catch (IOException ioe)
-          {
-            try { storage.close(); } catch (IOException ioee) {
-                ioee.printStackTrace();
-            }
-            fatal("Could not reopen storage", ioe);
-          }
-        TrackerClient newClient = new TrackerClient(_util, coordinator.getMetaInfo(), coordinator);
+        if (storage != null) {
+            try {
+                 storage.reopen(rootDataDir);
+             }   catch (IOException ioe) {
+                 try { storage.close(); } catch (IOException ioee) {
+                     ioee.printStackTrace();
+                 }
+                 fatal("Could not reopen storage", ioe);
+             }
+        }
+        TrackerClient newClient = new TrackerClient(_util, meta, additionalTrackerURL, coordinator, this);
         if (!trackerclient.halted())
             trackerclient.halt();
         trackerclient = newClient;
         trackerclient.start();
+    } else {
+        debug("NOT starting TrackerClient???", NOTICE);
     }
   }
   /**
@@ -537,7 +587,7 @@ public class Snark
         pc.halt();
     Storage st = storage;
     if (st != null) {
-        boolean changed = storage.changed;
+        boolean changed = storage.isChanged();
         try { 
             storage.close(); 
         } catch (IOException ioe) {
@@ -553,18 +603,246 @@ public class Snark
         _util.disconnect();
   }
 
-  static Snark parseArguments(String[] args)
+  private static Snark parseArguments(String[] args)
   {
     return parseArguments(args, null, null);
   }
 
+    // Accessors
+
+    /**
+     *  @return file name of .torrent file (should be full absolute path), or a fake name if in magnet mode.
+     *  @since 0.8.4
+     */
+    public String getName() {
+        return torrent;
+    }
+
+    /**
+     *  @return base name of torrent [filtered version of getMetaInfo.getName()], or a fake name if in magnet mode
+     *  @since 0.8.4
+     */
+    public String getBaseName() {
+        if (storage != null)
+            return storage.getBaseName();
+        return torrent;
+    }
+
+    /**
+     *  @return always will be valid even in magnet mode
+     *  @since 0.8.4
+     */
+    public byte[] getID() {
+        return id;
+    }
+
+    /**
+     *  @return always will be valid even in magnet mode
+     *  @since 0.8.4
+     */
+    public byte[] getInfoHash() {
+        // should always be the same
+        if (meta != null)
+            return meta.getInfoHash();
+        return infoHash;
+    }
+
+    /**
+     *  @return may be null if in magnet mode
+     *  @since 0.8.4
+     */
+    public MetaInfo getMetaInfo() {
+        return meta;
+    }
+
+    /**
+     *  @return may be null if in magnet mode
+     *  @since 0.8.4
+     */
+    public Storage getStorage() {
+        return storage;
+    }
+
+    /**
+     *  @since 0.8.4
+     */
+    public boolean isStopped() {
+        return stopped;
+    }
+
+    /**
+     *  @since 0.8.4
+     */
+    public long getDownloadRate() {
+        PeerCoordinator coord = coordinator;
+        if (coord != null)
+            return coord.getDownloadRate();
+        return 0;
+    }
+
+    /**
+     *  @since 0.8.4
+     */
+    public long getUploadRate() {
+        PeerCoordinator coord = coordinator;
+        if (coord != null)
+            return coord.getUploadRate();
+        return 0;
+    }
+
+    /**
+     *  @since 0.8.4
+     */
+    public long getDownloaded() {
+        PeerCoordinator coord = coordinator;
+        if (coord != null)
+            return coord.getDownloaded();
+        return 0;
+    }
+
+    /**
+     *  @since 0.8.4
+     */
+    public long getUploaded() {
+        PeerCoordinator coord = coordinator;
+        if (coord != null)
+            return coord.getUploaded();
+        return 0;
+    }
+
+    /**
+     *  @since 0.8.4
+     */
+    public int getPeerCount() {
+        PeerCoordinator coord = coordinator;
+        if (coord != null)
+            return coord.getPeerCount();
+        return 0;
+    }
+
+    /**
+     *  @since 0.8.4
+     */
+    public List<Peer> getPeerList() {
+        PeerCoordinator coord = coordinator;
+        if (coord != null)
+            return coord.peerList();
+        return Collections.EMPTY_LIST;
+    }
+
+    /**
+     *  @return String returned from tracker, or null if no error
+     *  @since 0.8.4
+     */
+    public String getTrackerProblems() {
+        return trackerProblems;
+    }
+
+    /**
+     *  @param p tracker error string or null
+     *  @since 0.8.4
+     */
+    public void setTrackerProblems(String p) {
+        trackerProblems = p;
+    }
+
+    /**
+     *  @return count returned from tracker
+     *  @since 0.8.4
+     */
+    public int getTrackerSeenPeers() {
+        return trackerSeenPeers;
+    }
+
+    /**
+     *  @since 0.8.4
+     */
+    public void setTrackerSeenPeers(int p) {
+        trackerSeenPeers = p;
+    }
+
+    /**
+     *  @since 0.8.4
+     */
+    public void updatePiecePriorities() {
+        PeerCoordinator coord = coordinator;
+        if (coord != null)
+            coord.updatePiecePriorities();
+    }
+
+    /**
+     *  @return total of all torrent files, or total of metainfo file if fetching magnet, or -1
+     *  @since 0.8.4
+     */
+    public long getTotalLength() {
+        if (meta != null)
+            return meta.getTotalLength();
+        // FIXME else return metainfo length if available
+        return -1;
+    }
+
+    /**
+     *  @return number of pieces still needed (magnet mode or not), or -1 if unknown
+     *  @since 0.8.4
+     */
+    public long getNeeded() {
+        if (storage != null)
+            return storage.needed();
+        if (meta != null)
+            // FIXME subtract chunks we have
+            return meta.getTotalLength();
+        // FIXME fake
+        return -1;
+    }
+
+    /**
+     *  @param p the piece number
+     *  @return metainfo piece length or 16K if fetching magnet
+     *  @since 0.8.4
+     */
+    public int getPieceLength(int p) {
+        if (meta != null)
+            return meta.getPieceLength(p);
+        return 16*1024;
+    }
+
+    /**
+     *  @return number of pieces
+     *  @since 0.8.4
+     */
+    public int getPieces() {
+        if (meta != null)
+            return meta.getPieces();
+        // FIXME else return metainfo pieces if available
+        return -1;
+    }
+
+    /**
+     *  @return true if restarted
+     *  @since 0.8.4
+     */
+    public boolean restartAcceptor() {
+        if (acceptor == null)
+            return false;
+        acceptor.restart();
+        return true;
+    }
+
+    /**
+     *  @return trackerURL string from magnet-mode constructor, may be null
+     *  @since 0.8.4
+     */
+    public String getTrackerURL() {
+        return additionalTrackerURL;
+    }
+
   /**
    * Sets debug, ip and torrent variables then creates a Snark
    * instance.  Calls usage(), which terminates the program, if
    * non-valid argument list.  The given listeners will be
    * passed to all components that take one.
    */
-  static Snark parseArguments(String[] args,
+  private static Snark parseArguments(String[] args,
                               StorageListener slistener,
                               CoordinatorListener clistener)
   {
@@ -713,13 +991,12 @@ public class Snark
       ("  <file> \tEither a local .torrent metainfo file to download");
     System.out.println
       ("         \tor (with --share) a file to share.");
-    System.exit(-1);
   }
 
   /**
    * Aborts program abnormally.
    */
-  public void fatal(String s)
+  private void fatal(String s)
   {
     fatal(s, null);
   }
@@ -727,14 +1004,14 @@ public class Snark
   /**
    * Aborts program abnormally.
    */
-  public void fatal(String s, Throwable t)
+  private void fatal(String s, Throwable t)
   {
     _util.debug(s, ERROR, t);
     //System.err.println("snark: " + s + ((t == null) ? "" : (": " + t)));
     //if (debug >= INFO && t != null)
     //  t.printStackTrace();
     stopTorrent();
-    throw new RuntimeException(s + (t == null ? "" : ": " + t));
+    throw new RuntimeException(s, t);
   }
 
   /**
@@ -751,7 +1028,36 @@ public class Snark
     // System.out.println(peer.toString());
   }
   
-  boolean allocating = false;
+  /**
+   * Called when the PeerCoordinator got the MetaInfo via magnet.
+   * CoordinatorListener.
+   * Create the storage, tell SnarkManager, and give the storage
+   * back to the coordinator.
+   *
+   * @throws RuntimeException via fatal()
+   * @since 0.8.4
+   */
+  public void gotMetaInfo(PeerCoordinator coordinator, MetaInfo metainfo) {
+      meta = metainfo;
+      try {
+          storage = new Storage(_util, meta, this);
+          storage.check(rootDataDir);
+          if (completeListener != null) {
+              String newName = completeListener.gotMetaInfo(this);
+              if (newName != null)
+                  torrent = newName;
+              // else some horrible problem
+          }
+          coordinator.setStorage(storage);
+      } catch (IOException ioe) {
+          if (storage != null) {
+              try { storage.close(); } catch (IOException ioee) {}
+          }
+          fatal("Could not check or create storage", ioe);
+      }
+  }
+
+  private boolean allocating = false;
   public void storageCreateFile(Storage storage, String name, long length)
   {
     //if (allocating)
@@ -774,9 +1080,9 @@ public class Snark
     //  System.out.println(); // We have all the disk space we need.
   }
 
-  boolean allChecked = false;
-  boolean checking = false;
-  boolean prechecking = true;
+  private boolean allChecked = false;
+  private boolean checking = false;
+  private boolean prechecking = true;
   public void storageChecked(Storage storage, int num, boolean checked)
   {
     allocating = false;
@@ -803,7 +1109,7 @@ public class Snark
 
     allChecked = true;
     checking = false;
-    if (storage.changed && completeListener != null)
+    if (storage.isChanged() && completeListener != null)
         completeListener.updateStatus(this);
   }
   
@@ -821,16 +1127,28 @@ public class Snark
     coordinator.setWantedPieces();
   }
 
+  /** SnarkSnutdown callback unused */
   public void shutdown()
   {
     // Should not be necessary since all non-deamon threads should
     // have died. But in reality this does not always happen.
-    System.exit(0);
+    //System.exit(0);
   }
   
   public interface CompleteListener {
     public void torrentComplete(Snark snark);
     public void updateStatus(Snark snark);
+
+    /**
+     * We transitioned from magnet mode, we have now initialized our
+     * metainfo and storage. The listener should now call getMetaInfo()
+     * and save the data to disk.
+     *
+     * @return the new name for the torrent or null on error
+     * @since 0.8.4
+     */
+    public String gotMetaInfo(Snark snark);
+
     // not really listeners but the easiest way to get back to an optional SnarkManager
     public long getSavedTorrentTime(Snark snark);
     public BitField getSavedTorrentBitField(Snark snark);
diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
index 82d1d80f4f53789bb8a06c21e709fd57ad261a44..695cd7b7a313597cd322c213e57e959094f21b73 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
@@ -5,6 +5,7 @@ import java.io.FileFilter;
 import java.io.FileInputStream;
 import java.io.FilenameFilter;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -16,14 +17,18 @@ import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
 import java.util.Collection;
+import java.util.concurrent.ConcurrentHashMap;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.Base64;
 import net.i2p.data.DataHelper;
+import net.i2p.util.ConcurrentHashSet;
+import net.i2p.util.FileUtil;
 import net.i2p.util.I2PAppThread;
 import net.i2p.util.Log;
 import net.i2p.util.OrderedProperties;
 import net.i2p.util.SecureDirectory;
+import net.i2p.util.SecureFileOutputStream;
 
 /**
  * Manage multiple snarks
@@ -32,8 +37,14 @@ public class SnarkManager implements Snark.CompleteListener {
     private static SnarkManager _instance = new SnarkManager();
     public static SnarkManager instance() { return _instance; }
     
-    /** map of (canonical) filename of the .torrent file to Snark instance (unsynchronized) */
+    /**
+     *  Map of (canonical) filename of the .torrent file to Snark instance.
+     *  This is a CHM so listTorrentFiles() need not be synced, but
+     *  all adds, deletes, and the DirMonitor should sync on it.
+     */
     private final Map<String, Snark> _snarks;
+    /** used to prevent DirMonitor from deleting torrents that don't have a torrent file yet */
+    private final Set<String> _magnets;
     private final Object _addSnarkLock;
     private /* FIXME final FIXME */ File _configFile;
     private Properties _config;
@@ -57,6 +68,7 @@ public class SnarkManager implements Snark.CompleteListener {
     public static final String PROP_META_PREFIX = "i2psnark.zmeta.";
     public static final String PROP_META_BITFIELD_SUFFIX = ".bitfield";
     public static final String PROP_META_PRIORITY_SUFFIX = ".priority";
+    public static final String PROP_META_MAGNET_PREFIX = "i2psnark.magnet.";
 
     private static final String CONFIG_FILE = "i2psnark.config";
     public static final String PROP_AUTO_START = "i2snark.autoStart";   // oops
@@ -71,7 +83,8 @@ public class SnarkManager implements Snark.CompleteListener {
     public static final int DEFAULT_MAX_UP_BW = 10;
     public static final int DEFAULT_STARTUP_DELAY = 3; 
     private SnarkManager() {
-        _snarks = new HashMap();
+        _snarks = new ConcurrentHashMap();
+        _magnets = new ConcurrentHashSet();
         _addSnarkLock = new Object();
         _context = I2PAppContext.getGlobalContext();
         _log = _context.logManager().getLog(SnarkManager.class);
@@ -90,8 +103,6 @@ public class SnarkManager implements Snark.CompleteListener {
         _running = true;
         _peerCoordinatorSet = new PeerCoordinatorSet();
         _connectionAcceptor = new ConnectionAcceptor(_util);
-        int minutes = getStartupDelayMinutes();
-        _messages.add(_("Adding torrents in {0} minutes", minutes));
         _monitor = new I2PAppThread(new DirMonitor(), "Snark DirMonitor", true);
         _monitor.start();
         _context.addShutdownTask(new SnarkManagerShutdown());
@@ -236,11 +247,9 @@ public class SnarkManager implements Snark.CompleteListener {
                     i2cpOpts.put(pair.substring(0, split), pair.substring(split+1));
             }
         }
-        if (i2cpHost != null) {
-            _util.setI2CPConfig(i2cpHost, i2cpPort, i2cpOpts);
-            if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Configuring with I2CP options " + i2cpOpts);
-        }
+        _util.setI2CPConfig(i2cpHost, i2cpPort, i2cpOpts);
+        if (_log.shouldLog(Log.DEBUG))
+            _log.debug("Configuring with I2CP options " + i2cpOpts);
         //I2PSnarkUtil.instance().setI2CPConfig("66.111.51.110", 7654, new Properties());
         //String eepHost = _config.getProperty(PROP_EEP_HOST);
         //int eepPort = getInt(PROP_EEP_PORT, 4444);
@@ -252,7 +261,9 @@ public class SnarkManager implements Snark.CompleteListener {
         String ot = _config.getProperty(I2PSnarkUtil.PROP_OPENTRACKERS);
         if (ot != null)
             _util.setOpenTrackerString(ot);
-        // FIXME set util use open trackers property somehow
+        String useOT = _config.getProperty(I2PSnarkUtil.PROP_USE_OPENTRACKERS);
+        boolean bOT = useOT == null || Boolean.valueOf(useOT).booleanValue();
+        _util.setUseOpenTrackers(bOT);
         getDataDir().mkdirs();
     }
     
@@ -321,15 +332,18 @@ public class SnarkManager implements Snark.CompleteListener {
                 	    _util.setStartupDelay(minutes);
 	                    changed = true;
         	            _config.setProperty(PROP_STARTUP_DELAY, "" + minutes);
-                	    addMessage(_("Startup delay limit changed to {0} minutes", minutes));
+                	    addMessage(_("Startup delay changed to {0}", DataHelper.formatDuration2(minutes * 60 * 1000)));
                 	}
 
 	}
+        // FIXME do this even if == null
 	if (i2cpHost != null) {
             int oldI2CPPort = _util.getI2CPPort();
             String oldI2CPHost = _util.getI2CPHost();
             int port = oldI2CPPort;
-            try { port = Integer.parseInt(i2cpPort); } catch (NumberFormatException nfe) {}
+            if (i2cpPort != null) {
+                try { port = Integer.parseInt(i2cpPort); } catch (NumberFormatException nfe) {}
+            }
             String host = oldI2CPHost;
             Map opts = new HashMap();
             if (i2cpOpts == null) i2cpOpts = "";
@@ -359,7 +373,7 @@ public class SnarkManager implements Snark.CompleteListener {
                 Set names = listTorrentFiles();
                 for (Iterator iter = names.iterator(); iter.hasNext(); ) {
                     Snark snark = getTorrent((String)iter.next());
-                    if ( (snark != null) && (!snark.stopped) ) {
+                    if ( (snark != null) && (!snark.isStopped()) ) {
                         snarksActive = true;
                         break;
                     }
@@ -368,6 +382,7 @@ public class SnarkManager implements Snark.CompleteListener {
                     Properties p = new Properties();
                     p.putAll(opts);
                     _util.setI2CPConfig(i2cpHost, port, p);
+                    _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW));
                     addMessage(_("I2CP and tunnel changes will take effect after stopping all torrents"));
                     if (_log.shouldLog(Log.DEBUG))
                         _log.debug("i2cp host [" + i2cpHost + "] i2cp port " + port + " opts [" + opts 
@@ -381,6 +396,7 @@ public class SnarkManager implements Snark.CompleteListener {
                     p.putAll(opts);
                     addMessage(_("I2CP settings changed to {0}", i2cpHost + ":" + port + " (" + i2cpOpts.trim() + ")"));
                     _util.setI2CPConfig(i2cpHost, port, p);
+                    _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW));
                     boolean ok = _util.connect();
                     if (!ok) {
                         addMessage(_("Unable to connect with the new settings, reverting to the old I2CP settings"));
@@ -398,9 +414,8 @@ public class SnarkManager implements Snark.CompleteListener {
                         for (Iterator iter = names.iterator(); iter.hasNext(); ) {
                             String name = (String)iter.next();
                             Snark snark = getTorrent(name);
-                            if ( (snark != null) && (snark.acceptor != null) ) {
-                                snark.acceptor.restart();
-                                addMessage(_("I2CP listener restarted for \"{0}\"", snark.meta.getName()));
+                            if (snark != null && snark.restartAcceptor()) {
+                                addMessage(_("I2CP listener restarted for \"{0}\"", snark.getBaseName()));
                             }
                         }
                     }
@@ -422,6 +437,7 @@ public class SnarkManager implements Snark.CompleteListener {
                 addMessage(_("Enabled open trackers - torrent restart required to take effect."));
             else
                 addMessage(_("Disabled open trackers - torrent restart required to take effect."));
+            _util.setUseOpenTrackers(useOpenTrackers);
             changed = true;
         }
         if (openTrackers != null) {
@@ -461,8 +477,13 @@ public class SnarkManager implements Snark.CompleteListener {
     /** hardcoded for sanity.  perhaps this should be customizable, for people who increase their ulimit, etc. */
     private static final int MAX_FILES_PER_TORRENT = 512;
     
-    /** set of canonical .torrent filenames that we are dealing with */
-    public Set<String> listTorrentFiles() { synchronized (_snarks) { return new HashSet(_snarks.keySet()); } }
+    /**
+     *  Set of canonical .torrent filenames that we are dealing with.
+     *  An unsynchronized copy.
+     */
+    public Set<String> listTorrentFiles() {
+        return new HashSet(_snarks.keySet());
+    }
 
     /**
      * Grab the torrent given the (canonical) filename of the .torrent file
@@ -478,18 +499,39 @@ public class SnarkManager implements Snark.CompleteListener {
     public Snark getTorrentByBaseName(String filename) {
         synchronized (_snarks) {
             for (Snark s : _snarks.values()) {
-                if (s.storage.getBaseName().equals(filename))
+                if (s.getBaseName().equals(filename))
                     return s;
             }
         }
         return null;
     }
 
-    /** @throws RuntimeException via Snark.fatal() */
-    public void addTorrent(String filename) { addTorrent(filename, false); }
+    /**
+     * Grab the torrent given the info hash
+     * @return Snark or null
+     * @since 0.8.4
+     */
+    public Snark getTorrentByInfoHash(byte[] infohash) {
+        synchronized (_snarks) {
+            for (Snark s : _snarks.values()) {
+                if (DataHelper.eq(infohash, s.getInfoHash()))
+                    return s;
+            }
+        }
+        return null;
+    }
 
-    /** @throws RuntimeException via Snark.fatal() */
-    public void addTorrent(String filename, boolean dontAutoStart) {
+    /**
+     *  Caller must verify this torrent is not already added.
+     *  @throws RuntimeException via Snark.fatal()
+     */
+    private void addTorrent(String filename) { addTorrent(filename, false); }
+
+    /**
+     *  Caller must verify this torrent is not already added.
+     *  @throws RuntimeException via Snark.fatal()
+     */
+    private void addTorrent(String filename, boolean dontAutoStart) {
         if ((!dontAutoStart) && !_util.connected()) {
             addMessage(_("Connecting to I2P"));
             boolean ok = _util.connect();
@@ -530,31 +572,48 @@ public class SnarkManager implements Snark.CompleteListener {
                 }
 
                 try {
+                    // This is somewhat wasteful as this metainfo is thrown away,
+                    // the real one is created in the Snark constructor.
+                    // TODO: Make a Snark constructor where we pass the MetaInfo in as a parameter.
                     MetaInfo info = new MetaInfo(fis);
                     try {
                         fis.close();
                         fis = null;
                     } catch (IOException e) {}
                     
+                    // This test may be a duplicate, but not if we were called
+                    // from the DirMonitor, which only checks for dup torrent file names.
+                    Snark snark = getTorrentByInfoHash(info.getInfoHash());
+                    if (snark != null) {
+                        // TODO - if the existing one is a magnet, delete it and add the metainfo instead?
+                        addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName()));
+                        return;
+                    }
+
                     if (!TrackerClient.isValidAnnounce(info.getAnnounce())) {
                         if (_util.shouldUseOpenTrackers() && _util.getOpenTrackers() != null) {
-                            addMessage(_("Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only", info.getName()));
+                            //addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName()));
+                            addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers only.", info.getName()));
+                        //} else if (_util.getDHT() != null) {
+                        //    addMessage(_("Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will announce to DHT only.", info.getName()));
                         } else {
-                            addMessage(_("Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!", info.getName()));
+                            //addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName()));
+                            addMessage(_("Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is enabled before starting this torrent.", info.getName()));
                             dontAutoStart = true;
                         }
                     }
-                    String rejectMessage = locked_validateTorrent(info);
+                    String rejectMessage = validateTorrent(info);
                     if (rejectMessage != null) {
                         sfile.delete();
                         addMessage(rejectMessage);
                         return;
                     } else {
+                        // TODO load saved closest DHT nodes and pass to the Snark ?
+                        // This may take a LONG time
                         torrent = new Snark(_util, filename, null, -1, null, null, this,
                                             _peerCoordinatorSet, _connectionAcceptor,
                                             false, dataDir.getPath());
                         loadSavedFilePriorities(torrent);
-                        torrent.completeListener = this;
                         synchronized (_snarks) {
                             _snarks.put(filename, torrent);
                         }
@@ -564,6 +623,9 @@ public class SnarkManager implements Snark.CompleteListener {
                     if (sfile.exists())
                         sfile.delete();
                     return;
+                } catch (OutOfMemoryError oom) {
+                    addMessage(_("ERROR - Out of memory, cannot create torrent from {0}", sfile.getName()) + ": " + oom.getMessage());
+                    return;
                 } finally {
                     if (fis != null) try { fis.close(); } catch (IOException ioe) {}
                 }
@@ -572,21 +634,167 @@ public class SnarkManager implements Snark.CompleteListener {
             return;
         }
         // ok, snark created, now lets start it up or configure it further
-        File f = new File(filename);
         if (!dontAutoStart && shouldAutoStart()) {
             torrent.startTorrent();
-            addMessage(_("Torrent added and started: \"{0}\"", torrent.storage.getBaseName()));
+            addMessage(_("Torrent added and started: \"{0}\"", torrent.getBaseName()));
         } else {
-            addMessage(_("Torrent added: \"{0}\"", torrent.storage.getBaseName()));
+            addMessage(_("Torrent added: \"{0}\"", torrent.getBaseName()));
         }
     }
     
     /**
-     * Get the timestamp for a torrent from the config file
+     * Add a torrent with the info hash alone (magnet / maggot)
+     *
+     * @param name hex or b32 name from the magnet link
+     * @param ih 20 byte info hash
+     * @param trackerURL may be null
+     * @param updateStatus should we add this magnet to the config file,
+     *                     to save it across restarts, in case we don't get
+     *                     the metadata before shutdown?
+     * @throws RuntimeException via Snark.fatal()
+     * @since 0.8.4
+     */
+    public void addMagnet(String name, byte[] ih, String trackerURL, boolean updateStatus) {
+        Snark torrent = new Snark(_util, name, ih, trackerURL, this,
+                                  _peerCoordinatorSet, _connectionAcceptor,
+                                  false, getDataDir().getPath());
+
+        synchronized (_snarks) {
+            Snark snark = getTorrentByInfoHash(ih);
+            if (snark != null) {
+                addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName()));
+                return;
+            }
+            // Tell the dir monitor not to delete us
+            _magnets.add(name);
+            if (updateStatus)
+                saveMagnetStatus(ih);
+            _snarks.put(name, torrent);
+        }
+        if (shouldAutoStart()) {
+            torrent.startTorrent();
+            addMessage(_("Fetching {0}", name));
+            boolean haveSavedPeers = false;
+            if ((!util().connected()) && !haveSavedPeers) {
+                addMessage(_("We have no saved peers and no other torrents are running. " +
+                             "Fetch of {0} will not succeed until you start another torrent.", name));
+            }
+        } else {
+            addMessage(_("Adding {0}", name));
+      }
+    }
+
+    /**
+     * Stop and delete a torrent running in magnet mode
+     *
+     * @param snark a torrent with a fake file name ("Magnet xxxx")
+     * @since 0.8.4
+     */
+    public void deleteMagnet(Snark snark) {
+        synchronized (_snarks) {
+            _snarks.remove(snark.getName());
+        }
+        snark.stopTorrent();
+        _magnets.remove(snark.getName());
+        removeMagnetStatus(snark.getInfoHash());
+    }
+
+    /**
+     * Add a torrent from a MetaInfo. Save the MetaInfo data to filename.
+     * Holds the snarks lock to prevent interference from the DirMonitor.
+     * This verifies that a torrent with this infohash is not already added.
+     * This may take a LONG time to create or check the storage.
+     *
+     * @param metainfo the metainfo for the torrent
+     * @param bitfield the current completion status of the torrent
+     * @param filename the absolute path to save the metainfo to, generally ending in ".torrent", which is also the name of the torrent
+     *                 Must be a filesystem-safe name.
+     * @throws RuntimeException via Snark.fatal()
+     * @since 0.8.4
+     */
+    public void addTorrent(MetaInfo metainfo, BitField bitfield, String filename, boolean dontAutoStart) throws IOException {
+        // prevent interference by DirMonitor
+        synchronized (_snarks) {
+            Snark snark = getTorrentByInfoHash(metainfo.getInfoHash());
+            if (snark != null) {
+                addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName()));
+                return;
+            }
+            // so addTorrent won't recheck
+            saveTorrentStatus(metainfo, bitfield, null); // no file priorities
+            try {
+                locked_writeMetaInfo(metainfo, filename);
+                // hold the lock for a long time
+                addTorrent(filename, dontAutoStart);
+            } catch (IOException ioe) {
+                addMessage(_("Failed to copy torrent file to {0}", filename));
+                _log.error("Failed to write torrent file", ioe);
+            }
+        }
+    }
+
+    /**
+     * Add a torrent from a file not in the torrent directory. Copy the file to filename.
+     * Holds the snarks lock to prevent interference from the DirMonitor.
+     * Caller must verify this torrent is not already added.
+     * This may take a LONG time to create or check the storage.
+     *
+     * @param fromfile where the file is now, presumably in a temp directory somewhere
+     * @param filename the absolute path to save the metainfo to, generally ending in ".torrent", which is also the name of the torrent
+     *                 Must be a filesystem-safe name.
+     * @throws RuntimeException via Snark.fatal()
+     * @since 0.8.4
+     */
+    public void copyAndAddTorrent(File fromfile, String filename) throws IOException {
+        // prevent interference by DirMonitor
+        synchronized (_snarks) {
+            boolean success = FileUtil.copy(fromfile.getAbsolutePath(), filename, false);
+            if (!success) {
+                addMessage(_("Failed to copy torrent file to {0}", filename));
+                _log.error("Failed to write torrent file to " + filename);
+                return;
+            }
+            SecureFileOutputStream.setPerms(new File(filename));
+            // hold the lock for a long time
+            addTorrent(filename);
+         }
+    }
+
+    /**
+     * Write the metainfo to the file, caller must hold the snarks lock
+     * to prevent interference from the DirMonitor.
+     *
+     * @param metainfo The metainfo for the torrent
+     * @param filename The absolute path to save the metainfo to, generally ending in ".torrent".
+     *                 Must be a filesystem-safe name.
+     * @since 0.8.4
+     */
+    private static void locked_writeMetaInfo(MetaInfo metainfo, String filename) throws IOException {
+        File file = new File(filename);
+        if (file.exists())
+            throw new IOException("Cannot overwrite an existing .torrent file: " + file.getPath());
+        OutputStream out = null;
+        try {
+            out = new SecureFileOutputStream(filename);
+            out.write(metainfo.getTorrentData());
+        } catch (IOException ioe) {
+            // remove any partial
+            file.delete();
+            throw ioe;
+        } finally {
+            try {
+                if (out == null)
+                    out.close();
+            } catch (IOException ioe) {}
+        }
+    }
+
+    /**
+     * Get the timestamp for a torrent from the config file.
+     * A Snark.CompleteListener method.
      */
     public long getSavedTorrentTime(Snark snark) {
-        MetaInfo metainfo = snark.meta;
-        byte[] ih = metainfo.getInfoHash();
+        byte[] ih = snark.getInfoHash();
         String infohash = Base64.encode(ih);
         infohash = infohash.replace('=', '$');
         String time = _config.getProperty(PROP_META_PREFIX + infohash + PROP_META_BITFIELD_SUFFIX);
@@ -603,10 +811,13 @@ public class SnarkManager implements Snark.CompleteListener {
     /**
      * Get the saved bitfield for a torrent from the config file.
      * Convert "." to a full bitfield.
+     * A Snark.CompleteListener method.
      */
     public BitField getSavedTorrentBitField(Snark snark) {
-        MetaInfo metainfo = snark.meta;
-        byte[] ih = metainfo.getInfoHash();
+        MetaInfo metainfo = snark.getMetaInfo();
+        if (metainfo == null)
+            return null;
+        byte[] ih = snark.getInfoHash();
         String infohash = Base64.encode(ih);
         infohash = infohash.replace('=', '$');
         String bf = _config.getProperty(PROP_META_PREFIX + infohash + PROP_META_BITFIELD_SUFFIX);
@@ -636,10 +847,13 @@ public class SnarkManager implements Snark.CompleteListener {
      * @since 0.8.1
      */
     public void loadSavedFilePriorities(Snark snark) {
-        MetaInfo metainfo = snark.meta;
+        MetaInfo metainfo = snark.getMetaInfo();
+        Storage storage = snark.getStorage();
+        if (metainfo == null || storage == null)
+            return;
         if (metainfo.getFiles() == null)
             return;
-        byte[] ih = metainfo.getInfoHash();
+        byte[] ih = snark.getInfoHash();
         String infohash = Base64.encode(ih);
         infohash = infohash.replace('=', '$');
         String pri = _config.getProperty(PROP_META_PREFIX + infohash + PROP_META_PRIORITY_SUFFIX);
@@ -655,7 +869,7 @@ public class SnarkManager implements Snark.CompleteListener {
                 } catch (Throwable t) {}
             }
         }
-        snark.storage.setFilePriorities(rv);
+        storage.setFilePriorities(rv);
     }
     
     /**
@@ -666,6 +880,8 @@ public class SnarkManager implements Snark.CompleteListener {
      * The time is a standard long converted to string.
      * The status is either a bitfield converted to Base64 or "." for a completed
      * torrent to save space in the config file and in memory.
+     *
+     * @param bitfield non-null
      * @param priorities may be null
      */
     public void saveTorrentStatus(MetaInfo metainfo, BitField bitfield, int[] priorities) {
@@ -709,6 +925,8 @@ public class SnarkManager implements Snark.CompleteListener {
             _config.remove(prop);
         }
 
+        // TODO save closest DHT nodes too
+
         saveConfig();
     }
     
@@ -726,9 +944,33 @@ public class SnarkManager implements Snark.CompleteListener {
     }
     
     /**
+     *  Just remember we have it
+     *  @since 0.8.4
+     */
+    public void saveMagnetStatus(byte[] ih) {
+        String infohash = Base64.encode(ih);
+        infohash = infohash.replace('=', '$');
+        _config.setProperty(PROP_META_MAGNET_PREFIX + infohash, ".");
+        saveConfig();
+    }
+    
+    /**
+     *  Remove the magnet marker from the config file.
+     *  @since 0.8.4
+     */
+    public void removeMagnetStatus(byte[] ih) {
+        String infohash = Base64.encode(ih);
+        infohash = infohash.replace('=', '$');
+        _config.remove(PROP_META_MAGNET_PREFIX + infohash);
+        saveConfig();
+    }
+    
+    /**
+     *  Does not really delete on failure, that's the caller's responsibility.
      *  Warning - does not validate announce URL - use TrackerClient.isValidAnnounce()
+     *  @return failure message or null on success
      */
-    private String locked_validateTorrent(MetaInfo info) throws IOException {
+    private String validateTorrent(MetaInfo info) {
         List files = info.getFiles();
         if ( (files != null) && (files.size() > MAX_FILES_PER_TORRENT) ) {
             return _("Too many files in \"{0}\" ({1}), deleting it!", info.getName(), files.size());
@@ -741,6 +983,8 @@ public class SnarkManager implements Snark.CompleteListener {
         } else if (info.getPieceLength(0) > Storage.MAX_PIECE_SIZE) {
             return _("Pieces are too large in \"{0}\" ({1}B), deleting it.", info.getName(), DataHelper.formatSize2(info.getPieceLength(0))) + ' ' +
                    _("Limit is {0}B", DataHelper.formatSize2(Storage.MAX_PIECE_SIZE));
+        } else if (info.getTotalLength() <= 0) {
+            return _("Torrent \"{0}\" has no data, deleting it!", info.getName());
         } else if (info.getTotalLength() > Storage.MAX_TOTAL_SIZE) {
             System.out.println("torrent info: " + info.toString());
             List lengths = info.getLengths();
@@ -777,86 +1021,193 @@ public class SnarkManager implements Snark.CompleteListener {
             remaining = _snarks.size();
         }
         if (torrent != null) {
-            boolean wasStopped = torrent.stopped;
+            boolean wasStopped = torrent.isStopped();
             torrent.stopTorrent();
             if (remaining == 0) {
                 // should we disconnect/reconnect here (taking care to deal with the other thread's
                 // I2PServerSocket.accept() call properly?)
                 ////_util.
             }
-            String name;
-            if (torrent.storage != null) {
-                name = torrent.storage.getBaseName();
-            } else {
-                name = sfile.getName();
-            }
             if (!wasStopped)
-                addMessage(_("Torrent stopped: \"{0}\"", name));
+                addMessage(_("Torrent stopped: \"{0}\"", torrent.getBaseName()));
         }
         return torrent;
     }
+
+    /**
+     * Stop the torrent, leaving it on the list of torrents unless told to remove it
+     * @since 0.8.4
+     */
+    public void stopTorrent(Snark torrent, boolean shouldRemove) {
+        if (shouldRemove) {
+            synchronized (_snarks) {
+                _snarks.remove(torrent.getName());
+            }
+        }
+        boolean wasStopped = torrent.isStopped();
+        torrent.stopTorrent();
+        if (!wasStopped)
+            addMessage(_("Torrent stopped: \"{0}\"", torrent.getBaseName()));
+    }
+
     /**
      * Stop the torrent and delete the torrent file itself, but leaving the data
      * behind.
+     * Holds the snarks lock to prevent interference from the DirMonitor.
      */
     public void removeTorrent(String filename) {
-        Snark torrent = stopTorrent(filename, true);
-        if (torrent != null) {
+        Snark torrent;
+        // prevent interference by DirMonitor
+        synchronized (_snarks) {
+            torrent = stopTorrent(filename, true);
+            if (torrent == null)
+                return;
             File torrentFile = new File(filename);
             torrentFile.delete();
-            String name;
-            if (torrent.storage != null) {
-                removeTorrentStatus(torrent.storage.getMetaInfo());
-                name = torrent.storage.getBaseName();
-            } else {
-                name = torrentFile.getName();
-            }
-            addMessage(_("Torrent removed: \"{0}\"", name));
         }
+        Storage storage = torrent.getStorage();
+        if (storage != null)
+            removeTorrentStatus(storage.getMetaInfo());
+        addMessage(_("Torrent removed: \"{0}\"", torrent.getBaseName()));
     }
     
     private class DirMonitor implements Runnable {
         public void run() {
-            try { Thread.sleep(60*1000*getStartupDelayMinutes()); } catch (InterruptedException ie) {}
-            // the first message was a "We are starting up in 1m" 
-            synchronized (_messages) { 
-                if (_messages.size() == 1)
-                    _messages.remove(0);
+            // don't bother delaying if auto start is false
+            long delay = 60 * 1000 * getStartupDelayMinutes();
+            if (delay > 0 && shouldAutoStart()) {
+                _messages.add(_("Adding torrents in {0}", DataHelper.formatDuration2(delay)));
+                try { Thread.sleep(delay); } catch (InterruptedException ie) {}
+                // the first message was a "We are starting up in 1m" 
+                synchronized (_messages) { 
+                    if (_messages.size() == 1)
+                        _messages.remove(0);
+                }
             }
 
             // here because we need to delay until I2CP is up
             // although the user will see the default until then
             getBWLimit();
+            boolean doMagnets = true;
             while (true) {
                 File dir = getDataDir();
                 if (_log.shouldLog(Log.DEBUG))
                     _log.debug("Directory Monitor loop over " + dir.getAbsolutePath());
                 try {
-                    monitorTorrents(dir);
+                    // Don't let this interfere with .torrent files being added or deleted
+                    synchronized (_snarks) {
+                        monitorTorrents(dir);
+                    }
                 } catch (Exception e) {
                     _log.error("Error in the DirectoryMonitor", e);
                 }
+                if (doMagnets) {
+                    addMagnets();
+                    doMagnets = false;
+                }
                 try { Thread.sleep(60*1000); } catch (InterruptedException ie) {}
             }
         }
     }
     
-    /** two listeners */
+    // Begin Snark.CompleteListeners
+
+    /**
+     * A Snark.CompleteListener method.
+     */
     public void torrentComplete(Snark snark) {
+        MetaInfo meta = snark.getMetaInfo();
+        Storage storage = snark.getStorage();
+        if (meta == null || storage == null)
+            return;
         StringBuilder buf = new StringBuilder(256);
-        buf.append("<a href=\"/i2psnark/").append(snark.storage.getBaseName());
-        if (snark.meta.getFiles() != null)
+        buf.append("<a href=\"/i2psnark/").append(storage.getBaseName());
+        if (meta.getFiles() != null)
             buf.append('/');
-        buf.append("\">").append(snark.storage.getBaseName()).append("</a>");
-        long len = snark.meta.getTotalLength();
+        buf.append("\">").append(storage.getBaseName()).append("</a>");
         addMessage(_("Download finished: {0}", buf.toString())); //  + " (" + _("size: {0}B", DataHelper.formatSize2(len)) + ')');
         updateStatus(snark);
     }
     
+    /**
+     * A Snark.CompleteListener method.
+     */
     public void updateStatus(Snark snark) {
-        saveTorrentStatus(snark.meta, snark.storage.getBitField(), snark.storage.getFilePriorities());
+        MetaInfo meta = snark.getMetaInfo();
+        Storage storage = snark.getStorage();
+        if (meta != null && storage != null)
+            saveTorrentStatus(meta, storage.getBitField(), storage.getFilePriorities());
     }
     
+    /**
+     * We transitioned from magnet mode, we have now initialized our
+     * metainfo and storage. The listener should now call getMetaInfo()
+     * and save the data to disk.
+     * A Snark.CompleteListener method.
+     *
+     * @return the new name for the torrent or null on error
+     * @since 0.8.4
+     */
+    public String gotMetaInfo(Snark snark) {
+        MetaInfo meta = snark.getMetaInfo();
+        Storage storage = snark.getStorage();
+        if (meta != null && storage != null) {
+            String rejectMessage = validateTorrent(meta);
+            if (rejectMessage != null) {
+                addMessage(rejectMessage);
+                snark.stopTorrent();
+                return null;
+            }
+            saveTorrentStatus(meta, storage.getBitField(), null); // no file priorities
+            String name = (new File(getDataDir(), storage.getBaseName() + ".torrent")).getAbsolutePath();
+            try {
+                // put the announce URL in the file
+                String announce = snark.getTrackerURL();
+                if (announce != null)
+                    meta = meta.reannounce(announce);
+                synchronized (_snarks) {
+                    locked_writeMetaInfo(meta, name);
+                    // put it in the list under the new name
+                    _snarks.remove(snark.getName());
+                    _snarks.put(name, snark);
+                }
+                _magnets.remove(snark.getName());
+                removeMagnetStatus(snark.getInfoHash());
+                addMessage(_("Metainfo received for {0}", snark.getName()));
+                addMessage(_("Starting up torrent {0}", storage.getBaseName()));
+                return name;
+            } catch (IOException ioe) {
+                addMessage(_("Failed to copy torrent file to {0}", name));
+                _log.error("Failed to write torrent file", ioe);
+            }
+        }
+        return null;
+    }
+
+    // End Snark.CompleteListeners
+
+    /**
+     * Add all magnets from the config file
+     * @since 0.8.4
+     */
+    private void addMagnets() {
+        for (Object o : _config.keySet()) {
+            String k = (String) o;
+            if (k.startsWith(PROP_META_MAGNET_PREFIX)) {
+                String b64 = k.substring(PROP_META_MAGNET_PREFIX.length());
+                b64 = b64.replace('$', '=');
+                byte[] ih = Base64.decode(b64);
+                // ignore value - TODO put tracker URL in value
+                if (ih != null && ih.length == 20)
+                    addMagnet("Magnet: " + I2PSnarkUtil.toHex(ih), ih, null, false);
+                // else remove from config?
+            }
+        }
+    }
+
+    /**
+     *  caller must synchronize on _snarks
+     */
     private void monitorTorrents(File dir) {
         String fileNames[] = dir.list(TorrentFilenameFilter.instance());
         List<String> foundNames = new ArrayList(0);
@@ -887,6 +1238,8 @@ public class SnarkManager implements Snark.CompleteListener {
                 }
             }
         }
+        // Don't remove magnet torrents that don't have a torrent file yet
+        existingNames.removeAll(_magnets);
         // now lets see which ones have been removed...
         for (Iterator iter = existingNames.iterator(); iter.hasNext(); ) {
             String name = (String)iter.next();
@@ -936,16 +1289,17 @@ public class SnarkManager implements Snark.CompleteListener {
        "Postman", "http://tracker2.postman.i2p/announce.php=http://tracker2.postman.i2p/"
        ,"Welterde", "http://tracker.welterde.i2p/a=http://tracker.welterde.i2p/stats?mode=top5"
 //       , "CRSTRACK", "http://b4G9sCdtfvccMAXh~SaZrPqVQNyGQbhbYMbw6supq2XGzbjU4NcOmjFI0vxQ8w1L05twmkOvg5QERcX6Mi8NQrWnR0stLExu2LucUXg1aYjnggxIR8TIOGygZVIMV3STKH4UQXD--wz0BUrqaLxPhrm2Eh9Hwc8TdB6Na4ShQUq5Xm8D4elzNUVdpM~RtChEyJWuQvoGAHY3ppX-EJJLkiSr1t77neS4Lc-KofMVmgI9a2tSSpNAagBiNI6Ak9L1T0F9uxeDfEG9bBSQPNMOSUbAoEcNxtt7xOW~cNOAyMyGydwPMnrQ5kIYPY8Pd3XudEko970vE0D6gO19yoBMJpKx6Dh50DGgybLQ9CpRaynh2zPULTHxm8rneOGRcQo8D3mE7FQ92m54~SvfjXjD2TwAVGI~ae~n9HDxt8uxOecAAvjjJ3TD4XM63Q9TmB38RmGNzNLDBQMEmJFpqQU8YeuhnS54IVdUoVQFqui5SfDeLXlSkh4vYoMU66pvBfWbAAAA.i2p/tracker/announce.php=http://crstrack.i2p/tracker/"
+       ,"Exotrack", "http://blbgywsjubw3d2zih2giokakhe3o2cko7jtte4risb3hohbcoyva.b32.i2p/announce.php=http://exotrack.i2p/"
     };
     
     /** comma delimited list of name=announceURL=baseURL for the trackers to be displayed */
     public static final String PROP_TRACKERS = "i2psnark.trackers";
-    private static Map trackerMap = null;
+    private static Map<String, String> trackerMap = null;
     /** sorted map of name to announceURL=baseURL */
-    public Map getTrackers() { 
+    public Map<String, String> getTrackers() { 
         if (trackerMap != null) // only do this once, can't be updated while running
             return trackerMap;
-        Map rv = new TreeMap();
+        Map<String, String> rv = new TreeMap();
         String trackers = _config.getProperty(PROP_TRACKERS);
         if ( (trackers == null) || (trackers.trim().length() <= 0) )
             trackers = _context.getProperty(PROP_TRACKERS);
@@ -984,7 +1338,7 @@ public class SnarkManager implements Snark.CompleteListener {
             Set names = listTorrentFiles();
             for (Iterator iter = names.iterator(); iter.hasNext(); ) {
                 Snark snark = getTorrent((String)iter.next());
-                if ( (snark != null) && (!snark.stopped) )
+                if ( (snark != null) && (!snark.isStopped()) )
                     snark.stopTorrent();
             }
         }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/StaticSnark.java b/apps/i2psnark/java/src/org/klomp/snark/StaticSnark.java
index 38b470a7c9cf61b07ac1eee30df59a4872721a76..52bef12b4719d7b3d05e1785cfb5bed00f2b5665 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/StaticSnark.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/StaticSnark.java
@@ -38,6 +38,7 @@ public class StaticSnark
     //Security.addProvider(gnu);
 
     // And finally call the normal starting point.
-    Snark.main(args);
+    //Snark.main(args);
+    System.err.println("unsupported");
   }
 }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java
index 17fae523525630ec0abcc345796893791028fcda..1183e9bf352aa19ccee9652b9ab3bde398da4f5a 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java
@@ -53,10 +53,10 @@ public class Storage
   private int needed; // Number of pieces needed
   private boolean _probablyComplete;  // use this to decide whether to open files RO
 
-  // XXX - Not always set correctly
-  int piece_size;
-  int pieces;
-  boolean changed;
+  private final int piece_size;
+  private final int pieces;
+  private final long total_length;
+  private boolean changed;
 
   /** The default piece size. */
   private static final int MIN_PIECE_SIZE = 256*1024;
@@ -81,12 +81,18 @@ public class Storage
     needed = metainfo.getPieces();
     _probablyComplete = false;
     bitfield = new BitField(needed);
+    piece_size = metainfo.getPieceLength(0);
+    pieces = needed;
+    total_length = metainfo.getTotalLength();
   }
 
   /**
    * Creates a storage from the existing file or directory together
    * with an appropriate MetaInfo file as can be announced on the
    * given announce String location.
+   *
+   * @param announce may be null
+   * @param listener may be null
    */
   public Storage(I2PSnarkUtil util, File baseFile, String announce, StorageListener listener)
     throws IOException
@@ -97,32 +103,35 @@ public class Storage
     getFiles(baseFile);
     
     long total = 0;
-    ArrayList lengthsList = new ArrayList();
+    ArrayList<Long> lengthsList = new ArrayList();
     for (int i = 0; i < lengths.length; i++)
       {
         long length = lengths[i];
         total += length;
-        lengthsList.add(new Long(length));
+        lengthsList.add(Long.valueOf(length));
       }
 
-    piece_size = MIN_PIECE_SIZE;
-    pieces = (int) ((total - 1)/piece_size) + 1;
-    while (pieces > MAX_PIECES && piece_size < MAX_PIECE_SIZE)
+    if (total <= 0)
+        throw new IOException("Torrent contains no data");
+
+    int pc_size = MIN_PIECE_SIZE;
+    int pcs = (int) ((total - 1)/pc_size) + 1;
+    while (pcs > MAX_PIECES && pc_size < MAX_PIECE_SIZE)
       {
-        piece_size = piece_size*2;
-        pieces = (int) ((total - 1)/piece_size) +1;
+        pc_size *= 2;
+        pcs = (int) ((total - 1)/pc_size) +1;
       }
+    piece_size = pc_size;
+    pieces = pcs;
+    total_length = total;
 
-    // Note that piece_hashes and the bitfield will be filled after
-    // the MetaInfo is created.
-    byte[] piece_hashes = new byte[20*pieces];
     bitfield = new BitField(pieces);
     needed = 0;
 
-    List files = new ArrayList();
+    List<List<String>> files = new ArrayList();
     for (int i = 0; i < names.length; i++)
       {
-        List file = new ArrayList();
+        List<String> file = new ArrayList();
         StringTokenizer st = new StringTokenizer(names[i], File.separator);
         while (st.hasMoreTokens())
           {
@@ -139,69 +148,26 @@ public class Storage
         lengthsList = null;
       }
 
-    // Note that the piece_hashes are not correctly setup yet.
+    byte[] piece_hashes = fast_digestCreate();
     metainfo = new MetaInfo(announce, baseFile.getName(), null, files,
                             lengthsList, piece_size, piece_hashes, total);
 
   }
 
-  // Creates piece hashes for a new storage.
-  // This does NOT create the files, just the hashes
-  public void create() throws IOException
-  {
-//    if (true) {
-        fast_digestCreate();
-//    } else {
-//        orig_digestCreate();
-//    }
-  }
-  
-/*
-  private void orig_digestCreate() throws IOException {
-    // Calculate piece_hashes
-    MessageDigest digest = null;
-    try
-      {
-        digest = MessageDigest.getInstance("SHA");
-      }
-    catch(NoSuchAlgorithmException nsa)
-      {
-        throw new InternalError(nsa.toString());
-      }
-
-    byte[] piece_hashes = metainfo.getPieceHashes();
-
-    byte[] piece = new byte[piece_size];
-    for (int i = 0; i < pieces; i++)
-      {
-        int length = getUncheckedPiece(i, piece);
-        digest.update(piece, 0, length);
-        byte[] hash = digest.digest();
-        for (int j = 0; j < 20; j++)
-          piece_hashes[20 * i + j] = hash[j];
-
-        bitfield.set(i);
-
-        if (listener != null)
-          listener.storageChecked(this, i, true);
-      }
-
-    if (listener != null)
-      listener.storageAllChecked(this);
-
-    // Reannounce to force recalculating the info_hash.
-    metainfo = metainfo.reannounce(metainfo.getAnnounce());
-  }
-*/
-
-  /** FIXME we can run out of fd's doing this,
+  /**
+   * Creates piece hashes for a new storage.
+   * This does NOT create the files, just the hashes.
+   * Also sets all the bitfield bits.
+   *
+   *  FIXME we can run out of fd's doing this,
    *  maybe some sort of global close-RAF-right-away flag
-   *  would do the trick */
-  private void fast_digestCreate() throws IOException {
+   *  would do the trick
+   */
+  private byte[] fast_digestCreate() throws IOException {
     // Calculate piece_hashes
     SHA1 digest = new SHA1();
 
-    byte[] piece_hashes = metainfo.getPieceHashes();
+    byte[] piece_hashes = new byte[20 * pieces];
 
     byte[] piece = new byte[piece_size];
     for (int i = 0; i < pieces; i++)
@@ -209,14 +175,10 @@ public class Storage
         int length = getUncheckedPiece(i, piece);
         digest.update(piece, 0, length);
         byte[] hash = digest.digest();
-        for (int j = 0; j < 20; j++)
-          piece_hashes[20 * i + j] = hash[j];
-
+        System.arraycopy(hash, 0, piece_hashes, 20 * i, 20);
         bitfield.set(i);
       }
-
-    // Reannounce to force recalculating the info_hash.
-    metainfo = metainfo.reannounce(metainfo.getAnnounce());
+    return piece_hashes;
   }
 
   private void getFiles(File base) throws IOException
@@ -291,6 +253,14 @@ public class Storage
     return needed == 0;
   }
 
+  /**
+   *  Has the storage changed since instantiation?
+   *  @since 0.8.5
+   */
+  public boolean isChanged() {
+      return changed;
+  }
+
   /**
    *  @param file canonical path (non-directory)
    *  @return number of bytes remaining; -1 if unknown file
@@ -312,14 +282,13 @@ public class Storage
           if (f != null && canonical.equals(file)) {
               if (complete())
                   return 0;
-              int psz = metainfo.getPieceLength(0);
+              int psz = piece_size;
               long start = bytes;
               long end = start + lengths[i];
               int pc = (int) (bytes / psz);
               long rv = 0;
               if (!bitfield.get(pc))
                   rv = Math.min(psz - (start % psz), lengths[i]);
-              int pieces = metainfo.getPieces();
               for (int j = pc + 1; (((long)j) * psz) < end && j < pieces; j++) {
                   if (!bitfield.get(j)) {
                       if (((long)(j+1))*psz < end)
@@ -415,7 +384,7 @@ public class Storage
       int file = 0;
       long pcEnd = -1;
       long fileEnd = lengths[0] - 1;
-      int psz = metainfo.getPieceLength(0);
+      int psz = piece_size;
       for (int i = 0; i < rv.length; i++) {
           pcEnd += psz;
           int pri = priorities[file];
@@ -466,7 +435,7 @@ public class Storage
     File base = new SecureFile(rootDir, filterName(metainfo.getName()));
     boolean useSavedBitField = savedTime > 0 && savedBitField != null;
 
-    List files = metainfo.getFiles();
+    List<List<String>> files = metainfo.getFiles();
     if (files == null)
       {
         // Create base as file.
@@ -497,7 +466,7 @@ public class Storage
         if (!base.mkdir() && !base.isDirectory())
           throw new IOException("Could not create directory " + base);
 
-        List  ls = metainfo.getLengths();
+        List<Long> ls = metainfo.getLengths();
         int size = files.size();
         long total = 0;
         lengths = new long[size];
@@ -508,8 +477,28 @@ public class Storage
         RAFfile = new File[size];
         for (int i = 0; i < size; i++)
           {
-            File f = createFileFromNames(base, (List)files.get(i));
-            lengths[i] = ((Long)ls.get(i)).longValue();
+            List<String> path = files.get(i);
+            File f = createFileFromNames(base, path);
+            // dup file name check after filtering
+            for (int j = 0; j < i; j++) {
+                if (f.equals(RAFfile[j])) {
+                    // Rename and start the check over again
+                    // Copy path since metainfo list is unmodifiable
+                    path = new ArrayList(path);
+                    int last = path.size() - 1;
+                    String lastPath = path.get(last);
+                    int dot = lastPath.lastIndexOf('.');
+                    // foo.mp3 -> foo_.mp3; foo -> _foo
+                    if (dot >= 0)
+                        lastPath = lastPath.substring(0, dot) + '_' + lastPath.substring(dot);
+                    else
+                        lastPath = '_' + lastPath;
+                    path.set(last, lastPath);
+                    f = createFileFromNames(base, path);
+                    j = 0;
+                }
+            }
+            lengths[i] = ls.get(i).longValue();
             RAFlock[i] = new Object();
             RAFfile[i] = f;
             total += lengths[i];
@@ -535,7 +524,7 @@ public class Storage
     } else {
       // the following sets the needed variable
       changed = true;
-      checkCreateFiles();
+      checkCreateFiles(false);
     }
     if (complete()) {
         _util.debug("Torrent is complete", Snark.NOTICE);
@@ -548,36 +537,19 @@ public class Storage
   }
 
   /**
-   * Reopen the file descriptors for a restart
-   * Do existence check but no length check or data reverification
+   * Doesn't really reopen the file descriptors for a restart.
+   * Just does an existence check but no length check or data reverification
+   *
+   * @param rootDir ignored
+   * @throws IOE on fail
    */
   public void reopen(String rootDir) throws IOException
   {
-    File base = new File(rootDir, filterName(metainfo.getName()));
-
-    List files = metainfo.getFiles();
-    if (files == null)
-      {
-        // Reopen base as file.
-        _util.debug("Reopening file: " + base, Snark.NOTICE);
-        if (!base.exists())
-          throw new IOException("Could not reopen file " + base);
-      }
-    else
-      {
-        // Reopen base as dir.
-        _util.debug("Reopening directory: " + base, Snark.NOTICE);
-        if (!base.isDirectory())
-          throw new IOException("Could not reopen directory " + base);
-
-        int size = files.size();
-        for (int i = 0; i < size; i++)
-          {
-            File f = getFileFromNames(base, (List)files.get(i));
-            if (!f.exists())
-                throw new IOException("Could not reopen file " + f);
-          }
-
+      if (RAFfile == null)
+          throw new IOException("Storage not checked yet");
+      for (int i = 0; i < RAFfile.length; i++) {
+          if (!RAFfile[i].exists())
+              throw new IOException("File does not exist: " + RAFfile[i]);
       }
   }
 
@@ -590,7 +562,7 @@ public class Storage
    * Removes 'suspicious' characters from the given file name.
    * http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx
    */
-  private static String filterName(String name)
+  public static String filterName(String name)
   {
     if (name.equals(".") || name.equals(" "))
         return "_";
@@ -606,13 +578,18 @@ public class Storage
     return rv;
   }
 
-  private File createFileFromNames(File base, List names) throws IOException
+  /**
+   *  Note that filtering each path element individually may lead to
+   *  things going in the wrong place if there are duplicates
+   *  in intermediate path elements after filtering.
+   */
+  private static File createFileFromNames(File base, List<String> names) throws IOException
   {
     File f = null;
-    Iterator it = names.iterator();
+    Iterator<String> it = names.iterator();
     while (it.hasNext())
       {
-        String name = filterName((String)it.next());
+        String name = filterName(it.next());
         if (it.hasNext())
           {
             // Another dir in the hierarchy.
@@ -632,12 +609,12 @@ public class Storage
     return f;
   }
 
-  public static File getFileFromNames(File base, List names)
+  public static File getFileFromNames(File base, List<String> names)
   {
-    Iterator it = names.iterator();
+    Iterator<String> it = names.iterator();
     while (it.hasNext())
       {
-        String name = filterName((String)it.next());
+        String name = filterName(it.next());
         base = new File(base, name);
       }
     return base;
@@ -646,15 +623,26 @@ public class Storage
   /**
    * This is called at the beginning, and at presumed completion,
    * so we have to be careful about locking.
+   *
+   * @param recheck if true, this is a check after we downloaded the
+   *        last piece, and we don't modify the global bitfield unless
+   *        the check fails.
    */
-  private void checkCreateFiles() throws IOException
+  private void checkCreateFiles(boolean recheck) throws IOException
   {
     // Whether we are resuming or not,
     // if any of the files already exists we assume we are resuming.
     boolean resume = false;
 
     _probablyComplete = true;
-    needed = metainfo.getPieces();
+    // use local variables during the check
+    int need = metainfo.getPieces();
+    BitField bfield;
+    if (recheck) {
+        bfield = new BitField(need);
+    } else {
+        bfield = bitfield;
+    }
 
     // Make sure all files are available and of correct length
     for (int i = 0; i < rafs.length; i++)
@@ -676,7 +664,10 @@ public class Storage
               } catch (IOException ioe) {}
           }
         } else {
-          _util.debug("File '" + names[i] + "' exists, but has wrong length - repairing corruption", Snark.ERROR);
+          String msg = "File '" + names[i] + "' exists, but has wrong length (expected " +
+                       lengths[i] + " but found " + length + ") - repairing corruption";
+          SnarkManager.instance().addMessage(msg);
+          _util.debug(msg, Snark.ERROR);
           changed = true;
           _probablyComplete = false; // to force RW
           synchronized(RAFlock[i]) {
@@ -692,8 +683,7 @@ public class Storage
     // Check which pieces match and which don't
     if (resume)
       {
-        pieces = metainfo.getPieces();
-        byte[] piece = new byte[metainfo.getPieceLength(0)];
+        byte[] piece = new byte[piece_size];
         int file = 0;
         long fileEnd = lengths[0];
         long pieceEnd = 0;
@@ -715,8 +705,8 @@ public class Storage
             }
             if (correctHash)
               {
-                bitfield.set(i);
-                needed--;
+                bfield.set(i);
+                need--;
               }
 
             if (listener != null)
@@ -736,6 +726,15 @@ public class Storage
     //  }
     //}
 
+    // do this here so we don't confuse the user during checking
+    needed = need;
+    if (recheck && need > 0) {
+        // whoops, recheck failed
+        synchronized(bitfield) {
+            bitfield = bfield;
+        }
+    }
+
     if (listener != null) {
       listener.storageAllChecked(this);
       if (needed <= 0)
@@ -750,8 +749,9 @@ public class Storage
     openRAF(nr, false);  // RW
     // XXX - Is this the best way to make sure we have enough space for
     // the whole file?
-    listener.storageCreateFile(this, names[nr], lengths[nr]);
-    final int ZEROBLOCKSIZE = metainfo.getPieceLength(0);
+    if (listener != null)
+        listener.storageCreateFile(this, names[nr], lengths[nr]);
+    final int ZEROBLOCKSIZE = piece_size;
     byte[] zeros;
     try {
         zeros = new byte[ZEROBLOCKSIZE];
@@ -844,7 +844,7 @@ public class Storage
       }
 
     // Early typecast, avoid possibly overflowing a temp integer
-    long start = (long) piece * (long) metainfo.getPieceLength(0);
+    long start = (long) piece * (long) piece_size;
     int i = 0;
     long raflen = lengths[i];
     while (start > raflen)
@@ -899,11 +899,7 @@ public class Storage
       // checkCreateFiles() which will set 'needed' and 'bitfield'
       // and also call listener.storageCompleted() if the double-check
       // was successful.
-      // Todo: set a listener variable so the web shows "checking" and don't
-      // have the user panic when completed amount goes to zero temporarily?
-      needed = metainfo.getPieces();
-      bitfield = new BitField(needed);
-      checkCreateFiles();
+      checkCreateFiles(true);
       if (needed > 0) {
         if (listener != null)
             listener.setWantedPieces(this);
@@ -915,10 +911,24 @@ public class Storage
     return true;
   }
 
+  /**
+   *  This is a dup of MetaInfo.getPieceLength() but we need it
+   *  before the MetaInfo is created in our second constructor.
+   *  @since 0.8.5
+   */
+  private int getPieceLength(int piece) {
+    if (piece >= 0 && piece < pieces -1)
+      return piece_size;
+    else if (piece == pieces -1)
+      return (int)(total_length - ((long)piece * piece_size));
+    else
+      throw new IndexOutOfBoundsException("no piece: " + piece);
+  }
+
   private int getUncheckedPiece(int piece, byte[] bs)
     throws IOException
   {
-      return getUncheckedPiece(piece, bs, 0, metainfo.getPieceLength(piece));
+      return getUncheckedPiece(piece, bs, 0, getPieceLength(piece));
   }
 
   private int getUncheckedPiece(int piece, byte[] bs, int off, int length)
@@ -927,7 +937,7 @@ public class Storage
     // XXX - copy/paste code from putPiece().
 
     // Early typecast, avoid possibly overflowing a temp integer
-    long start = ((long) piece * (long) metainfo.getPieceLength(0)) + off;
+    long start = ((long) piece * (long) piece_size) + off;
 
     int i = 0;
     long raflen = lengths[i];
diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
index 89815035b4e6d1a4fa15cd9f7e8098d6877c93d2..85a39f748d8657d2f3313af3ac8b305f914fb8a1 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
@@ -34,9 +34,12 @@ import java.util.Random;
 import java.util.Set;
 
 import net.i2p.I2PAppContext;
+import net.i2p.data.Hash;
 import net.i2p.util.I2PAppThread;
 import net.i2p.util.Log;
 
+import org.klomp.snark.dht.DHT;
+
 /**
  * Informs metainfo tracker of events and gets new peers for peer
  * coordinator.
@@ -62,7 +65,9 @@ public class TrackerClient extends I2PAppThread
 
   private I2PSnarkUtil _util;
   private final MetaInfo meta;
+  private final String additionalTrackerURL;
   private final PeerCoordinator coordinator;
+  private final Snark snark;
   private final int port;
 
   private boolean stop;
@@ -70,20 +75,24 @@ public class TrackerClient extends I2PAppThread
 
   private List trackers;
 
-  public TrackerClient(I2PSnarkUtil util, MetaInfo meta, PeerCoordinator coordinator)
+  /**
+   * @param meta null if in magnet mode
+   * @param additionalTrackerURL may be null, from the ?tr= param in magnet mode, otherwise ignored
+   */
+  public TrackerClient(I2PSnarkUtil util, MetaInfo meta, String additionalTrackerURL,
+                       PeerCoordinator coordinator, Snark snark)
   {
     super();
     // Set unique name.
-    String id = urlencode(coordinator.getID());
+    String id = urlencode(snark.getID());
     setName("TrackerClient " + id.substring(id.length() - 12));
     _util = util;
     this.meta = meta;
+    this.additionalTrackerURL = additionalTrackerURL;
     this.coordinator = coordinator;
+    this.snark = snark;
 
     this.port = 6881; //(port == -1) ? 9 : port;
-
-    stop = false;
-    started = false;
   }
 
     @Override
@@ -118,11 +127,10 @@ public class TrackerClient extends I2PAppThread
     @Override
   public void run()
   {
-    String infoHash = urlencode(meta.getInfoHash());
-    String peerID = urlencode(coordinator.getID());
+    String infoHash = urlencode(snark.getInfoHash());
+    String peerID = urlencode(snark.getID());
+
 
-    _log.debug("Announce: [" + meta.getAnnounce() + "] infoHash: " + infoHash);
-    
     // Construct the list of trackers for this torrent,
     // starting with the primary one listed in the metainfo,
     // followed by the secondary open trackers
@@ -130,11 +138,21 @@ public class TrackerClient extends I2PAppThread
     // the primary tracker, that we don't add it twice.
     // todo: check for b32 matches as well
     trackers = new ArrayList(2);
-    String primary = meta.getAnnounce();
-    if (isValidAnnounce(primary)) {
-        trackers.add(new Tracker(meta.getAnnounce(), true));
+    String primary = null;
+    if (meta != null)
+        primary = meta.getAnnounce();
+    else if (additionalTrackerURL != null)
+        primary = additionalTrackerURL;
+    if (primary != null) {
+        if (isValidAnnounce(primary)) {
+            trackers.add(new Tracker(primary, true));
+            _log.debug("Announce: [" + primary + "] infoHash: " + infoHash);
+        } else {
+            _log.warn("Skipping invalid or non-i2p announce: " + primary);
+        }
     } else {
-        _log.warn("Skipping invalid or non-i2p announce: " + primary);
+        _log.warn("No primary announce");
+        primary = "";
     }
     List tlist = _util.getOpenTrackers();
     if (tlist != null) {
@@ -160,15 +178,19 @@ public class TrackerClient extends I2PAppThread
                 continue;
              if (primary.startsWith("http://i2p/" + dest))
                 continue;
-             trackers.add(new Tracker(url, false));
+             // opentrackers are primary if we don't have primary
+             trackers.add(new Tracker(url, primary.equals("")));
              _log.debug("Additional announce: [" + url + "] for infoHash: " + infoHash);
         }
     }
 
-    if (tlist.isEmpty()) {
-        // FIXME really need to get this message to the gui
+    if (trackers.isEmpty()) {
         stop = true;
-        _log.error("No valid trackers for infoHash: " + infoHash);
+        // FIXME translate
+        SnarkManager.instance().addMessage("No valid trackers for " + this.snark.getBaseName() + " - enable opentrackers?");
+        _log.error("No valid trackers for " + this.snark.getBaseName());
+        // FIXME keep going if DHT enabled
+        this.snark.stopTorrent();
         return;
     }
 
@@ -188,6 +210,9 @@ public class TrackerClient extends I2PAppThread
         Random r = I2PAppContext.getGlobalContext().random();
         while(!stop)
           {
+            // Local DHT tracker announce
+            if (_util.getDHT() != null)
+                _util.getDHT().announce(snark.getInfoHash());
             try
               {
                 // Sleep some minutes...
@@ -200,7 +225,7 @@ public class TrackerClient extends I2PAppThread
                   firstTime = false;
                 } else if (completed && runStarted)
                   delay = 3*SLEEP*60*1000 + random;
-                else if (coordinator.trackerProblems != null && ++consecutiveFails < MAX_CONSEC_FAILS)
+                else if (snark.getTrackerProblems() != null && ++consecutiveFails < MAX_CONSEC_FAILS)
                   delay = INITIAL_SLEEP;
                 else
                   // sleep a while, when we wake up we will contact only the trackers whose intervals have passed
@@ -221,7 +246,7 @@ public class TrackerClient extends I2PAppThread
             
             uploaded = coordinator.getUploaded();
             downloaded = coordinator.getDownloaded();
-            left = coordinator.getLeft();
+            left = coordinator.getLeft();   // -1 in magnet mode
             
             // First time we got a complete download?
             String event;
@@ -251,7 +276,7 @@ public class TrackerClient extends I2PAppThread
                                                  uploaded, downloaded, left,
                                                  event);
 
-                    coordinator.trackerProblems = null;
+                    snark.setTrackerProblems(null);
                     tr.trackerProblems = null;
                     tr.registerFails = 0;
                     tr.consecutiveFails = 0;
@@ -260,24 +285,30 @@ public class TrackerClient extends I2PAppThread
                     runStarted = true;
                     tr.started = true;
 
-                    Set peers = info.getPeers();
+                    Set<Peer> peers = info.getPeers();
                     tr.seenPeers = info.getPeerCount();
-                    if (coordinator.trackerSeenPeers < tr.seenPeers) // update rising number quickly
-                        coordinator.trackerSeenPeers = tr.seenPeers;
-                    if ( (left > 0) && (!completed) ) {
+                    if (snark.getTrackerSeenPeers() < tr.seenPeers) // update rising number quickly
+                        snark.setTrackerSeenPeers(tr.seenPeers);
+
+                    // pass everybody over to our tracker
+                    if (_util.getDHT() != null) {
+                        for (Peer peer : peers) {
+                            _util.getDHT().announce(snark.getInfoHash(), peer.getPeerID().getDestHash());
+                        }
+                    }
+
+                    if ( (left != 0) && (!completed) ) {
                         // we only want to talk to new people if we need things
                         // from them (duh)
-                        List ordered = new ArrayList(peers);
+                        List<Peer> ordered = new ArrayList(peers);
                         Collections.shuffle(ordered, r);
-                        Iterator it = ordered.iterator();
+                        Iterator<Peer> it = ordered.iterator();
                         while ((!stop) && it.hasNext()) {
-                          Peer cur = (Peer)it.next();
+                          Peer cur = it.next();
                           // FIXME if id == us || dest == us continue;
                           // only delay if we actually make an attempt to add peer
-                          if(coordinator.addPeer(cur)) {
-                            int delay = DELAY_MUL;
-                            delay *= r.nextInt(10);
-                            delay += DELAY_MIN;
+                          if(coordinator.addPeer(cur) && it.hasNext()) {
+                            int delay = (DELAY_MUL * r.nextInt(10)) + DELAY_MIN;
                             sleptTime += delay;
                             try { Thread.sleep(delay); } catch (InterruptedException ie) {}
                           }
@@ -293,12 +324,12 @@ public class TrackerClient extends I2PAppThread
                     tr.trackerProblems = ioe.getMessage();
                     // don't show secondary tracker problems to the user
                     if (tr.isPrimary)
-                      coordinator.trackerProblems = tr.trackerProblems;
+                      snark.setTrackerProblems(tr.trackerProblems);
                     if (tr.trackerProblems.toLowerCase().startsWith(NOT_REGISTERED)) {
                       // Give a guy some time to register it if using opentrackers too
                       if (trackers.size() == 1) {
                         stop = true;
-                        coordinator.snark.stopTorrent();
+                        snark.stopTorrent();
                       } else { // hopefully each on the opentrackers list is really open
                         if (tr.registerFails++ > MAX_REGISTER_FAILS)
                           tr.stop = true;
@@ -315,8 +346,66 @@ public class TrackerClient extends I2PAppThread
                   maxSeenPeers = tr.seenPeers;
             }  // *** end of trackers loop here
 
+            // Get peers from PEX
+            if (left > 0 && coordinator.needPeers() && !stop) {
+                Set<PeerID> pids = coordinator.getPEXPeers();
+                if (!pids.isEmpty()) {
+                    _util.debug("Got " + pids.size() + " from PEX", Snark.INFO);
+                    List<Peer> peers = new ArrayList(pids.size());
+                    for (PeerID pID : pids) {
+                        peers.add(new Peer(pID, snark.getID(), snark.getInfoHash(), snark.getMetaInfo()));
+                    }
+                    Collections.shuffle(peers, r);
+                    Iterator<Peer> it = peers.iterator();
+                    while ((!stop) && it.hasNext()) {
+                        Peer cur = it.next();
+                        if (coordinator.addPeer(cur) && it.hasNext()) {
+                            int delay = (DELAY_MUL * r.nextInt(10)) + DELAY_MIN;
+                            try { Thread.sleep(delay); } catch (InterruptedException ie) {}
+                         }
+                    }
+                }
+            }
+
+            // Get peers from DHT
+            // FIXME this needs to be in its own thread
+            if (_util.getDHT() != null && !stop) {
+                int numwant;
+                if (left == 0 || event.equals(STOPPED_EVENT) || !coordinator.needPeers())
+                    numwant = 1;
+                else
+                    numwant = _util.getMaxConnections();
+                List<Hash> hashes = _util.getDHT().getPeers(snark.getInfoHash(), numwant, 2*60*1000);
+                _util.debug("Got " + hashes + " from DHT", Snark.INFO);
+                // announce  ourselves while the token is still good
+                // FIXME this needs to be in its own thread
+                if (!stop) {
+                    int good = _util.getDHT().announce(snark.getInfoHash(), 8, 5*60*1000);
+                    _util.debug("Sent " + good + " good announces to DHT", Snark.INFO);
+                }
+
+                // now try these peers
+                if ((!stop) && !hashes.isEmpty()) {
+                    List<Peer> peers = new ArrayList(hashes.size());
+                    for (Hash h : hashes) {
+                        PeerID pID = new PeerID(h.getData());
+                        peers.add(new Peer(pID, snark.getID(), snark.getInfoHash(), snark.getMetaInfo()));
+                    }
+                    Collections.shuffle(peers, r);
+                    Iterator<Peer> it = peers.iterator();
+                    while ((!stop) && it.hasNext()) {
+                        Peer cur = it.next();
+                        if (coordinator.addPeer(cur) && it.hasNext()) {
+                            int delay = (DELAY_MUL * r.nextInt(10)) + DELAY_MIN;
+                            try { Thread.sleep(delay); } catch (InterruptedException ie) {}
+                         }
+                    }
+                }
+            }
+
+
             // we could try and total the unique peers but that's too hard for now
-            coordinator.trackerSeenPeers = maxSeenPeers;
+            snark.setTrackerSeenPeers(maxSeenPeers);
             if (!runStarted)
                 _util.debug("         Retrying in one minute...", Snark.DEBUG);
           } // *** end of while loop
@@ -329,6 +418,9 @@ public class TrackerClient extends I2PAppThread
       }
     finally
       {
+        // Local DHT tracker unannounce
+        if (_util.getDHT() != null)
+            _util.getDHT().unannounce(snark.getInfoHash());
         try
           {
             // try to contact everybody we can
@@ -351,6 +443,8 @@ public class TrackerClient extends I2PAppThread
                                 long downloaded, long left, String event)
     throws IOException
   {
+    // What do we send for left in magnet mode? Can we omit it?
+    long tleft = left >= 0 ? left : 1;
     String s = tr.announce
       + "?info_hash=" + infoHash
       + "&peer_id=" + peerID
@@ -358,10 +452,10 @@ public class TrackerClient extends I2PAppThread
       + "&ip=" + _util.getOurIPString() + ".i2p"
       + "&uploaded=" + uploaded
       + "&downloaded=" + downloaded
-      + "&left=" + left
+      + "&left=" + tleft
       + "&compact=1"   // NOTE: opentracker will return 400 for &compact alone
       + ((! event.equals(NO_EVENT)) ? ("&event=" + event) : "");
-    if (left <= 0 || event.equals(STOPPED_EVENT) || !coordinator.needPeers())
+    if (left == 0 || event.equals(STOPPED_EVENT) || !coordinator.needPeers())
         s += "&numwant=0";
     else
         s += "&numwant=" + _util.getMaxConnections();
@@ -377,8 +471,8 @@ public class TrackerClient extends I2PAppThread
     try {
         in = new FileInputStream(fetched);
 
-        TrackerInfo info = new TrackerInfo(in, coordinator.getID(),
-                                           coordinator.getMetaInfo());
+        TrackerInfo info = new TrackerInfo(in, snark.getID(),
+                                           snark.getInfoHash(), snark.getMetaInfo());
         _util.debug("TrackerClient response: " + info, Snark.INFO);
 
         String failure = info.getFailureReason();
diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerInfo.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerInfo.java
index 360a4f47e416c3ed728523cfcfbd4e5a09ca9b55..1b829d0eef00d674fdbbf5225381014c931beb8d 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/TrackerInfo.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerInfo.java
@@ -46,19 +46,20 @@ public class TrackerInfo
   private int complete;
   private int incomplete;
 
-  public TrackerInfo(InputStream in, byte[] my_id, MetaInfo metainfo)
+  /** @param metainfo may be null */
+  public TrackerInfo(InputStream in, byte[] my_id, byte[] infohash, MetaInfo metainfo)
     throws IOException
   {
-    this(new BDecoder(in), my_id, metainfo);
+    this(new BDecoder(in), my_id, infohash, metainfo);
   }
 
-  public TrackerInfo(BDecoder be, byte[] my_id, MetaInfo metainfo)
+  private TrackerInfo(BDecoder be, byte[] my_id, byte[] infohash, MetaInfo metainfo)
     throws IOException
   {
-    this(be.bdecodeMap().getMap(), my_id, metainfo);
+    this(be.bdecodeMap().getMap(), my_id, infohash, metainfo);
   }
 
-  public TrackerInfo(Map m, byte[] my_id, MetaInfo metainfo)
+  private TrackerInfo(Map m, byte[] my_id, byte[] infohash, MetaInfo metainfo)
     throws IOException
   {
     BEValue reason = (BEValue)m.get("failure reason");
@@ -84,10 +85,10 @@ public class TrackerInfo
             Set<Peer> p;
             try {
               // One big string (the official compact format)
-              p = getPeers(bePeers.getBytes(), my_id, metainfo);
+              p = getPeers(bePeers.getBytes(), my_id, infohash, metainfo);
             } catch (InvalidBEncodingException ibe) {
               // List of Dictionaries or List of Strings
-              p = getPeers(bePeers.getList(), my_id, metainfo);
+              p = getPeers(bePeers.getList(), my_id, infohash, metainfo);
             }
             peers = p;
         }
@@ -123,7 +124,7 @@ public class TrackerInfo
 ******/
 
   /** List of Dictionaries or List of Strings */
-  private static Set<Peer> getPeers(List<BEValue> l, byte[] my_id, MetaInfo metainfo)
+  private static Set<Peer> getPeers(List<BEValue> l, byte[] my_id, byte[] infohash, MetaInfo metainfo)
     throws IOException
   {
     Set<Peer> peers = new HashSet(l.size());
@@ -144,7 +145,7 @@ public class TrackerInfo
                 continue;
             }
         }
-        peers.add(new Peer(peerID, my_id, metainfo));
+        peers.add(new Peer(peerID, my_id, infohash, metainfo));
       }
 
     return peers;
@@ -156,7 +157,7 @@ public class TrackerInfo
    *  One big string of concatenated 32-byte hashes
    *  @since 0.8.1
    */
-  private static Set<Peer> getPeers(byte[] l, byte[] my_id, MetaInfo metainfo)
+  private static Set<Peer> getPeers(byte[] l, byte[] my_id, byte[] infohash, MetaInfo metainfo)
     throws IOException
   {
     int count = l.length / HASH_LENGTH;
@@ -172,7 +173,7 @@ public class TrackerInfo
             // won't happen
             continue;
         }
-        peers.add(new Peer(peerID, my_id, metainfo));
+        peers.add(new Peer(peerID, my_id, infohash, metainfo));
       }
 
     return peers;
diff --git a/apps/i2psnark/java/src/org/klomp/snark/bencode/BDecoder.java b/apps/i2psnark/java/src/org/klomp/snark/bencode/BDecoder.java
index 4c59bcb93b2270f1f2dc6e130d3b238d8b01f7ef..4f394d01e565073eeee0c229921419cef1884199 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/bencode/BDecoder.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/bencode/BDecoder.java
@@ -60,22 +60,30 @@ public class BDecoder
   private int indicator = 0;
 
   // Used for ugly hack to get SHA hash over the metainfo info map
-  private String special_map = "info";
+  private final String special_map = "info";
   private boolean in_special_map = false;
-  private final MessageDigest sha_digest;
+  /** creation deferred until we encounter the special map, to make processing of announce replies more efficient */
+  private MessageDigest sha_digest;
 
-  // Ugly hack. Return the SHA has over bytes that make up the special map.
+  /**
+   * Ugly hack. Return the SHA has over bytes that make up the special map.
+   * @return null if there was no special map
+   */
   public byte[] get_special_map_digest()
   {
+    if (sha_digest == null)
+        return null;
     byte[] result = sha_digest.digest();
     return result;
   }
 
+/****
   // Ugly hack. Name defaults to "info".
   public void set_special_map_name(String name)
   {
     special_map = name;
   }
+****/
 
   /**
    * Initalizes a new BDecoder. Nothing is read from the given
@@ -84,15 +92,6 @@ public class BDecoder
   public BDecoder(InputStream in)
   {
     this.in = in;
-    // XXX - Used for ugly hack.
-    try
-      {
-        sha_digest = MessageDigest.getInstance("SHA");
-      }
-    catch(NoSuchAlgorithmException nsa)
-      {
-        throw new InternalError(nsa.toString());
-      }
   }
 
   /**
@@ -112,6 +111,24 @@ public class BDecoder
     return new BDecoder(in).bdecode();
   }
 
+  /**
+   *  Used for SHA1 hack
+   *  @since 0.8.5
+   */
+  private void createDigest() {
+      if (sha_digest == null) {
+          try {
+              sha_digest = MessageDigest.getInstance("SHA");
+          } catch(NoSuchAlgorithmException nsa) {
+              throw new InternalError(nsa.toString());
+          }
+      } else {
+          // there are two info maps, but not one inside the other,
+          // the resulting hash will be incorrect
+          // throw something? - no, the check in the MetaInfo constructor will catch it.
+      }
+  }
+
   /**
    * Returns what the next bencoded object will be on the stream or -1
    * when the end of stream has been reached. Can return something
@@ -294,9 +311,13 @@ public class BDecoder
         String key = bdecode().getString();
 
         // XXX ugly hack
-        boolean special = special_map.equals(key);
-        if (special)
+        // This will not screw up if an info map contains an info map,
+        // but it will if there are two info maps (not one inside the other)
+        boolean special = (!in_special_map) && special_map.equals(key);
+        if (special) {
+          createDigest();
           in_special_map = true;
+        }
 
         BEValue value = bdecode();
         result.put(key, value);
diff --git a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java
index 986e456437a7e57770e442d207f12b3377019c13..4cae2881ae6c7d70a5e809c7187348b2d6484cd8 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java
@@ -24,6 +24,8 @@ import java.io.UnsupportedEncodingException;
 import java.util.List;
 import java.util.Map;
 
+import net.i2p.data.Base64;
+
 /**
  * Holds different types that a bencoded byte array can represent.
  * You need to call the correct get method to get the correct java
@@ -178,12 +180,37 @@ public class BEValue
     String valueString;
     if (value instanceof byte[])
       {
+        // try to do a nice job for debugging
         byte[] bs = (byte[])value;
-        // XXX - Stupid heuristic... and not UTF-8
-        if (bs.length <= 12)
-          valueString = new String(bs);
-        else
-          valueString = "bytes:" + bs.length;
+        if (bs.length == 0)
+          valueString =  "0 bytes";
+        else if (bs.length <= 32) {
+          StringBuilder buf = new StringBuilder(32);
+          boolean bin = false;
+          for (int i = 0; i < bs.length; i++) {
+              int b = bs[i] & 0xff;
+              // no UTF-8
+              if (b < ' ' || b > 0x7e) {
+                  bin = true;
+                  break;
+              }
+          }
+          if (bin && bs.length <= 8) {
+              buf.append(bs.length).append(" bytes: 0x");
+              for (int i = 0; i < bs.length; i++) {
+                  int b = bs[i] & 0xff;
+                  if (b < 16)
+                      buf.append('0');
+                  buf.append(Integer.toHexString(b));
+              }
+          } else if (bin) {
+              buf.append(bs.length).append(" bytes: ").append(Base64.encode(bs));
+          } else {
+              buf.append('"').append(new String(bs)).append('"');
+          }
+          valueString = buf.toString();
+        } else
+          valueString =  bs.length + " bytes";
       }
     else
       valueString = value.toString();
diff --git a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java
index b8129f47722de6595fd470b162a4ad155af726a2..9584b0d9db322e8fa1276be415cc190e46bee4a3 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java
@@ -50,6 +50,8 @@ public class BEncoder
   public static void bencode(Object o, OutputStream out)
     throws IOException, IllegalArgumentException
   {
+    if (o == null)
+      throw new NullPointerException("Cannot bencode null");
     if (o instanceof String)
       bencode((String)o, out);
     else if (o instanceof byte[])
@@ -59,7 +61,7 @@ public class BEncoder
     else if (o instanceof List)
       bencode((List)o, out);
     else if (o instanceof Map)
-      bencode((Map)o, out);
+      bencode((Map<String, Object>)o, out);
     else if (o instanceof BEValue)
       bencode(((BEValue)o).getValue(), out);
     else
@@ -153,7 +155,7 @@ public class BEncoder
     out.write(bs);
   }
 
-  public static byte[] bencode(Map m)
+  public static byte[] bencode(Map<String, Object> m)
   {
     try
       {
@@ -167,20 +169,20 @@ public class BEncoder
       }
   }
 
-  public static void bencode(Map m, OutputStream out) throws IOException
+  public static void bencode(Map<String, Object> m, OutputStream out) throws IOException
   {
     out.write('d');
 
     // Keys must be sorted. XXX - But is this the correct order?
-    Set s = m.keySet();
-    List l = new ArrayList(s);
+    Set<String> s = m.keySet();
+    List<String> l = new ArrayList(s);
     Collections.sort(l);
 
-    Iterator it = l.iterator();
+    Iterator<String> it = l.iterator();
     while(it.hasNext())
       {
         // Keys must be Strings.
-        String key = (String)it.next();
+        String key = it.next();
         Object value = m.get(key);
         bencode(key, out);
         bencode(value, out);
diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/DHT.java b/apps/i2psnark/java/src/org/klomp/snark/dht/DHT.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a16e4e605d255d9946068e8d994d64f6b924104
--- /dev/null
+++ b/apps/i2psnark/java/src/org/klomp/snark/dht/DHT.java
@@ -0,0 +1,82 @@
+package org.klomp.snark.dht;
+
+/*
+ *  GPLv2
+ */
+
+import java.util.List;
+
+import net.i2p.data.Destination;
+import net.i2p.data.Hash;
+
+
+/**
+ * Stub for KRPC
+ */
+public interface DHT {
+
+
+    /**
+     *  @return The UDP port that should be included in a PORT message.
+     */
+    public int getPort();
+
+    /**
+     *  Ping. We don't have a NID yet so the node is presumed
+     *  to be absent from our DHT.
+     *  Non-blocking, does not wait for pong.
+     *  If and when the pong is received the node will be inserted in our DHT.
+     */
+    public void ping(Destination dest, int port);
+
+    /**
+     *  Get peers for a torrent.
+     *  Blocking!
+     *  Caller should run in a thread.
+     *
+     *  @param ih the Info Hash (torrent)
+     *  @param max maximum number of peers to return
+     *  @param maxWait the maximum time to wait (ms) must be > 0
+     *  @return list or empty list (never null)
+     */
+    public List<Hash> getPeers(byte[] ih, int max, long maxWait);
+
+    /**
+     *  Announce to ourselves.
+     *  Non-blocking.
+     *
+     *  @param ih the Info Hash (torrent)
+     */
+    public void announce(byte[] ih);
+
+    /**
+     *  Announce somebody else we know about.
+     *  Non-blocking.
+     *
+     *  @param ih the Info Hash (torrent)
+     *  @param peerHash the peer's Hash
+     */
+    public void announce(byte[] ih, byte[] peerHash);
+
+    /**
+     *  Remove reference to ourselves in the local tracker.
+     *  Use when shutting down the torrent locally.
+     *  Non-blocking.
+     *
+     *  @param ih the Info Hash (torrent)
+     */
+    public void unannounce(byte[] ih);
+
+    /**
+     *  Announce to the closest DHT peers.
+     *  Blocking unless maxWait <= 0
+     *  Caller should run in a thread.
+     *  This also automatically announces ourself to our local tracker.
+     *  For best results do a getPeers() first so we have tokens.
+     *
+     *  @param ih the Info Hash (torrent)
+     *  @param maxWait the maximum total time to wait (ms) or 0 to do all in parallel and return immediately.
+     *  @return the number of successful announces, not counting ourselves.
+     */
+    public int announce(byte[] ih, int max, long maxWait);
+}
diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
index cfe95df13b7e91b1fb457414a63eab796e31812e..369fd3d2bab5313000d9d0fe8951e542e9e287ed 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -6,6 +6,7 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.text.Collator;
+import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -26,6 +27,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import net.i2p.I2PAppContext;
+import net.i2p.data.Base32;
 import net.i2p.data.Base64;
 import net.i2p.data.DataHelper;
 import net.i2p.util.FileUtil;
@@ -33,6 +35,7 @@ import net.i2p.util.I2PAppThread;
 import net.i2p.util.Log;
 import net.i2p.util.SecureFileOutputStream;
 
+import org.klomp.snark.I2PSnarkUtil;
 import org.klomp.snark.MetaInfo;
 import org.klomp.snark.Peer;
 import org.klomp.snark.Snark;
@@ -58,8 +61,14 @@ public class I2PSnarkServlet extends Default {
     private Resource _resourceBase;
     private String _themePath;
     private String _imgPath;
+    private String _lastAnnounceURL = "";
     
     public static final String PROP_CONFIG_FILE = "i2psnark.configFile";
+    /** BEP 9 */
+    private static final String MAGNET = "magnet:";
+    private static final String MAGNET_FULL = MAGNET + "?xt=urn:btih:";
+    /** http://sponge.i2p/files/maggotspec.txt */
+    private static final String MAGGOT = "maggot://";
  
     @Override
     public void init(ServletConfig cfg) throws ServletException {
@@ -153,7 +162,7 @@ public class I2PSnarkServlet extends Default {
                 resp.setCharacterEncoding("UTF-8");
                 resp.setContentType("text/html; charset=UTF-8");
                 Resource resource = getResource(pathInContext);
-                if (resource == null || (!resource.exists()) || !resource.isDirectory()) {
+                if (resource == null || (!resource.exists())) {
                     resp.sendError(HttpResponse.__404_Not_Found);
                 } else {
                     String base = URI.addPaths(req.getRequestURI(), "/");
@@ -339,11 +348,13 @@ public class I2PSnarkServlet extends Default {
         out.write("</th>\n<th align=\"center\">");
 
         // Opera and text-mode browsers: no &thinsp; and no input type=image values submitted
+        // Using a unique name fixes Opera, except for the buttons with js confirms, see below
         String ua = req.getHeader("User-Agent");
-        boolean isDegraded = ua != null && (ua.startsWith("Lynx") ||
-                                            ua.startsWith("ELinks") || ua.startsWith("Dillo"));
+        boolean isDegraded = ua != null && (ua.startsWith("Lynx") || ua.startsWith("w3m") ||
+                                            ua.startsWith("ELinks") || ua.startsWith("Links") ||
+                                            ua.startsWith("Dillo"));
 
-        boolean noThinsp = isDegraded || ua.startsWith("Opera");
+        boolean noThinsp = isDegraded || (ua != null && ua.startsWith("Opera"));
         if (_manager.util().connected()) {
             if (isDegraded)
                 out.write("<a href=\"/i2psnark/?action=StopAll&amp;nonce=" + _nonce + "\"><img title=\"");
@@ -376,7 +387,7 @@ public class I2PSnarkServlet extends Default {
         for (int i = 0; i < snarks.size(); i++) {
             Snark snark = (Snark)snarks.get(i);
             boolean showDebug = "2".equals(peerParam);
-            boolean showPeers = showDebug || "1".equals(peerParam) || Base64.encode(snark.meta.getInfoHash()).equals(peerParam);
+            boolean showPeers = showDebug || "1".equals(peerParam) || Base64.encode(snark.getInfoHash()).equals(peerParam);
             displaySnark(out, snark, uri, i, stats, showPeers, isDegraded, noThinsp, showDebug);
         }
 
@@ -478,10 +489,12 @@ public class I2PSnarkServlet extends Default {
             if (newURL != null) {
                 if (newURL.startsWith("http://")) {
                     _manager.addMessage(_("Fetching {0}", urlify(newURL)));
-                    I2PAppThread fetch = new I2PAppThread(new FetchAndAdd(_manager, newURL), "Fetch and add");
+                    I2PAppThread fetch = new I2PAppThread(new FetchAndAdd(_manager, newURL), "Fetch and add", true);
                     fetch.start();
+                } else if (newURL.startsWith(MAGNET) || newURL.startsWith(MAGGOT)) {
+                    addMagnet(newURL);
                 } else {
-                    _manager.addMessage(_("Invalid URL - must start with http://"));
+                    _manager.addMessage(_("Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"", MAGNET, MAGGOT));
                 }
             } else {
                 // no file or URL specified
@@ -494,8 +507,8 @@ public class I2PSnarkServlet extends Default {
                     for (Iterator iter = _manager.listTorrentFiles().iterator(); iter.hasNext(); ) {
                         String name = (String)iter.next();
                         Snark snark = _manager.getTorrent(name);
-                        if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) {
-                            _manager.stopTorrent(name, false);
+                        if ( (snark != null) && (DataHelper.eq(infoHash, snark.getInfoHash())) ) {
+                            _manager.stopTorrent(snark, false);
                             break;
                         }
                     }
@@ -508,11 +521,9 @@ public class I2PSnarkServlet extends Default {
                 if ( (infoHash != null) && (infoHash.length == 20) ) { // valid sha1
                     for (String name : _manager.listTorrentFiles()) {
                         Snark snark = _manager.getTorrent(name);
-                        if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) {
+                        if ( (snark != null) && (DataHelper.eq(infoHash, snark.getInfoHash())) ) {
                             snark.startTorrent();
-                            if (snark.storage != null)
-                                name = snark.storage.getBaseName();
-                            _manager.addMessage(_("Starting up torrent {0}", name));
+                            _manager.addMessage(_("Starting up torrent {0}", snark.getBaseName()));
                             break;
                         }
                     }
@@ -526,8 +537,15 @@ public class I2PSnarkServlet extends Default {
                     for (Iterator iter = _manager.listTorrentFiles().iterator(); iter.hasNext(); ) {
                         String name = (String)iter.next();
                         Snark snark = _manager.getTorrent(name);
-                        if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) {
-                            _manager.stopTorrent(name, true);
+                        if ( (snark != null) && (DataHelper.eq(infoHash, snark.getInfoHash())) ) {
+                            MetaInfo meta = snark.getMetaInfo();
+                            if (meta == null) {
+                                // magnet - remove and delete are the same thing
+                                _manager.deleteMagnet(snark);
+                                _manager.addMessage(_("Magnet deleted: {0}", name));
+                                return;
+                            }
+                            _manager.stopTorrent(snark, true);
                             // should we delete the torrent file?
                             // yeah, need to, otherwise it'll get autoadded again (at the moment
                             File f = new File(name);
@@ -546,13 +564,20 @@ public class I2PSnarkServlet extends Default {
                     for (Iterator iter = _manager.listTorrentFiles().iterator(); iter.hasNext(); ) {
                         String name = (String)iter.next();
                         Snark snark = _manager.getTorrent(name);
-                        if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) {
-                            _manager.stopTorrent(name, true);
+                        if ( (snark != null) && (DataHelper.eq(infoHash, snark.getInfoHash())) ) {
+                            MetaInfo meta = snark.getMetaInfo();
+                            if (meta == null) {
+                                // magnet - remove and delete are the same thing
+                                _manager.deleteMagnet(snark);
+                                _manager.addMessage(_("Magnet deleted: {0}", name));
+                                return;
+                            }
+                            _manager.stopTorrent(snark, true);
                             File f = new File(name);
                             f.delete();
                             _manager.addMessage(_("Torrent file deleted: {0}", f.getAbsolutePath()));
-                            List files = snark.meta.getFiles();
-                            String dataFile = snark.meta.getName();
+                            List files = meta.getFiles();
+                            String dataFile = snark.getBaseName();
                             f = new File(_manager.getDataDir(), dataFile);
                             if (files == null) { // single file torrent
                                 if (f.delete())
@@ -612,23 +637,22 @@ public class I2PSnarkServlet extends Default {
                 if (announceURL == null || announceURL.length() <= 0)
                     _manager.addMessage(_("Error creating torrent - you must select a tracker"));
                 else if (baseFile.exists()) {
+                    _lastAnnounceURL = announceURL;
+                    if (announceURL.equals("none"))
+                        announceURL = null;
                     try {
+                        // This may take a long time to check the storage, but since it already exists,
+                        // it shouldn't be THAT bad, so keep it in this thread.
                         Storage s = new Storage(_manager.util(), baseFile, announceURL, null);
-                        s.create();
                         s.close(); // close the files... maybe need a way to pass this Storage to addTorrent rather than starting over
                         MetaInfo info = s.getMetaInfo();
-                        File torrentFile = new File(baseFile.getParent(), baseFile.getName() + ".torrent");
-                        if (torrentFile.exists())
-                            throw new IOException("Cannot overwrite an existing .torrent file: " + torrentFile.getPath());
-                        _manager.saveTorrentStatus(info, s.getBitField(), null); // so addTorrent won't recheck
-                        // DirMonitor could grab this first, maybe hold _snarks lock?
-                        FileOutputStream out = new FileOutputStream(torrentFile);
-                        out.write(info.getTorrentData());
-                        out.close();
+                        File torrentFile = new File(_manager.getDataDir(), s.getBaseName() + ".torrent");
+                        // FIXME is the storage going to stay around thanks to the info reference?
+                        // now add it, but don't automatically start it
+                        _manager.addTorrent(info, s.getBitField(), torrentFile.getAbsolutePath(), true);
                         _manager.addMessage(_("Torrent created for \"{0}\"", baseFile.getName()) + ": " + torrentFile.getAbsolutePath());
-                        // now fire it up, but don't automatically seed it
-                        _manager.addTorrent(torrentFile.getCanonicalPath(), true);
-                        _manager.addMessage(_("Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"", baseFile.getName()));
+                        if (announceURL != null)
+                            _manager.addMessage(_("Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"", baseFile.getName()));
                     } catch (IOException ioe) {
                         _manager.addMessage(_("Error creating a torrent for \"{0}\"", baseFile.getAbsolutePath()) + ": " + ioe.getMessage());
                     }
@@ -643,8 +667,8 @@ public class I2PSnarkServlet extends Default {
             List snarks = getSortedSnarks(req);
             for (int i = 0; i < snarks.size(); i++) {
                 Snark snark = (Snark)snarks.get(i);
-                if (!snark.stopped)
-                    _manager.stopTorrent(snark.torrent, false);
+                if (!snark.isStopped())
+                    _manager.stopTorrent(snark, false);
             }
             if (_manager.util().connected()) {
                 // Give the stopped announces time to get out
@@ -657,7 +681,7 @@ public class I2PSnarkServlet extends Default {
             List snarks = getSortedSnarks(req);
             for (int i = 0; i < snarks.size(); i++) {
                 Snark snark = (Snark)snarks.get(i);
-                if (snark.stopped)
+                if (snark.isStopped())
                     snark.startTorrent();
             }
         } else {
@@ -725,7 +749,7 @@ public class I2PSnarkServlet extends Default {
     private static final int MAX_DISPLAYED_ERROR_LENGTH = 43;
     private void displaySnark(PrintWriter out, Snark snark, String uri, int row, long stats[], boolean showPeers,
                               boolean isDegraded, boolean noThinsp, boolean showDebug) throws IOException {
-        String filename = snark.torrent;
+        String filename = snark.getName();
         File f = new File(filename);
         filename = f.getName(); // the torrent may be the canonical name, so lets just grab the local name
         int i = filename.lastIndexOf(".torrent");
@@ -733,31 +757,28 @@ public class I2PSnarkServlet extends Default {
             filename = filename.substring(0, i);
         String fullFilename = filename;
         if (filename.length() > MAX_DISPLAYED_FILENAME_LENGTH) {
-            fullFilename = new String(filename);
-            filename = filename.substring(0, MAX_DISPLAYED_FILENAME_LENGTH) + "&hellip;";
+            String start = filename.substring(0, MAX_DISPLAYED_FILENAME_LENGTH);
+            if (start.indexOf(" ") < 0 && start.indexOf("-") < 0) {
+                // browser has nowhere to break it
+                fullFilename = filename;
+                filename = start + "&hellip;";
+            }
         }
-        long total = snark.meta.getTotalLength();
+        long total = snark.getTotalLength();
         // Early typecast, avoid possibly overflowing a temp integer
-        long remaining = (long) snark.storage.needed() * (long) snark.meta.getPieceLength(0); 
+        long remaining = (long) snark.getNeeded() * (long) snark.getPieceLength(0); 
         if (remaining > total)
             remaining = total;
-        long downBps = 0;
-        long upBps = 0;
-        if (snark.coordinator != null) {
-            downBps = snark.coordinator.getDownloadRate();
-            upBps = snark.coordinator.getUploadRate();
-        }
+        long downBps = snark.getDownloadRate();
+        long upBps = snark.getUploadRate();
         long remainingSeconds;
         if (downBps > 0)
             remainingSeconds = remaining / downBps;
         else
             remainingSeconds = -1;
-        boolean isRunning = !snark.stopped;
-        long uploaded = 0;
-        if (snark.coordinator != null) {
-            uploaded = snark.coordinator.getUploaded();
-            stats[0] += snark.coordinator.getDownloaded();
-        }
+        boolean isRunning = !snark.isStopped();
+        long uploaded = snark.getUploaded();
+        stats[0] += snark.getDownloaded();
         stats[1] += uploaded;
         if (isRunning) {
             stats[2] += downBps;
@@ -765,25 +786,22 @@ public class I2PSnarkServlet extends Default {
         }
         stats[5] += total;
         
-        boolean isValid = snark.meta != null;
-        boolean singleFile = snark.meta.getFiles() == null;
+        MetaInfo meta = snark.getMetaInfo();
+        // isValid means isNotMagnet
+        boolean isValid = meta != null;
+        boolean isMultiFile = isValid && meta.getFiles() != null;
         
-        String err = null;
-        int curPeers = 0;
-        int knownPeers = 0;
-        if (snark.coordinator != null) {
-            err = snark.coordinator.trackerProblems;
-            curPeers = snark.coordinator.getPeerCount();
-            stats[4] += curPeers;
-            knownPeers = Math.max(curPeers, snark.coordinator.trackerSeenPeers);
-        }
+        String err = snark.getTrackerProblems();
+        int curPeers = snark.getPeerCount();
+        stats[4] += curPeers;
+        int knownPeers = Math.max(curPeers, snark.getTrackerSeenPeers());
         
         String rowClass = (row % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd");
         String statusString;
         if (err != null) {
             if (isRunning && curPeers > 0 && !showPeers)
                 statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "trackererror.png\" title=\"" + err + "\"></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Tracker Error") +
-                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
+                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" +
                                curPeers + thinsp(noThinsp) +
                                ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
             else if (isRunning)
@@ -796,10 +814,10 @@ public class I2PSnarkServlet extends Default {
                 statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "trackererror.png\" title=\"" + err + "\"></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Tracker Error") +
                 "<br>" + err;
             }
-        } else if (remaining <= 0) {
+        } else if (remaining == 0) {  // < 0 means no meta size yet
             if (isRunning && curPeers > 0 && !showPeers)
                 statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "seeding.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Seeding") +
-                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
+                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" +
                                curPeers + thinsp(noThinsp) +
                                ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
             else if (isRunning)
@@ -811,7 +829,7 @@ public class I2PSnarkServlet extends Default {
         } else {
             if (isRunning && curPeers > 0 && downBps > 0 && !showPeers)
                 statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "downloading.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("OK") +
-                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
+                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" +
                                curPeers + thinsp(noThinsp) +
                                ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
             else if (isRunning && curPeers > 0 && downBps > 0)
@@ -820,7 +838,7 @@ public class I2PSnarkServlet extends Default {
                                ngettext("1 peer", "{0} peers", knownPeers);
             else if (isRunning && curPeers > 0 && !showPeers)
                 statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "stalled.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Stalled") +
-                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
+                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" +
                                curPeers + thinsp(noThinsp) +
                                ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
             else if (isRunning && curPeers > 0)
@@ -840,64 +858,66 @@ public class I2PSnarkServlet extends Default {
         out.write("<td class=\"center " + rowClass + "\">");
         out.write(statusString + "</td>\n\t");
 
+        // (i) icon column
         out.write("<td class=\"" + rowClass + "\">");
-        // temporarily hardcoded for postman* and anonymity, requires bytemonsoon patch for lookup by info_hash
-        String announce = snark.meta.getAnnounce();
-        if (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr") ||
-            announce.startsWith("http://lnQ6yoBT") || announce.startsWith("http://tracker2.postman.i2p/") || announce.startsWith("http://ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna.b32.i2p/")) {
-            Map trackers = _manager.getTrackers();
-            for (Iterator iter = trackers.entrySet().iterator(); iter.hasNext(); ) {
-                Map.Entry entry = (Map.Entry)iter.next();
-                String name = (String)entry.getKey();
-                String baseURL = (String)entry.getValue();
-                if (!(baseURL.startsWith(announce) || // vvv hack for non-b64 announce in list vvv
-                      (announce.startsWith("http://lnQ6yoBT") && baseURL.startsWith("http://tracker2.postman.i2p/")) ||
-                      (announce.startsWith("http://ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna.b32.i2p/") && baseURL.startsWith("http://tracker2.postman.i2p/"))))
-                    continue;
-                int e = baseURL.indexOf('=');
-                if (e < 0)
-                    continue;
-                baseURL = baseURL.substring(e + 1);
-                out.write("<a href=\"" + baseURL + "details.php?dllist=1&amp;filelist=1&amp;info_hash=");
-                out.write(TrackerClient.urlencode(snark.meta.getInfoHash()));
-                out.write("\" title=\"" + _("Details at {0} tracker", name) + "\" target=\"_blank\">");
-                out.write("<img alt=\"" + _("Info") + "\" border=\"0\" src=\"" + _imgPath + "details.png\">");
-                out.write("</a>");
-                break;
-            }
+        if (isValid && meta.getAnnounce() != null) {
+            // Link to local details page - note that trailing slash on a single-file torrent
+            // gets us to the details page instead of the file.
+            //StringBuilder buf = new StringBuilder(128);
+            //buf.append("<a href=\"").append(snark.getBaseName())
+            //   .append("/\" title=\"").append(_("Torrent details"))
+            //   .append("\"><img alt=\"").append(_("Info")).append("\" border=\"0\" src=\"")
+            //   .append(_imgPath).append("details.png\"></a>");
+            //out.write(buf.toString());
+
+            // Link to tracker details page
+            String trackerLink = getTrackerLink(meta.getAnnounce(), snark.getInfoHash());
+            if (trackerLink != null)
+                out.write(trackerLink);
         }
 
+        // File type icon column
         out.write("</td>\n<td class=\"" + rowClass + "\">");
-        StringBuilder buf = null;
-        if (remaining == 0 || snark.meta.getFiles() != null) {
-            buf = new StringBuilder(128);
-            buf.append("<a href=\"").append(snark.storage.getBaseName());
-            if (snark.meta.getFiles() != null)
-                buf.append('/');
-            buf.append("\" title=\"");
-            if (snark.meta.getFiles() != null)
-                buf.append(_("View files"));
-            else
-                buf.append(_("Open file"));
-            buf.append("\">");
+        if (isValid) {
+            // Link to local details page - note that trailing slash on a single-file torrent
+            // gets us to the details page instead of the file.
+            StringBuilder buf = new StringBuilder(128);
+            buf.append("<a href=\"").append(snark.getBaseName())
+               .append("/\" title=\"").append(_("Torrent details"))
+               .append("\">");
             out.write(buf.toString());
         }
         String icon;
-        if (snark.meta.getFiles() != null)
+        if (isMultiFile)
             icon = "folder";
+        else if (isValid)
+            icon = toIcon(meta.getName());
         else
-            icon = toIcon(snark.meta.getName());
-        if (remaining == 0 || snark.meta.getFiles() != null) {
-            out.write(toImg(icon, _("Open")));
+            icon = "magnet";
+        if (isValid) {
+            out.write(toImg(icon, _("Info")));
             out.write("</a>");
         } else {
             out.write(toImg(icon));
         }
+
+        // Torrent name column
         out.write("</td><td class=\"snarkTorrentName " + rowClass + "\">");
-        if (remaining == 0 || snark.meta.getFiles() != null)
+        if (remaining == 0 || isMultiFile) {
+            StringBuilder buf = new StringBuilder(128);
+            buf.append("<a href=\"").append(snark.getBaseName());
+            if (isMultiFile)
+                buf.append('/');
+            buf.append("\" title=\"");
+            if (isMultiFile)
+                buf.append(_("View files"));
+            else
+                buf.append(_("Open file"));
+            buf.append("\">");
             out.write(buf.toString());
+        }
         out.write(filename);
-        if (remaining == 0 || snark.meta.getFiles() != null)
+        if (remaining == 0 || isMultiFile)
             out.write("</a>");
 
         out.write("<td align=\"right\" class=\"snarkTorrentETA " + rowClass + "\">");
@@ -907,24 +927,26 @@ public class I2PSnarkServlet extends Default {
         out.write("<td align=\"right\" class=\"snarkTorrentDownloaded " + rowClass + "\">");
         if (remaining > 0)
             out.write(formatSize(total-remaining) + thinsp(noThinsp) + formatSize(total));
-        else
+        else if (remaining == 0)
             out.write(formatSize(total)); // 3GB
+        //else
+        //    out.write("??");  // no meta size yet
         out.write("</td>\n\t");
         out.write("<td align=\"right\" class=\"snarkTorrentUploaded " + rowClass + "\">");
-        if(isRunning)
+        if(isRunning && isValid)
            out.write(formatSize(uploaded));
         out.write("</td>\n\t");
         out.write("<td align=\"right\" class=\"snarkTorrentRateDown\">");
-        if(isRunning && remaining > 0)
+        if(isRunning && remaining != 0)
             out.write(formatSize(downBps) + "ps");
         out.write("</td>\n\t");
         out.write("<td align=\"right\" class=\"snarkTorrentRateUp\">");
-        if(isRunning)
+        if(isRunning && isValid)
             out.write(formatSize(upBps) + "ps");
         out.write("</td>\n\t");
         out.write("<td align=\"center\" class=\"snarkTorrentAction " + rowClass + "\">");
-        String parameters = "&nonce=" + _nonce + "&torrent=" + Base64.encode(snark.meta.getInfoHash());
-        String b64 = Base64.encode(snark.meta.getInfoHash());
+        String parameters = "&nonce=" + _nonce + "&torrent=" + Base64.encode(snark.getInfoHash());
+        String b64 = Base64.encode(snark.getInfoHash());
         if (showPeers)
             parameters = parameters + "&p=1";
         if (isRunning) {
@@ -939,8 +961,8 @@ public class I2PSnarkServlet extends Default {
             if (isDegraded)
                 out.write("</a>");
         } else {
-            if (isValid) {
-                if (isDegraded)
+                // This works in Opera but it's displayed a little differently, so use noThinsp here too so all 3 icons are consistent
+                if (noThinsp)
                     out.write("<a href=\"/i2psnark/?action=Start_" + b64 + "&amp;nonce=" + _nonce + "\"><img title=\"");
                 else
                     out.write("<input type=\"image\" name=\"action_Start_" + b64 + "\" value=\"foo\" title=\"");
@@ -950,26 +972,29 @@ public class I2PSnarkServlet extends Default {
                 out.write("\">");
                 if (isDegraded)
                     out.write("</a>");
-            }
 
-            if (isDegraded)
-                out.write("<a href=\"/i2psnark/?action=Remove_" + b64 + "&amp;nonce=" + _nonce + "\"><img title=\"");
-            else
-                out.write("<input type=\"image\" name=\"action_Remove_" + b64 + "\" value=\"foo\" title=\"");
-            out.write(_("Remove the torrent from the active list, deleting the .torrent file"));
-            out.write("\" onclick=\"if (!confirm('");
-            // Can't figure out how to escape double quotes inside the onclick string.
-            // Single quotes in translate strings with parameters must be doubled.
-            // Then the remaining single quite must be escaped
-            out.write(_("Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?", fullFilename));
-            out.write("')) { return false; }\"");
-            out.write(" src=\"" + _imgPath + "remove.png\" alt=\"");
-            out.write(_("Remove"));
-            out.write("\">");
-            if (isDegraded)
-                out.write("</a>");
+            if (isValid) {
+                // Doesnt work with Opera so use noThinsp instead of isDegraded
+                if (noThinsp)
+                    out.write("<a href=\"/i2psnark/?action=Remove_" + b64 + "&amp;nonce=" + _nonce + "\"><img title=\"");
+                else
+                    out.write("<input type=\"image\" name=\"action\" value=\"Remove_" + b64 + "\" title=\"");
+                out.write(_("Remove the torrent from the active list, deleting the .torrent file"));
+                out.write("\" onclick=\"if (!confirm('");
+                // Can't figure out how to escape double quotes inside the onclick string.
+                // Single quotes in translate strings with parameters must be doubled.
+                // Then the remaining single quite must be escaped
+                out.write(_("Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?", fullFilename));
+                out.write("')) { return false; }\"");
+                out.write(" src=\"" + _imgPath + "remove.png\" alt=\"");
+                out.write(_("Remove"));
+                out.write("\">");
+                if (isDegraded)
+                    out.write("</a>");
+            }
 
-            if (isDegraded)
+            // Doesnt work with Opera so use noThinsp instead of isDegraded
+            if (noThinsp)
                 out.write("<a href=\"/i2psnark/?action=Delete_" + b64 + "&amp;nonce=" + _nonce + "\"><img title=\"");
             else
                 out.write("<input type=\"image\" name=\"action_Delete_" + b64 + "\" value=\"foo\" title=\"");
@@ -989,7 +1014,7 @@ public class I2PSnarkServlet extends Default {
         out.write("</td>\n</tr>\n");
 
         if(showPeers && isRunning && curPeers > 0) {
-            List<Peer> peers = snark.coordinator.peerList();
+            List<Peer> peers = snark.getPeerList();
             if (!showDebug)
                 Collections.sort(peers, new PeerComparator());
             for (Peer peer : peers) {
@@ -1022,14 +1047,21 @@ public class I2PSnarkServlet extends Default {
                 out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">");
                 out.write("</td>\n\t");
                 out.write("<td align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">");
-                float pct = (float) (100.0 * (float) peer.completed() / snark.meta.getPieces());
-                if (pct == 100.0)
-                    out.write(_("Seed"));
-                else {
-                    String ps = String.valueOf(pct);
-                    if (ps.length() > 5)
-                        ps = ps.substring(0, 5);
-                    out.write(ps + "%");
+                float pct;
+                if (isValid) {
+                    pct = (float) (100.0 * (float) peer.completed() / meta.getPieces());
+                    if (pct == 100.0)
+                        out.write(_("Seed"));
+                    else {
+                        String ps = String.valueOf(pct);
+                        if (ps.length() > 5)
+                            ps = ps.substring(0, 5);
+                        out.write(ps + "%");
+                    }
+                } else {
+                    pct = (float) 101.0;
+                    // until we get the metainfo we don't know how many pieces there are
+                    //out.write("??");
                 }
                 out.write("</td>\n\t");
                 out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">");
@@ -1048,10 +1080,16 @@ public class I2PSnarkServlet extends Default {
                         out.write("\">");
                         out.write(formatSize(peer.getDownloadRate()) + "ps</a></span>");
                     }
+                } else if (!isValid) {
+                    //if (peer supports metadata extension) {
+                        out.write("<span class=\"unchoked\">");
+                        out.write(formatSize(peer.getDownloadRate()) + "ps</span>");
+                    //} else {
+                    //}
                 }
                 out.write("</td>\n\t");
                 out.write("<td align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">");
-                if (pct != 100.0) {
+                if (isValid && pct < 100.0) {
                     if (peer.isInterested() && !peer.isChoking()) {
                         out.write("<span class=\"unchoked\">");
                         out.write(formatSize(peer.getUploadRate()) + "ps</span>");
@@ -1094,8 +1132,40 @@ public class I2PSnarkServlet extends Default {
         }
     }
 
+    /**
+     *  @return string or null
+     *  @since 0.8.4
+     */
+    private String getTrackerLink(String announce, byte[] infohash) {
+        // temporarily hardcoded for postman* and anonymity, requires bytemonsoon patch for lookup by info_hash
+        if (announce != null && (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr") ||
+              announce.startsWith("http://lnQ6yoBT") || announce.startsWith("http://tracker2.postman.i2p/") ||
+              announce.startsWith("http://ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna.b32.i2p/"))) {
+            Map<String, String> trackers = _manager.getTrackers();
+            for (Map.Entry<String, String> entry : trackers.entrySet()) {
+                String baseURL = entry.getValue();
+                if (!(baseURL.startsWith(announce) || // vvv hack for non-b64 announce in list vvv
+                      (announce.startsWith("http://lnQ6yoBT") && baseURL.startsWith("http://tracker2.postman.i2p/")) ||
+                      (announce.startsWith("http://ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna.b32.i2p/") && baseURL.startsWith("http://tracker2.postman.i2p/"))))
+                    continue;
+                int e = baseURL.indexOf('=');
+                if (e < 0)
+                    continue;
+                baseURL = baseURL.substring(e + 1);
+                String name = entry.getKey();
+                StringBuilder buf = new StringBuilder(128);
+                buf.append("<a href=\"").append(baseURL).append("details.php?dllist=1&amp;filelist=1&amp;info_hash=")
+                   .append(TrackerClient.urlencode(infohash))
+                   .append("\" title=\"").append(_("Details at {0} tracker", name)).append("\" target=\"_blank\">" +
+                          "<img alt=\"").append(_("Info")).append("\" border=\"0\" src=\"")
+                   .append(_imgPath).append("details.png\"></a>");
+                return buf.toString();
+            }
+        }
+        return null;
+    }
+
     private void writeAddForm(PrintWriter out, HttpServletRequest req) throws IOException {
-        String uri = req.getRequestURI();
         String newURL = req.getParameter("newURL");
         if ( (newURL == null) || (newURL.trim().length() <= 0) )
             newURL = "";
@@ -1120,7 +1190,7 @@ public class I2PSnarkServlet extends Default {
         out.write(_("From URL"));
         out.write(":<td><input type=\"text\" name=\"newURL\" size=\"85\" value=\"" + newURL + "\"");
         out.write("title=\"");
-        out.write(_("Torrent file must originate from an I2P-based tracker"));
+        out.write(_("Enter the torrent file download URL (I2P only), magnet link, or maggot link"));
         out.write("\"> \n");
         // not supporting from file at the moment, since the file name passed isn't always absolute (so it may not resolve)
         //out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>");
@@ -1136,7 +1206,6 @@ public class I2PSnarkServlet extends Default {
     }
     
     private void writeSeedForm(PrintWriter out, HttpServletRequest req) throws IOException {
-        String uri = req.getRequestURI();
         String baseFile = req.getParameter("baseFile");
         if (baseFile == null || baseFile.trim().length() <= 0)
             baseFile = "";
@@ -1167,6 +1236,11 @@ public class I2PSnarkServlet extends Default {
         out.write(":<td><select name=\"announceURL\"><option value=\"\">");
         out.write(_("Select a tracker"));
         out.write("</option>\n");
+        // todo remember this one with _lastAnnounceURL also
+        out.write("<option value=\"none\">");
+        //out.write(_("Open trackers and DHT only"));
+        out.write(_("Open trackers only"));
+        out.write("</option>\n");
         Map trackers = _manager.getTrackers();
         for (Iterator iter = trackers.entrySet().iterator(); iter.hasNext(); ) {
             Map.Entry entry = (Map.Entry)iter.next();
@@ -1175,6 +1249,8 @@ public class I2PSnarkServlet extends Default {
             int e = announceURL.indexOf('=');
             if (e > 0)
                 announceURL = announceURL.substring(0, e);
+            if (announceURL.equals(_lastAnnounceURL))
+                announceURL += "\" selected=\"selected";
             out.write("\t<option value=\"" + announceURL + "\">" + name + "</option>\n");
         }
         out.write("</select>\n");
@@ -1190,7 +1266,6 @@ public class I2PSnarkServlet extends Default {
     }
     
     private void writeConfigForm(PrintWriter out, HttpServletRequest req) throws IOException {
-        String uri = req.getRequestURI();
         String dataDir = _manager.getDataDir().getAbsolutePath();
         boolean autoStart = _manager.shouldAutoStart();
         boolean useOpenTrackers = _manager.util().shouldUseOpenTrackers();
@@ -1308,15 +1383,17 @@ public class I2PSnarkServlet extends Default {
         out.write("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
         out.write(renderOptions(0, 4, options.remove("outbound.length"), "outbound.length", HOP));
 
-        out.write("<tr><td>");
-        out.write(_("I2CP host"));
-        out.write(": <td><input type=\"text\" name=\"i2cpHost\" value=\"" 
-                  + _manager.util().getI2CPHost() + "\" size=\"15\" > ");
+        if (!_context.isRouterContext()) {
+            out.write("<tr><td>");
+            out.write(_("I2CP host"));
+            out.write(": <td><input type=\"text\" name=\"i2cpHost\" value=\"" 
+                      + _manager.util().getI2CPHost() + "\" size=\"15\" > ");
 
-        out.write("<tr><td>");
-        out.write(_("I2CP port"));
-        out.write(": <td><input type=\"text\" name=\"i2cpPort\" class=\"r\" value=\"" +
-                  + _manager.util().getI2CPPort() + "\" size=\"5\" maxlength=\"5\" > <br>\n");
+            out.write("<tr><td>");
+            out.write(_("I2CP port"));
+            out.write(": <td><input type=\"text\" name=\"i2cpPort\" class=\"r\" value=\"" +
+                      + _manager.util().getI2CPPort() + "\" size=\"5\" maxlength=\"5\" > <br>\n");
+        }
 
         StringBuilder opts = new StringBuilder(64);
         for (Iterator iter = options.entrySet().iterator(); iter.hasNext(); ) {
@@ -1327,7 +1404,7 @@ public class I2PSnarkServlet extends Default {
         }
         out.write("<tr><td>");
         out.write(_("I2CP options"));
-        out.write(": <td><textarea name=\"i2cpOpts\" cols=\"60\" rows=\"1\" wrap=\"off\" >"
+        out.write(": <td><textarea name=\"i2cpOpts\" cols=\"60\" rows=\"1\" wrap=\"off\" spellcheck=\"false\" >"
                   + opts.toString() + "</textarea><br>\n");
 
         out.write("<tr><td>&nbsp;<td><input type=\"submit\" value=\"");
@@ -1344,6 +1421,78 @@ public class I2PSnarkServlet extends Default {
         out.write("</a></span></span></div>\n");
     }
 
+    /**
+     *  @param url in base32 or hex, xt must be first magnet param
+     *  @since 0.8.4
+     */
+    private void addMagnet(String url) {
+        String ihash;
+        String name;
+        String trackerURL = null;
+        if (url.startsWith(MAGNET)) {
+            // magnet:?xt=urn:btih:0691e40aae02e552cfcb57af1dca56214680c0c5&tr=http://tracker2.postman.i2p/announce.php
+            String xt = getParam("xt", url);
+            if (xt == null || !xt.startsWith("urn:btih:")) {
+                _manager.addMessage(_("Invalid magnet URL {0}", url));
+                return;
+            }
+            ihash = xt.substring("urn:btih:".length());
+            trackerURL = getParam("tr", url);
+            name = "Magnet " + ihash;
+            String dn = getParam("dn", url);
+            if (dn != null)
+                name += " (" + Storage.filterName(dn) + ')';
+        } else if (url.startsWith(MAGGOT)) {
+            // maggot://0691e40aae02e552cfcb57af1dca56214680c0c5:0b557bbdf8718e95d352fbe994dec3a383e2ede7
+            ihash = url.substring(MAGGOT.length()).trim();
+            int col = ihash.indexOf(':');
+            if (col >= 0)
+                ihash = ihash.substring(0, col);
+            name = "Maggot " + ihash;
+        } else {
+            return;
+        }
+        byte[] ih = null;
+        if (ihash.length() == 32) {
+            ih = Base32.decode(ihash);
+        } else if (ihash.length() == 40) {
+            //  Like DataHelper.fromHexString() but ensures no loss of leading zero bytes
+            ih = new byte[20];
+            try {
+                for (int i = 0; i < 20; i++) {
+                    ih[i] = (byte) (Integer.parseInt(ihash.substring(i*2, (i*2) + 2), 16) & 0xff);
+                }
+            } catch (NumberFormatException nfe) {
+                ih = null;
+            }
+        }
+        if (ih == null || ih.length != 20) {
+            _manager.addMessage(_("Invalid info hash in magnet URL {0}", url));
+            return;
+        }
+        _manager.addMagnet(name, ih, trackerURL, true);
+    }
+
+    private static String getParam(String key, String uri) {
+        int idx = uri.indexOf('?' + key + '=');
+        if (idx >= 0) {
+            idx += key.length() + 2;
+        } else {
+            idx = uri.indexOf('&' + key + '=');
+            if (idx >= 0)
+                idx += key.length() + 2;
+        }
+        if (idx < 0 || idx > uri.length())
+            return null;
+        String rv = uri.substring(idx);
+        idx = rv.indexOf('&');
+        if (idx >= 0)
+            rv = rv.substring(0, idx);
+        else
+            rv = rv.trim();
+        return rv;
+    }
+
     /** copied from ConfigTunnelsHelper */
     private static final String HOP = "hop";
     private static final String TUNNEL = "tunnel";
@@ -1384,6 +1533,11 @@ public class I2PSnarkServlet extends Default {
         return _manager.util().getString(s, o);
     }
 
+    /** translate */
+    private String _(String s, Object o, Object o2) {
+        return _manager.util().getString(s, o, o2);
+    }
+
     /** translate (ngettext) @since 0.7.14 */
     private String ngettext(String s, String p, int n) {
         return _manager.util().getString(n, s, p);
@@ -1459,13 +1613,11 @@ public class I2PSnarkServlet extends Default {
     private String getListHTML(Resource r, String base, boolean parent, Map postParams)
         throws IOException
     {
-        if (!r.isDirectory())
-            return null;
-        
-        String[] ls = r.list();
-        if (ls==null)
-            return null;
-        Arrays.sort(ls, Collator.getInstance());
+        String[] ls = null;
+        if (r.isDirectory()) {
+            ls = r.list();
+            Arrays.sort(ls, Collator.getInstance());
+        }  // if r is not a directory, we are only showing torrent info section
         
         StringBuilder buf=new StringBuilder(4096);
         buf.append(DOCTYPE + "<HTML><HEAD><TITLE>");
@@ -1487,6 +1639,7 @@ public class I2PSnarkServlet extends Default {
 
         if (title.endsWith("/"))
             title = title.substring(0, title.length() - 1);
+        String directory = title;
         title = _("Torrent") + ": " + title;
         buf.append(title);
         buf.append("</TITLE>").append(HEADER_A).append(_themePath).append(HEADER_B).append("<link rel=\"shortcut icon\" href=\"" + _themePath + "favicon.ico\">" +
@@ -1495,13 +1648,70 @@ public class I2PSnarkServlet extends Default {
         
         if (parent)  // always true
             buf.append("<div class=\"page\"><div class=\"mainsection\">");
-        boolean showPriority = snark != null && !snark.storage.complete();
+        boolean showPriority = ls != null && snark != null && snark.getStorage() != null && !snark.getStorage().complete();
         if (showPriority)
             buf.append("<form action=\"").append(base).append("\" method=\"POST\">\n");
-        buf.append("<TABLE BORDER=0 class=\"snarkTorrents\" >" +
-            "<thead><tr><th>")
+        buf.append("<TABLE BORDER=0 class=\"snarkTorrents\" ><thead>");
+        if (snark != null) {
+            // first row - torrent info
+            // FIXME center
+            buf.append("<tr><th colspan=\"" + (showPriority ? '4' : '3') + "\"><div>")
+                .append(_("Torrent")).append(": ").append(snark.getBaseName());
+            int pieces = snark.getPieces();
+            double completion = (pieces - snark.getNeeded()) / (double) pieces;
+            if (completion < 1.0)
+                buf.append("<br>").append(_("Completion")).append(": ").append((new DecimalFormat("0.00%")).format(completion));
+            else
+                buf.append("<br>").append(_("Complete"));
+            // else unknown
+            buf.append("<br>").append(_("Size")).append(": ").append(formatSize(snark.getTotalLength()));
+            MetaInfo meta = snark.getMetaInfo();
+            if (meta != null) {
+                List files = meta.getFiles();
+                int fileCount = files != null ? files.size() : 1;
+                buf.append("<br>").append(_("Files")).append(": ").append(fileCount);
+            }
+            buf.append("<br>").append(_("Pieces")).append(": ").append(pieces);
+            buf.append("<br>").append(_("Piece size")).append(": ").append(formatSize(snark.getPieceLength(0)));
+
+            if (meta != null) {
+                String announce = meta.getAnnounce();
+                if (announce != null) {
+                    buf.append("<br>");
+                    String trackerLink = getTrackerLink(announce, snark.getInfoHash());
+                    if (trackerLink != null)
+                        buf.append(trackerLink).append(' ');
+                    buf.append(_("Tracker")).append(": ");
+                    if (announce.startsWith("http://"))
+                        announce = announce.substring(7);
+                    int slsh = announce.indexOf('/');
+                    if (slsh > 0)
+                        announce = announce.substring(0, slsh);
+                    if (announce.length() > 67)
+                        announce = announce.substring(0, 40) + "&hellip;" + announce.substring(announce.length() - 8);
+                    buf.append(announce);
+                }
+            }
+
+            String hex = I2PSnarkUtil.toHex(snark.getInfoHash());
+            buf.append("<br>").append(toImg("magnet", _("Magnet link"))).append(" <a href=\"")
+               .append(MAGNET_FULL).append(hex).append("\">")
+               .append(MAGNET_FULL).append(hex).append("</a>");
+            // We don't have the hash of the torrent file
+            //buf.append("<br>").append(_("Maggot link")).append(": <a href=\"").append(MAGGOT).append(hex).append(':').append(hex).append("\">")
+            //   .append(MAGGOT).append(hex).append(':').append(hex).append("</a>");
+            buf.append("</div></th></tr>");
+        }
+        if (ls == null) {
+            // We are only showing the torrent info section
+            buf.append("</thead></table></div></div></BODY></HTML>");
+            return buf.toString();
+        }
+
+        // second row - dir info
+        buf.append("<tr><th>")
             .append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" >&nbsp;")
-            .append(title).append("</th><th align=\"right\">")
+            .append(_("Directory")).append(": ").append(directory).append("</th><th align=\"right\">")
             .append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "size.png\" >&nbsp;")
             .append(_("Size"));
         buf.append("</th><th class=\"headerstatus\">")
@@ -1542,15 +1752,16 @@ public class I2PSnarkServlet extends Default {
                 complete = true;
                 status = toImg("tick") + ' ' + _("Directory");
             } else {
-                if (snark == null) {
+                if (snark == null || snark.getStorage() == null) {
                     // Assume complete, perhaps he removed a completed torrent but kept a bookmark
                     complete = true;
                     status = toImg("cancel") + ' ' + _("Torrent not found?");
                 } else {
+                    Storage storage = snark.getStorage();
                     try {
                         File f = item.getFile();
                         if (f != null) {
-                            long remaining = snark.storage.remaining(f.getCanonicalPath());
+                            long remaining = storage.remaining(f.getCanonicalPath());
                             if (remaining < 0) {
                                 complete = true;
                                 status = toImg("cancel") + ' ' + _("File not found in torrent?");
@@ -1558,7 +1769,7 @@ public class I2PSnarkServlet extends Default {
                                 complete = true;
                                 status = toImg("tick") + ' ' + _("Complete");
                             } else {
-                                int priority = snark.storage.getPriority(f.getCanonicalPath());
+                                int priority = storage.getPriority(f.getCanonicalPath());
                                 if (priority < 0)
                                     status = toImg("cancel");
                                 else if (priority == 0)
@@ -1614,7 +1825,7 @@ public class I2PSnarkServlet extends Default {
                 buf.append("<td class=\"priority\">");
                 File f = item.getFile();
                 if ((!complete) && (!item.isDirectory()) && f != null) {
-                    int pri = snark.storage.getPriority(f.getCanonicalPath());
+                    int pri = snark.getStorage().getPriority(f.getCanonicalPath());
                     buf.append("<input type=\"radio\" value=\"5\" name=\"pri.").append(f.getCanonicalPath()).append("\" ");
                     if (pri > 0)
                         buf.append("checked=\"true\"");
@@ -1672,9 +1883,11 @@ public class I2PSnarkServlet extends Default {
             mime = "";
         if (mime.equals("text/html"))
             icon = "html";
-        else if (mime.equals("text/plain") || plc.endsWith(".nfo"))
+        else if (mime.equals("text/plain") || plc.endsWith(".nfo") ||
+                 mime.equals("application/rtf"))
             icon = "page";
-        else if (mime.equals("application/java-archive") || plc.endsWith(".war"))
+        else if (mime.equals("application/java-archive") || plc.endsWith(".war") ||
+                 plc.endsWith(".deb"))
             icon = "package";
         else if (plc.endsWith(".xpi2p"))
             icon = "plugin";
@@ -1716,6 +1929,9 @@ public class I2PSnarkServlet extends Default {
 
     /** @since 0.8.1 */
     private void savePriorities(Snark snark, Map postParams) {
+        Storage storage = snark.getStorage();
+        if (storage == null)
+            return;
         Set<Map.Entry> entries = postParams.entrySet();
         for (Map.Entry entry : entries) {
             String key = (String)entry.getKey();
@@ -1724,14 +1940,13 @@ public class I2PSnarkServlet extends Default {
                     String file = key.substring(4);
                     String val = ((String[])entry.getValue())[0];   // jetty arrays
                     int pri = Integer.parseInt(val);
-                    snark.storage.setPriority(file, pri);
+                    storage.setPriority(file, pri);
                     //System.err.println("Priority now " + pri + " for " + file);
                 } catch (Throwable t) { t.printStackTrace(); }
             }
         }
-        if (snark.coordinator != null)
-            snark.coordinator.updatePiecePriorities();
-        _manager.saveTorrentStatus(snark.storage.getMetaInfo(), snark.storage.getBitField(), snark.storage.getFilePriorities());
+         snark.updatePiecePriorities();
+        _manager.saveTorrentStatus(snark.getMetaInfo(), storage.getBitField(), storage.getFilePriorities());
     }
 
 
@@ -1753,15 +1968,16 @@ private static class FetchAndAdd implements Runnable {
                 FileInputStream in = null;
                 try {
                     in = new FileInputStream(file);
-                    MetaInfo info = new MetaInfo(in);
-                    String name = info.getName();
-                    name = DataHelper.stripHTML(name);  // XSS
-                    name = name.replace('/', '_');
-                    name = name.replace('\\', '_');
-                    name = name.replace('&', '+');
-                    name = name.replace('\'', '_');
-                    name = name.replace('"', '_');
-                    name = name.replace('`', '_');
+                    byte[] fileInfoHash = new byte[20];
+                    String name = MetaInfo.getNameAndInfoHash(in, fileInfoHash);
+                    try { in.close(); } catch (IOException ioe) {}
+                    Snark snark = _manager.getTorrentByInfoHash(fileInfoHash);
+                    if (snark != null) {
+                        _manager.addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName()));
+                        return;
+                    }
+
+                    name = Storage.filterName(name);
                     name = name + ".torrent";
                     File torrentFile = new File(_manager.getDataDir(), name);
 
@@ -1773,18 +1989,15 @@ private static class FetchAndAdd implements Runnable {
                         else
                             _manager.addMessage(_("Torrent already in the queue: {0}", name));
                     } else {
-                        boolean success = FileUtil.copy(file.getAbsolutePath(), canonical, false);
-                        if (success) {
-                            SecureFileOutputStream.setPerms(torrentFile);
-                            _manager.addTorrent(canonical);
-                        } else {
-                            _manager.addMessage(_("Failed to copy torrent file to {0}", canonical));
-                        }
+                        // This may take a LONG time to create the storage.
+                        _manager.copyAndAddTorrent(file, canonical);
                     }
                 } catch (IOException ioe) {
                     _manager.addMessage(_("Torrent at {0} was not valid", urlify(_url)) + ": " + ioe.getMessage());
+                } catch (OutOfMemoryError oom) {
+                    _manager.addMessage(_("ERROR - Out of memory, cannot create torrent from {0}", urlify(_url)) + ": " + oom.getMessage());
                 } finally {
-                    try { in.close(); } catch (IOException ioe) {}
+                    try { if (in != null) in.close(); } catch (IOException ioe) {}
                 }
             } else {
                 _manager.addMessage(_("Torrent was not retrieved from {0}", urlify(_url)));
diff --git a/apps/i2psnark/locale/messages_ar.po b/apps/i2psnark/locale/messages_ar.po
new file mode 100644
index 0000000000000000000000000000000000000000..f0be3b9745036b8a7249084f97dd868ba51c68e8
--- /dev/null
+++ b/apps/i2psnark/locale/messages_ar.po
@@ -0,0 +1,912 @@
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P i2psnark\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-03 18:28+0000\n"
+"PO-Revision-Date: 2011-03-03 17:18-0000\n"
+"Last-Translator: hamada <hamada@mail.i2p>\n"
+"Language-Team: duck <duck@mail.i2p>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:307
+#, java-format
+msgid "Total uploaders limit changed to {0}"
+msgstr "تم تغببر مجموع حد الرفع الى {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:309
+#, java-format
+msgid "Minimum total uploaders limit is {0}"
+msgstr "اقل حد الرفع الى {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:321
+#, java-format
+msgid "Up BW limit changed to {0}KBps"
+msgstr "حولت سرعة الرفع الى {0}KBps"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:323
+#, java-format
+msgid "Minimum up bandwidth limit is {0}KBps"
+msgstr "اقل سرعة رفع هي{0}KBps"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:335
+#, java-format
+msgid "Startup delay changed to {0}"
+msgstr "تغير تأخير البداية الى {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:386
+msgid "I2CP and tunnel changes will take effect after stopping all torrents"
+msgstr "سيتم تفعيل التغيير بعد اعادة التشغيل"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:393
+msgid "Disconnecting old I2CP destination"
+msgstr "فك الاتصال"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:397
+#, java-format
+msgid "I2CP settings changed to {0}"
+msgstr " تغيرت الاعدادات الى {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:402
+msgid ""
+"Unable to connect with the new settings, reverting to the old I2CP settings"
+msgstr "فشل في الاتصال بالاعدادات الجديدة، سيتم الرجوع الى الاعدادات القديمة"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:406
+msgid "Unable to reconnect with the old settings!"
+msgstr "فشل في اعادة الاتصال بالاعدادات القديمة!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:408
+msgid "Reconnected on the new I2CP destination"
+msgstr "اتصال بوجهة جديدة"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:418
+#, java-format
+msgid "I2CP listener restarted for \"{0}\""
+msgstr "اعادة التشغيل \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:429
+msgid "Enabled autostart"
+msgstr "تشغيل عند البداية"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:431
+msgid "Disabled autostart"
+msgstr "الغاء التشغيل عند البداية"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:437
+msgid "Enabled open trackers - torrent restart required to take effect."
+msgstr "تفعيل open trackers - يجب اعادة تشغيل التورنت لتفعيل التغيير."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:439
+msgid "Disabled open trackers - torrent restart required to take effect."
+msgstr "الغاء تفعيل open trackers - يجب اعادة تشغيل التورنت لتفعيل التغيير."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:447
+msgid "Open Tracker list changed - torrent restart required to take effect."
+msgstr "تغيير open trackers - يجب اعادة تشغيل التورنت لتفعيل التغيير."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:454
+#, java-format
+msgid "{0} theme loaded, return to main i2psnark page to view."
+msgstr "{0} تم تحميل التيمة  ارجع الى صفحة للمشاهدة i2psnark."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
+msgid "Configuration unchanged."
+msgstr "لم تتغير الاعدادات"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:471
+#, java-format
+msgid "Unable to save the config to {0}"
+msgstr "فشل في حفظ الاعدادات {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:536
+msgid "Connecting to I2P"
+msgstr "جاري الاتصال بشبكة I2P"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:539
+msgid "Error connecting to I2P - check your I2CP settings!"
+msgstr "فشل في الاتصال ب I2P - تخقق من اعدادات I2CP !"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:548
+#, java-format
+msgid "Error: Could not add the torrent {0}"
+msgstr "خطأ: فشل في اضافة التورنت {0}"
+
+#. catch this here so we don't try do delete it below
+#: ../java/src/org/klomp/snark/SnarkManager.java:570
+#, java-format
+msgid "Cannot open \"{0}\""
+msgstr "فشل في فتح \"{0}\""
+
+#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
+#: ../java/src/org/klomp/snark/SnarkManager.java:586
+#: ../java/src/org/klomp/snark/SnarkManager.java:661
+#: ../java/src/org/klomp/snark/SnarkManager.java:716
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976
+#, java-format
+msgid "Torrent with this info hash is already running: {0}"
+msgstr "تورنت بهذه المعلومات مشغل: {0}"
+
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:593
+#, java-format
+msgid ""
+"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers "
+"only."
+msgstr ""
+
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:598
+#, java-format
+msgid ""
+"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is "
+"enabled before starting this torrent."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:619
+#, java-format
+msgid "Torrent in \"{0}\" is invalid"
+msgstr "تورنت في \"{0}\"غير صحيح"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:624
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999
+#, java-format
+msgid "ERROR - Out of memory, cannot create torrent from {0}"
+msgstr "خطأ - لا توجد ذاكرة كافية، لا يمكن انشاء تورنت {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:635
+#, java-format
+msgid "Torrent added and started: \"{0}\""
+msgstr "تم اضافة وتشغيل التورنت: \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:637
+#, java-format
+msgid "Torrent added: \"{0}\""
+msgstr "تمت اضافة: \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:672
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490
+#, java-format
+msgid "Fetching {0}"
+msgstr "يحمل {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:675
+#, java-format
+msgid ""
+"We have no saved peers and no other torrents are running. Fetch of {0} will "
+"not succeed until you start another torrent."
+msgstr "لا يوجد تورنت مشغل . تحميل {0} لن يتم حتى تشغيل تورنت جديد."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:679
+#, java-format
+msgid "Adding {0}"
+msgstr "اضافة {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:726
+#: ../java/src/org/klomp/snark/SnarkManager.java:749
+#: ../java/src/org/klomp/snark/SnarkManager.java:1174
+#, java-format
+msgid "Failed to copy torrent file to {0}"
+msgstr "فشل في نسخ التورنت الى {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:972
+#, java-format
+msgid "Too many files in \"{0}\" ({1}), deleting it!"
+msgstr "ملفات كثيرة في  \"{0}\" ({1}) تم حذف"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:974
+#, java-format
+msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
+msgstr "ملف التورنت \"{0}\" لا يمكنه الانتهاء ب \".torrent\", سيتم حذفه!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:976
+#, java-format
+msgid "No pieces in \"{0}\",  deleting it!"
+msgstr "ﻻ أجزاء في \"{0}\",  حذف!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:978
+#, java-format
+msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:980
+#, java-format
+msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
+msgstr "الأجزاء كبيرة في \"{0}\" ({1}B), حذف."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:981
+#, java-format
+msgid "Limit is {0}B"
+msgstr "حدود {0}B"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:989
+#, java-format
+msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
+msgstr "تورنت أكبر من {0}B غير مدعومة سيحذف \"{1}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1005
+#, java-format
+msgid "Error: Could not remove the torrent {0}"
+msgstr "خطأ: ﻻيمكن حذف التورنت {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1026
+#: ../java/src/org/klomp/snark/SnarkManager.java:1044
+#, java-format
+msgid "Torrent stopped: \"{0}\""
+msgstr "تورنت متوقف: \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1065
+#, java-format
+msgid "Torrent removed: \"{0}\""
+msgstr "تورنت محذوف: \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1073
+#, java-format
+msgid "Adding torrents in {0}"
+msgstr "اضف تورنت في {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1122
+#, java-format
+msgid "Download finished: {0}"
+msgstr "انتهى التحميل: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1170
+#, java-format
+msgid "Metainfo received for {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1171
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525
+#, java-format
+msgid "Starting up torrent {0}"
+msgstr "بداية التورنت {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1225
+msgid "Unable to connect to I2P!"
+msgstr "فشل في اضافة I2P!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1231
+#, java-format
+msgid "Unable to add {0}"
+msgstr "فشل في اضافة {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
+msgid "I2PSnark - Anonymous BitTorrent Client"
+msgstr "I2PSnark - برنامج مشاركة ملفات التورنت المجهول"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218
+msgid "Torrents"
+msgstr "تورنت"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
+msgid "I2PSnark"
+msgstr "I2PSnark برنامج تورنت"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225
+msgid "Refresh page"
+msgstr "أنعش الصفحة"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230
+msgid "Forum"
+msgstr "منتدى"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719
+msgid "Status"
+msgstr "الحالة"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292
+msgid "Hide Peers"
+msgstr "اخفاء النظائر"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299
+msgid "Show Peers"
+msgstr "أظهر النظائر"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659
+msgid "Torrent"
+msgstr "تورنت"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310
+msgid "Estimated time remaining"
+msgstr "تقدير للوقت الباقي"
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313
+msgid "ETA"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
+msgid "Downloaded"
+msgstr "محمل"
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
+msgid "RX"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
+msgid "Uploaded"
+msgstr "رفع"
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
+msgid "TX"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332
+msgid "Down Rate"
+msgstr "معدل التحميل"
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
+msgid "Rate"
+msgstr "معدل"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+msgid "Up Rate"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
+msgid "Stop all torrents and the I2P tunnel"
+msgstr "توقيف جمبع التورنت و النفق I2P"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367
+msgid "Stop All"
+msgstr "توقيف الجمبع"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376
+msgid "Start all torrents and the I2P tunnel"
+msgstr "شغل جمبع التورنت و النفق I2P"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378
+msgid "Start All"
+msgstr "شغل الجمبع"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
+msgid "No torrents loaded."
+msgstr "لم يحمل تورنت"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402
+msgid "Totals"
+msgstr "مجموع"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
+#, java-format
+msgid "1 torrent"
+msgid_plural "{0} torrents"
+msgstr[0] "1 تورنت"
+msgstr[1] "{0} تورنت"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
+#, java-format
+msgid "1 connected peer"
+msgid_plural "{0} connected peers"
+msgstr[0] "{0} مستخدم متصل"
+msgstr[1] "{0} مستخدمون متصلون"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496
+#, java-format
+msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
+#, java-format
+msgid "Magnet deleted: {0}"
+msgstr "تم حذف ملف مغناطيس: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577
+#, java-format
+msgid "Torrent file deleted: {0}"
+msgstr "تم خذف ملف التورنت: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593
+#, java-format
+msgid "Data file deleted: {0}"
+msgstr "خذف ملف البيانات: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595
+#, java-format
+msgid "Data file could not be deleted: {0}"
+msgstr "فشل في حذف الملف: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604
+#, java-format
+msgid "Data dir deleted: {0}"
+msgstr "حذف مجلد المعطيات: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637
+msgid "Error creating torrent - you must select a tracker"
+msgstr "فشل في انشاء تورنت - عليك اختيار tracker"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653
+#, java-format
+msgid "Torrent created for \"{0}\""
+msgstr "تم انشاء تورنت لـ \"{0}\""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655
+#, java-format
+msgid ""
+"Many I2P trackers require you to register new torrents before seeding - "
+"please do so before starting \"{0}\""
+msgstr ""
+"العديد من trackers يطلبون تسجيل التورنت قبل مشاركتها، قم بذلك قبل البداية {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657
+#, java-format
+msgid "Error creating a torrent for \"{0}\""
+msgstr "فشل في انشاء تورنت لـ \"{0}\""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660
+#, java-format
+msgid "Cannot create a torrent for the nonexistent data: {0}"
+msgstr "لا يمكن انشاء تورنت لبيانات غير موجودة: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
+msgid "Error creating torrent - you must enter a file or directory"
+msgstr "فشل في انشاء تورنت - عليك اختيار ملف أو مجلد"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
+msgid "Stopping all torrents and closing the I2P tunnel."
+msgstr "توقيف جميع التورنت و قفل النفق I2P"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677
+msgid "I2P tunnel closed."
+msgstr "تم قفل النفق"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
+msgid "Opening the I2P tunnel and starting all torrents."
+msgstr "فتح النفق واطلاق جميع التورنت"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814
+msgid "Tracker Error"
+msgstr "Tracker خطأ"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847
+#, java-format
+msgid "1 peer"
+msgid_plural "{0} peers"
+msgstr[0] "{0} نظير"
+msgstr[1] "{0} نظير"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824
+msgid "Seeding"
+msgstr "بشارك"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
+msgid "Complete"
+msgstr "اكتمل"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
+msgid "OK"
+msgstr "موافق"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
+msgid "Stalled"
+msgstr "متوقف"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
+msgid "No Peers"
+msgstr "لا بوجد نظائر"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
+msgid "Stopped"
+msgstr "متوقف"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886
+msgid "Torrent details"
+msgstr "تفاصيل التورنت"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160
+msgid "Info"
+msgstr "معلومات"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913
+msgid "View files"
+msgstr "أظهر الملفات"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915
+msgid "Open file"
+msgstr "فتح ملف"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957
+msgid "Stop the torrent"
+msgstr "قف التورنت"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959
+msgid "Stop"
+msgstr "قف"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969
+msgid "Start the torrent"
+msgstr "ابدأ التورنت"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971
+msgid "Start"
+msgstr "ابدأ"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
+msgid "Remove the torrent from the active list, deleting the .torrent file"
+msgstr "حذف التورنت من القائمة، حذف ملف .torrent"
+
+#. Can't figure out how to escape double quotes inside the onclick string.
+#. Single quotes in translate strings with parameters must be doubled.
+#. Then the remaining single quite must be escaped
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
+#, java-format
+msgid ""
+"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
+"data will not be deleted) ?"
+msgstr ""
+"هل أنت متأكد من حذف الملف \\''{0}.تورنت\\'' (سيتم خذف ايضا الملفات التي تم "
+"تحميلها) ?"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
+msgid "Remove"
+msgstr "حذف"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
+msgid "Delete the .torrent file and the associated data file(s)"
+msgstr "خذف ملف التورنت و الملفات المرتبطة به"
+
+#. Can't figure out how to escape double quotes inside the onclick string.
+#. Single quotes in translate strings with parameters must be doubled.
+#. Then the remaining single quite must be escaped
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
+#, java-format
+msgid ""
+"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
+"data?"
+msgstr "هل أنت متأكد من حذف التورنت \\''{0}\\'' وجمبع البيانات المحملة؟"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
+msgid "Delete"
+msgstr "حذف"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
+msgid "Unknown"
+msgstr "غير معروف"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
+msgid "Seed"
+msgstr "شارك"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077
+msgid "Uninteresting (The peer has no pieces we need)"
+msgstr "غير مهم (النظير لا يحتوي على اجزاء نحتاجها)"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079
+msgid "Choked (The peer is not allowing us to request pieces)"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099
+msgid "Uninterested (We have no pieces the peer needs)"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101
+msgid "Choking (We are not allowing the peer to request pieces)"
+msgstr "مشكلة (لا يمكن الحصول على اجزاء الملف من النظائر)"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159
+#, java-format
+msgid "Details at {0} tracker"
+msgstr "تفاصيل حول {0} tracker"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188
+msgid "Add Torrent"
+msgstr "أضف تورنت"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
+msgid "From URL"
+msgstr "من عنوان"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193
+msgid ""
+"Enter the torrent file download URL (I2P only), magnet link, or maggot link"
+msgstr "ادخل عنوان التورنت لتحميله (فقط على شبكة i2p)"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
+msgid "Add torrent"
+msgstr "أضف تورنت"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201
+#, java-format
+msgid "You can also copy .torrent files to: {0}."
+msgstr "يمكن ايضا .نقل ملفات تورنت الى: {0}."
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203
+msgid "Removing a .torrent will cause it to stop."
+msgstr "سيتم القاف التورنت عند حذف الملف torrent."
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
+msgid "Create Torrent"
+msgstr "أنشئ تورنت"
+
+#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229
+msgid "Data to seed"
+msgstr "البيانات المشاركة"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233
+msgid "File or directory to seed (must be within the specified path)"
+msgstr "الملف او المجلد الذي ترغب في مشاركته "
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
+msgid "Tracker"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
+msgid "Select a tracker"
+msgstr "اختر tracker"
+
+#. out.write(_("Open trackers and DHT only"));
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
+msgid "Open trackers only"
+msgstr "trackers المفتوحة فقط"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
+msgid "or"
+msgstr "أو"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260
+msgid "Specify custom tracker announce URL"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
+msgid "Create torrent"
+msgstr "أنشئ تورنت"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
+msgid "Configuration"
+msgstr "اعدادات"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285
+msgid "Data directory"
+msgstr "مجلد البيانات"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287
+msgid "Edit i2psnark.config and restart to change"
+msgstr "حرر i2psnark.config وأعد التشغيل"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
+msgid "Auto start"
+msgstr "ابدأ عند البداية"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
+msgid "If checked, automatically start torrents that are added"
+msgstr "اذا تم تفعيل، يقوم بتشغيل التورنت تلقائيا عند اضافته"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299
+msgid "Theme"
+msgstr "تيمة"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
+msgid "Startup delay"
+msgstr "تأخر البداية"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314
+msgid "minutes"
+msgstr "دقائق"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
+msgid "Total uploader limit"
+msgstr "اقصى حد للرفع"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341
+msgid "peers"
+msgstr "النظائر"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345
+msgid "Up bandwidth limit"
+msgstr "اقصى حد لسرعة الاتصال"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348
+msgid "Half available bandwidth recommended."
+msgstr "ينصح باستعمال نصف سرعة الشبكة"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
+msgid "View or change router bandwidth"
+msgstr "أظهر أو غير سرعة الموجه"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354
+msgid "Use open trackers also"
+msgstr "استعمال open trackers ايضا"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358
+msgid ""
+"If checked, announce torrents to open trackers as well as the tracker listed "
+"in the torrent file"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362
+msgid "Open tracker announce URLs"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374
+msgid "Inbound Settings"
+msgstr "اعدادت الاتصال الداخلي"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380
+msgid "Outbound Settings"
+msgstr "اعدادت الاتصال الخارجي"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388
+msgid "I2CP host"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393
+msgid "I2CP port"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406
+msgid "I2CP options"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
+msgid "Save configuration"
+msgstr "حفظ الاعدادات"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436
+#, java-format
+msgid "Invalid magnet URL {0}"
+msgstr "غنوان مغناطيس غير صحيح {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470
+#, java-format
+msgid "Invalid info hash in magnet URL {0}"
+msgstr ""
+
+#. * dummies for translation
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500
+#, java-format
+msgid "1 hop"
+msgid_plural "{0} hops"
+msgstr[0] "1 قفزة"
+msgstr[1] "{0} قفزات"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501
+#, java-format
+msgid "1 tunnel"
+msgid_plural "{0} tunnels"
+msgstr[0] "1 نفق"
+msgstr[1] "{0} أنفاق"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663
+msgid "Completion"
+msgstr "انتهاء"
+
+#. else unknown
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
+msgid "Size"
+msgstr "الحجم"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672
+msgid "Files"
+msgstr "الملفات"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674
+msgid "Pieces"
+msgstr "القطع"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675
+msgid "Piece size"
+msgstr "حجم القطعة"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697
+msgid "Magnet link"
+msgstr "وصلة مغناطيس"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753
+msgid "Directory"
+msgstr "المجلد"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
+msgid "Priority"
+msgstr "الأولوية"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728
+msgid "Up to higher level directory"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
+msgid "Torrent not found?"
+msgstr "تورنت غير موجود؟"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767
+msgid "File not found in torrent?"
+msgstr "الملف غير موجود في التورنت؟"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
+msgid "complete"
+msgstr "اكتمل"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781
+msgid "bytes remaining"
+msgstr "البايت المتبقية"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
+msgid "Open"
+msgstr "فتح"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832
+msgid "High"
+msgstr "عالي"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837
+msgid "Normal"
+msgstr "عادي"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842
+msgid "Skip"
+msgstr "تجاوز"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851
+msgid "Save priorities"
+msgstr "حفظ الأولويات"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967
+#, java-format
+msgid "Torrent fetched from {0}"
+msgstr "تم تحميل الملف من {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989
+#, java-format
+msgid "Torrent already running: {0}"
+msgstr "تورنت مفعل: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991
+#, java-format
+msgid "Torrent already in the queue: {0}"
+msgstr "تورنت في قائمة الانتظار: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997
+#, java-format
+msgid "Torrent at {0} was not valid"
+msgstr "تورنت غير صحيح {0} "
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004
+#, java-format
+msgid "Torrent was not retrieved from {0}"
+msgstr "لم يتم تحميل التورنت من {0}"
diff --git a/apps/i2psnark/locale/messages_de.po b/apps/i2psnark/locale/messages_de.po
index ed5934f52a65c0fe513e8ff7d38daf7de16639b5..8cb0ab1bf7ef6f9fe120f2d739410ec9e7420251 100644
--- a/apps/i2psnark/locale/messages_de.po
+++ b/apps/i2psnark/locale/messages_de.po
@@ -8,851 +8,1014 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P i2psnark\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-12 23:30+0000\n"
-"PO-Revision-Date: 2010-12-19 04:37+0100\n"
-"Last-Translator: mixxy <m1xxy@mail.i2p>\n"
+"POT-Creation-Date: 2011-03-03 18:28+0000\n"
+"PO-Revision-Date: 2011-02-27 17:33+0100\n"
+"Last-Translator: \n"
 "Language-Team: foo <foo@bar>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 "X-Poedit-Language: German\n"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:94
-#, java-format
-msgid "Adding torrents in {0} minutes"
-msgstr "Füge Torrents in {0} Minuten hinzu ..."
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:296
+#: ../java/src/org/klomp/snark/SnarkManager.java:307
 #, java-format
 msgid "Total uploaders limit changed to {0}"
 msgstr "Gesamtanzahl an Uploadslots geändert auf {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:298
+#: ../java/src/org/klomp/snark/SnarkManager.java:309
 #, java-format
 msgid "Minimum total uploaders limit is {0}"
 msgstr "Minimale Anzahl an Uploadslots ist {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:310
+#: ../java/src/org/klomp/snark/SnarkManager.java:321
 #, java-format
 msgid "Up BW limit changed to {0}KBps"
 msgstr "Upload Bandbreite wurde auf {0}kbyte/s geändert."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:312
+#: ../java/src/org/klomp/snark/SnarkManager.java:323
 #, java-format
 msgid "Minimum up bandwidth limit is {0}KBps"
 msgstr "Minimales Limit der Upload-Bandbreite ist {0} kbyte/s."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:324
+#: ../java/src/org/klomp/snark/SnarkManager.java:335
 #, java-format
-msgid "Startup delay limit changed to {0} minutes"
-msgstr "Startverzögerung auf {0} Minuten gesetzt"
+msgid "Startup delay changed to {0}"
+msgstr "Startverzögerung auf {0} gesetzt"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:371
+#: ../java/src/org/klomp/snark/SnarkManager.java:386
 msgid "I2CP and tunnel changes will take effect after stopping all torrents"
-msgstr "Änderungen an I2CP und am Tunnel werden nach dem Stoppen aller Torrents wirksam"
+msgstr ""
+"Änderungen an I2CP und am Tunnel werden nach dem Stoppen aller Torrents "
+"wirksam"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:378
+#: ../java/src/org/klomp/snark/SnarkManager.java:393
 msgid "Disconnecting old I2CP destination"
 msgstr "Trenne das alte I2CP Ziel"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:382
+#: ../java/src/org/klomp/snark/SnarkManager.java:397
 #, java-format
 msgid "I2CP settings changed to {0}"
 msgstr "I2CP Einstellungen geändert auf {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:386
-msgid "Unable to connect with the new settings, reverting to the old I2CP settings"
-msgstr "Verbinden mit den neuen Einstellungen nicht möglich, benutze wieder die alten I2CP-Einstellungen"
+#: ../java/src/org/klomp/snark/SnarkManager.java:402
+msgid ""
+"Unable to connect with the new settings, reverting to the old I2CP settings"
+msgstr ""
+"Verbinden mit den neuen Einstellungen nicht möglich, benutze wieder die "
+"alten I2CP-Einstellungen"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:390
+#: ../java/src/org/klomp/snark/SnarkManager.java:406
 msgid "Unable to reconnect with the old settings!"
 msgstr "Verbinden mit den alten Einstellungen nicht möglich!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:392
+#: ../java/src/org/klomp/snark/SnarkManager.java:408
 msgid "Reconnected on the new I2CP destination"
 msgstr "Verbunden auf dem neuem I2CP-Ziel"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:403
+#: ../java/src/org/klomp/snark/SnarkManager.java:418
 #, java-format
 msgid "I2CP listener restarted for \"{0}\""
 msgstr "I2CP-Verbindung neu gestartet für \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:414
+#: ../java/src/org/klomp/snark/SnarkManager.java:429
 msgid "Enabled autostart"
 msgstr "Aktiviere Autostart"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:416
+#: ../java/src/org/klomp/snark/SnarkManager.java:431
 msgid "Disabled autostart"
 msgstr "Deaktiviere Autostart"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:422
+#: ../java/src/org/klomp/snark/SnarkManager.java:437
 msgid "Enabled open trackers - torrent restart required to take effect."
-msgstr "OpenTracker aktiviert - Um dies anzuwenden, müssen die Torrents neu gestartet werden."
+msgstr ""
+"OpenTracker aktiviert - Um dies anzuwenden, müssen die Torrents neu "
+"gestartet werden."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:424
+#: ../java/src/org/klomp/snark/SnarkManager.java:439
 msgid "Disabled open trackers - torrent restart required to take effect."
-msgstr "OpenTracker deaktiviert - Um dies anzuwenden, müssen die Torrents neu gestartet werden."
+msgstr ""
+"OpenTracker deaktiviert - Um dies anzuwenden, müssen die Torrents neu "
+"gestartet werden."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:431
+#: ../java/src/org/klomp/snark/SnarkManager.java:447
 msgid "Open Tracker list changed - torrent restart required to take effect."
-msgstr "OpenTracker-Liste geändert - Um dies anzuwenden, müssen die Torrents neu gestartet werden"
+msgstr ""
+"OpenTracker-Liste geändert - Um dies anzuwenden, müssen die Torrents neu "
+"gestartet werden"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:438
+#: ../java/src/org/klomp/snark/SnarkManager.java:454
 #, java-format
 msgid "{0} theme loaded, return to main i2psnark page to view."
-msgstr "Thema {0} geladen. Gehen Sie zurück zur Hauptseite von i2psnark, um die Änderungen zu sehen!"
+msgstr ""
+"Thema {0} geladen. Gehen Sie zurück zur Hauptseite von i2psnark, um die "
+"Änderungen zu sehen!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:445
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
 msgid "Configuration unchanged."
 msgstr "Konfiguration nicht geändert."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:455
+#: ../java/src/org/klomp/snark/SnarkManager.java:471
 #, java-format
 msgid "Unable to save the config to {0}"
 msgstr "Konnte Konfiguration nicht in {0} speichern"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:494
+#: ../java/src/org/klomp/snark/SnarkManager.java:536
 msgid "Connecting to I2P"
 msgstr "Verbinde mit I2P"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:497
+#: ../java/src/org/klomp/snark/SnarkManager.java:539
 msgid "Error connecting to I2P - check your I2CP settings!"
-msgstr "Fehler beim Verbinden mit I2P - Kontrollieren Sie die I2CP-Einstellungen!"
+msgstr ""
+"Fehler beim Verbinden mit I2P - Kontrollieren Sie die I2CP-Einstellungen!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:506
+#: ../java/src/org/klomp/snark/SnarkManager.java:548
 #, java-format
 msgid "Error: Could not add the torrent {0}"
 msgstr "Fehler: Konnte den Torrent \"{0}\" nicht hinzufügen"
 
 #. catch this here so we don't try do delete it below
-#: ../java/src/org/klomp/snark/SnarkManager.java:528
+#: ../java/src/org/klomp/snark/SnarkManager.java:570
 #, java-format
 msgid "Cannot open \"{0}\""
 msgstr "Kann dies nicht öffnen: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:541
+#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
+#: ../java/src/org/klomp/snark/SnarkManager.java:586
+#: ../java/src/org/klomp/snark/SnarkManager.java:661
+#: ../java/src/org/klomp/snark/SnarkManager.java:716
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976
 #, java-format
-msgid "Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only"
-msgstr "Warnung - Ignoriere nicht-I2P Tracker in \"{0}\", werde nur bei I2P-OpenTrackern bekanntgeben"
+msgid "Torrent with this info hash is already running: {0}"
+msgstr "Torrent mit diesem Infohash läuft schon: {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:543
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:593
 #, java-format
-msgid "Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!"
-msgstr "Warnung - Ignoriere nicht-I2P Tracker in \"{0}\" und OpenTracker sind deaktiviert. Sie müssen OpenTracker aktivieren, bevor Sie den Torrent starten!"
+msgid ""
+"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers "
+"only."
+msgstr ""
+"Warnung - keine I2P Tracker in \"{0}\", werde nur bei I2P-OpenTrackern "
+"bekanntgeben"
+
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:598
+#, java-format
+msgid ""
+"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is "
+"enabled before starting this torrent."
+msgstr ""
+"Warnung - keine I2P-Tracker in \"{0}\" gefunden. Stell sicher, dass "
+"OpenTracker aktiviert sind, bevor du diesen Torrent startest!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:563
+#: ../java/src/org/klomp/snark/SnarkManager.java:619
 #, java-format
 msgid "Torrent in \"{0}\" is invalid"
 msgstr "Torrent in \"{0}\" ist nicht gültig"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:578
+#: ../java/src/org/klomp/snark/SnarkManager.java:624
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999
+#, java-format
+msgid "ERROR - Out of memory, cannot create torrent from {0}"
+msgstr ""
+"Fehler - unzureichender Arbeitsspeicher, kann keinen Torrent von {0} "
+"erstellen."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:635
 #, java-format
 msgid "Torrent added and started: \"{0}\""
 msgstr "Torrent hinzugefügt und gestartet: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:580
+#: ../java/src/org/klomp/snark/SnarkManager.java:637
 #, java-format
 msgid "Torrent added: \"{0}\""
 msgstr "Torrent hinzugefügt: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:734
+#: ../java/src/org/klomp/snark/SnarkManager.java:672
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490
+#, java-format
+msgid "Fetching {0}"
+msgstr "Hole {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:675
+#, java-format
+msgid ""
+"We have no saved peers and no other torrents are running. Fetch of {0} will "
+"not succeed until you start another torrent."
+msgstr ""
+"Wir haben keine Gespeicherten Teilnehmer und keine anderen aktiven Torrents. "
+"Das Herunterladen von {0} kann nicht erfolgen, solange du keinen anderen "
+"Torrent startest."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:679
+#, java-format
+msgid "Adding {0}"
+msgstr "Hinzufügen {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:726
+#: ../java/src/org/klomp/snark/SnarkManager.java:749
+#: ../java/src/org/klomp/snark/SnarkManager.java:1174
+#, java-format
+msgid "Failed to copy torrent file to {0}"
+msgstr "Konnte Torrent-Datei nicht nach {0} kopieren"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:972
 #, java-format
 msgid "Too many files in \"{0}\" ({1}), deleting it!"
 msgstr "Zu viele Dateien in  \"{0}\" ({1}), wird gelöscht! "
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:736
+#: ../java/src/org/klomp/snark/SnarkManager.java:974
 #, java-format
 msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
 msgstr "Torrentdatei \"{0}\" darf nicht auf '.torrent' enden, wird gelöscht!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:738
+#: ../java/src/org/klomp/snark/SnarkManager.java:976
 #, java-format
 msgid "No pieces in \"{0}\",  deleting it!"
 msgstr "Keine Teile in \"{0}\", wird entfernt!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:740
+#: ../java/src/org/klomp/snark/SnarkManager.java:978
 #, java-format
 msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
 msgstr "Zu viele Teile in  \"{0}\", das Limit sind {1}, werden gelöscht!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:742
+#: ../java/src/org/klomp/snark/SnarkManager.java:980
 #, java-format
 msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
 msgstr "Teile in \"{0}\" sind zu groß ({1}B), lösche es."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:743
+#: ../java/src/org/klomp/snark/SnarkManager.java:981
 #, java-format
 msgid "Limit is {0}B"
 msgstr "Limit ist \"{0}\"Bytes"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:751
+#: ../java/src/org/klomp/snark/SnarkManager.java:989
 #, java-format
 msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
-msgstr "Torrents größer als \"{0}\"Bytes werden nicht unterstützt, lösche \"{1}\"."
+msgstr ""
+"Torrents größer als \"{0}\"Bytes werden nicht unterstützt, lösche \"{1}\"."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:767
+#: ../java/src/org/klomp/snark/SnarkManager.java:1005
 #, java-format
 msgid "Error: Could not remove the torrent {0}"
 msgstr "Fehler: Konnte den Torrent \"{0}\" nicht entfernen"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:794
+#: ../java/src/org/klomp/snark/SnarkManager.java:1026
+#: ../java/src/org/klomp/snark/SnarkManager.java:1044
 #, java-format
 msgid "Torrent stopped: \"{0}\""
 msgstr "Torrent angehalten: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:814
+#: ../java/src/org/klomp/snark/SnarkManager.java:1065
 #, java-format
 msgid "Torrent removed: \"{0}\""
 msgstr "Torrent entfernt: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:852
+#: ../java/src/org/klomp/snark/SnarkManager.java:1073
+#, java-format
+msgid "Adding torrents in {0}"
+msgstr "Füge Torrents in {0} hinzu ..."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1122
 #, java-format
 msgid "Download finished: {0}"
 msgstr "vollständig heruntergeladen:\"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:880
+#: ../java/src/org/klomp/snark/SnarkManager.java:1170
+#, java-format
+msgid "Metainfo received for {0}"
+msgstr "Metainfo für {0} erhalten"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1171
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525
+#, java-format
+msgid "Starting up torrent {0}"
+msgstr "Starte Torrent {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1225
 msgid "Unable to connect to I2P!"
 msgstr "Konnte mich nicht mit I2P verbinden!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:886
+#: ../java/src/org/klomp/snark/SnarkManager.java:1231
 #, java-format
 msgid "Unable to add {0}"
 msgstr "Konnte {0} nicht hinzufügen."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
 msgid "I2PSnark - Anonymous BitTorrent Client"
 msgstr "I2PSnark - Anonymer BitTorrent-Klient"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218
 msgid "Torrents"
 msgstr "Torrents"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:201
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:208
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
 msgid "I2PSnark"
 msgstr "I2PSnark"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225
 msgid "Refresh page"
 msgstr "Aktualisiere Seite"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230
 msgid "Forum"
 msgstr "Forum"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719
 msgid "Status"
 msgstr "Zustand"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292
 msgid "Hide Peers"
 msgstr "Teilnehmer ausblenden"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:279
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299
 msgid "Show Peers"
 msgstr "Teilnehmer einblenden"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659
 msgid "Torrent"
 msgstr "Torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310
 msgid "Estimated time remaining"
 msgstr "geschätzte verbleibende Zeit"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:293
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313
 msgid "ETA"
 msgstr "Dauer"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
 msgid "Downloaded"
 msgstr "heruntergeladen"
 
 # NOTE: purposely left blank to leave more room in the table header
 # msgstr "heruntergeladen"
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:314
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
 msgid "RX"
 msgstr " "
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
 msgid "Uploaded"
 msgstr "hochgeladen"
 
 # NOTE: purposely left blank to leave more room in the table header
 # msgstr "hochgeladen"
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
 msgid "TX"
 msgstr " "
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332
 msgid "Down Rate"
 msgstr "eingehend"
 
 # NOTE: purposely left blank to leave more room in the table header
 # msgstr "Ãœbertragung"
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
 msgid "Rate"
 msgstr " "
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
 msgid "Up Rate"
 msgstr "ausgehend"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
 msgid "Stop all torrents and the I2P tunnel"
 msgstr "Stoppe alle Torrents und den I2P-Tunnel"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367
 msgid "Stop All"
 msgstr "Stoppe alle"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376
 msgid "Start all torrents and the I2P tunnel"
 msgstr "Starte alle Torrents und den I2P-Tunnel"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378
 msgid "Start All"
 msgstr "Starte alle"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
 msgid "No torrents loaded."
 msgstr "keine Torrents geladen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402
 msgid "Totals"
 msgstr "Gesamt"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
 #, java-format
 msgid "1 torrent"
 msgid_plural "{0} torrents"
 msgstr[0] "1 Torrent"
 msgstr[1] "{0} Torrents"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:382
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
 #, java-format
 msgid "1 connected peer"
 msgid_plural "{0} connected peers"
 msgstr[0] "1 verbundener Teilnehmer"
 msgstr[1] "{0} verbundene Teilnehmer"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496
 #, java-format
-msgid "Fetching {0}"
-msgstr "Hole {0}"
+msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
+msgstr "ungültige URL - muss mit \"http://\", \"{0}\", oder \"{1}\" anfangen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458
-msgid "Invalid URL - must start with http://"
-msgstr "Ungültige URL - muss mit http:// anfangen"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:489
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
 #, java-format
-msgid "Starting up torrent {0}"
-msgstr "Starte Torrent {0}"
+msgid "Magnet deleted: {0}"
+msgstr "Magnetlink wurde gelöscht: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577
 #, java-format
 msgid "Torrent file deleted: {0}"
 msgstr "Torrentdatei gelöscht: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:533
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:543
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593
 #, java-format
 msgid "Data file deleted: {0}"
 msgstr "Daten gelöscht: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595
 #, java-format
 msgid "Data file could not be deleted: {0}"
 msgstr "Daten konnten nicht gelöscht werden: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604
 #, java-format
 msgid "Data dir deleted: {0}"
 msgstr "Datenverzeichnis wurde gelöscht: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637
 msgid "Error creating torrent - you must select a tracker"
-msgstr "Fehler beim Erstellen des Torrents - Sie müssen einen Tracker auswählen!"
+msgstr ""
+"Fehler beim Erstellen des Torrents - Sie müssen einen Tracker auswählen!"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653
 #, java-format
 msgid "Torrent created for \"{0}\""
 msgstr "Torrent erstellt für \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655
 #, java-format
-msgid "Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\""
-msgstr "Viele I2P-Tracker erfordern eine Registrierung, bevor der Torrent verteilt wird. Bitte tun Sie dies vor dem Start von \"{0}\"!"
+msgid ""
+"Many I2P trackers require you to register new torrents before seeding - "
+"please do so before starting \"{0}\""
+msgstr ""
+"Viele I2P-Tracker erfordern eine Registrierung, bevor der Torrent verteilt "
+"wird. Bitte tun Sie dies vor dem Start von \"{0}\"!"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:607
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657
 #, java-format
 msgid "Error creating a torrent for \"{0}\""
 msgstr "Fehler beim Erstellen eines Torrents für \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660
 #, java-format
 msgid "Cannot create a torrent for the nonexistent data: {0}"
 msgstr "Kann keinen Torrent für nicht existente Daten erstellen: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
 msgid "Error creating torrent - you must enter a file or directory"
-msgstr "Fehler beim Erstellen des Torrents - Sie müssen eine Datei oder ein Verzeichnis angeben."
+msgstr ""
+"Fehler beim Erstellen des Torrents - Sie müssen eine Datei oder ein "
+"Verzeichnis angeben."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
 msgid "Stopping all torrents and closing the I2P tunnel."
 msgstr "Stoppe alle Torrents und beende den I2P-Tunnel."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677
 msgid "I2P tunnel closed."
 msgstr "I2P-Tunnel geschlossen."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
 msgid "Opening the I2P tunnel and starting all torrents."
 msgstr "Öffne den I2P-Tunnel und starte alle Torrents."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:764
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814
 msgid "Tracker Error"
 msgstr "Trackerfehler"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:766
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:778
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:782
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:790
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847
 #, java-format
 msgid "1 peer"
 msgid_plural "{0} peers"
 msgstr[0] "1 Teilnehmer"
 msgstr[1] "{0} Teilnehmern"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824
 msgid "Seeding"
 msgstr "Verteile"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:784
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
 msgid "Complete"
 msgstr "vollständig"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
 msgid "OK"
 msgstr "OK"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
 msgid "Stalled"
 msgstr "Stillstand"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
 msgid "No Peers"
 msgstr "keine Teilnehmer"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
 msgid "Stopped"
 msgstr "angehalten"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837
-#, java-format
-msgid "Details at {0} tracker"
-msgstr "Details beim Tracker {0}"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886
+msgid "Torrent details"
+msgstr "Details"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160
 msgid "Info"
 msgstr "Info"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913
 msgid "View files"
 msgstr "Zeige Dateien"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915
 msgid "Open file"
 msgstr "Öffne Datei"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:865
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569
-msgid "Open"
-msgstr "Öffnen"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957
 msgid "Stop the torrent"
 msgstr "Torrent stoppen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959
 msgid "Stop"
 msgstr "Stopp"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969
 msgid "Start the torrent"
 msgstr "Torrent starten"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971
 msgid "Start"
 msgstr "Start"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
 msgid "Remove the torrent from the active list, deleting the .torrent file"
-msgstr "entfernt den Torrent von der aktiven Liste und löscht die .torrent-Datei"
+msgstr ""
+"entfernt den Torrent von der aktiven Liste und löscht die .torrent-Datei"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
 #, java-format
-msgid "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?"
-msgstr "Sind Sie sicher, dass Sie die Datei  \\''{0}.torrent\\'' löschen wollen? (Heruntergeladene Daten werden nicht gelöscht.)"
+msgid ""
+"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
+"data will not be deleted) ?"
+msgstr ""
+"Sind Sie sicher, dass Sie die Datei  \\''{0}.torrent\\'' löschen wollen? "
+"(Heruntergeladene Daten werden nicht gelöscht.)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:941
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
 msgid "Remove"
 msgstr "Entfernen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:950
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
 msgid "Delete the .torrent file and the associated data file(s)"
 msgstr "löscht die .torrent-Datei und dazugehörige Daten Datei(en)"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
 #, java-format
-msgid "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?"
-msgstr "Sind Sie sicher, dass Sie die Torrentdatei \\''{0}\\'' und alle heruntergeladenen Daten löschen wollen?"
+msgid ""
+"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
+"data?"
+msgstr ""
+"Sind Sie sicher, dass Sie die Torrentdatei \\''{0}\\'' und alle "
+"heruntergeladenen Daten löschen wollen?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
 msgid "Delete"
 msgstr "Löschen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:991
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
 msgid "Unknown"
 msgstr "Unbekannt"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
 msgid "Seed"
 msgstr "Quelle"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077
 msgid "Uninteresting (The peer has no pieces we need)"
 msgstr "uninteressant (Der Teilnehmer hat keine Teile, die wir benötigen)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079
 msgid "Choked (The peer is not allowing us to request pieces)"
 msgstr "gedrosselt (Der Teilnehmer hat uns nicht erlaubt, Teile anzufordern)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099
 msgid "Uninterested (We have no pieces the peer needs)"
 msgstr "uninteressiert (Wir haben keine Teile, die der Teilnehmer benötigt)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101
 msgid "Choking (We are not allowing the peer to request pieces)"
 msgstr "gedrosselt (Wir erlauben dem Teilnehmer nicht, Teile anzufordern)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1092
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159
+#, java-format
+msgid "Details at {0} tracker"
+msgstr "Details beim Tracker {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188
 msgid "Add Torrent"
 msgstr "Torrent hinzufügen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
 msgid "From URL"
 msgstr "Quell-URL"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1097
-msgid "Torrent file must originate from an I2P-based tracker"
-msgstr "Die Torrentdatei muss von einem Tracker in I2P stammen."
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193
+msgid ""
+"Enter the torrent file download URL (I2P only), magnet link, or maggot link"
+msgstr ""
+"Gib die Download-URL der torrent-Datei (nur I2P), einen Magnet- oder einen "
+"Maggotlink an!"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
 msgid "Add torrent"
 msgstr "Füge Torrent hinzu"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201
 #, java-format
 msgid "You can also copy .torrent files to: {0}."
 msgstr "Alternativ können Sie die .torrent-Dateien auch nach {0} kopieren."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203
 msgid "Removing a .torrent will cause it to stop."
 msgstr "Das Entfernen der .torrent-Datei stoppt den jeweiligen Torrent."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
 msgid "Create Torrent"
 msgstr "Torrent erstellen"
 
 #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229
 msgid "Data to seed"
 msgstr "Daten zum Verteilen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1138
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233
 msgid "File or directory to seed (must be within the specified path)"
 msgstr "Datei oder Verzeichnis zum Verteilen (muss im angegebenen Pfad sein)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1140
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
 msgid "Tracker"
 msgstr "Tracker"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
 msgid "Select a tracker"
 msgstr "Wähle einen Tracker"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1155
+#. out.write(_("Open trackers and DHT only"));
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
+msgid "Open trackers only"
+msgstr "Benutze nur OpenTracker"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
 msgid "or"
 msgstr "oder"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1158
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260
 msgid "Specify custom tracker announce URL"
 msgstr "Geben Sie eine Tracker-Announce-URL an!"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
 msgid "Create torrent"
 msgstr "Erstelle Torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1180
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
 msgid "Configuration"
 msgstr "Einstellungen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1184
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285
 msgid "Data directory"
 msgstr "Datenverzeichnis"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287
 msgid "Edit i2psnark.config and restart to change"
 msgstr "Zum Ändern, bearbeite die i2psnark.config und starte neu!"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
 msgid "Auto start"
 msgstr "Autostart"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
 msgid "If checked, automatically start torrents that are added"
 msgstr "Wenn markiert, werden hinzugefügte Torrents automatisch gestartet."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299
 msgid "Theme"
 msgstr "Aufmachung"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
 msgid "Startup delay"
 msgstr "Startverzögerung"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1213
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314
 msgid "minutes"
 msgstr "Minuten"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
 msgid "Total uploader limit"
 msgstr "Gesamtlimit an Hochladern"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341
 msgid "peers"
 msgstr "Teilnehmer"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345
 msgid "Up bandwidth limit"
 msgstr "Bandbreitenbegrenzung beim Hochladen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348
 msgid "Half available bandwidth recommended."
 msgstr "Halbe verfügbare Bandbreite wird empfohlen."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
 msgid "View or change router bandwidth"
 msgstr "Routerbandbreite ansehen oder ändern"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354
 msgid "Use open trackers also"
 msgstr "Benutze auch OpenTracker"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
-msgid "If checked, announce torrents to open trackers as well as the tracker listed in the torrent file"
-msgstr "Wenn markiert, wird der Torrent neben dem angegebenen Tracker auch bei den OpenTrackern bekannt gegeben."
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358
+msgid ""
+"If checked, announce torrents to open trackers as well as the tracker listed "
+"in the torrent file"
+msgstr ""
+"Wenn markiert, wird der Torrent neben dem angegebenen Tracker auch bei den "
+"OpenTrackern bekannt gegeben."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362
 msgid "Open tracker announce URLs"
 msgstr "OpenTracker-Announce-URLs"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1273
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374
 msgid "Inbound Settings"
 msgstr "Einstellungen eingehend"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380
 msgid "Outbound Settings"
 msgstr "Einstellungen ausgehend"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388
 msgid "I2CP host"
 msgstr "I2CP-Host"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393
 msgid "I2CP port"
 msgstr "I2CP-Port"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1303
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406
 msgid "I2CP options"
 msgstr "I2CP-Optionen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1308
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
 msgid "Save configuration"
 msgstr "Einstellungen speichern"
 
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436
+#, java-format
+msgid "Invalid magnet URL {0}"
+msgstr "ungültige Magnet-URL {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470
+#, java-format
+msgid "Invalid info hash in magnet URL {0}"
+msgstr "ungültiger Infohash im Magnetlink {0}"
+
 #. * dummies for translation
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1325
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500
 #, java-format
 msgid "1 hop"
 msgid_plural "{0} hops"
 msgstr[0] "1 Zwischenstation"
 msgstr[1] "{0} Zwischenstationen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501
 #, java-format
 msgid "1 tunnel"
 msgid_plural "{0} tunnels"
 msgstr[0] "1 Tunnel"
 msgstr[1] "{0} Tunnel"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663
+msgid "Completion"
+msgstr "Fortschritt"
+
+#. else unknown
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
 msgid "Size"
 msgstr "Größe"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672
+msgid "Files"
+msgstr "Dateien"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674
+msgid "Pieces"
+msgstr "Stücke"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675
+msgid "Piece size"
+msgstr "Stückgröße"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697
+msgid "Magnet link"
+msgstr "Magnetlink"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753
+msgid "Directory"
+msgstr "Verzeichnis"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
 msgid "Priority"
 msgstr "Priorität"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728
 msgid "Up to higher level directory"
 msgstr "Eine Hierarchie nach oben"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517
-msgid "Directory"
-msgstr "Verzeichnis"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
 msgid "Torrent not found?"
 msgstr "Torrentdatei nicht gefunden?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767
 msgid "File not found in torrent?"
 msgstr "Datei nicht gefunden im Torrent?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
 msgid "complete"
 msgstr "vollständig"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781
 msgid "bytes remaining"
 msgstr "Bytes ausstehend"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
+msgid "Open"
+msgstr "Öffnen"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832
 msgid "High"
 msgstr "hoch"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1600
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837
 msgid "Normal"
 msgstr "normal"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1605
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842
 msgid "Skip"
 msgstr "auslassen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1614
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851
 msgid "Save priorities"
 msgstr "Prioritäten speichern"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967
 #, java-format
 msgid "Torrent fetched from {0}"
 msgstr "Torrent geholt von {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1746
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989
 #, java-format
 msgid "Torrent already running: {0}"
 msgstr "Torrent läuft schon: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991
 #, java-format
 msgid "Torrent already in the queue: {0}"
 msgstr "Torrent ist schon in der Warteschlange: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755
-#, java-format
-msgid "Failed to copy torrent file to {0}"
-msgstr "Konnte Torrent-Datei nicht nach {0} kopieren"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997
 #, java-format
 msgid "Torrent at {0} was not valid"
 msgstr "Torrent in {0} war nicht gültig"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004
 #, java-format
 msgid "Torrent was not retrieved from {0}"
 msgstr "Torrent wurde nicht geladen von {0}"
 
+#~ msgid "Torrent file must originate from an I2P-based tracker"
+#~ msgstr "Die Torrentdatei muss von einem Tracker in I2P stammen."
+
 #~ msgid " theme locked and loaded."
 #~ msgstr "Aufmachung geladen"
+
 #~ msgid "Estimated Download Time"
 #~ msgstr "geschätzte verbleibende Zeit bis zur Fertigstellung"
+
 #~ msgid "Torrent file {0} does not exist"
 #~ msgstr "Torrentdatei {0} existiert nicht"
+
 #~ msgid "Copying torrent to {0}"
 #~ msgstr "Kopiere Torrent nach {0}"
+
 #~ msgid "from {0}"
 #~ msgstr "von {0}"
+
 #~ msgid "Downloading"
 #~ msgstr "lade herunter"
-#~ msgid "File"
-#~ msgstr "Datei"
+
 #~ msgid "FileSize"
 #~ msgstr "Größe"
+
 #~ msgid "Download Status"
 #~ msgstr "Zustand"
+
 #~ msgid "size: {0}B"
 #~ msgstr "Größe: {0}Byte"
+
 #~ msgid "Directory to store torrents and data"
 #~ msgstr "Verzeichnis zum Speichern von Torrentdateien und Daten"
+
 #~ msgid "Do not download"
 #~ msgstr "nicht herunterladen"
+
 #~ msgid "Details"
 #~ msgstr "Details"
+
 #~ msgid "Cannot change the I2CP settings while torrents are active"
 #~ msgstr ""
 #~ "Kann nicht die I2CP Einstellungen ändern während Torrents aktiv sind."
+
 #~ msgid "Non-i2p tracker in \"{0}\", deleting it from our list of trackers!"
 #~ msgstr ""
 #~ "Nicht-I2P Tracker in\"{0}\", entferne ihn aus unserer Liste der Tracker!"
+
 #~ msgid "{0} torrents"
 #~ msgstr "{0} Torrents"
+
 #~ msgid "Uninteresting"
 #~ msgstr "nicht interessiert"
+
 #~ msgid "Choked"
 #~ msgstr "Gestaut"
+
 #~ msgid "Uninterested"
 #~ msgstr "Nicht interessiert"
+
 #~ msgid "Choking"
 #~ msgstr "Stau"
+
 #~ msgid "Custom tracker URL"
 #~ msgstr "Spezifische Tracker URL"
+
 #~ msgid "Configure"
 #~ msgstr "Einstellungen"
-
diff --git a/apps/i2psnark/locale/messages_en.po b/apps/i2psnark/locale/messages_en.po
new file mode 100644
index 0000000000000000000000000000000000000000..e88100e853dbf907737b64e526208885e3f4c649
--- /dev/null
+++ b/apps/i2psnark/locale/messages_en.po
@@ -0,0 +1,909 @@
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P i2psnark\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-03 18:28+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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:307
+#, java-format
+msgid "Total uploaders limit changed to {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:309
+#, java-format
+msgid "Minimum total uploaders limit is {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:321
+#, java-format
+msgid "Up BW limit changed to {0}KBps"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:323
+#, java-format
+msgid "Minimum up bandwidth limit is {0}KBps"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:335
+#, java-format
+msgid "Startup delay changed to {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:386
+msgid "I2CP and tunnel changes will take effect after stopping all torrents"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:393
+msgid "Disconnecting old I2CP destination"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:397
+#, java-format
+msgid "I2CP settings changed to {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:402
+msgid ""
+"Unable to connect with the new settings, reverting to the old I2CP settings"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:406
+msgid "Unable to reconnect with the old settings!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:408
+msgid "Reconnected on the new I2CP destination"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:418
+#, java-format
+msgid "I2CP listener restarted for \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:429
+msgid "Enabled autostart"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:431
+msgid "Disabled autostart"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:437
+msgid "Enabled open trackers - torrent restart required to take effect."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:439
+msgid "Disabled open trackers - torrent restart required to take effect."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:447
+msgid "Open Tracker list changed - torrent restart required to take effect."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:454
+#, java-format
+msgid "{0} theme loaded, return to main i2psnark page to view."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
+msgid "Configuration unchanged."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:471
+#, java-format
+msgid "Unable to save the config to {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:536
+msgid "Connecting to I2P"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:539
+msgid "Error connecting to I2P - check your I2CP settings!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:548
+#, java-format
+msgid "Error: Could not add the torrent {0}"
+msgstr ""
+
+#. catch this here so we don't try do delete it below
+#: ../java/src/org/klomp/snark/SnarkManager.java:570
+#, java-format
+msgid "Cannot open \"{0}\""
+msgstr ""
+
+#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
+#: ../java/src/org/klomp/snark/SnarkManager.java:586
+#: ../java/src/org/klomp/snark/SnarkManager.java:661
+#: ../java/src/org/klomp/snark/SnarkManager.java:716
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976
+#, java-format
+msgid "Torrent with this info hash is already running: {0}"
+msgstr ""
+
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:593
+#, java-format
+msgid ""
+"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers "
+"only."
+msgstr ""
+
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:598
+#, java-format
+msgid ""
+"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is "
+"enabled before starting this torrent."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:619
+#, java-format
+msgid "Torrent in \"{0}\" is invalid"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:624
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999
+#, java-format
+msgid "ERROR - Out of memory, cannot create torrent from {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:635
+#, java-format
+msgid "Torrent added and started: \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:637
+#, java-format
+msgid "Torrent added: \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:672
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490
+#, java-format
+msgid "Fetching {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:675
+#, java-format
+msgid ""
+"We have no saved peers and no other torrents are running. Fetch of {0} will "
+"not succeed until you start another torrent."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:679
+#, java-format
+msgid "Adding {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:726
+#: ../java/src/org/klomp/snark/SnarkManager.java:749
+#: ../java/src/org/klomp/snark/SnarkManager.java:1174
+#, java-format
+msgid "Failed to copy torrent file to {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:972
+#, java-format
+msgid "Too many files in \"{0}\" ({1}), deleting it!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:974
+#, java-format
+msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:976
+#, java-format
+msgid "No pieces in \"{0}\",  deleting it!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:978
+#, java-format
+msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:980
+#, java-format
+msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:981
+#, java-format
+msgid "Limit is {0}B"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:989
+#, java-format
+msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1005
+#, java-format
+msgid "Error: Could not remove the torrent {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1026
+#: ../java/src/org/klomp/snark/SnarkManager.java:1044
+#, java-format
+msgid "Torrent stopped: \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1065
+#, java-format
+msgid "Torrent removed: \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1073
+#, java-format
+msgid "Adding torrents in {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1122
+#, java-format
+msgid "Download finished: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1170
+#, java-format
+msgid "Metainfo received for {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1171
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525
+#, java-format
+msgid "Starting up torrent {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1225
+msgid "Unable to connect to I2P!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1231
+#, java-format
+msgid "Unable to add {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
+msgid "I2PSnark - Anonymous BitTorrent Client"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218
+msgid "Torrents"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
+msgid "I2PSnark"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225
+msgid "Refresh page"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230
+msgid "Forum"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719
+msgid "Status"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292
+msgid "Hide Peers"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299
+msgid "Show Peers"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659
+msgid "Torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310
+msgid "Estimated time remaining"
+msgstr ""
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313
+msgid "ETA"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
+msgid "Downloaded"
+msgstr ""
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
+msgid "RX"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
+msgid "Uploaded"
+msgstr ""
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
+msgid "TX"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332
+msgid "Down Rate"
+msgstr ""
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
+msgid "Rate"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+msgid "Up Rate"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
+msgid "Stop all torrents and the I2P tunnel"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367
+msgid "Stop All"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376
+msgid "Start all torrents and the I2P tunnel"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378
+msgid "Start All"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
+msgid "No torrents loaded."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402
+msgid "Totals"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
+#, java-format
+msgid "1 torrent"
+msgid_plural "{0} torrents"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
+#, java-format
+msgid "1 connected peer"
+msgid_plural "{0} connected peers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496
+#, java-format
+msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
+#, java-format
+msgid "Magnet deleted: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577
+#, java-format
+msgid "Torrent file deleted: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593
+#, java-format
+msgid "Data file deleted: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595
+#, java-format
+msgid "Data file could not be deleted: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604
+#, java-format
+msgid "Data dir deleted: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637
+msgid "Error creating torrent - you must select a tracker"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653
+#, java-format
+msgid "Torrent created for \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655
+#, java-format
+msgid ""
+"Many I2P trackers require you to register new torrents before seeding - "
+"please do so before starting \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657
+#, java-format
+msgid "Error creating a torrent for \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660
+#, java-format
+msgid "Cannot create a torrent for the nonexistent data: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
+msgid "Error creating torrent - you must enter a file or directory"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
+msgid "Stopping all torrents and closing the I2P tunnel."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677
+msgid "I2P tunnel closed."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
+msgid "Opening the I2P tunnel and starting all torrents."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814
+msgid "Tracker Error"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847
+#, java-format
+msgid "1 peer"
+msgid_plural "{0} peers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824
+msgid "Seeding"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
+msgid "Complete"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
+msgid "OK"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
+msgid "Stalled"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
+msgid "No Peers"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
+msgid "Stopped"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886
+msgid "Torrent details"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160
+msgid "Info"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913
+msgid "View files"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915
+msgid "Open file"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957
+msgid "Stop the torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959
+msgid "Stop"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969
+msgid "Start the torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971
+msgid "Start"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
+msgid "Remove the torrent from the active list, deleting the .torrent file"
+msgstr ""
+
+#. Can't figure out how to escape double quotes inside the onclick string.
+#. Single quotes in translate strings with parameters must be doubled.
+#. Then the remaining single quite must be escaped
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
+#, java-format
+msgid ""
+"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
+"data will not be deleted) ?"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
+msgid "Remove"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
+msgid "Delete the .torrent file and the associated data file(s)"
+msgstr ""
+
+#. Can't figure out how to escape double quotes inside the onclick string.
+#. Single quotes in translate strings with parameters must be doubled.
+#. Then the remaining single quite must be escaped
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
+#, java-format
+msgid ""
+"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
+"data?"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
+msgid "Delete"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
+msgid "Unknown"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
+msgid "Seed"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077
+msgid "Uninteresting (The peer has no pieces we need)"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079
+msgid "Choked (The peer is not allowing us to request pieces)"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099
+msgid "Uninterested (We have no pieces the peer needs)"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101
+msgid "Choking (We are not allowing the peer to request pieces)"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159
+#, java-format
+msgid "Details at {0} tracker"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188
+msgid "Add Torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
+msgid "From URL"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193
+msgid ""
+"Enter the torrent file download URL (I2P only), magnet link, or maggot link"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
+msgid "Add torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201
+#, java-format
+msgid "You can also copy .torrent files to: {0}."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203
+msgid "Removing a .torrent will cause it to stop."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
+msgid "Create Torrent"
+msgstr ""
+
+#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229
+msgid "Data to seed"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233
+msgid "File or directory to seed (must be within the specified path)"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
+msgid "Tracker"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
+msgid "Select a tracker"
+msgstr ""
+
+#. out.write(_("Open trackers and DHT only"));
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
+msgid "Open trackers only"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
+msgid "or"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260
+msgid "Specify custom tracker announce URL"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
+msgid "Create torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
+msgid "Configuration"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285
+msgid "Data directory"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287
+msgid "Edit i2psnark.config and restart to change"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
+msgid "Auto start"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
+msgid "If checked, automatically start torrents that are added"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299
+msgid "Theme"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
+msgid "Startup delay"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314
+msgid "minutes"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
+msgid "Total uploader limit"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341
+msgid "peers"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345
+msgid "Up bandwidth limit"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348
+msgid "Half available bandwidth recommended."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
+msgid "View or change router bandwidth"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354
+msgid "Use open trackers also"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358
+msgid ""
+"If checked, announce torrents to open trackers as well as the tracker listed "
+"in the torrent file"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362
+msgid "Open tracker announce URLs"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374
+msgid "Inbound Settings"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380
+msgid "Outbound Settings"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388
+msgid "I2CP host"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393
+msgid "I2CP port"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406
+msgid "I2CP options"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
+msgid "Save configuration"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436
+#, java-format
+msgid "Invalid magnet URL {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470
+#, java-format
+msgid "Invalid info hash in magnet URL {0}"
+msgstr ""
+
+#. * dummies for translation
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500
+#, java-format
+msgid "1 hop"
+msgid_plural "{0} hops"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501
+#, java-format
+msgid "1 tunnel"
+msgid_plural "{0} tunnels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663
+msgid "Completion"
+msgstr ""
+
+#. else unknown
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
+msgid "Size"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672
+msgid "Files"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674
+msgid "Pieces"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675
+msgid "Piece size"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697
+msgid "Magnet link"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753
+msgid "Directory"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
+msgid "Priority"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728
+msgid "Up to higher level directory"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
+msgid "Torrent not found?"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767
+msgid "File not found in torrent?"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
+msgid "complete"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781
+msgid "bytes remaining"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
+msgid "Open"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832
+msgid "High"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837
+msgid "Normal"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842
+msgid "Skip"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851
+msgid "Save priorities"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967
+#, java-format
+msgid "Torrent fetched from {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989
+#, java-format
+msgid "Torrent already running: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991
+#, java-format
+msgid "Torrent already in the queue: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997
+#, java-format
+msgid "Torrent at {0} was not valid"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004
+#, java-format
+msgid "Torrent was not retrieved from {0}"
+msgstr ""
diff --git a/apps/i2psnark/locale/messages_es.po b/apps/i2psnark/locale/messages_es.po
index cf863e521cc2880addbce1e5e8998030e27687c5..d9202455796fb4efe5e397acf469dd459b629787 100644
--- a/apps/i2psnark/locale/messages_es.po
+++ b/apps/i2psnark/locale/messages_es.po
@@ -6,857 +6,894 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: I2P i2psnark\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 03:16+0000\n"
-"PO-Revision-Date: 2011-01-03 00:58+0100\n"
+"Project-Id-Version: I2P\n"
+"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
+"POT-Creation-Date: 2011-03-03 18:28+0000\n"
+"PO-Revision-Date: 2011-04-03 01:46+0100\n"
 "Last-Translator: mixxy <m1xxy@mail.i2p>\n"
-"Language-Team: foo <foo@bar>\n"
+"Language-Team: Spanish (Castilian) <None>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Spanish\n"
+"Language: es\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:94
-#, java-format
-msgid "Adding torrents in {0} minutes"
-msgstr "Se añaden los torrents en {0} minutos ..."
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:296
+#: ../java/src/org/klomp/snark/SnarkManager.java:307
 #, java-format
 msgid "Total uploaders limit changed to {0}"
-msgstr "Límite del número total de subidores cambiado a {0}"
+msgstr "Límite del número total de subidores ha cambiado a {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:298
+#: ../java/src/org/klomp/snark/SnarkManager.java:309
 #, java-format
 msgid "Minimum total uploaders limit is {0}"
 msgstr "El límite mínimo de subidores es {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:310
+#: ../java/src/org/klomp/snark/SnarkManager.java:321
 #, java-format
 msgid "Up BW limit changed to {0}KBps"
 msgstr "Ancho de banda para la subida ha sido cambiado a {0} kbyte/s."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:312
+#: ../java/src/org/klomp/snark/SnarkManager.java:323
 #, java-format
 msgid "Minimum up bandwidth limit is {0}KBps"
 msgstr "El límite mínimo de ancho de banda para la subida está en {0} kbyte/s."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:324
+#: ../java/src/org/klomp/snark/SnarkManager.java:335
 #, java-format
-msgid "Startup delay limit changed to {0} minutes"
-msgstr "Demora del arranque cambiado a {0} minutos"
+msgid "Startup delay changed to {0}"
+msgstr "Tiempo de espera al inicio fue cambiada a {0}."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:371
+#: ../java/src/org/klomp/snark/SnarkManager.java:386
 msgid "I2CP and tunnel changes will take effect after stopping all torrents"
 msgstr "Cambios de I2CP y del túnel tomarán efecto despues de detener todos los torrents."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:378
+#: ../java/src/org/klomp/snark/SnarkManager.java:393
 msgid "Disconnecting old I2CP destination"
 msgstr "Desconectando anterior Destino I2CP"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:382
+#: ../java/src/org/klomp/snark/SnarkManager.java:397
 #, java-format
 msgid "I2CP settings changed to {0}"
 msgstr "Preferencias de I2CP cambiadas a {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:386
+#: ../java/src/org/klomp/snark/SnarkManager.java:402
 msgid "Unable to connect with the new settings, reverting to the old I2CP settings"
 msgstr "Conectarse no fue posíble con las nuevas preferencias I2CP, utilizaré las anteriores."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:390
+#: ../java/src/org/klomp/snark/SnarkManager.java:406
 msgid "Unable to reconnect with the old settings!"
 msgstr "Conectarse usando las preferencias anteriores no fue posible!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:392
+#: ../java/src/org/klomp/snark/SnarkManager.java:408
 msgid "Reconnected on the new I2CP destination"
 msgstr "Conectado con la nueva Destino I2CP"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:403
+#: ../java/src/org/klomp/snark/SnarkManager.java:418
 #, java-format
 msgid "I2CP listener restarted for \"{0}\""
 msgstr "Conexión I2CP reestablecida para \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:414
+#: ../java/src/org/klomp/snark/SnarkManager.java:429
 msgid "Enabled autostart"
 msgstr "Arranque automático activado"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:416
+#: ../java/src/org/klomp/snark/SnarkManager.java:431
 msgid "Disabled autostart"
 msgstr "Arranque automático desactivado"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:422
+#: ../java/src/org/klomp/snark/SnarkManager.java:437
 msgid "Enabled open trackers - torrent restart required to take effect."
 msgstr "Rastreadores abiertos activados - Para aplicar ello es necesario que reinicies los torrents."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:424
+#: ../java/src/org/klomp/snark/SnarkManager.java:439
 msgid "Disabled open trackers - torrent restart required to take effect."
 msgstr "Rastreadores abiertos desactivados - Para aplicar ello es necesario que reinicies los torrents."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:431
+#: ../java/src/org/klomp/snark/SnarkManager.java:447
 msgid "Open Tracker list changed - torrent restart required to take effect."
 msgstr "Lista de rastreadores abiertos cambiada - Para aplicar ello es necesario que reinicies los torrents."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:438
+#: ../java/src/org/klomp/snark/SnarkManager.java:454
 #, java-format
 msgid "{0} theme loaded, return to main i2psnark page to view."
 msgstr "Tema {0} cargado. ¡Vuelve a la página principal de i2psnark para verlo!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:445
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
 msgid "Configuration unchanged."
 msgstr "Configuración no cambiada."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:455
+#: ../java/src/org/klomp/snark/SnarkManager.java:471
 #, java-format
 msgid "Unable to save the config to {0}"
 msgstr "No se pudo guardar la configuración en {0}."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:494
+#: ../java/src/org/klomp/snark/SnarkManager.java:536
 msgid "Connecting to I2P"
 msgstr "Conectando a I2P"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:497
+#: ../java/src/org/klomp/snark/SnarkManager.java:539
 msgid "Error connecting to I2P - check your I2CP settings!"
 msgstr "Error al conectar a I2P - Compruebe su configuración I2CP!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:506
+#: ../java/src/org/klomp/snark/SnarkManager.java:548
 #, java-format
 msgid "Error: Could not add the torrent {0}"
 msgstr "Error: No se ha podido añadir el torrent {0}."
 
 #. catch this here so we don't try do delete it below
-#: ../java/src/org/klomp/snark/SnarkManager.java:528
+#: ../java/src/org/klomp/snark/SnarkManager.java:570
 #, java-format
 msgid "Cannot open \"{0}\""
 msgstr "No se puede abrir \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:541
+#. TODO - if the existing one is a magnet, delete it and add the metainfo
+#. instead?
+#: ../java/src/org/klomp/snark/SnarkManager.java:586
+#: ../java/src/org/klomp/snark/SnarkManager.java:661
+#: ../java/src/org/klomp/snark/SnarkManager.java:716
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976
 #, java-format
-msgid "Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only"
-msgstr "Advertencia - Se ignora rastreado no I2P en \"{0}\", anunciando sólo a los rastreadorse abiertos de I2P"
+msgid "Torrent with this info hash is already running: {0}"
+msgstr "Ya hay un Torrent con este hash ejecutándose: {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:543
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P
+#. open trackers and DHT only.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:593
 #, java-format
-msgid "Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!"
-msgstr "Advertencia - Se ignora rastreado no I2P en \"{0}\", rastreadores abiertos están desactivados. ¡Tienes que activarlos antes de iniciar el torrent!"
+msgid "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers only."
+msgstr "Advertencia - No hay rastreadores de I2P en \"{0}\", se anunciará solamente a los rastreadores I2P abiertos."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:563
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open
+#. trackers are disabled, you should enable open trackers or DHT before
+#. starting the torrent.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:598
+#, java-format
+msgid "Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is enabled before starting this torrent."
+msgstr "Advertencia - No se encuentran rastreadores de I2P en \"{0}\". Asegúrate de que OpenTracker esté activado antes de iniciar este torrent."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:619
 #, java-format
 msgid "Torrent in \"{0}\" is invalid"
 msgstr "El archivo .torrent en \"{0}\" no es válido."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:578
+#: ../java/src/org/klomp/snark/SnarkManager.java:624
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999
+#, java-format
+msgid "ERROR - Out of memory, cannot create torrent from {0}"
+msgstr "ERROR - Falta de memoria, no se puede crear un torrent de {0}."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:635
 #, java-format
 msgid "Torrent added and started: \"{0}\""
 msgstr "Torrent añadido e iniciado: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:580
+#: ../java/src/org/klomp/snark/SnarkManager.java:637
 #, java-format
 msgid "Torrent added: \"{0}\""
 msgstr "Torrent añadido: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:734
+#: ../java/src/org/klomp/snark/SnarkManager.java:672
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490
+#, java-format
+msgid "Fetching {0}"
+msgstr "Recogiendo {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:675
+#, java-format
+msgid "We have no saved peers and no other torrents are running. Fetch of {0} will not succeed until you start another torrent."
+msgstr "No tenemos guardado ningún par y no se está activo ningún otro torrent. La obtención de {0} no tendrá éxito hasta que inicies otro torrent."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:679
+#, java-format
+msgid "Adding {0}"
+msgstr "Añadiendo {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:726
+#: ../java/src/org/klomp/snark/SnarkManager.java:749
+#: ../java/src/org/klomp/snark/SnarkManager.java:1174
+#, java-format
+msgid "Failed to copy torrent file to {0}"
+msgstr "No se pudo copiar el torrent a {0}."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:972
 #, java-format
 msgid "Too many files in \"{0}\" ({1}), deleting it!"
 msgstr "Hay demasiados archivos en  \"{0}\", se borrará ({1}). "
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:736
+#: ../java/src/org/klomp/snark/SnarkManager.java:974
 #, java-format
 msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
 msgstr "Archivo de datos del torrent \"{0}\" no puede terminar en \".torrent' y será borrado."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:738
+#: ../java/src/org/klomp/snark/SnarkManager.java:976
 #, java-format
 msgid "No pieces in \"{0}\",  deleting it!"
 msgstr "No hay partes en \"{0}\", se borrará."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:740
+#: ../java/src/org/klomp/snark/SnarkManager.java:978
 #, java-format
 msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
 msgstr "Hay demasiadas partes en  \"{0}\" y el límite es {1}. Se borrarán."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:742
+#: ../java/src/org/klomp/snark/SnarkManager.java:980
 #, java-format
 msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
 msgstr "Partes en \"{0}\" son demasiado grandes ({1}B). Se borrarán."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:743
+#: ../java/src/org/klomp/snark/SnarkManager.java:981
 #, java-format
 msgid "Limit is {0}B"
 msgstr "El límite es de \"{0}\"Bytes"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:751
+#: ../java/src/org/klomp/snark/SnarkManager.java:989
 #, java-format
 msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
 msgstr "Torrents más grandes que \"{0}\"Bytes aún no funcionan, se borrará \"{1}\"."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:767
+#: ../java/src/org/klomp/snark/SnarkManager.java:1005
 #, java-format
 msgid "Error: Could not remove the torrent {0}"
 msgstr "Error: No se pudo quitar el torrent \"{0}\"."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:794
+#: ../java/src/org/klomp/snark/SnarkManager.java:1026
+#: ../java/src/org/klomp/snark/SnarkManager.java:1044
 #, java-format
 msgid "Torrent stopped: \"{0}\""
 msgstr "Torrent detenido: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:814
+#: ../java/src/org/klomp/snark/SnarkManager.java:1065
 #, java-format
 msgid "Torrent removed: \"{0}\""
 msgstr "Torrent quitado: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:852
+#: ../java/src/org/klomp/snark/SnarkManager.java:1073
+#, java-format
+msgid "Adding torrents in {0}"
+msgstr "Añadiendo torrents en {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1122
 #, java-format
 msgid "Download finished: {0}"
 msgstr "Terminada la descarga de \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:880
+#: ../java/src/org/klomp/snark/SnarkManager.java:1170
+#, java-format
+msgid "Metainfo received for {0}"
+msgstr "Metainfo recibida para {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1171
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525
+#, java-format
+msgid "Starting up torrent {0}"
+msgstr "Iniciando el torrent {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1225
 msgid "Unable to connect to I2P!"
 msgstr "Imposible de conectarse con I2P"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:886
+#: ../java/src/org/klomp/snark/SnarkManager.java:1231
 #, java-format
 msgid "Unable to add {0}"
 msgstr "Imposible de añadir {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
 msgid "I2PSnark - Anonymous BitTorrent Client"
 msgstr "I2PSnark - Cliente de BitTorrent Anónimo"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218
 msgid "Torrents"
 msgstr "Torrents"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:201
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:208
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
 msgid "I2PSnark"
 msgstr "I2PSnark"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225
 msgid "Refresh page"
 msgstr "Actualizar página"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230
 msgid "Forum"
 msgstr "Foro"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719
 msgid "Status"
 msgstr "Estado"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292
 msgid "Hide Peers"
 msgstr "ocultar pares"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:279
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299
 msgid "Show Peers"
 msgstr "mostrar pares"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659
 msgid "Torrent"
 msgstr "Torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310
 msgid "Estimated time remaining"
 msgstr "Tiempo restante para completar la descarga"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:293
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313
 msgid "ETA"
 msgstr "Tiempo"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
 msgid "Downloaded"
 msgstr "Descargado"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:314
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
 msgid "RX"
 msgstr "Bajado"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
 msgid "Uploaded"
 msgstr "Subido"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
 msgid "TX"
 msgstr "Subido"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332
 msgid "Down Rate"
 msgstr "Tasa&nbsp;de descarga"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
 msgid "Rate"
 msgstr "Tasa"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
 msgid "Up Rate"
 msgstr "Tasa de subida"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
 msgid "Stop all torrents and the I2P tunnel"
 msgstr "Detener todos los torrents y el túnel I2P"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367
 msgid "Stop All"
 msgstr "Detener todos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376
 msgid "Start all torrents and the I2P tunnel"
 msgstr "Iniciar todos los torrents y el túnel I2P"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378
 msgid "Start All"
 msgstr "Arrancar todos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
 msgid "No torrents loaded."
 msgstr "No está cargado ningún torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402
 msgid "Totals"
 msgstr "Total"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
 #, java-format
 msgid "1 torrent"
 msgid_plural "{0} torrents"
 msgstr[0] "1 torrent"
 msgstr[1] "{0} torrents"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:382
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
 #, java-format
 msgid "1 connected peer"
 msgid_plural "{0} connected peers"
 msgstr[0] "1 par conectado"
 msgstr[1] "{0} pares conectados"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496
 #, java-format
-msgid "Fetching {0}"
-msgstr "Recogiendo {0}"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458
-msgid "Invalid URL - must start with http://"
-msgstr "Dirección no válida - tiene que comenzar con http://"
+msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
+msgstr "URL no válida: debe comenzar con \"http://\", \"{0}\", o \"{1}\"."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:489
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
 #, java-format
-msgid "Starting up torrent {0}"
-msgstr "Iniciando el torrent {0}"
+msgid "Magnet deleted: {0}"
+msgstr "Magnet eliminado: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577
 #, java-format
 msgid "Torrent file deleted: {0}"
 msgstr "Borrado archivo torrent: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:533
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:543
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593
 #, java-format
 msgid "Data file deleted: {0}"
 msgstr "Borrado el archivo de datos: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595
 #, java-format
 msgid "Data file could not be deleted: {0}"
 msgstr "No se pudo borrar el archivo de datos: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604
 #, java-format
 msgid "Data dir deleted: {0}"
 msgstr "Ha sido borrada la carpeta de datos: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637
 msgid "Error creating torrent - you must select a tracker"
 msgstr "Error al crear el torrents - Tienes que elegir un rastreador."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653
 #, java-format
 msgid "Torrent created for \"{0}\""
 msgstr "Torrent creado para \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655
 #, java-format
 msgid "Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\""
 msgstr "Muchos rastreadores en I2P requieren que te registres, antes de que puedas subir el torrent. Por favor, ¡hazlo antes de iniciar \"{0}\"!"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:607
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657
 #, java-format
 msgid "Error creating a torrent for \"{0}\""
 msgstr "Error al crear el torrent \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660
 #, java-format
 msgid "Cannot create a torrent for the nonexistent data: {0}"
 msgstr "No se puede crear un torrent para datos inexistentes: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
 msgid "Error creating torrent - you must enter a file or directory"
 msgstr "Error al crear el torrent - Tienes que especificar un archivo o una carpeta."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
 msgid "Stopping all torrents and closing the I2P tunnel."
 msgstr "Deteniendo todos los torrents y cerrando el túnel I2P"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677
 msgid "I2P tunnel closed."
 msgstr "Túnel I2P cerrado"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
 msgid "Opening the I2P tunnel and starting all torrents."
 msgstr "Abriendo el túnel I2P e iniciando los torrents ..."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:764
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814
 msgid "Tracker Error"
 msgstr "Error del rastrador"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:766
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:778
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:782
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:790
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847
 #, java-format
 msgid "1 peer"
 msgid_plural "{0} peers"
 msgstr[0] "1 par"
 msgstr[1] "{0} pares"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824
 msgid "Seeding"
 msgstr "sembrando"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:784
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
 msgid "Complete"
 msgstr "completo"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
 msgid "OK"
 msgstr "bien"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
 msgid "Stalled"
 msgstr "estancado"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
 msgid "No Peers"
 msgstr "sin pares"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
 msgid "Stopped"
 msgstr "detenido"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837
-#, java-format
-msgid "Details at {0} tracker"
-msgstr "Detalles en el rastreador {0}"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886
+msgid "Torrent details"
+msgstr "Detalles del torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160
 msgid "Info"
 msgstr "Info"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913
 msgid "View files"
 msgstr "mostrar archivos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915
 msgid "Open file"
 msgstr "abrir archivo"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:865
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569
-msgid "Open"
-msgstr "abrir"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957
 msgid "Stop the torrent"
 msgstr "Detener el torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959
 msgid "Stop"
 msgstr "Detener"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969
 msgid "Start the torrent"
 msgstr "Iniciar el torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971
 msgid "Start"
 msgstr "Iniciar"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
 msgid "Remove the torrent from the active list, deleting the .torrent file"
 msgstr "Quita el torrent de la lista de los torrents activos borrando el archivo .torrent"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
 #, java-format
 msgid "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?"
 msgstr "¿Estás seguro de que quieres borrar el archivo \\''{0}.torrent\\''? (Datos bajados no se borrarán.)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:941
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
 msgid "Remove"
 msgstr "Quitar"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:950
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
 msgid "Delete the .torrent file and the associated data file(s)"
 msgstr "Borrar el archivo torrent y el/los archivo(s) de datos pertenecientes"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
 #, java-format
 msgid "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?"
 msgstr "¿Estás seguro de que quieres borrar el archivo torrent \\''{0}\\'' y todos los datos descargados de este torrent?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
 msgid "Delete"
 msgstr "Borrar"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:991
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
 msgid "Unknown"
 msgstr "desconocido"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
 msgid "Seed"
 msgstr "Sembrador"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077
 msgid "Uninteresting (The peer has no pieces we need)"
 msgstr "no interesante (El par no tiene partes que nos interesen.)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079
 msgid "Choked (The peer is not allowing us to request pieces)"
 msgstr "moderado (De momento el par no nos permite solicitar más partes)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099
 msgid "Uninterested (We have no pieces the peer needs)"
 msgstr "desinteresado (No tenemos las partes que el par quiere.)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101
 msgid "Choking (We are not allowing the peer to request pieces)"
-msgstr "Moderando (De momento no se le permite al par solicitar más partes)"
+msgstr "moderando (De momento no se le permite al par solicitar más partes)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1092
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159
+#, java-format
+msgid "Details at {0} tracker"
+msgstr "Detalles en el rastreador {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188
 msgid "Add Torrent"
 msgstr "Añadir un torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
 msgid "From URL"
 msgstr "URL fuente"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1097
-msgid "Torrent file must originate from an I2P-based tracker"
-msgstr "El archivo torrent debe incluir un rastreador I2P."
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193
+msgid "Enter the torrent file download URL (I2P only), magnet link, or maggot link"
+msgstr "Introduce la URL de descarga de torrent (I2P solamente), enlace magnet o un enlace maggot"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
 msgid "Add torrent"
 msgstr "Añadir torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201
 #, java-format
 msgid "You can also copy .torrent files to: {0}."
 msgstr "También puedes copiar archivos torrent a {0}."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203
 msgid "Removing a .torrent will cause it to stop."
 msgstr "Quitar un archivo torrent resultará en que se detenga el torrent perteneciente."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
 msgid "Create Torrent"
 msgstr "Crear un torrent"
 
-#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134
+#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\"
+#. value=\"" + newFile + "\" /><br>\n");
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229
 msgid "Data to seed"
 msgstr "Datos para sembrar"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1138
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233
 msgid "File or directory to seed (must be within the specified path)"
 msgstr "Archivo o carpeta para sembrar (tiene que estár en la carpeta especificada)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1140
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
 msgid "Tracker"
 msgstr "Rastreador"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
 msgid "Select a tracker"
 msgstr "Selecciona un rastreador"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1155
+#. out.write(_("Open trackers and DHT only"));
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
+msgid "Open trackers only"
+msgstr "Sólo rastreadores abiertos"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
 msgid "or"
 msgstr "o"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1158
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260
 msgid "Specify custom tracker announce URL"
 msgstr "¡Especifica una URL para anunciar al rastreador!"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
 msgid "Create torrent"
 msgstr "Crear torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1180
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
 msgid "Configuration"
 msgstr "Preferencias"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1184
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285
 msgid "Data directory"
 msgstr "Carpeta de datos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287
 msgid "Edit i2psnark.config and restart to change"
 msgstr "Para cambiar, ¡modifica el archivo i2psnark.config y reinicia!"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
 msgid "Auto start"
 msgstr "Arranque automático"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
 msgid "If checked, automatically start torrents that are added"
 msgstr "Si marcado, los torrents añadidos se iniciarán de forma automática."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299
 msgid "Theme"
 msgstr "Tema"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
 msgid "Startup delay"
-msgstr "Demora del arranque"
+msgstr "Tiempo de espera al arrancar"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1213
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314
 msgid "minutes"
 msgstr "minutos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
 msgid "Total uploader limit"
 msgstr "Límite global de subidores"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341
 msgid "peers"
 msgstr "pares"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345
 msgid "Up bandwidth limit"
 msgstr "Límite del ancho de banda para la subida"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348
 msgid "Half available bandwidth recommended."
 msgstr "Se recomienda la mitad del ancho de banda disponible."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
 msgid "View or change router bandwidth"
 msgstr "Mostrar y cambiar preferencias del ancho de banda del enrutador"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354
 msgid "Use open trackers also"
 msgstr "Usar también rastreadores abiertos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358
 msgid "If checked, announce torrents to open trackers as well as the tracker listed in the torrent file"
 msgstr "Si está marcado, el torrent se anunciará a los rastreadores abiertos, además de a los rastreadores especificados."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362
 msgid "Open tracker announce URLs"
 msgstr "URL(s) para anunciar a rastreadores abiertos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1273
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374
 msgid "Inbound Settings"
 msgstr "Preferencias de entrada"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380
 msgid "Outbound Settings"
 msgstr "Preferencias de salida"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388
 msgid "I2CP host"
 msgstr "Anfitrión I2CP"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393
 msgid "I2CP port"
 msgstr "Puerto I2CP"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1303
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406
 msgid "I2CP options"
 msgstr "Opciones I2CP"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1308
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
 msgid "Save configuration"
 msgstr "Guardar ajustes"
 
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436
+#, java-format
+msgid "Invalid magnet URL {0}"
+msgstr "URL de magnet no válida: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470
+#, java-format
+msgid "Invalid info hash in magnet URL {0}"
+msgstr "Hash de información no válido en la URL magnet {0}"
+
 #. * dummies for translation
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1325
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500
 #, java-format
 msgid "1 hop"
 msgid_plural "{0} hops"
 msgstr[0] "1 salto"
 msgstr[1] "{0} saltos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501
 #, java-format
 msgid "1 tunnel"
 msgid_plural "{0} tunnels"
 msgstr[0] "1 túnel"
 msgstr[1] "{0} túneles"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663
+msgid "Completion"
+msgstr "Completado"
+
+#. else unknown
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
 msgid "Size"
 msgstr "Tamaño"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672
+msgid "Files"
+msgstr "Archivos"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674
+msgid "Pieces"
+msgstr "Partes"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675
+msgid "Piece size"
+msgstr "Tamaño de las partes"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697
+msgid "Magnet link"
+msgstr "Enlace de magnet"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753
+msgid "Directory"
+msgstr "Carpeta"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
 msgid "Priority"
 msgstr "Prioridad"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728
 msgid "Up to higher level directory"
 msgstr "Subir una herarquía"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517
-msgid "Directory"
-msgstr "Carpeta"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
 msgid "Torrent not found?"
 msgstr "¿No se encotró el archivo torrent?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767
 msgid "File not found in torrent?"
 msgstr "¿Archivo no encontrado en el torrent?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
 msgid "complete"
 msgstr "completo"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781
 msgid "bytes remaining"
 msgstr "Bytes faltando"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
+msgid "Open"
+msgstr "abrir"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832
 msgid "High"
 msgstr "alta"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1600
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837
 msgid "Normal"
 msgstr "normal"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1605
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842
 msgid "Skip"
 msgstr "dejar de lado"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1614
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851
 msgid "Save priorities"
 msgstr "Guardar prioridades"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967
 #, java-format
 msgid "Torrent fetched from {0}"
 msgstr "Torrent obtenido desde {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1746
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989
 #, java-format
 msgid "Torrent already running: {0}"
 msgstr "Torrent ya en marcha: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991
 #, java-format
 msgid "Torrent already in the queue: {0}"
 msgstr "Torrent ya encolado: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755
-#, java-format
-msgid "Failed to copy torrent file to {0}"
-msgstr "No se pudo copiar el torrent a {0}."
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997
 #, java-format
 msgid "Torrent at {0} was not valid"
 msgstr "Torrent en {0} no era válido"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004
 #, java-format
 msgid "Torrent was not retrieved from {0}"
 msgstr "Torrent no se ha podido obtener de {0}"
 
-#~ msgid " theme locked and loaded."
-#~ msgstr "tema cargado"
-#~ msgid "Hide All Attached Peers [connected/total in swarm]"
-#~ msgstr "Ocultar todos los pares conectados [conectados/todos]"
-#~ msgid "Show All Attached Peers [connected/total in swarm]"
-#~ msgstr "Mostrar todos los pares conectados [conectados/todos]"
-#~ msgid "Loaded Torrents"
-#~ msgstr "Torrents"
-#~ msgid "Estimated Download Time"
-#~ msgstr "tiempo restante de descarga"
-#~ msgid "1"
-#~ msgid_plural "{0}"
-#~ msgstr[0] "{0}"
-#~ msgstr[1] "{0}"
-#~ msgid "Torrent file {0} does not exist"
-#~ msgstr "Archivo del torrent {0} no existe"
-#~ msgid "Copying torrent to {0}"
-#~ msgstr "Copiando torrent a {0}"
-#~ msgid "from {0}"
-#~ msgstr "de {0}"
-#~ msgid "Downloading"
-#~ msgstr "descargando"
-#~ msgid "File"
-#~ msgstr "Archivo"
-#~ msgid "FileSize"
-#~ msgstr "Tamaño"
-#~ msgid "Download Status"
-#~ msgstr "Estado"
-#~ msgid "size: {0}B"
-#~ msgstr "Tamaño: {0}Bytes"
-#~ msgid "Directory to store torrents and data"
-#~ msgstr "Carpeta para guardar los archivos torrent y los datos"
-#~ msgid "Do not download"
-#~ msgstr "No descargues"
-#~ msgid "Details"
-#~ msgstr "Detalles"
-#~ msgid "Cannot change the I2CP settings while torrents are active"
-#~ msgstr ""
-#~ "No se puede cammbiar los ajustes I2CP mientras estén activos los torrents"
-#~ msgid "Non-i2p tracker in \"{0}\", deleting it from our list of trackers!"
-#~ msgstr ""
-#~ "Rastreador fuera de I2P en \"{0}\", borrando de la lista de rastreadores"
-#~ msgid "{0} torrents"
-#~ msgstr "{0} Torrents"
-#~ msgid "Uninteresting"
-#~ msgstr "no interesante"
-#~ msgid "Choked"
-#~ msgstr "frenado"
-#~ msgid "Uninterested"
-#~ msgstr "desinteresado"
-#~ msgid "Choking"
-#~ msgstr "frenando"
-#~ msgid "Custom tracker URL"
-#~ msgstr "URL especial del rastreador"
-#~ msgid "Configure"
-#~ msgstr "Ajustes"
-
diff --git a/apps/i2psnark/locale/messages_fr.po b/apps/i2psnark/locale/messages_fr.po
index e7981f2822d0b1fb122fd3743520c506814f905f..930d9c43031a255d62462656245b0a34fb09b2eb 100644
--- a/apps/i2psnark/locale/messages_fr.po
+++ b/apps/i2psnark/locale/messages_fr.po
@@ -8,848 +8,960 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P i2psnark\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-28 00:08+0000\n"
-"PO-Revision-Date: 2010-12-31 02:22+0100\n"
-"Last-Translator: mixxy <m1xxy@mail.i2p>\n"
+"POT-Creation-Date: 2011-05-02 11:08+0000\n"
+"PO-Revision-Date: 2011-05-19 07:39+0100\n"
+"Last-Translator: magma <magma@mail.i2p>\n"
 "Language-Team: foo <foo@bar>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n >= 2)\n"
 "X-Poedit-Language: French\n"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:94
-#, java-format
-msgid "Adding torrents in {0} minutes"
-msgstr "Ajouter des torrents dans {0} minutes"
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:296
+#: ../java/src/org/klomp/snark/SnarkManager.java:307
 #, java-format
 msgid "Total uploaders limit changed to {0}"
 msgstr "Limite agrégée des uploaders modifiée : {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:298
+#: ../java/src/org/klomp/snark/SnarkManager.java:309
 #, java-format
 msgid "Minimum total uploaders limit is {0}"
 msgstr "La limite minimale agrégée des uploaders est : {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:310
+#: ../java/src/org/klomp/snark/SnarkManager.java:321
 #, java-format
 msgid "Up BW limit changed to {0}KBps"
-msgstr "La limite d'upload modifiée : {0} Ko/s"
+msgstr "Limite d’envoi modifiée : {0} ko/s"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:312
+#: ../java/src/org/klomp/snark/SnarkManager.java:323
 #, java-format
 msgid "Minimum up bandwidth limit is {0}KBps"
-msgstr "La limite minimale d'upload est {0} Ko/s"
+msgstr "La limite minimale d’envoi est {0} ko/s"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:324
+#: ../java/src/org/klomp/snark/SnarkManager.java:335
 #, java-format
-msgid "Startup delay limit changed to {0} minutes"
-msgstr "Delais de démarrage modifié : {0] minutes"
+msgid "Startup delay changed to {0}"
+msgstr "Délai de démarrage modifié à {0} minutes"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:371
+#: ../java/src/org/klomp/snark/SnarkManager.java:386
 msgid "I2CP and tunnel changes will take effect after stopping all torrents"
-msgstr "Les modifications I2CP et des tunnels seront prise en compte après avoir arrêté tous les torrents"
+msgstr "Les modifications d'I2CP et des tunnels seront prise en compte après avoir arrêté tous les torrents"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:378
+#: ../java/src/org/klomp/snark/SnarkManager.java:393
 msgid "Disconnecting old I2CP destination"
 msgstr "Déconnexion des anciennes destination I2CP"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:382
+#: ../java/src/org/klomp/snark/SnarkManager.java:397
 #, java-format
 msgid "I2CP settings changed to {0}"
 msgstr "Les paramètres I2CP ont été changés : {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:386
+#: ../java/src/org/klomp/snark/SnarkManager.java:402
 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"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:390
+#: ../java/src/org/klomp/snark/SnarkManager.java:406
 msgid "Unable to reconnect with the old settings!"
 msgstr "Impossible de se reconnecter avec les anciens paramètres!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:392
+#: ../java/src/org/klomp/snark/SnarkManager.java:408
 msgid "Reconnected on the new I2CP destination"
 msgstr "Reconnexion sur la nouvelle destination I2CP"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:403
+#: ../java/src/org/klomp/snark/SnarkManager.java:418
 #, java-format
 msgid "I2CP listener restarted for \"{0}\""
-msgstr "Listener I2CP redémarré pour \"{0}\""
+msgstr "Écouteur I2CP redémarré pour \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:414
+#: ../java/src/org/klomp/snark/SnarkManager.java:429
 msgid "Enabled autostart"
-msgstr "Le démarrage automatique est activé"
+msgstr "Démarrage automatique activé"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:416
+#: ../java/src/org/klomp/snark/SnarkManager.java:431
 msgid "Disabled autostart"
-msgstr "Le démarrage automatique est désactivé"
+msgstr "Démarrage automatique désactivé"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:422
+#: ../java/src/org/klomp/snark/SnarkManager.java:437
 msgid "Enabled open trackers - torrent restart required to take effect."
-msgstr "Les open trackers sont activés - ceci a nécessité un redémarrage des torrents pour être pris en compte."
+msgstr "Open trackers activés - redémarrage des torrents requis pour prise en compte."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:424
+#: ../java/src/org/klomp/snark/SnarkManager.java:439
 msgid "Disabled open trackers - torrent restart required to take effect."
-msgstr "Les open trackers sont désactivés - ceci a nécessité un redémarrage des torrents pour être pris en compte."
+msgstr "Open trackers désactivés - redémarrage des torrents requis pour prise en compte."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:431
+#: ../java/src/org/klomp/snark/SnarkManager.java:447
 msgid "Open Tracker list changed - torrent restart required to take effect."
-msgstr "Liste des Open trackers modifiée - ceci nécessite un redémarrage des torrents pour être pris 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:438
+#: ../java/src/org/klomp/snark/SnarkManager.java:454
 #, java-format
 msgid "{0} theme loaded, return to main i2psnark page to view."
-msgstr ""
+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:445
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
 msgid "Configuration unchanged."
-msgstr "La configuration n'a pas été modifiée"
+msgstr "Aucun changement de configuration."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:455
+#: ../java/src/org/klomp/snark/SnarkManager.java:471
 #, java-format
 msgid "Unable to save the config to {0}"
 msgstr "Impossible de sauvegarder la configuration vers {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:494
+#: ../java/src/org/klomp/snark/SnarkManager.java:536
 msgid "Connecting to I2P"
 msgstr "Connexion à I2P"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:497
+#: ../java/src/org/klomp/snark/SnarkManager.java:539
 msgid "Error connecting to I2P - check your I2CP settings!"
 msgstr "Erreur de connexion à I2P - Vérifiez vos paramètres I2CP!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:506
+#: ../java/src/org/klomp/snark/SnarkManager.java:548
 #, java-format
 msgid "Error: Could not add the torrent {0}"
-msgstr "Erreur : Impossible d'ajouter le torrent : {0}"
+msgstr "Erreur : Impossible d’ajouter le torrent : {0}"
 
 #. catch this here so we don't try do delete it below
-#: ../java/src/org/klomp/snark/SnarkManager.java:528
+#: ../java/src/org/klomp/snark/SnarkManager.java:570
 #, java-format
 msgid "Cannot open \"{0}\""
-msgstr "Impossible d'ouvrir: \"{0}\""
+msgstr "Impossible d’ouvrir: \"{0}\""
+
+#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
+#: ../java/src/org/klomp/snark/SnarkManager.java:589
+#: ../java/src/org/klomp/snark/SnarkManager.java:665
+#: ../java/src/org/klomp/snark/SnarkManager.java:720
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976
+#, java-format
+msgid "Torrent with this info hash is already running: {0}"
+msgstr "Un torrent avec cette empreinte est déjà actif: {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:541
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:596
 #, java-format
-msgid "Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only"
-msgstr "Attention - Les trackers non-i2p dans \"{0}\" sont ignorés, seuls les open trackers I2P seront utilisés!"
+msgid "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers only."
+msgstr "Attention - Les trackers non-i2p dans \"{0}\" sont ignorés, seuls les trackers ouverts I2P seront utilisés!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:543
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:601
 #, java-format
-msgid "Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!"
-msgstr "Attention - Les trackers non-i2p dans \"{0}\" sont ignorés, et les open trackers sont désactivés, vous devez activer les open trackers avant de démarrer le torrent!"
+msgid "Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is enabled before starting this torrent."
+msgstr "Attention - aucun tracker i2p dans \"{0}\". Vous devez activer les open trackers avant de démarrer le torrent!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:563
+#: ../java/src/org/klomp/snark/SnarkManager.java:622
 #, java-format
 msgid "Torrent in \"{0}\" is invalid"
 msgstr "Le torrent dans \"{0}\" est invalide"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:578
+#: ../java/src/org/klomp/snark/SnarkManager.java:627
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1998
+#, java-format
+msgid "ERROR - Out of memory, cannot create torrent from {0}"
+msgstr "ERREUR - Mémoire insuffisante, impossible de créer le torrent de {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:639
 #, java-format
 msgid "Torrent added and started: \"{0}\""
 msgstr "Torrent ajouté et démarré: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:580
+#: ../java/src/org/klomp/snark/SnarkManager.java:641
 #, java-format
 msgid "Torrent added: \"{0}\""
 msgstr "Torrent ajouté: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:734
+#: ../java/src/org/klomp/snark/SnarkManager.java:676
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:491
+#, java-format
+msgid "Fetching {0}"
+msgstr "Envoi {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:679
+#, java-format
+msgid "We have no saved peers and no other torrents are running. Fetch of {0} will not succeed until you start another torrent."
+msgstr "Aucun pair sauvegardé et aucun autre torrent en cours. Le téléchargement de {0} ne commencera que lorsque vous démarrerez un autre torrent."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:683
+#, java-format
+msgid "Adding {0}"
+msgstr "Ajout {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:730
+#: ../java/src/org/klomp/snark/SnarkManager.java:753
+#: ../java/src/org/klomp/snark/SnarkManager.java:1180
+#, java-format
+msgid "Failed to copy torrent file to {0}"
+msgstr "Impossible de copier le torrent vers {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:976
 #, java-format
 msgid "Too many files in \"{0}\" ({1}), deleting it!"
 msgstr "Trop de fichiers dans \"{0}\" ({1}), suppression! "
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:736
+#: ../java/src/org/klomp/snark/SnarkManager.java:978
 #, 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!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:738
+#: ../java/src/org/klomp/snark/SnarkManager.java:980
 #, java-format
 msgid "No pieces in \"{0}\",  deleting it!"
-msgstr "Pas de morceaux dans \"{0}\", suppression!"
+msgstr "Pas de tronçon dans \"{0}\", suppression!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:740
+#: ../java/src/org/klomp/snark/SnarkManager.java:982
 #, java-format
 msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
-msgstr "Trop de morceaux dans \"{0}\" , la limite est {1}, suppression!"
+msgstr "Trop de tronçons dans \"{0}\" , la limite est {1}, suppression!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:742
+#: ../java/src/org/klomp/snark/SnarkManager.java:984
 #, java-format
 msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
-msgstr "Les morceaux sont trop larges dans \"{0}\" ({1}B), suppresion."
+msgstr "Les tronçons sont trop larges dans \"{0}\" ({1}B), suppression."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:743
+#: ../java/src/org/klomp/snark/SnarkManager.java:985
 #, java-format
 msgid "Limit is {0}B"
-msgstr "La limite est de \"{0}\"Octets"
+msgstr "La limite est de \"{0}\"octets"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:987
+#, java-format
+msgid "Torrent \"{0}\" has no data, deleting it!"
+msgstr "Le fichier torrent \"{0}\" n'a pas de données, suppression!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:751
+#: ../java/src/org/klomp/snark/SnarkManager.java:995
 #, 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:767
+#: ../java/src/org/klomp/snark/SnarkManager.java:1011
 #, java-format
 msgid "Error: Could not remove the torrent {0}"
 msgstr "Erreur: Impossible de supprimer le torrent \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:794
+#: ../java/src/org/klomp/snark/SnarkManager.java:1032
+#: ../java/src/org/klomp/snark/SnarkManager.java:1050
 #, java-format
 msgid "Torrent stopped: \"{0}\""
 msgstr "Torrent arrêté:\"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:814
+#: ../java/src/org/klomp/snark/SnarkManager.java:1071
 #, java-format
 msgid "Torrent removed: \"{0}\""
 msgstr "Torrent supprimé:\"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:852
+#: ../java/src/org/klomp/snark/SnarkManager.java:1079
+#, java-format
+msgid "Adding torrents in {0}"
+msgstr "Ajout des torrents dans {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1128
 #, java-format
 msgid "Download finished: {0}"
 msgstr "Téléchargement terminé:\"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:880
+#: ../java/src/org/klomp/snark/SnarkManager.java:1176
+#, java-format
+msgid "Metainfo received for {0}"
+msgstr "Metainfo reçue pour {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1177
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:526
+#, java-format
+msgid "Starting up torrent {0}"
+msgstr "Démarrage du torrent {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1231
 msgid "Unable to connect to I2P!"
 msgstr "Impossible de se connecter à I2P!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:886
+#: ../java/src/org/klomp/snark/SnarkManager.java:1237
 #, java-format
 msgid "Unable to add {0}"
-msgstr "Impossible d'ajouter {0}"
+msgstr "Impossible d’ajouter {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
 msgid "I2PSnark - Anonymous BitTorrent Client"
 msgstr "I2PSnark - Client BitTorrent anonyme"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218
 msgid "Torrents"
 msgstr "Torrents"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:201
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:208
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
 msgid "I2PSnark"
 msgstr "I2PSnark"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225
 msgid "Refresh page"
 msgstr "Rafraîchir la page"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230
 msgid "Forum"
 msgstr "Forum"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719
 msgid "Status"
 msgstr "État"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292
 msgid "Hide Peers"
 msgstr "Cacher les pairs"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:279
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299
 msgid "Show Peers"
 msgstr "Afficher les pairs"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659
 msgid "Torrent"
 msgstr "Torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
-#, fuzzy
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310
 msgid "Estimated time remaining"
-msgstr "Octets restants"
+msgstr "temps restant estimé"
 
 # NOTE: purposely left blank to leave more room in the table header
 # msgstr "Temps&nbsp;restant"
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:293
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313
 msgid "ETA"
-msgstr " Temps"
+msgstr "Temps"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
 msgid "Downloaded"
 msgstr "Téléchargé"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:314
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
 msgid "RX"
 msgstr "Reçu"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
 msgid "Uploaded"
 msgstr "Envoyé"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
 msgid "TX"
 msgstr "Envoyé"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332
 msgid "Down Rate"
 msgstr "Taux de téléchargement"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
 msgid "Rate"
 msgstr "Vitesse"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
 msgid "Up Rate"
 msgstr "Taux d'envoi"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:366
 msgid "Stop all torrents and the I2P tunnel"
 msgstr "Arrêter tous les torrents et le tunnel I2P"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:368
 msgid "Stop All"
 msgstr "Arrêter tout"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377
 msgid "Start all torrents and the I2P tunnel"
 msgstr "Démarrer tous les torrents et le tunnel I2P"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379
 msgid "Start All"
 msgstr "Démarrer tout"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:398
 msgid "No torrents loaded."
 msgstr "Aucun torrent chargé."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:403
 msgid "Totals"
 msgstr "Totaux"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:405
 #, java-format
 msgid "1 torrent"
 msgid_plural "{0} torrents"
-msgstr[0] "1 torrent"
+msgstr[0] "{0} torrent"
 msgstr[1] "{0} torrents"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:382
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:408
 #, java-format
 msgid "1 connected peer"
 msgid_plural "{0} connected peers"
-msgstr[0] "1 pair connecté"
+msgstr[0] "{0} pair connecté"
 msgstr[1] "{0} pairs connectés"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:497
 #, java-format
-msgid "Fetching {0}"
-msgstr "Envoi {0}"
+msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
+msgstr "URL incorrecte - elle doit débuter par \"http://\", \"{0}\", ou \"{1}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458
-msgid "Invalid URL - must start with http://"
-msgstr "URL invalide - elle doit débuter par http://"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:489
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572
 #, java-format
-msgid "Starting up torrent {0}"
-msgstr "Démarrage du torrent {0}"
+msgid "Magnet deleted: {0}"
+msgstr "Magnet supprimé: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:553
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:578
 #, java-format
 msgid "Torrent file deleted: {0}"
 msgstr "Fichier torrent effacé: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:533
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:543
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:584
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:594
 #, java-format
 msgid "Data file deleted: {0}"
 msgstr "Fichier de données effacé: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:596
 #, java-format
 msgid "Data file could not be deleted: {0}"
 msgstr "Le fichier de données ne peut être effacé: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605
 #, java-format
 msgid "Data dir deleted: {0}"
 msgstr "Répertoire des données effacé: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:638
 msgid "Error creating torrent - you must select a tracker"
 msgstr "Erreur lors de la création du torrent - vous devez sélectionner un tracker"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653
 #, java-format
 msgid "Torrent created for \"{0}\""
 msgstr "Torrent créé pour \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655
 #, java-format
 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:607
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657
 #, java-format
 msgid "Error creating a torrent for \"{0}\""
 msgstr "Erreur de création du torrent pour \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660
 #, java-format
 msgid "Cannot create a torrent for the nonexistent data: {0}"
 msgstr "Impossible de créer un torrent pour des données inexistantes: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
 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"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
 msgid "Stopping all torrents and closing the I2P tunnel."
 msgstr "Arrêt de tous les torrents et fermeture du tunnel I2P."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677
 msgid "I2P tunnel closed."
 msgstr "Tunnel I2P fermé."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
 msgid "Opening the I2P tunnel and starting all torrents."
 msgstr "Ouverture du tunnel I2P and démarrage de tous les torrents."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:764
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814
 msgid "Tracker Error"
 msgstr "Erreur du tracker"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:766
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:778
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:782
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:790
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847
 #, java-format
 msgid "1 peer"
 msgid_plural "{0} peers"
-msgstr[0] "1 Pair"
-msgstr[1] "{0} Pairs"
+msgstr[0] "{0} pair"
+msgstr[1] "{0} pairs"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824
 msgid "Seeding"
 msgstr "Seed en cours"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:784
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
 msgid "Complete"
 msgstr "Complet"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
 msgid "OK"
 msgstr "OK"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
 msgid "Stalled"
 msgstr "Figé"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
 msgid "No Peers"
 msgstr "Pas de pair"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
 msgid "Stopped"
 msgstr "Arrêté"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837
-#, fuzzy, java-format
-msgid "Details at {0} tracker"
-msgstr "Sélectionner un tracker"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886
+msgid "Torrent details"
+msgstr "Détails du torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
-#, fuzzy
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160
 msgid "Info"
-msgstr "Ignore"
+msgstr "Info"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913
 msgid "View files"
 msgstr "Voir les fichiers"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915
 msgid "Open file"
 msgstr "Ouvrir fichier"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:865
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569
-#, fuzzy
-msgid "Open"
-msgstr "Ouvrir fichier"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957
 msgid "Stop the torrent"
 msgstr "Arrêter le torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959
 msgid "Stop"
 msgstr "Arrêter"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969
 msgid "Start the torrent"
-msgstr "Arrêter le torrent"
+msgstr "Démarrer le torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971
 msgid "Start"
 msgstr "Démarrer"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
 msgid "Remove the torrent from the active list, deleting the .torrent file"
 msgstr "Enlever le torrent de la liste active, suprression du fichier .torrent"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
 #, java-format
 msgid "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?"
-msgstr "Etes-vous certain de vouloir supprimer le fichier  \\''{0}.torrent\\'' (les données déjà téléchargées ne seront pas supprimées) ?"
+msgstr "Êtes-vous certain de vouloir supprimer le fichier  \\''{0}.torrent\\'' (les données déjà téléchargées ne seront pas supprimées) ?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:941
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
 msgid "Remove"
 msgstr "Enlever"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:950
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
 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)"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
 #, java-format
 msgid "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?"
-msgstr "Etes-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:958
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
 msgid "Delete"
 msgstr "Supprimer"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:991
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
 msgid "Unknown"
 msgstr "Inconnu"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
 msgid "Seed"
 msgstr "Seed"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077
 msgid "Uninteresting (The peer has no pieces we need)"
-msgstr "aucun intérêt (le pair n'a aucun morceau utile)"
+msgstr "Aucun intérêt (le pair n'a aucun tronçon utile)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079
 msgid "Choked (The peer is not allowing us to request pieces)"
-msgstr "bridé (le pair ne nous permet pas de demander un morceau)"
+msgstr "bridé (le pair ne nous permet pas de demander des tronçons)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099
 msgid "Uninterested (We have no pieces the peer needs)"
-msgstr "aucun intérêt (nous n'avons aucun morceau utile au pair)"
+msgstr "Pas intéressé (aucun tronçon utile au pair)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101
 msgid "Choking (We are not allowing the peer to request pieces)"
-msgstr "bridage (nous ne permettons pas au pair de demander un morceau)"
+msgstr "bridage (nous ne permettons pas au pair de demander un tronçon)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1092
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159
+#, java-format
+msgid "Details at {0} tracker"
+msgstr "Détails au tracker {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188
 msgid "Add Torrent"
 msgstr "Ajouter torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
 msgid "From URL"
-msgstr "Depuis l'url"
+msgstr "Depuis l'URL"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1097
-msgid "Torrent file must originate from an I2P-based tracker"
-msgstr "Le fichier torrent doit provenir d'un tracker I2P"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193
+msgid "Enter the torrent file download URL (I2P only), magnet link, or maggot link"
+msgstr "Entrez l'URL (I2P uniquement) de téléchargement du fichier torrent, du lien magnet ou maggot."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
 msgid "Add torrent"
 msgstr "Ajouter torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201
 #, java-format
 msgid "You can also copy .torrent files to: {0}."
 msgstr "Vous pouvez aussi copier les fichiers .torrent vers {0}."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203
 msgid "Removing a .torrent will cause it to stop."
-msgstr "La suppression d'un fichier .torrent entraine l'arrêt du torrent"
+msgstr "La suppression d'un fichier .torrent entraîne l'arrêt du torrent."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
 msgid "Create Torrent"
 msgstr "Créer torrent"
 
 #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229
 msgid "Data to seed"
 msgstr "Données à seeder"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1138
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233
 msgid "File or directory to seed (must be within the specified path)"
 msgstr "Fichier ou répertoire à seeder (doit être dans le chemin spécifié)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1140
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
 msgid "Tracker"
 msgstr "Tracker"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
 msgid "Select a tracker"
 msgstr "Sélectionner un tracker"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1155
+#. out.write(_("Open trackers and DHT only"));
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
+msgid "Open trackers only"
+msgstr "Trackers ouverts seulement"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
 msgid "or"
 msgstr "ou"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1158
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260
 msgid "Specify custom tracker announce URL"
-msgstr "Spécifier une URL personnalisée d'annonce de tracker"
+msgstr "Spécifier une URL d'annonce de tracker personnalisé"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
 msgid "Create torrent"
 msgstr "Créer torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1180
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
 msgid "Configuration"
 msgstr "Configuration"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1184
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285
 msgid "Data directory"
 msgstr "Répertoire de données"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287
 msgid "Edit i2psnark.config and restart to change"
 msgstr "Editez i2psnark.config et redémarrez pour prendre en compte les modifications"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
 msgid "Auto start"
 msgstr "Démarrage automatique"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
 msgid "If checked, automatically start torrents that are added"
-msgstr "Si coché, les torrents démarrerons automatiquement lors de l'ajout"
+msgstr "Si coché, les torrents démarreront automatiquement lors de l'ajout"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299
 msgid "Theme"
-msgstr ""
+msgstr "Thème"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
 msgid "Startup delay"
 msgstr "Délais de démarrage"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1213
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314
 msgid "minutes"
 msgstr "minutes"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
 msgid "Total uploader limit"
 msgstr "Limite totale d'envoi"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341
 msgid "peers"
 msgstr "pairs"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345
 msgid "Up bandwidth limit"
 msgstr "Limite de bande passante en envoi"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348
 msgid "Half available bandwidth recommended."
 msgstr "La moitié de la bande passante est recommandée."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
 msgid "View or change router bandwidth"
 msgstr "Consulter ou modifier la bande passante du routeur"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354
 msgid "Use open trackers also"
 msgstr "Utiliser les open trackers aussi"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358
 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"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362
 msgid "Open tracker announce URLs"
-msgstr "URL d'annonce open tracker"
+msgstr "URLs d'annonce open tracker"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1273
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374
 msgid "Inbound Settings"
 msgstr "Paramètres entrants"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380
 msgid "Outbound Settings"
 msgstr "Paramètres sortants"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388
 msgid "I2CP host"
 msgstr "Hôte I2CP"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393
 msgid "I2CP port"
 msgstr "Port I2CP"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1303
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406
 msgid "I2CP options"
 msgstr "Options I2CP"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1308
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
 msgid "Save configuration"
 msgstr "Sauvegarder la configuration"
 
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436
+#, java-format
+msgid "Invalid magnet URL {0}"
+msgstr "URL magnet {0} incorrecte"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470
+#, java-format
+msgid "Invalid info hash in magnet URL {0}"
+msgstr "Info d'empreinte incorrecte dans l'URL magnet {0}"
+
 #. * dummies for translation
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1325
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500
 #, java-format
 msgid "1 hop"
 msgid_plural "{0} hops"
-msgstr[0] "1 saut"
+msgstr[0] "{0} saut"
 msgstr[1] "{0} sauts"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501
 #, java-format
 msgid "1 tunnel"
 msgid_plural "{0} tunnels"
-msgstr[0] "1 tunnel"
+msgstr[0] "{0} tunnel"
 msgstr[1] "{0} tunnels"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663
+msgid "Completion"
+msgstr "Finalisation"
+
+#. else unknown
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
 msgid "Size"
 msgstr "Taille"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672
+msgid "Files"
+msgstr "Fichiers"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674
+msgid "Pieces"
+msgstr "Tronçons"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675
+msgid "Piece size"
+msgstr "Taille des tronçons"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697
+msgid "Magnet link"
+msgstr "Lien magnet"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753
+msgid "Directory"
+msgstr "Répertoire"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
 msgid "Priority"
 msgstr "Priorité"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728
 msgid "Up to higher level directory"
 msgstr "Vers le répertoire parent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517
-msgid "Directory"
-msgstr "Répertoire"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
 msgid "Torrent not found?"
 msgstr "Torrent non trouvé?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767
 msgid "File not found in torrent?"
 msgstr "Fichier non trouvé dans le torrent?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
 msgid "complete"
 msgstr "complet"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781
 msgid "bytes remaining"
 msgstr "Octets restants"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
+msgid "Open"
+msgstr "Ouvrir le fichier"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832
 msgid "High"
 msgstr "Haut"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1600
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837
 msgid "Normal"
 msgstr "Normal"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1605
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842
 msgid "Skip"
-msgstr ""
+msgstr "Ignorer"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1614
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851
 msgid "Save priorities"
 msgstr "Sauvegarder les priorités"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967
 #, java-format
 msgid "Torrent fetched from {0}"
-msgstr "Torrent envoyé de {0}"
+msgstr "Torrent reçu de {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1746
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1988
 #, java-format
 msgid "Torrent already running: {0}"
 msgstr "Torrent déjà actif: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1990
 #, java-format
 msgid "Torrent already in the queue: {0}"
-msgstr "Torrent déjà dans la queue: {0}"
+msgstr "Torrent déjà dans la file d''attente: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755
-#, fuzzy, java-format
-msgid "Failed to copy torrent file to {0}"
-msgstr "Impossible de copier le torrent vers {0}"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1996
 #, java-format
 msgid "Torrent at {0} was not valid"
-msgstr "Le torrent {0} n'est pas valide"
+msgstr "Le torrent {0} est invalide"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2003
 #, java-format
 msgid "Torrent was not retrieved from {0}"
-msgstr "Le torrent n'a pas été reçu par {0}"
+msgstr "Le torrent n’a pas été reçu de {0}"
+
+#~ msgid "Torrent file must originate from an I2P-based tracker"
+#~ msgstr "Le fichier torrent doit provenir d'un tracker I2P"
 
 #~ msgid "size: {0}B"
 #~ msgstr "Taille: {0}Octets"
+
 #~ msgid "Estimated Download Time"
 #~ msgstr "Temps estimé de téléchargement"
+
 #~ msgid "Torrent file {0} does not exist"
 #~ msgstr "Le fichier torrent {0} n'existe pas"
+
 #~ msgid "Copying torrent to {0}"
 #~ msgstr "Copie du torrent vers {0}"
+
 #~ msgid "from {0}"
 #~ msgstr "depuis {0}"
+
 #~ msgid "Downloading"
 #~ msgstr "Téléchargement en cours"
-#~ msgid "File"
-#~ msgstr "Fichier"
+
 #~ msgid "FileSize"
 #~ msgstr "Taille du fichier"
+
 #~ msgid "Download Status"
 #~ msgstr "État du téléchargement"
+
 #~ msgid "Details"
 #~ msgstr "Détails"
+
 #~ msgid "Depuis l'URL"
 #~ msgstr "Quell-URL"
+
 #~ msgid "Directory to store torrents and data"
 #~ msgstr "Répertoire de stockage des torrents et des données"
+
 #~ msgid "Cannot change the I2CP settings while torrents are active"
 #~ msgstr ""
 #~ "On ne peut changer les paramètres I2CP pendant que des torrents sont "
 #~ "actifs"
+
 #~ msgid "Non-i2p tracker in \"{0}\", deleting it from our list of trackers!"
 #~ msgstr ""
 #~ "Tracker non-i2p dans \"{0}\", suppression de notre liste de trackers!"
+
 #~ msgid "{0} torrents"
 #~ msgstr "{0} Torrents"
+
 #~ msgid "Uninteresting"
 #~ msgstr "Pas intéressant"
+
 #~ msgid "Choked"
 #~ msgstr "Choked"
+
 #~ msgid "Uninterested"
 #~ msgstr "Pas interessé"
+
 #~ msgid "Choking"
 #~ msgstr "Choking"
+
 #~ msgid "Custom tracker URL"
 #~ msgstr "URL tracker spécifique"
+
 #~ msgid "Configure"
 #~ msgstr "Configurer"
-
diff --git a/apps/i2psnark/locale/messages_nl.po b/apps/i2psnark/locale/messages_nl.po
index 1eebf765e8ec773d56a5615af0a0e47a67d56212..860e9d7fe07bf9d3e14dfd8b53521320f2f1935b 100644
--- a/apps/i2psnark/locale/messages_nl.po
+++ b/apps/i2psnark/locale/messages_nl.po
@@ -6,404 +6,459 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: I2P i2psnark\n"
+"Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-17 15:04+0000\n"
-"PO-Revision-Date: 2010-06-15 09:07+0100\n"
-"Last-Translator: duck <duck@mail.i2p>\n"
-"Language-Team: duck <duck@mail.i2p>, monkeybrains <monkeybrains@mail.i2p>\n"
+"POT-Creation-Date: 2011-03-03 18:28+0000\n"
+"PO-Revision-Date: 2011-02-20 12:15+0000\n"
+"Last-Translator: ducki2p <ducki2p@gmail.com>\n"
+"Language-Team: Dutch <>\n"
+"Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Dutch\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:94
-#, java-format
-msgid "Adding torrents in {0} minutes"
-msgstr "Torrents toevoegen in {0} minuten"
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:296
+#: ../java/src/org/klomp/snark/SnarkManager.java:307
 #, java-format
 msgid "Total uploaders limit changed to {0}"
 msgstr "Totale uploaders limiet gewijzigd in {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:298
+#: ../java/src/org/klomp/snark/SnarkManager.java:309
 #, java-format
 msgid "Minimum total uploaders limit is {0}"
 msgstr "Minimum totale uploaders limiet is {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:310
+#: ../java/src/org/klomp/snark/SnarkManager.java:321
 #, java-format
 msgid "Up BW limit changed to {0}KBps"
 msgstr "Up bandbreedte limiet gewijzigd in {0}KBps"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:312
+#: ../java/src/org/klomp/snark/SnarkManager.java:323
 #, java-format
 msgid "Minimum up bandwidth limit is {0}KBps"
 msgstr "Minimum up bandbreedte limiet is {0}KBps"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:324
+#: ../java/src/org/klomp/snark/SnarkManager.java:335
 #, java-format
-msgid "Startup delay limit changed to {0} minutes"
-msgstr "Startup vertragings limiet gewijzigd in {0} minuten"
+msgid "Startup delay changed to {0}"
+msgstr "Opstartvertraging gewijzigd in {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:371
+#: ../java/src/org/klomp/snark/SnarkManager.java:386
 msgid "I2CP and tunnel changes will take effect after stopping all torrents"
 msgstr ""
 "I2CP en tunnel wijzigingen hebben pas effect na het stoppen van alle torrents"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:378
+#: ../java/src/org/klomp/snark/SnarkManager.java:393
 msgid "Disconnecting old I2CP destination"
 msgstr "Oude I2CP destination wordt afgesloten"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:382
+#: ../java/src/org/klomp/snark/SnarkManager.java:397
 #, java-format
 msgid "I2CP settings changed to {0}"
 msgstr "I2CP instellingen gewijzigd in {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:386
+#: ../java/src/org/klomp/snark/SnarkManager.java:402
 msgid ""
 "Unable to connect with the new settings, reverting to the old I2CP settings"
 msgstr ""
 "Kan geen connectie maken met de nieuwe instellingen, we keren terug naar "
 "oude I2CP instellingen"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:390
+#: ../java/src/org/klomp/snark/SnarkManager.java:406
 msgid "Unable to reconnect with the old settings!"
 msgstr "Kan niet opnieuw verbinden met de oude instellingen!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:392
+#: ../java/src/org/klomp/snark/SnarkManager.java:408
 msgid "Reconnected on the new I2CP destination"
 msgstr "Opnieuw verbonden met de nieuwe I2CP destination"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:403
+#: ../java/src/org/klomp/snark/SnarkManager.java:418
 #, java-format
 msgid "I2CP listener restarted for \"{0}\""
 msgstr "I2CP listener herstart voor \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:414
+#: ../java/src/org/klomp/snark/SnarkManager.java:429
 msgid "Enabled autostart"
 msgstr "Autostart ingeschakeld"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:416
+#: ../java/src/org/klomp/snark/SnarkManager.java:431
 msgid "Disabled autostart"
 msgstr "Autostart uitgeschakeld"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:422
+#: ../java/src/org/klomp/snark/SnarkManager.java:437
 msgid "Enabled open trackers - torrent restart required to take effect."
 msgstr "Open Trackers ingeschakeld - torrent herstart nodig."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:424
+#: ../java/src/org/klomp/snark/SnarkManager.java:439
 msgid "Disabled open trackers - torrent restart required to take effect."
 msgstr "Open Trackers uitgeschakeld - torrent herstart nodig."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:431
+#: ../java/src/org/klomp/snark/SnarkManager.java:447
 msgid "Open Tracker list changed - torrent restart required to take effect."
 msgstr "Open Tracker lijst gewijzigd - torrent herstart nodig."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:438
+#: ../java/src/org/klomp/snark/SnarkManager.java:454
 #, java-format
 msgid "{0} theme loaded, return to main i2psnark page to view."
-msgstr "{0} thema geladen, ga naar de hoofd i2psnark pagina om deze te bekijken."
+msgstr ""
+"{0} thema geladen, ga naar de hoofd i2psnark pagina om deze te bekijken."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:445
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
 msgid "Configuration unchanged."
 msgstr "Configuratie ongewijzigd."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:455
+#: ../java/src/org/klomp/snark/SnarkManager.java:471
 #, java-format
 msgid "Unable to save the config to {0}"
 msgstr "Kan de configuratie niet opslaan in {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:494
+#: ../java/src/org/klomp/snark/SnarkManager.java:536
 msgid "Connecting to I2P"
 msgstr "Verbinden met I2P"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:497
+#: ../java/src/org/klomp/snark/SnarkManager.java:539
 msgid "Error connecting to I2P - check your I2CP settings!"
 msgstr "Fout bij verbinden met I2P - controlleer je I2CP instellingen!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:506
+#: ../java/src/org/klomp/snark/SnarkManager.java:548
 #, java-format
 msgid "Error: Could not add the torrent {0}"
 msgstr "Fout: Kan de torrent {0} niet toevoegen"
 
 #. catch this here so we don't try do delete it below
-#: ../java/src/org/klomp/snark/SnarkManager.java:528
+#: ../java/src/org/klomp/snark/SnarkManager.java:570
 #, java-format
 msgid "Cannot open \"{0}\""
 msgstr "Kan \"{0}\" niet openen"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:541
+#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
+#: ../java/src/org/klomp/snark/SnarkManager.java:586
+#: ../java/src/org/klomp/snark/SnarkManager.java:661
+#: ../java/src/org/klomp/snark/SnarkManager.java:716
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976
+#, java-format
+msgid "Torrent with this info hash is already running: {0}"
+msgstr "Torrent met deze info hash is al actief: {0}"
+
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:593
 #, java-format
 msgid ""
-"Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open "
-"trackers only"
+"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers "
+"only."
 msgstr ""
-"Waarschuwing - Niet-I2P tracker in \"{0}\" wordt genegeerd, zal alleen "
-"aankondigen naar i2p open trackers"
+"Waarschuwing - Niet-I2P trackers in \"{0}\", zal alleen aankondigen bij I2P "
+"open trackers."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:543
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:598
 #, java-format
 msgid ""
-"Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are "
-"disabled, you must enable open trackers before starting the torrent!"
+"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is "
+"enabled before starting this torrent."
 msgstr ""
-"Waarschuwing - Niet-I2P tracker in \"{0}\" wordt genegeerd, en open trackers "
-"zijn uitgeschakeld, je moet open trackers inschakelen voor het starten van "
-"de torrent!"
+"Waarschuwing - Niet-I2P Trackers gevonden in \"{0}\". Zorg ervoor dat Open "
+"Tracker is ingeschakeld voordat je deze torrent start."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:563
+#: ../java/src/org/klomp/snark/SnarkManager.java:619
 #, java-format
 msgid "Torrent in \"{0}\" is invalid"
 msgstr "Torrent in \"{0}\" is ongeldig"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:578
+#: ../java/src/org/klomp/snark/SnarkManager.java:624
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999
+#, java-format
+msgid "ERROR - Out of memory, cannot create torrent from {0}"
+msgstr "ERROR - Geen geheugen meer, kan geen torrent maken van {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:635
 #, java-format
 msgid "Torrent added and started: \"{0}\""
 msgstr "Torrent toegevoegd en gestart: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:580
+#: ../java/src/org/klomp/snark/SnarkManager.java:637
 #, java-format
 msgid "Torrent added: \"{0}\""
 msgstr "Torrent toegevoegd: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:734
+#: ../java/src/org/klomp/snark/SnarkManager.java:672
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490
+#, java-format
+msgid "Fetching {0}"
+msgstr "Downloaden {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:675
+#, java-format
+msgid ""
+"We have no saved peers and no other torrents are running. Fetch of {0} will "
+"not succeed until you start another torrent."
+msgstr ""
+"We hebben geen opgeslagen peers en er zijn geen andere torrents actief. Het "
+"ophalen van {0} zal niet lukken totdat je een andere torrent start."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:679
+#, java-format
+msgid "Adding {0}"
+msgstr "Toevoegen van {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:726
+#: ../java/src/org/klomp/snark/SnarkManager.java:749
+#: ../java/src/org/klomp/snark/SnarkManager.java:1174
+#, java-format
+msgid "Failed to copy torrent file to {0}"
+msgstr "Kan het torrent bestand niet kopieren naar {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:972
 #, java-format
 msgid "Too many files in \"{0}\" ({1}), deleting it!"
 msgstr "Te veel bestanden in \"{0}\" ({1}), wordt verwijderd!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:736
+#: ../java/src/org/klomp/snark/SnarkManager.java:974
 #, java-format
 msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
 msgstr ""
 "Torrent bestand \"{0}\" kan niet eindigen in \".torrent\", wordt verwijderd!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:738
+#: ../java/src/org/klomp/snark/SnarkManager.java:976
 #, java-format
 msgid "No pieces in \"{0}\",  deleting it!"
 msgstr "Geen stukken in \"{0}\",  wordt verwijderd!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:740
+#: ../java/src/org/klomp/snark/SnarkManager.java:978
 #, java-format
 msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
 msgstr "Te veel stukken in \"{0}\", limiet is {1}, wordt verwijderd!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:742
+#: ../java/src/org/klomp/snark/SnarkManager.java:980
 #, java-format
 msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
 msgstr "Stukken zijn te groot in \"{0}\" ({1}B), wordt verwijderd."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:743
+#: ../java/src/org/klomp/snark/SnarkManager.java:981
 #, java-format
 msgid "Limit is {0}B"
 msgstr "Limiet is {0}B"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:751
+#: ../java/src/org/klomp/snark/SnarkManager.java:989
 #, java-format
 msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
 msgstr ""
 "Torrents groter dan {0}B worden nog niet ondersteund, verwijder \"{1}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:767
+#: ../java/src/org/klomp/snark/SnarkManager.java:1005
 #, java-format
 msgid "Error: Could not remove the torrent {0}"
 msgstr "Fout: Kan de torrent {0} niet verwijderen"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:794
+#: ../java/src/org/klomp/snark/SnarkManager.java:1026
+#: ../java/src/org/klomp/snark/SnarkManager.java:1044
 #, java-format
 msgid "Torrent stopped: \"{0}\""
 msgstr "Torrent gestopt: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:814
+#: ../java/src/org/klomp/snark/SnarkManager.java:1065
 #, java-format
 msgid "Torrent removed: \"{0}\""
 msgstr "Torrent verwijderd: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:852
+#: ../java/src/org/klomp/snark/SnarkManager.java:1073
+#, java-format
+msgid "Adding torrents in {0}"
+msgstr "Toevoegen van torrents in {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1122
 #, java-format
 msgid "Download finished: {0}"
 msgstr "Download gereed: {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:880
+#: ../java/src/org/klomp/snark/SnarkManager.java:1170
+#, java-format
+msgid "Metainfo received for {0}"
+msgstr "Metainfo ontvangen voor {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1171
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525
+#, java-format
+msgid "Starting up torrent {0}"
+msgstr "Starten met torrent {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1225
 msgid "Unable to connect to I2P!"
 msgstr "Kan niet verbinden met I2P!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:886
+#: ../java/src/org/klomp/snark/SnarkManager.java:1231
 #, java-format
 msgid "Unable to add {0}"
 msgstr "Kan {0} niet toevoegen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
 msgid "I2PSnark - Anonymous BitTorrent Client"
 msgstr "I2PSnark - Anonieme BitTorrent Client"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218
 msgid "Torrents"
 msgstr "Torrents"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:201
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:208
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
 msgid "I2PSnark"
 msgstr "I2PSnark"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225
 msgid "Refresh page"
 msgstr "Ververs pagina"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230
 msgid "Forum"
 msgstr "Forum"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719
 msgid "Status"
 msgstr "Status"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292
 msgid "Hide Peers"
 msgstr "Verberg Peers"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:279
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299
 msgid "Show Peers"
 msgstr "Toon Peers"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659
 msgid "Torrent"
 msgstr "Torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310
 msgid "Estimated time remaining"
 msgstr "Schatting resterende tijd"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:293
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313
 msgid "ETA"
 msgstr "ETA"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
 msgid "Downloaded"
 msgstr "Gedownload"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:314
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
 msgid "RX"
 msgstr "RX"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
 msgid "Uploaded"
 msgstr "Geupload"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
 msgid "TX"
 msgstr "TX"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332
 msgid "Down Rate"
 msgstr "Down Snelheid"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
 msgid "Rate"
 msgstr "Rato"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
 msgid "Up Rate"
 msgstr "Up Snelheid"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
 msgid "Stop all torrents and the I2P tunnel"
 msgstr "Stop alle torrents en de I2P tunnel"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367
 msgid "Stop All"
 msgstr "Stop Alle"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376
 msgid "Start all torrents and the I2P tunnel"
 msgstr "Start alle torrents en de I2P tunnel"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378
 msgid "Start All"
 msgstr "Start Alle"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
 msgid "No torrents loaded."
 msgstr "Geen torrents geladen."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402
 msgid "Totals"
 msgstr "Totalen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
 #, java-format
 msgid "1 torrent"
 msgid_plural "{0} torrents"
 msgstr[0] "1 torrent"
 msgstr[1] "{0} torrents"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:382
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
 #, java-format
 msgid "1 connected peer"
 msgid_plural "{0} connected peers"
 msgstr[0] "1 verbonden peer"
 msgstr[1] "{0} verbonden peers"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496
 #, java-format
-msgid "Fetching {0}"
-msgstr "Downloaden {0}"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458
-msgid "Invalid URL - must start with http://"
-msgstr "Ongeldige URL - moet beginnen met http://"
+msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
+msgstr "Ongeldige URL: moet beginnen met \"http://\", \"{0}\", of \"{1}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:489
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
 #, java-format
-msgid "Starting up torrent {0}"
-msgstr "Starten met torrent {0}"
+msgid "Magnet deleted: {0}"
+msgstr "Magnet verwijderd: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577
 #, java-format
 msgid "Torrent file deleted: {0}"
 msgstr "Torrent bestand verwijderd: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:533
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:543
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593
 #, java-format
 msgid "Data file deleted: {0}"
 msgstr "Data bestand verwijderd: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595
 #, java-format
 msgid "Data file could not be deleted: {0}"
 msgstr "Kan data bestand niet verwijderen: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604
 #, java-format
 msgid "Data dir deleted: {0}"
 msgstr "Data directory verwijderd: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637
 msgid "Error creating torrent - you must select a tracker"
 msgstr "Fout bij maken van torrent - je moet een tracker selecteren"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653
 #, java-format
 msgid "Torrent created for \"{0}\""
 msgstr "Torrent gemaakt voor \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655
 #, java-format
 msgid ""
 "Many I2P trackers require you to register new torrents before seeding - "
@@ -412,121 +467,117 @@ msgstr ""
 "Veel I2P trackers vereisen dat je de nieuwe torrent registreert voor het "
 "seeden - doe dit voordat je \"{0}\" start"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:607
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657
 #, java-format
 msgid "Error creating a torrent for \"{0}\""
 msgstr "Fout bij het maken van een torrent voor \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660
 #, java-format
 msgid "Cannot create a torrent for the nonexistent data: {0}"
 msgstr "Kan geen torrent maken voor niet-bestaande data: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
 msgid "Error creating torrent - you must enter a file or directory"
 msgstr ""
 "Fout bij het maken van de torrent - je moet een bestand of directory invullen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
 msgid "Stopping all torrents and closing the I2P tunnel."
 msgstr "Stoppen van alle torrents en sluiten van I2P tunnel."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677
 msgid "I2P tunnel closed."
 msgstr "I2P tunnel gesloten."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
 msgid "Opening the I2P tunnel and starting all torrents."
 msgstr "Openen van de I2P tunnel en starten van alle torrents."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:764
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814
 msgid "Tracker Error"
 msgstr "Tracker Fout"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:766
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:778
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:782
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:790
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847
 #, java-format
 msgid "1 peer"
 msgid_plural "{0} peers"
 msgstr[0] "1 peer"
 msgstr[1] "{0} peers"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824
 msgid "Seeding"
 msgstr "Seeding"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:784
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
 msgid "Complete"
 msgstr "Voltooid"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
 msgid "OK"
 msgstr "OK"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
 msgid "Stalled"
 msgstr "Vastgelopen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
 msgid "No Peers"
 msgstr "Geen Peers"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
 msgid "Stopped"
 msgstr "Gestopt"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837
-#, java-format
-msgid "Details at {0} tracker"
-msgstr "Details op de {0} tracker"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886
+msgid "Torrent details"
+msgstr "Torrent details"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160
 msgid "Info"
 msgstr "Info"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913
 msgid "View files"
 msgstr "Bekijk bestanden"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915
 msgid "Open file"
 msgstr "Open bestand"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:865
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569
-msgid "Open"
-msgstr "Open"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957
 msgid "Stop the torrent"
 msgstr "Stop de torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959
 msgid "Stop"
 msgstr "Stop"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969
 msgid "Start the torrent"
 msgstr "Start de torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971
 msgid "Start"
 msgstr "Start"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
 msgid "Remove the torrent from the active list, deleting the .torrent file"
 msgstr ""
 "Verwijder de torrent van de actieve lijst, het .torrent bestand wordt "
@@ -535,7 +586,7 @@ msgstr ""
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
 #, java-format
 msgid ""
 "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
@@ -544,18 +595,18 @@ msgstr ""
 "Weet je zeker dat je het bestand \\''{0}.torrent\\'' wilt verwijderen "
 "(gedownloade data zal niet worden verwijderd) ?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:941
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
 msgid "Remove"
 msgstr "Weghalen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:950
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
 msgid "Delete the .torrent file and the associated data file(s)"
 msgstr "Verwijder het .torrent bestand en de gerelateerde data bestand(en)"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
 #, java-format
 msgid ""
 "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
@@ -564,151 +615,163 @@ msgstr ""
 "Weet je zeker dat je de torrent \\''{0}\\'' en alle gedownloade data wilt "
 "verwijderen?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
 msgid "Delete"
 msgstr "Verwijderen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:991
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
 msgid "Unknown"
 msgstr "Onbekend"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
 msgid "Seed"
 msgstr "Seed"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077
 msgid "Uninteresting (The peer has no pieces we need)"
 msgstr "Niet interessant (De peer heeft geen stukken die we nodig hebben)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079
 msgid "Choked (The peer is not allowing us to request pieces)"
 msgstr "Verstikt (De peer laat ons niet toe om stukken op te vragen)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099
 msgid "Uninterested (We have no pieces the peer needs)"
 msgstr "Niet geïnteresseerd (We heben geen stukken die de peer nodig heeft)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101
 msgid "Choking (We are not allowing the peer to request pieces)"
 msgstr "Verstikt (We laten de peer niet toe om stukken op te vragen)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1092
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159
+#, java-format
+msgid "Details at {0} tracker"
+msgstr "Details op de {0} tracker"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188
 msgid "Add Torrent"
 msgstr "Torrent Toevoegen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
 msgid "From URL"
 msgstr "Van URL"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1097
-msgid "Torrent file must originate from an I2P-based tracker"
-msgstr "Torrent bestand moet vaan een I2P tracker komen"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193
+msgid ""
+"Enter the torrent file download URL (I2P only), magnet link, or maggot link"
+msgstr "Geef de torrent download URL (alleen I2P), magnet link, of maggot link"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
 msgid "Add torrent"
 msgstr "Torrent toevoegen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201
 #, java-format
 msgid "You can also copy .torrent files to: {0}."
 msgstr "Je kan ook .torrent bestanden kopieren naar: {0}."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203
 msgid "Removing a .torrent will cause it to stop."
 msgstr "Verwijderen van een .torrent zorgt dat deze stopt."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
 msgid "Create Torrent"
 msgstr "Creëer Torrent"
 
 #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229
 msgid "Data to seed"
 msgstr "Data om te seeden"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1138
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233
 msgid "File or directory to seed (must be within the specified path)"
 msgstr ""
 "Bestand of directory om te seeden (moet binnen het gespecificeerde pad zijn)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1140
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
 msgid "Tracker"
 msgstr "Tracker"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
 msgid "Select a tracker"
 msgstr "Selecteer een tracker"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1155
+#. out.write(_("Open trackers and DHT only"));
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
+msgid "Open trackers only"
+msgstr "Alleen Open trackers"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
 msgid "or"
 msgstr "of"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1158
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260
 msgid "Specify custom tracker announce URL"
 msgstr "Specificeer aangepaste tracker aankondigings URL"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
 msgid "Create torrent"
 msgstr "Creëer torrent"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1180
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
 msgid "Configuration"
 msgstr "Configuratie"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1184
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285
 msgid "Data directory"
 msgstr "Data directory"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287
 msgid "Edit i2psnark.config and restart to change"
 msgstr "Bewerk i2psnark.config en herstart de wijziging"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
 msgid "Auto start"
 msgstr "Auto start"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
 msgid "If checked, automatically start torrents that are added"
 msgstr "Indien aangevinkt, start toegevoegde torrents automatisch"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299
 msgid "Theme"
 msgstr "Thema"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
 msgid "Startup delay"
 msgstr "Startup vertraging"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1213
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314
 msgid "minutes"
 msgstr "minuten"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
 msgid "Total uploader limit"
 msgstr "Totale uploader limiet"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341
 msgid "peers"
 msgstr "peers"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345
 msgid "Up bandwidth limit"
 msgstr "Up bandbreedte limiet"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348
 msgid "Half available bandwidth recommended."
 msgstr "Helft van beschikbare bandbreedte aanbevolen."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
 msgid "View or change router bandwidth"
 msgstr "Bekijk of wijzig router bandbreedte"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354
 msgid "Use open trackers also"
 msgstr "Gebruik ook open trackers"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358
 msgid ""
 "If checked, announce torrents to open trackers as well as the tracker listed "
 "in the torrent file"
@@ -716,123 +779,155 @@ msgstr ""
 "Indien aangevinkt, kondig torrents ook aan bij de tracker uit het torrent "
 "bestand"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362
 msgid "Open tracker announce URLs"
 msgstr "Open tracker aankondigings URLs"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1273
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374
 msgid "Inbound Settings"
 msgstr "Inkomende Instellingen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380
 msgid "Outbound Settings"
 msgstr "Uitgaande Instellingen"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388
 msgid "I2CP host"
 msgstr "I2CP host"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393
 msgid "I2CP port"
 msgstr "I2CP poort"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1303
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406
 msgid "I2CP options"
 msgstr "I2CP opties"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1308
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
 msgid "Save configuration"
 msgstr "Configuratie opslaan"
 
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436
+#, java-format
+msgid "Invalid magnet URL {0}"
+msgstr "Ongeldige magnet URL {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470
+#, java-format
+msgid "Invalid info hash in magnet URL {0}"
+msgstr "Ongeldige info hash in magnet URL {0}"
+
 #. * dummies for translation
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1325
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500
 #, java-format
 msgid "1 hop"
 msgid_plural "{0} hops"
 msgstr[0] "1 hop"
 msgstr[1] "{0} hops"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501
 #, java-format
 msgid "1 tunnel"
 msgid_plural "{0} tunnels"
 msgstr[0] "1 tunnel"
 msgstr[1] "{0} tunnels"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663
+msgid "Completion"
+msgstr "Voltooiing"
+
+#. else unknown
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
 msgid "Size"
 msgstr "Grootte"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672
+msgid "Files"
+msgstr "Bestanden"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674
+msgid "Pieces"
+msgstr "Stukken"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675
+msgid "Piece size"
+msgstr "Stukgrootte"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697
+msgid "Magnet link"
+msgstr "Magnet link"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753
+msgid "Directory"
+msgstr "Directory"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
 msgid "Priority"
 msgstr "Prioriteit"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728
 msgid "Up to higher level directory"
 msgstr "Naar bovenliggende directory"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517
-msgid "Directory"
-msgstr "Directory"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
 msgid "Torrent not found?"
 msgstr "Torrent niet gevonden?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767
 msgid "File not found in torrent?"
 msgstr "Bestand niet gevonden in torrent?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
 msgid "complete"
 msgstr "voltooid"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781
 msgid "bytes remaining"
 msgstr "bytes resterend"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
+msgid "Open"
+msgstr "Open"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832
 msgid "High"
 msgstr "Hoog"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1600
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837
 msgid "Normal"
 msgstr "Normaal"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1605
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842
 msgid "Skip"
 msgstr "Overslaan"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1614
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851
 msgid "Save priorities"
 msgstr "Prioriteiten opslaan"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967
 #, java-format
 msgid "Torrent fetched from {0}"
 msgstr "Torrent gedownload van {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1746
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989
 #, java-format
 msgid "Torrent already running: {0}"
 msgstr "Torrent draait al: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991
 #, java-format
 msgid "Torrent already in the queue: {0}"
 msgstr "Torrent zit al in de wachtrij: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755
-#, java-format
-msgid "Failed to copy torrent file to {0}"
-msgstr "Kan het torrent bestand niet kopieren naar {0}"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997
 #, java-format
 msgid "Torrent at {0} was not valid"
 msgstr "Torrent op {0} was niet geldig"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004
 #, java-format
 msgid "Torrent was not retrieved from {0}"
 msgstr "Torrent was niet ontvangen van {0}"
diff --git a/apps/i2psnark/locale/messages_pt.po b/apps/i2psnark/locale/messages_pt.po
index 4c9547c316ae71494a2f1ed276f20679305c7b81..ae9ed03c8e289973f1f7fa68b68041ae43627a05 100644
--- a/apps/i2psnark/locale/messages_pt.po
+++ b/apps/i2psnark/locale/messages_pt.po
@@ -8,857 +8,1018 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P i2psnark\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 03:16+0000\n"
-"PO-Revision-Date: 2010-12-31 01:09+0100\n"
+"POT-Creation-Date: 2011-03-03 18:28+0000\n"
+"PO-Revision-Date: 2011-02-27 18:48+0100\n"
 "Last-Translator: mixxy <m1xxy@mail.i2p>\n"
 "Language-Team: foo <foo@bar>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Poedit-Language: Spanish\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:94
-#, java-format
-msgid "Adding torrents in {0} minutes"
-msgstr "Os torrents serão adicionados em {0} minutos ..."
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:296
+#: ../java/src/org/klomp/snark/SnarkManager.java:307
 #, java-format
 msgid "Total uploaders limit changed to {0}"
 msgstr "Limite total de subidores mudado a {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:298
+#: ../java/src/org/klomp/snark/SnarkManager.java:309
 #, java-format
 msgid "Minimum total uploaders limit is {0}"
 msgstr "O limite mínimo de subidores é {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:310
+#: ../java/src/org/klomp/snark/SnarkManager.java:321
 #, java-format
 msgid "Up BW limit changed to {0}KBps"
 msgstr "Largura de banda para a subida foi mudada para {0} kbyte/s."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:312
+#: ../java/src/org/klomp/snark/SnarkManager.java:323
 #, java-format
 msgid "Minimum up bandwidth limit is {0}KBps"
 msgstr "O limite mínimo da largura de banda para a subida está em {0} kbyte/s."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:324
-#, java-format
-msgid "Startup delay limit changed to {0} minutes"
+#: ../java/src/org/klomp/snark/SnarkManager.java:335
+#, fuzzy, java-format
+msgid "Startup delay changed to {0}"
 msgstr "Demora do arranque mudado a {0} minutos"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:371
+#: ../java/src/org/klomp/snark/SnarkManager.java:386
 msgid "I2CP and tunnel changes will take effect after stopping all torrents"
-msgstr "Mudanças do I2CP e do túnel terão efeito depois de parar todos os torrents"
+msgstr ""
+"Mudanças do I2CP e do túnel terão efeito depois de deter todos os torrentes"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:378
+#: ../java/src/org/klomp/snark/SnarkManager.java:393
 msgid "Disconnecting old I2CP destination"
 msgstr "Desconectando anterior Destinação I2CP"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:382
+#: ../java/src/org/klomp/snark/SnarkManager.java:397
 #, java-format
 msgid "I2CP settings changed to {0}"
 msgstr "Preferências de I2CP mudadas a {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:386
-msgid "Unable to connect with the new settings, reverting to the old I2CP settings"
-msgstr "Conectar-se não foi posível com as novas preferências I2CP, utilizarei as anteriores."
+#: ../java/src/org/klomp/snark/SnarkManager.java:402
+msgid ""
+"Unable to connect with the new settings, reverting to the old I2CP settings"
+msgstr ""
+"Conectar-se não foi posível com as novas preferências I2CP, utilizarei as "
+"anteriores."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:390
+#: ../java/src/org/klomp/snark/SnarkManager.java:406
 msgid "Unable to reconnect with the old settings!"
 msgstr "Impossível se conectar usando as preferências anteriores!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:392
+#: ../java/src/org/klomp/snark/SnarkManager.java:408
 msgid "Reconnected on the new I2CP destination"
 msgstr "Conectado com a nova Destinação I2CP"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:403
+#: ../java/src/org/klomp/snark/SnarkManager.java:418
 #, java-format
 msgid "I2CP listener restarted for \"{0}\""
 msgstr "Conexão I2CP re-estabelecida para \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:414
+#: ../java/src/org/klomp/snark/SnarkManager.java:429
 msgid "Enabled autostart"
 msgstr "Ativado o iniciar automáticamente"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:416
+#: ../java/src/org/klomp/snark/SnarkManager.java:431
 msgid "Disabled autostart"
 msgstr "Desativado o iniciar automáticamente"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:422
+#: ../java/src/org/klomp/snark/SnarkManager.java:437
 msgid "Enabled open trackers - torrent restart required to take effect."
-msgstr "Uso de rastreadores abertos ativado - Para ter efeito é necesário reiniciar os torrents."
+msgstr ""
+"Uso de rastreadores abertos ativado - Para ter efeito é necesário reiniciar "
+"os torrentes."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:424
+#: ../java/src/org/klomp/snark/SnarkManager.java:439
 msgid "Disabled open trackers - torrent restart required to take effect."
-msgstr "Uso dos rastreadores abertos desativado - Para ter efeito é necesário reiniciar os torrents."
+msgstr ""
+"Uso dos rastreadores abertos desativado - Para ter efeito é necesário "
+"reiniciar os torrentes."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:431
+#: ../java/src/org/klomp/snark/SnarkManager.java:447
 msgid "Open Tracker list changed - torrent restart required to take effect."
-msgstr "Listado de rastreadores abertos mudado - Para ter efeito é necesário reiniciar os torrents."
+msgstr ""
+"Listado de rastreadores abertos mudado - Para ter efeito é necesário "
+"reiniciar os torrentes."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:438
+#: ../java/src/org/klomp/snark/SnarkManager.java:454
 #, java-format
 msgid "{0} theme loaded, return to main i2psnark page to view."
 msgstr "Tema {0} foi carregado. Volte no menú principal para vê-lo."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:445
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
 msgid "Configuration unchanged."
 msgstr "Configuração não mudada."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:455
+#: ../java/src/org/klomp/snark/SnarkManager.java:471
 #, java-format
 msgid "Unable to save the config to {0}"
 msgstr "Não se pode guardar a configuração em {0}."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:494
+#: ../java/src/org/klomp/snark/SnarkManager.java:536
 msgid "Connecting to I2P"
 msgstr "Conectando com I2P"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:497
+#: ../java/src/org/klomp/snark/SnarkManager.java:539
 msgid "Error connecting to I2P - check your I2CP settings!"
 msgstr "Erro ao se conectar com I2P - Verifique a sua configuração I2CP!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:506
+#: ../java/src/org/klomp/snark/SnarkManager.java:548
 #, java-format
 msgid "Error: Could not add the torrent {0}"
-msgstr "Erro: Não se pode adicionar o torrent {0}."
+msgstr "Erro: Não se pode adicionar o torrente {0}."
 
 #. catch this here so we don't try do delete it below
-#: ../java/src/org/klomp/snark/SnarkManager.java:528
+#: ../java/src/org/klomp/snark/SnarkManager.java:570
 #, java-format
 msgid "Cannot open \"{0}\""
 msgstr "Não pode se abrir \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:541
-#, java-format
-msgid "Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only"
-msgstr "Aviso - Se ignorará rastreado não I2P no \"{0}\", anunciando só aos rastreadores abertos do I2P"
+#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
+#: ../java/src/org/klomp/snark/SnarkManager.java:586
+#: ../java/src/org/klomp/snark/SnarkManager.java:661
+#: ../java/src/org/klomp/snark/SnarkManager.java:716
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976
+#, fuzzy, java-format
+msgid "Torrent with this info hash is already running: {0}"
+msgstr "torrente já em marcha: {0}"
+
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:593
+#, fuzzy, java-format
+msgid ""
+"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers "
+"only."
+msgstr ""
+"Aviso - Se ignorará rastreado não I2P no \"{0}\", anunciando só aos "
+"rastreadores abertos do I2P"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:543
-#, java-format
-msgid "Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!"
-msgstr "Aviso - Se ignorará rastreador não I2P no \"{0}\", rastreadores abertos estão desativados. Tens que ativá-los antes de iniciar o torrent!"
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:598
+#, fuzzy, java-format
+msgid ""
+"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is "
+"enabled before starting this torrent."
+msgstr ""
+"Aviso - Se ignorará rastreador não I2P no \"{0}\", rastreadores abertos "
+"estão desativados. Tens que ativá-los antes de iniciar o torrente!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:563
+#: ../java/src/org/klomp/snark/SnarkManager.java:619
 #, java-format
 msgid "Torrent in \"{0}\" is invalid"
 msgstr "O arquivo .torrent em \"{0}\" não é válido."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:578
+#: ../java/src/org/klomp/snark/SnarkManager.java:624
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999
+#, java-format
+msgid "ERROR - Out of memory, cannot create torrent from {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:635
 #, java-format
 msgid "Torrent added and started: \"{0}\""
-msgstr "Torrent adicionado e iniciado: \"{0}\""
+msgstr "torrente adicionado e iniciado: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:580
+#: ../java/src/org/klomp/snark/SnarkManager.java:637
 #, java-format
 msgid "Torrent added: \"{0}\""
-msgstr "Torrent adicionado: \"{0}\""
+msgstr "torrente adicionado: \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:672
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490
+#, java-format
+msgid "Fetching {0}"
+msgstr "Buscando {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:675
+#, java-format
+msgid ""
+"We have no saved peers and no other torrents are running. Fetch of {0} will "
+"not succeed until you start another torrent."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:679
+#, fuzzy, java-format
+msgid "Adding {0}"
+msgstr "Buscando {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:734
+#: ../java/src/org/klomp/snark/SnarkManager.java:726
+#: ../java/src/org/klomp/snark/SnarkManager.java:749
+#: ../java/src/org/klomp/snark/SnarkManager.java:1174
+#, java-format
+msgid "Failed to copy torrent file to {0}"
+msgstr "Não se pode copiar o torrente para {0}."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:972
 #, java-format
 msgid "Too many files in \"{0}\" ({1}), deleting it!"
 msgstr "Ha arquivos demais no  \"{0}\", se apagará ({1}). "
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:736
+#: ../java/src/org/klomp/snark/SnarkManager.java:974
 #, java-format
 msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
-msgstr "O arquivo de dados do torrent \"{0}\" não pode terminar em \".torrent' e será apagado."
+msgstr ""
+"O arquivo de dados do torrente \"{0}\" não pode terminar em \".torrent' e "
+"será apagado."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:738
+#: ../java/src/org/klomp/snark/SnarkManager.java:976
 #, java-format
 msgid "No pieces in \"{0}\",  deleting it!"
 msgstr "Não ha peças no \"{0}\", se apagará."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:740
+#: ../java/src/org/klomp/snark/SnarkManager.java:978
 #, java-format
 msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
 msgstr "Ha peças demais no  \"{0}\" e o limite é {1}. Se apagarão."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:742
+#: ../java/src/org/klomp/snark/SnarkManager.java:980
 #, java-format
 msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
 msgstr "Peças no \"{0}\" são grandes demais ({1}B). Se apagarão."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:743
+#: ../java/src/org/klomp/snark/SnarkManager.java:981
 #, java-format
 msgid "Limit is {0}B"
 msgstr "O limite são \"{0}\"Bytes"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:751
+#: ../java/src/org/klomp/snark/SnarkManager.java:989
 #, java-format
 msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
-msgstr "Torrents maiores que \"{0}\" Bytes ainda não funcionam, se apagará \"{1}\"."
+msgstr ""
+"torrentes maiores que \"{0}\" Bytes ainda não funcionam, se apagará \"{1}\"."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:767
+#: ../java/src/org/klomp/snark/SnarkManager.java:1005
 #, java-format
 msgid "Error: Could not remove the torrent {0}"
-msgstr "Erro: Não se pode quitar o torrent \"{0}\"."
+msgstr "Erro: Não se pode quitar o torrente \"{0}\"."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:794
+#: ../java/src/org/klomp/snark/SnarkManager.java:1026
+#: ../java/src/org/klomp/snark/SnarkManager.java:1044
 #, java-format
 msgid "Torrent stopped: \"{0}\""
-msgstr "Torrent parado: \"{0}\""
+msgstr "torrente detido: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:814
+#: ../java/src/org/klomp/snark/SnarkManager.java:1065
 #, java-format
 msgid "Torrent removed: \"{0}\""
-msgstr "Torrent quitado: \"{0}\""
+msgstr "torrente quitado: \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1073
+#, fuzzy, java-format
+msgid "Adding torrents in {0}"
+msgstr "Os torrentes serão adicionados em {0} minutos ..."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:852
+#: ../java/src/org/klomp/snark/SnarkManager.java:1122
 #, java-format
 msgid "Download finished: {0}"
 msgstr "Finalizada a descarga de \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:880
+#: ../java/src/org/klomp/snark/SnarkManager.java:1170
+#, fuzzy, java-format
+msgid "Metainfo received for {0}"
+msgstr "Não se pode obter torrente de {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1171
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525
+#, java-format
+msgid "Starting up torrent {0}"
+msgstr "Iniciando o torrente {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1225
 msgid "Unable to connect to I2P!"
 msgstr "Impossível de se conectar com I2P"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:886
+#: ../java/src/org/klomp/snark/SnarkManager.java:1231
 #, java-format
 msgid "Unable to add {0}"
 msgstr "Impossível de adicionar {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
 msgid "I2PSnark - Anonymous BitTorrent Client"
 msgstr "I2PSnark - Cliente de BitTorrent Anônimo"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218
 msgid "Torrents"
-msgstr "Torrents"
+msgstr "torrentes"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:201
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:208
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
 msgid "I2PSnark"
 msgstr "I2PSnark"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225
 msgid "Refresh page"
 msgstr "Atualizar página"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230
 msgid "Forum"
 msgstr "Foro"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719
 msgid "Status"
 msgstr "Estado"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292
 msgid "Hide Peers"
-msgstr "ocultar pares"
+msgstr "ocultar parceiros"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:279
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299
 msgid "Show Peers"
-msgstr "mostrar pares"
+msgstr "mostrar parceiros"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659
 msgid "Torrent"
-msgstr "Torrent"
+msgstr "torrente"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310
 msgid "Estimated time remaining"
 msgstr "Tempo que falta para completar"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:293
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313
 msgid "ETA"
 msgstr "Tempo"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
 msgid "Downloaded"
 msgstr "Descarregado"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:314
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
 msgid "RX"
 msgstr "Baixado"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
 msgid "Uploaded"
 msgstr "Subido"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
 msgid "TX"
 msgstr "Subido"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332
 msgid "Down Rate"
 msgstr "Taça de descarga"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
 msgid "Rate"
 msgstr "Taça"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
 msgid "Up Rate"
 msgstr "Taça de subida"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
 msgid "Stop all torrents and the I2P tunnel"
-msgstr "Parar todos os torrents e o túnel I2P"
+msgstr "Deter todos os torrentes e o túnel I2P"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367
 msgid "Stop All"
-msgstr "Parar tudos"
+msgstr "Deter tudos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376
 msgid "Start all torrents and the I2P tunnel"
-msgstr "Iniciar todos os torrents e o túnel I2P"
+msgstr "Iniciar todos os torrentes e o túnel I2P"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378
 msgid "Start All"
 msgstr "Arrancar todos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
 msgid "No torrents loaded."
-msgstr "Não carregado nenhum torrent"
+msgstr "Não carregado nenhum torrente"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402
 msgid "Totals"
 msgstr "Total"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
 #, java-format
 msgid "1 torrent"
 msgid_plural "{0} torrents"
-msgstr[0] "1 torrent"
-msgstr[1] "{0} torrents"
+msgstr[0] "1 torrente"
+msgstr[1] "{0} torrentes"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:382
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
 #, java-format
 msgid "1 connected peer"
 msgid_plural "{0} connected peers"
-msgstr[0] "1 par conectado"
-msgstr[1] "{0} pares conectados"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454
-#, java-format
-msgid "Fetching {0}"
-msgstr "Buscando {0}"
+msgstr[0] "1 parceiro conectado"
+msgstr[1] "{0} parceiros conectados"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458
-msgid "Invalid URL - must start with http://"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496
+#, fuzzy, java-format
+msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
 msgstr "Endereço não válido - tem que começar com http://"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:489
-#, java-format
-msgid "Starting up torrent {0}"
-msgstr "Iniciando o torrent {0}"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
+#, fuzzy, java-format
+msgid "Magnet deleted: {0}"
+msgstr "Apagada a pasta de dados: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577
 #, java-format
 msgid "Torrent file deleted: {0}"
-msgstr "Apagado o arquivo torrent: {0}"
+msgstr "Apagado o arquivo torrente: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:533
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:543
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593
 #, java-format
 msgid "Data file deleted: {0}"
 msgstr "Apagado o arquivo de dados: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595
 #, java-format
 msgid "Data file could not be deleted: {0}"
 msgstr "Não se pode apagar o arquivo de dados: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604
 #, java-format
 msgid "Data dir deleted: {0}"
 msgstr "Apagada a pasta de dados: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637
 msgid "Error creating torrent - you must select a tracker"
-msgstr "Erro ao criar o torrent - Tens que elegir um rastreador."
+msgstr "Erro ao criar o torrente - Tens que elegir um rastreador."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653
 #, java-format
 msgid "Torrent created for \"{0}\""
-msgstr "Torrent criado para \"{0}\""
+msgstr "torrente criado para \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655
 #, java-format
-msgid "Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\""
-msgstr "Muitos rastreadores no I2P exigem que você registre novos torrents antes de poder semeá-los. Por favor, faça isto antes de iniciar \"{0}\"!"
+msgid ""
+"Many I2P trackers require you to register new torrents before seeding - "
+"please do so before starting \"{0}\""
+msgstr ""
+"Muitos rastreadores no I2P exigem que você registre novos torrentes antes de "
+"poder semeá-los. Por favor, faça isto antes de iniciar \"{0}\"!"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:607
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657
 #, java-format
 msgid "Error creating a torrent for \"{0}\""
-msgstr "Erro ao criar o torrent \"{0}\""
+msgstr "Erro ao criar o torrente \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660
 #, java-format
 msgid "Cannot create a torrent for the nonexistent data: {0}"
-msgstr "Não se pode criar um torrent para dados que não existam: {0}"
+msgstr "Não se pode criar um torrente para dados que não existam: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
 msgid "Error creating torrent - you must enter a file or directory"
-msgstr "Erro ao criar o torrent - Tens que especificar um arquivo ou uma pasta."
+msgstr ""
+"Erro ao criar o torrente - Tens que especificar um arquivo ou uma pasta."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
 msgid "Stopping all torrents and closing the I2P tunnel."
-msgstr "Parando todos os torrents e fechando o túnel I2P"
+msgstr "Detindo todos os torrentes e fechando o túnel I2P"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677
 msgid "I2P tunnel closed."
 msgstr "Túnel I2P fechado"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
 msgid "Opening the I2P tunnel and starting all torrents."
-msgstr "Abrendo o túnel I2P e iniciando os torrents ..."
+msgstr "Abrendo o túnel I2P e iniciando os torrentes ..."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:764
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814
 msgid "Tracker Error"
 msgstr "Erro do rastreador"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:766
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:778
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:782
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:790
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847
 #, java-format
 msgid "1 peer"
 msgid_plural "{0} peers"
-msgstr[0] "1 par"
-msgstr[1] "{0} pares"
+msgstr[0] "1 parceiro"
+msgstr[1] "{0} parceiros"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824
 msgid "Seeding"
 msgstr "semeando"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:784
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
 msgid "Complete"
 msgstr "completo"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
 msgid "OK"
 msgstr "bem"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
 msgid "Stalled"
 msgstr "estancado"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
 msgid "No Peers"
-msgstr "sem pares"
+msgstr "sem parceiros"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
 msgid "Stopped"
 msgstr "detenido"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837
-#, java-format
-msgid "Details at {0} tracker"
-msgstr "Detalhes no rastreador {0}"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886
+#, fuzzy
+msgid "Torrent details"
+msgstr "torrentes"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160
 msgid "Info"
 msgstr "Info"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913
 msgid "View files"
 msgstr "mostrar arquivos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915
 msgid "Open file"
 msgstr "abrir arquivo"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:865
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569
-msgid "Open"
-msgstr "abrir"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957
 msgid "Stop the torrent"
-msgstr "Parar o torrent"
+msgstr "Deter o torrente"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959
 msgid "Stop"
-msgstr "Parar"
+msgstr "Deter"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969
 msgid "Start the torrent"
-msgstr "Iniciar o torrent"
+msgstr "Iniciar o torrente"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971
 msgid "Start"
 msgstr "Iniciar"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
 msgid "Remove the torrent from the active list, deleting the .torrent file"
-msgstr "Retire o torrent da lista ativa, apagando o arquivo .torrent"
+msgstr "Retire o torrente da lista ativa, apagando o arquivo .torrent"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
 #, java-format
-msgid "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?"
-msgstr "Está seguro de que quer apagar o arquivo \\''{0}.torrent\\''? (Dados baixados não se apagarão.)"
+msgid ""
+"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
+"data will not be deleted) ?"
+msgstr ""
+"Está seguro de que quer apagar o arquivo \\''{0}.torrent\\''? (Dados "
+"baixados não se apagarão.)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:941
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
 msgid "Remove"
 msgstr "Quitar"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:950
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
 msgid "Delete the .torrent file and the associated data file(s)"
-msgstr "Apagar o arquivo torrent e o(s) arquivo(s) de dados pertenecentes"
+msgstr "Apagar o arquivo torrente e o(s) arquivo(s) de dados pertenecentes"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
 #, java-format
-msgid "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?"
-msgstr "Está seguro de que quer apagar o arquivo torrent \\''{0}\\'' e todos os dados descarregados deste torrent?"
+msgid ""
+"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
+"data?"
+msgstr ""
+"Está seguro de que quer apagar o arquivo torrente \\''{0}\\'' e todos os "
+"dados descarregados deste torrente?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
 msgid "Delete"
 msgstr "Apagar"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:991
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
 msgid "Unknown"
 msgstr "desconhecido"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
 msgid "Seed"
 msgstr "Semeador"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077
 msgid "Uninteresting (The peer has no pieces we need)"
-msgstr "não interessante (O par não tem peças que precisamos.)"
+msgstr "não interessante (O parceiro não tem peças que precisamos.)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079
 msgid "Choked (The peer is not allowing us to request pieces)"
-msgstr "sufocado (De momento o par não está nos permitindo pedir mais peças.c)"
+msgstr ""
+"sufocado (De momento o parceiro não está nos permitindo pedir mais peças.c)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099
 msgid "Uninterested (We have no pieces the peer needs)"
-msgstr "desinteressado (Não temos as peças que o par quer.)"
+msgstr "desinteressado (Não temos as peças que o parceiro quer.)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101
 msgid "Choking (We are not allowing the peer to request pieces)"
-msgstr "sufocando (De momento não estamos permitindo que os pares peçam mais peças)"
+msgstr ""
+"sufocando (De momento não estamos permitindo que os parceiros peçam mais "
+"peças)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1092
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159
+#, java-format
+msgid "Details at {0} tracker"
+msgstr "Detalhes no rastreador {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188
 msgid "Add Torrent"
-msgstr "Adicionar um torrent"
+msgstr "Adicionar um torrente"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
 msgid "From URL"
 msgstr "URL fonte:"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1097
-msgid "Torrent file must originate from an I2P-based tracker"
-msgstr "O arquivo torrent tem que incluir um rastreador I2P."
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193
+msgid ""
+"Enter the torrent file download URL (I2P only), magnet link, or maggot link"
+msgstr ""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
 msgid "Add torrent"
-msgstr "Adicionar torrent"
+msgstr "Adicionar torrente"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201
 #, java-format
 msgid "You can also copy .torrent files to: {0}."
-msgstr "Também pode copiar arquivos torrent a {0}."
+msgstr "Também pode copiar arquivos torrentes a {0}."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203
 msgid "Removing a .torrent will cause it to stop."
 msgstr "A remoção de um arquivo .torrent fará com que ele pare."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
 msgid "Create Torrent"
-msgstr "Criar um torrent"
+msgstr "Criar um torrente"
 
 #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229
 msgid "Data to seed"
 msgstr "Dados para semear"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1138
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233
 msgid "File or directory to seed (must be within the specified path)"
 msgstr "Arquivo ou pasta para semear (deve estar no caminho especificado)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1140
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
 msgid "Tracker"
 msgstr "Rastreador"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
 msgid "Select a tracker"
 msgstr "Selecione um rastreador"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1155
+#. out.write(_("Open trackers and DHT only"));
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
+#, fuzzy
+msgid "Open trackers only"
+msgstr "usar também rastreadores abertos"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
 msgid "or"
 msgstr "ou"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1158
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260
 msgid "Specify custom tracker announce URL"
 msgstr "Especifique o URL de rastreador personalizado"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
 msgid "Create torrent"
-msgstr "Criar torrent"
+msgstr "Criar torrente"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1180
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
 msgid "Configuration"
 msgstr "Preferências"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1184
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285
 msgid "Data directory"
 msgstr "Pasta de dados"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287
 msgid "Edit i2psnark.config and restart to change"
 msgstr "Para mudar, modifique o arquivo i2psnark.config e re-inície!"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
 msgid "Auto start"
 msgstr "Iniciar automáticamente"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
 msgid "If checked, automatically start torrents that are added"
-msgstr "se marcado, os torrents adicionados se iniciarão automaticamente"
+msgstr "se marcado, os torrentes adicionados se iniciarão automaticamente"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299
 msgid "Theme"
 msgstr "Tema"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
 msgid "Startup delay"
 msgstr "Demora do arranque"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1213
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314
 msgid "minutes"
 msgstr "minutos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
 msgid "Total uploader limit"
 msgstr "Limite global de subidores"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341
 msgid "peers"
-msgstr "pares"
+msgstr "parceiros"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345
 msgid "Up bandwidth limit"
 msgstr "Limite de largura de banda para a subida"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348
 msgid "Half available bandwidth recommended."
 msgstr "Se recomenda a metade da largura de banda disponível."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
 msgid "View or change router bandwidth"
 msgstr "mostrar e mudar as preferências da largura de banda do roteador"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354
 msgid "Use open trackers also"
 msgstr "usar também rastreadores abertos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
-msgid "If checked, announce torrents to open trackers as well as the tracker listed in the torrent file"
-msgstr "Se marcado, anunciar os torrents aos rastreadores abertos, assim como aos rastreadores listados no arquivo torrent"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358
+msgid ""
+"If checked, announce torrents to open trackers as well as the tracker listed "
+"in the torrent file"
+msgstr ""
+"Se marcado, anunciar os torrentes aos rastreadores abertos, assim como aos "
+"rastreadores listados no arquivo torrente"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362
 msgid "Open tracker announce URLs"
 msgstr "URL(s) para anunciar aos rastreadores abertos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1273
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374
 msgid "Inbound Settings"
 msgstr "Preferências de entrada"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380
 msgid "Outbound Settings"
 msgstr "Preferências de saida"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388
 msgid "I2CP host"
 msgstr "Anfitrião I2CP"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393
 msgid "I2CP port"
 msgstr "Porto I2CP"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1303
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406
 msgid "I2CP options"
 msgstr "Opções I2CP"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1308
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
 msgid "Save configuration"
 msgstr "Guardar configuração"
 
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436
+#, java-format
+msgid "Invalid magnet URL {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470
+#, java-format
+msgid "Invalid info hash in magnet URL {0}"
+msgstr ""
+
 #. * dummies for translation
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1325
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500
 #, java-format
 msgid "1 hop"
 msgid_plural "{0} hops"
 msgstr[0] "1 salto"
 msgstr[1] "{0} saltos"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501
 #, java-format
 msgid "1 tunnel"
 msgid_plural "{0} tunnels"
 msgstr[0] "1 túnel"
 msgstr[1] "{0} túneles"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663
+#, fuzzy
+msgid "Completion"
+msgstr "completo"
+
+#. else unknown
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
 msgid "Size"
 msgstr "Tamanho"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672
+#, fuzzy
+msgid "Files"
+msgstr "Arquivo"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674
+msgid "Pieces"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675
+msgid "Piece size"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697
+msgid "Magnet link"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753
+msgid "Directory"
+msgstr "Pasta"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
 msgid "Priority"
 msgstr "Prioridade"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728
 msgid "Up to higher level directory"
 msgstr "Subir uma herarquia"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517
-msgid "Directory"
-msgstr "Pasta"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
 msgid "Torrent not found?"
-msgstr "Não achei o arquivo torrent?"
+msgstr "Não achei o arquivo torrente?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767
 msgid "File not found in torrent?"
-msgstr "Arquivo não achado no torrent?"
+msgstr "Arquivo não achado no torrente?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
 msgid "complete"
 msgstr "completo"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781
 msgid "bytes remaining"
 msgstr "Bytes faltando"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
+msgid "Open"
+msgstr "abrir"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832
 msgid "High"
 msgstr "alta"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1600
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837
 msgid "Normal"
 msgstr "normal"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1605
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842
 msgid "Skip"
 msgstr "Ignorar"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1614
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851
 msgid "Save priorities"
 msgstr "Guardar prioridades"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967
 #, java-format
 msgid "Torrent fetched from {0}"
-msgstr "Torrent obtido de {0}"
+msgstr "torrente obtido de {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1746
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989
 #, java-format
 msgid "Torrent already running: {0}"
-msgstr "Torrent já em marcha: {0}"
+msgstr "torrente já em marcha: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991
 #, java-format
 msgid "Torrent already in the queue: {0}"
-msgstr "Torrent já na cola: {0}"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755
-#, java-format
-msgid "Failed to copy torrent file to {0}"
-msgstr "Não se pode copiar o torrent para {0}."
+msgstr "torrente já na cola: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997
 #, java-format
 msgid "Torrent at {0} was not valid"
-msgstr "Torrent em {0} não foi válido"
+msgstr "torrente em {0} não foi válido"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004
 #, java-format
 msgid "Torrent was not retrieved from {0}"
-msgstr "Não se pode obter torrent de {0}"
+msgstr "Não se pode obter torrente de {0}"
+
+#~ msgid "Torrent file must originate from an I2P-based tracker"
+#~ msgstr "O arquivo torrente tem que incluir um rastreador I2P."
 
 #~ msgid " theme locked and loaded."
 #~ msgstr "tema carregado"
+
 #~ msgid "Hide All Attached Peers [connected/total in swarm]"
-#~ msgstr "Ocultar todos os pares [conectados/total neste torrent]"
+#~ msgstr "Ocultar todos os pares [conectados/total neste torrente]"
+
 #~ msgid "Show All Attached Peers [connected/total in swarm]"
-#~ msgstr "Mostrar todos os pares [conectados/total neste torrent]"
+#~ msgstr "Mostrar todos os pares [conectados/total neste torrente]"
+
 #~ msgid "Loaded Torrents"
-#~ msgstr "Torrents carregados"
+#~ msgstr "torrentes carregados"
+
 #~ msgid "Estimated Download Time"
 #~ msgstr "tempo restante da descarga"
+
 #~ msgid "1"
 #~ msgid_plural "{0}"
 #~ msgstr[0] "1"
 #~ msgstr[1] "{0}"
+
 #~ msgid "Torrent file {0} does not exist"
-#~ msgstr "Arquivo do torrent {0} não existe"
+#~ msgstr "Arquivo do torrente {0} não existe"
+
 #~ msgid "Copying torrent to {0}"
-#~ msgstr "Copiando torrent para {0}"
+#~ msgstr "Copiando torrente para {0}"
+
 #~ msgid "from {0}"
 #~ msgstr "de {0}"
+
 #~ msgid "Downloading"
 #~ msgstr "descarregando"
-#~ msgid "File"
-#~ msgstr "Arquivo"
+
 #~ msgid "FileSize"
 #~ msgstr "Tamanho do arquivo"
+
 #~ msgid "Download Status"
 #~ msgstr "Estado"
 
 #, fuzzy
 #~ msgid "size: {0}B"
 #~ msgstr "Tamaño: {0}Bytes"
+
 #~ msgid "Directory to store torrents and data"
-#~ msgstr "Carpeta para guardar los archivos torrent y los datos"
+#~ msgstr "Carpeta para guardar os arquivos torrentes e os dados"
+
 #~ msgid "Do not download"
 #~ msgstr "No descargues"
+
 #~ msgid "Details"
 #~ msgstr "Detalles"
+
 #~ msgid "Cannot change the I2CP settings while torrents are active"
 #~ msgstr ""
 #~ "No se puede cammbiar los ajustes I2CP mientras estén activos los torrents"
+
 #~ msgid "Non-i2p tracker in \"{0}\", deleting it from our list of trackers!"
 #~ msgstr ""
 #~ "Rastreador fuera de I2P en \"{0}\", borrando de la lista de rastreadores"
+
 #~ msgid "{0} torrents"
-#~ msgstr "{0} Torrents"
+#~ msgstr "{0} torrentes"
+
 #~ msgid "Uninteresting"
 #~ msgstr "no interesante"
+
 #~ msgid "Choked"
 #~ msgstr "frenado"
+
 #~ msgid "Uninterested"
 #~ msgstr "desinteresado"
+
 #~ msgid "Choking"
 #~ msgstr "frenando"
+
 #~ msgid "Custom tracker URL"
 #~ msgstr "URL especial del rastreador"
+
 #~ msgid "Configure"
 #~ msgstr "Ajustes"
-
diff --git a/apps/i2psnark/locale/messages_ru.po b/apps/i2psnark/locale/messages_ru.po
index ed82ff35c9c065dcf7c797927f043ccf067fb41a..582446cde10c694432b7ca27d6c4f4734819cb5e 100644
--- a/apps/i2psnark/locale/messages_ru.po
+++ b/apps/i2psnark/locale/messages_ru.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P i2psnark\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-13 19:43+0000\n"
-"PO-Revision-Date: 2010-12-16 00:10+0500\n"
+"POT-Creation-Date: 2011-03-03 18:28+0000\n"
+"PO-Revision-Date: 2011-02-15 22:27+0500\n"
 "Last-Translator: Hidden Z <hiddenz@mail.i2p>\n"
 "Language-Team: foo <foo@bar>\n"
 "Language: \n"
@@ -17,320 +17,400 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Poedit-Language: Russian\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"
+"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"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:94
-#, java-format
-msgid "Adding torrents in {0} minutes"
-msgstr "Торренты будут подгружены через {0} минут(ы)"
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:296
+#: ../java/src/org/klomp/snark/SnarkManager.java:307
 #, java-format
 msgid "Total uploaders limit changed to {0}"
 msgstr "Новое значение лимита количества слотов отдачи: {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:298
+#: ../java/src/org/klomp/snark/SnarkManager.java:309
 #, java-format
 msgid "Minimum total uploaders limit is {0}"
 msgstr "Минимально допустимое значение для количества слотов: {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:310
+#: ../java/src/org/klomp/snark/SnarkManager.java:321
 #, java-format
 msgid "Up BW limit changed to {0}KBps"
 msgstr "Новое значение лимита скорости отдачи: {0} KBps"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:312
+#: ../java/src/org/klomp/snark/SnarkManager.java:323
 #, java-format
 msgid "Minimum up bandwidth limit is {0}KBps"
 msgstr "Минимально допустимое значение для лимита скорости отдачи: {0} KBps"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:324
+#: ../java/src/org/klomp/snark/SnarkManager.java:335
 #, java-format
-msgid "Startup delay limit changed to {0} minutes"
-msgstr "Новое значение задержки запуска: {0} минут(ы)"
+msgid "Startup delay changed to {0}"
+msgstr "Задержка запуска изменена на {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:371
+#: ../java/src/org/klomp/snark/SnarkManager.java:386
 msgid "I2CP and tunnel changes will take effect after stopping all torrents"
-msgstr "Изменения настроек I2CP и туннелей вступят в силу после остановки всех торрентов."
+msgstr ""
+"Изменения настроек I2CP и туннелей вступят в силу после остановки всех "
+"торрентов."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:378
+#: ../java/src/org/klomp/snark/SnarkManager.java:393
 msgid "Disconnecting old I2CP destination"
 msgstr "Рассоединяемся по старому адресу I2CP"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:382
+#: ../java/src/org/klomp/snark/SnarkManager.java:397
 #, java-format
 msgid "I2CP settings changed to {0}"
 msgstr "Новые параметры I2CP: {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:386
-msgid "Unable to connect with the new settings, reverting to the old I2CP settings"
-msgstr "Не удалось соединиться с использованием новых настроек I2CP, возвращаемся к старым настройкам"
+#: ../java/src/org/klomp/snark/SnarkManager.java:402
+msgid ""
+"Unable to connect with the new settings, reverting to the old I2CP settings"
+msgstr ""
+"Не удалось соединиться с использованием новых настроек I2CP, возвращаемся к "
+"старым настройкам"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:390
+#: ../java/src/org/klomp/snark/SnarkManager.java:406
 msgid "Unable to reconnect with the old settings!"
 msgstr "Не удалось пересоединиться с использованием старых настроек I2CP!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:392
+#: ../java/src/org/klomp/snark/SnarkManager.java:408
 msgid "Reconnected on the new I2CP destination"
 msgstr "Пересоединились по новому адресу I2CP"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:403
+#: ../java/src/org/klomp/snark/SnarkManager.java:418
 #, java-format
 msgid "I2CP listener restarted for \"{0}\""
 msgstr "I2CP-приёмник перезапущен для \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:414
+#: ../java/src/org/klomp/snark/SnarkManager.java:429
 msgid "Enabled autostart"
 msgstr "Автостарт включен"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:416
+#: ../java/src/org/klomp/snark/SnarkManager.java:431
 msgid "Disabled autostart"
 msgstr "Автостарт выключен"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:422
+#: ../java/src/org/klomp/snark/SnarkManager.java:437
 msgid "Enabled open trackers - torrent restart required to take effect."
-msgstr "Включено использование открытых трекеров. Требуется перезапуск торрента, чтобы изменения вступили в силу."
+msgstr ""
+"Включено использование открытых трекеров. Требуется перезапуск торрента, "
+"чтобы изменения вступили в силу."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:424
+#: ../java/src/org/klomp/snark/SnarkManager.java:439
 msgid "Disabled open trackers - torrent restart required to take effect."
-msgstr "Отключено использование открытых трекеров. Требуется перезапуск торрента, чтобы изменения вступили в силу."
+msgstr ""
+"Отключено использование открытых трекеров. Требуется перезапуск торрента, "
+"чтобы изменения вступили в силу."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:431
+#: ../java/src/org/klomp/snark/SnarkManager.java:447
 msgid "Open Tracker list changed - torrent restart required to take effect."
-msgstr "Изменен список открытых трекеров. Требуется перезапуск торрента, чтобы изменения вступили в силу."
+msgstr ""
+"Изменен список открытых трекеров. Требуется перезапуск торрента, чтобы "
+"изменения вступили в силу."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:438
+#: ../java/src/org/klomp/snark/SnarkManager.java:454
 #, java-format
 msgid "{0} theme loaded, return to main i2psnark page to view."
-msgstr "{0} тема загружена, вернитесь на основную страницу i2psnark для просмотра."
+msgstr ""
+"{0} тема загружена, вернитесь на основную страницу i2psnark для просмотра."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:445
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
 msgid "Configuration unchanged."
 msgstr "Настройки не изменились."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:455
+#: ../java/src/org/klomp/snark/SnarkManager.java:471
 #, java-format
 msgid "Unable to save the config to {0}"
 msgstr "Не удалось сохранить настройки в {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:494
+#: ../java/src/org/klomp/snark/SnarkManager.java:536
 msgid "Connecting to I2P"
 msgstr "Устанавливается соединение с I2P"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:497
+#: ../java/src/org/klomp/snark/SnarkManager.java:539
 msgid "Error connecting to I2P - check your I2CP settings!"
 msgstr "Ошибка соединения с I2P, проверьте настройки I2CP!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:506
+#: ../java/src/org/klomp/snark/SnarkManager.java:548
 #, java-format
 msgid "Error: Could not add the torrent {0}"
 msgstr "Ошибка: Не удалось добавить торрент {0}"
 
 #. catch this here so we don't try do delete it below
-#: ../java/src/org/klomp/snark/SnarkManager.java:528
+#: ../java/src/org/klomp/snark/SnarkManager.java:570
 #, java-format
 msgid "Cannot open \"{0}\""
 msgstr "Не удалось открыть \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:541
+#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
+#: ../java/src/org/klomp/snark/SnarkManager.java:586
+#: ../java/src/org/klomp/snark/SnarkManager.java:661
+#: ../java/src/org/klomp/snark/SnarkManager.java:716
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976
 #, java-format
-msgid "Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only"
-msgstr "Внимание: указанные в \"{0}\" не-i2p трекеры будут проигнорированы, будут использоваться только открытые i2p трекеры"
+msgid "Torrent with this info hash is already running: {0}"
+msgstr "Торрент с таким info hash уже запущен: {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:543
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:593
 #, java-format
-msgid "Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!"
-msgstr "Внимание: указанные в \"{0}\" не-i2p трекеры будут проигнорированы, однако использование открытых i2p трекеров отключено, Вы должны включить поддержку открытых i2p трекеров перед запуском этого торрента!"
+msgid ""
+"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers "
+"only."
+msgstr ""
+"Внимание - в \"{0}\" не найдено I2P трекеров, анонсирование будет "
+"производиться только на открытых трекерах I2P."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:563
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:598
+#, java-format
+msgid ""
+"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is "
+"enabled before starting this torrent."
+msgstr ""
+"Внимание - в \"{0}\" не найдено I2P трекеров. Перед запуском торрента "
+"убедитесь, что использование открытых трекеров включено."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:619
 #, java-format
 msgid "Torrent in \"{0}\" is invalid"
 msgstr "Торрент в \"{0}\" некорректен"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:578
+#: ../java/src/org/klomp/snark/SnarkManager.java:624
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999
+#, java-format
+msgid "ERROR - Out of memory, cannot create torrent from {0}"
+msgstr "ОШИБКА - нехватка памяти, невозможно создать торрент из {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:635
 #, java-format
 msgid "Torrent added and started: \"{0}\""
 msgstr "Торрент добавлен и запущен: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:580
+#: ../java/src/org/klomp/snark/SnarkManager.java:637
 #, java-format
 msgid "Torrent added: \"{0}\""
 msgstr "Торрент добавлен: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:734
+#: ../java/src/org/klomp/snark/SnarkManager.java:672
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490
+#, java-format
+msgid "Fetching {0}"
+msgstr "Получение торрента: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:675
+#, java-format
+msgid ""
+"We have no saved peers and no other torrents are running. Fetch of {0} will "
+"not succeed until you start another torrent."
+msgstr ""
+"Мы не имеем сохранённых пиров и нет других запущенных торрентов. Загрузка "
+"{0} не будет успешна пока вы не запустите другой торрент."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:679
+#, java-format
+msgid "Adding {0}"
+msgstr "Добавление {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:726
+#: ../java/src/org/klomp/snark/SnarkManager.java:749
+#: ../java/src/org/klomp/snark/SnarkManager.java:1174
+#, java-format
+msgid "Failed to copy torrent file to {0}"
+msgstr "Не удалось скопировать торрент в: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:972
 #, java-format
 msgid "Too many files in \"{0}\" ({1}), deleting it!"
 msgstr "Слишком много файлов в торренте \"{0}\" ({1}), удаляем его!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:736
+#: ../java/src/org/klomp/snark/SnarkManager.java:974
 #, java-format
 msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
-msgstr "Торрент \"{0}\" содержит единственный файл заканчивающийся на \".torrent\", удаляем его!"
+msgstr ""
+"Торрент \"{0}\" содержит единственный файл заканчивающийся на \".torrent\", "
+"удаляем его!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:738
+#: ../java/src/org/klomp/snark/SnarkManager.java:976
 #, java-format
 msgid "No pieces in \"{0}\",  deleting it!"
 msgstr "В торренте \"{0}\" не оказалось ни одной части, удаляем его!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:740
+#: ../java/src/org/klomp/snark/SnarkManager.java:978
 #, java-format
 msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
 msgstr "Слишком много частей в торренте \"{0}\" (наш предел {1}), удаляем его!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:742
+#: ../java/src/org/klomp/snark/SnarkManager.java:980
 #, java-format
 msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
 msgstr "Слишком крупные части в торренте \"{0}\" ({1}B), удаляем его."
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:743
+#: ../java/src/org/klomp/snark/SnarkManager.java:981
 #, java-format
 msgid "Limit is {0}B"
 msgstr "Наш предел {0}B"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:751
+#: ../java/src/org/klomp/snark/SnarkManager.java:989
 #, java-format
 msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
 msgstr "Торренты крупнее чем {0}B пока не поддерживается, удаляем \"{1}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:767
+#: ../java/src/org/klomp/snark/SnarkManager.java:1005
 #, java-format
 msgid "Error: Could not remove the torrent {0}"
 msgstr "Ошибка: Невозможно удалить торрент {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:794
+#: ../java/src/org/klomp/snark/SnarkManager.java:1026
+#: ../java/src/org/klomp/snark/SnarkManager.java:1044
 #, java-format
 msgid "Torrent stopped: \"{0}\""
 msgstr "Торрент остановлен: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:814
+#: ../java/src/org/klomp/snark/SnarkManager.java:1065
 #, java-format
 msgid "Torrent removed: \"{0}\""
 msgstr "Торрент удален: \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:852
+#: ../java/src/org/klomp/snark/SnarkManager.java:1073
+#, java-format
+msgid "Adding torrents in {0}"
+msgstr "Добавление торрентов через {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1122
 #, java-format
 msgid "Download finished: {0}"
 msgstr "Закачка завершена: {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:880
+#: ../java/src/org/klomp/snark/SnarkManager.java:1170
+#, java-format
+msgid "Metainfo received for {0}"
+msgstr "Метаданные получены для {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1171
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525
+#, java-format
+msgid "Starting up torrent {0}"
+msgstr "Запускаем торрент: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1225
 msgid "Unable to connect to I2P!"
 msgstr "Не удалось установить соединение с I2P!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:886
+#: ../java/src/org/klomp/snark/SnarkManager.java:1231
 #, java-format
 msgid "Unable to add {0}"
 msgstr "Не удаётся добавить {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
 msgid "I2PSnark - Anonymous BitTorrent Client"
 msgstr "I2PSnark — Анонимный  BitTorrent Клиент"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218
 msgid "Torrents"
 msgstr "Торренты"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:201
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:208
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
 msgid "I2PSnark"
 msgstr "I2PSnark"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225
 msgid "Refresh page"
 msgstr "Обновить страницу"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230
 msgid "Forum"
 msgstr "Форум"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719
 msgid "Status"
 msgstr "Статус"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292
 msgid "Hide Peers"
 msgstr "спрятать список пиров"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:279
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299
 msgid "Show Peers"
 msgstr "показать список пиров"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659
 msgid "Torrent"
 msgstr "Торрент"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310
 msgid "Estimated time remaining"
 msgstr "Примерное оставшееся время"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:293
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313
 msgid "ETA"
 msgstr "Осталось"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
 msgid "Downloaded"
 msgstr "Получено"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:314
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
 msgid "RX"
 msgstr "Принято"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
 msgid "Uploaded"
 msgstr "Отдано"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
 msgid "TX"
 msgstr "Отдано"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332
 msgid "Down Rate"
 msgstr "Скорость загрузки"
 
 #. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
 msgid "Rate"
 msgstr "Скорость"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
 msgid "Up Rate"
 msgstr "Скорость отдачи"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
 msgid "Stop all torrents and the I2P tunnel"
 msgstr "Остановить все торренты и закрыть соединение с I2P"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367
 msgid "Stop All"
 msgstr "Остановить все"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376
 msgid "Start all torrents and the I2P tunnel"
 msgstr "Запустить все торренты и открыть соединение с I2P"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378
 msgid "Start All"
 msgstr "Запустить все"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
 msgid "No torrents loaded."
 msgstr "Нет загруженных торрентов."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402
 msgid "Totals"
 msgstr "Всего"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
 #, java-format
 msgid "1 torrent"
 msgid_plural "{0} torrents"
@@ -338,7 +418,7 @@ msgstr[0] "{0} торрент"
 msgstr[1] "{0} торрента"
 msgstr[2] "{0} торрентов"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:382
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
 #, java-format
 msgid "1 connected peer"
 msgid_plural "{0} connected peers"
@@ -346,98 +426,101 @@ msgstr[0] "{0} подсоединенный пир"
 msgstr[1] "{0} подсоединенных пиров"
 msgstr[2] "{0} подсоединенных пиров"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496
 #, java-format
-msgid "Fetching {0}"
-msgstr "Получение торрента: {0}"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458
-msgid "Invalid URL - must start with http://"
-msgstr "Некорректный URL, должен начинаться с http://"
+msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
+msgstr ""
+"Некорректный URL: должен начинаться с \"http://\", \"{0}\", или \"{1}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:489
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
 #, java-format
-msgid "Starting up torrent {0}"
-msgstr "Запускаем торрент: {0}"
+msgid "Magnet deleted: {0}"
+msgstr "Magnet удален: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577
 #, java-format
 msgid "Torrent file deleted: {0}"
 msgstr "Удален торрент: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:533
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:543
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593
 #, java-format
 msgid "Data file deleted: {0}"
 msgstr "Файл удален: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595
 #, java-format
 msgid "Data file could not be deleted: {0}"
 msgstr "Не удалось удалить файл: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604
 #, java-format
 msgid "Data dir deleted: {0}"
 msgstr "Директория удалена: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637
 msgid "Error creating torrent - you must select a tracker"
 msgstr "Торрент не создан — вы должны указать трекер"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653
 #, java-format
 msgid "Torrent created for \"{0}\""
 msgstr "Создан торрент для \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655
 #, java-format
-msgid "Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\""
-msgstr "Многие I2P трекеры требуют зарегистрировать на них торрент перед началом раздачи — пожалуйста проверьте требуется ли это перед запуском \"{0}\""
+msgid ""
+"Many I2P trackers require you to register new torrents before seeding - "
+"please do so before starting \"{0}\""
+msgstr ""
+"Многие I2P трекеры требуют зарегистрировать на них торрент перед началом "
+"раздачи — пожалуйста проверьте требуется ли это перед запуском \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:607
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657
 #, java-format
 msgid "Error creating a torrent for \"{0}\""
 msgstr "Ошибка при создании торрента для: \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660
 #, java-format
 msgid "Cannot create a torrent for the nonexistent data: {0}"
-msgstr "Невозможно создать торрент для несуществующего файла или директории: {0}"
+msgstr ""
+"Невозможно создать торрент для несуществующего файла или директории: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
 msgid "Error creating torrent - you must enter a file or directory"
 msgstr "Торрент не создан — вы должны указать файл или директорию"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
 msgid "Stopping all torrents and closing the I2P tunnel."
 msgstr "Останавливаем все торренты и закрываем соединение с I2P"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677
 msgid "I2P tunnel closed."
 msgstr "Соединение с I2P закрыто."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
 msgid "Opening the I2P tunnel and starting all torrents."
 msgstr "Соединяемся с I2P и запускаем все торренты."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:764
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814
 msgid "Tracker Error"
 msgstr "Ошибка Трекера"
 
 # TODO should replace "uploader limit NN peers" with "global number of upload slots: NN"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:766
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:778
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:782
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:790
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847
 #, java-format
 msgid "1 peer"
 msgid_plural "{0} peers"
@@ -445,279 +528,314 @@ msgstr[0] "{0} пир"
 msgstr[1] "{0} пира"
 msgstr[2] "{0} пиров"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824
 msgid "Seeding"
 msgstr "Раздается"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:784
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
 msgid "Complete"
 msgstr "Завершен"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
 msgid "OK"
 msgstr "Загружается"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
 msgid "Stalled"
 msgstr "Простаивает"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
 msgid "No Peers"
 msgstr "Нет Пиров"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
 msgid "Stopped"
 msgstr "Остановлен"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837
-#, java-format
-msgid "Details at {0} tracker"
-msgstr "Детали на трекере {0}"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886
+msgid "Torrent details"
+msgstr "Подробная информация"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160
 msgid "Info"
 msgstr "Информация"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913
 msgid "View files"
 msgstr "Открыть директорию"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915
 msgid "Open file"
 msgstr "Открыть файл"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:865
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569
-msgid "Open"
-msgstr "Открыть"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957
 msgid "Stop the torrent"
 msgstr "Остановить торрент"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959
 msgid "Stop"
 msgstr "Остановить"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969
 msgid "Start the torrent"
 msgstr "Запустить торрент"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971
 msgid "Start"
 msgstr "Запустить"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
 msgid "Remove the torrent from the active list, deleting the .torrent file"
 msgstr "Удалить торрент из списка и с диска"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
 #, java-format
-msgid "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?"
-msgstr "Вы действительно хотите удалить \\''{0}.torrent\\''? (загруженные файлы удаляться НЕ будут)"
+msgid ""
+"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
+"data will not be deleted) ?"
+msgstr ""
+"Вы действительно хотите удалить \\''{0}.torrent\\''? (загруженные файлы "
+"удаляться НЕ будут)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:941
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
 msgid "Remove"
 msgstr "Удалить"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:950
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
 msgid "Delete the .torrent file and the associated data file(s)"
 msgstr "Удалить торрент и стереть загруженные файлы"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
 #, java-format
-msgid "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?"
-msgstr "Вы действительно хотите удалить торрент \\''{0}\\'' и все загруженные файлы?"
+msgid ""
+"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
+"data?"
+msgstr ""
+"Вы действительно хотите удалить торрент \\''{0}\\'' и все загруженные файлы?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
 msgid "Delete"
 msgstr "Стереть"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:991
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
 msgid "Unknown"
 msgstr "Неизвестный"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
 msgid "Seed"
 msgstr "Сид"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077
 msgid "Uninteresting (The peer has no pieces we need)"
 msgstr "Uninteresting (У пира нет нужных нам частей торрента)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079
 msgid "Choked (The peer is not allowing us to request pieces)"
 msgstr "Choked (Этот пир не позволяет нам запрашивать части торрента)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099
 msgid "Uninterested (We have no pieces the peer needs)"
 msgstr "Uninterested (У нас нужных этому пиру частей торрента)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101
 msgid "Choking (We are not allowing the peer to request pieces)"
 msgstr "Choking (Мы не позволяем этому пиру запрашивать у нас части торрента)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1092
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159
+#, java-format
+msgid "Details at {0} tracker"
+msgstr "Детали на трекере {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188
 msgid "Add Torrent"
 msgstr "Добавить Торрент"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
 msgid "From URL"
 msgstr "Из URL"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1097
-msgid "Torrent file must originate from an I2P-based tracker"
-msgstr "Торрент-файл должен быть с I2P-трекера"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193
+msgid ""
+"Enter the torrent file download URL (I2P only), magnet link, or maggot link"
+msgstr ""
+"Введите URL (только I2P) для загрузки торрент-файла, magnet-ссылку, или "
+"maggot-ссылку"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
 msgid "Add torrent"
 msgstr "Добавить торрент"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201
 #, java-format
 msgid "You can also copy .torrent files to: {0}."
 msgstr "Либо вы можете просто скопировать .torrent-файлы в директорию {0}."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203
 msgid "Removing a .torrent will cause it to stop."
 msgstr "Удаление .torrent-файла приведёт к остановке торрента."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
 msgid "Create Torrent"
 msgstr "Создать Торрент"
 
 #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229
 msgid "Data to seed"
 msgstr "Файлы для раздачи"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1138
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233
 msgid "File or directory to seed (must be within the specified path)"
-msgstr "Файл или директория для раздачи (вводите только название файла или директории, указание абсолютных путей не поддерживается)"
+msgstr ""
+"Файл или директория для раздачи (вводите только название файла или "
+"директории, указание абсолютных путей не поддерживается)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1140
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
 msgid "Tracker"
 msgstr "Трекер"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
 msgid "Select a tracker"
 msgstr "Выбрать трекер"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1155
+#. out.write(_("Open trackers and DHT only"));
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
+msgid "Open trackers only"
+msgstr "Только открытые трекеры"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
 msgid "or"
 msgstr "или"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1158
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260
 msgid "Specify custom tracker announce URL"
 msgstr "Задать URL анонсера вручную"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
 msgid "Create torrent"
 msgstr "Создать торрент"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1180
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
 msgid "Configuration"
 msgstr "Настройки"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1184
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285
 msgid "Data directory"
 msgstr "Директория для файлов"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287
 msgid "Edit i2psnark.config and restart to change"
-msgstr "Для изменения отредактируйте файл i2psnark.config и перезагрузите I2PSnark"
+msgstr ""
+"Для изменения отредактируйте файл i2psnark.config и перезагрузите I2PSnark"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
 msgid "Auto start"
 msgstr "Автозапуск"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
 msgid "If checked, automatically start torrents that are added"
 msgstr "Автоматически запускать торренты после добавления"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299
 msgid "Theme"
 msgstr "Тема"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
 msgid "Startup delay"
 msgstr "Задержка запуска"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1213
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314
 msgid "minutes"
 msgstr "минут"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
 msgid "Total uploader limit"
 msgstr "Ограничение количества слотов отдачи"
 
 # TODO should replace "uploader limit NN peers" with "global number of upload slots: NN"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341
 msgid "peers"
 msgstr "пиров"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345
 msgid "Up bandwidth limit"
 msgstr "Ограничение скорости отдачи"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348
 msgid "Half available bandwidth recommended."
-msgstr "Рекомендуется использовать половину от доступной пропускной способности."
+msgstr ""
+"Рекомендуется использовать половину от доступной пропускной способности."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
 msgid "View or change router bandwidth"
 msgstr "Посмотреть/настроить ограничения скорости в маршрутизаторе I2P"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354
 msgid "Use open trackers also"
 msgstr "Дополнительно использовать открытые трекеры"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
-msgid "If checked, announce torrents to open trackers as well as the tracker listed in the torrent file"
-msgstr "Анонсировать торренты на открытых трекерах, дополнительно к тем, что указаны внутри торрента"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358
+msgid ""
+"If checked, announce torrents to open trackers as well as the tracker listed "
+"in the torrent file"
+msgstr ""
+"Анонсировать торренты на открытых трекерах, дополнительно к тем, что указаны "
+"внутри торрента"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362
 msgid "Open tracker announce URLs"
 msgstr "URL открытых трекеров"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1273
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374
 msgid "Inbound Settings"
 msgstr "Входящие туннели"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380
 msgid "Outbound Settings"
 msgstr "Исходящие туннели"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388
 msgid "I2CP host"
 msgstr "Адрес I2CP"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393
 msgid "I2CP port"
 msgstr "Порт I2CP"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1303
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406
 msgid "I2CP options"
 msgstr "Параметры I2CP"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1308
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
 msgid "Save configuration"
 msgstr "Сохранить настройки"
 
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436
+#, java-format
+msgid "Invalid magnet URL {0}"
+msgstr "Неправильный magnet URL {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470
+#, java-format
+msgid "Invalid info hash in magnet URL {0}"
+msgstr "Неправильный info hash в magnet URL {0}"
+
 #. * dummies for translation
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1325
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500
 #, java-format
 msgid "1 hop"
 msgid_plural "{0} hops"
@@ -725,7 +843,7 @@ msgstr[0] "{0} хоп"
 msgstr[1] "{0} хопа"
 msgstr[2] "{0} хопов"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501
 #, java-format
 msgid "1 tunnel"
 msgid_plural "{0} tunnels"
@@ -733,86 +851,111 @@ msgstr[0] "{0} туннель"
 msgstr[1] "{0} туннеля"
 msgstr[2] "{0} туннелей"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663
+msgid "Completion"
+msgstr "Загружено"
+
+#. else unknown
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
 msgid "Size"
 msgstr "Размер"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672
+msgid "Files"
+msgstr "Файлов"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674
+msgid "Pieces"
+msgstr "Части"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675
+msgid "Piece size"
+msgstr "Размер части"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697
+msgid "Magnet link"
+msgstr "Magnet ссылка"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753
+msgid "Directory"
+msgstr "Директория"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
 msgid "Priority"
 msgstr "Приоритет"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728
 msgid "Up to higher level directory"
 msgstr "Перейти в директорию уровнем выше"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517
-msgid "Directory"
-msgstr "Директория"
-
 # This debug error message intentionally left in English
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
 msgid "Torrent not found?"
 msgstr "Torrent not found?"
 
 # This debug error message intentionally left in English
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767
 msgid "File not found in torrent?"
 msgstr "File not found in torrent?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
 msgid "complete"
 msgstr "скачано"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781
 msgid "bytes remaining"
 msgstr "байт осталось"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
+msgid "Open"
+msgstr "Открыть"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832
 msgid "High"
 msgstr "Высокий"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1600
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837
 msgid "Normal"
 msgstr "Нормальный"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1605
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842
 msgid "Skip"
 msgstr "Пропустить"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1614
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851
 msgid "Save priorities"
 msgstr "Сохранить приоритеты"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967
 #, java-format
 msgid "Torrent fetched from {0}"
 msgstr "Получен торрент из: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1746
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989
 #, java-format
 msgid "Torrent already running: {0}"
 msgstr "Торрент уже запущен: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991
 #, java-format
 msgid "Torrent already in the queue: {0}"
 msgstr "Торрент уже в очереди: {0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755
-#, java-format
-msgid "Failed to copy torrent file to {0}"
-msgstr "Не удалось скопировать торрент в: {0}"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997
 #, java-format
 msgid "Torrent at {0} was not valid"
 msgstr "Торрент полученный из {0} некорректен"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004
 #, java-format
 msgid "Torrent was not retrieved from {0}"
 msgstr "Не удалось получить торрент из: {0}"
 
+#~ msgid "Torrent file must originate from an I2P-based tracker"
+#~ msgstr "Торрент-файл должен быть с I2P-трекера"
+
 #~ msgid "size: {0}B"
 #~ msgstr "размер: {0}B"
 
@@ -831,9 +974,6 @@ msgstr "Не удалось получить торрент из: {0}"
 #~ msgid "Downloading"
 #~ msgstr "Идёт загрузка"
 
-#~ msgid "File"
-#~ msgstr "Файл"
-
 #~ msgid "FileSize"
 #~ msgstr "Размер Файла"
 
diff --git a/apps/i2psnark/locale/messages_zh.po b/apps/i2psnark/locale/messages_zh.po
index b649d8c589e5bc2f7e0ca0a90f6b16faa08d619f..6fb391d1c3aa8cc28c9369b3c5c811323558274c 100644
--- a/apps/i2psnark/locale/messages_zh.po
+++ b/apps/i2psnark/locale/messages_zh.po
@@ -8,814 +8,1088 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P i2psnark\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-10-04 02:45+0000\n"
-"PO-Revision-Date: 2010-10-04 12:00+0800\n"
-"Last-Translator: walking <walking@mail.i2p>\n"
+"POT-Creation-Date: 2011-03-03 18:28+0000\n"
+"PO-Revision-Date: 2011-02-20 15:26+0800\n"
+"Last-Translator: \n"
 "Language-Team: foo <foo@bar>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Poedit-Language: Chinese\n"
 "Plural-Forms: nplurals=1; plural=0\n"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:88
-#, java-format
-msgid "Adding torrents in {0} minutes"
-msgstr "{0}分钟内完成添加"
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:258
+#: ../java/src/org/klomp/snark/SnarkManager.java:307
 #, java-format
 msgid "Total uploaders limit changed to {0}"
 msgstr "总上传种子数限制已更新为{0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:260
+#: ../java/src/org/klomp/snark/SnarkManager.java:309
 #, java-format
 msgid "Minimum total uploaders limit is {0}"
 msgstr "最低上传种子数限制为{0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:272
+#: ../java/src/org/klomp/snark/SnarkManager.java:321
 #, java-format
 msgid "Up BW limit changed to {0}KBps"
 msgstr "上传带宽限制改为 {0} KBps"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:274
+#: ../java/src/org/klomp/snark/SnarkManager.java:323
 #, java-format
 msgid "Minimum up bandwidth limit is {0}KBps"
 msgstr "最小上传带宽限制为 {0} KBps"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:286
+#: ../java/src/org/klomp/snark/SnarkManager.java:335
 #, java-format
-msgid "Startup delay limit changed to {0} minutes"
-msgstr "启动延迟已更新为{0}"
+msgid "Startup delay changed to {0}"
+msgstr "下载前的延迟已更新为{0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:333
+#: ../java/src/org/klomp/snark/SnarkManager.java:386
 msgid "I2CP and tunnel changes will take effect after stopping all torrents"
 msgstr "I2CP与隧道设置的变化在所有种子停止后才能生效"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:339
+#: ../java/src/org/klomp/snark/SnarkManager.java:393
 msgid "Disconnecting old I2CP destination"
 msgstr "正在断开旧的I2CP目标"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:343
+#: ../java/src/org/klomp/snark/SnarkManager.java:397
 #, java-format
 msgid "I2CP settings changed to {0}"
 msgstr "I2CP设置改为{0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:347
-msgid "Unable to connect with the new settings, reverting to the old I2CP settings"
+#: ../java/src/org/klomp/snark/SnarkManager.java:402
+msgid ""
+"Unable to connect with the new settings, reverting to the old I2CP settings"
 msgstr "无法通过新设置连接,恢复I2CP的旧设置"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:351
+#: ../java/src/org/klomp/snark/SnarkManager.java:406
 msgid "Unable to reconnect with the old settings!"
 msgstr "旧设置也无法连接!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:353
+#: ../java/src/org/klomp/snark/SnarkManager.java:408
 msgid "Reconnected on the new I2CP destination"
 msgstr "重新连接新I2CP目标"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:364
+#: ../java/src/org/klomp/snark/SnarkManager.java:418
 #, java-format
 msgid "I2CP listener restarted for \"{0}\""
 msgstr "\"{0}\"的I2CP监听端口已启动"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:375
+#: ../java/src/org/klomp/snark/SnarkManager.java:429
 msgid "Enabled autostart"
 msgstr "启用自动启动"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:377
+#: ../java/src/org/klomp/snark/SnarkManager.java:431
 msgid "Disabled autostart"
 msgstr "禁用自动启动"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:383
+#: ../java/src/org/klomp/snark/SnarkManager.java:437
 msgid "Enabled open trackers - torrent restart required to take effect."
 msgstr "启用OpenTracker-重新启动种子后生效"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:385
+#: ../java/src/org/klomp/snark/SnarkManager.java:439
 msgid "Disabled open trackers - torrent restart required to take effect."
 msgstr "禁用OpenTracker - 重新启动种子后生效"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:392
+#: ../java/src/org/klomp/snark/SnarkManager.java:447
 msgid "Open Tracker list changed - torrent restart required to take effect."
 msgstr "OpenTracker列表已改变 - 重新启动种子后生效"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:399
+#: ../java/src/org/klomp/snark/SnarkManager.java:454
+#, java-format
+msgid "{0} theme loaded, return to main i2psnark page to view."
+msgstr "{0} 主题已加载,浏览效果请到 i2psnark 主页。"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
 msgid "Configuration unchanged."
 msgstr "设置未改变"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:409
+#: ../java/src/org/klomp/snark/SnarkManager.java:471
 #, java-format
 msgid "Unable to save the config to {0}"
 msgstr "无法保存设置到{0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:445
+#: ../java/src/org/klomp/snark/SnarkManager.java:536
 msgid "Connecting to I2P"
 msgstr "正在连接到I2P"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:448
+#: ../java/src/org/klomp/snark/SnarkManager.java:539
 msgid "Error connecting to I2P - check your I2CP settings!"
 msgstr "连接I2P时发生错误 - 请检查I2CP设置!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:457
+#: ../java/src/org/klomp/snark/SnarkManager.java:548
 #, java-format
 msgid "Error: Could not add the torrent {0}"
 msgstr "错误:无法添加种子{0}"
 
 #. catch this here so we don't try do delete it below
-#: ../java/src/org/klomp/snark/SnarkManager.java:479
+#: ../java/src/org/klomp/snark/SnarkManager.java:570
 #, java-format
 msgid "Cannot open \"{0}\""
 msgstr "无法打开 \"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:492
+#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
+#: ../java/src/org/klomp/snark/SnarkManager.java:586
+#: ../java/src/org/klomp/snark/SnarkManager.java:661
+#: ../java/src/org/klomp/snark/SnarkManager.java:716
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976
+#, java-format
+msgid "Torrent with this info hash is already running: {0}"
+msgstr "具有相同Hash链接的种子已在下载中:{0}"
+
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:593
 #, java-format
-msgid "Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only"
-msgstr "警告 - 忽略\"{0}\"文件中I2P网络外的Tracker服务器,文件将仅发布至 I2P 内的 Open Tracker 服务器。"
+msgid ""
+"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers "
+"only."
+msgstr ""
+"提示 - “{0}”文件中不包含 I2P Tracker服务器,文件将仅发布至 I2P 的 Open "
+"Tracker 。"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:494
+#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:598
 #, java-format
-msgid "Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!"
-msgstr "警告 - 忽略\"{0}\"文件中I2P网络外的Tracker服务器,OpenTracker已禁用,启动此种子前您必须启用OpenTracker。"
+msgid ""
+"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is "
+"enabled before starting this torrent."
+msgstr ""
+"警告 -“{0}”中不包含 I2P Tracker 服务器,下载此种子请先启用 Open Tracker。"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:513
+#: ../java/src/org/klomp/snark/SnarkManager.java:619
 #, java-format
 msgid "Torrent in \"{0}\" is invalid"
 msgstr "无效种子 \"{0}\" "
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:528
+#: ../java/src/org/klomp/snark/SnarkManager.java:624
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999
+#, java-format
+msgid "ERROR - Out of memory, cannot create torrent from {0}"
+msgstr "错误: 内存不足,无法为 {0} 创建种子。"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:635
 #, java-format
 msgid "Torrent added and started: \"{0}\""
 msgstr "已添加并启动种子:\"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:530
+#: ../java/src/org/klomp/snark/SnarkManager.java:637
 #, java-format
 msgid "Torrent added: \"{0}\""
 msgstr "已添加种子:\"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:627
+#: ../java/src/org/klomp/snark/SnarkManager.java:672
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490
+#, java-format
+msgid "Fetching {0}"
+msgstr "正在获取{0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:675
+#, java-format
+msgid ""
+"We have no saved peers and no other torrents are running. Fetch of {0} will "
+"not succeed until you start another torrent."
+msgstr ""
+"程序还不知道其他客户端的存在,目前也没有其他种子正在运行。在您启动其他种子前"
+"文件 {0} 无法成功下载。"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:679
+#, java-format
+msgid "Adding {0}"
+msgstr "正在添加{0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:726
+#: ../java/src/org/klomp/snark/SnarkManager.java:749
+#: ../java/src/org/klomp/snark/SnarkManager.java:1174
+#, java-format
+msgid "Failed to copy torrent file to {0}"
+msgstr "无法复制种子文件到{0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:972
 #, java-format
 msgid "Too many files in \"{0}\" ({1}), deleting it!"
 msgstr "\"{0}\" ({1}) 含有太多文件,删除之!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:629
+#: ../java/src/org/klomp/snark/SnarkManager.java:974
 #, java-format
 msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
 msgstr "种子文件 \"{0}\" 不以 \".torrent\"结尾,正在删除!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:631
+#: ../java/src/org/klomp/snark/SnarkManager.java:976
 #, java-format
 msgid "No pieces in \"{0}\",  deleting it!"
 msgstr "\"{0}\" 中没有数据片,删除之!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:633
+#: ../java/src/org/klomp/snark/SnarkManager.java:978
 #, java-format
 msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
 msgstr "\"{0}\" 中文件分片太多,限额为{1},删除之!"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:635
+#: ../java/src/org/klomp/snark/SnarkManager.java:980
 #, java-format
 msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
 msgstr "\"{0}\" ({1}B) 中文件分片过大,删除之。"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:636
+#: ../java/src/org/klomp/snark/SnarkManager.java:981
 #, java-format
 msgid "Limit is {0}B"
 msgstr "限额为 {0}B"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:644
+#: ../java/src/org/klomp/snark/SnarkManager.java:989
 #, java-format
 msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
 msgstr "目前不支持大于{0}B 的种子,正在删除\"{1}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:660
+#: ../java/src/org/klomp/snark/SnarkManager.java:1005
 #, java-format
 msgid "Error: Could not remove the torrent {0}"
 msgstr "错误:无法删除种子{0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:681
+#: ../java/src/org/klomp/snark/SnarkManager.java:1026
+#: ../java/src/org/klomp/snark/SnarkManager.java:1044
 #, java-format
 msgid "Torrent stopped: \"{0}\""
 msgstr "种子已停止:\"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:696
+#: ../java/src/org/klomp/snark/SnarkManager.java:1065
 #, java-format
 msgid "Torrent removed: \"{0}\""
 msgstr "种子已删除:\"{0}\""
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:729
+#: ../java/src/org/klomp/snark/SnarkManager.java:1073
+#, java-format
+msgid "Adding torrents in {0}"
+msgstr "{0} 分钟内完成添加"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1122
 #, java-format
-msgid "Download finished: \"{0}\""
-msgstr "下载已完成:\"{0}\""
+msgid "Download finished: {0}"
+msgstr "下载已完成: {0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:729
+#: ../java/src/org/klomp/snark/SnarkManager.java:1170
 #, java-format
-msgid "size: {0}B"
-msgstr "大小:{0}B"
+msgid "Metainfo received for {0}"
+msgstr "已获得 {0} 的 Metainfo"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1171
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525
+#, java-format
+msgid "Starting up torrent {0}"
+msgstr "正在启动种子{0}"
 
-#: ../java/src/org/klomp/snark/SnarkManager.java:757
+#: ../java/src/org/klomp/snark/SnarkManager.java:1225
 msgid "Unable to connect to I2P!"
 msgstr "无法连接至I2P!"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:174
+#: ../java/src/org/klomp/snark/SnarkManager.java:1231
+#, java-format
+msgid "Unable to add {0}"
+msgstr "添加{0}失败"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205
 msgid "I2PSnark - Anonymous BitTorrent Client"
 msgstr "I2PSnark - 匿名BitTorrent客户端"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218
 msgid "Torrents"
 msgstr "种子"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:187
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
 msgid "I2PSnark"
-msgstr ""
+msgstr "I2PSnark"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:191
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225
 msgid "Refresh page"
 msgstr "刷新页面"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:193
-msgid "<img border=\"0\" src=\"/themes/console/snark/images/arrow_refresh.png\"> I2PSnark"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:195
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230
 msgid "Forum"
 msgstr "论坛"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:240
-msgid "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=\"Torrent Status\">Status"
-msgstr "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=\"种子状态\">状态"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:246
-msgid "<img border=\"0\" src=\"/themes/console/snark/images/showpeers.png\" title=\"Toggle Peer Visibility\" alt=\"Hide Peers\">"
-msgstr "<img border=\"0\" src=\"/themes/console/snark/images/showpeers.png\" title=\"隐藏节点\" alt=\"隐藏节点\">"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719
+msgid "Status"
+msgstr "状态"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:249
-msgid "<img border=\"0\" src=\"/themes/console/snark/images/hidepeers.png\" title=\"Toggle Peer Visibility\" alt=\"Show Peers\">"
-msgstr "<img border=\"0\" src=\"/themes/console/snark/images/hidepeers.png\" title=\"显示节点\" alt=\"显示节点\">"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292
+msgid "Hide Peers"
+msgstr "隐藏用户"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:254
-msgid "<img border=\"0\" src=\"/themes/console/snark/images/torrent.png\" title=\"Loaded Torrents\">Torrent"
-msgstr "<img border=\"0\" src=\"/themes/console/snark/images/torrent.png\" title=\"载入的种子\">种子"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:256
-msgid "<img border=\"0\" src=\"/themes/console/snark/images/eta.png\" title=\"Estimated Download Time\">ETA"
-msgstr "<img border=\"0\" src=\"/themes/console/snark/images/eta.png\" title=\"预计剩余时间\">预计剩余时间"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258
-msgid "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"Data Downloaded\">RX"
-msgstr "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"下载数据量\">下载"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299
+msgid "Show Peers"
+msgstr "显示用户"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:260
-msgid "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"Data Uploaded\">TX"
-msgstr "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"上传数据量\">上传"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659
+msgid "Torrent"
+msgstr "种子"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:262
-msgid "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"Download Speed\">Rate"
-msgstr "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"下载速度\">下载速度"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310
+msgid "Estimated time remaining"
+msgstr "预计剩余时间"
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313
+msgid "ETA"
+msgstr "预计剩余时间"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317
+msgid "Downloaded"
+msgstr "已下载"
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
+msgid "RX"
+msgstr "已接收"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
+msgid "Uploaded"
+msgstr "已上传"
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
+msgid "TX"
+msgstr "已发送"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332
+msgid "Down Rate"
+msgstr "下载速度"
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
+msgid "Rate"
+msgstr "速度"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264
-msgid "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"Upload Speed\">Rate"
-msgstr "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"上传速度\">上传速度"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+msgid "Up Rate"
+msgstr "上传速度"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:271
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
 msgid "Stop all torrents and the I2P tunnel"
 msgstr "停止全部种子及I2P隧道"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273
-msgid "<img src=\"/themes/console/snark/images/stop_all.png\" title=\"Stop All Torrents\" alt=\"Stop All\">"
-msgstr "<img src=\"/themes/console/snark/images/stop_all.png\" title=\"全部停止\" alt=\"全部停止\">"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367
+msgid "Stop All"
+msgstr "停止全部"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:278
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376
 msgid "Start all torrents and the I2P tunnel"
 msgstr "启动全部种子及I2P隧道"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:280
-msgid "<img src=\"/themes/console/snark/images/start_all.png\" title=\"Start All Torrents\" alt=\"Start All\">"
-msgstr "<img src=\"/themes/console/snark/images/start_all.png\" title=\"全部开始\" alt=\"全部开始\">"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378
+msgid "Start All"
+msgstr "启动全部"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
 msgid "No torrents loaded."
 msgstr "未载入任何种子"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:302
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402
 msgid "Totals"
 msgstr "总计"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
 #, java-format
 msgid "1 torrent"
 msgid_plural "{0} torrents"
 msgstr[0] "{0}个种子"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
 #, java-format
 msgid "1 connected peer"
 msgid_plural "{0} connected peers"
 msgstr[0] "{0}个已连接用户"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:336
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496
 #, java-format
-msgid "Torrent file {0} does not exist"
-msgstr "种子文件{0}不存在"
+msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
+msgstr "无效链接 - 链接必须以“http://”,“{0}”或“{1}”开头"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1481
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
 #, java-format
-msgid "Torrent already running: {0}"
-msgstr "种子已启动:{0}"
+msgid "Magnet deleted: {0}"
+msgstr "Magnet 已删除:{0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483
-#, java-format
-msgid "Torrent already in the queue: {0}"
-msgstr "种子排队中:{0}"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:352
-#, java-format
-msgid "Copying torrent to {0}"
-msgstr "正在复制种子到{0}"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:355
-#, java-format
-msgid "Unable to copy the torrent to {0}"
-msgstr "无法复制种子文件到{0}"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:355
-#, java-format
-msgid "from {0}"
-msgstr "来源{0}"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:363
-#, java-format
-msgid "Fetching {0}"
-msgstr "正在获取{0}"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367
-msgid "Invalid URL - must start with http://"
-msgstr "无效链接 - 必须以http:// 开头"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
-#, java-format
-msgid "Starting up torrent {0}"
-msgstr "正在启动种子{0}"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:417
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:435
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577
 #, java-format
 msgid "Torrent file deleted: {0}"
 msgstr "种子文件已删除:{0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:441
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593
 #, java-format
 msgid "Data file deleted: {0}"
 msgstr "数据文件已删除:{0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:443
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595
 #, java-format
 msgid "Data file could not be deleted: {0}"
 msgstr "无法删除数据文件:{0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:462
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604
 #, java-format
 msgid "Data dir deleted: {0}"
 msgstr "数据文件夹已删除:{0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:494
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637
 msgid "Error creating torrent - you must select a tracker"
 msgstr "创建种子时发生错误 - 您必须选择一个Tracker"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653
 #, java-format
 msgid "Torrent created for \"{0}\""
 msgstr "种子创建成功\"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:512
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655
 #, java-format
-msgid "Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\""
-msgstr "多数I2PTracker需要用户在做种前注册新种子 - 请在启动 \"{0}\"前到所使用的Tracker进行注册。"
+msgid ""
+"Many I2P trackers require you to register new torrents before seeding - "
+"please do so before starting \"{0}\""
+msgstr ""
+"多数I2PTracker需要用户在做种前注册新种子 - 请在启动 \"{0}\"前到所使用的"
+"Tracker进行注册。"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657
 #, java-format
 msgid "Error creating a torrent for \"{0}\""
 msgstr "创建种子时发生错误 \"{0}\""
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:517
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660
 #, java-format
 msgid "Cannot create a torrent for the nonexistent data: {0}"
 msgstr "无法为不存在的数据文件创建种子:{0}"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:520
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
 msgid "Error creating torrent - you must enter a file or directory"
 msgstr "创建种子时发生错误 - 必须指定文件或文件夹"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:523
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
 msgid "Stopping all torrents and closing the I2P tunnel."
 msgstr "正在停用所有种子并关闭I2P隧道。"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:532
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677
 msgid "I2P tunnel closed."
 msgstr "I2P隧道已关闭"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
 msgid "Opening the I2P tunnel and starting all torrents."
 msgstr "正在打开I2P隧道并启动所有种子"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:851
-msgid "Unknown"
-msgstr "未知"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:665
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670
-msgid "TrackerErr"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814
+msgid "Tracker Error"
 msgstr "Tracker错误"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:688
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:696
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:699
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847
 #, java-format
 msgid "1 peer"
 msgid_plural "{0} peers"
 msgstr[0] "{0}个用户"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:674
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:679
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824
 msgid "Seeding"
 msgstr "正做种"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:682
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
 msgid "Complete"
 msgstr "完成"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:685
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
 msgid "OK"
 msgstr "确定"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:693
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:698
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
 msgid "Stalled"
 msgstr "等待"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:701
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
 msgid "No Peers"
 msgstr "没有用户"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:703
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
 msgid "Stopped"
 msgstr "已停用"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:718
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886
+msgid "Torrent details"
+msgstr "种子详情"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160
+msgid "Info"
+msgstr "信息"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913
 msgid "View files"
 msgstr "浏览文件"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:720
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915
 msgid "Open file"
 msgstr "打开文件"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:750
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:967
-msgid "Tracker"
-msgstr "Tracker服务器"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:751
-msgid "<img border=\"0\" src=\"/themes/console/snark/images/details.png\">"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:785
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957
 msgid "Stop the torrent"
 msgstr "停止种子"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787
-msgid "<img src=\"/themes/console/snark/images/stop.png\" title=\"Stop Torrent\" alt=\"Stop\">"
-msgstr "<img src=\"/themes/console/snark/images/stop.png\" title=\"停止下载\" alt=\"停止\">"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959
+msgid "Stop"
+msgstr "停止"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:793
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969
 msgid "Start the torrent"
 msgstr "启动种子"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:795
-msgid "<img src=\"/themes/console/snark/images/start.png\" title=\"Start Torrent\" alt=\"Start\">"
-msgstr "<img src=\"/themes/console/snark/images/start.png\" title=\"开始下载\" alt=\"开始\">"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971
+msgid "Start"
+msgstr "启动"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:800
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
 msgid "Remove the torrent from the active list, deleting the .torrent file"
 msgstr "取消下载任务并删除对应种子文件。"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
 #, java-format
-msgid "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?"
+msgid ""
+"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
+"data will not be deleted) ?"
 msgstr "您确定要删除文件“{0}.torrent”(下载的数据文件不会被删除)?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:807
-msgid "<img src=\"/themes/console/snark/images/remove.png\" title=\"Remove Torrent\" alt=\"Remove\">"
-msgstr "<img src=\"/themes/console/snark/images/remove.png\" title=\"删除种子\" alt=\"删除种子\">"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
+msgid "Remove"
+msgstr "移除"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
 msgid "Delete the .torrent file and the associated data file(s)"
 msgstr "删除种子及所下载的文件"
 
 #. Can't figure out how to escape double quotes inside the onclick string.
 #. Single quotes in translate strings with parameters must be doubled.
 #. Then the remaining single quite must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:816
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
 #, java-format
-msgid "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?"
+msgid ""
+"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
+"data?"
 msgstr "您确定要删除种子“{0}”(下载的数据文件会一并被删除)?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:818
-msgid "<img src=\"/themes/console/snark/images/delete.png\" title=\"Delete Torrent + Data\" alt=\"Delete\">"
-msgstr "<img src=\"/themes/console/snark/images/delete.png\" title=\"删除种子 + 数据\" alt=\"删除种子 + 数据\">"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
+msgid "Delete"
+msgstr "删除"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:861
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
+msgid "Unknown"
+msgstr "未知"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
 msgid "Seed"
 msgstr "种子"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:879
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077
 msgid "Uninteresting (The peer has no pieces we need)"
 msgstr "无需要部分"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:881
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079
 msgid "Choked (The peer is not allowing us to request pieces)"
 msgstr "拒绝请求"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:895
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099
 msgid "Uninterested (We have no pieces the peer needs)"
 msgstr "无需要部分"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:897
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101
 msgid "Choking (We are not allowing the peer to request pieces)"
 msgstr "拒绝请求"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:927
-msgid "<img border=\"0\" src=\"/themes/console/snark/images/add.png\">Add Torrent"
-msgstr "<img border=\"0\" src=\"/themes/console/snark/images/add.png\">添加种子"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159
+#, java-format
+msgid "Details at {0} tracker"
+msgstr "Tracker {0} 上的详细信息"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:929
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188
+msgid "Add Torrent"
+msgstr "添加种子"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
 msgid "From URL"
 msgstr "从URL"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:934
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193
+msgid ""
+"Enter the torrent file download URL (I2P only), magnet link, or maggot link"
+msgstr "请输入输入 torrent 文件下载链接(仅限.i2p)、magnet 链接或 maggot 链接"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
 msgid "Add torrent"
 msgstr "添加种子"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:937
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201
 #, java-format
-msgid "You can also copy .torrent files to: <code>{0}"
-msgstr "或者您可以将.torrent文件复制到<code>{0}."
+msgid "You can also copy .torrent files to: {0}."
+msgstr "您也可以将.torrent文件复制到: {0}."
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:939
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203
 msgid "Removing a .torrent will cause it to stop."
 msgstr "删除种子文件将导致该下载任务中止。"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958
-msgid "<img border=\"0\" src=\"/themes/console/snark/images/create.png\">Create Torrent"
-msgstr "<img border=\"0\" src=\"/themes/console/snark/images/create.png\">创建种子"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
+msgid "Create Torrent"
+msgstr "创建种子"
 
 #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:961
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229
 msgid "Data to seed"
 msgstr "做种数据"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:965
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233
 msgid "File or directory to seed (must be within the specified path)"
 msgstr "做种文件或文件夹(必须下面为Snark指定的文件夹中)"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684
+msgid "Tracker"
+msgstr "Tracker服务器"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237
 msgid "Select a tracker"
 msgstr "选择一个Tracker"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
-msgid "or&nbsp;"
-msgstr "或&nbsp;"
+#. out.write(_("Open trackers and DHT only"));
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242
+msgid "Open trackers only"
+msgstr "仅通过 Open Tracker发布链接"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
+msgid "or"
+msgstr "或"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:985
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260
 msgid "Specify custom tracker announce URL"
 msgstr "指定Open Tracker发布链接"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:988
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
 msgid "Create torrent"
 msgstr "创建种子"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1133
-msgid "<img border=\"0\" src=\"/themes/console/snark/images/config.png\">Configuration"
-msgstr "<img border=\"0\" src=\"/themes/console/snark/images/config.png\">设置"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
+msgid "Configuration"
+msgstr "设置"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285
 msgid "Data directory"
 msgstr "数据文件夹"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1012
-msgid "Directory to store torrents and data"
-msgstr "种子及被做种文件的保存位置。"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287
 msgid "Edit i2psnark.config and restart to change"
 msgstr "编辑 i2psnark.config 并重启Snark后生效"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1018
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
 msgid "Auto start"
 msgstr "自动启动"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
 msgid "If checked, automatically start torrents that are added"
 msgstr "选中后Snark将自动启动已添加的所有种子。"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1026
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299
+msgid "Theme"
+msgstr "主题"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
 msgid "Startup delay"
 msgstr "启动延迟"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314
 msgid "minutes"
 msgstr "分"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1052
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
 msgid "Total uploader limit"
 msgstr "限制总上传种子数为"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341
 msgid "peers"
 msgstr "用户"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1059
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345
 msgid "Up bandwidth limit"
 msgstr "上传带宽限制"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348
 msgid "Half available bandwidth recommended."
 msgstr "推荐设置为可用带宽的一半。"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1064
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350
 msgid "View or change router bandwidth"
 msgstr "浏览或修改路由器带宽"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354
 msgid "Use open trackers also"
 msgstr "同时使用OpenTracker"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1072
-msgid "If checked, announce torrents to open trackers as well as the tracker listed in the torrent file"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358
+msgid ""
+"If checked, announce torrents to open trackers as well as the tracker listed "
+"in the torrent file"
 msgstr "选择后在OpenTracker及种子文件中的Tracker上同时发布。"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1076
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362
 msgid "Open tracker announce URLs"
 msgstr "Open Tracker发布链接"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1088
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374
 msgid "Inbound Settings"
 msgstr "入站设置"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380
 msgid "Outbound Settings"
 msgstr "出站设置"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388
 msgid "I2CP host"
 msgstr "I2CP主机"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1106
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393
 msgid "I2CP port"
 msgstr "I2CP端口"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1118
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406
 msgid "I2CP options"
 msgstr "I2CP选项"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1124
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
 msgid "Save configuration"
 msgstr "保存设置"
 
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436
+#, java-format
+msgid "Invalid magnet URL {0}"
+msgstr "磁性链接 {0} 无效"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470
+#, java-format
+msgid "Invalid info hash in magnet URL {0}"
+msgstr "magnet磁性链接“{0}”中的hash信息有误。"
+
 #. * dummies for translation
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1141
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500
 #, java-format
 msgid "1 hop"
 msgid_plural "{0} hops"
 msgstr[0] "{0}è·³"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501
 #, java-format
 msgid "1 tunnel"
 msgid_plural "{0} tunnels"
 msgstr[0] "{0}隧道"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271
-msgid "Torrent"
-msgstr "种子"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663
+msgid "Completion"
+msgstr "完成"
+
+#. else unknown
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
+msgid "Size"
+msgstr "大小"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672
+msgid "Files"
+msgstr "文件"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1278
-msgid "<img border=\"0\" src=\"/themes/console/snark/images/file.png\" title=\"File\" alt=\"File\">&nbsp;"
-msgstr "<img border=\"0\" src=\"/themes/console/snark/images/file.png\" title=\"文件\" alt=\"文件\">&nbsp;"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674
+msgid "Pieces"
+msgstr "分块数量"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1278
-msgid "<img border=\"0\" src=\"/themes/console/snark/images/size.png\" title=\"FileSize\" alt=\"FileSize\">Size"
-msgstr "<img border=\"0\" src=\"/themes/console/snark/images/size.png\" title=\"文件大小\" alt=\"文件大小\">大小"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675
+msgid "Piece size"
+msgstr "分块大小"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279
-msgid "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=\"Download Status\">Status"
-msgstr "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=\"下载状态\">状态"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697
+msgid "Magnet link"
+msgstr "Magnet磁性链接"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1301
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753
 msgid "Directory"
 msgstr "文件夹"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
+msgid "Priority"
+msgstr "优先级"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728
+msgid "Up to higher level directory"
+msgstr "上一层文件夹"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
 msgid "Torrent not found?"
 msgstr "种子未找到"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767
 msgid "File not found in torrent?"
 msgstr "种子中没有发现文件?"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
 msgid "complete"
 msgstr "完成"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1321
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781
 msgid "bytes remaining"
 msgstr "剩余字节数"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373
-msgid "Up to higher level directory"
-msgstr "上一层文件夹"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
+msgid "Open"
+msgstr "打开"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832
+msgid "High"
+msgstr "高"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837
+msgid "Normal"
+msgstr "普通"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1461
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842
+msgid "Skip"
+msgstr "跳过"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851
+msgid "Save priorities"
+msgstr "保存优先级"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967
 #, java-format
 msgid "Torrent fetched from {0}"
 msgstr "从{0}获取种子成功"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989
+#, java-format
+msgid "Torrent already running: {0}"
+msgstr "种子已启动:{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991
+#, java-format
+msgid "Torrent already in the queue: {0}"
+msgstr "种子排队中:{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997
 #, java-format
 msgid "Torrent at {0} was not valid"
 msgstr "{0}的种子中有错误"
 
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1494
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004
 #, java-format
 msgid "Torrent was not retrieved from {0}"
 msgstr "从{0}获得种子失败"
 
-#~ msgid "Status"
-#~ msgstr "状态"
-#~ msgid "Hide Peers"
-#~ msgstr "隐藏用户"
-#~ msgid "Show Peers"
-#~ msgstr "显示用户"
-#~ msgid "ETA"
-#~ msgstr "预计剩余时间"
-#~ msgid "Downloaded"
-#~ msgstr "已下载"
-#~ msgid "Uploaded"
-#~ msgstr "已上传"
-#~ msgid "Down Rate"
-#~ msgstr "下载速度"
-#~ msgid "Up Rate"
-#~ msgstr "上传速度"
-#~ msgid "Stop All"
-#~ msgstr "停止全部"
-#~ msgid "Start All"
-#~ msgstr "启动全部"
+#~ msgid "Torrent file must originate from an I2P-based tracker"
+#~ msgstr "种子文件必须来在I2P内网中的Tracker服务器。"
+
+#~ msgid "size: {0}B"
+#~ msgstr "大小:{0}B"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title="
+#~ "\"Torrent Status\">Status"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title="
+#~ "\"种子状态\">状态"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/showpeers.png\" "
+#~ "title=\"Toggle Peer Visibility\" alt=\"Hide Peers\">"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/showpeers.png\" "
+#~ "title=\"隐藏节点\" alt=\"隐藏节点\">"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/hidepeers.png\" "
+#~ "title=\"Toggle Peer Visibility\" alt=\"Show Peers\">"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/hidepeers.png\" "
+#~ "title=\"显示节点\" alt=\"显示节点\">"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/torrent.png\" title="
+#~ "\"Loaded Torrents\">Torrent"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/torrent.png\" title="
+#~ "\"载入的种子\">种子"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/eta.png\" title="
+#~ "\"Estimated Download Time\">ETA"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/eta.png\" title=\"预"
+#~ "计剩余时间\">预计剩余时间"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"Data "
+#~ "Downloaded\">RX"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"下载"
+#~ "数据量\">下载"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title="
+#~ "\"Data Uploaded\">TX"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"上传"
+#~ "数据量\">上传"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title="
+#~ "\"Download Speed\">Rate"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"下载"
+#~ "速度\">下载速度"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title="
+#~ "\"Upload Speed\">Rate"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"上传"
+#~ "速度\">上传速度"
+
+#~ msgid ""
+#~ "<img src=\"/themes/console/snark/images/stop_all.png\" title=\"Stop All "
+#~ "Torrents\" alt=\"Stop All\">"
+#~ msgstr ""
+#~ "<img src=\"/themes/console/snark/images/stop_all.png\" title=\"全部停止\" "
+#~ "alt=\"全部停止\">"
+
+#~ msgid ""
+#~ "<img src=\"/themes/console/snark/images/start_all.png\" title=\"Start All "
+#~ "Torrents\" alt=\"Start All\">"
+#~ msgstr ""
+#~ "<img src=\"/themes/console/snark/images/start_all.png\" title=\"全部开始"
+#~ "\" alt=\"全部开始\">"
+
+#~ msgid "Torrent file {0} does not exist"
+#~ msgstr "种子文件{0}不存在"
+
+#~ msgid "Copying torrent to {0}"
+#~ msgstr "正在复制种子到{0}"
+
+#~ msgid "from {0}"
+#~ msgstr "来源{0}"
+
+#~ msgid ""
+#~ "<img src=\"/themes/console/snark/images/stop.png\" title=\"Stop Torrent\" "
+#~ "alt=\"Stop\">"
+#~ msgstr ""
+#~ "<img src=\"/themes/console/snark/images/stop.png\" title=\"停止下载\" alt="
+#~ "\"停止\">"
+
+#~ msgid ""
+#~ "<img src=\"/themes/console/snark/images/start.png\" title=\"Start Torrent"
+#~ "\" alt=\"Start\">"
+#~ msgstr ""
+#~ "<img src=\"/themes/console/snark/images/start.png\" title=\"开始下载\" "
+#~ "alt=\"开始\">"
+
+#~ msgid ""
+#~ "<img src=\"/themes/console/snark/images/remove.png\" title=\"Remove "
+#~ "Torrent\" alt=\"Remove\">"
+#~ msgstr ""
+#~ "<img src=\"/themes/console/snark/images/remove.png\" title=\"删除种子\" "
+#~ "alt=\"删除种子\">"
+
+#~ msgid ""
+#~ "<img src=\"/themes/console/snark/images/delete.png\" title=\"Delete "
+#~ "Torrent + Data\" alt=\"Delete\">"
+#~ msgstr ""
+#~ "<img src=\"/themes/console/snark/images/delete.png\" title=\"删除种子 + 数"
+#~ "据\" alt=\"删除种子 + 数据\">"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/add.png\">Add Torrent"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/add.png\">添加种子"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/create.png\">Create "
+#~ "Torrent"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/create.png\">创建种子"
+
+#~ msgid "or&nbsp;"
+#~ msgstr "或&nbsp;"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/config.png"
+#~ "\">Configuration"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/config.png\">设置"
+
+#~ msgid "Directory to store torrents and data"
+#~ msgstr "种子及被做种文件的保存位置。"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/file.png\" title="
+#~ "\"File\" alt=\"File\">&nbsp;"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/file.png\" title=\"æ–‡"
+#~ "件\" alt=\"文件\">&nbsp;"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/size.png\" title="
+#~ "\"FileSize\" alt=\"FileSize\">Size"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/size.png\" title=\"æ–‡"
+#~ "件大小\" alt=\"文件大小\">大小"
+
+#~ msgid ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title="
+#~ "\"Download Status\">Status"
+#~ msgstr ""
+#~ "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title="
+#~ "\"下载状态\">状态"
+
 #~ msgid "Details"
 #~ msgstr "详情"
-#~ msgid "Stop"
-#~ msgstr "停止"
-#~ msgid "Start"
-#~ msgstr "启动"
-#~ msgid "Remove"
-#~ msgstr "移除"
-#~ msgid "Delete"
-#~ msgstr "删除"
-#~ msgid "Add Torrent"
-#~ msgstr "添加种子"
-#~ msgid "Create Torrent"
-#~ msgstr "创建种子"
-#~ msgid "or"
-#~ msgstr "或"
-#~ msgid "Configuration"
-#~ msgstr "设置"
-#~ msgid "File"
-#~ msgstr "文件"
-#~ msgid "Size"
-#~ msgstr "大小"
+
 #~ msgid "Cannot change the I2CP settings while torrents are active"
 #~ msgstr "正在下载/上传,无法更改I2CP设置"
+
 #~ msgid "{0} torrents"
 #~ msgstr "{0} 个种子"
+
 #~ msgid "Non-i2p tracker in \"{0}\", deleting it from our list of trackers!"
 #~ msgstr ""
 #~ "【匿名性警告】\"{0}\" 中含有非I2P Tracker,程序将从Tracker列表中将其删除。"
+
 #~ msgid "Custom tracker URL"
 #~ msgstr "自定义TrackerURL"
+
 #~ msgid "Configure"
 #~ msgstr "设置"
-
diff --git a/apps/i2ptunnel/java/bmsg.sh b/apps/i2ptunnel/java/bmsg.sh
deleted file mode 100644
index b9d294b32336537241eb2f9953fb65673c93b524..0000000000000000000000000000000000000000
--- a/apps/i2ptunnel/java/bmsg.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Update messages_xx.po and messages_xx.class files,
-# from both java and jsp sources.
-# Requires installed programs xgettext, msgfmt, msgmerge, and find.
-# zzz - public domain
-#
-
-## launching sh.exe with -login parameter will open a shell with the current path always pointing to \bin\
-## need to cd into our orignal path - where we call sh.exe from.
-
-cd $CALLFROM
-## echo $PWD
-
-## except this everything is the same with bundle-message.sh
-## walking - public domain :-D
-
-source bundle-messages.sh $PARAS
\ No newline at end of file
diff --git a/apps/i2ptunnel/java/build.xml b/apps/i2ptunnel/java/build.xml
index f50fadd3e17a6aea43abd6aedc651ca34c7a3e4c..56ca6f30b08a6c63702aec839aba8968c1954e12 100644
--- a/apps/i2ptunnel/java/build.xml
+++ b/apps/i2ptunnel/java/build.xml
@@ -28,6 +28,7 @@
             srcdir="./src" 
             debug="true" deprecation="on" source="1.5" target="1.5" 
             destdir="./build/obj" 
+            includeAntRuntime="false"
             classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar" >
             <compilerarg line="${javac.compilerargs}" />
         </javac>
@@ -36,27 +37,47 @@
     <!-- TODO: Move the web classes from the jar to the war - they are not part of the API
       -  This will require sponge to rewrite some seedless stuff that uses it.
      -->
-    <target name="jar" depends="builddep, compile">
+    <target name="jar" depends="builddep, compile, jarUpToDate" unless="jar.uptodate" >
+        <exec executable="mtn" outputproperty="workspace.changes.j" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="." />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes.j}" outputproperty="workspace.changes.j.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
         <jar destfile="./build/i2ptunnel.jar" basedir="./build/obj" includes="**/*.class">
             <manifest>
                 <attribute name="Main-Class" value="net.i2p.i2ptunnel.I2PTunnel" />
                 <attribute name="Class-Path" value="i2p.jar mstreaming.jar" />
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.j.tr}" />
             </manifest>
         </jar>
     </target>
 
+    <target name="jarUpToDate">
+        <uptodate property="jar.uptodate" targetfile="build/i2ptunnel.jar" >
+            <srcfiles dir= "build/obj" includes="**/*.class" />
+        </uptodate>
+    </target>
+
     <target name="bundle" depends="compile, precompilejsp">
         <!-- Update the messages_*.po files.
              We need to supply the bat file for windows, and then change the fail property to true -->
-        <exec executable="sh" osfamily="unix" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="unix" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="sh" osfamily="mac" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="mac" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="false" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+		<!-- multi-lang is optional -->
+        <exec executable="sh" osfamily="windows" failifexecutionfails="false" >
+            <arg value="./bundle-messages.sh" />
         </exec>
     </target>
 
@@ -70,19 +91,40 @@
             <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="true" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
     </target>
 
-    <target name="war" depends="precompilejsp, bundle"> 
+    <target name="war" depends="precompilejsp, bundle, warUpToDate" unless="war.uptodate" > 
+        <exec executable="mtn" outputproperty="workspace.changes.w" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="../jsp" />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes.w}" outputproperty="workspace.changes.w.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
         <war destfile="build/i2ptunnel.war" webxml="../jsp/web-out.xml"
              basedir="../jsp/" excludes="web.xml, web-fragment.xml, web-out.xml, **/*.java, *.jsp">
+            <manifest>
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.w.tr}" />
+            </manifest>
         </war>
     </target>
 
+    <target name="warUpToDate">
+        <uptodate property="war.uptodate" targetfile="build/i2ptunnel.war" >
+            <srcfiles dir= "../jsp" excludes="web.xml, web-fragment.xml, **/*.java, *.jsp" />
+        </uptodate>
+    </target>
+
     <target name="precompilejsp" depends="jar" unless="precompilejsp.uptodate">
         <delete dir="../jsp/WEB-INF/" />
         <delete file="../jsp/web-fragment.xml" />
@@ -110,6 +152,7 @@
             <arg value="../jsp/" />
         </java>
         <javac debug="true" deprecation="on" source="1.5" target="1.5" 
+               includeAntRuntime="false"
                destdir="../jsp/WEB-INF/classes/" srcdir="../jsp/WEB-INF/classes" includes="**/*.java">
             <compilerarg line="${javac.compilerargs}" />
             <classpath>
@@ -141,6 +184,55 @@
             splitindex="true" 
             windowtitle="I2PTunnel" />
     </target>
+
+    <target name="compileTest">
+        <mkdir dir="./build" />
+        <mkdir dir="./build/obj" />
+        <!-- We need the ant runtime, as it includes junit -->
+        <javac srcdir="./src:./test" debug="true" source="1.5" target="1.5"
+               includeAntRuntime="true"
+               deprecation="on" destdir="./build/obj" >
+            <compilerarg line="${javac.compilerargs}" />
+            <classpath>
+                <pathelement location="../../../core/java/build/i2p.jar" />
+                <pathelement location="../../ministreaming/java/build/mstreaming.jar" />
+            </classpath>
+        </javac>
+    </target>
+    <target name="test" depends="clean, compileTest">
+        <junit printsummary="on" fork="yes">
+            <classpath>
+                <pathelement path="${classpath}" />
+                <pathelement location="./build/obj" />
+                <pathelement location="../../../core/java/build/i2p.jar" />
+            </classpath>
+            <batchtest>
+                <fileset dir="./test/">
+                    <include name="**/*Test.java" />
+                </fileset>
+            </batchtest>
+            <formatter type="xml"/>
+        </junit>
+        <mkdir dir="../../../reports/" />
+        <mkdir dir="../../../reports/i2ptunnel/" />
+        <mkdir dir="../../../reports/i2ptunnel/junit/" />
+        <delete>
+            <fileset dir="../../../reports/i2ptunnel/junit">
+                <include name="TEST-*.xml"/>
+            </fileset>
+        </delete>
+        <copy todir="../../../reports/i2ptunnel/junit">
+            <fileset dir=".">
+                <include name="TEST-*.xml"/>
+            </fileset>
+        </copy>
+        <delete>
+            <fileset dir=".">
+                <include name="TEST-*.xml"/>
+            </fileset>
+        </delete>
+    </target>
+
     <target name="clean">
         <delete dir="./build" />
         <delete dir="../jsp/WEB-INF/" />
diff --git a/apps/i2ptunnel/java/bundle-messages.bat b/apps/i2ptunnel/java/bundle-messages.bat
deleted file mode 100644
index 90feca972a6457eebf97f9bdbea6028ac88d7789..0000000000000000000000000000000000000000
--- a/apps/i2ptunnel/java/bundle-messages.bat
+++ /dev/null
@@ -1,26 +0,0 @@
-@echo off
-set Callfrom=%cd%
-set Paras=%1
-
-rem before calling make sure you have msys and mingw 's "bin" path 
-rem in your current searching path
-rem type "set path" to check 
-if not exist ..\locale\*.only goto updateALL
-
-rem put a messages_xx.only(eg messages_zh.only) into locale folder
-rem this script will only touch the po file(eg zh) you specified, leaving other po files untact.
-
-for %%i in (..\locale\*.only) do set PO=%%~ni
-echo [Notice] Yu choose to Ony update the choosen file: %PO%.po 
-for %%i in (..\locale\*.po) do if not %%~ni==%PO% ren %%i %%~ni.po-
-
-call sh --login %cd%\bmsg.sh
-
-for %%i in (..\locale\*.po-) do if not %%~ni==%PO% ren %%i %%~ni.po
-goto end
-
-:updateALL
-call sh --login %cd%\bmsg.sh
-
-:end
-echo End of Message Bundling
\ No newline at end of file
diff --git a/apps/i2ptunnel/java/bundle-messages.sh b/apps/i2ptunnel/java/bundle-messages.sh
index 236b0ad0114d1ca9cfcf7903e4f31ed08e8dd4b7..74bbc573e1b11b8bc44df91a2c12124ff5b2d84e 100755
--- a/apps/i2ptunnel/java/bundle-messages.sh
+++ b/apps/i2ptunnel/java/bundle-messages.sh
@@ -18,6 +18,14 @@ then
 	POUPDATE=1
 fi
 
+# on windows, one must specify the path of commnad find
+# since windows has its own retarded version of find.
+if which find|grep -q -i windows ; then
+	export PATH=.:/bin:/usr/local/bin:$PATH
+fi
+# Fast mode - update ondemond
+# set LG2 to the language you need in envrionment varibales to enable this
+
 # add ../java/ so the refs will work in the po file
 JPATHS="../java/src ../jsp/WEB-INF"
 for i in ../locale/messages_*.po
@@ -26,6 +34,11 @@ do
 	LG=${i#../locale/messages_}
 	LG=${LG%.po}
 
+	# skip, if specified
+	if [ $LG2 ]; then
+		[ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only.
+	fi
+
 	if [ "$POUPDATE" = "1" ]
 	then
 		# make list of java files newer than the .po file
@@ -72,15 +85,19 @@ do
 		touch $i
 	fi
 
-	echo "Generating ${CLASS}_$LG ResourceBundle..."
+    if [ "$LG" != "en" ]
+    then
+        # only generate for non-source language
+        echo "Generating ${CLASS}_$LG ResourceBundle..."
 
-	# convert to class files in build/obj
-	msgfmt --java --statistics -r $CLASS -l $LG -d ../jsp/WEB-INF/classes $i
-	if [ $? -ne 0 ]
-	then
-		echo 'Warning - msgfmt failed, not updating translations'
-		break
-	fi
+        # convert to class files in build/obj
+        msgfmt --java --statistics -r $CLASS -l $LG -d ../jsp/WEB-INF/classes $i
+        if [ $? -ne 0 ]
+        then
+            echo 'Warning - msgfmt failed, not updating translations'
+            break
+        fi
+    fi
 done
 rm -f $TMPFILE
 # todo: return failure
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
index 75a276aa00a939c8b7ae6ba154e742fda950ef3d..293703ac9c9786580ad4a1e6c6b691099d95d2e8 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
@@ -43,13 +43,13 @@ import java.io.OutputStream;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Properties;
 import java.util.Set;
 import java.util.StringTokenizer;
+import java.util.concurrent.CopyOnWriteArraySet;
 
 import net.i2p.I2PAppContext;
 import net.i2p.I2PException;
@@ -99,7 +99,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
     private final List tasks = new ArrayList();
     private int next_task_id = 1;
 
-    private final Set listeners = new HashSet();
+    private final Set listeners = new CopyOnWriteArraySet();
 
     public static void main(String[] args) throws IOException {
         new I2PTunnel(args);
@@ -118,8 +118,8 @@ public class I2PTunnel implements Logging, EventDispatcher {
         _tunnelId = ++__tunnelId;
         _log = _context.logManager().getLog(I2PTunnel.class);
         _event = new EventDispatcherImpl();
-        Properties p = new Properties();
-        p.putAll(System.getProperties());
+        // as of 0.8.4, include context properties
+        Properties p = _context.getProperties();
         _clientOptions = p;
         _sessions = new ArrayList(1);
         
@@ -1626,16 +1626,12 @@ public class I2PTunnel implements Logging, EventDispatcher {
 
     public void addConnectionEventListener(ConnectionEventListener lsnr) {
         if (lsnr == null) return;
-        synchronized (listeners) {
-            listeners.add(lsnr);
-        }
+        listeners.add(lsnr);
     }
 
     public void removeConnectionEventListener(ConnectionEventListener lsnr) {
         if (lsnr == null) return;
-        synchronized (listeners) {
-            listeners.remove(lsnr);
-        }
+        listeners.remove(lsnr);
     }
     
     private String getPrefix() { return "[" + _tunnelId + "]: "; }
@@ -1649,12 +1645,10 @@ public class I2PTunnel implements Logging, EventDispatcher {
      */
     void routerDisconnected() {
         _log.error(getPrefix() + "Router disconnected - firing notification events");
-        synchronized (listeners) {
             for (Iterator iter = listeners.iterator(); iter.hasNext();) {
                 ConnectionEventListener lsnr = (ConnectionEventListener) iter.next();
                 if (lsnr != null) lsnr.routerDisconnected();
             }
-        }
     }
 
     /**
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
index 70265a154d2a14fd94169b929921b1a427f00c29..1014a986b71438b91a75c2650be2d156c2041a4e 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
@@ -169,6 +169,9 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
                 // Use this rather than BufferedReader because we can't have readahead,
                 // since we are passing the stream on to I2PTunnelRunner
                 line = DataHelper.readLine(in);
+                if(line == null) {
+                    break;
+                }
                 line = line.trim();
                 if (_log.shouldLog(Log.DEBUG))
                     _log.debug(getPrefix(requestId) + "Line=[" + line + "]");
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
index d4efaa8ea4ba0425664e07f917f0159c4b7c458b..d44f5539a9d04eae6cedab919146e56a254270a0 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
@@ -10,7 +10,11 @@ import java.io.OutputStream;
 import java.net.InetAddress;
 import java.net.Socket;
 import java.net.SocketException;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 import java.util.zip.GZIPOutputStream;
 
@@ -49,7 +53,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
          "Connection: close\r\n"+
          "Proxy-Connection: close\r\n"+
          "\r\n"+
-         "<html><head><title>503 Service Unavailable<title></head>\n"+
+         "<html><head><title>503 Service Unavailable</title></head>\n"+
          "<body><h2>503 Service Unavailable</h2>\n" +
          "<p>This I2P eepsite is unavailable. It may be down or undergoing maintenance.</p>\n" +
          "</body></html>")
@@ -94,28 +98,24 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
             InputStream in = socket.getInputStream();
 
             StringBuilder command = new StringBuilder(128);
-            Properties headers = readHeaders(in, command,
+            Map<String, List<String>> headers = readHeaders(in, command,
                 CLIENT_SKIPHEADERS, getTunnel().getContext());
-            headers.setProperty(HASH_HEADER, socket.getPeerDestination().calculateHash().toBase64());
-            headers.setProperty(DEST32_HEADER, Base32.encode(socket.getPeerDestination().calculateHash().getData()) + ".b32.i2p" );
-            headers.setProperty(DEST64_HEADER, socket.getPeerDestination().toBase64());
+            
+            addEntry(headers, HASH_HEADER, socket.getPeerDestination().calculateHash().toBase64());
+            addEntry(headers, DEST32_HEADER, Base32.encode(socket.getPeerDestination().calculateHash().getData()) + ".b32.i2p");
+            addEntry(headers, DEST64_HEADER, socket.getPeerDestination().toBase64());
 
             if ( (_spoofHost != null) && (_spoofHost.trim().length() > 0) )
-                headers.setProperty("Host", _spoofHost);
-            headers.setProperty("Connection", "close");
+                setEntry(headers, "Host", _spoofHost);
+            setEntry(headers, "Connection", "close");
             // we keep the enc sent by the browser before clobbering it, since it may have 
             // been x-i2p-gzip
-            String enc = headers.getProperty("Accept-encoding");
-            String altEnc = headers.getProperty("X-Accept-encoding");
+            String enc = getEntryOrNull(headers, "Accept-encoding");
+            String altEnc = getEntryOrNull(headers, "X-Accept-encoding");
             
             // according to rfc2616 s14.3, this *should* force identity, even if
             // "identity;q=1, *;q=0" didn't.  
-            headers.setProperty("Accept-encoding", ""); 
-            String modifiedHeader = formatHeaders(headers, command);
-            
-            //String modifiedHeader = getModifiedHeader(socket);
-            if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Modified header: [" + modifiedHeader + "]");
+            setEntry(headers, "Accept-encoding", ""); 
 
             socket.setReadTimeout(readTimeout);
             Socket s = new Socket(remoteHost, remotePort);
@@ -133,9 +133,15 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
             }
             if (_log.shouldLog(Log.INFO))
                 _log.info("HTTP server encoding header: " + enc + "/" + altEnc);
-            boolean useGZIP = ( (enc != null) && (enc.indexOf("x-i2p-gzip") >= 0) );
-            if ( (!useGZIP) && (altEnc != null) && (altEnc.indexOf("x-i2p-gzip") >= 0) )
-                useGZIP = true;
+            boolean alt = (altEnc != null) && (altEnc.indexOf("x-i2p-gzip") >= 0);
+            boolean useGZIP = alt || ( (enc != null) && (enc.indexOf("x-i2p-gzip") >= 0) );
+            // Don't pass this on, outproxies should strip so I2P traffic isn't so obvious but they probably don't
+            if (alt)
+                headers.remove("X-Accept-encoding");
+
+            String modifiedHeader = formatHeaders(headers, command);
+            if (_log.shouldLog(Log.DEBUG))
+                _log.debug("Modified header: [" + modifiedHeader + "]");
             
             if (allowGZIP && useGZIP) {
                 I2PAppThread req = new I2PAppThread(
@@ -234,7 +240,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
 
                 //Change headers to protect server identity
                 StringBuilder command = new StringBuilder(128);
-                Properties headers = readHeaders(serverin, command,
+                Map<String, List<String>> headers = readHeaders(serverin, command,
                     SERVER_SKIPHEADERS, _ctx);
                 String modifiedHeaders = formatHeaders(headers, command);
                 compressedOut.write(modifiedHeaders.getBytes());
@@ -360,13 +366,14 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
         }
     }
 
-    private static String formatHeaders(Properties headers, StringBuilder command) {
+    protected static String formatHeaders(Map<String, List<String>> headers, StringBuilder command) {
         StringBuilder buf = new StringBuilder(command.length() + headers.size() * 64);
         buf.append(command.toString().trim()).append("\r\n");
-        for (Iterator iter = headers.keySet().iterator(); iter.hasNext(); ) {
+        for (Iterator<String> iter = headers.keySet().iterator(); iter.hasNext(); ) {
             String name = (String)iter.next();
-            String val  = headers.getProperty(name);
-            buf.append(name.trim()).append(": ").append(val.trim()).append("\r\n");
+            for(String val: headers.get(name)) {
+                buf.append(name.trim()).append(": ").append(val.trim()).append("\r\n");
+            }
         }
         buf.append("\r\n");
         return buf.toString();
@@ -374,9 +381,46 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
     
     /** ridiculously long, just to prevent OOM DOS @since 0.7.13 */
     private static final int MAX_HEADERS = 60;
+    
+    /**
+     * Add an entry to the multimap.
+     */
+    private static void addEntry(Map<String, List<String>> headers, String key, String value) {
+        List<String> entry = headers.get(key);
+        if(entry == null) {
+        	headers.put(key, entry = new ArrayList<String>());
+        }
+        entry.add(value);    	
+    }
+    
+    /**
+     * Remove the other matching entries and set this entry as the only one.
+     */
+    private static void setEntry(Map<String, List<String>> headers, String key, String value) {
+    	List<String> entry = headers.get(key);
+    	if(entry == null) {
+    		headers.put(key, entry = new ArrayList<String>());
+    	}
+    	entry.clear();
+    	entry.add(value);
+    }
+    
+    /**
+     * Get the first matching entry in the multimap
+     * @return the first matching entry or null
+     */
+    private static String getEntryOrNull(Map<String, List<String>> headers, String key) {
+    	List<String> entries = headers.get(key);
+    	if(entries == null || entries.size() < 1) {
+    		return null;
+    	}
+    	else {
+    		return entries.get(0);
+    	}
+    }
 
-    private static Properties readHeaders(InputStream in, StringBuilder command, String[] skipHeaders, I2PAppContext ctx) throws IOException {
-        Properties headers = new Properties();
+    protected static Map<String, List<String>> readHeaders(InputStream in, StringBuilder command, String[] skipHeaders, I2PAppContext ctx) throws IOException {
+    	HashMap<String, List<String>> headers = new HashMap<String, List<String>>();
         StringBuilder buf = new StringBuilder(128);
         
         boolean ok = DataHelper.readLine(in, command);
@@ -438,7 +482,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
                     continue;
                 }
 
-                headers.setProperty(name, value);
+                addEntry(headers, name, value);
                 //if (_log.shouldLog(Log.DEBUG))
                 //    _log.debug("Read the header [" + name + "] = [" + value + "]");
             }
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java
index d5b3dda65cd4b1b1aec0521cf74b99d60f51550f..6bfbdedd1e7f8aba09e03edccd9efa149b44a2bd 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java
@@ -89,9 +89,9 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
             i2ps = createI2PSocket(clientDest);
             i2ps.setReadTimeout(readTimeout);
             StringBuffer expectedPong = new StringBuffer();
-            Thread in = new I2PAppThread(new IrcInboundFilter(s,i2ps, expectedPong), "IRC Client " + __clientId + " in", true);
+            Thread in = new I2PAppThread(new IrcInboundFilter(s,i2ps, expectedPong, _log), "IRC Client " + __clientId + " in", true);
             in.start();
-            Thread out = new I2PAppThread(new IrcOutboundFilter(s,i2ps, expectedPong), "IRC Client " + __clientId + " out", true);
+            Thread out = new I2PAppThread(new IrcOutboundFilter(s,i2ps, expectedPong, _log), "IRC Client " + __clientId + " out", true);
             out.start();
         } catch (Exception ex) {
             if (_log.shouldLog(Log.ERROR))
@@ -128,13 +128,13 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
         private Socket local;
         private I2PSocket remote;
         private StringBuffer expectedPong;
-        // shadows _log in super()
-        private final Log _log = new Log(I2PTunnelIRCClient.class);
+        private final Log _log;
                 
-        public IrcInboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong) {
+        public IrcInboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong, Log log) {
             local=_local;
             remote=_remote;
             expectedPong=pong;
+            _log = log;
         }
 
         public void run() {
@@ -207,13 +207,13 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
             private Socket local;
             private I2PSocket remote;
             private StringBuffer expectedPong;
-            // shadows _log in super()
-            private final Log _log = new Log(I2PTunnelIRCClient.class);
+            private final Log _log;
                 
-            public IrcOutboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong) {
+            public IrcOutboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong, Log log) {
                 local=_local;
                 remote=_remote;
                 expectedPong=pong;
+                _log = log;
             }
                 
             public void run() {
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java
index 5427130bc781366df814519bc292a9a3338a0ac6..babdba976de36619bbcdcbb3cda169d257f5880f 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java
@@ -210,7 +210,9 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
      *
      */
     public void startRunning() {
-        Thread t = new I2PAppThread(this, "Server " + remoteHost + ':' + remotePort, true);
+        // prevent JVM exit when running outside the router
+        boolean isDaemon = getTunnel().getContext().isRouterContext();
+        Thread t = new I2PAppThread(this, "Server " + remoteHost + ':' + remotePort, isDaemon);
         t.start();
     }
 
@@ -302,9 +304,10 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
                          try {
                              i2ps.close();
                          } catch (IOException ioe) {}
-                         if (open && _log.shouldLog(Log.ERROR))
-                             _log.error("ServerHandler queue full for " + remoteHost + ':' + remotePort +
-                                        "; increase " + PROP_HANDLER_COUNT + '?', ree);
+                         if (open)
+                             _log.logAlways(Log.WARN, "ServerHandler queue full, dropping incoming connection to " +
+                                        remoteHost + ':' + remotePort +
+                                        "; increase server max threads or " + PROP_HANDLER_COUNT);
                     }
                 } else {
                     // use only for standard servers that can't get slowlorissed! Not for http or irc
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java
index 618b035f7b68cf8bb7838cbb67f897d116c902d8..f1e9f7108dac21555fae15d887d0b0d2176a9074 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java
@@ -1,18 +1,15 @@
 package net.i2p.i2ptunnel;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
-import java.util.TreeMap;
 
 import net.i2p.I2PAppContext;
 import net.i2p.client.I2PSession;
@@ -20,7 +17,7 @@ import net.i2p.client.I2PSessionException;
 import net.i2p.data.DataHelper;
 import net.i2p.util.I2PAppThread;
 import net.i2p.util.Log;
-import net.i2p.util.SecureFileOutputStream;
+import net.i2p.util.OrderedProperties;
 
 /**
  * Coordinate a set of tunnels within the JVM, loading and storing their config
@@ -223,14 +220,15 @@ public class TunnelControllerGroup {
      * file
      *
      */
-    public void saveConfig() {
+    public void saveConfig() throws IOException {
         saveConfig(_configFile);
     }
+
     /**
      * Save the configuration of all known tunnels to the given file
      *
      */
-    public void saveConfig(String configFile) {
+    public void saveConfig(String configFile) throws IOException {
         _configFile = configFile;
         File cfgFile = new File(configFile);
         if (!cfgFile.isAbsolute())
@@ -239,32 +237,14 @@ public class TunnelControllerGroup {
         if ( (parent != null) && (!parent.exists()) )
             parent.mkdirs();
         
-        
-        TreeMap map = new TreeMap();
+        Properties map = new OrderedProperties();
         for (int i = 0; i < _controllers.size(); i++) {
             TunnelController controller = _controllers.get(i);
             Properties cur = controller.getConfig("tunnel." + i + ".");
             map.putAll(cur);
         }
         
-        StringBuilder buf = new StringBuilder(1024);
-        for (Iterator iter = map.keySet().iterator(); iter.hasNext(); ) {
-            String key = (String)iter.next();
-            String val = (String)map.get(key);
-            buf.append(key).append('=').append(val).append('\n');
-        }
-        
-        FileOutputStream fos = null;
-        try {
-            fos = new SecureFileOutputStream(cfgFile);
-            fos.write(buf.toString().getBytes("UTF-8"));
-            if (_log.shouldLog(Log.INFO))
-                _log.info("Config written to " + cfgFile.getPath());
-        } catch (IOException ioe) {
-            _log.error("Error writing out the config");
-        } finally {
-            if (fos != null) try { fos.close(); } catch (IOException ioe) {}
-        }
+        DataHelper.storeProps(map, cfgFile);
     }
     
     /**
@@ -310,7 +290,7 @@ public class TunnelControllerGroup {
         synchronized (_sessions) {
             Set<TunnelController> owners = _sessions.get(session);
             if (owners == null) {
-                owners = new HashSet(1);
+                owners = new HashSet(2);
                 _sessions.put(session, owners);
             }
             owners.add(controller);
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSIRCTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSIRCTunnel.java
index 84e66cf7289e9f89d29c88c0b444c97c8235e702..a197636781fe82f0653d4bcea3249bb9e57fe61f 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSIRCTunnel.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSIRCTunnel.java
@@ -50,9 +50,11 @@ public class I2PSOCKSIRCTunnel extends I2PSOCKSTunnel {
             Socket clientSock = serv.getClientSocket();
             I2PSocket destSock = serv.getDestinationI2PSocket(this);
             StringBuffer expectedPong = new StringBuffer();
-            Thread in = new I2PAppThread(new I2PTunnelIRCClient.IrcInboundFilter(clientSock, destSock, expectedPong), "SOCKS IRC Client " + (++__clientId) + " in", true);
+            Thread in = new I2PAppThread(new I2PTunnelIRCClient.IrcInboundFilter(clientSock, destSock, expectedPong, _log),
+                                         "SOCKS IRC Client " + (++__clientId) + " in", true);
             in.start();
-            Thread out = new I2PAppThread(new I2PTunnelIRCClient.IrcOutboundFilter(clientSock, destSock, expectedPong), "SOCKS IRC Client " + __clientId + " out", true);
+            Thread out = new I2PAppThread(new I2PTunnelIRCClient.IrcOutboundFilter(clientSock, destSock, expectedPong, _log),
+                                          "SOCKS IRC Client " + __clientId + " out", true);
             out.start();
         } catch (SOCKSException e) {
             _log.error("Error from SOCKS connection", e);
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 2184b434f1f02aa968cc9f698e47b84b53a8b758..63f119bca852e1527ece1fd4dfef1c0d49a3707e 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
@@ -115,7 +115,7 @@ public class EditBean extends IndexBean {
         if (tun != null)
             return "true".equalsIgnoreCase(tun.getSharedClient());
         else
-            return true;
+            return false;
     }
     
     public boolean shouldDelay(int tunnel) {
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 9787078894a7998b4fd3ba6a234ebc497690291b..eb36a64bc4c3757ec090b4e9fd218820086b4971 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
@@ -8,7 +8,7 @@ package net.i2p.i2ptunnel.web;
  *
  */
 
-import java.util.concurrent.ConcurrentHashMap;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -17,6 +17,7 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import java.util.StringTokenizer;
+import java.util.concurrent.ConcurrentHashMap;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.Base32;
@@ -299,14 +300,22 @@ public class IndexBean {
             }
         }
         
-        List msgs = doSave();
-        msgs.add(0, "Changes saved");
+        List<String> msgs = doSave();
         return getMessages(msgs);
     }
-    private List doSave() { 
-        _group.saveConfig();
-        return _group.clearAllMessages();
+
+    private List<String> doSave() { 
+        List<String> rv = _group.clearAllMessages();
+        try {
+            _group.saveConfig();
+            rv.add(0, _("Configuration changes saved"));
+        } catch (IOException ioe) {
+            _log.error("Failed to save config file", ioe);
+            rv.add(0, _("Failed to save configuration") + ": " + ioe.toString());
+        }
+        return rv;
     } 
+
     private String deleteTunnel() {
         if (!_removeConfirmed)
             return "Please confirm removal";
@@ -1095,16 +1104,16 @@ public class IndexBean {
             return null;
     }
     
-    private static String getMessages(List msgs) {
+    private static String getMessages(List<String> msgs) {
         StringBuilder buf = new StringBuilder(128);
         getMessages(msgs, buf);
         return buf.toString();
     }
 
-    private static void getMessages(List msgs, StringBuilder buf) {
+    private static void getMessages(List<String> msgs, StringBuilder buf) {
         if (msgs == null) return;
         for (int i = 0; i < msgs.size(); i++) {
-            buf.append((String)msgs.get(i)).append("\n");
+            buf.append(msgs.get(i)).append("\n");
         }
     }
 
diff --git a/apps/i2ptunnel/java/test/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java b/apps/i2ptunnel/java/test/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..8cd7cf3227ea3c866ae8d6b2888e89225452157a
--- /dev/null
+++ b/apps/i2ptunnel/java/test/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java
@@ -0,0 +1,61 @@
+package net.i2p.i2ptunnel;
+
+import java.io.BufferedWriter;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.util.Map;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+public class I2PTunnelHTTPServerTest extends TestCase {
+	
+	public InputStream fillInputStream(String headers) throws IOException {
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(baos));
+		bw.write(headers);
+		bw.flush();
+		byte[] bytes = baos.toByteArray();
+		return new ByteArrayInputStream(bytes);
+	}
+	
+	public void testSimpleHeader() throws IOException {
+		String headerString = "GET /blah HTTP/1.1\r\n";
+		headerString += "BLAH: something\r\n";
+		headerString += "\r\n";
+		InputStream in = fillInputStream(headerString);
+		Map<String, List<String>> headers = I2PTunnelHTTPServer.readHeaders(in, new StringBuilder(128), new String[0], null);
+		assertEquals(headers.size(), 1); //One header
+	}
+	
+	public void testDuplicateHeader() throws IOException {
+		String headerString = "GET /something HTTP/1.1\r\n";
+		headerString += "someHeader: blabla bla bloooo\r\n";
+		headerString += "someHeader: oh my, duplication!\r\n";
+		headerString += "\r\n";
+		InputStream in = fillInputStream(headerString);
+		Map<String, List<String>> headers = I2PTunnelHTTPServer.readHeaders(in, new StringBuilder(128), new String[0], null);
+		assertEquals(headers.size(), 1);
+		assertEquals(headers.get("someHeader").size(), 2);
+	}
+	
+	public void testDuplicateHeadersFormat() throws IOException {
+		String headerString = "GET /something HTTP/1.1\r\n";
+		headerString += "abc: def\r\n";
+		headerString += "abc: blaaah\r\n";
+		headerString += "manamana: toe toe toedoedoe\r\n";
+		headerString += "\r\n";
+		InputStream in = fillInputStream(headerString);
+		StringBuilder builder = new StringBuilder(128);
+		Map<String, List<String>> headers = I2PTunnelHTTPServer.readHeaders(in, builder, new String[0], null);
+		String result = I2PTunnelHTTPServer.formatHeaders(headers, builder);
+		int first = result.indexOf("abc");
+		assertTrue(first >= 0);
+		int second = result.indexOf("abc", first);
+		assertTrue(second >= 0);
+	}
+
+}
diff --git a/apps/i2ptunnel/jsp/edit.jsp b/apps/i2ptunnel/jsp/edit.jsp
index 2da356e9cdc95435eb61ad047eaedd957023dd0a..e35f23c0fb2cd1909c9334f4d16325766de912d3 100644
--- a/apps/i2ptunnel/jsp/edit.jsp
+++ b/apps/i2ptunnel/jsp/edit.jsp
@@ -1,13 +1,17 @@
-<%@page pageEncoding="UTF-8"%>
-<%@page contentType="text/html" import="net.i2p.i2ptunnel.web.EditBean" %><% 
+<%
+    // NOTE: Do the header carefully so there is no whitespace before the <?xml... line
+
+%><%@page pageEncoding="UTF-8"
+%><%@page contentType="text/html" import="net.i2p.i2ptunnel.web.EditBean"
+%><% 
 String tun = request.getParameter("tunnel");
  if (tun != null) {
   try {
     int curTunnel = Integer.parseInt(tun);
     if (EditBean.staticIsClient(curTunnel)) {
-    %><jsp:include page="editClient.jsp" /><%
+        %><jsp:include page="editClient.jsp" /><%
     } else {
-    %><jsp:include page="editServer.jsp" /><%
+        %><jsp:include page="editServer.jsp" /><%
     }
   } catch (NumberFormatException nfe) {
     %>Invalid tunnel parameter<%
@@ -16,9 +20,9 @@ String tun = request.getParameter("tunnel");
   String type = request.getParameter("type");
   int curTunnel = -1;
   if (EditBean.isClient(type)) {
-    %><jsp:include page="editClient.jsp" /><%
+        %><jsp:include page="editClient.jsp" /><%
   } else {
-    %><jsp:include page="editServer.jsp" /><%
+        %><jsp:include page="editServer.jsp" /><%
   }
 }
 %>
diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp
index cabfb2946479df5f7aba8cd4862c856e7d96cf7d..b95452b12919823d93e5c3897c890f7b7050cf9b 100644
--- a/apps/i2ptunnel/jsp/editClient.jsp
+++ b/apps/i2ptunnel/jsp/editClient.jsp
@@ -400,7 +400,7 @@
                 <label for="localDestination" accesskey="L">
                     <%=intl._("Local destination")%>(<span class="accessKey">L</span>):
                 </label>
-                <textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Read Only: Local Destination (if known)" wrap="off"><%=editBean.getDestinationBase64(curTunnel)%></textarea>               
+                <textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Read Only: Local Destination (if known)" wrap="off" spellcheck="false"><%=editBean.getDestinationBase64(curTunnel)%></textarea>               
                 <span class="comment"><%=intl._("(if known)")%></span>
             </div>
 
@@ -465,7 +465,7 @@
                 <label><%=intl._("Jump URL List")%>:</label>
             </div>
             <div id="hostField" class="rowItem">
-                <textarea rows="2" style="height: 8em;" cols="60" id="hostField" name="jumpList" title="List of helper URLs to offer when a host is not found in your addressbook" wrap="off"><%=editBean.getJumpList(curTunnel)%></textarea>               
+                <textarea rows="2" style="height: 8em;" cols="60" id="hostField" name="jumpList" title="List of helper URLs to offer when a host is not found in your addressbook" wrap="off" spellcheck="false"><%=editBean.getJumpList(curTunnel)%></textarea>               
             </div>
             <div class="subdivider">
                 <hr />
diff --git a/apps/i2ptunnel/jsp/editServer.jsp b/apps/i2ptunnel/jsp/editServer.jsp
index 4f45b86672c9f70d3d2c7ee8cd132175b713d92a..45e96f73d0000fdc7fa638124ab6a93325bd2e2d 100644
--- a/apps/i2ptunnel/jsp/editServer.jsp
+++ b/apps/i2ptunnel/jsp/editServer.jsp
@@ -186,9 +186,9 @@
                 <label for="localDestination" accesskey="L">
                     <%=intl._("Local destination")%>(<span class="accessKey">L</span>):
                 </label>
-                <textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Read Only: Local Destination (if known)" wrap="off"><%=editBean.getDestinationBase64(curTunnel)%></textarea>               
+                <textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Read Only: Local Destination (if known)" wrap="off" spellcheck="false"><%=editBean.getDestinationBase64(curTunnel)%></textarea>               
          <% if (!"".equals(editBean.getDestinationBase64(curTunnel))) { %>    
-            <a href="/susidns/addressbook.jsp?book=private&hostname=<%=editBean.getTunnelName(curTunnel)%>&destination=<%=editBean.getDestinationBase64(curTunnel)%>#add"><%=intl._("Add to local addressbook")%></a>    
+            <a href="/susidns/addressbook.jsp?book=private&amp;hostname=<%=editBean.getTunnelName(curTunnel)%>&amp;destination=<%=editBean.getDestinationBase64(curTunnel)%>#add"><%=intl._("Add to local addressbook")%></a>    
          <% } %>
             </div>
 
@@ -334,13 +334,13 @@
                 <label for="encrypt" accesskey="e">
                     <%=intl._("Encryption Key")%>:
                 </label>
-                <textarea rows="1" style="height: 3em;" cols="44" id="portField" name="encryptKey" title="Encrypt Key" wrap="off"><%=editBean.getEncryptKey(curTunnel)%></textarea>               
+                <textarea rows="1" style="height: 3em;" cols="44" id="portField" name="encryptKey" title="Encrypt Key" wrap="off" spellcheck="false"><%=editBean.getEncryptKey(curTunnel)%></textarea>               
             </div>
             <div id="portField" class="rowItem">
                 <label for="force" accesskey="c">
                     <%=intl._("Generate New Key")%>:
                 </label>
-                <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Generate" title="Generate New Key Now"><%=intl._("Generate")%></button>
+                <button accesskey="S" class="control" type="submit" name="action" value="Generate" title="Generate New Key Now"><%=intl._("Generate")%></button>
                 <span class="comment"><%=intl._("(Tunnel must be stopped first)")%></span>
             </div>
                  
@@ -365,7 +365,7 @@
                 <label for="accessList" accesskey="s">
                     <%=intl._("Access List")%>:
                 </label>
-                <textarea rows="2" style="height: 8em;" cols="60" id="hostField" name="accessList" title="Access List" wrap="off"><%=editBean.getAccessList(curTunnel)%></textarea>               
+                <textarea rows="2" style="height: 8em;" cols="60" id="hostField" name="accessList" title="Access List" wrap="off" spellcheck="false"><%=editBean.getAccessList(curTunnel)%></textarea>               
             </div>
                  
             <div class="subdivider">
@@ -374,7 +374,7 @@
 
             <div class="rowItem">
               <div id="optionsField" class="rowItem">
-                  <label><%=intl._("Inbound connection limits (0 to disable)")%><br><%=intl._("Per client")%>:</label>
+                  <label><%=intl._("Inbound connection limits (0=unlimited)")%><br /><%=intl._("Per client")%>:</label>
               </div>
               <div id="portField" class="rowItem">
                   <label><%=intl._("Per minute")%>:</label>
@@ -405,7 +405,7 @@
             </div>
             <div class="rowItem">
               <div id="optionsField" class="rowItem">
-                  <label><%=intl._("Max concurrent connections (0 to disable)")%>:</label>
+                  <label><%=intl._("Max concurrent connections (0=unlimited)")%>:</label>
               </div>
               <div id="portField" class="rowItem">
                   <input type="text" id="port" name="maxStreams" value="<%=editBean.getMaxStreams(curTunnel)%>" class="freetext" />                
@@ -453,7 +453,6 @@
               <div id="portField" class="rowItem">
                 <label><%=intl._("None")%></label>
                 <input value="0" type="radio" id="startOnLoad" name="cert" title="No Certificate"<%=(editBean.getCert(curTunnel)==0 ? " checked=\"checked\"" : "")%> class="tickbox" />                
-                <span class="comment"></span>
               </div>
               <div id="portField" class="rowItem">
                 <label><%=intl._("Hashcash (effort)")%></label>
@@ -465,13 +464,12 @@
                 <label for="force" accesskey="c">
                     <%=intl._("Hashcash Calc Time")%>:
                 </label>
-                <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Estimate" title="Estimate Calculation Time"><%=intl._("Estimate")%></button>
+                <button accesskey="S" class="control" type="submit" name="action" value="Estimate" title="Estimate Calculation Time"><%=intl._("Estimate")%></button>
             </div>
             <div id="hostField" class="rowItem">
               <div id="portField" class="rowItem">
                 <label><%=intl._("Hidden")%></label>
                 <input value="2" type="radio" id="startOnLoad" name="cert" title="Hidden Certificate"<%=(editBean.getCert(curTunnel)==2 ? " checked=\"checked\"" : "")%> class="tickbox" />                
-                <span class="comment"></span>
               </div>
               <div id="portField" class="rowItem">
                 <label for="signer" accesskey="c">
@@ -479,14 +477,13 @@
                 </label>
                 <input value="3" type="radio" id="startOnLoad" name="cert" title="Signed Certificate"<%=(editBean.getCert(curTunnel)==3 ? " checked=\"checked\"" : "")%> class="tickbox" />                
                 <input type="text" id="port" name="signer" size="50" title="Cert Signer" value="<%=editBean.getSigner(curTunnel)%>" class="freetext" />                
-                <span class="comment"></span>
               </div>
             </div>
             <div id="portField" class="rowItem">
                 <label for="force" accesskey="c">
                     <%=intl._("Modify Certificate")%>:
                 </label>
-                <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Modify" title="Force New Cert Now"><%=intl._("Modify")%></button>
+                <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>
                  
diff --git a/apps/i2ptunnel/jsp/index.jsp b/apps/i2ptunnel/jsp/index.jsp
index faf904de034f52e0ea2e26bd2e26291e9a754273..9b4149195037837fa17b2656b4cd57bbee50fed6 100644
--- a/apps/i2ptunnel/jsp/index.jsp
+++ b/apps/i2ptunnel/jsp/index.jsp
@@ -1,10 +1,13 @@
 <%
+    // NOTE: Do the header carefully so there is no whitespace before the <?xml... line
+
     // http://www.crazysquirrel.com/computing/general/form-encoding.jspx
     if (request.getCharacterEncoding() == null)
         request.setCharacterEncoding("UTF-8");
-%>
-<%@page pageEncoding="UTF-8"%>
-<%@page contentType="text/html" import="net.i2p.i2ptunnel.web.IndexBean"%><?xml version="1.0" encoding="UTF-8"?>
+
+%><%@page pageEncoding="UTF-8"
+%><%@page contentType="text/html" import="net.i2p.i2ptunnel.web.IndexBean"
+%><?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <jsp:useBean class="net.i2p.i2ptunnel.web.IndexBean" id="indexBean" scope="request" />
 <jsp:setProperty name="indexBean" property="*" />
@@ -236,9 +239,9 @@
          <%
                /* should only happen for streamr client */
                String cHost= indexBean.getClientInterface(curClient);
-               if ("".equals(cHost)) {
+               if (cHost == null || "".equals(cHost)) {
                    out.write("<font color=\"red\">");
-                   out.write(intl._("Hort not set"));
+                   out.write(intl._("Host not set"));
                    out.write("</font>");
                } else {
                    out.write(cHost);
diff --git a/apps/i2ptunnel/locale/messages_ar.po b/apps/i2ptunnel/locale/messages_ar.po
new file mode 100644
index 0000000000000000000000000000000000000000..b67ac63e29941c203aacabb4e680a95be6d0d4b4
--- /dev/null
+++ b/apps/i2ptunnel/locale/messages_ar.po
@@ -0,0 +1,783 @@
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P i2ptunnel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-03 18:29+0000\n"
+"PO-Revision-Date: 2011-03-03 17:02-0000\n"
+"Last-Translator: hamada <hamada@mail.i2p>\n"
+"Language-Team: duck <duck@mail.i2p>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474
+#, 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>."
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
+msgid ""
+"Click a link below to look for an address helper by using a \"jump\" service:"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
+msgid "internal"
+msgstr "داخلي"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
+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:218
+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:230
+msgid "Starting tunnel"
+msgstr "ابدأ النفق"
+
+#. and give them something to look at in any case
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
+msgid "Stopping tunnel"
+msgstr "توقيف النفق"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
+msgid "Configuration changes saved"
+msgstr "تم حفظ تغيرات الاعدادات"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
+msgid "Failed to save configuration"
+msgstr "فشل في حفظ الاعدادات"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
+msgid "New Tunnel"
+msgstr "نفق جديد"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
+msgid "Standard client"
+msgstr "مستخدم عادي"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
+msgid "HTTP client"
+msgstr "HTTP client"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
+msgid "IRC client"
+msgstr "IRC برنامج"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
+msgid "Standard server"
+msgstr "خادم عادي"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
+msgid "HTTP server"
+msgstr "HTTP خادم"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
+msgid "SOCKS 4/4a/5 proxy"
+msgstr "SOCKS 4/4a/5 بروكسي"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
+msgid "SOCKS IRC proxy"
+msgstr "SOCKS IRC بروكسي دردشة"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
+msgid "CONNECT/SSL/HTTPS proxy"
+msgstr "اتصال/SSL/HTTPS بروكسي"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
+msgid "IRC server"
+msgstr "IRC خادم"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
+msgid "Streamr client"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
+msgid "Streamr server"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
+msgid "HTTP bidir"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290
+msgid "Host not set"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272
+msgid "Port not set"
+msgstr "منفذ غير محدد"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Client Tunnel"
+msgstr "I2P  لوحة تحكم الأنفاق- حرر اعدادات النفق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93
+msgid "Edit proxy settings"
+msgstr "حرر اعدادات بروكسي"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101
+msgid "New proxy settings"
+msgstr "اعدادات بروكسي جديدة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:121
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:257
+msgid "Name"
+msgstr "اسم "
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:246
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279
+msgid "Type"
+msgstr "نوع"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
+msgid "Description"
+msgstr "وصف"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:126
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:136
+msgid "Target"
+msgstr "الهدف"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162
+msgid "Access Point"
+msgstr "نفطة الوصول"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213
+msgid "required"
+msgstr "مطلوب"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
+msgid "Reachable by"
+msgstr "متصل ب"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
+msgid "Outproxies"
+msgstr "بروكسي خارجي"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
+msgid "Tunnel Destination"
+msgstr "وجهة النفق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
+msgid "name or destination"
+msgstr "اسم او اتجاه"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
+msgid "b32 not recommended"
+msgstr "b32 غير منصوح باستعماله"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208
+msgid "Shared Client"
+msgstr "المستخدمين المشاركين"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
+msgid ""
+"(Share tunnels with other clients and irc/httpclients? Change requires "
+"restart of client proxy)"
+msgstr ""
+"(شارك النفق مع باقي المستخدمين و irc/httpclients؟ التغيير بحاجة الى اعادة "
+"التشغيل)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
+msgid "Auto Start"
+msgstr "بدأ تلقائي"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
+msgid "(Check the Box for 'YES')"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
+msgid "Advanced networking options"
+msgstr "اعدادات متقدمة للشبكة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
+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:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
+msgid "Tunnel Options"
+msgstr "اعدادات النفق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
+msgid "Length"
+msgstr "طول"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
+msgid "0 hop tunnel (low anonymity, low latency)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
+msgid "1 hop tunnel (medium anonymity, medium latency)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
+msgid "2 hop tunnel (high anonymity, high latency)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
+msgid "3 hop tunnel (very high anonymity, poor performance)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
+msgid "hop tunnel (very poor performance)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
+msgid "Variance"
+msgstr "فرق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
+msgid "0 hop variance (no randomisation, consistant performance)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
+msgid ""
+"+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
+msgid ""
+"+ 0-2 hop variance (high additive randomisation, subtractive performance)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
+msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
+msgid "+/- 0-2 hop variance (not recommended)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
+msgid "hop variance"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
+msgid "Count"
+msgstr "عد"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
+msgid "1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
+msgid ""
+"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
+"reliability)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
+msgid ""
+"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
+msgid "tunnels"
+msgstr "أنفاق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
+msgid "Backup Count"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
+msgid "0 backup tunnels (0 redundancy, no added resource usage)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
+msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
+msgid ""
+"2 backup tunnels each direction (medium redundancy, medium resource usage)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
+msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
+msgid "backup tunnels"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
+msgid "Profile"
+msgstr "بروفايل"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
+msgid "interactive connection"
+msgstr "اتصال تفاعلي"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
+msgid "bulk connection (downloads/websites/BT)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
+msgid "Delay Connect"
+msgstr "تأخر الاتصال"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
+msgid "for request/response connections"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
+msgid "Router I2CP Address"
+msgstr " I2CP عنوان"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
+msgid "Host"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
+msgid "Port"
+msgstr "منفذ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
+msgid "Reduce tunnel quantity when idle"
+msgstr "قلل قدر الأنفاق عند الانتظار"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
+msgid "Enable"
+msgstr "فعا"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
+msgid "Reduced tunnel count"
+msgstr "خفض عدد الأنفاق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
+msgid "Idle minutes"
+msgstr "دقائق الانتظار"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
+msgid "Close tunnels when idle"
+msgstr "قفل النفق عند الانتظار"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
+msgid "New Keys on Reopen"
+msgstr "مفتاح جديد عند الفتح"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
+msgid "Disable"
+msgstr "ألغي"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
+msgid "Delay tunnel open until required"
+msgstr "عطل النفق حتى الحاجة اليه"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
+msgid "Persistent private key"
+msgstr "مفتاح خاص"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
+msgid "File"
+msgstr "ملف"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
+msgid "Local destination"
+msgstr "وجهة محلية"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
+msgid "(if known)"
+msgstr "(اذا كان معروف)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
+msgid "Local Authorization"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
+msgid "Username"
+msgstr "اسم مستخدم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
+msgid "Password"
+msgstr "كلمة السر"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
+msgid "Outproxy Authorization"
+msgstr "اعدادات البروكسي الخارجي"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
+msgid "Jump URL List"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
+msgid "Custom options"
+msgstr "خيارات خاصة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
+msgid ""
+"NOTE: If tunnel is currently running, most changes will not take effect "
+"until tunnel is stopped and restarted."
+msgstr "ملحوظة: اذا كان النفق مفعل، غالبية التغييرات تحتاج اعادة تشغيل النفق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
+msgid "Cancel"
+msgstr "الغاء"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
+msgid "Delete"
+msgstr "خذف"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
+msgid "Save"
+msgstr "حفظ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Server Tunnel"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93
+msgid "Edit server settings"
+msgstr "حرر اعدادات الخادم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101
+msgid "New server settings"
+msgstr "اعدادت خادم جديد"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
+msgid "Website name"
+msgstr "اسم موقع جديد"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
+msgid "(leave blank for outproxies)"
+msgstr "(دعه فارغا من أجل البروكسي الخارجي)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208
+msgid "Private key file"
+msgstr "ملف مفتاح الخاص"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
+msgid "Add to local addressbook"
+msgstr "أضف الى دفتر العناوين"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237
+msgid "Hostname Signature"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
+msgid "Encrypt Leaseset"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423
+msgid "Encryption Key"
+msgstr "مفتاح التشفير"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
+msgid "Generate New Key"
+msgstr "أنشئ مفتاح جديد"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
+msgid "Generate"
+msgstr "أنشئ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523
+msgid "(Tunnel must be stopped first)"
+msgstr "(يجب ايقاف النفق)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
+msgid "Restricted Access List"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
+msgid "Whitelist"
+msgstr "قائمة بيضاء"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
+msgid "Blacklist"
+msgstr "قائمة سوداء"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447
+msgid "Access List"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
+msgid "Inbound connection limits (0=unlimited)"
+msgstr "حد الاتصال الداخلي (0=unlimited)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453
+msgid "Per client"
+msgstr "لكل مستخدم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455
+msgid "Per minute"
+msgstr "لكل دقيقة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
+msgid "Per hour"
+msgstr "لكل ساعة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463
+msgid "Per day"
+msgstr "لكل يوم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467
+msgid "Total"
+msgstr "المجموع"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
+msgid "Max concurrent connections (0=unlimited)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493
+msgid "New Certificate type"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
+msgid "None"
+msgstr "لاشئ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499
+msgid "Hashcash (effort)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505
+msgid "Hashcash Calc Time"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507
+msgid "Estimate"
+msgstr "تقدير"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509
+msgid "Hidden"
+msgstr "مخبئ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513
+msgid "Signed (signed by)"
+msgstr "امضاء من"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519
+msgid "Modify Certificate"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521
+msgid "Modify"
+msgstr "غير"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:71
+msgid "I2P Tunnel Manager - List"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83
+msgid "Status Messages"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:87
+msgid "Refresh"
+msgstr "أنعش"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:91
+msgid "Stop All"
+msgstr "أوقف الجمبع"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:95
+msgid "Start All"
+msgstr "ابدأ الجميع"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:99
+msgid "Restart All"
+msgstr "أعد تشغيل الجمبع"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:103
+msgid "Reload Config"
+msgstr "أعد تحميل الاعدادات"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:105
+msgid "I2P Server Tunnels"
+msgstr "نفق الخادم I2P "
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:109
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:130
+msgid "Points at"
+msgstr "متجه الى"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:157
+msgid "Preview"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:297
+msgid "Status"
+msgstr "الحالة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163
+msgid "Base32 Address"
+msgstr "Base32 عنوان"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:171
+msgid "No Preview"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304
+msgid "Starting..."
+msgstr "يبدأ..."
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:191
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339
+msgid "Stop"
+msgstr "أوقف"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:332
+msgid "Running"
+msgstr "يشتغل"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346
+msgid "Stopped"
+msgstr "متوقف"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:353
+msgid "Start"
+msgstr "أبدأ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234
+msgid "New server tunnel"
+msgstr "نفق جديد للخادم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396
+msgid "Standard"
+msgstr "عادي"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:398
+msgid "Create"
+msgstr "أنشئ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:240
+msgid "I2P Client Tunnels"
+msgstr "نفق المستخدمين"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283
+msgid "Interface"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318
+msgid "Standby"
+msgstr "انتظر"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363
+msgid "Outproxy"
+msgstr "بروكسي خارجي"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
+msgid "Destination"
+msgstr "اتجاه"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381
+msgid "none"
+msgstr "ﻻشيء"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394
+msgid "New client tunnel"
+msgstr "نفق مستخدم جديد"
diff --git a/apps/i2ptunnel/locale/messages_de.po b/apps/i2ptunnel/locale/messages_de.po
index d253333ae300db13c12e62b2fbf060977befae68..d9f49c3adfca91c4b4bb9cfd91a4d782a90a52ea 100644
--- a/apps/i2ptunnel/locale/messages_de.po
+++ b/apps/i2ptunnel/locale/messages_de.po
@@ -8,94 +8,118 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P i2ptunnel\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-04 17:23+0000\n"
-"PO-Revision-Date: 2010-12-19 04:36+0100\n"
-"Last-Translator: mixxy <m1xxy@mail.i2p>\n"
+"POT-Creation-Date: 2011-02-27 16:03+0000\n"
+"PO-Revision-Date: 2011-02-27 17:38+0100\n"
+"Last-Translator: \n"
 "Language-Team: foo <foo@bar>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Poedit-Language: German\n"
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:475
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474
 #, 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>."
 msgstr "Um das Ziel in Ihrer Host-Datenbank zu besuchen, klicken Sie <a href=\"{0}\">hier</a>, und um das Ziel aus der kollidierenden Adresshelfer-Anfrage zu besuchen, <a href=\"{1}\">hier</a>!"
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:932
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
 msgid "Click a link below to look for an address helper by using a \"jump\" service:"
 msgstr "Durch Klicken auf einen der untenstehenden Links bekommen Sie einen Adresshelfer von einem \"Sprung\"-Service:"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:170
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
+msgid "internal"
+msgstr "intern"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
 msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."
 msgstr "Ungültige Formulareingabe - wahrscheinlich haben Sie den \"Zurück\"-Knopf Ihres Browsers betätigt. Bitte neuladen!"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:217
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218
 msgid "Configuration reloaded for all tunnels"
 msgstr "Einstellungen für alle Tunnel neugeladen"
 
 #. and give them something to look at in any case
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:229
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230
 msgid "Starting tunnel"
 msgstr "Starte Tunnel ..."
 
 #. and give them something to look at in any case
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:242
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
 msgid "Stopping tunnel"
 msgstr "Beende Tunnel ..."
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:389
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
+msgid "Configuration changes saved"
+msgstr "Änderungen der Einstellungen gespeichert"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
+msgid "Failed to save configuration"
+msgstr "Einstellungen nicht gespeichert"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
 msgid "New Tunnel"
 msgstr "Neuer Tunnel"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:409
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
 msgid "Standard client"
 msgstr "Standardklient"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:410
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
 msgid "HTTP client"
 msgstr "HTTP-Klient"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:411
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
 msgid "IRC client"
 msgstr "IRC-Klient"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:412
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
 msgid "Standard server"
 msgstr "Standardserver"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:413
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
 msgid "HTTP server"
 msgstr "HTTP-Server"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:414
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
 msgid "SOCKS 4/4a/5 proxy"
 msgstr "SOCKS-4/4a/5-Proxy"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:415
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
 msgid "SOCKS IRC proxy"
 msgstr "SOCKS-IRC-Proxy"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:416
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
 msgid "CONNECT/SSL/HTTPS proxy"
 msgstr "CONNECT/SSL/HTTPS-Proxy"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:417
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
 msgid "IRC server"
 msgstr "IRC-Server"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
 msgid "Streamr client"
 msgstr "Streamr-Klient"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
 msgid "Streamr server"
 msgstr "Streamr-Server"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
 msgid "HTTP bidir"
 msgstr "HTTP Bidir"
 
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290
+msgid "Host not set"
+msgstr "Host nicht gesetzt"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272
+msgid "Port not set"
+msgstr "Port nicht gesetzt"
+
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
 msgid "I2P Tunnel Manager - Edit Client Tunnel"
 msgstr "I2P-Tunnel-Manager - Kliententunnel bearbeiten"
@@ -120,14 +144,14 @@ msgstr "Name"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:246
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:270
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279
 msgid "Type"
 msgstr "Typ"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
 msgid "Description"
 msgstr "Beschreibung"
 
@@ -138,357 +162,340 @@ msgstr "Ziel"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162
 msgid "Access Point"
 msgstr "Zugriffspunkt"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:179
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:207
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:157
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:172
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213
 msgid "required"
 msgstr "benötigt"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:183
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
 msgid "Reachable by"
 msgstr "Erreichbar von"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:162
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:195
-msgid "Locally (127.0.0.1)"
-msgstr "Lokal (127.0.0.1)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:166
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
-msgid "Everyone (0.0.0.0)"
-msgstr "Ãœberall (0.0.0.0)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:170
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
-msgid "LAN Hosts (Please specify your LAN address)"
-msgstr "LAN-Hosts (Bitte geben Sie ihre LAN-Adressen an!)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:186
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205
-msgid "Other"
-msgstr "Anderen"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:195
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
 msgid "Outproxies"
 msgstr "Ausgehende Proxies"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
 msgid "Tunnel Destination"
 msgstr "Ziel des Tunnels"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:214
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
 msgid "name or destination"
 msgstr "Name oder Ziel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
 msgid "b32 not recommended"
 msgstr "B32-Adressen nicht empfohlen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208
 msgid "Shared Client"
 msgstr "versch. Klienten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
 msgid "(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)"
 msgstr "(Soll dieser Tunnel mit anderen Klienten und IRC/HTTP-Klienten geteilt werden? Änderungen benötigen Neustart des Klientenproxys)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
 msgid "Auto Start"
 msgstr "Automatischer Start"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
 msgid "(Check the Box for 'YES')"
 msgstr "(Aktiviere das Kästchen für 'ja')"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:237
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
 msgid "Advanced networking options"
 msgstr "Erweiterte Netzwerkoptionen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
 msgid "(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)"
 msgstr "(HINWEIS: Ist dieser Proxy konfiguriert, Tunnel mit anderen Klienten zu teilen, so gelten diese Optionen für alle Klienten des Proxys!)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:241
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:260
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
 msgid "Tunnel Options"
 msgstr "Tunneloptionen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
 msgid "Length"
 msgstr "Länge"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:250
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:269
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
 msgid "0 hop tunnel (low anonymity, low latency)"
 msgstr "0-Hop-Tunnel (geringe Anonymität, geringe Latenz)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:254
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:273
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
 msgid "1 hop tunnel (medium anonymity, medium latency)"
 msgstr "1-Hop-Tunnel (mittlere Anonymität, mittlere Latenz)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:258
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:277
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
 msgid "2 hop tunnel (high anonymity, high latency)"
 msgstr "2-Hop-Tunnel (hohe Anonymität, hohe Latenz)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:262
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
 msgid "3 hop tunnel (very high anonymity, poor performance)"
 msgstr "3-Hop-Tunnel (sehr hohe Anonymität, geringe Leistung)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:290
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
 msgid "hop tunnel (very poor performance)"
 msgstr "Hop-Tunnel (sehr geringe Leistung)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
 msgid "Variance"
 msgstr "Varianz"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:283
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
 msgid "0 hop variance (no randomisation, consistant performance)"
 msgstr "0-Hop-Varianz (keine zufällige Längenveränderung, konsistente Leistung)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:287
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
 msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
 msgstr "+ 0-1 Hop Varianz (mittlere zufällige Verlängerung, verringert die Leistung)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:291
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
 msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
 msgstr "+ 0-2 Hops Varianz (hohe zufällige Verlängerung, verringerte Leistung)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:295
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:314
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
 msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
 msgstr "+/- 0-1 Hop Varianz (geringe zufällige Längenänderung, Standardleistung)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:299
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
 msgid "+/- 0-2 hop variance (not recommended)"
 msgstr "+/- 0-2 Hops Varianz (nicht empfohlen)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
 msgid "hop variance"
 msgstr "Hops Varianz"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
 msgid "Count"
 msgstr "Anzahl"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:323
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
 msgid "1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)"
 msgstr "1 eingehender, 1 ausgehender Tunnel (geringe Bandbreitennutzung, weniger zuverlässig)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:327
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
 msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)"
 msgstr "2 eingehende, 2 ausgehende Tunnel (Standardbandbreitennutzung, zuverlässig)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:331
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
 msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
 msgstr "3 eingehende, 3 ausgehende Tunnel (hohe Bandbreitennutzung, zuverlässiger)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
 msgid "tunnels"
 msgstr "Tunnel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
 msgid "Backup Count"
 msgstr "Anzahl an Ersatztunneln"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:352
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:371
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
 msgid "0 backup tunnels (0 redundancy, no added resource usage)"
 msgstr "0 Ersatztunnel (0 Redundanz, keine zusätzliche Ressourcennutzung)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:356
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
 msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
 msgstr "1 Ersatztunnel in jede Richtung (geringe Redundanz, geringe Ressourcennutzung)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:360
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:379
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
 msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)"
 msgstr "2 Ersatztunnel in jede Richtung (mittlere Redundanz, mittlere Ressourcennutzung)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:364
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:383
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
 msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
 msgstr "3 Ersatztunnel in jede Richtung (hohe Redundanz, hohe Ressourcennutzung)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:373
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:392
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
 msgid "backup tunnels"
 msgstr "Ersatztunnel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:380
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
 msgid "Profile"
 msgstr "Profil"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:387
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
 msgid "interactive connection"
 msgstr "Interaktive Verbindung"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:391
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:410
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
 msgid "bulk connection (downloads/websites/BT)"
 msgstr "Mengenverbindung (Download/Webseiten/BitTorrent)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:393
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
 msgid "Delay Connect"
 msgstr "Verbindung verzögern"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:397
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
 msgid "for request/response connections"
 msgstr "für Verbindungen mit Anfragen/Antworten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:401
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414
-msgid "I2CP Options"
-msgstr "I2CP-Optionen"
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
+msgid "Router I2CP Address"
+msgstr "I2CP-Adresse des Routers"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:403
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:146
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
 msgid "Host"
 msgstr "Host"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:407
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:152
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:420
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
 msgid "Port"
 msgstr "Port"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:413
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
 msgid "Reduce tunnel quantity when idle"
 msgstr "Anzahl an Tunneln im Leerlauf reduzieren"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:415
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:429
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:437
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:449
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:459
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:479
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:493
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:426
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:442
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:454
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
 msgid "Enable"
 msgstr "aktiviert"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:419
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:458
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
 msgid "Reduced tunnel count"
 msgstr "Reduzierte Tunnelanzahl"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:423
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:443
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:462
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
 msgid "Idle minutes"
 msgstr "Minuten Inaktivität"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:427
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
 msgid "Close tunnels when idle"
 msgstr "nicht genutzte Tunnel schließen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:433
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
 msgid "New Keys on Reopen"
 msgstr "Neue Schlüssel beim Wiederöffnen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:441
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
 msgid "Disable"
 msgstr "deaktiviert"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:447
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
 msgid "Delay tunnel open until required"
 msgstr "Aufbau des Tunnela verzögern, bis dieser benötigt wird"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:457
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
 msgid "Persistent private key"
 msgstr "Dauerhafter privater Schlüssel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:463
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
 msgid "File"
 msgstr "Datei"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:467
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
 msgid "Local destination"
 msgstr "lokales Ziel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:471
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
 msgid "(if known)"
 msgstr "(falls bekannt)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:477
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
 msgid "Local Authorization"
 msgstr "lokale Autorisation"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:483
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:497
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
 msgid "Username"
 msgstr "Benutzername"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:487
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:501
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
 msgid "Password"
 msgstr "Passwort"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:491
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
 msgid "Outproxy Authorization"
 msgstr "Outproxy Autorisation"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:507
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:498
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
+msgid "Jump URL List"
+msgstr "List der Sprung-URLs"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
 msgid "Custom options"
 msgstr "Eigene Optionen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:511
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:502
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
 msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted."
 msgstr "HINWEIS: Falls der Tunnel gerade aktiv ist, werden die meisten Änderungen erst nach einem Neustart des Tunnels wirksam."
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:513
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:504
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
 msgid "Cancel"
 msgstr "Abbrechen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:517
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:508
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
 msgid "Delete"
 msgstr "Löschen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:519
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:510
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
 msgid "Save"
 msgstr "Speichern"
 
@@ -504,92 +511,124 @@ msgstr "Servereinstellungen ändern"
 msgid "New server settings"
 msgstr "Neue Servereinstellungen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:214
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
 msgid "Website name"
 msgstr "Name der Webseite"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:218
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
 msgid "(leave blank for outproxies)"
 msgstr "(für ausgehende Proxies leer lassen)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208
 msgid "Private key file"
 msgstr "private Schlüsseldatei"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
 msgid "Add to local addressbook"
 msgstr "zum lokalen Adressbuch hinzufügen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:252
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237
 msgid "Hostname Signature"
 msgstr "Signatur des Namens"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:424
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
 msgid "Encrypt Leaseset"
 msgstr "Leaseset verschlüsseln"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423
 msgid "Encryption Key"
 msgstr "Schlüssel zum verschlüsseln"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
 msgid "Generate New Key"
 msgstr "Erzeuge neuen Schlüssel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
 msgid "Generate"
 msgstr "Erzeugen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:438
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:496
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523
 msgid "(Tunnel must be stopped first)"
 msgstr "(Tunnel muss zuerst beendet sein)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:440
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
 msgid "Restricted Access List"
 msgstr "Zugang beschränken"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:446
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
+msgid "Whitelist"
+msgstr "Zugangsliste"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
+msgid "Blacklist"
+msgstr "Sperrliste"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447
 msgid "Access List"
 msgstr "Zugangsliste"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:450
-msgid "(Restrict to these clients only)"
-msgstr "(Zugang wird auf diese Klienten beschränkt)"
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
+msgid "Inbound connection limits (0=unlimited)"
+msgstr "Begrenzung eingehender Verbindungen (0=unbegrenzt)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:466
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453
+msgid "Per client"
+msgstr "pro Klient"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455
+msgid "Per minute"
+msgstr "pro Minute"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
+msgid "Per hour"
+msgstr "pro Stunde"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463
+msgid "Per day"
+msgstr "pro Tag"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467
+msgid "Total"
+msgstr "Gesamt"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
+msgid "Max concurrent connections (0=unlimited)"
+msgstr "max. Anzahl gleichzeitiger Verbindungen (0=unbegrenzt)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493
 msgid "New Certificate type"
 msgstr "Neuer Zertifizierungstyp"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:468
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
 msgid "None"
 msgstr "Keiner"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499
 msgid "Hashcash (effort)"
 msgstr "Hashcash (Durchsatz)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:478
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505
 msgid "Hashcash Calc Time"
 msgstr "Hashcash Berechnungszeit"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507
 msgid "Estimate"
 msgstr "Abschätzung"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:482
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509
 msgid "Hidden"
 msgstr "Versteckt"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:486
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513
 msgid "Signed (signed by)"
 msgstr "Signiert (unterschrieben von)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:492
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519
 msgid "Modify Certificate"
 msgstr "Zertifikat modifizieren"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:494
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521
 msgid "Modify"
 msgstr "Modifizieren"
 
@@ -639,7 +678,7 @@ msgstr "Vorschau"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:250
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:278
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:297
 msgid "Status"
 msgstr "Status"
 
@@ -652,30 +691,30 @@ msgid "No Preview"
 msgstr "Keine Vorschau"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304
 msgid "Starting..."
 msgstr "Starte ..."
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:191
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:306
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339
 msgid "Stop"
 msgstr "Stopp"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:332
 msgid "Running"
 msgstr "Aktiv"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346
 msgid "Stopped"
 msgstr "Gestoppt"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:353
 msgid "Start"
 msgstr "Start"
 
@@ -684,12 +723,12 @@ msgid "New server tunnel"
 msgstr "Neuer Servertunnel"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:377
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396
 msgid "Standard"
 msgstr "Standard"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:379
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:398
 msgid "Create"
 msgstr "Erstellen"
 
@@ -698,27 +737,40 @@ msgid "I2P Client Tunnels"
 msgstr "I2P-Klienten-Tunnel"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:274
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283
 msgid "Interface"
 msgstr "Interface"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318
 msgid "Standby"
 msgstr "Wartestellung"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363
 msgid "Outproxy"
 msgstr "Ausgehender Proxy"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
 msgid "Destination"
 msgstr "Ziel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:362
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381
 msgid "none"
 msgstr "Keiner"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394
 msgid "New client tunnel"
 msgstr "Neuer Kliententunnel"
 
+#~ msgid "Locally (127.0.0.1)"
+#~ msgstr "Lokal (127.0.0.1)"
+#~ msgid "Everyone (0.0.0.0)"
+#~ msgstr "Ãœberall (0.0.0.0)"
+#~ msgid "LAN Hosts (Please specify your LAN address)"
+#~ msgstr "LAN-Hosts (Bitte geben Sie ihre LAN-Adressen an!)"
+#~ msgid "Other"
+#~ msgstr "Anderen"
+#~ msgid "I2CP Options"
+#~ msgstr "I2CP-Optionen"
+#~ msgid "(Restrict to these clients only)"
+#~ msgstr "(Zugang wird auf diese Klienten beschränkt)"
+
diff --git a/apps/i2ptunnel/locale/messages_en.po b/apps/i2ptunnel/locale/messages_en.po
new file mode 100644
index 0000000000000000000000000000000000000000..8cfb64f1017b01c9d35ac4adc2c6bf02e0522671
--- /dev/null
+++ b/apps/i2ptunnel/locale/messages_en.po
@@ -0,0 +1,780 @@
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P i2ptunnel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-03 18:29+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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474
+#, 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>."
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
+msgid ""
+"Click a link below to look for an address helper by using a \"jump\" service:"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
+msgid "internal"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
+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:218
+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:230
+msgid "Starting tunnel"
+msgstr ""
+
+#. and give them something to look at in any case
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
+msgid "Stopping tunnel"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
+msgid "Configuration changes saved"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
+msgid "Failed to save configuration"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
+msgid "New Tunnel"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
+msgid "Standard client"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
+msgid "HTTP client"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
+msgid "IRC client"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
+msgid "Standard server"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
+msgid "HTTP server"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
+msgid "SOCKS 4/4a/5 proxy"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
+msgid "SOCKS IRC proxy"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
+msgid "CONNECT/SSL/HTTPS proxy"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
+msgid "IRC server"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
+msgid "Streamr client"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
+msgid "Streamr server"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
+msgid "HTTP bidir"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290
+msgid "Host not set"
+msgstr ""
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272
+msgid "Port not set"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Client Tunnel"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93
+msgid "Edit proxy settings"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101
+msgid "New proxy settings"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:121
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:257
+msgid "Name"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:246
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279
+msgid "Type"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
+msgid "Description"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:126
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:136
+msgid "Target"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162
+msgid "Access Point"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213
+msgid "required"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
+msgid "Reachable by"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
+msgid "Outproxies"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
+msgid "Tunnel Destination"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
+msgid "name or destination"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
+msgid "b32 not recommended"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208
+msgid "Shared Client"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
+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:216
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
+msgid "Auto Start"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
+msgid "(Check the Box for 'YES')"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
+msgid "Advanced networking options"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
+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:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
+msgid "Tunnel Options"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
+msgid "Length"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
+msgid "0 hop tunnel (low anonymity, low latency)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
+msgid "1 hop tunnel (medium anonymity, medium latency)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
+msgid "2 hop tunnel (high anonymity, high latency)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
+msgid "3 hop tunnel (very high anonymity, poor performance)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
+msgid "hop tunnel (very poor performance)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
+msgid "Variance"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
+msgid "0 hop variance (no randomisation, consistant performance)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
+msgid ""
+"+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
+msgid ""
+"+ 0-2 hop variance (high additive randomisation, subtractive performance)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
+msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
+msgid "+/- 0-2 hop variance (not recommended)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
+msgid "hop variance"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
+msgid "Count"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
+msgid "1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
+msgid ""
+"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
+"reliability)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
+msgid ""
+"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
+msgid "tunnels"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
+msgid "Backup Count"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
+msgid "0 backup tunnels (0 redundancy, no added resource usage)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
+msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
+msgid ""
+"2 backup tunnels each direction (medium redundancy, medium resource usage)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
+msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
+msgid "backup tunnels"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
+msgid "Profile"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
+msgid "interactive connection"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
+msgid "bulk connection (downloads/websites/BT)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
+msgid "Delay Connect"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
+msgid "for request/response connections"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
+msgid "Router I2CP Address"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
+msgid "Host"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
+msgid "Port"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
+msgid "Reduce tunnel quantity when idle"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
+msgid "Enable"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
+msgid "Reduced tunnel count"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
+msgid "Idle minutes"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
+msgid "Close tunnels when idle"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
+msgid "New Keys on Reopen"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
+msgid "Disable"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
+msgid "Delay tunnel open until required"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
+msgid "Persistent private key"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
+msgid "File"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
+msgid "Local destination"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
+msgid "(if known)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
+msgid "Local Authorization"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
+msgid "Username"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
+msgid "Password"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
+msgid "Outproxy Authorization"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
+msgid "Jump URL List"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
+msgid "Custom options"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
+msgid ""
+"NOTE: If tunnel is currently running, most changes will not take effect "
+"until tunnel is stopped and restarted."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
+msgid "Cancel"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
+msgid "Delete"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
+msgid "Save"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Server Tunnel"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93
+msgid "Edit server settings"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101
+msgid "New server settings"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
+msgid "Website name"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
+msgid "(leave blank for outproxies)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208
+msgid "Private key file"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
+msgid "Add to local addressbook"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237
+msgid "Hostname Signature"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
+msgid "Encrypt Leaseset"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423
+msgid "Encryption Key"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
+msgid "Generate New Key"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
+msgid "Generate"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523
+msgid "(Tunnel must be stopped first)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
+msgid "Restricted Access List"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
+msgid "Whitelist"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
+msgid "Blacklist"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447
+msgid "Access List"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
+msgid "Inbound connection limits (0=unlimited)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453
+msgid "Per client"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455
+msgid "Per minute"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
+msgid "Per hour"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463
+msgid "Per day"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467
+msgid "Total"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
+msgid "Max concurrent connections (0=unlimited)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493
+msgid "New Certificate type"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
+msgid "None"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499
+msgid "Hashcash (effort)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505
+msgid "Hashcash Calc Time"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507
+msgid "Estimate"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509
+msgid "Hidden"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513
+msgid "Signed (signed by)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519
+msgid "Modify Certificate"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521
+msgid "Modify"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:71
+msgid "I2P Tunnel Manager - List"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83
+msgid "Status Messages"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:87
+msgid "Refresh"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:91
+msgid "Stop All"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:95
+msgid "Start All"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:99
+msgid "Restart All"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:103
+msgid "Reload Config"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:105
+msgid "I2P Server Tunnels"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:109
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:130
+msgid "Points at"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:157
+msgid "Preview"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:297
+msgid "Status"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163
+msgid "Base32 Address"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:171
+msgid "No Preview"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304
+msgid "Starting..."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:191
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339
+msgid "Stop"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:332
+msgid "Running"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346
+msgid "Stopped"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:353
+msgid "Start"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234
+msgid "New server tunnel"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396
+msgid "Standard"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:398
+msgid "Create"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:240
+msgid "I2P Client Tunnels"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283
+msgid "Interface"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318
+msgid "Standby"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363
+msgid "Outproxy"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
+msgid "Destination"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381
+msgid "none"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394
+msgid "New client tunnel"
+msgstr ""
diff --git a/apps/i2ptunnel/locale/messages_es.po b/apps/i2ptunnel/locale/messages_es.po
new file mode 100644
index 0000000000000000000000000000000000000000..ce7098182d79602c8f95b7ecc3d3538a5215f615
--- /dev/null
+++ b/apps/i2ptunnel/locale/messages_es.po
@@ -0,0 +1,763 @@
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P\n"
+"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
+"POT-Creation-Date: 2011-03-03 18:29+0000\n"
+"PO-Revision-Date: 2011-04-18 21:39+0100\n"
+"Last-Translator: mixxy <m1xxy@mail.i2p>\n"
+"Language-Team: Spanish (Castilian) <None>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474
+#, 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>."
+msgstr "Para visitar el destino en la base de datos de hosts, haga clic <a href=\"{0}\">aquí</a> . Para visitar el destino del ayudante de direcciones en conflicto, haga clic <a href=\"{1}\">aquí</a> ."
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
+msgid "Click a link below to look for an address helper by using a \"jump\" service:"
+msgstr "Haga clic en un enlace de debajo para buscar un ayudante de direcciones mediante el uso de un servicio de \"salto\":"
+
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
+msgid "internal"
+msgstr "interno"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
+msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."
+msgstr "El formulario presentado es inválido, probablemente porque ha utilizado el botón 'atrás' o 'recargar' de su navegador. Por favor, vuelva a enviarlo."
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218
+msgid "Configuration reloaded for all tunnels"
+msgstr "Configuración recargada para todos los túneles"
+
+#. and give them something to look at in any case
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230
+msgid "Starting tunnel"
+msgstr "Inicializando el túnel"
+
+#. and give them something to look at in any case
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
+msgid "Stopping tunnel"
+msgstr "Deteniendo el túnel"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
+msgid "Configuration changes saved"
+msgstr "Cambios en la configuración guardados"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
+msgid "Failed to save configuration"
+msgstr "No se pudo guardar la configuración"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
+msgid "New Tunnel"
+msgstr "Nuevo túnel"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
+msgid "Standard client"
+msgstr "Cliente estándar"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
+msgid "HTTP client"
+msgstr "Cliente HTTP"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
+msgid "IRC client"
+msgstr "Cliente IRC"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
+msgid "Standard server"
+msgstr "Servidor estándar"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
+msgid "HTTP server"
+msgstr "Servidor HTTP"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
+msgid "SOCKS 4/4a/5 proxy"
+msgstr "Proxy SOCKS 4/4a/5"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
+msgid "SOCKS IRC proxy"
+msgstr "Proxy IRC SOCKS"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
+msgid "CONNECT/SSL/HTTPS proxy"
+msgstr "Proxy CONNECT/SSL/HTTPS"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
+msgid "IRC server"
+msgstr "Servidor de IRC"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
+msgid "Streamr client"
+msgstr "Cliente Streamr"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
+msgid "Streamr server"
+msgstr "Servidor Streamr"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
+msgid "HTTP bidir"
+msgstr "HTTP bidir"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290
+msgid "Host not set"
+msgstr "Host no establecido"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272
+msgid "Port not set"
+msgstr "Puerto no establecido"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Client Tunnel"
+msgstr "Gestor del túneles I2P - Editar túnel de cliente"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93
+msgid "Edit proxy settings"
+msgstr "Editar configuración de proxy"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101
+msgid "New proxy settings"
+msgstr "Nueva configuración de proxy"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:121
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:257
+msgid "Name"
+msgstr "Nombre"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:246
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279
+msgid "Type"
+msgstr "Tipo"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
+msgid "Description"
+msgstr "Descripción"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:126
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:136
+msgid "Target"
+msgstr "Objetivo"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162
+msgid "Access Point"
+msgstr "Punto de Acceso"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213
+msgid "required"
+msgstr "requerido"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
+msgid "Reachable by"
+msgstr "Accesible por"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
+msgid "Outproxies"
+msgstr "Outproxis"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
+msgid "Tunnel Destination"
+msgstr "Túnel del Destino"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
+msgid "name or destination"
+msgstr "nombre o destino"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
+msgid "b32 not recommended"
+msgstr "b32 no recomendado"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208
+msgid "Shared Client"
+msgstr "Túnel Compartido"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
+msgid "(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)"
+msgstr "(¿Compartir túneles con otros clientes y clientes de IRC/http? Cambiar esto requiere reiniciar el proxy de cliente)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
+msgid "Auto Start"
+msgstr "Autoarranque"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
+msgid "(Check the Box for 'YES')"
+msgstr "(Marque la casilla para \"SI\")"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
+msgid "Advanced networking options"
+msgstr "Opciones avanzadas de red"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
+msgid "(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)"
+msgstr "(NOTA: cuando este proxy de cliente está configurado para compartir túneles, entonces estas opciones son para todos los clientes de proxy compartidos!)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
+msgid "Tunnel Options"
+msgstr "Opciones de Túnel"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
+msgid "Length"
+msgstr "Longitud"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
+msgid "0 hop tunnel (low anonymity, low latency)"
+msgstr "Túnel de 0 saltos (anonimato bajo, latencia baja)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
+msgid "1 hop tunnel (medium anonymity, medium latency)"
+msgstr "Túnel de 1 salto (anonimato medio, latencia media)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
+msgid "2 hop tunnel (high anonymity, high latency)"
+msgstr "Túnel de 2 saltos (anonimato alto, latencia alta)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
+msgid "3 hop tunnel (very high anonymity, poor performance)"
+msgstr "Túnel de 3 saltos (anonimato muy alto, rendimiento pobre)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
+msgid "hop tunnel (very poor performance)"
+msgstr "saltos de túnel (rendimiento muy pobre)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
+msgid "Variance"
+msgstr "Variación"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
+msgid "0 hop variance (no randomisation, consistant performance)"
+msgstr "Variación de 0 saltos (sin aleatoriedad, rendimiento constante)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
+msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
+msgstr "Variación de + 0-1 saltos (aleatoriedad media aditiva, rendimiento substractivo)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
+msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
+msgstr "Variación de + 0-2 saltos (aleatoriedad alta aditiva, rendimiento substractivo)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
+msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
+msgstr "Variación de +/- 0-1 saltos (aleatoriedad estándar, rendimiento estándar)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
+msgid "+/- 0-2 hop variance (not recommended)"
+msgstr "Variación de +/- 0-2 saltos (no recomendado)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
+msgid "hop variance"
+msgstr "Variación de saltos"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
+msgid "Count"
+msgstr "Número"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
+msgid "1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)"
+msgstr "1 entrante, 1 túnel de salida (bajo uso de ancho de banda, menos fiabilidad)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
+msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)"
+msgstr "2 entrantes, 2 túneles de salida (uso de ancho de banda estándar, fiabilidad estándar)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
+msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
+msgstr "3 entrantes, 3 túneles de salida (mayor uso de ancho de banda, mayor fiabilidad)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
+msgid "tunnels"
+msgstr "túneles"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
+msgid "Backup Count"
+msgstr "Número de respaldo"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
+msgid "0 backup tunnels (0 redundancy, no added resource usage)"
+msgstr "0 túneles de respaldo (redundancia 0, no aumenta el uso de recursos)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
+msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
+msgstr "1 túnel de respaldo en cada dirección (redundancia baja, uso bajo de recursos)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
+msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)"
+msgstr "2 túneles de respaldo en cada dirección (redundancia media, uso de recursos medio)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
+msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
+msgstr "3 túneles de respaldo en cada dirección (alta redundancia, uso de recursos alto)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
+msgid "backup tunnels"
+msgstr "túneles de respaldo"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
+msgid "Profile"
+msgstr "Perfil"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
+msgid "interactive connection"
+msgstr "conexión interactiva"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
+msgid "bulk connection (downloads/websites/BT)"
+msgstr "conexión en masa (descargas/web/BT)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
+msgid "Delay Connect"
+msgstr "Retrasar Conexión"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
+msgid "for request/response connections"
+msgstr "para las conexiones de solicitud/respuesta"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
+msgid "Router I2CP Address"
+msgstr "Dirección I2CP del router"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
+msgid "Host"
+msgstr "Host"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
+msgid "Port"
+msgstr "Puerto"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
+msgid "Reduce tunnel quantity when idle"
+msgstr "Reducir la cantidad de túneles cuando se está inactivo"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
+msgid "Enable"
+msgstr "Habilitar"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
+msgid "Reduced tunnel count"
+msgstr "Número de túneles reducido"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
+msgid "Idle minutes"
+msgstr "Minutos de inactividad"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
+msgid "Close tunnels when idle"
+msgstr "Cerrar los túneles cuando se está inactivo"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
+msgid "New Keys on Reopen"
+msgstr "Nuevas claves al reabrir"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
+msgid "Disable"
+msgstr "Desactivar"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
+msgid "Delay tunnel open until required"
+msgstr "Retrasar apertura del túnel hasta que sea necesario"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
+msgid "Persistent private key"
+msgstr "Clave privada persistente"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
+msgid "File"
+msgstr "Archivo"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
+msgid "Local destination"
+msgstr "destino local"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
+msgid "(if known)"
+msgstr "(Si se conoce)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
+msgid "Local Authorization"
+msgstr "Autorización local"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
+msgid "Username"
+msgstr "Nombre de usuario"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
+msgid "Password"
+msgstr "Contraseña"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
+msgid "Outproxy Authorization"
+msgstr "Autorización outproxy"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
+msgid "Jump URL List"
+msgstr "Lista de URL de salto"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
+msgid "Custom options"
+msgstr "Opciones personalizadas"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
+msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted."
+msgstr "NOTA: Si el túnel se está ejecutando actualmente, la mayoría de los cambios no tendrán efecto hasta que se detenga y reinicie el túnel."
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
+msgid "Delete"
+msgstr "Eliminar"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
+msgid "Save"
+msgstr "Guardar"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Server Tunnel"
+msgstr "Gestor del túneles I2P - Editar túnel servidor"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93
+msgid "Edit server settings"
+msgstr "Editar configuración del servidor"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101
+msgid "New server settings"
+msgstr "Nueva configuración del servidor"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
+msgid "Website name"
+msgstr "Nombre de la página"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
+msgid "(leave blank for outproxies)"
+msgstr "(Dejar en blanco para outproxies)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208
+msgid "Private key file"
+msgstr "archivo de clave privada"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
+msgid "Add to local addressbook"
+msgstr "Agregar a la libreta de direcciones local"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237
+msgid "Hostname Signature"
+msgstr "Firma del Hostname"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
+msgid "Encrypt Leaseset"
+msgstr "Cifrar Leaseset"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423
+msgid "Encryption Key"
+msgstr "Clave de cifrado"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
+msgid "Generate New Key"
+msgstr "Generar nueva clave"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
+msgid "Generate"
+msgstr "Generar"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523
+msgid "(Tunnel must be stopped first)"
+msgstr "(El túnel debe detenerse primero)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
+msgid "Restricted Access List"
+msgstr "Lista de acceso restringido"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
+msgid "Whitelist"
+msgstr "Lista blanca"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
+msgid "Blacklist"
+msgstr "Lista negra"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447
+msgid "Access List"
+msgstr "Lista de acceso"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
+msgid "Inbound connection limits (0=unlimited)"
+msgstr "Límites de conexiones entrantes (0 = sin límite)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453
+msgid "Per client"
+msgstr "Por cliente"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455
+msgid "Per minute"
+msgstr "por minuto"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
+msgid "Per hour"
+msgstr "Por hora"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463
+msgid "Per day"
+msgstr "Por día"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467
+msgid "Total"
+msgstr "Total"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
+msgid "Max concurrent connections (0=unlimited)"
+msgstr "Número máximo de conexiones simultáneas (0 = sin límite)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493
+msgid "New Certificate type"
+msgstr "Nuevo tipo de certificado"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
+msgid "None"
+msgstr "Ninguno"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499
+msgid "Hashcash (effort)"
+msgstr "Hashcash (esfuerzo)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505
+msgid "Hashcash Calc Time"
+msgstr "Tiempo de Calc Hashcash "
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507
+msgid "Estimate"
+msgstr "Estimación"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509
+msgid "Hidden"
+msgstr "Oculto"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513
+msgid "Signed (signed by)"
+msgstr "Firmado (firmado por)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519
+msgid "Modify Certificate"
+msgstr "Modificar Certificado"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521
+msgid "Modify"
+msgstr "Modificar"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:71
+msgid "I2P Tunnel Manager - List"
+msgstr "Gestor de túneles I2P - Lista"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83
+msgid "Status Messages"
+msgstr "Mensajes de estado"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:87
+msgid "Refresh"
+msgstr "Actualizar"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:91
+msgid "Stop All"
+msgstr "Detener todos"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:95
+msgid "Start All"
+msgstr "Iniciar todos"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:99
+msgid "Restart All"
+msgstr "Reiniciar todos"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:103
+msgid "Reload Config"
+msgstr "Actualizar configuración"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:105
+msgid "I2P Server Tunnels"
+msgstr "Túneles de servidor I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:109
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:130
+msgid "Points at"
+msgstr "Apunta a"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:157
+msgid "Preview"
+msgstr "Preview"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:297
+msgid "Status"
+msgstr "Estado"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163
+msgid "Base32 Address"
+msgstr "Dirección Base32"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:171
+msgid "No Preview"
+msgstr "Sin vista previa"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304
+msgid "Starting..."
+msgstr "Iniciando..."
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:191
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339
+msgid "Stop"
+msgstr "Detener"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:332
+msgid "Running"
+msgstr "Ejecutándose"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346
+msgid "Stopped"
+msgstr "Detenido"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:353
+msgid "Start"
+msgstr "Iniciar"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234
+msgid "New server tunnel"
+msgstr "Nuevo servidor de túnel"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396
+msgid "Standard"
+msgstr "Estándar"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:398
+msgid "Create"
+msgstr "Crear"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:240
+msgid "I2P Client Tunnels"
+msgstr "Túneles de cliente I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283
+msgid "Interface"
+msgstr "Interfaz"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318
+msgid "Standby"
+msgstr "En espera"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363
+msgid "Outproxy"
+msgstr "Outproxy"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
+msgid "Destination"
+msgstr "Destino"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381
+msgid "none"
+msgstr "ninguno"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394
+msgid "New client tunnel"
+msgstr "Nuevo túnel de cliente"
+
diff --git a/apps/i2ptunnel/locale/messages_fr.po b/apps/i2ptunnel/locale/messages_fr.po
new file mode 100644
index 0000000000000000000000000000000000000000..d35ca8152686b4fe584f917ee8eef0f6c183362f
--- /dev/null
+++ b/apps/i2ptunnel/locale/messages_fr.po
@@ -0,0 +1,763 @@
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P i2ptunnel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-25 15:21+0000\n"
+"PO-Revision-Date: 2011-04-09 02:46+0100\n"
+"Last-Translator: magma <magma@mail.i2p>\n"
+"Language-Team: duck <duck@mail.i2p>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n >= 2)\n"
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474
+#, 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>."
+msgstr "Pour aller à la destination de votre base de données d''hôtes, cliquez <a href=\"{0}\">here</a>. Pour aller à la destination de l''aide d''adresse en conflit, cliquez <a href=\"{1}\">ici</a>."
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
+msgid "Click a link below to look for an address helper by using a \"jump\" service:"
+msgstr "Cliquez sur un des liens ci-dessous pour chercher une aide d'adresse en utilisant un \"service de saut\":"
+
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
+msgid "internal"
+msgstr "interne"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
+msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."
+msgstr "Échec de soumission du formulaire: vous avez peut-être utilisé le bouton \"Page précédente\" ou \"Recharger\" de votre navigateur. Merci de soumettre à nouveau."
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218
+msgid "Configuration reloaded for all tunnels"
+msgstr "Configuration rechargée pour tous les tunnels"
+
+#. and give them something to look at in any case
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230
+msgid "Starting tunnel"
+msgstr "Démarrage du tunnel"
+
+#. and give them something to look at in any case
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
+msgid "Stopping tunnel"
+msgstr "Arrêt du tunnel"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
+msgid "Configuration changes saved"
+msgstr "Modification de configuration enregistrée"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
+msgid "Failed to save configuration"
+msgstr "Échec d'enregistrement de la configuration"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
+msgid "New Tunnel"
+msgstr "Nouveau tunnel"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
+msgid "Standard client"
+msgstr "Client standard"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
+msgid "HTTP client"
+msgstr "Client HTTP"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
+msgid "IRC client"
+msgstr "Client IRC"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
+msgid "Standard server"
+msgstr "Serveur standard"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
+msgid "HTTP server"
+msgstr "Serveur HTTP"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
+msgid "SOCKS 4/4a/5 proxy"
+msgstr "Mandataire SOCKS 4/4a/5"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
+msgid "SOCKS IRC proxy"
+msgstr "Mandataire IRC SOCKS"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
+msgid "CONNECT/SSL/HTTPS proxy"
+msgstr "Mandataire CONNECT/SSL/HTTPS"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
+msgid "IRC server"
+msgstr "Serveur IRC"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
+msgid "Streamr client"
+msgstr "Client flux"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
+msgid "Streamr server"
+msgstr "Serveur flux"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
+msgid "HTTP bidir"
+msgstr "bidir HTTP"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293
+msgid "Host not set"
+msgstr "Hôte non défini"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275
+msgid "Port not set"
+msgstr "Port non défini"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Client Tunnel"
+msgstr "Gestionnaire de tunnels I2P: Modifiez le tunnel client"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93
+msgid "Edit proxy settings"
+msgstr "Modifiez les réglages de mandataire"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101
+msgid "New proxy settings"
+msgstr "Paramètres de nouveau mandataire"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:124
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:260
+msgid "Name"
+msgstr "Nom"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:282
+msgid "Type"
+msgstr "Type"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:229
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:389
+msgid "Description"
+msgstr "Description"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:126
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:136
+msgid "Target"
+msgstr "Cible"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162
+msgid "Access Point"
+msgstr "Point d'accès"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213
+msgid "required"
+msgstr "requis"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
+msgid "Reachable by"
+msgstr "Joignable par"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
+msgid "Outproxies"
+msgstr "Mandataires sortants"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
+msgid "Tunnel Destination"
+msgstr "Destination de tunnel"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
+msgid "name or destination"
+msgstr "nom ou destination"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
+msgid "b32 not recommended"
+msgstr "b32 déconseillée"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208
+msgid "Shared Client"
+msgstr "Client partagé"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
+msgid "(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)"
+msgstr "Partager les tunnels avec d'autres clients et des clients http/irc? La modification requiert le redémarrage du client mandataire)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
+msgid "Auto Start"
+msgstr "Démarrage automatique"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
+msgid "(Check the Box for 'YES')"
+msgstr "(Cochez la case pour le  démarrage auto en même temps que le routeur)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
+msgid "Advanced networking options"
+msgstr "Options de réseau avancées"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
+msgid "(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)"
+msgstr "(ATTENTION : quand ce mandataire client est configuré pour partager les tunnels, ces options sont appliquées à tous les mandataires clients partagés)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
+msgid "Tunnel Options"
+msgstr "Options de tunnel"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
+msgid "Length"
+msgstr "Longueur"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
+msgid "0 hop tunnel (low anonymity, low latency)"
+msgstr "Tunnel à 0 saut (anonymat et latence faibles)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
+msgid "1 hop tunnel (medium anonymity, medium latency)"
+msgstr "Tunnel à 1 saut (anonymat et latence moyens)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
+msgid "2 hop tunnel (high anonymity, high latency)"
+msgstr "Tunnel à 2 sauts (anonymat et latence élevés)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
+msgid "3 hop tunnel (very high anonymity, poor performance)"
+msgstr "Tunnel à 3 sauts (anonymat et latence très élevés)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
+msgid "hop tunnel (very poor performance)"
+msgstr "Tunnel de saut (performances médiocres)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
+msgid "Variance"
+msgstr "Variance"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
+msgid "0 hop variance (no randomisation, consistant performance)"
+msgstr "Variance à 0 saut (pas d'aléa, performances stables)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
+msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
+msgstr "Variance à + 0 ou 1 saut (aléa moyen,  performances diminuées)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
+msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
+msgstr "Variance à + 0 à 2 sauts (aléa élevé,  performances diminuées)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
+msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
+msgstr "Variance à +/- 0 ou 1 saut (aléas légers,  performances diminuées)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
+msgid "+/- 0-2 hop variance (not recommended)"
+msgstr "Variance à +/- 0 à 2 sauts (déconseillée)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
+msgid "hop variance"
+msgstr "variance de saut"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
+msgid "Count"
+msgstr "Nombre"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
+msgid "1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)"
+msgstr "Tunnel à 1 entrant/1 sortant (faible consommation de bande passante, moins fiable)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
+msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)"
+msgstr "Tunnels à 2 entrants/2 sortants (consommation de bande passante standard, fiabilité standard)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
+msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
+msgstr "Tunnels à 3 entrants/3 sortants (consommation de bande passante plus élevée, fiabilité élevée)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
+msgid "tunnels"
+msgstr "tunnels"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
+msgid "Backup Count"
+msgstr "Secours"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
+msgid "0 backup tunnels (0 redundancy, no added resource usage)"
+msgstr "Aucun tunnel de secours (pas de tolérance de pannes, pas de consommation de ressources) "
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
+msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
+msgstr "1 tunnel de secours par direction (légère tolérance de pannes, faible consommation de ressources)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
+msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)"
+msgstr "2 tunnels de secours par direction (tolérance de pannes moyenne, consommation de ressources moyenne)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
+msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
+msgstr "3 tunnels de secours par direction (tolérance de pannes élevée, consommation de ressources élevée)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
+msgid "backup tunnels"
+msgstr "Tunnels de secours"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
+msgid "Profile"
+msgstr "Profil"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
+msgid "interactive connection"
+msgstr "connexion interactive"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
+msgid "bulk connection (downloads/websites/BT)"
+msgstr "connexion forts transferts (téléchargements/sites web/BT)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
+msgid "Delay Connect"
+msgstr "Retard à la connexion"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
+msgid "for request/response connections"
+msgstr "pour les connexions de demandes/réponses"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
+msgid "Router I2CP Address"
+msgstr "Adresse I2CP du routeur"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
+msgid "Host"
+msgstr "Hôte"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:269
+msgid "Port"
+msgstr "Port"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
+msgid "Reduce tunnel quantity when idle"
+msgstr "Réduire le nombre de tunnels quand inactif"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
+msgid "Enable"
+msgstr "Activer"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
+msgid "Reduced tunnel count"
+msgstr "Réduire à"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
+msgid "Idle minutes"
+msgstr "Minutes d'inactivité"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
+msgid "Close tunnels when idle"
+msgstr "Fermer les tunnels quand inactif"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
+msgid "New Keys on Reopen"
+msgstr "Nouvelles clés à la réouverture"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
+msgid "Disable"
+msgstr "Désactiver"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
+msgid "Delay tunnel open until required"
+msgstr "Retarder l'ouverture jusqu'à l'utilisation"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
+msgid "Persistent private key"
+msgstr "Clé privée persistante"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
+msgid "File"
+msgstr "Fichier"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
+msgid "Local destination"
+msgstr "Destination locale"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
+msgid "(if known)"
+msgstr "(si connu)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
+msgid "Local Authorization"
+msgstr "Autorisation locale"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
+msgid "Username"
+msgstr "Identifiant"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
+msgid "Password"
+msgstr "Mot de passe"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
+msgid "Outproxy Authorization"
+msgstr "Autorisation de mandataire sortant"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
+msgid "Jump URL List"
+msgstr "Liste d'URL de sauts"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
+msgid "Custom options"
+msgstr "Options personnelles"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
+msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted."
+msgstr "NOTE: si le tunnel est actif, la plupart des modifications ne prendront effet qu'après son redémarrage."
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
+msgid "Cancel"
+msgstr "Annuler"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
+msgid "Delete"
+msgstr "Supprimer"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
+msgid "Save"
+msgstr "Enregistrer"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Server Tunnel"
+msgstr "Gestionnaire de tunnels I2P: modifier le tunnel serveur"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93
+msgid "Edit server settings"
+msgstr "Modifier les paramètres du serveur"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101
+msgid "New server settings"
+msgstr "Paramètres de nouveau serveur"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
+msgid "Website name"
+msgstr "Nom du site web"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
+msgid "(leave blank for outproxies)"
+msgstr "(laisser vide pour les mandataires sortants)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208
+msgid "Private key file"
+msgstr "Fichier de clé privée"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
+msgid "Add to local addressbook"
+msgstr "Ajouter au carnet d'adresses local"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237
+msgid "Hostname Signature"
+msgstr "Signature du nom d'hôte"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
+msgid "Encrypt Leaseset"
+msgstr "Jeu de baux crypté"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423
+msgid "Encryption Key"
+msgstr "Clé de cryptage"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
+msgid "Generate New Key"
+msgstr "Générer une nouvelle clé"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
+msgid "Generate"
+msgstr "Générer"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523
+msgid "(Tunnel must be stopped first)"
+msgstr "(Le tunnel doit préalablement être arrêté)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
+msgid "Restricted Access List"
+msgstr "Contrôle d'accès"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
+msgid "Whitelist"
+msgstr "Liste blanche"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
+msgid "Blacklist"
+msgstr "Liste noire"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447
+msgid "Access List"
+msgstr "Liste d'accès"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
+msgid "Inbound connection limits (0=unlimited)"
+msgstr "Limite de connexions entrantes (0=pas de limite)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453
+msgid "Per client"
+msgstr "Par client"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455
+msgid "Per minute"
+msgstr "Par minute"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
+msgid "Per hour"
+msgstr "Par heure"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463
+msgid "Per day"
+msgstr "Par jour"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467
+msgid "Total"
+msgstr "Total"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
+msgid "Max concurrent connections (0=unlimited)"
+msgstr "Connexions simultanées maximum (0=pas de limite)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493
+msgid "New Certificate type"
+msgstr "Type de nouveau certificat"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
+msgid "None"
+msgstr "Aucun"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499
+msgid "Hashcash (effort)"
+msgstr "Pénalité"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505
+msgid "Hashcash Calc Time"
+msgstr "Durée de calcul de pénalisation"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507
+msgid "Estimate"
+msgstr "Estimer"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509
+msgid "Hidden"
+msgstr "Masqué"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513
+msgid "Signed (signed by)"
+msgstr "Signé (signé par)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519
+msgid "Modify Certificate"
+msgstr "Modifier le certificat"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521
+msgid "Modify"
+msgstr "Modifier"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:74
+msgid "I2P Tunnel Manager - List"
+msgstr "Gestionnaire de tunnels I2P - Liste"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:86
+msgid "Status Messages"
+msgstr "Messages d'état"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:90
+msgid "Refresh"
+msgstr "Actualiser"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:94
+msgid "Stop All"
+msgstr "Arrêter tous"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:98
+msgid "Start All"
+msgstr "Démarrer tous"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:102
+msgid "Restart All"
+msgstr "Redémarrer tous"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:106
+msgid "Reload Config"
+msgstr "Recharger la configuration"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108
+msgid "I2P Server Tunnels"
+msgstr "Tunnels serveurs I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:133
+msgid "Points at"
+msgstr "Pointe vers"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:156
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:160
+msgid "Preview"
+msgstr "Aperçu"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:180
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:300
+msgid "Status"
+msgstr "État"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:166
+msgid "Base32 Address"
+msgstr "Adresse Base32"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:174
+msgid "No Preview"
+msgstr "Aucun aperçu"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:187
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307
+msgid "Starting..."
+msgstr "Démarrage..."
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:194
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:208
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342
+msgid "Stop"
+msgstr "Arrêter"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335
+msgid "Running"
+msgstr "Actif"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:349
+msgid "Stopped"
+msgstr "Arrêté"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:356
+msgid "Start"
+msgstr "Démarrer"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:237
+msgid "New server tunnel"
+msgstr "Nouveau tunnel serveur"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399
+msgid "Standard"
+msgstr "Standard"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401
+msgid "Create"
+msgstr "Créer"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243
+msgid "I2P Client Tunnels"
+msgstr "Tunnels clients I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286
+msgid "Interface"
+msgstr "Interface"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321
+msgid "Standby"
+msgstr "Pause"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366
+msgid "Outproxy"
+msgstr "Mandataire sortant"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
+msgid "Destination"
+msgstr "Destination"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:384
+msgid "none"
+msgstr "aucun"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:397
+msgid "New client tunnel"
+msgstr "Nouveau tunnel client"
+
diff --git a/apps/i2ptunnel/locale/messages_nl.po b/apps/i2ptunnel/locale/messages_nl.po
index 90e5be16b176d0974852a54167b03f037aefeed3..e549639559c2a904ddb6dc08af6676be8908c896 100644
--- a/apps/i2ptunnel/locale/messages_nl.po
+++ b/apps/i2ptunnel/locale/messages_nl.po
@@ -6,36 +6,42 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: I2P i2ptunnel\n"
+"Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-17 15:04+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>, monkeybrains <monkeybrains@mail.i2p>\n"
+"POT-Creation-Date: 2011-03-03 18:29+0000\n"
+"PO-Revision-Date: 2011-02-20 12:14+0000\n"
+"Last-Translator: ducki2p <ducki2p@gmail.com>\n"
+"Language-Team: Dutch <>\n"
+"Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Dutch\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:475
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474
 #, 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>."
+"a>. To visit the conflicting addresshelper destination, click <a href="
+"\"{1}\">here</a>."
 msgstr ""
-"Om de destination in je host database te bezoeken, klik <a href=\"{0}"
-"\">hier</a>. Om de conflicterende adreshelper destination te bezoeken, klik "
-"<a href=\"{1}\">hier</a>."
+"Om de destination in je host database te bezoeken, klik <a href="
+"\"{0}\">hier</a>. Om de conflicterende adreshelper destination te bezoeken, "
+"klik <a href=\"{1}\">hier</a>."
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:932
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
 msgid ""
 "Click a link below to look for an address helper by using a \"jump\" service:"
 msgstr ""
 "Klik op een onderstaande link om te zoeken naar een adreshelper via een "
 "\"jump\" service:"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:170
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
+msgid "internal"
+msgstr "intern"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
 msgid ""
 "Invalid form submission, probably because you used the 'back' or 'reload' "
 "button on your browser. Please resubmit."
@@ -43,72 +49,90 @@ msgstr ""
 "Ongeldige formulier verzonden, waarschijnlijk doordat je de 'back' of "
 "'reload' button van je browser hebt gebruikt. Verzend opnieuw."
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:217
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218
 msgid "Configuration reloaded for all tunnels"
 msgstr "Configuratie van alle tunnels opnieuw geladen"
 
 #. and give them something to look at in any case
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:229
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230
 msgid "Starting tunnel"
 msgstr "Opstarten van tunnel"
 
 #. and give them something to look at in any case
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:242
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
 msgid "Stopping tunnel"
 msgstr "Stoppen van tunnel"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:389
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
+msgid "Configuration changes saved"
+msgstr "Configuratie wijzigingen opgeslagen"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
+msgid "Failed to save configuration"
+msgstr "Opslaan van de configuratie mislukt"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
 msgid "New Tunnel"
 msgstr "Nieuwe Tunnel"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:409
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
 msgid "Standard client"
 msgstr "Standaard client"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:410
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
 msgid "HTTP client"
 msgstr "HTTP client"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:411
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
 msgid "IRC client"
 msgstr "IRC client"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:412
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
 msgid "Standard server"
 msgstr "Standaard server"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:413
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
 msgid "HTTP server"
 msgstr "HTTP server"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:414
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
 msgid "SOCKS 4/4a/5 proxy"
 msgstr "SOCKS 4/4a/5 proxy"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:415
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
 msgid "SOCKS IRC proxy"
 msgstr "SOCKS IRC proxy"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:416
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
 msgid "CONNECT/SSL/HTTPS proxy"
 msgstr "CONNECT/SSL/HTTPS proxy"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:417
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
 msgid "IRC server"
 msgstr "IRC server"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
 msgid "Streamr client"
 msgstr "Streamr client"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
 msgid "Streamr server"
 msgstr "Streamr server"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
 msgid "HTTP bidir"
 msgstr "HTTP bidir"
 
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290
+msgid "Host not set"
+msgstr "Host niet opgegeven"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272
+msgid "Port not set"
+msgstr "Poort niet opgegeven"
+
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
 msgid "I2P Tunnel Manager - Edit Client Tunnel"
 msgstr "I2P Tunnel Manager - Bewerk Client Tunnel"
@@ -133,14 +157,14 @@ msgstr "Naam"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:246
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:270
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279
 msgid "Type"
 msgstr "Type"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
 msgid "Description"
 msgstr "Omschrijving"
 
@@ -151,66 +175,45 @@ msgstr "Doel"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162
 msgid "Access Point"
 msgstr "Toegangspunt"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:179
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:207
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:157
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:172
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213
 msgid "required"
 msgstr "vereist"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:183
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
 msgid "Reachable by"
 msgstr "Bereikbaar voor"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:162
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:195
-msgid "Locally (127.0.0.1)"
-msgstr "Lokaal (127.0.0.1)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:166
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
-msgid "Everyone (0.0.0.0)"
-msgstr "Iedereen (0.0.0.0)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:170
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
-msgid "LAN Hosts (Please specify your LAN address)"
-msgstr "LAN Hosts (Specificeer je LAN adres)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:186
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205
-msgid "Other"
-msgstr "Anders"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:195
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
 msgid "Outproxies"
 msgstr "Uitgaande proxies"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
 msgid "Tunnel Destination"
 msgstr "Tunnel Destinations"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:214
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
 msgid "name or destination"
 msgstr "naam of destination"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
 msgid "b32 not recommended"
 msgstr "b32 niet aanbevolen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208
 msgid "Shared Client"
 msgstr "Gedeelde Client"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
 msgid ""
 "(Share tunnels with other clients and irc/httpclients? Change requires "
 "restart of client proxy)"
@@ -218,22 +221,22 @@ msgstr ""
 "(Deel tunnels met andere clients en irc/httpclients? Wijziging vereist "
 "herstart van de client proxy)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
 msgid "Auto Start"
 msgstr "Auto Start"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
 msgid "(Check the Box for 'YES')"
 msgstr "(Markeer de Box voor 'JA')"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:237
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
 msgid "Advanced networking options"
 msgstr "Geavanceerde netwerk opties"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
 msgid ""
 "(NOTE: when this client proxy is configured to share tunnels, then these "
 "options are for all the shared proxy clients!)"
@@ -241,93 +244,93 @@ msgstr ""
 "(OPMERKING: wanneer deze client proxy is geconfigureerd om tunnels te delen, "
 "dan zijn deze opties van toepassing voor alle gedeelde proxy clients!)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:241
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:260
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
 msgid "Tunnel Options"
 msgstr "Tunnel Opties"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
 msgid "Length"
 msgstr "Lengte"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:250
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:269
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
 msgid "0 hop tunnel (low anonymity, low latency)"
 msgstr "0 hop tunnel (lage anonimiteit, weinig vertraging)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:254
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:273
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
 msgid "1 hop tunnel (medium anonymity, medium latency)"
 msgstr "1 hop tunnel (gemiddelde anonimiteit, gemiddelde vertraging)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:258
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:277
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
 msgid "2 hop tunnel (high anonymity, high latency)"
 msgstr "2 hop tunnel (hoge anonimiteit, hoge vertraging)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:262
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
 msgid "3 hop tunnel (very high anonymity, poor performance)"
 msgstr "3 hop tunnel (zeer hoge anonimiteit, slechte prestatie)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:290
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
 msgid "hop tunnel (very poor performance)"
 msgstr "hop tunnel (zeer slechte prestatie)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
 msgid "Variance"
 msgstr "Variantie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:283
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
 msgid "0 hop variance (no randomisation, consistant performance)"
 msgstr "0 hop variantie (geen randomisatie, consistente prestatie)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:287
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
 msgid ""
 "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
 msgstr ""
 "+ 0-1 hop variantie (gemiddeld toegevoegde randomisatie, minder prestatie)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:291
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
 msgid ""
 "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
 msgstr "+ 0-2 hop variantie (hoge toegevoegde randomisatie, minder prestatie)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:295
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:314
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
 msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
 msgstr "+/- 0-1 hop variantie (standaard randomisatie, standaard prestatie)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:299
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
 msgid "+/- 0-2 hop variance (not recommended)"
 msgstr "+/- 0-2 hop variantie (niet aanbevolen)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
 msgid "hop variance"
 msgstr "hop variantie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
 msgid "Count"
 msgstr "Aantal"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:323
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
 msgid "1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)"
 msgstr ""
 "1 inkomende, 1 uitgaande tunnel (laag bandbreedte gebruik, minder "
 "betrouwbaar)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:327
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
 msgid ""
 "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
 "reliability)"
@@ -335,185 +338,189 @@ msgstr ""
 "2 inkomende, 2 uitgaande tunnels (standaard bandbreedte gebruik, standaard "
 "betrouwbaarheid)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:331
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
 msgid ""
 "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
 msgstr ""
 "3 inkomende, 3 uitgaande tunnels (hoge bandbreedte gebruik, hogere "
 "betrouwbaarheid)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
 msgid "tunnels"
 msgstr "tunnels"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
 msgid "Backup Count"
 msgstr "Backup Aantal"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:352
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:371
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
 msgid "0 backup tunnels (0 redundancy, no added resource usage)"
 msgstr "0 backup tunnels (0 redundantie, geen additionele bronnen gebruikt)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:356
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
 msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
 msgstr ""
 "1 backup tunnel in beide richting (lage redundantie, lage aantal bronnen "
 "gebruikt)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:360
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:379
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
 msgid ""
 "2 backup tunnels each direction (medium redundancy, medium resource usage)"
 msgstr ""
 "2 backup tunnels in beide richting (gemiddelde redundantie, gemiddeld aantal "
 "bronnen gebruikt)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:364
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:383
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
 msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
 msgstr ""
 "3 backup tunnels in beide richting (hoge redundantie, hoog aantal bronnen "
 "gebruikt)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:373
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:392
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
 msgid "backup tunnels"
 msgstr "backup tunnels"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:380
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
 msgid "Profile"
 msgstr "Profiel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:387
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
 msgid "interactive connection"
 msgstr "interactieve connectie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:391
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:410
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
 msgid "bulk connection (downloads/websites/BT)"
 msgstr "bulk connection (downloads/websites/BT)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:393
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
 msgid "Delay Connect"
 msgstr "Vertraagde Connectie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:397
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
 msgid "for request/response connections"
 msgstr "voor request/response connecties"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:401
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414
-msgid "I2CP Options"
-msgstr "I2CP Opties"
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
+msgid "Router I2CP Address"
+msgstr "Router I2CP Adres"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:403
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:146
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
 msgid "Host"
 msgstr "Host"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:407
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:152
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:420
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
 msgid "Port"
 msgstr "Poort"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:413
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
 msgid "Reduce tunnel quantity when idle"
-msgstr "Verminder tunnel aantal wanneer in rust"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:415
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:429
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:437
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:449
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:459
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:479
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:493
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:426
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:442
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:454
+msgstr "Verminder tunnel aantal in ruststand"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
 msgid "Enable"
 msgstr "Ingeschakeld"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:419
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:458
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
 msgid "Reduced tunnel count"
 msgstr "Verminder tunnel aantal"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:423
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:443
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:462
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
 msgid "Idle minutes"
 msgstr "Rust minuten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:427
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
 msgid "Close tunnels when idle"
 msgstr "Sluit tunnels wanneer in rust"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:433
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
 msgid "New Keys on Reopen"
 msgstr "Nieuwe Sleutels bij Heropenen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:441
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
 msgid "Disable"
 msgstr "Uitgeschakeld"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:447
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
 msgid "Delay tunnel open until required"
 msgstr "Vertraag tunnel opening totdat het nodig is"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:457
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
 msgid "Persistent private key"
 msgstr "Persistente private sleutel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:463
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
 msgid "File"
 msgstr "Bestand"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:467
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
 msgid "Local destination"
 msgstr "Lokale destination"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:471
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
 msgid "(if known)"
 msgstr "(indien bekend)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:477
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
 msgid "Local Authorization"
 msgstr "Lokale Autorisatie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:483
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:497
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
 msgid "Username"
 msgstr "Gebruikersnaam"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:487
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:501
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
 msgid "Password"
 msgstr "Wachtwoord"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:491
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
 msgid "Outproxy Authorization"
 msgstr "Uitgaande Proxy Autorisatie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:507
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:498
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
+msgid "Jump URL List"
+msgstr "Spring URL Lijst"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
 msgid "Custom options"
 msgstr "Aangepaste opties"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:511
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:502
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
 msgid ""
 "NOTE: If tunnel is currently running, most changes will not take effect "
 "until tunnel is stopped and restarted."
@@ -521,18 +528,18 @@ msgstr ""
 "OPMERKING: Indien de tunnel op dit moment draait, zullen de meeste "
 "wijzigingen pas effect hebben na het stoppen en herstarten van de tunnel."
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:513
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:504
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
 msgid "Cancel"
 msgstr "Annuleer"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:517
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:508
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
 msgid "Delete"
 msgstr "Verwijder"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:519
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:510
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
 msgid "Save"
 msgstr "Opslaan"
 
@@ -548,92 +555,124 @@ msgstr "Bewerk server instellingen"
 msgid "New server settings"
 msgstr "Nieuwe server instellingen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:214
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
 msgid "Website name"
 msgstr "Website naam"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:218
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
 msgid "(leave blank for outproxies)"
 msgstr "(leeg laten voor uitgaande proxies)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208
 msgid "Private key file"
 msgstr "Private sleutel bestand"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
 msgid "Add to local addressbook"
 msgstr "Toevoegen aan lokaal adresboek"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:252
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237
 msgid "Hostname Signature"
 msgstr "Hostnaam Handtekening"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:424
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
 msgid "Encrypt Leaseset"
 msgstr "Versleutel Leaseset"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423
 msgid "Encryption Key"
 msgstr "Encryptie Sleutel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
 msgid "Generate New Key"
 msgstr "Genereer Nieuwe Sleutel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
 msgid "Generate"
 msgstr "Genereer"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:438
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:496
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523
 msgid "(Tunnel must be stopped first)"
 msgstr "(Tunnel moet eerst gestopt worden)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:440
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
 msgid "Restricted Access List"
 msgstr "Beperkte Toegangs Lijst"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:446
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
+msgid "Whitelist"
+msgstr "Wittelijst"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
+msgid "Blacklist"
+msgstr "Zwartelijst"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447
 msgid "Access List"
-msgstr "Toegangs Lijst"
+msgstr "Toegangslijst"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
+msgid "Inbound connection limits (0=unlimited)"
+msgstr "Inkomende connectie limieten (0=onbeperkt)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453
+msgid "Per client"
+msgstr "Per client"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455
+msgid "Per minute"
+msgstr "Per minuut"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:450
-msgid "(Restrict to these clients only)"
-msgstr "(Beperkt tot slechts deze clients)"
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
+msgid "Per hour"
+msgstr "Per uur"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:466
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463
+msgid "Per day"
+msgstr "Per dag"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467
+msgid "Total"
+msgstr "Totaal"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
+msgid "Max concurrent connections (0=unlimited)"
+msgstr "Maximum gelijktijdige connecties (0=onbeperkt)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493
 msgid "New Certificate type"
 msgstr "Nieuw Certificaat type"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:468
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
 msgid "None"
 msgstr "Geen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499
 msgid "Hashcash (effort)"
 msgstr "Hashcash (effort)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:478
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505
 msgid "Hashcash Calc Time"
 msgstr "Hashcash Reken Tijd"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507
 msgid "Estimate"
 msgstr "Inschatten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:482
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509
 msgid "Hidden"
 msgstr "Verborgen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:486
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513
 msgid "Signed (signed by)"
 msgstr "Ondertekend (ondertekend door)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:492
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519
 msgid "Modify Certificate"
 msgstr "Wijzig Certificaat"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:494
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521
 msgid "Modify"
 msgstr "Wijzig"
 
@@ -683,7 +722,7 @@ msgstr "Preview"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:250
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:278
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:297
 msgid "Status"
 msgstr "Status"
 
@@ -696,30 +735,30 @@ msgid "No Preview"
 msgstr "Geen Preview"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304
 msgid "Starting..."
 msgstr "Starten..."
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:191
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:306
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339
 msgid "Stop"
 msgstr "Stop"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:332
 msgid "Running"
 msgstr "Draait"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346
 msgid "Stopped"
 msgstr "Gestopt"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:353
 msgid "Start"
 msgstr "Start"
 
@@ -728,12 +767,12 @@ msgid "New server tunnel"
 msgstr "Nieuwe server tunnel"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:377
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396
 msgid "Standard"
 msgstr "Standaard"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:379
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:398
 msgid "Create"
 msgstr "Creëer"
 
@@ -742,26 +781,26 @@ msgid "I2P Client Tunnels"
 msgstr "I2P Client Tunnels"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:274
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283
 msgid "Interface"
 msgstr "Interface"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318
 msgid "Standby"
 msgstr "Stand-by"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363
 msgid "Outproxy"
 msgstr "Uitgaande proxy"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
 msgid "Destination"
 msgstr "Destination"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:362
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381
 msgid "none"
 msgstr "geen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394
 msgid "New client tunnel"
 msgstr "Nieuwe client tunnel"
diff --git a/apps/i2ptunnel/locale/messages_ru.po b/apps/i2ptunnel/locale/messages_ru.po
index 718e82e9ff745deddcbbc7ef8e0c252e6f898372..d9075fa847924db8d15c451f41c3a5393f896c44 100644
--- a/apps/i2ptunnel/locale/messages_ru.po
+++ b/apps/i2ptunnel/locale/messages_ru.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P i2ptunnel\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-13 19:43+0000\n"
-"PO-Revision-Date: 2010-12-14 00:54+0500\n"
+"POT-Creation-Date: 2011-02-14 18:14+0000\n"
+"PO-Revision-Date: 2011-02-14 23:24+0500\n"
 "Last-Translator: Hidden Z <hiddenz@mail.i2p>\n"
 "Language-Team: foo <foo@bar>\n"
 "Language: \n"
@@ -18,85 +18,108 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Poedit-Language: Russian\n"
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:475
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474
 #, 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>."
 msgstr "Для перехода по ссылке из локальной адресной книги, нажмите <a href=\"{0}\">здесь</a>. Для перехода по новой addresshelper-ссылке, нажмите <a href=\"{1}\">здесь</a>."
 
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:932
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
 msgid "Click a link below to look for an address helper by using a \"jump\" service:"
 msgstr "Jump-сервисы, которые, возможно, знают нужную Вам addresshelper-ссылку:"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:170
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
+msgid "internal"
+msgstr "внутренний"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
 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:217
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218
 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:229
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230
 msgid "Starting tunnel"
 msgstr "Запуск туннеля"
 
 #. and give them something to look at in any case
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:242
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
 msgid "Stopping tunnel"
 msgstr "Остановка туннеля"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:389
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
+msgid "Configuration changes saved"
+msgstr "Настройки сохранены"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
+msgid "Failed to save configuration"
+msgstr "Не удалось сохранить настройки"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
 msgid "New Tunnel"
 msgstr "Новый туннель"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:409
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
 msgid "Standard client"
 msgstr "Обычный клиент"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:410
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
 msgid "HTTP client"
 msgstr "HTTP-клиент"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:411
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
 msgid "IRC client"
 msgstr "IRC-клиент"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:412
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
 msgid "Standard server"
 msgstr "Обычный сервер"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:413
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
 msgid "HTTP server"
 msgstr "HTTP-сервер"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:414
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
 msgid "SOCKS 4/4a/5 proxy"
 msgstr "SOCKS 4/4a/5 прокси"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:415
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
 msgid "SOCKS IRC proxy"
 msgstr "SOCKS IRC прокси"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:416
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
 msgid "CONNECT/SSL/HTTPS proxy"
 msgstr "CONNECT/SSL/HTTPS прокси"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:417
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
 msgid "IRC server"
 msgstr "IRC-сервер"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
 msgid "Streamr client"
 msgstr "Streamr-клиент"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
 msgid "Streamr server"
 msgstr "Streamr-сервер"
 
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
 msgid "HTTP bidir"
 msgstr "HTTP bidir (экспериментальный двунаправленный режим, инструкцию спрашивайте у sponge)"
 
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290
+msgid "Host not set"
+msgstr "Хост не задан"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272
+msgid "Port not set"
+msgstr "Порт не задан"
+
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
 msgid "I2P Tunnel Manager - Edit Client Tunnel"
 msgstr "Менеджер Туннелей I2P — Редактирование Клиентского Туннеля"
@@ -121,14 +144,14 @@ msgstr "Название"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:246
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:270
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279
 msgid "Type"
 msgstr "Тип"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
 msgid "Description"
 msgstr "Описание"
 
@@ -139,357 +162,340 @@ msgstr "Точка доступа"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162
 msgid "Access Point"
 msgstr "Точка доступа"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:179
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:207
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:157
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:172
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213
 msgid "required"
 msgstr "*"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:183
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
 msgid "Reachable by"
 msgstr "Кому будет доступно (Сетевой интерфейс)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:162
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:195
-msgid "Locally (127.0.0.1)"
-msgstr "Только в пределах этого компьютера (127.0.0.1)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:166
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
-msgid "Everyone (0.0.0.0)"
-msgstr "Всем (0.0.0.0)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:170
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
-msgid "LAN Hosts (Please specify your LAN address)"
-msgstr "Только из локальной сети (Введите свой LAN-адрес)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:186
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205
-msgid "Other"
-msgstr "Адрес сетевого интерфейса"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:195
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
 msgid "Outproxies"
 msgstr "Список outproxy"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
 msgid "Tunnel Destination"
 msgstr "Адрес назначения туннеля"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:214
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
 msgid "name or destination"
 msgstr "имя или адрес"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
 msgid "b32 not recommended"
 msgstr "b32 не рекомендуется"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208
 msgid "Shared Client"
 msgstr "Коллективный клиент"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
 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:231
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
 msgid "Auto Start"
 msgstr "Автозапуск"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
 msgid "(Check the Box for 'YES')"
 msgstr "(поставьте галочку для включения)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:237
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
 msgid "Advanced networking options"
 msgstr "Расширенные сетевые настройки"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
 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:241
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:260
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
 msgid "Tunnel Options"
 msgstr "Параметры туннеля"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
 msgid "Length"
 msgstr "Длина"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:250
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:269
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
 msgid "0 hop tunnel (low anonymity, low latency)"
 msgstr "0 хопов (низкая анонимность, малые задержки)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:254
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:273
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
 msgid "1 hop tunnel (medium anonymity, medium latency)"
 msgstr "1 хоп (умеренная анонимность, умеренные задержки)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:258
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:277
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
 msgid "2 hop tunnel (high anonymity, high latency)"
 msgstr "2 хопа (высокая анонимность, высокие задержки)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:262
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
 msgid "3 hop tunnel (very high anonymity, poor performance)"
 msgstr "3 хопа (очень высокая анонимность, низкая производительность)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:290
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
 msgid "hop tunnel (very poor performance)"
 msgstr "хопов (очень низкая производительность)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
 msgid "Variance"
 msgstr "Разброс"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:283
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
 msgid "0 hop variance (no randomisation, consistant performance)"
 msgstr "нулевой разброс (без рандомизации, фиксированная производительность)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:287
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
 msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
 msgstr "+ 0-1 разброс (умеренно повышенная рандомизация, пониженная производительность)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:291
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
 msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
 msgstr "+ 0-2 разброс (сильно повышенная рандомизация, пониженная производительность)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:295
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:314
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
 msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
 msgstr "+/- 0-1 разброс (стандартная рандомизация, стандартная производительность)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:299
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
 msgid "+/- 0-2 hop variance (not recommended)"
 msgstr "+/- 0-2 разброс (не рекомендуется)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
 msgid "hop variance"
 msgstr "разброс"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
 msgid "Count"
 msgstr "Количество"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:323
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
 msgid "1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)"
 msgstr "1 входящий, 1 исходящий туннель (низкая пропускная способность, низкая надежность) "
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:327
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
 msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)"
 msgstr "2 входящих, 2 исходящих туннеля (стандартная пропускная способность, стандартная надежность)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:331
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
 msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
 msgstr "3 входящих, 3 исходящих туннеля (высокая пропускная способность, высокая надежность)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
 msgid "tunnels"
 msgstr "туннелей"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
 msgid "Backup Count"
 msgstr "Резервное количество"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:352
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:371
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
 msgid "0 backup tunnels (0 redundancy, no added resource usage)"
 msgstr "без резервных туннелей (отсутствие избыточности, отсутствие дополнительной нагрузки на систему)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:356
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
 msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
 msgstr "1 резервный туннель в каждом направлении (низкая избыточность, низкая нагрузка на систему)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:360
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:379
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
 msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)"
 msgstr "2 резервных туннеля в каждом направлении (умеренная избыточность, умеренная нагрузка на систему)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:364
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:383
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
 msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
 msgstr "3 резервных туннеля в каждом направлении (высокая избыточность, высокая нагрузка на систему)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:373
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:392
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
 msgid "backup tunnels"
 msgstr "резервных туннелей"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:380
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
 msgid "Profile"
 msgstr "Режим"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:387
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
 msgid "interactive connection"
 msgstr "оптимизировать для малых задержек (irc)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:391
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:410
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
 msgid "bulk connection (downloads/websites/BT)"
 msgstr "оптимизировать для большого обьема (www/bittorrent)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:393
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
 msgid "Delay Connect"
 msgstr "Задержка соединения"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:397
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
 msgid "for request/response connections"
 msgstr "оптимизация для соединений, начинающихся с запроса клиента/ответа сервера"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:401
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414
-msgid "I2CP Options"
-msgstr "Параметры I2CP"
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
+msgid "Router I2CP Address"
+msgstr "I2CP Адрес Роутера"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:403
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:146
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
 msgid "Host"
 msgstr "Адрес"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:407
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:152
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:420
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
 msgid "Port"
 msgstr "Порт"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:413
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
 msgid "Reduce tunnel quantity when idle"
 msgstr "Снижать количество туннелей при простое"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:415
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:429
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:437
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:449
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:459
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:479
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:493
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:426
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:442
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:454
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
 msgid "Enable"
 msgstr "Включить"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:419
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:458
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
 msgid "Reduced tunnel count"
 msgstr "Количество туннелей"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:423
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:443
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:462
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
 msgid "Idle minutes"
 msgstr "Минут простоя"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:427
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
 msgid "Close tunnels when idle"
 msgstr "Закрыть туннели при простое"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:433
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
 msgid "New Keys on Reopen"
 msgstr "Генерировать новый ключ при переоткрытии"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:441
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
 msgid "Disable"
 msgstr "Выключить"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:447
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
 msgid "Delay tunnel open until required"
 msgstr "Отложить запуск до первого запроса"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:457
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
 msgid "Persistent private key"
 msgstr "Постоянный секретный ключ"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:463
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
 msgid "File"
 msgstr "Файл"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:467
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
 msgid "Local destination"
 msgstr "Локальный адрес назначения"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:471
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
 msgid "(if known)"
 msgstr "(если известен)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:477
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
 msgid "Local Authorization"
 msgstr "Локальная авторизация"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:483
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:497
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
 msgid "Username"
 msgstr "Имя пользователя"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:487
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:501
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
 msgid "Password"
 msgstr "Пароль"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:491
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
 msgid "Outproxy Authorization"
 msgstr "Авторизация outproxy"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:507
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:498
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
+msgid "Jump URL List"
+msgstr "Список адресов jump-сервисов"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
 msgid "Custom options"
 msgstr "Дополнительные параметры"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:511
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:502
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
 msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted."
 msgstr "ПРИМЕЧАНИЕ: для вступления в силу измененных настроек потребуется остановка и перезапуск туннеля"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:513
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:504
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
 msgid "Cancel"
 msgstr "Отмена"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:517
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:508
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
 msgid "Delete"
 msgstr "Удалить"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:519
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:510
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
 msgid "Save"
 msgstr "Сохранить"
 
@@ -505,92 +511,124 @@ msgstr "Редактирование настроек серверного ту
 msgid "New server settings"
 msgstr "Настройки нового серверного туннеля"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:214
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
 msgid "Website name"
 msgstr "Имя веб-сайта"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:218
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
 msgid "(leave blank for outproxies)"
 msgstr "(не заполнять для outproxy)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208
 msgid "Private key file"
 msgstr "Файл секретного ключа"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
 msgid "Add to local addressbook"
 msgstr "Добавить в локальную адресную книгу"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:252
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237
 msgid "Hostname Signature"
 msgstr "Подпись хоста"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:424
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
 msgid "Encrypt Leaseset"
 msgstr "Шифровать LeaseSet"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423
 msgid "Encryption Key"
 msgstr "Ключ шифрования"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
 msgid "Generate New Key"
 msgstr "Сгенерировать новый ключ"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
 msgid "Generate"
 msgstr "Сгенерировать"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:438
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:496
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523
 msgid "(Tunnel must be stopped first)"
 msgstr "(Туннель перед этим следует остановить)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:440
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
 msgid "Restricted Access List"
 msgstr "Ограниченный доступ"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:446
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
+msgid "Whitelist"
+msgstr "Белый список"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
+msgid "Blacklist"
+msgstr "Чёрный список"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447
 msgid "Access List"
 msgstr "Список доступа"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:450
-msgid "(Restrict to these clients only)"
-msgstr "(Разрешить доступ только перечисленным клиентам)"
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
+msgid "Inbound connection limits (0=unlimited)"
+msgstr "Ограничение входящих соединений (0=неограниченно)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453
+msgid "Per client"
+msgstr "На клиента"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455
+msgid "Per minute"
+msgstr "В минуту"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
+msgid "Per hour"
+msgstr "В час"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463
+msgid "Per day"
+msgstr "В сутки"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467
+msgid "Total"
+msgstr "Всего"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:466
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
+msgid "Max concurrent connections (0=unlimited)"
+msgstr "Максимум одновременных соединений (0=неограниченно)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493
 msgid "New Certificate type"
 msgstr "Создать новый сертификат. Тип"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:468
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
 msgid "None"
 msgstr "Без"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499
 msgid "Hashcash (effort)"
 msgstr "Hashcash (экспериментальный)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:478
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505
 msgid "Hashcash Calc Time"
 msgstr "Время генерации hashcash-сертификата"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507
 msgid "Estimate"
 msgstr "Прогноз"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:482
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509
 msgid "Hidden"
 msgstr "Скрытый"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:486
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513
 msgid "Signed (signed by)"
 msgstr "Подписанный (указать кем подписан)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:492
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519
 msgid "Modify Certificate"
 msgstr "Изменить сертификат"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:494
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521
 msgid "Modify"
 msgstr "Изменить"
 
@@ -640,7 +678,7 @@ msgstr "Предпросмотр"
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:250
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:278
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:297
 msgid "Status"
 msgstr "Состояние"
 
@@ -653,30 +691,30 @@ msgid "No Preview"
 msgstr "Предпросмотр недоступен"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304
 msgid "Starting..."
 msgstr "Запускается..."
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:191
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:306
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339
 msgid "Stop"
 msgstr "Остановить"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:332
 msgid "Running"
 msgstr "Запущен"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346
 msgid "Stopped"
 msgstr "Остановлен"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:353
 msgid "Start"
 msgstr "Запустить"
 
@@ -685,12 +723,12 @@ msgid "New server tunnel"
 msgstr "Новый серверный туннель"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:377
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396
 msgid "Standard"
 msgstr "Стандартный"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:379
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:398
 msgid "Create"
 msgstr "Создать"
 
@@ -699,30 +737,48 @@ msgid "I2P Client Tunnels"
 msgstr "Клиентские I2P туннели"
 
 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:274
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283
 msgid "Interface"
 msgstr "Сетевой интерфейс"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318
 msgid "Standby"
 msgstr "Режим ожидания"
 
 # This term intentionally left in English
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363
 msgid "Outproxy"
 msgstr "Outproxy"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
 msgid "Destination"
 msgstr "Адрес назначения"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:362
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381
 msgid "none"
 msgstr "нет"
 
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394
 msgid "New client tunnel"
 msgstr "Новый клиентский туннель"
 
+#~ msgid "Locally (127.0.0.1)"
+#~ msgstr "Только в пределах этого компьютера (127.0.0.1)"
+
+#~ msgid "Everyone (0.0.0.0)"
+#~ msgstr "Всем (0.0.0.0)"
+
+#~ msgid "LAN Hosts (Please specify your LAN address)"
+#~ msgstr "Только из локальной сети (Введите свой LAN-адрес)"
+
+#~ msgid "Other"
+#~ msgstr "Адрес сетевого интерфейса"
+
+#~ msgid "I2CP Options"
+#~ msgstr "Параметры I2CP"
+
+#~ msgid "(Restrict to these clients only)"
+#~ msgstr "(Разрешить доступ только перечисленным клиентам)"
+
 #~ msgid "Unimplemented"
 #~ msgstr "не реализовано"
diff --git a/apps/i2ptunnel/locale/messages_zh.po b/apps/i2ptunnel/locale/messages_zh.po
index f6efbfd3b85d751f2990a4d213be4875d6dfdc5e..e08390836cc569098ec066e04dfb12ffffefe9ad 100644
--- a/apps/i2ptunnel/locale/messages_zh.po
+++ b/apps/i2ptunnel/locale/messages_zh.po
@@ -1,701 +1,814 @@
-# I2P
-# 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
-# foo <foo@bar>, 2009.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: I2P i2ptunnel\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-10-04 02:45+0000\n"
-"PO-Revision-Date: 2010-05-29 10:57+0800\n"
-"Last-Translator: walking <walking@mail.i2p>\n"
-"Language-Team: foo <foo@bar>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Chinese\n"
-
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492
-#, 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>."
-msgstr ""
-"域名冲突:要访问您本地【地址簿】中设置的目标主机(相当与IP),请点击<a href="
-"\"{0}\">这里</a>。要访问【地址助手】返回的目标主机请点<a href=\"{1}\">这里</"
-"a>。"
-
-#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:909
-msgid ""
-"Click a link below to look for an address helper by using a \"jump\" service:"
-msgstr ""
-"请点击下面的链接通过【跳转(Jump)】服务提供的【地址助手】链接跳转至域名对应的"
-"主机:"
-
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:372
-msgid "New Tunnel"
-msgstr "新建隧道"
-
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:392
-msgid "Standard client"
-msgstr "标准客户端"
-
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:393
-msgid "HTTP client"
-msgstr "HTTP 客户端"
-
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:394
-msgid "IRC client"
-msgstr "IRC 客户端"
-
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:395
-msgid "Standard server"
-msgstr "标准服务器"
-
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:396
-msgid "HTTP server"
-msgstr "HTTP 服务器"
-
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:397
-msgid "SOCKS 4/4a/5 proxy"
-msgstr "SOCKS4/4A/5 代理"
-
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
-msgid "SOCKS IRC proxy"
-msgstr "SOCKS IRC 代理"
-
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:399
-msgid "CONNECT/SSL/HTTPS proxy"
-msgstr "CONNECT/SSL/HTTPS 代理"
-
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:400
-msgid "IRC server"
-msgstr "IRC 服务器"
-
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:401
-msgid "Streamr client"
-msgstr "Streamr 客户端"
-
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:402
-msgid "Streamr server"
-msgstr "Streamr 服务器"
-
-#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:403
-msgid "HTTP bidir"
-msgstr "双向http"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
-msgid "I2P Tunnel Manager - Edit Client Tunnel"
-msgstr "I2P 隧道管理器 - 编辑客户端隧道"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93
-msgid "Edit proxy settings"
-msgstr "编辑代理设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101
-msgid "New proxy settings"
-msgstr "新建代理设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:107
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:121
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:242
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:257
-msgid "Name"
-msgstr "名称"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:246
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:270
-msgid "Type"
-msgstr "类型"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:358
-msgid "Description"
-msgstr "描述"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:126
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:136
-msgid "Target"
-msgstr "目标"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
-msgid "Access Point"
-msgstr "接入点"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:179
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:207
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:157
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:172
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:228
-msgid "required"
-msgstr "必要"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:183
-msgid "Reachable by"
-msgstr "访问地址"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:162
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:195
-msgid "Locally (127.0.0.1)"
-msgstr "本地(127.0.0.1)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:166
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
-msgid "Everyone (0.0.0.0)"
-msgstr "任何人(0.0.0.0)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:170
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
-msgid "LAN Hosts (Please specify your LAN address)"
-msgstr "局域网(请指定LAN地址)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:186
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205
-msgid "Other"
-msgstr "其他"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:195
-msgid "Outproxies"
-msgstr "出口代理"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
-msgid "Tunnel Destination"
-msgstr "隧道目标"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:214
-msgid "name or destination"
-msgstr "名称或描述"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
-msgid "Shared Client"
-msgstr "共享客户端"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
-msgid ""
-"(Share tunnels with other clients and irc/httpclients? Change requires "
-"restart of client proxy)"
-msgstr "(与其他客户端例如IRC/HTTP共享隧道?修改需要重新启动)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
-msgid "Auto Start"
-msgstr "自动启动"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:232
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
-msgid "(Check the Box for 'YES')"
-msgstr "(选中表示\"是\")"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:249
-msgid "Advanced networking options"
-msgstr "高级网络设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236
-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:238
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:251
-msgid "Tunnel Options"
-msgstr "隧道选项"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:240
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:253
-msgid "Length"
-msgstr "长度"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:260
-msgid "0 hop tunnel (low anonymity, low latency)"
-msgstr "直连(匿名性无,延迟低)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:264
-msgid "1 hop tunnel (medium anonymity, medium latency)"
-msgstr "隧道跳点x1(匿名性中,延迟中)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:255
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:268
-msgid "2 hop tunnel (high anonymity, high latency)"
-msgstr "隧道跳点x2(匿名性高,延迟高)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:259
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:272
-msgid "3 hop tunnel (very high anonymity, poor performance)"
-msgstr "隧道跳点x3(匿名性优,影响性能)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281
-msgid "hop tunnel (very poor performance)"
-msgstr "跳点隧道(严重影响性能)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:273
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:286
-msgid "Variance"
-msgstr "随机变化"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:293
-msgid "0 hop variance (no randomisation, consistant performance)"
-msgstr "隧道长度恒定(随机性无,性能稳定)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:297
-msgid ""
-"+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
-msgstr "隧道长度+ 0-1(随机性中,影响性能)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:288
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:301
-msgid ""
-"+ 0-2 hop variance (high additive randomisation, subtractive performance)"
-msgstr "隧道长度+ 0-2(随机性高,影响性能)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:292
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:305
-msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
-msgstr "隧道长度+/- 0-1(随机性标准,正常性能)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:309
-msgid "+/- 0-2 hop variance (not recommended)"
-msgstr "隧道程度+/- 0-2(不推荐)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:321
-msgid "hop variance"
-msgstr "节点数量"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:313
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:326
-msgid "Count"
-msgstr "计数"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:320
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:333
-msgid "1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)"
-msgstr "出/入站隧道x1(带宽低,低可靠性)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:324
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:337
-msgid ""
-"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
-"reliability)"
-msgstr "出/入站隧道x2(带宽标准,标准稳定性)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:328
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:341
-msgid ""
-"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
-msgstr "出/入站隧道x3(带宽高,高稳定性)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:350
-msgid "tunnels"
-msgstr "隧道"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:342
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:355
-msgid "Backup Count"
-msgstr "备用数量"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:362
-msgid "0 backup tunnels (0 redundancy, no added resource usage)"
-msgstr "无备用隧道(无冗余,不增加资源占用)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:353
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:366
-msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
-msgstr "备用隧道对x1 (低冗余,低资源占用)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:357
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:370
-msgid ""
-"2 backup tunnels each direction (medium redundancy, medium resource usage)"
-msgstr "备用隧道对x2 (中冗余,中资源占用)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:361
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:374
-msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
-msgstr "备用隧道对x3 (高冗余,高资源占用)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:370
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:383
-msgid "backup tunnels"
-msgstr "备用隧道"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:377
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:390
-msgid "Profile"
-msgstr "连接类型"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:384
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:397
-msgid "interactive connection"
-msgstr "速度连接"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
-msgid "bulk connection (downloads/websites/BT)"
-msgstr "效率连接(下载/WEB/BT)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:390
-msgid "Delay Connect"
-msgstr "连接延迟断开"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:394
-msgid "for request/response connections"
-msgstr "单请求/响应连接"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:405
-msgid "I2CP Options"
-msgstr "I2CP选项"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:400
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:146
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:407
-msgid "Host"
-msgstr "主机"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:404
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:152
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:411
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
-msgid "Port"
-msgstr "端口"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:410
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
-msgid "Reduce tunnel quantity when idle"
-msgstr "空闲时缩减隧道数量"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:446
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:445
-msgid "Enable"
-msgstr "启用"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:449
-msgid "Reduced tunnel count"
-msgstr "削减后的隧道数量"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453
-msgid "Idle minutes"
-msgstr "空闲时间(分钟)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:424
-msgid "Close tunnels when idle"
-msgstr "空闲时关闭隧道"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
-msgid "New Keys on Reopen"
-msgstr "重新打开隧道时使用新密钥"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:438
-msgid "Disable"
-msgstr "禁用"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:444
-msgid "Delay tunnel open until required"
-msgstr "仅在请求时打开"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:454
-msgid "Persistent private key"
-msgstr "永久私有密钥"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
-msgid "File"
-msgstr "文件"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:235
-msgid "Local destination"
-msgstr "本地目标"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:468
-msgid "(if known)"
-msgstr "(如果已知)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
-msgid "Custom options"
-msgstr "自定义选项"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493
-msgid ""
-"NOTE: If tunnel is currently running, most changes will not take effect "
-"until tunnel is stopped and restarted."
-msgstr ""
-"注意:如果当前隧道已经启动,设置需要【停止】并重新【启动】相应隧道后才能生"
-"效。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:478
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
-msgid "Cancel"
-msgstr "取消"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499
-msgid "Delete"
-msgstr "删除"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:501
-msgid "Save"
-msgstr "保存"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73
-msgid "I2P Tunnel Manager - Edit Server Tunnel"
-msgstr "I2P隧道管理器 - 编辑服务器隧道"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93
-msgid "Edit server settings"
-msgstr "服务器隧道设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101
-msgid "New server settings"
-msgstr "新建服务器设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:214
-msgid "Website name"
-msgstr "网站名称"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:218
-msgid "(leave blank for outproxies)"
-msgstr "(出口代理这里请置空)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223
-msgid "Private key file"
-msgstr "私钥文件"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
-msgid "Add to local addressbook"
-msgstr "添加至本地地址簿"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:415
-msgid "Encrypt Leaseset"
-msgstr "加密赁集"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:421
-msgid "Encryption Key"
-msgstr "加密密钥"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:425
-msgid "Generate New Key"
-msgstr "生成新密钥"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
-msgid "Generate"
-msgstr "生成"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:487
-msgid "(Tunnel must be stopped first)"
-msgstr "(必须先停止隧道)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
-msgid "Restricted Access List"
-msgstr "限制访问列表"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:437
-msgid "Access List"
-msgstr "访问列表"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:441
-msgid "(Restrict to these clients only)"
-msgstr "(仅允许这些客户访问)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:457
-msgid "New Certificate type"
-msgstr "新建证书类型"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
-msgid "None"
-msgstr "æ— "
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463
-msgid "Hashcash (effort)"
-msgstr "Hashcash (强度)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:469
-msgid "Hashcash Calc Time"
-msgstr "Hashcash 计算时间"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:471
-msgid "Estimate"
-msgstr "ä¼°ç®—"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:473
-msgid "Hidden"
-msgstr "隐藏"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:477
-msgid "Signed (signed by)"
-msgstr "签名(签名者)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:483
-msgid "Modify Certificate"
-msgstr "修改证书"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
-msgid "Modify"
-msgstr "修改"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:71
-msgid "I2P Tunnel Manager - List"
-msgstr "I2P隧道管理器 - 列表"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83
-msgid "Status Messages"
-msgstr "状态信息"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:87
-msgid "Refresh"
-msgstr "刷新"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:91
-msgid "Stop All"
-msgstr "全部停止"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:95
-msgid "Start All"
-msgstr "全部启动"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:99
-msgid "Restart All"
-msgstr "全部重启"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:103
-msgid "Reload Config"
-msgstr "重新载入设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:105
-msgid "I2P Server Tunnels"
-msgstr "I2P服务端隧道"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:109
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:130
-msgid "Points at"
-msgstr "指向"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:111
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:157
-msgid "Preview"
-msgstr "预览"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:250
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:278
-msgid "Status"
-msgstr "状态"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163
-msgid "Base32 Address"
-msgstr "Base32地址"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:171
-msgid "No Preview"
-msgstr "无预览"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285
-msgid "Starting..."
-msgstr "正在启动..."
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:191
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:306
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:320
-msgid "Stop"
-msgstr "停止"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:313
-msgid "Running"
-msgstr "运行中"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:327
-msgid "Stopped"
-msgstr "已停止"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:334
-msgid "Start"
-msgstr "启动"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234
-msgid "New server tunnel"
-msgstr "新建服务器隧道"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:368
-msgid "Standard"
-msgstr "标准"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370
-msgid "Create"
-msgstr "创建"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:240
-msgid "I2P Client Tunnels"
-msgstr "I2P客户端隧道"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:274
-msgid "Interface"
-msgstr "网络接口"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:299
-msgid "Standby"
-msgstr "等待"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346
-msgid "Outproxy"
-msgstr "出口代理"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:350
-msgid "Destination"
-msgstr "目标"
-
-#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366
-msgid "New client tunnel"
-msgstr "新建客户隧道"
-
-#~ msgid "Unimplemented"
-#~ msgstr "尚未实现"
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P i2ptunnel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-03 18:29+0000\n"
+"PO-Revision-Date: 2011-02-12 20:07+0800\n"
+"Last-Translator: \n"
+"Language-Team: foo <foo@bar>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Chinese\n"
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474
+#, 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>."
+msgstr ""
+"域名冲突:要访问您本地【地址簿】中设置的目标主机(相当与IP),请点击<a href="
+"\"{0}\">这里</a>。要访问【地址助手】返回的目标主机请点<a href=\"{1}\">这里</"
+"a>。"
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931
+msgid ""
+"Click a link below to look for an address helper by using a \"jump\" service:"
+msgstr ""
+"请点击下面的链接通过【跳转(Jump)】服务提供的【地址助手】链接跳转至域名对应的"
+"主机:"
+
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326
+#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336
+msgid "internal"
+msgstr "内部"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171
+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:218
+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:230
+msgid "Starting tunnel"
+msgstr "正在启动隧道"
+
+#. and give them something to look at in any case
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243
+msgid "Stopping tunnel"
+msgstr "正在关闭隧道"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311
+msgid "Configuration changes saved"
+msgstr "配置修改成功"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314
+msgid "Failed to save configuration"
+msgstr "配置保存失败"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398
+msgid "New Tunnel"
+msgstr "新建隧道"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418
+msgid "Standard client"
+msgstr "标准客户端"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419
+msgid "HTTP client"
+msgstr "HTTP 客户端"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420
+msgid "IRC client"
+msgstr "IRC 客户端"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421
+msgid "Standard server"
+msgstr "标准服务器"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422
+msgid "HTTP server"
+msgstr "HTTP 服务器"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423
+msgid "SOCKS 4/4a/5 proxy"
+msgstr "SOCKS4/4A/5 代理"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424
+msgid "SOCKS IRC proxy"
+msgstr "SOCKS IRC 代理"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425
+msgid "CONNECT/SSL/HTTPS proxy"
+msgstr "CONNECT/SSL/HTTPS 代理"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426
+msgid "IRC server"
+msgstr "IRC 服务器"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427
+msgid "Streamr client"
+msgstr "Streamr 客户端"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428
+msgid "Streamr server"
+msgstr "Streamr 服务器"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429
+msgid "HTTP bidir"
+msgstr "双向http"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290
+msgid "Host not set"
+msgstr "主机未设置"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272
+msgid "Port not set"
+msgstr "端口未设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Client Tunnel"
+msgstr "I2P 隧道管理器 - 编辑客户端隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93
+msgid "Edit proxy settings"
+msgstr "编辑代理设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101
+msgid "New proxy settings"
+msgstr "新建代理设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:121
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:257
+msgid "Name"
+msgstr "名称"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:246
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279
+msgid "Type"
+msgstr "类型"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386
+msgid "Description"
+msgstr "描述"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:126
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:136
+msgid "Target"
+msgstr "目标"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162
+msgid "Access Point"
+msgstr "接入点"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213
+msgid "required"
+msgstr "必要"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178
+msgid "Reachable by"
+msgstr "访问地址"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180
+msgid "Outproxies"
+msgstr "出口代理"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187
+msgid "Tunnel Destination"
+msgstr "隧道目标"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199
+msgid "name or destination"
+msgstr "名称或描述"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
+msgid "b32 not recommended"
+msgstr "请避免使用b32地址。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208
+msgid "Shared Client"
+msgstr "共享客户端"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212
+msgid ""
+"(Share tunnels with other clients and irc/httpclients? Change requires "
+"restart of client proxy)"
+msgstr "(与其他客户端例如IRC/HTTP共享隧道?修改需要重新启动)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
+msgid "Auto Start"
+msgstr "自动启动"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
+msgid "(Check the Box for 'YES')"
+msgstr "(选中表示\"是\")"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243
+msgid "Advanced networking options"
+msgstr "高级网络设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224
+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:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245
+msgid "Tunnel Options"
+msgstr "隧道选项"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247
+msgid "Length"
+msgstr "长度"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254
+msgid "0 hop tunnel (low anonymity, low latency)"
+msgstr "直连(匿名性无,延迟低)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258
+msgid "1 hop tunnel (medium anonymity, medium latency)"
+msgstr "隧道跳点x1(匿名性中,延迟中)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262
+msgid "2 hop tunnel (high anonymity, high latency)"
+msgstr "隧道跳点x2(匿名性高,延迟高)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266
+msgid "3 hop tunnel (very high anonymity, poor performance)"
+msgstr "隧道跳点x3(匿名性优,影响性能)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
+msgid "hop tunnel (very poor performance)"
+msgstr "跳点隧道(严重影响性能)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280
+msgid "Variance"
+msgstr "随机变化"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287
+msgid "0 hop variance (no randomisation, consistant performance)"
+msgstr "隧道长度恒定(随机性无,性能稳定)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
+msgid ""
+"+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
+msgstr "隧道长度+ 0-1(随机性中,影响性能)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295
+msgid ""
+"+ 0-2 hop variance (high additive randomisation, subtractive performance)"
+msgstr "隧道长度+ 0-2(随机性高,影响性能)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299
+msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
+msgstr "隧道长度+/- 0-1(随机性标准,正常性能)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
+msgid "+/- 0-2 hop variance (not recommended)"
+msgstr "隧道程度+/- 0-2(不推荐)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315
+msgid "hop variance"
+msgstr "节点数量"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
+msgid "Count"
+msgstr "计数"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327
+msgid "1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)"
+msgstr "出/入站隧道x1(带宽低,低可靠性)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331
+msgid ""
+"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard "
+"reliability)"
+msgstr "出/入站隧道x2(带宽标准,标准稳定性)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335
+msgid ""
+"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
+msgstr "出/入站隧道x3(带宽高,高稳定性)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
+msgid "tunnels"
+msgstr "隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349
+msgid "Backup Count"
+msgstr "备用数量"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356
+msgid "0 backup tunnels (0 redundancy, no added resource usage)"
+msgstr "无备用隧道(无冗余,不增加资源占用)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
+msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
+msgstr "备用隧道对x1 (低冗余,低资源占用)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
+msgid ""
+"2 backup tunnels each direction (medium redundancy, medium resource usage)"
+msgstr "备用隧道对x2 (中冗余,中资源占用)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
+msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
+msgstr "备用隧道对x3 (高冗余,高资源占用)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377
+msgid "backup tunnels"
+msgstr "备用隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
+msgid "Profile"
+msgstr "连接类型"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391
+msgid "interactive connection"
+msgstr "速度连接"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395
+msgid "bulk connection (downloads/websites/BT)"
+msgstr "效率连接(下载/WEB/BT)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378
+msgid "Delay Connect"
+msgstr "连接延迟断开"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382
+msgid "for request/response connections"
+msgstr "单请求/响应连接"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399
+msgid "Router I2CP Address"
+msgstr "路由器I2CP地址"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401
+msgid "Host"
+msgstr "主机"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
+msgid "Port"
+msgstr "端口"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479
+msgid "Reduce tunnel quantity when idle"
+msgstr "空闲时缩减隧道数量"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481
+msgid "Enable"
+msgstr "启用"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485
+msgid "Reduced tunnel count"
+msgstr "削减后的隧道数量"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489
+msgid "Idle minutes"
+msgstr "空闲时间(分钟)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
+msgid "Close tunnels when idle"
+msgstr "空闲时关闭隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
+msgid "New Keys on Reopen"
+msgstr "重新打开隧道时使用新密钥"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435
+msgid "Disable"
+msgstr "禁用"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
+msgid "Delay tunnel open until required"
+msgstr "仅在请求时打开"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
+msgid "Persistent private key"
+msgstr "永久私有密钥"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
+msgid "File"
+msgstr "文件"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220
+msgid "Local destination"
+msgstr "本地目标"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
+msgid "(if known)"
+msgstr "(如果已知)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470
+msgid "Local Authorization"
+msgstr "本地认证"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490
+msgid "Username"
+msgstr "用户名"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494
+msgid "Password"
+msgstr "密码"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484
+msgid "Outproxy Authorization"
+msgstr "出口代理认证"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502
+msgid "Jump URL List"
+msgstr "跳转服务列表"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525
+msgid "Custom options"
+msgstr "自定义选项"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529
+msgid ""
+"NOTE: If tunnel is currently running, most changes will not take effect "
+"until tunnel is stopped and restarted."
+msgstr ""
+"注意:如果当前隧道已经启动,设置需要【停止】并重新【启动】相应隧道后才能生"
+"效。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531
+msgid "Cancel"
+msgstr "取消"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535
+msgid "Delete"
+msgstr "删除"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537
+msgid "Save"
+msgstr "保存"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Server Tunnel"
+msgstr "I2P隧道管理器 - 编辑服务器隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93
+msgid "Edit server settings"
+msgstr "服务器隧道设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101
+msgid "New server settings"
+msgstr "新建服务器设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199
+msgid "Website name"
+msgstr "网站名称"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203
+msgid "(leave blank for outproxies)"
+msgstr "(出口代理这里请置空)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208
+msgid "Private key file"
+msgstr "私钥文件"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
+msgid "Add to local addressbook"
+msgstr "添加至本地地址簿"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237
+msgid "Hostname Signature"
+msgstr "主机名签名"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417
+msgid "Encrypt Leaseset"
+msgstr "加密赁集"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423
+msgid "Encryption Key"
+msgstr "加密密钥"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427
+msgid "Generate New Key"
+msgstr "生成新密钥"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429
+msgid "Generate"
+msgstr "生成"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523
+msgid "(Tunnel must be stopped first)"
+msgstr "(必须先停止隧道)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433
+msgid "Restricted Access List"
+msgstr "限制访问列表"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439
+msgid "Whitelist"
+msgstr "白名单"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443
+msgid "Blacklist"
+msgstr "黑名单"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447
+msgid "Access List"
+msgstr "访问列表"
+
+# disable=>noLimit
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451
+msgid "Inbound connection limits (0=unlimited)"
+msgstr "入站连接限制(0=无限制)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453
+msgid "Per client"
+msgstr "按客户端"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455
+msgid "Per minute"
+msgstr "按分钟"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459
+msgid "Per hour"
+msgstr "按小时"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463
+msgid "Per day"
+msgstr "按天"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467
+msgid "Total"
+msgstr "总数"
+
+# disable=>noLimit
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475
+msgid "Max concurrent connections (0=unlimited)"
+msgstr "最大并发连接数(0=无限制)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493
+msgid "New Certificate type"
+msgstr "新建证书类型"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495
+msgid "None"
+msgstr "æ— "
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499
+msgid "Hashcash (effort)"
+msgstr "Hashcash (强度)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505
+msgid "Hashcash Calc Time"
+msgstr "Hashcash 计算时间"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507
+msgid "Estimate"
+msgstr "ä¼°ç®—"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509
+msgid "Hidden"
+msgstr "隐藏"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513
+msgid "Signed (signed by)"
+msgstr "签名(签名者)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519
+msgid "Modify Certificate"
+msgstr "修改证书"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521
+msgid "Modify"
+msgstr "修改"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:71
+msgid "I2P Tunnel Manager - List"
+msgstr "I2P隧道管理器 - 列表"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83
+msgid "Status Messages"
+msgstr "状态信息"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:87
+msgid "Refresh"
+msgstr "刷新"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:91
+msgid "Stop All"
+msgstr "全部停止"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:95
+msgid "Start All"
+msgstr "全部启动"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:99
+msgid "Restart All"
+msgstr "全部重启"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:103
+msgid "Reload Config"
+msgstr "重新载入设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:105
+msgid "I2P Server Tunnels"
+msgstr "I2P服务端隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:109
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:130
+msgid "Points at"
+msgstr "指向"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:157
+msgid "Preview"
+msgstr "预览"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:297
+msgid "Status"
+msgstr "状态"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163
+msgid "Base32 Address"
+msgstr "Base32地址"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:171
+msgid "No Preview"
+msgstr "无预览"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304
+msgid "Starting..."
+msgstr "正在启动..."
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:191
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339
+msgid "Stop"
+msgstr "停止"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:332
+msgid "Running"
+msgstr "运行中"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346
+msgid "Stopped"
+msgstr "已停止"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:353
+msgid "Start"
+msgstr "启动"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234
+msgid "New server tunnel"
+msgstr "新建服务器隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396
+msgid "Standard"
+msgstr "标准"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:398
+msgid "Create"
+msgstr "创建"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:240
+msgid "I2P Client Tunnels"
+msgstr "I2P客户端隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283
+msgid "Interface"
+msgstr "网络接口"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318
+msgid "Standby"
+msgstr "等待"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363
+msgid "Outproxy"
+msgstr "出口代理"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
+msgid "Destination"
+msgstr "目标"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381
+msgid "none"
+msgstr "æ— "
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394
+msgid "New client tunnel"
+msgstr "新建客户隧道"
+
+#~ msgid "Locally (127.0.0.1)"
+#~ msgstr "本地(127.0.0.1)"
+
+#~ msgid "Everyone (0.0.0.0)"
+#~ msgstr "任何人(0.0.0.0)"
+
+#~ msgid "LAN Hosts (Please specify your LAN address)"
+#~ msgstr "局域网(请指定LAN地址)"
+
+#~ msgid "Other"
+#~ msgstr "其他"
+
+#~ msgid "I2CP Options"
+#~ msgstr "I2CP选项"
+
+#~ msgid "(Restrict to these clients only)"
+#~ msgstr "(仅允许这些客户访问)"
+
+#~ msgid "Unimplemented"
+#~ msgstr "尚未实现"
diff --git a/apps/jetty/build.xml b/apps/jetty/build.xml
index a45f9df6217a599307cf0b47c6de4f24038e2d4e..a4ba71e07b3e0a0f4671b57e175abc3a2f6910e1 100644
--- a/apps/jetty/build.xml
+++ b/apps/jetty/build.xml
@@ -96,14 +96,39 @@
             srcdir="./java/src" 
             debug="true" source="1.5" target="1.5" 
             destdir="./build/obj" 
+            includeAntRuntime="false"
             classpath="./jettylib/commons-logging.jar:./jettylib/javax.servlet.jar:./jettylib/org.mortbay.jetty.jar" >
             <compilerarg line="${javac.compilerargs}" />
         </javac>
     </target>
-    <target name="jar" depends="compile">
+
+    <target name="jar" depends="compile, jarUpToDate" unless="jar.uptodate" >
+        <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="." />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
         <jar destfile="./jettylib/org.mortbay.jetty.jar" basedir="./build/obj" includes="**/*.class" update="true" >
+            <manifest>
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
+            </manifest>
         </jar>
     </target>    
+
+    <target name="jarUpToDate">
+        <uptodate property="jar.uptodate" targetfile="jettylib/org.mortbay.jetty.jar" >
+            <srcfiles dir= "build/obj" includes="**/*.class" />
+        </uptodate>
+    </target>    
+
     <target name="clean" >
         <delete dir="./build" />
         <delete file="${verified.filename}" />
diff --git a/apps/jetty/java/src/org/mortbay/http/handler/ResourceHandler.java b/apps/jetty/java/src/org/mortbay/http/handler/ResourceHandler.java
index 5515df2269322b11b57a151b7bb78f3aa9f05b32..d1a57159bf0ab75ad44f4c1634f49975141cf3ea 100644
--- a/apps/jetty/java/src/org/mortbay/http/handler/ResourceHandler.java
+++ b/apps/jetty/java/src/org/mortbay/http/handler/ResourceHandler.java
@@ -47,7 +47,7 @@ import org.mortbay.util.URI;
  * HTTP/1.1 ranges are supported.
  * 
  * @version $Id: ResourceHandler.java,v 1.66 2005/08/24 08:18:17 gregwilkins Exp $
- * @author Nuno Preguiça
+ * @author Nuno Pregui?a (sorry, wasn't UTF-8)
  * @author Greg Wilkins
  */
 public class ResourceHandler extends AbstractHttpHandler
diff --git a/apps/ministreaming/java/build.xml b/apps/ministreaming/java/build.xml
index c22676d264b54b39d0768eee5c6972472be4d043..8fcd2d517c8aa9c16a5b98543b5083eb83209d4e 100644
--- a/apps/ministreaming/java/build.xml
+++ b/apps/ministreaming/java/build.xml
@@ -24,13 +24,40 @@
         <mkdir dir="./build" />
         <mkdir dir="./build/obj" />
         <!-- half of this is deprecated classes so turn deprecation off -->
-        <javac srcdir="./src" debug="true" deprecation="off" source="1.5" target="1.5" destdir="./build/obj" classpath="../../../core/java/build/i2p.jar" >
+        <javac srcdir="./src" debug="true" deprecation="off" source="1.5" target="1.5"
+               includeAntRuntime="false"
+               destdir="./build/obj" classpath="../../../core/java/build/i2p.jar" >
             <compilerarg line="${javac.compilerargs}" />
         </javac>
     </target>
-    <target name="jar" depends="compile">
-        <jar destfile="./build/mstreaming.jar" basedir="./build/obj" includes="**/*.class" />
+
+    <target name="jar" depends="compile, jarUpToDate" unless="jar.uptodate" >
+        <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="." />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
+        <jar destfile="./build/mstreaming.jar" basedir="./build/obj" includes="**/*.class" >
+            <manifest>
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
+            </manifest>
+        </jar>
     </target>
+
+    <target name="jarUpToDate">
+        <uptodate property="jar.uptodate" targetfile="build/mstreaming.jar" >
+            <srcfiles dir= "." includes="build/obj/**/*.class" />
+        </uptodate>
+    </target>
+
     <target name="javadoc">
         <mkdir dir="./build" />
         <mkdir dir="./build/javadoc" />
diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/ByteCollector.java b/apps/ministreaming/java/src/net/i2p/client/streaming/ByteCollector.java
index 39249b449266897fadcefb03b2b82299987f1827..38d96ddb742a04edbd344abfb3fe48c65961dcf3 100644
--- a/apps/ministreaming/java/src/net/i2p/client/streaming/ByteCollector.java
+++ b/apps/ministreaming/java/src/net/i2p/client/streaming/ByteCollector.java
@@ -4,6 +4,7 @@ package net.i2p.client.streaming;
  * Like a StringBuffer, but for bytes.  This class is not internally synchronized,
  * so care should be taken when using in a multithreaded environment.
  *
+ * @deprecated Only used by deprecated I2PSocketImpl
  */
 class ByteCollector {
     byte[] contents;
@@ -294,4 +295,4 @@ class ByteCollector {
             size = 0;
         return bb;
     }
-}
\ No newline at end of file
+}
diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketEepGet.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketEepGet.java
index 834c52160c506e13f818e03f1200d9a5d7c97f69..d68270bc62aed4a90e3a1023141940ca2c547a3f 100644
--- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketEepGet.java
+++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketEepGet.java
@@ -59,7 +59,6 @@ public class I2PSocketEepGet extends EepGet {
         // public EepGet(I2PAppContext ctx, boolean shouldProxy, String proxyHost, int proxyPort, int numRetries, long minSize, long maxSize, String outputFile, OutputStream outputStream, String url, boolean allowCaching, String etag, String postData) {
         super(ctx, false, null, -1, numRetries, minSize, maxSize, outputFile, outputStream, url, true, null, null);
         _socketManager = mgr;
-        _log = ctx.logManager().getLog(I2PSocketEepGet.class);
     }
    
     /**
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 02bef1a0aebba569c7419491f6ab6ce1f0e384d9..1651d40d2cbbe2adee60c5bf5a66e1d53ea404cd 100644
--- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManager.java
+++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManager.java
@@ -4,9 +4,12 @@
  */
 package net.i2p.client.streaming;
 
+import java.io.IOException;
 import java.io.InterruptedIOException;
 import java.net.ConnectException;
 import java.net.NoRouteToHostException;
+import java.net.ServerSocket;
+import java.net.Socket;
 import java.util.Properties;
 import java.util.Set;
 
@@ -84,7 +87,7 @@ public interface I2PSocketManager {
      *
      * @return a set of currently connected I2PSockets
      */
-    public Set listSockets();
+    public Set<I2PSocket> listSockets();
 
     /**
      * Ping the specified peer, returning true if they replied to the ping within 
@@ -107,4 +110,25 @@ public interface I2PSocketManager {
     public static interface DisconnectListener {
         public void sessionDisconnected();
     }
+
+    /**
+     *  Like getServerSocket but returns a real ServerSocket for easier porting of apps.
+     *  @since 0.8.4
+     */
+    public ServerSocket getStandardServerSocket() throws IOException;
+
+    /**
+     *  Like connect() but returns a real Socket, and throws only IOE,
+     *  for easier porting of apps.
+     *  @since 0.8.4
+     */
+    public Socket connectToSocket(Destination peer) throws IOException;
+
+    /**
+     *  Like connect() but returns a real Socket, and throws only IOE,
+     *  for easier porting of apps.
+     *  @param timeout ms if > 0, forces blocking (disables connectDelay)
+     *  @since 0.8.4
+     */
+    public Socket connectToSocket(Destination peer, int timeout) throws IOException;
 }
diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerImpl.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerImpl.java
index fb2589b52bdc5ec2ed1d0e2368e17f13845c3099..e0a5b022fec16a1e682a02924de8d39903cd0f31 100644
--- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerImpl.java
+++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerImpl.java
@@ -10,6 +10,8 @@ import java.io.InterruptedIOException;
 import java.io.UnsupportedEncodingException;
 import java.net.ConnectException;
 import java.net.NoRouteToHostException;
+import java.net.ServerSocket;
+import java.net.Socket;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -461,6 +463,14 @@ class I2PSocketManagerImpl implements I2PSocketManager, I2PSessionListener {
         return _serverSocket;
     }
 
+    /**
+     *  @throws UnsupportedOperationException
+     *  @since 0.8.4
+     */
+    public ServerSocket getStandardServerSocket() {
+        throw new UnsupportedOperationException();
+    }
+
     /**
      * Create a new connected socket (block until the socket is created)
      *
@@ -601,6 +611,22 @@ class I2PSocketManagerImpl implements I2PSocketManager, I2PSessionListener {
         return connect(peer, null);
     }
 
+    /**
+     *  @throws UnsupportedOperationException
+     *  @since 0.8.4
+     */
+    public Socket connectToSocket(Destination peer) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     *  @throws UnsupportedOperationException
+     *  @since 0.8.4
+     */
+    public Socket connectToSocket(Destination peer, int timeout) {
+        throw new UnsupportedOperationException();
+    }
+
     /**
      * Destroy the socket manager, freeing all the associated resources.  This
      * method will block untill all the managed sockets are closed.
@@ -660,7 +686,7 @@ class I2PSocketManagerImpl implements I2PSocketManager, I2PSessionListener {
      * Retrieve a set of currently connected I2PSockets, either initiated locally or remotely.
      *
      */
-    public Set listSockets() {
+    public Set<I2PSocket> listSockets() {
         Set<I2PSocket> sockets = new HashSet<I2PSocket>(8);
         synchronized (lock) {
             sockets.addAll(_inSockets.values());
diff --git a/apps/routerconsole/java/bmsg.sh b/apps/routerconsole/java/bmsg.sh
deleted file mode 100644
index b9d294b32336537241eb2f9953fb65673c93b524..0000000000000000000000000000000000000000
--- a/apps/routerconsole/java/bmsg.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Update messages_xx.po and messages_xx.class files,
-# from both java and jsp sources.
-# Requires installed programs xgettext, msgfmt, msgmerge, and find.
-# zzz - public domain
-#
-
-## launching sh.exe with -login parameter will open a shell with the current path always pointing to \bin\
-## need to cd into our orignal path - where we call sh.exe from.
-
-cd $CALLFROM
-## echo $PWD
-
-## except this everything is the same with bundle-message.sh
-## walking - public domain :-D
-
-source bundle-messages.sh $PARAS
\ No newline at end of file
diff --git a/apps/routerconsole/java/build.xml b/apps/routerconsole/java/build.xml
index d544e59aca580f961ad5bbf2d8d24d570bba654b..dc686d29c17c9ffaf73314f075d3c9e64a7d2e5c 100644
--- a/apps/routerconsole/java/build.xml
+++ b/apps/routerconsole/java/build.xml
@@ -24,6 +24,7 @@
                 <pathelement location="../../jetty/jettylib/javax.servlet.jar" />
                 <pathelement location="../../systray/java/build/obj" />
                 <pathelement location="../../systray/java/lib/systray4j.jar" />
+                <pathelement location="../../desktopgui/build" />
                 <pathelement location="../../../installer/lib/wrapper/win32/wrapper.jar" /> <!-- we dont care if we're not on win32 -->
                 <pathelement location="../../jrobin/jrobin-1.4.0.jar" />
             </classpath>
@@ -45,6 +46,7 @@
         <javac 
             srcdir="./src" 
             debug="true" deprecation="on" source="1.5" target="1.5" 
+            includeAntRuntime="false"
             destdir="./build/obj">
             <compilerarg line="${javac.compilerargs}" />
             <classpath>
@@ -54,45 +56,74 @@
                 <pathelement location="../../jetty/jettylib/javax.servlet.jar" />
                 <pathelement location="../../systray/java/build/systray.jar" />
                 <pathelement location="../../systray/java/lib/systray4j.jar" />
+                <pathelement location="../../desktopgui/dist/desktopgui.jar" />
                 <pathelement location="../../../installer/lib/wrapper/win32/wrapper.jar" /> <!-- we dont care if we're not on win32 -->
                 <pathelement location="../../jrobin/jrobin-1.4.0.jar" />
             </classpath>
         </javac>
     </target>
-    <target name="jar" depends="compile">
+
+    <!-- the jar with the latest message classes from the jsps, and the war too -->
+    <target name="jar" depends="jar1, war, bundle" />
+
+    <!-- the jar without the latest message classes from the jsps -->
+    <target name="jar1" depends="compile, jarUpToDate" unless="jar.uptodate" >
+        <exec executable="mtn" outputproperty="workspace.changes.j" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="." />
+            <arg value="../locale" />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes.j}" outputproperty="workspace.changes.j.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
         <jar destfile="./build/routerconsole.jar" basedir="./build/obj" includes="**/*.class">
             <manifest>
                 <!-- top level installer will rename to jrobin.jar -->
-                <attribute name="Class-Path" value="i2p.jar router.jar jrobin.jar" />
+                <!-- DTG added in 0.8.4, not in the classpath for very old installs, before we changed wrapper.config to specify * -->
+                <attribute name="Class-Path" value="i2p.jar router.jar jrobin.jar desktopgui.jar" />
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.j.tr}" />
             </manifest>
         </jar>
-        <delete dir="./tmpextract" />
        <!-- jrobin taken out of routerconsole.jar in 0.7.12
+        <delete dir="./tmpextract" />
         <unjar src="../../jrobin/jrobin-1.4.0.jar" dest="./tmpextract" />
         <jar destfile="./build/routerconsole.jar" basedir="./tmpextract" update="true" />
         <delete dir="./tmpextract" />
        -->
-        
-        <ant target="war" />
+    </target>
 
+    <!-- this is tricky because the message classes go in the jar, not in the war -->
+    <target name="bundle" depends="jar1, precompilejsp" >
         <!-- Update the messages_*.po files.
              We need to supply the bat file for windows, and then change the fail property to true -->
-        <exec executable="sh" osfamily="unix" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="unix" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="sh" osfamily="mac" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="mac" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="false" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+		<!-- multi-lang is optional -->
+        <exec executable="sh" osfamily="windows" failifexecutionfails="false" >
+            <arg value="./bundle-messages.sh" />
         </exec>
         <!-- jar again to get the latest messages_*.class files -->
         <jar destfile="./build/routerconsole.jar" basedir="./build/obj" includes="**/*.class" update="true" />
     </target>
 
-    <target name="poupdate" depends="build">
-        <ant target="war" />
+
+    <target name="jarUpToDate">
+        <uptodate property="jar.uptodate" targetfile="build/routerconsole.jar" >
+            <srcfiles dir= "build/obj" includes="**/*.class" />
+        </uptodate>
+    </target>
+
+    <target name="poupdate" depends="precompilejsp">
         <!-- Update the messages_*.po files.
              We need to supply the bat file for windows, and then change the fail property to true -->
         <exec executable="sh" osfamily="unix" failifexecutionfails="true" >
@@ -103,19 +134,43 @@
             <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="true" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
     </target>
-    <target name="war" depends="precompilejsp">
+
+    <!-- does NOT update the message classes, as those go in the jar -->
+    <target name="war" depends="precompilejsp, warUpToDate" unless="war.uptodate" >
+        <exec executable="mtn" outputproperty="workspace.changes.w" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="../jsp" />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes.w}" outputproperty="workspace.changes.w.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
         <!-- Don't include the css in the war, the main build.xml will copy it to docs/themes/console/ -->
         <war destfile="build/routerconsole.war" webxml="../jsp/web-out.xml"
              basedir="../jsp/" excludes="web.xml, *.css, **/*.java, *.jsp, *.jsi, web-fragment.xml, web-out.xml">
+            <manifest>
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.w.tr}" />
+            </manifest>
         </war>
     </target>
-    <target name="precompilejsp" unless="precompilejsp.uptodate">
+
+    <target name="warUpToDate">
+        <uptodate property="war.uptodate" targetfile="build/routerconsole.war" >
+            <srcfiles dir= "../jsp" excludes="web.xml, web-fragment.xml, *.css, **/*.java, *.jsp, *.jsi" />
+        </uptodate>
+    </target>
+
+    <target name="precompilejsp" depends="jar1" unless="precompilejsp.uptodate">
         <delete dir="../jsp/WEB-INF/" />
         <delete file="../jsp/web-fragment.xml" />
         <delete file="../jsp/web-out.xml" />
@@ -161,6 +216,7 @@
                 <pathelement location="../../jetty/jettylib/ant.jar" />
                 <pathelement location="../../systray/java/build/obj" />
                 <pathelement location="../../systray/java/lib/systray4j.jar" />
+                <pathelement location="../../desktopgui/dist/desktopgui.jar" />
                 <pathelement location="../../../installer/lib/wrapper/win32/wrapper.jar" />
                 <pathelement location="build/routerconsole.jar" />
                 <pathelement location="build/" />
@@ -180,6 +236,7 @@
         
         <javac debug="true" deprecation="on" source="1.5" target="1.5" 
                encoding="UTF-8"
+               includeAntRuntime="false"
                destdir="../jsp/WEB-INF/classes/" 
                srcdir="../jsp/WEB-INF/classes" includes="**/*.java">
             <compilerarg line="${javac.compilerargs}" />
@@ -191,6 +248,7 @@
                 <pathelement location="../../jetty/jettylib/org.mortbay.jetty.jar" />
                 <pathelement location="../../systray/java/build/obj" />
                 <pathelement location="../../systray/java/lib/systray4j.jar" />
+                <pathelement location="../../desktopgui/dist/desktopgui.jar" />
                 <pathelement location="../../../installer/lib/wrapper/win32/wrapper.jar" />
                 <pathelement location="build/routerconsole.jar" />
                 <pathelement location="build" />
@@ -213,14 +271,14 @@
     </target>
 
     <uptodate property="precompilejsp.uptodate" targetfile="../jsp/web-out.xml">
-        <srcfiles dir= "../jsp" includes="**/*.jsp, **/*.html, *.css, susimail/susimail, web.xml"/>
+        <srcfiles dir= "../jsp" includes="**/*.jsp, *.jsi, **/*.html, *.css, susimail/susimail, web.xml"/>
     </uptodate>
 
     <target name="javadoc">
         <mkdir dir="./build" />
         <mkdir dir="./build/javadoc" />
         <javadoc 
-            sourcepath="./src:../../../core/java/src:../../../router/java/src:../../systray/java/src" destdir="./build/javadoc" 
+            sourcepath="./src:../../../core/java/src:../../../router/java/src:../../systray/java/src:../../desktopgui/src" destdir="./build/javadoc" 
             packagenames="*" 
             use="true" 
             splitindex="true" 
diff --git a/apps/routerconsole/java/bundle-messages.bat b/apps/routerconsole/java/bundle-messages.bat
deleted file mode 100644
index 90feca972a6457eebf97f9bdbea6028ac88d7789..0000000000000000000000000000000000000000
--- a/apps/routerconsole/java/bundle-messages.bat
+++ /dev/null
@@ -1,26 +0,0 @@
-@echo off
-set Callfrom=%cd%
-set Paras=%1
-
-rem before calling make sure you have msys and mingw 's "bin" path 
-rem in your current searching path
-rem type "set path" to check 
-if not exist ..\locale\*.only goto updateALL
-
-rem put a messages_xx.only(eg messages_zh.only) into locale folder
-rem this script will only touch the po file(eg zh) you specified, leaving other po files untact.
-
-for %%i in (..\locale\*.only) do set PO=%%~ni
-echo [Notice] Yu choose to Ony update the choosen file: %PO%.po 
-for %%i in (..\locale\*.po) do if not %%~ni==%PO% ren %%i %%~ni.po-
-
-call sh --login %cd%\bmsg.sh
-
-for %%i in (..\locale\*.po-) do if not %%~ni==%PO% ren %%i %%~ni.po
-goto end
-
-:updateALL
-call sh --login %cd%\bmsg.sh
-
-:end
-echo End of Message Bundling
\ No newline at end of file
diff --git a/apps/routerconsole/java/bundle-messages.sh b/apps/routerconsole/java/bundle-messages.sh
index dd422bf064c0251f0838e7acc51a3f7d31a60b3e..1f8ecc3a4715235ae081cea4b89e4ee28f3354c4 100755
--- a/apps/routerconsole/java/bundle-messages.sh
+++ b/apps/routerconsole/java/bundle-messages.sh
@@ -18,6 +18,14 @@ then
 	POUPDATE=1
 fi
 
+# on windows, one must specify the path of commnad find
+# since windows has its own retarded version of find.
+if which find|grep -q -i windows ; then
+	export PATH=.:/bin:/usr/local/bin:$PATH
+fi
+# Fast mode - update ondemond
+# set LG2 to the language you need in envrionment varibales to enable this
+
 #
 # generate strings/Countries.java from ../../../installer/resources/countries.txt
 #
@@ -44,7 +52,9 @@ ROUTERFILES="\
    ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java \
    ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java \
    ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java \
-   ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java"
+   ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java \
+   ../../../router/java/src/net/i2p/router/transport/UPnP.java \
+   ../../../router/java/src/net/i2p/router/transport/UPnPManager.java"
 
 # add ../java/ so the refs will work in the po file
 JPATHS="../java/src ../jsp/WEB-INF ../java/strings $JFILE $ROUTERFILES"
@@ -53,6 +63,11 @@ do
 	# get language
 	LG=${i#../locale/messages_}
 	LG=${LG%.po}
+	
+	# skip, if specified
+	if [ $LG2 ]; then
+		[ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only.
+	fi
 
 	if [ "$POUPDATE" = "1" ]
 	then
@@ -106,15 +121,19 @@ do
 		touch $i
 	fi
 
-	echo "Generating ${CLASS}_$LG ResourceBundle..."
+    if [ "$LG" != "en" ]
+    then
+        # only generate for non-source language
+        echo "Generating ${CLASS}_$LG ResourceBundle..."
 
-	# convert to class files in build/obj
-	msgfmt --java --statistics -r $CLASS -l $LG -d build/obj $i
-	if [ $? -ne 0 ]
-	then
-		echo 'Warning - msgfmt failed, not updating translations'
-		break
-	fi
+        # convert to class files in build/obj
+        msgfmt --java --statistics -r $CLASS -l $LG -d build/obj $i
+        if [ $? -ne 0 ]
+        then
+            echo 'Warning - msgfmt failed, not updating translations'
+            break
+        fi
+    fi
 done
 rm -f $TMPFILE
 # todo: return failure
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java
index 013216ad3248887fa47646116ff3d366b47bc385..7f6f9455fe1e227c144a1fde73bf860e1ebc3e31 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java
@@ -28,10 +28,13 @@ public class CSSHelper extends HelperBase {
         return url;
     }
 
-    /** change default language for the router but don't save it */
+    /** change default language for the router AND save it */
     public void setLang(String lang) {
-        if (lang != null && lang.length() > 0)
+        // Protected with nonce in css.jsi
+        if (lang != null && lang.length() == 2 && !lang.equals(_context.getProperty(Messages.PROP_LANG))) {
             _context.router().setConfigSetting(Messages.PROP_LANG, lang);
+            _context.router().saveConfig();
+        }
     }
 
     /** needed for conditional css loads for zh */
@@ -60,4 +63,32 @@ public class CSSHelper extends HelperBase {
             .append("</title>");
          return buf.toString();
     }
+
+    /**
+     *  Should we allow a refreshing IFrame?
+     *  @since 0.8.5
+     */
+    public boolean allowIFrame(String ua) {
+        return ua == null ||
+                               // text
+                             !(ua.startsWith("Lynx") || ua.startsWith("w3m") ||
+                               ua.startsWith("ELinks") || ua.startsWith("Links") ||
+                               ua.startsWith("Dillo") ||
+                               // mobile
+                               // http://www.zytrax.com/tech/web/mobile_ids.html
+                               ua.contains("Android") || ua.contains("iPhone") ||
+                               ua.contains("iPod") || ua.contains("iPad") ||
+                               ua.contains("Kindle") || ua.contains("Mobile") ||
+                               ua.contains("Nintendo Wii") || ua.contains("Opera Mini") ||
+                               ua.contains("Palm") ||
+                               ua.contains("PLAYSTATION") || ua.contains("Playstation") ||
+                               ua.contains("Profile/MIDP-") || ua.contains("SymbianOS") ||
+                               ua.contains("Windows CE") || ua.contains("Windows Phone") ||
+                               ua.startsWith("BlackBerry") || ua.startsWith("DoCoMo") ||
+                               ua.startsWith("Nokia") || ua.startsWith("OPWV-SDK") ||
+                               ua.startsWith("MOT-") || ua.startsWith("SAMSUNG-") ||
+                               ua.startsWith("nook") || ua.startsWith("SCH-") ||
+                               ua.startsWith("SEC-") || ua.startsWith("SonyEricsson") ||
+                               ua.startsWith("Vodafone"));
+    }
 }
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 4ce5c5b99ac476dc09fc332c5e953deb5e918e56..352df72eedd731fce17254b3d9f61378fc01f1ee 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java
@@ -105,7 +105,9 @@ public class ConfigClientsHelper extends HelperBase {
         for (int cur = 0; cur < clients.size(); cur++) {
             ClientAppConfig ca = clients.get(cur);
             renderForm(buf, ""+cur, ca.clientName, false, !ca.disabled,
-                       "webConsole".equals(ca.clientName) || "Web console".equals(ca.clientName),
+                       // dangerous, but allow editing the console args too
+                       //"webConsole".equals(ca.clientName) || "Web console".equals(ca.clientName),
+                       false,
                        ca.className + ((ca.args != null) ? " " + ca.args : ""), (""+cur).equals(_edit),
                        true, false, false, true, ca.disabled);
         }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java
index 9388d06d2a45fc2ed5669b755d5f91e8ce9197fc..6dd3aa987ada615be2a89376107b6fe631e41f79 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java
@@ -100,7 +100,7 @@ public class ConfigNetHelper extends HelperBase {
     }
 
     public String getTcpAutoIPChecked(int mode) {
-        boolean enabled = TransportManager.enableNTCP(_context);
+        boolean enabled = TransportManager.isNTCPEnabled(_context);
         String hostname = _context.getProperty(PROP_I2NP_NTCP_HOSTNAME); 
         boolean specified = hostname != null && hostname.length() > 0;
         String auto = _context.getProperty(PROP_I2NP_NTCP_AUTO_IP, "false");
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHelper.java
index ec5337cc5138d03ec8e0d86f2520a0cce0a40684..249f5de59bb1a981bb0e3820ee7f5868138c73a7 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHelper.java
@@ -22,7 +22,7 @@ public class ConfigReseedHelper extends HelperBase {
 
     public String modeChecked(int mode) {
         boolean required =  _context.getBooleanProperty(Reseeder.PROP_SSL_REQUIRED);
-        boolean disabled =  _context.getBooleanProperty(Reseeder.PROP_SSL_DISABLE);
+        boolean disabled =  _context.getBooleanPropertyDefaultTrue(Reseeder.PROP_SSL_DISABLE);
         if ((mode == 0 && (!disabled) && (!required)) ||
             (mode == 1 && (!disabled) && required) ||
             (mode == 2 && disabled))
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java
index ce4dc8863d6e3f80526488bc3aa2b55b7a45e591..7b1d7bc629be1ed2a2405bfedacb94010b44285a 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java
@@ -88,30 +88,6 @@ public class ConfigServiceHandler extends FormHandler {
                 addFormError("Warning: unable to contact the service manager - " + t.getMessage());
             }
             addFormNotice("Threads dumped to wrapper.log");
-        } else if (_("Show systray icon").equals(_action)) {
-            try {
-                SysTray tray = SysTray.getInstance();
-                if (tray != null) {
-                    tray.show();
-                    addFormNotice(_("System tray icon enabled."));
-                } else {
-                    addFormNotice(_("System tray icon feature not supported on this platform. Sorry!"));
-                }
-            } catch (Throwable t) {
-                addFormError(_("Warning: unable to contact the systray manager") + " - " + t.getMessage());
-            }
-        } else if (_("Hide systray icon").equals(_action)) {
-            try {
-                SysTray tray = SysTray.getInstance();
-                if (tray != null) {
-                    tray.hide();
-                    addFormNotice(_("System tray icon disabled."));
-                } else {
-                    addFormNotice(_("System tray icon feature not supported on this platform. Sorry!"));
-                }
-            } catch (Throwable t) {
-                addFormError(_("Warning: unable to contact the systray manager") + " - " + t.getMessage());
-            }
         } else if (_("View console on startup").equals(_action)) {
             browseOnStartup(true);
             addFormNotice(_("Console is to be shown on startup"));
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java
index d3579f17c56be33ef7f4a85ae8538c0933c6ac84..419725ee4241f6ca58456d8b786f042f02b9df71 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java
@@ -18,17 +18,24 @@ public class ConfigTunnelsHelper extends HelperBase {
     
     public String getForm() {
         StringBuilder buf = new StringBuilder(1024);
+        // HTML: <input> cannot be inside a <table>
+        buf.append("<input type=\"hidden\" name=\"pool.0\" value=\"exploratory\" >\n");
+        int cur = 1;
+        Set<Destination> clients = _context.clientManager().listClients();
+        for (Destination dest : clients) {
+            buf.append("<input type=\"hidden\" name=\"pool.").append(cur).append("\" value=\"");
+            buf.append(dest.calculateHash().toBase64()).append("\" >\n");    
+            cur++;
+        }
+
         buf.append("<table>\n");
         TunnelPoolSettings exploratoryIn = _context.tunnelManager().getInboundSettings();
         TunnelPoolSettings exploratoryOut = _context.tunnelManager().getOutboundSettings();
         
-        buf.append("<input type=\"hidden\" name=\"pool.0\" value=\"exploratory\" >");
         renderForm(buf, 0, "exploratory", _("Exploratory tunnels"), exploratoryIn, exploratoryOut);
         
-        int cur = 1;
-        Set clients = _context.clientManager().listClients();
-        for (Iterator iter = clients.iterator(); iter.hasNext(); ) {
-            Destination dest = (Destination)iter.next();
+        cur = 1;
+        for (Destination dest : clients) {
             TunnelPoolSettings in = _context.tunnelManager().getInboundSettings(dest.calculateHash());
             TunnelPoolSettings out = _context.tunnelManager().getOutboundSettings(dest.calculateHash());
             
@@ -41,9 +48,7 @@ public class ConfigTunnelsHelper extends HelperBase {
                 name = dest.calculateHash().toBase64().substring(0,6);
         
             String prefix = dest.calculateHash().toBase64().substring(0,4);
-            buf.append("<input type=\"hidden\" name=\"pool.").append(cur).append("\" value=\"");
-            buf.append(dest.calculateHash().toBase64()).append("\" >");    
-            renderForm(buf, cur, prefix, _("Client tunnels for") + " " + _(name), in, out);
+            renderForm(buf, cur, prefix, _("Client tunnels for {0}", _(name)), in, out);
             cur++;
         }
         
@@ -191,12 +196,16 @@ public class ConfigTunnelsHelper extends HelperBase {
 //        buf.append("<tr><td colspan=\"3\"><br></td></tr>\n");
     }
 
+    /** to fool xgettext so the following isn't tagged */
+    private static final String DUMMY1 = "1 ";
+    private static final String DUMMY2 = "{0} ";
+
     private void renderOptions(StringBuilder buf, int min, int max, int now, String prefix, String name) {
         for (int i = min; i <= max; i++) {
             buf.append("<option value=\"").append(i).append("\" ");
             if (i == now)
                 buf.append("selected=\"true\" ");
-            buf.append(">").append(_(i, "1 " + name, "{0} " + name + 's'));
+            buf.append(">").append(ngettext(DUMMY1 + name, DUMMY2 + name + 's', i));
             buf.append("</option>\n");
         }
     }
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 845bb66a03e378bb6233da5ddede4f72df3c3e6d..cf9a17140dac8e180bf12c9dfebf2c2c604506cd 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java
@@ -46,9 +46,10 @@ public class ConfigUIHelper extends HelperBase {
          return rv;
     }
 
-    private static final String langs[] = {"de", "en", "es", "fr", "nl", "pt", "ru", "sv", "zh"};
-    private static final String flags[] = {"de", "us", "es", "fr", "nl", "pt", "ru", "se", "cn"};
-    private static final String xlangs[] = {_x("German"), _x("English"), _x("Spanish"),_x("French"),
+    private static final String langs[] = {"ar", "de", "en", "es", "fr", "nl", "pt", "ru", "sv", "zh"};
+    private static final String flags[] = {"lang_ar", "de", "us", "es", "fr", "nl", "pt", "ru", "se", "cn"};
+    private static final String xlangs[] = {_x("Arabic"),
+                                            _x("German"), _x("English"), _x("Spanish"),_x("French"),
                                             _x("Dutch"), _x("Portuguese"), _x("Russian"),
                                             _x("Swedish"), _x("Chinese")};
 
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 8a525180bc384930124b543760117d26346ba7f4..47f9eb242c5eb0223232b0fe4605a760b30480d3 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java
@@ -50,12 +50,14 @@ public class ConfigUpdateHandler extends FormHandler {
      */
     private static final String PACK200_URLS =
     "http://echelon.i2p/i2p/i2pupdate.su2\r\n" +
+    "http://inr.i2p/i2p/i2pupdate.su2\r\n" +
     "http://stats.i2p/i2p/i2pupdate.su2\r\n" +
     "http://www.i2p2.i2p/_static/i2pupdate.su2\r\n" +
     "http://update.postman.i2p/i2pupdate.su2" ;
 
     private static final String NO_PACK200_URLS =
     "http://echelon.i2p/i2p/i2pupdate.sud\r\n" +
+    "http://inr.i2p/i2p/i2pupdate.sud\r\n" +
     "http://stats.i2p/i2p/i2pupdate.sud\r\n" +
     "http://www.i2p2.i2p/_static/i2pupdate.sud\r\n" +
     "http://update.postman.i2p/i2pupdate.sud" ;
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 2e03ad93f8bf2942331ed700a758c5c41c9f530b..10b587db67f19a0356d4f6ae677a1f13de128a8a 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java
@@ -82,7 +82,7 @@ public class ConfigUpdateHelper extends HelperBase {
         for (int i = 0; i < PERIODS.length; i++) {
             buf.append("<option value=\"").append(PERIODS[i]);
             if (PERIODS[i] == ms)
-                buf.append("\" selected=\"true\"");
+                buf.append("\" selected=\"true");
             
             if (PERIODS[i] == -1)
                 buf.append("\">" + _("Never") + "</option>\n");
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java
index f9fe7377c8af70802227bfef3d9a77f690f239f4..b56108be389334f60af91d52016b17b6cc3c5d5c 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java
@@ -18,7 +18,28 @@ public class ContentHelper extends HelperBase {
     public void setStartAtBeginning(String moo) { 
         _startAtBeginning = Boolean.valueOf(""+moo).booleanValue(); 
     }
-    public void setLang(String l) { _lang = l; }
+    public void setLang(String l) {
+/*****
+        if((_lang == null || !_lang.equals(l)) && (l != null)) {
+            //Set language for router console
+            _lang = l;
+ TODO - Temporary for 0.8.4
+        Needed for desktopgui. But there's no nonce protection.
+        Move the following to CSSHelper setLang(), or disable completely,
+        See comments in CSSHelper
+            if(_context == null) {
+                setContextId(null);
+            }
+
+            if (_context.getBooleanProperty("desktopgui.enabled")) {
+                //Set language persistently throughout I2P
+                _context.router().setConfigSetting(Messages.PROP_LANG, _lang);
+                _context.router().saveConfig();
+                _context.setProperty(Messages.PROP_LANG, _lang);
+            }
+        }
+*****/
+    }
     
     public void setMaxLines(String lines) {
         if (lines != null) {
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java
index 71089ce7358c921f15d82981a27e41691d07a667..2f16cd359bc8d5e4f82aacc4689735c1814b0722 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java
@@ -26,6 +26,8 @@ public class FormHandler {
     private final List<String> _notices;
     private boolean _processed;
     private boolean _valid;
+    private static final String NONCE_SUFFIX = ".nonce";
+    private static final String PREV_SUFFIX = "Prev";
     
     public FormHandler() {
         _errors = new ArrayList();
@@ -93,18 +95,18 @@ public class FormHandler {
         if (_errors.isEmpty() && _notices.isEmpty())
             return "";
         StringBuilder buf = new StringBuilder(512);
-        buf.append("<div class=\"messages\" id=\"messages\"><p>");
+        buf.append("<div class=\"messages\" id=\"messages\">");
         if (!_errors.isEmpty()) {
-            buf.append("<span class=\"error\">");
+            buf.append("<div class=\"error\">");
             buf.append(render(_errors));
-            buf.append("</span>");
+            buf.append("</div>");
         }
         if (!_notices.isEmpty()) {
-            buf.append("<span class=\"notice\">");
+            buf.append("<div class=\"notice\">");
             buf.append(render(_notices));
-            buf.append("</span>");
+            buf.append("</div>");
         }
-        buf.append("</p></div>");
+        buf.append("</div>");
         return buf.toString();
     }
     
@@ -162,8 +164,8 @@ public class FormHandler {
             return;
         }
         
-        String nonce = System.getProperty(getClass().getName() + ".nonce");
-        String noncePrev = System.getProperty(getClass().getName() + ".noncePrev");
+        String nonce = System.getProperty(getClass().getName() + NONCE_SUFFIX);
+        String noncePrev = nonce + PREV_SUFFIX;
         if ( ( (nonce == null) || (!_nonce.equals(nonce)) ) &&
              ( (noncePrev == null) || (!_nonce.equals(noncePrev)) ) ) {
                  
@@ -201,6 +203,22 @@ public class FormHandler {
         }
     }
     
+    /**
+     *  Generate a new nonce, store old and new in the system properties.
+     *  Only call once per page!
+     *  @return a new random long as a String
+     *  @since 0.8.5
+     */
+    public String getNewNonce() {
+        String prop = getClass().getName() + NONCE_SUFFIX;
+        String prev = System.getProperty(prop);
+        if (prev != null)
+            System.setProperty(prop + PREV_SUFFIX, prev);
+        String rv = Long.toString(_context.random().nextLong());
+        System.setProperty(prop, rv);
+        return rv;
+    }
+
     /** translate a string */
     public String _(String s) {
         return Messages.getString(s, _context);
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java b/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java
index 8ceec1098b1a2acf44debf7b8cdfb94f66c51583..2bee07833bdc12b18c893aa782dd3aa6a2b3c565 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java
@@ -63,7 +63,7 @@ public abstract class HelperBase {
     }
 
     /** translate (ngettext) @since 0.7.14 */
-    public String _(int n, String s, String p) {
+    public String ngettext(String s, String p, int n) {
         return Messages.getString(n, s, p, _context);
     }
 
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java
index 3ccd355c2dacba5784240a84013bfe2788881887..f4c42a23bf8a4a0381097fdf22fbee94a87d396c 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java
@@ -53,7 +53,6 @@ public class LogsHelper extends HelperBase {
         boolean colorize = Boolean.valueOf(_context.getProperty("routerconsole.logs.color")).booleanValue();
         StringBuilder buf = new StringBuilder(16*1024); 
         buf.append("<ul>");
-        buf.append("<code>\n");
         for (int i = msgs.size(); i > 0; i--) { 
             String msg = msgs.get(i - 1);
             msg = msg.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;");
@@ -87,7 +86,7 @@ public class LogsHelper extends HelperBase {
             }
             buf.append("</li>\n");
         }
-        buf.append("</code></ul>\n");
+        buf.append("</ul>\n");
         
         return buf.toString();
     }
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 7bd167a56fae11a9efc7804356d8801cc1abac1c..15ec901548346eff54eeb0e4727b05aabaa58f0b 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
@@ -24,7 +24,6 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.TreeSet;
 
-import net.i2p.crypto.TrustedUpdate;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Destination;
 import net.i2p.data.Hash;
@@ -174,18 +173,19 @@ public class NetDbRenderer {
         }
         if (debug) {
             buf.append("<p><b>Total Leasesets: " + leases.size());
-            buf.append("<p><b>Published (RAP) Leasesets: " + _context.netDb().getKnownLeaseSets());
-            buf.append("<p>Mod Data: " + HexDump.dump(_context.routingKeyGenerator().getModData()) + "<p>");
-            buf.append("<p>Network data (only valid if floodfill):");
-            buf.append("<p>Center of Key Space (router hash): " + ourRKey.toBase64() + "<p>");
+            buf.append("</b></p><p><b>Published (RAP) Leasesets: " + _context.netDb().getKnownLeaseSets());
+            buf.append("</b></p><p><b>Mod Data: " + HexDump.dump(_context.routingKeyGenerator().getModData()));
+            buf.append("</b></p><p><b>Network data (only valid if floodfill):");
+            buf.append("</b></p><p><b>Center of Key Space (router hash): " + ourRKey.toBase64());
             if (median != null) {
                 double log2 = biLog2(median);
-                buf.append("<p>Median distance (bits): " + fmt.format(log2));
+                buf.append("</b></p><p><b>Median distance (bits): " + fmt.format(log2));
                 // 3 for 8 floodfills... -1 for median
                 int total = (int) Math.round(Math.pow(2, 3 + 256 - 1 - log2));
-                buf.append("<p>Estimated total floodfills: " + total);
-                buf.append("<p>Estimated network total leasesets: " + (total * leases.size() / 8));
+                buf.append("</b></p><p><b>Estimated total floodfills: " + total);
+                buf.append("</b></p><p><b>Estimated network total leasesets: " + (total * leases.size() / 8));
             }
+            buf.append("</b></p>");
         }
         out.write(buf.toString());
         out.flush();
@@ -262,7 +262,9 @@ public class NetDbRenderer {
             }
         }
             
-        buf.append("<table border=\"0\" cellspacing=\"30\"><tr><th colspan=\"3\">").append(_("Network Database Router Statistics")).append("</th><tr><td>");
+        buf.append("<table border=\"0\" cellspacing=\"30\"><tr><th colspan=\"3\">")
+           .append(_("Network Database Router Statistics"))
+           .append("</th></tr><tr><td style=\"vertical-align: top;\">");
         // versions table
         List<String> versionList = new ArrayList(versions.objects());
         if (!versionList.isEmpty()) {
@@ -276,7 +278,7 @@ public class NetDbRenderer {
             }
             buf.append("</table>\n");
         }
-        buf.append("</td><td>");
+        buf.append("</td><td style=\"vertical-align: top;\">");
         out.write(buf.toString());
         buf.setLength(0);
             
@@ -291,7 +293,7 @@ public class NetDbRenderer {
             }
         }
         buf.append("</table>\n");
-        buf.append("</td><td>");
+        buf.append("</td><td style=\"vertical-align: top;\">");
         out.write(buf.toString());
         buf.setLength(0);
 
@@ -343,9 +345,9 @@ public class NetDbRenderer {
         } else {
             buf.append("<b>" + _("Peer info for") + ":</b> ").append(hash).append("\n");
             if (full) {
-                buf.append("[<a href=\"netdb\" >Back</a>]</th></tr><td>\n");
+                buf.append("[<a href=\"netdb\" >Back</a>]</th></tr><tr><td>\n");
             } else {
-                buf.append("[<a href=\"netdb?r=").append(hash.substring(0, 6)).append("\" >").append(_("Full entry")).append("</a>]</th></tr><td>\n");
+                buf.append("[<a href=\"netdb?r=").append(hash.substring(0, 6)).append("\" >").append(_("Full entry")).append("</a>]</th></tr><tr><td>\n");
             }
         }
         
@@ -391,9 +393,8 @@ public class NetDbRenderer {
                 buf.append(DataHelper.stripHTML(key)).append(" = ").append(DataHelper.stripHTML(val)).append("<br>\n");
             }
             buf.append("</code></td></tr>\n");
-        } else {
         }
-        buf.append("</td></tr>\n");
+        buf.append("</table>\n");
     }
 
     private static final int SSU = 1;
@@ -404,11 +405,10 @@ public class NetDbRenderer {
     /**
      *  what transport types
      */
-    private int classifyTransports(RouterInfo info) {
+    private static int classifyTransports(RouterInfo info) {
         int rv = 0;
         String hash = info.getIdentity().getHash().toBase64();
-        for (Iterator iter = info.getAddresses().iterator(); iter.hasNext(); ) {
-            RouterAddress addr = (RouterAddress)iter.next();
+        for (RouterAddress addr : info.getAddresses()) {
             String style = addr.getTransportStyle();
             if (style.equals("NTCP")) {
                 rv |= NTCP;
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
index adb2380777f90a62d60d9bae06020c52a0de291f..562c3e7cadb2d326785e7002d8b04ebe5490ad07 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
@@ -3,11 +3,9 @@ package net.i2p.router.web;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
-import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
-import java.util.Locale;
 
 import net.i2p.I2PAppContext;
 import net.i2p.crypto.TrustedUpdate;
@@ -15,6 +13,7 @@ import net.i2p.data.DataHelper;
 import net.i2p.router.Router;
 import net.i2p.router.RouterContext;
 import net.i2p.router.RouterVersion;
+import net.i2p.router.util.RFC822Date;
 import net.i2p.util.EepGet;
 import net.i2p.util.EepHead;
 import net.i2p.util.FileUtil;
@@ -73,7 +72,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
             if (_lastFetch == 0)
                 _lastFetch = _lastUpdated;
             if (_lastModified == null)
-                _lastModified = to822Date(_lastFetch);
+                _lastModified = RFC822Date.to822Date(_lastFetch);
         } else {
             _lastUpdated = 0;
             _lastFetch = 0;
@@ -212,7 +211,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
                 String lastmod = get.getLastModified();
                 if (lastmod != null) {
                     if (!(_context.isRouterContext())) return;
-                    long modtime = parse822Date(lastmod);
+                    long modtime = RFC822Date.parse822Date(lastmod);
                     if (modtime <= 0) return;
                     String lastUpdate = _context.getProperty(UpdateHandler.PROP_LAST_UPDATE_TIME);
                     if (lastUpdate == null) {
@@ -251,44 +250,6 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
         handler.update();
     }
 
-    /**
-     * http://jimyjoshi.com/blog/2007/08/rfc822dateparsinginjava.html
-     * Apparently public domain
-     * Probably don't need all of these...
-     */
-    private static final SimpleDateFormat rfc822DateFormats[] = new SimpleDateFormat[] {
-                 new SimpleDateFormat("EEE, d MMM yy HH:mm:ss z", Locale.US),
-                 new SimpleDateFormat("EEE, d MMM yy HH:mm z", Locale.US),
-                 new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US),
-                 new SimpleDateFormat("EEE, d MMM yyyy HH:mm z", Locale.US),
-                 new SimpleDateFormat("d MMM yy HH:mm z", Locale.US),
-                 new SimpleDateFormat("d MMM yy HH:mm:ss z", Locale.US),
-                 new SimpleDateFormat("d MMM yyyy HH:mm z", Locale.US),
-                 new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US)
-    };
-
-    /**
-     * new Date(String foo) is deprecated, so let's do this the hard way
-     *
-     * @param s non-null
-     * @return -1 on failure
-     */
-    public static long parse822Date(String s) {
-        for (int i = 0; i < rfc822DateFormats.length; i++) {
-            try {
-                Date date = rfc822DateFormats[i].parse(s);
-                if (date != null)
-                    return date.getTime();
-            } catch (ParseException pe) {}
-        }
-        return -1;
-    }
-
-    /** @since 0.8.2 */
-    private static String to822Date(long t) {
-        return (new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US)).format(new Date(t));
-    }
-
     private static final String VERSION_STRING = "version=\"" + RouterVersion.VERSION + "\"";
     private static final String VERSION_PREFIX = "version=\"";
     private void checkForUpdates() {
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 9e0a0c95128c8e0e9c9c10a566db5866df2756b6..d1835a32065f46168517b8eec9ec6cd46e0efc4b 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java
@@ -95,7 +95,8 @@ public class PluginStarter implements Runnable {
             log.error("Cannot start nonexistent plugin: " + appName);
             return false;
         }
-        //log.error("Starting plugin: " + appName);
+        if (log.shouldLog(Log.INFO))
+            log.info("Starting plugin: " + appName);
 
         // register themes
         File dir = new File(pluginDir, "console/themes");
@@ -139,7 +140,8 @@ public class PluginStarter implements Runnable {
                         }
                         String enabled = props.getProperty(RouterConsoleRunner.PREFIX + warName + ENABLED);
                         if (! "false".equals(enabled)) {
-                            //log.error("Starting webapp: " + warName);
+                            if (log.shouldLog(Log.INFO))
+                                log.info("Starting webapp: " + warName);
                             String path = new File(webappDir, fileNames[i]).getCanonicalPath();
                             WebAppStarter.startWebApp(ctx, server, warName, path);
                             pluginWars.get(appName).add(warName);
@@ -149,6 +151,8 @@ public class PluginStarter implements Runnable {
                     }
                 }
             }
+        } else {
+            log.error("No console web server to start plugins?");
         }
 
         // add translation jars in console/locale
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java
index 59d729ae7e9b01dd3ce6989fda16d0ff963bbdda..884a20bb5fcbf1dbd92871b41a59747310f77a3f 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java
@@ -144,6 +144,7 @@ public class PluginUpdateHandler extends UpdateHandler {
             }
             buf.append(": ");
             buf.append(_("{0}B transferred", DataHelper.formatSize2(currentWrite + alreadyTransferred)));
+            buf.append("</b>");
             updateStatus(buf.toString());
         }
 
@@ -212,10 +213,15 @@ public class PluginUpdateHandler extends UpdateHandler {
             if (up.haveKey(pubkey)) {
                 // the key is already in the TrustedUpdate keyring
                 // verify the sig and verify that it is signed by the signer in the plugin.config file
+                // Allow "" as the previously-known signer
                 String signingKeyName = up.verifyAndGetSigner(f);
-                if (!signer.equals(signingKeyName)) {
+                if (!(signer.equals(signingKeyName) || "".equals(signingKeyName))) {
                     f.delete();
                     to.delete();
+                    if (signingKeyName == null)
+                        _log.error("Failed to verify plugin signature, corrupt plugin or bad signature, signed by: " + signer);
+                    else
+                        _log.error("Plugin signer \"" + signer + "\" does not match existing signer in plugin.config file \"" + signingKeyName + "\"");
                     statusDone("<b>" + _("Plugin signature verification of {0} failed", url) + "</b>");
                     return;
                 }
@@ -225,6 +231,7 @@ public class PluginUpdateHandler extends UpdateHandler {
                     // bad or duplicate key
                     f.delete();
                     to.delete();
+                    _log.error("Bad key or key mismatch - Failed to add plugin key \"" + pubkey + "\" for plugin signer \"" + signer + "\"");
                     statusDone("<b>" + _("Plugin signature verification of {0} failed", url) + "</b>");
                     return;
                 }
@@ -234,6 +241,11 @@ public class PluginUpdateHandler extends UpdateHandler {
                 if (!signer.equals(signingKeyName)) {
                     f.delete();
                     to.delete();
+                    if (signingKeyName == null)
+                        _log.error("Failed to verify plugin signature, corrupt plugin or bad signature, signed by: " + signer);
+                    else
+                        // shouldn't happen
+                        _log.error("Plugin signer \"" + signer + "\" does not match new signer in plugin.config file \"" + signingKeyName + "\"");
                     statusDone("<b>" + _("Plugin signature verification of {0} failed", url) + "</b>");
                     return;
                 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java
index f452df2ba85f4700d268bb7fd7d97e77b0e7116b..d83720d07901c172ca9c92165e8862888d92eeca 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java
@@ -70,11 +70,11 @@ class ProfileOrganizerRenderer {
         int failing = 0;
         StringBuilder buf = new StringBuilder(16*1024);
         buf.append("<h2>").append(_("Peer Profiles")).append("</h2>\n<p>");
-        buf.append(_("Showing {0} recent profiles.", order.size())).append('\n');
+        buf.append(ngettext("Showing 1 recent profile.", "Showing {0} recent profiles.", order.size())).append('\n');
         if (older > 0)
-            buf.append(_("Hiding {0} older profiles.", older)).append('\n');
+            buf.append(ngettext("Hiding 1 older profile.", "Hiding {0} older profiles.", older)).append('\n');
         if (standard > 0)
-            buf.append("<a href=\"/profiles?f=1\">").append(_("Hiding {0} standard profiles.", standard)).append("</a>\n");
+            buf.append("<a href=\"/profiles?f=1\">").append(ngettext("Hiding 1 standard profile.", "Hiding {0} standard profiles.", standard)).append("</a>\n");
         buf.append("</p>");
                    buf.append("<table>");
                    buf.append("<tr>");
@@ -171,8 +171,10 @@ class ProfileOrganizerRenderer {
                     buf.append(' ').append(fails).append('/').append(total).append(' ').append(_("Test Fails"));
             }
             buf.append("&nbsp;</td>");
-            buf.append("<td nowrap align=\"center\"><a target=\"_blank\" href=\"dumpprofile.jsp?peer=")
-               .append(peer.toBase64().substring(0,6)).append("\">").append(_("profile")).append("</a>");
+            //buf.append("<td nowrap align=\"center\"><a target=\"_blank\" href=\"dumpprofile.jsp?peer=")
+            //   .append(peer.toBase64().substring(0,6)).append("\">").append(_("profile")).append("</a>");
+            buf.append("<td nowrap align=\"center\"><a href=\"viewprofile?peer=")
+               .append(peer.toBase64()).append("\">").append(_("profile")).append("</a>");
             buf.append("&nbsp;<a href=\"configpeer?peer=").append(peer.toBase64()).append("\">+-</a></td>\n");
             buf.append("</tr>");
             // let's not build the whole page in memory (~500 bytes per peer)
@@ -213,7 +215,6 @@ class ProfileOrganizerRenderer {
                 buf.append("<td align=\"center\">").append(DataHelper.stripHTML(info.getCapabilities())).append("</td>");
             else
                 buf.append("<td>&nbsp;</td>");
-            buf.append("</code></td>");
             buf.append("<td align=\"right\">").append(num(prof.getIntegrationValue())).append("</td>");
             long time;
             time = now - prof.getLastHeardAbout();
@@ -261,7 +262,7 @@ class ProfileOrganizerRenderer {
         buf.append("<li><b>").append(_("capacity")).append("</b>: ").append(_("how many tunnels can we ask them to join in an hour?")).append("</li>");
         buf.append("<li><b>").append(_("integration")).append("</b>: ").append(_("how many new peers have they told us about lately?")).append("</li>");
         buf.append("<li><b>").append(_("status")).append("</b>: ").append(_("is the peer banned, or unreachable, or failing tunnel tests?")).append("</li>");
-        buf.append("</ul></i>");
+        buf.append("</ul>");
         out.write(buf.toString());
         out.flush();
     }
@@ -360,4 +361,10 @@ class ProfileOrganizerRenderer {
     private String _(String s, Object o) {
         return Messages.getString(s, o, _context);
     }
+
+    /** translate (ngettext) @since 0.8.5 */
+    public String ngettext(String s, String p, int n) {
+        return Messages.getString(n, s, p, _context);
+    }
+
 }
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 d3b6ecc29fde763994072b39c2bf0358fe2eaf89..be46bdca0c477a34b75b9f4acd2a43cff6b90c0b 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java
@@ -1,6 +1,7 @@
 package net.i2p.router.web;
 
 import java.util.ArrayList;
+import java.awt.GraphicsEnvironment;
 import java.io.File;
 import java.io.FilenameFilter;
 import java.io.IOException;
@@ -13,17 +14,20 @@ import net.i2p.I2PAppContext;
 import net.i2p.apps.systray.SysTray;
 import net.i2p.data.Base32;
 import net.i2p.data.DataHelper;
+import net.i2p.desktopgui.Main;
 import net.i2p.router.RouterContext;
 import net.i2p.util.FileUtil;
 import net.i2p.util.I2PAppThread;
 import net.i2p.util.SecureDirectory;
 import net.i2p.util.SecureFileOutputStream;
 import net.i2p.util.ShellCommand;
+import net.i2p.util.VersionComparator;
 
 import org.mortbay.http.DigestAuthenticator;
 import org.mortbay.http.HashUserRealm;
 import org.mortbay.http.NCSARequestLog;
 import org.mortbay.http.SecurityConstraint;
+import org.mortbay.http.SocketListener;
 import org.mortbay.http.SslListener;
 import org.mortbay.http.handler.SecurityHandler;
 import org.mortbay.jetty.Server;
@@ -55,7 +59,6 @@ public class RouterConsoleRunner {
     
     static {
         System.setProperty("org.mortbay.http.Version.paranoid", "true");
-        System.setProperty("java.awt.headless", "true");
     }
     
     /**
@@ -126,10 +129,34 @@ public class RouterConsoleRunner {
     }
     
     public static void main(String args[]) {
+        startTrayApp();
         RouterConsoleRunner runner = new RouterConsoleRunner(args);
         runner.startConsole();
     }
     
+    private static void startTrayApp() {
+        try {
+            //TODO: move away from routerconsole into a separate application.
+            //ApplicationManager?
+            VersionComparator v = new VersionComparator();
+            boolean recentJava = v.compare(System.getProperty("java.runtime.version"), "1.6") >= 0;
+            // default false for now
+            boolean desktopguiEnabled = I2PAppContext.getGlobalContext().getBooleanProperty("desktopgui.enabled");
+            if (recentJava && desktopguiEnabled) {
+                //Check if we are in a headless environment, set properties accordingly
+          	System.setProperty("java.awt.headless", Boolean.toString(GraphicsEnvironment.isHeadless()));
+                String[] args = new String[0];
+                net.i2p.desktopgui.Main.beginStartup(args);    
+            } else {
+                // required true for jrobin to work
+          	System.setProperty("java.awt.headless", "true");
+                SysTray.getInstance();
+            }
+        } catch (Throwable t) {
+            t.printStackTrace();
+        }
+    }
+
     public void startConsole() {
         File workDir = new SecureDirectory(I2PAppContext.getGlobalContext().getTempDir(), "jetty-work");
         boolean workDirRemoved = FileUtil.rmdir(workDir, false);
@@ -184,11 +211,21 @@ public class RouterConsoleRunner {
                 while (tok.hasMoreTokens()) {
                     String host = tok.nextToken().trim();
                     try {
-                        if (host.indexOf(":") >= 0) // IPV6 - requires patched Jetty 5
-                            _server.addListener('[' + host + "]:" + _listenPort);
-                        else
-                            _server.addListener(host + ':' + _listenPort);
+                        //if (host.indexOf(":") >= 0) // IPV6 - requires patched Jetty 5
+                        //    _server.addListener('[' + host + "]:" + _listenPort);
+                        //else
+                        //    _server.addListener(host + ':' + _listenPort);
+                        Integer lport = Integer.parseInt(_listenPort);
+                        InetAddrPort iap = new InetAddrPort(host, lport);
+                        SocketListener lsnr = new SocketListener(iap);
+                        lsnr.setMinThreads(1);           // default 2
+                        lsnr.setMaxThreads(24);          // default 256
+                        lsnr.setMaxIdleTimeMs(90*1000);  // default 10 sec
+                        lsnr.setName("ConsoleSocket");   // all with same name will use the same thread pool
+                        _server.addListener(lsnr);
                         boundAddresses++;
+                    } catch (NumberFormatException nfe) {
+                        System.err.println("Unable to bind routerconsole to " + host + " port " + _listenPort + ' ' + nfe);
                     } catch (IOException ioe) { // this doesn't seem to work, exceptions don't happen until start() below
                         System.err.println("Unable to bind routerconsole to " + host + " port " + _listenPort + ' ' + ioe);
                     }
@@ -220,6 +257,10 @@ public class RouterConsoleRunner {
                             ssll.setPassword(ctx.getProperty(PROP_KEYSTORE_PASSWORD, DEFAULT_KEYSTORE_PASSWORD));
                             // the X.509 cert password (if not present, verifyKeyStore() returned false)
                             ssll.setKeyPassword(ctx.getProperty(PROP_KEY_PASSWORD, "thisWontWork"));
+                            ssll.setMinThreads(1);           // default 2
+                            ssll.setMaxThreads(24);          // default 256
+                            ssll.setMaxIdleTimeMs(90*1000);  // default 10 sec
+                            ssll.setName("ConsoleSocket");   // all with same name will use the same thread pool
                             _server.addListener(ssll);
                             boundAddresses++;
                         } catch (Exception e) {   // probably no exceptions at this point
@@ -300,12 +341,6 @@ public class RouterConsoleRunner {
             }
         }
 
-        try {
-            SysTray tray = SysTray.getInstance();
-        } catch (Throwable t) {
-            t.printStackTrace();
-        }
-
         NewsFetcher fetcher = NewsFetcher.getInstance(I2PAppContext.getGlobalContext());
         Thread t = new I2PAppThread(fetcher, "NewsFetcher", true);
         t.start();
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ShitlistRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/ShitlistRenderer.java
index 12c6678728b957a5accf86fc2aacbfd8e00d5b1c..967981130516b5154cf88c5cb1a946d41dcce8f5 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ShitlistRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ShitlistRenderer.java
@@ -43,6 +43,11 @@ public class ShitlistRenderer {
         Map<Hash, Shitlist.Entry> entries = new TreeMap(new HashComparator());
         
         entries.putAll(_context.shitlist().getEntries());
+        if (entries.isEmpty()) {
+            buf.append("<i>").append(_("none")).append("</i>");
+            out.write(buf.toString());
+            return;
+        }
 
         buf.append("<ul>");
         
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/StatHelper.java
index 2b7e81fb41e63a59568a7bee4535fced155351c4..6cfc7bdcfca198f97ca0ee07013c7f70aef05c91 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/StatHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/StatHelper.java
@@ -1,37 +1,73 @@
 package net.i2p.router.web;
 
-import java.util.Iterator;
+import java.io.IOException;
 import java.util.Set;
 
+import net.i2p.data.DataFormatException;
 import net.i2p.data.Hash;
-import net.i2p.router.RouterContext;
 
 /**
- * uuuugly.  dump the peer profile data if given a peer.
+ *  Dump the peer profile data if given a full B64 peer string or prefix.
  *
  */
 public class StatHelper extends HelperBase {
     private String _peer;
     
+    /**
+     * Caller should strip HTML (XSS)
+     */
     public void setPeer(String peer) { _peer = peer; }
     
+    /**
+     *  Look up based on a b64 prefix or full b64.
+     *  Prefix is inefficient.
+     */
     public String getProfile() { 
-        RouterContext ctx = (RouterContext)net.i2p.router.RouterContext.listContexts().get(0);
-        Set peers = ctx.profileOrganizer().selectAllPeers();
-        for (Iterator iter = peers.iterator(); iter.hasNext(); ) {
-            Hash peer = (Hash)iter.next();
+        if (_peer == null || _peer.length() <= 0)
+            return "No peer specified";
+        if (_peer.length() >= 44)
+            return outputProfile();
+        Set<Hash> peers = _context.profileOrganizer().selectAllPeers();
+        for (Hash peer : peers) {
             if (peer.toBase64().startsWith(_peer)) {
-                try {
-                    WriterOutputStream wos = new WriterOutputStream(_out);
-                    ctx.profileOrganizer().exportProfile(peer, wos);
-                    wos.flush();
-                    _out.flush();
-                    return "";
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
+                return dumpProfile(peer);
             }
         }
-        return "Unknown";
+        return "Unknown peer " + _peer;
+    }
+
+    /**
+     *  Look up based on the full b64 - efficient
+     *  @since 0.8.5
+     */
+    private String outputProfile() { 
+        Hash peer = new Hash();
+        try {
+            peer.fromBase64(_peer);
+            return dumpProfile(peer);
+        } catch (DataFormatException dfe) {
+            return "Bad peer hash " + _peer;
+        }
+    }
+
+    /**
+     *  dump the profile
+     *  @since 0.8.5
+     */
+    private String dumpProfile(Hash peer) { 
+        try {
+            WriterOutputStream wos = new WriterOutputStream(_out);
+            boolean success = _context.profileOrganizer().exportProfile(peer, wos);
+            if (success) {
+                wos.flush();
+                _out.flush();
+                return "";
+            } else {
+                return "Unknown peer " + _peer;
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            return "IO Error " + e;
+        }
     }
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
index 6b6a8b616368105796439cb8b9edd3db252b661b..cd39b4a25d3aa974e3c5a92ae0b03638d18aae4a 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
@@ -93,6 +93,7 @@ public class StatsGenerator {
             }
             out.write("</ul><br>\n");
         }
+        out.write("</div>");
         out.flush();
     }
     
@@ -140,7 +141,7 @@ public class StatsGenerator {
         buf.append("<li><b>").append(_("Lifetime average frequency")).append(":</b> ");
         buf.append(DataHelper.formatDuration2(freq.getFrequency()));
         buf.append(" (");
-        buf.append(ngettext((int) freq.getEventCount(), "1 event", "{0} events"));
+        buf.append(ngettext("1 event", "{0} events", (int) freq.getEventCount()));
         buf.append(")</li></ul><br>\n");
     }
     
@@ -167,7 +168,7 @@ public class StatsGenerator {
             buf.append("<li>");
             renderPeriod(buf, periods[i], _("rate"));
             if (curRate.getLastEventCount() > 0) {
-                buf.append(_("Average")).append(":</i> ");
+                buf.append(_("Average")).append(": ");
                 buf.append(num(curRate.getAverageValue()));
                 buf.append("; ");
                 buf.append(_("Highest average"));
@@ -197,9 +198,9 @@ public class StatsGenerator {
                     buf.append("; ");
                 }
 
-                buf.append(ngettext((int) curRate.getLastEventCount(), "There was 1 event", "There were {0} events"));
+                buf.append(ngettext("There was 1 event in this period.", "There were {0} events in this period.", (int)curRate.getLastEventCount()));
                 buf.append(' ');
-                buf.append(_("in this period which ended {0} ago.", DataHelper.formatDuration2(now - curRate.getLastCoalesceDate())));
+                buf.append(_("The period ended {0} ago.", DataHelper.formatDuration2(now - curRate.getLastCoalesceDate())));
             } else {
                 buf.append(" <i>").append(_("No events")).append("</i> ");
             }
@@ -230,7 +231,7 @@ public class StatsGenerator {
         buf.append("<li><b>").append(_("Lifetime average value")).append(":</b> ");
         buf.append(num(rate.getLifetimeAverageValue()));
         buf.append(" (");
-        buf.append(ngettext((int) rate.getLifetimeEventCount(), "1 event", "{0} events"));
+        buf.append(ngettext("1 event", "{0} events", (int) rate.getLifetimeEventCount()));
         buf.append(")<br></li>" +
                    "</ul>" +
                    "<br>\n");
@@ -261,7 +262,7 @@ public class StatsGenerator {
     }
 
     /** translate a string */
-    private String ngettext(int n, String s, String p) {
+    private String ngettext(String s, String p, int n) {
         return Messages.getString(n, s, p, _context);
     }
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
index 55c7b009c5cc9ee657be9cadaecf2a8044276abc..e21102c7f7a3e5ef3c60e67a758e168dae95039e 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
@@ -224,25 +224,21 @@ public class SummaryBarRenderer {
                     System.setProperty("net.i2p.router.web.UpdateHandler.noncePrev", prev);
                 System.setProperty("net.i2p.router.web.UpdateHandler.nonce", nonce+"");
                 String uri = _helper.getRequestURI();
-                buf.append("<p><form action=\"").append(uri).append("\" method=\"POST\">\n");
+                buf.append("<form action=\"").append(uri).append("\" method=\"POST\">\n");
                 buf.append("<input type=\"hidden\" name=\"updateNonce\" value=\"").append(nonce).append("\" >\n");
                 if (_helper.updateAvailable()) {
                     buf.append("<button type=\"submit\" name=\"updateAction\" value=\"signed\" >")
-                       .append(_("Download"))
-                       .append(' ')
-                       .append(_helper.getUpdateVersion())
-                       .append(' ')
-                       .append(_("Update"))
-                       .append("</button>\n");
+                       // Note to translators: parameter is a version, e.g. "0.8.4"
+                       .append(_("Download {0} Update", _helper.getUpdateVersion()))
+                       .append("</button><br>\n");
                 }
                 if (_helper.unsignedUpdateAvailable()) {
                     buf.append("<button type=\"submit\" name=\"updateAction\" value=\"Unsigned\" >")
-                       .append(_("Download Unsigned"))
-                       .append("<br>")
-                       .append(_("Update"))
-                       .append(' ')
-                       .append(_helper.getUnsignedUpdateVersion())
-                       .append("</button>\n");
+                       // 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>
+                       .append(_("Download Unsigned<br>Update {0}", _helper.getUnsignedUpdateVersion()))
+                       .append("</button><br>\n");
                 }
                 buf.append("</form>\n");
             }
@@ -251,10 +247,9 @@ public class SummaryBarRenderer {
 
 
 
-        buf.append("<p>")
-           .append(ConfigRestartBean.renderStatus(_helper.getRequestURI(), _helper.getAction(), _helper.getConsoleNonce()))
+        buf.append(ConfigRestartBean.renderStatus(_helper.getRequestURI(), _helper.getAction(), _helper.getConsoleNonce()))
 
-           .append("</p><hr><h3><a href=\"/peers\" target=\"_top\" title=\"")
+           .append("<hr><h3><a href=\"/peers\" target=\"_top\" title=\"")
            .append(_("Show all current peer connections"))
            .append("\">")
            .append(_("Peers"))
@@ -456,4 +451,9 @@ public class SummaryBarRenderer {
     private String _(String s) {
         return Messages.getString(s, _context);
     }
+
+    /** translate a string with a parameter */
+    private String _(String s, Object o) {
+        return Messages.getString(s, o, _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 7783bf8110460c423170ec291323751bdcf82694..e1c1b8d26840da69e7617b4f18ff9fb1a94f3327 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
@@ -384,7 +384,7 @@ public class SummaryHelper extends HelperBase {
                     buf.append("client.png\" alt=\"Client\" title=\"" + _("Client") + "\">");
                 buf.append("</td><td align=\"left\"><b><a href=\"tunnels#").append(h.toBase64().substring(0,4));
                 buf.append("\" target=\"_top\" title=\"" + _("Show tunnels") + "\">");
-                if (name.length() < 16)
+                if (name.length() < 18)
                     buf.append(name);
                 else
                     buf.append(name.substring(0,15)).append("&hellip;");
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/UnsignedUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/UnsignedUpdateHandler.java
index 8fcbd65c0ba3ce6344a56416a94a8c019f17491a..5a52ee883a3b6456278d61985097d4d23140414b 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/UnsignedUpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/UnsignedUpdateHandler.java
@@ -4,6 +4,7 @@ import java.io.File;
 
 import net.i2p.router.Router;
 import net.i2p.router.RouterContext;
+import net.i2p.router.util.RFC822Date;
 import net.i2p.util.EepGet;
 import net.i2p.util.FileUtil;
 import net.i2p.util.I2PAppThread;
@@ -101,7 +102,7 @@ public class UnsignedUpdateHandler extends UpdateHandler {
                 String lastmod = _get.getLastModified();
                 long modtime = 0;
                 if (lastmod != null)
-                    modtime = NewsFetcher.parse822Date(lastmod);
+                    modtime = RFC822Date.parse822Date(lastmod);
                 if (modtime <= 0)
                     modtime = _context.clock().now();
                 _context.router().setConfigSetting(PROP_LAST_UPDATE_TIME, "" + modtime);
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 174704ba6774f976ec51b3b26d841c7c0fd60144..423b9e52ad20cbeb2d9ac234ed518f5f94d96ef7 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java
@@ -15,6 +15,7 @@ import net.i2p.data.DataHelper;
 import net.i2p.router.Router;
 import net.i2p.router.RouterContext;
 import net.i2p.router.RouterVersion;
+import net.i2p.router.util.RFC822Date;
 import net.i2p.util.EepGet;
 import net.i2p.util.I2PAppThread;
 import net.i2p.util.Log;
@@ -271,7 +272,7 @@ public class UpdateHandler {
                 String lastmod = _get.getLastModified();
                 long modtime = 0;
                 if (lastmod != null)
-                    modtime = NewsFetcher.parse822Date(lastmod);
+                    modtime = RFC822Date.parse822Date(lastmod);
                 if (modtime <= 0)
                     modtime = _context.clock().now();
                 _context.router().setConfigSetting(PROP_LAST_UPDATE_TIME, "" + modtime);
diff --git a/apps/routerconsole/jsp/config.jsp b/apps/routerconsole/jsp/config.jsp
index 74f1bf4656eacd21986d6067023659e79b6f8578..df605ba1de761988ac48739ab895bdec6ff2a3ef 100644
--- a/apps/routerconsole/jsp/config.jsp
+++ b/apps/routerconsole/jsp/config.jsp
@@ -22,10 +22,7 @@
  <jsp:getProperty name="formhandler" property="allMessages" />
 <div class="configure">
  <form action="" method="POST">
- <% String prev = System.getProperty("net.i2p.router.web.ConfigNetHandler.nonce");
-    if (prev != null) System.setProperty("net.i2p.router.web.ConfigNetHandler.noncePrev", prev);
-    System.setProperty("net.i2p.router.web.ConfigNetHandler.nonce", new java.util.Random().nextLong()+""); %>
- <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigNetHandler.nonce")%>" >
+ <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
  <input type="hidden" name="action" value="blah" >
  <h3><%=intl._("Bandwidth limiter")%></h3><p>
  <b><%=intl._("I2P will work best if you configure your rates to match the speed of your internet connection.")%></b>
@@ -168,7 +165,7 @@
     <input type="radio" class="optbox" name="ntcpAutoPort" value="1" <%=nethelper.getTcpAutoPortChecked(1) %> >
     <%=intl._("Specify Port")%>:
     <input name ="ntcpport" type="text" size="5" maxlength="5" value="<jsp:getProperty name="nethelper" property="ntcpport" />" ><br>
- </p><p><b><%=intl._("Note")%>: <%=intl._("Changing these settings will restart your router.")%></b></p>
+ </p><p><b><%=intl._("Notes")%>: <%=intl._("a) Do not reveal your port numbers to anyone!   b) Changing these settings will restart your router.")%></b></p>
 <hr><div class="formaction">
 <input type="reset" value="<%=intl._("Cancel")%>" >
 <input type="submit" name="save" value="<%=intl._("Save changes")%>" >
diff --git a/apps/routerconsole/jsp/configadvanced.jsp b/apps/routerconsole/jsp/configadvanced.jsp
index a327c02909843c0c998c3168e1b5c28b2afeda2a..9acfd65ec13fe439bc5234bc2da5d724492dd326 100644
--- a/apps/routerconsole/jsp/configadvanced.jsp
+++ b/apps/routerconsole/jsp/configadvanced.jsp
@@ -25,10 +25,7 @@
  <div class="configure">
  <div class="wideload">
  <form action="" method="POST">
- <% String prev = System.getProperty("net.i2p.router.web.ConfigAdvancedHandler.nonce");
-    if (prev != null) System.setProperty("net.i2p.router.web.ConfigAdvancedHandler.noncePrev", prev);
-    System.setProperty("net.i2p.router.web.ConfigAdvancedHandler.nonce", new java.util.Random().nextLong()+""); %>
- <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigAdvancedHandler.nonce")%>" >
+ <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
  <input type="hidden" name="action" value="blah" >
  <h3><%=intl._("Advanced I2P Configuration")%></h3>
  <textarea rows="32" cols="60" name="config" wrap="off" spellcheck="false"><jsp:getProperty name="advancedhelper" property="settings" /></textarea><br><hr>
diff --git a/apps/routerconsole/jsp/configclients.jsp b/apps/routerconsole/jsp/configclients.jsp
index ec34b1079d2c3049ca171879afc324d302dec5c1..9d74d49901f46fbc58847b8c83a4a55844fab174 100644
--- a/apps/routerconsole/jsp/configclients.jsp
+++ b/apps/routerconsole/jsp/configclients.jsp
@@ -27,18 +27,17 @@ button span.hide{
  <jsp:setProperty name="formhandler" property="nonce" value="<%=request.getParameter("nonce")%>" />
  <jsp:setProperty name="formhandler" property="settings" value="<%=request.getParameterMap()%>" />
  <jsp:getProperty name="formhandler" property="allMessages" />
- <div class="configure"><form action="" method="POST">
- <% String prev = System.getProperty("net.i2p.router.web.ConfigClientsHandler.nonce");
-    if (prev != null) System.setProperty("net.i2p.router.web.ConfigClientsHandler.noncePrev", prev);
-    System.setProperty("net.i2p.router.web.ConfigClientsHandler.nonce", new java.util.Random().nextLong()+""); %>
- <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigClientsHandler.nonce")%>" >
- <% /* set hidden default */ %>
- <button type="submit" name="action" value="" style="display:none" >Cancel</button>
+ <div class="configure">
+<%
+    String pageNonce = formhandler.getNewNonce();
+%>
  <h3><%=intl._("Client Configuration")%></h3><p>
  <%=intl._("The Java clients listed below are started by the router and run in the same JVM.")%>
  </p><div class="wideload">
- <p><jsp:getProperty name="clientshelper" property="form1" />
- </p><p><i><%=intl._("To change other client options, edit the file")%>
+<form action="" method="POST">
+<input type="hidden" name="nonce" value="<%=pageNonce%>" >
+<jsp:getProperty name="clientshelper" property="form1" />
+<p><i><%=intl._("To change other client options, edit the file")%>
  <%=net.i2p.router.startup.ClientAppConfig.configFile(net.i2p.I2PAppContext.getGlobalContext()).getAbsolutePath()%>.
  <%=intl._("All changes require restart to take effect.")%></i>
  </p><hr><div class="formaction">
@@ -47,9 +46,12 @@ button span.hide{
  <input type="submit" name="edit" value="<%=intl._("Add Client")%>" />
 <% } %>
  <input type="submit" name="action" value="<%=intl._("Save Client Configuration")%>" />
-</div></div>
+</div></form></div>
 
-<h3><a name="i2cp"></a><%=intl._("Advanced Client Interface Configuration")%></h3><p>
+<h3><a name="i2cp"></a><%=intl._("Advanced Client Interface Configuration")%></h3>
+<form action="" method="POST">
+<input type="hidden" name="nonce" value="<%=pageNonce%>" >
+<p>
 <b><%=intl._("External I2CP (I2P Client Protocol) Interface Configuration")%></b><br>
 <input type="radio" class="optbox" name="mode" value="1" <%=clientshelper.i2cpModeChecked(1) %> >
 <%=intl._("Enabled without SSL")%><br>
@@ -89,32 +91,41 @@ button span.hide{
 </p><hr><div class="formaction">
 <input type="submit" name="foo" value="<%=intl._("Cancel")%>" />
 <input type="submit" name="action" value="<%=intl._("Save Interface Configuration")%>" />
-</div>
+</div></form>
 
 <h3><a name="webapp"></a><%=intl._("WebApp Configuration")%></h3><p>
  <%=intl._("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 separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook).")%>
  </p><p>
  <%=intl._("A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method.")%>
- </p><div class="wideload"><p>
+ </p><div class="wideload">
+<form action="" method="POST">
+<input type="hidden" name="nonce" value="<%=pageNonce%>" >
  <jsp:getProperty name="clientshelper" property="form2" />
- </p><p>
- <i><%=intl._("All changes require restart to take effect.")%></i>
+ <p><i><%=intl._("All changes require restart to take effect.")%></i>
  </p><hr><div class="formaction">
  <input type="submit" name="action" value="<%=intl._("Save WebApp Configuration")%>" />
-</div></div>
+</div></form></div>
+
 <% if (clientshelper.showPlugins()) { %>
 <h3><a name="pconfig"></a><%=intl._("Plugin Configuration")%></h3><p>
  <%=intl._("The plugins listed below are started by the webConsole client.")%>
- </p><div class="wideload"><p>
+ </p><div class="wideload">
+<form action="" method="POST">
+<input type="hidden" name="nonce" value="<%=pageNonce%>" >
  <jsp:getProperty name="clientshelper" property="form3" />
- </p><hr><div class="formaction">
+<hr><div class="formaction">
  <input type="submit" name="action" value="<%=intl._("Save Plugin Configuration")%>" />
-</div></div><h3><a name="plugin"></a><%=intl._("Plugin Installation")%></h3><p>
+</div></form></div>
+
+<h3><a name="plugin"></a><%=intl._("Plugin Installation")%></h3><p>
  <%=intl._("To install a plugin, enter the download URL:")%>
- </p><div class="wideload"><p>
+ </p><div class="wideload">
+<form action="" method="POST">
+<input type="hidden" name="nonce" value="<%=pageNonce%>" >
+<p>
  <input type="text" size="60" name="pluginURL" >
  </p><hr><div class="formaction">
  <input type="submit" name="action" value="<%=intl._("Install Plugin")%>" />
- </div></div>
+ </div></form></div>
 <% } %>
-</form></div></div></body></html>
+</div></div></body></html>
diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp
index 7438f558069b999383d00e1fea897c37bd591d57..9188f56dfac71a7eb9fc594ed877de66addad987 100644
--- a/apps/routerconsole/jsp/configkeyring.jsp
+++ b/apps/routerconsole/jsp/configkeyring.jsp
@@ -27,10 +27,7 @@
 </p></div>
 
  <form action="" method="POST">
- <% String prev = System.getProperty("net.i2p.router.web.ConfigKeyringHandler.nonce");
-    if (prev != null) System.setProperty("net.i2p.router.web.ConfigKeyringHandler.noncePrev", prev);
-    System.setProperty("net.i2p.router.web.ConfigKeyringHandler.nonce", new java.util.Random().nextLong()+""); %>
- <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigKeyringHandler.nonce")%>" >
+ <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
  <h3><%=intl._("Manual Keyring Addition")%></h3><p>
  <%=intl._("Enter keys for encrypted remote destinations here.")%>
  <%=intl._("Keys for local destinations must be entered on the")%> <a href="i2ptunnel/"><%=intl._("I2PTunnel page")%></a>.
diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp
index c87fd367db1845f070a5f759ef1ba36b5471746e..4c5904a907c2e45e65c3b42234bffa1abdc77546 100644
--- a/apps/routerconsole/jsp/configlogging.jsp
+++ b/apps/routerconsole/jsp/configlogging.jsp
@@ -21,10 +21,7 @@
  <jsp:getProperty name="formhandler" property="allMessages" />
 <div class="configure">
  <form action="" method="POST">
- <% String prev = System.getProperty("net.i2p.router.web.ConfigLoggingHandler.nonce");
-    if (prev != null) System.setProperty("net.i2p.router.web.ConfigLoggingHandler.noncePrev", prev);
-    System.setProperty("net.i2p.router.web.ConfigLoggingHandler.nonce", new java.util.Random().nextLong()+""); %>
- <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigLoggingHandler.nonce")%>" >
+ <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
  <input type="hidden" name="action" value="blah" >
  <h3><%=intl._("Configure I2P Logging Options")%></h3>
  <div class="wideload">
@@ -41,7 +38,7 @@
             <br> <i><%=intl._("('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)")%>
             </i></td>
         </tr><tr><td class="mediumtags" align="right"><b><%=intl._("Max log file size")%>:</b></td>
-          <td><input type="text" name="logfilesize" size="4" value="<jsp:getProperty name="logginghelper" property="maxFileSize" />" ><br></td>
+          <td><input type="text" name="logfilesize" size="10" value="<jsp:getProperty name="logginghelper" property="maxFileSize" />" ><br></td>
         </tr><tr><td class="mediumtags" align="right"><b><%=intl._("Default log level")%>:</b></td>
           <td><jsp:getProperty name="logginghelper" property="defaultLogLevelBox" /><br><i><%=intl._("(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)")%>
           </i></td>
diff --git a/apps/routerconsole/jsp/configpeer.jsp b/apps/routerconsole/jsp/configpeer.jsp
index 188ca56d4d9b68eb4f131a54e59cc6c3b263092f..f3a7097e6bd319411564f0733f98ae81827efe5a 100644
--- a/apps/routerconsole/jsp/configpeer.jsp
+++ b/apps/routerconsole/jsp/configpeer.jsp
@@ -29,10 +29,7 @@
  %>
  <div class="configure">
  <form action="configpeer" method="POST">
- <% String prev = System.getProperty("net.i2p.router.web.ConfigPeerHandler.nonce");
-    if (prev != null) System.setProperty("net.i2p.router.web.ConfigPeerHandler.noncePrev", prev);
-    System.setProperty("net.i2p.router.web.ConfigPeerHandler.nonce", new java.util.Random().nextLong()+""); %>
- <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigPeerHandler.nonce")%>" />
+ <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
  <a name="sh"> </a>
  <a name="unsh"> </a>
  <a name="bonus"> </a>
diff --git a/apps/routerconsole/jsp/configreseed.jsp b/apps/routerconsole/jsp/configreseed.jsp
index 593e410d374eea9cb09cb982035d2bb2e87a1a5c..87707444a25861655ff980cda45e9184efbee155 100644
--- a/apps/routerconsole/jsp/configreseed.jsp
+++ b/apps/routerconsole/jsp/configreseed.jsp
@@ -23,10 +23,7 @@
 <jsp:setProperty name="formhandler" property="settings" value="<%=request.getParameterMap()%>" />
 <jsp:getProperty name="formhandler" property="allMessages" />
 <div class="configure"><form action="" method="POST">
-<%  String prev = System.getProperty("net.i2p.router.web.ConfigReseedHandler.nonce");
-    if (prev != null) System.setProperty("net.i2p.router.web.ConfigReseedHandler.noncePrev", prev);
-    System.setProperty("net.i2p.router.web.ConfigReseedHandler.nonce", new java.util.Random().nextLong()+""); %>
-<input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigReseedHandler.nonce")%>" >
+<input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
 <h3><%=intl._("Reseeding Configuration")%></h3>
 <p><%=intl._("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.")%>
 <%=intl._("If reseeding has failed, you should first check your network connection.")%>
diff --git a/apps/routerconsole/jsp/configservice.jsp b/apps/routerconsole/jsp/configservice.jsp
index f87479a92feca0339b59a678b3c5d8f18f178ab4..21990fc0f1e9b4f4568ed6214269a2a858061d72 100644
--- a/apps/routerconsole/jsp/configservice.jsp
+++ b/apps/routerconsole/jsp/configservice.jsp
@@ -19,10 +19,7 @@
  <jsp:getProperty name="formhandler" property="allMessages" />
  <div class="configure">
  <form action="" method="POST">
- <% String prev = System.getProperty("net.i2p.router.web.ConfigServiceHandler.nonce");
-    if (prev != null) System.setProperty("net.i2p.router.web.ConfigServiceHandler.noncePrev", prev);
-    System.setProperty("net.i2p.router.web.ConfigServiceHandler.nonce", new java.util.Random().nextLong()+""); %>
- <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigServiceHandler.nonce")%>" >
+ <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
  <h3><%=intl._("Shutdown the router")%></h3>
  <p><%=intl._("Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes.")%> 
     <%=intl._("If you need to kill the router immediately, that option is available as well.")%></p>
@@ -49,7 +46,8 @@
  <hr><div class="formaction">
  <input type="submit" name="action" value="<%=intl._("Show systray icon")%>" >
  <input type="submit" name="action" value="<%=intl._("Hide systray icon")%>" >
-</div><h3><%=intl._("Run on startup")%></h3>
+ </div>
+ <h3><%=intl._("Run on startup")%></h3>
  <p><%=intl._("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.")%> 
     <%=intl._("If you prefer the command line, you can also run the ")%> <code>install_i2p_service_winnt.bat</code> (<%=intl._("or")%>
  <code>uninstall_i2p_service_winnt.bat</code>).</p>
diff --git a/apps/routerconsole/jsp/configstats.jsp b/apps/routerconsole/jsp/configstats.jsp
index fde10837db0c98212924fa8b488aa4e315367e37..d522f56d8756c695b62e640d92d99d4d38e5d6b2 100644
--- a/apps/routerconsole/jsp/configstats.jsp
+++ b/apps/routerconsole/jsp/configstats.jsp
@@ -15,15 +15,19 @@ function toggleAll(category)
 	var inputs = document.getElementsByTagName("input");
 	for(index = 0; index < inputs.length; index++)
 	{
-		if(inputs[index].id == category)
+		var classes = inputs[index].className.split(' ');
+		for (var idx = 0; idx < classes.length; idx++)
 		{
-			if(inputs[index].checked == 0)
+			if(classes[idx] == category)
 			{
-				inputs[index].checked = 1;
-			}
-			else if(inputs[index].checked == 1)
-			{
-				inputs[index].checked = 0;
+				if(inputs[index].checked == 0)
+				{
+					inputs[index].checked = 1;
+				}
+				else if(inputs[index].checked == 1)
+				{
+					inputs[index].checked = 0;
+				}
 			}
 		}
 		if(category == '*')
@@ -67,26 +71,23 @@ function toggleAll(category)
  <jsp:setProperty name="statshelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
  <div class="configure">
  <form id="statsForm" name="statsForm" action="" method="POST">
- <% String prev = System.getProperty("net.i2p.router.web.ConfigStatsHandler.nonce");
-    if (prev != null) System.setProperty("net.i2p.router.web.ConfigStatsHandler.noncePrev", prev);
-    System.setProperty("net.i2p.router.web.ConfigStatsHandler.nonce", new java.util.Random().nextLong()+""); %>
  <input type="hidden" name="action" value="foo" >
- <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigStatsHandler.nonce")%>" >
+ <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
  <h3><%=intl._("Configure I2P Stat Collection")%></h3>
  <p><%=intl._("Enable full stats?")%>
  <input type="checkbox" class="optbox" name="isFull" value="true" <%
  if (statshelper.getIsFull()) { %>checked="true" <% } %> >
  (<%=intl._("change requires restart to take effect")%>)<br>
  <%=intl._("Stat file")%>: <input type="text" name="filename" value="<%=statshelper.getFilename()%>" ><br>
-<%=intl._("Filter")%>: (<a href="javascript: void(null);" onclick="toggleAll('*')"><%=intl._("toggle all")%></a>)<br></p>
+<%=intl._("Filter")%>: (<a href="javascript:void(null);" onclick="toggleAll('*')"><%=intl._("toggle all")%></a>)<br></p>
  <div class="wideload">
- <p><table>
+ <table>
  <% while (statshelper.hasMoreStats()) {
       while (statshelper.groupRequired()) { %>
  <tr class="tablefooter">
-     <td align="left" colspan="3">
+     <td align="left" colspan="3" id=<%=statshelper.getCurrentGroupName()%>>
      <b><%=statshelper.getCurrentGroupName()%></b>
-     (<a href="javascript: void(null);" onclick="toggleAll('<%=statshelper.getCurrentGroupName()%>')"><%=intl._("toggle all")%></a>)
+     (<a href="javascript:void(null);" onclick="toggleAll('<%=statshelper.getCurrentGroupName()%>')"><%=intl._("toggle all")%></a>)
      </td></tr>
  <tr class="tablefooter">
     <td align="center"><b><%=intl._("Log")%></b></td>
@@ -96,11 +97,11 @@ function toggleAll(category)
      } // end iterating over required groups for the current stat %>
  <tr><td align="center">
      <a name="<%=statshelper.getCurrentStatName()%>"></a>
-     <input id="<%=statshelper.getCurrentGroupName()%>" type="checkbox" class="optbox" name="statList" value="<%=statshelper.getCurrentStatName()%>" <%
+     <input type="checkbox" class="optbox <%=statshelper.getCurrentGroupName()%>" name="statList" value="<%=statshelper.getCurrentStatName()%>" <%
      if (statshelper.getCurrentIsLogged()) { %>checked="true" <% } %> ></td>
      <td align="center">
      <% if (statshelper.getCurrentCanBeGraphed()) { %>
-       <input id="<%=statshelper.getCurrentGroupName()%>" type="checkbox" class="optbox" name="graphList" value="<%=statshelper.getCurrentGraphName()%>" <%
+       <input type="checkbox" class="optbox <%=statshelper.getCurrentGroupName()%>" name="graphList" value="<%=statshelper.getCurrentGraphName()%>" <%
        if (statshelper.getCurrentIsGraphed()) { %>checked="true" <% } %> ><% } %></td>
      <td align="left"><b><%=statshelper.getCurrentStatName()%>:</b><br>
      <%=statshelper.getCurrentStatDescription()%></td></tr><%
@@ -113,4 +114,4 @@ function toggleAll(category)
 <input type="reset" value="<%=intl._("Cancel")%>" >
 <input type="submit" name="shouldsave" value="<%=intl._("Save changes")%>" >
 </td></tr>
- </table></p></div></form></div></div></body></html>
+</table></div></form></div></div></body></html>
diff --git a/apps/routerconsole/jsp/configtunnels.jsp b/apps/routerconsole/jsp/configtunnels.jsp
index 1c1393280a549b76bc9f4686934230256cf358f9..15c266d8c1838b52497232e8a014a2728fd99ea9 100644
--- a/apps/routerconsole/jsp/configtunnels.jsp
+++ b/apps/routerconsole/jsp/configtunnels.jsp
@@ -31,10 +31,7 @@
  <%=intl._("Change these settings with care, and adjust them if you have problems.")%>
 <div class="wideload">
 <form action="" method="POST">
- <% String prev = System.getProperty("net.i2p.router.web.ConfigTunnelsHandler.nonce");
-    if (prev != null) System.setProperty("net.i2p.router.web.ConfigTunnelsHandler.noncePrev", prev);
-    System.setProperty("net.i2p.router.web.ConfigTunnelsHandler.nonce", new java.util.Random().nextLong()+""); %>
- <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigTunnelsHandler.nonce")%>" >
+ <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
  <input type="hidden" name="action" value="blah" >
  <jsp:getProperty name="tunnelshelper" property="form" />
  <%=intl._("Note")%>: <%=intl._("Exploratory tunnel setting changes are stored in the router.config file.")%>
@@ -44,4 +41,4 @@
 <input type="reset" value="<%=intl._("Cancel")%>" >
 <input type="submit" name="shouldsave" value="<%=intl._("Save changes")%>" >
 </div>
- </form></p></div></div></div></body></html>
+ </form></div></div></div></body></html>
diff --git a/apps/routerconsole/jsp/configui.jsp b/apps/routerconsole/jsp/configui.jsp
index 9f3d32e4fada8cc7f0cb104b7895df1fdb02c14d..e67b113405c22979f0c68ee74822ce75f768ae78 100644
--- a/apps/routerconsole/jsp/configui.jsp
+++ b/apps/routerconsole/jsp/configui.jsp
@@ -24,10 +24,16 @@
  <jsp:getProperty name="formhandler" property="allMessages" />
 <div class="configure"><div class="topshimten"><h3><%=uihelper._("Router Console Theme")%></h3></div>
  <form action="" method="POST">
- <% String prev = System.getProperty("net.i2p.router.web.ConfigUIHandler.nonce");
-    if (prev != null) System.setProperty("net.i2p.router.web.ConfigUIHandler.noncePrev", prev);
-    System.setProperty("net.i2p.router.web.ConfigUIHandler.nonce", new java.util.Random().nextLong()+""); %>
- <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigUIHandler.nonce")%>" >
+<%
+    /** lang setting is done in css.jsi, not in ConfigUIHandler */
+    String consoleNonce = System.getProperty("router.consoleNonce");
+    if (consoleNonce == null) {
+        consoleNonce = Long.toString(new java.util.Random().nextLong());
+        System.setProperty("router.consoleNonce", consoleNonce);
+    }
+%>
+ <input type="hidden" name="consoleNonce" value="<%=consoleNonce%>" >
+ <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
  <input type="hidden" name="action" value="blah" >
 <%
  String userAgent = request.getHeader("User-Agent");
diff --git a/apps/routerconsole/jsp/configupdate.jsp b/apps/routerconsole/jsp/configupdate.jsp
index 47b8b9310858344f0b520c526b28ad4531308441..4b1bf4bc60c6728c27d2765a8b5a099fc7f9b185 100644
--- a/apps/routerconsole/jsp/configupdate.jsp
+++ b/apps/routerconsole/jsp/configupdate.jsp
@@ -23,10 +23,7 @@
 <i><jsp:getProperty name="updatehelper" property="newsStatus" /></i></div>
 <div class="configure">
  <form action="" method="POST">
- <% String prev = System.getProperty("net.i2p.router.web.ConfigUpdateHandler.nonce");
-    if (prev != null) System.setProperty("net.i2p.router.web.ConfigUpdateHandler.noncePrev", prev);
-    System.setProperty("net.i2p.router.web.ConfigUpdateHandler.nonce", new java.util.Random().nextLong()+""); %>
- <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigUpdateHandler.nonce")%>" >
+ <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" >
  <% /* set hidden default */ %>
  <input type="submit" name="action" value="" style="display:none" >
       <h3><%=intl._("Check for I2P and news updates")%></h3>
diff --git a/apps/routerconsole/jsp/css.jsi b/apps/routerconsole/jsp/css.jsi
index 613b32a6785538f0aa56feda521723e59c207638..8e133a1279dfd10370d78d17bf57fb693dc33197 100644
--- a/apps/routerconsole/jsp/css.jsi
+++ b/apps/routerconsole/jsp/css.jsi
@@ -10,9 +10,12 @@
    if (request.getCharacterEncoding() == null)
        request.setCharacterEncoding("UTF-8");
 
-   response.setHeader("Pragma", "no-cache");
-   response.setHeader("Cache-Control","no-cache");
-   response.setDateHeader("Expires", 0);
+   // Now that we use POST for most forms, these prevent the back button from working after a form submit
+   // Just let the browser do its thing
+   //response.setHeader("Pragma", "no-cache");
+   //response.setHeader("Cache-Control","no-cache");
+   //response.setDateHeader("Expires", 0);
+
    // the above will b0rk if the servlet engine has already flushed
    // the response prior to including this file, so it should be
    // near the top
@@ -26,7 +29,10 @@
 <jsp:useBean class="net.i2p.router.web.CSSHelper" id="intl" scope="request" />
 <jsp:setProperty name="intl" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
 <%
-   intl.setLang(request.getParameter("lang"));
+   String conNonceParam = request.getParameter("consoleNonce");
+   if (conNonceParam != null && conNonceParam.equals(System.getProperty("router.consoleNonce"))) {
+       intl.setLang(request.getParameter("lang"));
+   }
 %>
 <link href="<%=intl.getTheme(request.getHeader("User-Agent"))%>console.css" rel="stylesheet" type="text/css">
 <%
diff --git a/apps/routerconsole/jsp/dumpprofile.jsp b/apps/routerconsole/jsp/dumpprofile.jsp
index dfdcc0b6e52ffb3687165dce6ff2af104797b8b1..af6c8de744c5319a1dbac503ebc66cce641375ef 100644
--- a/apps/routerconsole/jsp/dumpprofile.jsp
+++ b/apps/routerconsole/jsp/dumpprofile.jsp
@@ -1,5 +1,6 @@
 <%@page contentType="text/plain"
 %><jsp:useBean id="helper" class="net.i2p.router.web.StatHelper"
-/><jsp:setProperty name="helper" property="peer" value="<%=request.getParameter("peer")%>"
+/><jsp:setProperty name="helper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>"
+/><jsp:setProperty name="helper" property="peer" value="<%=net.i2p.data.DataHelper.stripHTML(request.getParameter("peer"))%>"
 /><% helper.storeWriter(out);
 %><jsp:getProperty name="helper" property="profile" />
diff --git a/apps/routerconsole/jsp/flags.jsp b/apps/routerconsole/jsp/flags.jsp
index c736e8b469fb9ecc45144f7276707f02a39a3464..7148782e31bd00b0e7a0670d30994db52d8190fe 100644
--- a/apps/routerconsole/jsp/flags.jsp
+++ b/apps/routerconsole/jsp/flags.jsp
@@ -11,28 +11,49 @@
  *  flags.jsp?c=de => icons/flags/de.png
  *  with headers set so the browser caches.
  */
-boolean rendered = false;
 String c = request.getParameter("c");
 if (c != null && c.length() > 0) {
     java.io.OutputStream cout = response.getOutputStream();
-    response.setContentType("image/png");
-    response.setHeader("Cache-Control", "max-age=86400");  // cache for a day
     String base = net.i2p.I2PAppContext.getGlobalContext().getBaseDir().getAbsolutePath();
     String file = "docs" + java.io.File.separatorChar + "icons" + java.io.File.separatorChar +
                   "flags" + java.io.File.separatorChar + c + ".png";
+    java.io.File ffile = new java.io.File(base, file);
+    long lastmod = ffile.lastModified();
+    if (lastmod > 0) {
+        long iflast = request.getDateHeader("If-Modified-Since");
+        // iflast is -1 if not present; round down file time
+        if (iflast >= ((lastmod / 1000) * 1000)) {
+            response.sendError(304, "Not Modified");
+            return;
+        }
+        response.setDateHeader("Last-Modified", lastmod);
+        // cache for a day
+        response.setDateHeader("Expires", net.i2p.I2PAppContext.getGlobalContext().clock().now() + 86400000l);
+        response.setHeader("Cache-Control", "public, max-age=86400");
+    }
+    long length = ffile.length();
+    if (length > 0)
+        response.setHeader("Content-Length", Long.toString(length));
+    response.setContentType("image/png");
     try {
         net.i2p.util.FileUtil.readFile(file, base, cout);
-        rendered = true;
-    } catch (java.io.IOException ioe) {}
-    if (rendered)
-        cout.close();
+    } catch (java.io.IOException ioe) {
+        // prevent 'Committed' IllegalStateException from Jetty
+        if (!response.isCommitted()) {
+            response.sendError(403, ioe.toString());
+        }  else {
+            net.i2p.I2PAppContext.getGlobalContext().logManager().getLog(getClass()).error("Error serving flags/" + c + ".png", ioe);
+            // Jetty doesn't log this
+            throw ioe;
+        }
+    }
+} else {
+    /*
+     *  Send a 403 instead of a 404, because the server sends error.jsp
+     *  for 404 errors, complete with the summary bar, which would be
+     *  a huge load for a page full of flags if the user didn't have the
+     *  flags directory for some reason.
+     */
+    response.sendError(403, "No flag specified");
 }
-/*
- *  Send a 403 instead of a 404, because the server sends error.jsp
- *  for 404 errors, complete with the summary bar, which would be
- *  a huge load for a page full of flags if the user didn't have the
- *  flags directory for some reason.
- */
-if (!rendered)
-    response.sendError(403, "Flag not found");
 %>
\ No newline at end of file
diff --git a/apps/routerconsole/jsp/help.jsp b/apps/routerconsole/jsp/help.jsp
index 636e8800d12c9fabdddec7631d53bcfc77058140..d166532de27e323fd20bec44c6221111071056b0 100644
--- a/apps/routerconsole/jsp/help.jsp
+++ b/apps/routerconsole/jsp/help.jsp
@@ -47,7 +47,7 @@ This may range from 8-10 to several hundred, depending on your total bandwidth,
 shared bandwidth, and locally-generated traffic.
 The second number is the number of peers seen in the last hour or so.
 Do not be concerned if these numbers vary widely.
-<a href="configstats.jsp#router.activePeers">[Enable graphing]</a>.
+First enable all stats to <a href="configstats.jsp#router.activePeers">[Enable graphing]</a>.
 <li class="tidylist"><b>Fast:</b>
 This is the number of peers you use for building client tunnels. It is generally in the
 range 8-30. Your fast peers are shown on the <a href="profiles.jsp">profiles page</a>.
@@ -56,7 +56,7 @@ range 8-30. Your fast peers are shown on the <a href="profiles.jsp">profiles pag
 This is the number of peers you use for building some of your exploratory tunnels. It is generally in the
 range 8-75. The fast peers are included in the high capacity tier.
 Your high capacity peers are shown on the <a href="profiles.jsp">profiles page</a>.
-<a href="configstats.jsp#router.highCapacityPeers">[Enable graphing]</a>.
+First enable all stats to <a href="configstats.jsp#router.highCapacityPeers">[Enable graphing]</a>.
 <li class="tidylist"><b>Well Integrated:</b>
 This is the number of peers you use for network database inquiries.
 These are usually the "floodfill" peers.
diff --git a/apps/routerconsole/jsp/help_ar.jsp b/apps/routerconsole/jsp/help_ar.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..b1a4c6f9284ebd68697c8a6c18f52294c0b681a4
--- /dev/null
+++ b/apps/routerconsole/jsp/help_ar.jsp
@@ -0,0 +1,177 @@
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<%
+  /*
+   *   Do not tag this file for translation - copy it to help_xx.jsp and translate inline.
+   */
+%>
+<html><head><title>I2P مساعدة لوحة التحكم</title>
+<%@include file="css.jsi" %>
+</head><body>
+<%@include file="summary.jsi" %>
+<h1>I2P مساعدة لوحة التحكم</h1>
+<div class="main" id="main" dir="rtl" lang="ar"><p>
+اذا رغبت في المساعدة أو ترجمة الوثائق، أو المساعدة في أشياء أخرى، انظر اسفله
+
+<a href="http://www.i2p2.i2p/getinvolved.html">تطوع</a>
+</p><p>المزيد من المساعدة هنا:
+<ul class="links">
+<li class="tidylist"><a href="http://www.i2p2.i2p/faq.html">ابئلة شائعة www.i2p2.i2p</a>
+<br>يمكن ايضا<a href="http://forum.i2p/">I2P منتدى</a>
+او بالدردشة على  IRC.</p>
+
+<h2>شريط المعلومات</h2><p>
+يمكن للاحصائات أن
+<a href="configstats.jsp">تتغير</a> لكي تظهر على شكل
+<a href="graphs.jsp">رسم بياني</a> للمزيد من التحاليل
+</p><h3>عام</h3><ul>
+<li class="tidylist"><b>:هوية</b>
+الحروف الأولى (24 bits) من 44-حرف (256-) Base64 hash.
+The full hash is shown on your <a href="netdb.jsp?r=.">صفحة معلومات الموجه</a>.
+هذا لا يكشف عن عنوان  IP الخاص بك لأحد.
+<li class="tidylist"><b>الاصدار</b>
+اصدار I2P المستعمل
+<li class="tidylist"><b>الآن</b>
+الوقت الحالي (UTC)والانحراف الممكن. يحتاج I2P الى ساعة مضبوطة. اذا كان انحراف الساعة اكثر من بضع ثواني، قم بتصحيح الخلل.
+<li class="tidylist"><b>إمكانية الوصول</b>
+امكانية الاتصال الخارجي بالموجه
+المزيد من التفاصيل في  <a href="config.jsp#help">صفحة الاعدادات</a>.
+</ul><h3>النظائر</h3><ul>
+<li class="tidylist"><b>مفعل</b>
+هذا هو عدد النظائر التي تم إرسال أو تلقيها رسالة  في الدقائق القليلة الماضية.
+قد يكون هذا النطاق 8-10 الى عدة مئات، اعتمادا على عرض النطاق الترددي الإجمالي ،
+تقاسم عرض النطاق الترددي ، وحركة المرور المولدة محليا.
+والرقم الثاني هو عدد من نظرائه ينظر في آخر ساعة أو نحو ذلك.
+لا تشعر بالقلق إذا كانت هذه الأرقام تختلف على نطاق واسع.
+<a href="configstats.jsp#router.activePeers">[تفعيل الرسم البياني]</a>.
+<li class="tidylist"><b>سريع</b>
+هذا هو عدد النظائر التي تستعملها لانشاء أنفاق جديدة. هي في نطاق 8-30. النظائر السريعة في 
+ <a href="profiles.jsp">صفحة البروفايل</a>.
+<a href="configstats.jsp#router.fastPeers">[تفعيل الرسم البياني]</a>.
+<li class="tidylist"><b>قدرة عالية</b>
+هذا هو عدد النظائر التي تستعملها لانشاء أنفاق الاكتشاف. هي في نطاق 8-75. النظائر السريعة. النظائر القدرة عالية تظهر هنا.
+ <a href="profiles.jsp">صفحة البروفايل</a>.
+<a href="configstats.jsp#router.highCapacityPeers">[تفعيل الرسم البياني]</a>.
+<li class="tidylist"><b>المندمجة جيدا</b>
+هذا هو عدد النظائر المستعملة في الاتصال بقاعدة البيانات. النظائر المندمجة جيدا موجودة في أسفل
+<a href="profiles.jsp">صفحة البروفايل</a>.
+<li class="tidylist"><b>المعروفة</b>
+هذا هو عدد الموجهات المعروفة.
+والظاهرة في صفحة <a href="netdb.jsp">قاعدة البيانات</a>
+هي مابين 100 الى 1000 او أكثر.
+هذا العدد ليس حجم الاجمالي للشبكة، 
+يمكنه ان بتغيير حسب سرعة الاتصال.
+
+</ul><h3>سرعة الاتصال الداخلي/خارجي</h3><div align="justify">
+السرعة ب بايت في الثانية
+غير السرعة في <a href="config.jsp#help">صفحة الاعدادات</a>.
+السرعة <a href="graphs.jsp">مرسومة</a> </div>
+<h3>الوجهات الداخلية</h3><div align="justify">
+الاتصالات الداخلية 
+البرامج المحلية المتصلة عبر الموجه
+<a href="i2ptunnel/index.jsp">I2PTunnel</a>
+او برامج خارجية متصلة SAM, BOB, او مباشرة بـ I2CP.
+</div><h3>الأنفاق الداخلة/خارجة</h3><div align="justify">
+الأنفاق الحالية موجودة في <a href="tunnels.jsp">صفحة الأنفاق</a>.</div><ul>
+<li class="tidylist"><div align="justify"><b>تصفح</b>
+الأنفاق المستخدمة من طرف الموجه تستعمل في الاتصال مع النظائر، انشاء انفاق جديدة.
+</div>
+<li class="tidylist"><b>المستخدمين</b>
+الأنفاق المستخدمة من طرف الموجه 
+<li class="tidylist"><b>المشاركة</b>
+الأنفاق المنشئة من طرف موجهات أخرى عبر موجهك.
+هذا ينبني على درجة استخدام الشبكة، مقدار المشاركة...
+يمكنك تغيير درجة المشاركة بـ <a href="config.jsp#help">صفحة الاعدادات</a>.
+You may also limit the total number by setting <tt>router.maxParticipatingTunnels=nnn</tt> on
+the <a href="configadvanced.jsp">صفحة الاعدادات المتقدمة</a>. <a href="configstats.jsp#tunnel.participatingTunnels">[تفعيل الرسم البياني]</a>.
+<li class="tidylist"><b>نسبة المشاركة</b>
+عدد الانفاق المشاركة، مقسوما على عدد اجمالي الانفاق.
+عدد أكبر من 1.00 يعني انك تساهم في الشبكة بعدد اكبر مما تستهلك.
+</ul>
+
+<h3>ازدحام</h3><div align="justify">
+بعض مشرات ازدحام الموجه</div><ul>
+<li class="tidylist"><b>Job lag:</b>
+How long jobs are waiting before execution. The job queue is listed on the <a href="jobs.jsp">jobs page</a>.
+Unfortunately, there are several other job queues in the router that may be congested,
+and their status is not available in the router console.
+The job lag should generally be zero.
+If it is consistently higher than 500ms, your computer is very slow, or the
+router has serious problems.
+<a href="configstats.jsp#jobQueue.jobLag">[تفعيل الرسم البياني]</a>.
+<li class="tidylist"><b>Message delay:</b>
+How long an outbound message waits in the queue.
+This should generally be a few hundred milliseconds or less.
+If it is consistently higher than 1000ms, your computer is very slow,
+or you should adjust your bandwidth limits, or your (bittorrent?) clients
+may be sending too much data and should have their transmit bandwidth limit reduced.
+<a href="configstats.jsp#transport.sendProcessingTime">[تفعيل الرسم البياني]</a> (transport.sendProcessingTime).
+<li class="tidylist"><b>Tunnel lag:</b>
+This is the round trip time for a tunnel test, which sends a single message
+out a client tunnel and in an exploratory tunnel, or vice versa.
+It should usually be less than 5 seconds.
+If it is consistently higher than that, your computer is very slow,
+or you should adjust your bandwidth limits, or there are network problems.
+<a href="configstats.jsp#tunnel.testSuccessTime">[تفعيل الرسم البياني]</a> (tunnel.testSuccessTime).
+<li class="tidylist"><b>Handle backlog:</b>
+This is the number of pending requests from other routers to build a
+participating tunnel through your router.
+It should usually be close to zero.
+If it is consistently high, your computer is too slow,
+and you should reduce your share bandwidth limits.
+<li class="tidylist"><b>Accepting/Rejecting:</b>
+Your router's status on accepting or rejecting
+requests from other routers to build a
+participating tunnel through your router.
+Your router may accept all requests, accept or reject a percentage of requests,
+or reject all requests for a number of reasons, to control
+the bandwidth and CPU demands and maintain capacity for
+local clients.</ul>
+
+<h2>Legal stuff</h2><p>The I2P router (router.jar) and SDK (i2p.jar) are almost entirely public domain, with
+a few notable exceptions:</p><ul>
+<li class="tidylist">ElGamal and DSA code, under the BSD license, written by TheCrypto</li>
+<li class="tidylist">SHA256 and HMAC-SHA256, under the MIT license, written by the Legion of the Bouncycastle</li>
+<li class="tidylist">AES code, under the Cryptix (MIT) license, written by the Cryptix team</li>
+<li class="tidylist">SNTP code, under the BSD license, written by Adam Buckley</li>
+<li class="tidylist">The rest is outright public domain, written by jrandom, mihi, hypercubus, oOo,
+    ugha, duck, shendaras, and others.</li>
+</ul>
+
+<p>On top of the I2P router are a series of client applications, each with their own set of
+licenses and dependencies.  This webpage is being served as part of the I2P routerconsole
+client application, which is built off a trimmed down <a href="http://jetty.mortbay.com/jetty/index.html">Jetty</a>
+instance (trimmed down, as in, we do not include the demo apps or other add-ons, and we simplify configuration),
+allowing you to deploy standard JSP/Servlet web applications into your router.  Jetty in turn makes use of
+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://www.i2p2.i2p/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
+the console, which is a GPL'ed application written by susi23.  The addressbook application, written by
+<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://www.i2p2.i2p/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://www.i2p2.i2p/licenses">license policy</a>.  Source for the I2P code and most bundled
+client applications can be found on our <a href="http://www.i2p2.i2p/download">download page</a>.
+.</p>
+
+<h2>Change Log</h2>
+ <jsp:useBean class="net.i2p.router.web.ContentHelper" id="contenthelper" scope="request" />
+ <% java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "history.txt"); %>
+ <jsp:setProperty name="contenthelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
+ <jsp:setProperty name="contenthelper" property="maxLines" value="256" />
+ <jsp:setProperty name="contenthelper" property="startAtBeginning" value="true" />
+ <jsp:getProperty name="contenthelper" property="textContent" />
+
+ <p><a href="/history.txt">View the full change log</a>
+ </p><hr></div></body></html>
diff --git a/apps/routerconsole/jsp/help_fr.jsp b/apps/routerconsole/jsp/help_fr.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..cd3c3df9d1c8afcd0b01a1653a996325dbf5aa86
--- /dev/null
+++ b/apps/routerconsole/jsp/help_fr.jsp
@@ -0,0 +1,160 @@
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<%
+  /*
+   *   Do not tag this file for translation - copy it to help_xx.jsp and translate inline.
+   */
+%>
+<html><head><title>Console du routeur I2P - Aide</title>
+<%@include file="css.jsi" %>
+</head><body>
+<%@include file="summary.jsi" %>
+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://www.i2p2.i2p/getinvolved_fr.html">volontaires</a>.
+</p><p>D'autres détails sont disponibles ici:
+<ul class="links">
+<li class="tidylist"><a href="http://www.i2p2.i2p/faq.html">FAQ en anglais sur www.i2p2.i2p</a>
+<li class="tidylist"><a href="http://www.i2p2.i2p/faq_fr.html">les FAQ en français</a>.</ul>
+<br>Il y a aussi le <a href="http://forum.i2p/">forum I2P</a>
+et l'IRC.</p>
+
+<h2>Informations du panneau de surveillance</h2><p>
+Plusieurs des statistiques affichées dans le panneau de surveillance peuvent être 
+<a href="configstats.jsp">configurées</a> pour être affichées sous forme de <a href="graphs.jsp">graphiques</a> pour 
+analyse sur la durée.
+</p><h3>GÉNÉRAL</h3><ul>
+<li class="tidylist"><b>Identité locale:</b>
+Cliquez sur "Afficher" pour voir l'empreinte Base64 à 44 caractères (256 bits) de votre routeur. Le hachage 
+complet est affiché sur votre <a href="netdb.jsp?r=.">page d'infos routeur</a>. Ne la divulguez jamais à personne, 
+car l'info routeur contient votre adresse IP.
+<li class="tidylist"><b>Version:</b>
+La version d'I2P qui vous affiche actuellement cette page.
+<li class="tidylist"><b>Lancé depuis:</b>
+Indique depuis combien de temps le routeur tourne.
+<li class="tidylist"><b>Réseau:</b>
+Statut de joignabilité du routeur par les autres routeurs.
+Plus d'infos sur la page de <a href="config.jsp#help">configuration</a>.
+</ul><h3>Pairs</h3><ul>
+<li class="tidylist"><b>Actifs:</b>
+le premier nombre est celui des routeurs avec qui le votre a communiqué dans les dernières minutes. Ça peut varier de 
+8-10 à plusieurs centaines, selon votre bande passante et son rapport de partage, et le trafic généré localement. Le 
+second est celui des pairs vus dans les dernières heures. Ces nombres penvent varier sensiblement sans conséquence.
+<a href="configstats.jsp#router.activePeers">[Activer le graphique]</a> (activer auparavant "toutes 
+les statistiques").
+<li class="tidylist"><b>Rapides:</b>
+le nombre de pairs que vous mettez à contribution pour construire vos tunnels clients. En général dans une tranche de 
+8 à 30. Vos pairs rapides sont détaillés sur la page <a href="profiles.jsp">profils</a>.
+<a href="configstats.jsp#router.fastPeers">[Activer le graphique]</a>.
+<li class="tidylist"><b>Hautes capacités:</b>
+nombre des pairs que vous utilisez pour construire quelques uns de vos tunnels exploratoires. Habituellement de 8 à 75. 
+Les pairs rapides font partie du groupe des "Hautes capacités". Vos pairs à hautes capacités sont aussi listés sur 
+la page <a href="profiles.jsp">profils</a>.
+<a href="configstats.jsp#router.highCapacityPeers">[Activer le graphique]</a>  (activer auparavant "toutes les 
+statistiques").
+<li class="tidylist"><b>Bien intégrés:</b>
+vous utilisez ce groupe pour vos requêtes à la base de données du réseau. Ils sont souvent des pairs de remplissage par 
+diffusion ("floodfill"). Vos pairs "bien intégrés" sont affichés en bas de la même page 
+<a href="profiles.jsp">profils</a>.
+<li class="tidylist"><b>Connus:</b> c'est tous les routeurs dont vous connaissez l'existance. Il sont listés sur la 
+page <a href="netdb.jsp">base de données du réseau</a>. De moins de 100 à 1000 ou plus. Ce nombre ne représente pas la 
+taille totale du réseau; il varie en fonction de votre bande passante totale et son rapport de partage, et du trafic 
+local. I2P n'a pas besoin que chaque routeur connaisse tous les autres.
+</ul><h3>Bande passante entrée/sortie</h3><div align="justify"> 
+Ça parle tout seul. Toutes les valeurs sont en octets par seconde (o/s), pas en bits par seconde (b/s). Modifiez vos 
+limites de bande passante sur la page de <a href="config.jsp#help">configuration</a>.
+Le <a href="graphs.jsp">graphique de bande passante</a> est activé par défaut.</div>
+
+<h3>Destinations locales</h3><div align="justify">
+C'est le nom I2P des applications qui se connectent par votre routeur. Elles peuvent être des clients lancés depuis 
+<a href="i2ptunnel/index.jsp">I2PTunnel</a> ou des programmes tiers qui se connectent via SAM, BOB ou directement à 
+I2CP.
+</div><h3>TUNNELS:</h3><div align="justify">
+Les tunnels actuels sont affichés sur la page <a href="tunnels.jsp">tunnels</a>.</div><ul>
+<li class="tidylist"><div align="justify"><b>Exploratoires:</b> tunnels créés par votre routeur et utilisés avec les 
+pairs diffuseurs pour la création des nouveaux tunnels et le test des tunnels existants.</div>
+<li class="tidylist"><b>Clients:</b> tunnels créés par votre routeur pour chaque utilisation cliente.
+<li class="tidylist"><b>Participants:</b> les tunnels créés par d'autres routeurs et qui passent par le votre. Leur 
+nombre dépend largement de la demande du réseau, de votre part de bande passante partagée, et du trafic local. 
+La méthode recommandée pour limiter leur nombre est de diminuer le rapport de bande passante partagée dans la 
+<a href="config.jsp#help">configuration</a>. Vous pouvez également limiter ce nombre en définissant la variable 
+<tt>router.maxParticipatingTunnels=nnn</tt> dans la <a href="configadvanced.jsp">configuration avancée</a>. 
+<a href="configstats.jsp#tunnel.participatingTunnels">[Activer le graphique]</a>.
+<li class="tidylist"><b>Rapport de partage:</b> le nombre de tunnels participants que vous routez pour les autres, 
+divisé par le nombre total de sauts dans tous vos tunnels exploratoires et clients. S'il est supérieur à 1, cela 
+signifie que vous contribuez à plus de tunnels que vous n'en utilisez.
+</ul>
+
+<h3>ENCOMBREMENT</h3><div align="justify">
+Indications de base sur la charge du routeur:</div><ul>
+<li class="tidylist"><b>Retard de tâches:</b> temps d'attente des tâches avant exécution. La file d'attente est 
+présentée la pages des <a href="jobs.jsp">tâches</a>. Malheureusement, il y a dans le routeur plusieurs autres files 
+d'attentes qui ne peuvent être affichées dans la console. Le retard de tâches devrait rester à zéro en permamence. s'il 
+régulièrement supérieur à 500ms, soit votre PC est très lent, soit le routeur a de sérieux problèmes.
+<a href="configstats.jsp#jobQueue.jobLag">[Activer le graphique]</a>.
+<li class="tidylist"><b>Retard de messages:</b> temps de rétention des messages en file d'attente d'envois, normalement 
+quelques centaines de ms ou moins. Au dessus d'une seconde, votre PC est très lent, vous devriez fignoler vos réglages 
+de bande passante, ou vos clients (bittorrent, iMule...?) envoient trop de données et il faudrait voir à leur tenir 
+la bride. <a href="configstats.jsp#transport.sendProcessingTime">[Activer le graphique]</a> 
+(transport.sendProcessingTime).
+<li class="tidylist"><b>Retard de tunnels:</b> le temps d'aller-retour pour un test de tunnel (envoi d'un seul message 
+par un tunnel client et dans un tunnel exploratoire ou vice versa. Normalement inférieur à 5s. Si c'est constamment 
+supérieur, votre PC est très lent, vous devriez retoucher vos limites de bande passante, ou il y a un problème réseau.
+<a href="configstats.jsp#tunnel.testSuccessTime">[Activer le graphique]</a> (tunnel.testSuccessTime).
+<li class="tidylist"><b>En attente:</b> nombre de requêtes de création de tunnels participants en attente provenant 
+d'autres routeurs. Normalement proche de zéro. Sinon, votre ordinateur est trop lent et vous devriez diminuer votre 
+limite de bande passante partagée.
+<li class="tidylist"><b>Accepte/Refuse:</b> c'est le statut de votre routeur au regard de son comportement vis à vis 
+des demandes de création de tunnels participants provenant d'autres routeurs. Votre routeur peut accepter ou refuser 
+tout ou partie des requêtes, ou les refuser en totalité pour des raisons prévues telles que le contrôle de la bande 
+passante et des ressources CPU en vue de préserver les performances des clients locaux.</ul>
+
+<h2>Informations légales</h2><p>Le routeur I2P (router.jar) et le SDK (i2p.jar) sont presque entièrement dans le 
+domaine public, à quelques notobles exceptions près:</p><ul>
+<li class="tidylist">Le code ElGamal et DSA, sous licence BSD, écrits par TheCrypto</li>
+<li class="tidylist">SHA256 et HMAC-SHA256, sous licence MIT, écrits par the Legion of the Bouncycastle</li>
+<li class="tidylist">Le code AES, sous licence Cryptix (MIT), écrit pas l'équipe the Cryptix</li>
+<li class="tidylist">Le code SNTP, sous licence BSD, écrit par Adam Buckley</li>
+<li class="tidylist">Le reste, directement issu du domaine public, est écrit par jrandom, mihi, hypercubus, oOo,
+    ugha, duck, shendaras, et d'autres.</li>
+</ul>
+
+<p>Au-dessus du routeur I2P on a une série d'applications clientes, ayant chacune ses particularités en termes de 
+licences et de dépendances. Cette page est affichée en tant qu'élément de l'application cliente console du routeur I2P, 
+qui est une version allégée d'une instance <a href="http://jetty.mortbay.com/jetty/index.html">Jetty</a> (allégée en 
+ce que nous n'avons pas inclus les applications de démo et autres compléments, et que nous avons simplifié la 
+configuration), vous permettant de déployer dans votre routeur des applications web JSP/Servlet standards. De son côté 
+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://www.i2p2.i2p/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://www.i2p2.i2p/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://www.i2p2.i2p/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://www.i2p2.i2p/download_fr">téléchargements</a>.
+.</p>
+
+<h2>Historique des évolutions</h2>
+ <jsp:useBean class="net.i2p.router.web.ContentHelper" id="contenthelper" scope="request" />
+ <% java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "history.txt"); %>
+ <jsp:setProperty name="contenthelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
+ <jsp:setProperty name="contenthelper" property="maxLines" value="256" />
+ <jsp:setProperty name="contenthelper" property="startAtBeginning" value="true" />
+ <jsp:getProperty name="contenthelper" property="textContent" />
+
+ <p><a href="/history.txt">Historique complet</a>
+ </p><hr></div></body></html>
diff --git a/apps/routerconsole/jsp/index.jsp b/apps/routerconsole/jsp/index.jsp
index 6f29573e65bf1edc8486ee6e4c3ea19534fe17f8..5aeeeea980b3ff8145644006948553153f87f002 100644
--- a/apps/routerconsole/jsp/index.jsp
+++ b/apps/routerconsole/jsp/index.jsp
@@ -7,9 +7,11 @@
 <%=intl.title("home")%>
 </head><body>
 <%
-if (System.getProperty("router.consoleNonce") == null) {
-    System.setProperty("router.consoleNonce", new java.util.Random().nextLong() + "");
-}
+    String consoleNonce = System.getProperty("router.consoleNonce");
+    if (consoleNonce == null) {
+        consoleNonce = Long.toString(new java.util.Random().nextLong());
+        System.setProperty("router.consoleNonce", consoleNonce);
+    }
 %>
 
 <%@include file="summary.jsi" %><h1><%=intl._("I2P Router Console")%></h1>
@@ -26,10 +28,25 @@ if (System.getProperty("router.consoleNonce") == null) {
  <hr><i><jsp:getProperty name="updatehelper" property="newsStatus" /></i><br>
 </div><div class="main" id="main">
  <jsp:useBean class="net.i2p.router.web.ContentHelper" id="contenthelper" scope="request" />
+ <div class="welcome">
+  <div class="langbox">
+    <a href="/?lang=en&amp;consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=us" title="English" alt="English"></a> 
+    <a href="/?lang=ar&amp;consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=lang_ar" title="عربية" alt="عربية"></a>
+    <a href="/?lang=zh&amp;consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=cn" title="中文" alt="中文"></a> 
+    <a href="/?lang=de&amp;consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> 
+    <a href="/?lang=fr&amp;consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> 
+    <a href="/?lang=es&amp;consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a> 
+    <a href="/?lang=pt&amp;consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> 
+    <a href="/?lang=nl&amp;consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> 
+    <a href="/?lang=ru&amp;consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> 
+    <a href="/?lang=sv&amp;consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a>
+  </div>
+  <a name="top"></a>
+  <h2><%=intl._("Welcome to I2P")%></h2>
+ </div>
  <% fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "docs/readme.html"); %>
  <jsp:setProperty name="contenthelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
  <jsp:setProperty name="contenthelper" property="maxLines" value="300" />
- <jsp:setProperty name="contenthelper" property="lang" value="<%=request.getParameter("lang")%>" />
  <jsp:setProperty name="contenthelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
  <jsp:getProperty name="contenthelper" property="content" />
 </div></body></html>
diff --git a/apps/routerconsole/jsp/logs.jsp b/apps/routerconsole/jsp/logs.jsp
index da33b9179c8f3d10fc19b9cb4eb06fb0a01a50f3..c2cbd2f71a7e38cfd6fa5085b33d82e033e9d2ce 100644
--- a/apps/routerconsole/jsp/logs.jsp
+++ b/apps/routerconsole/jsp/logs.jsp
@@ -18,7 +18,7 @@
 <%=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> <jsp:getProperty name="helper" property="version" /><br>
+<b>I2P version:</b> <%=net.i2p.router.RouterVersion.FULL_VERSION%><br>
 <b>Java version:</b> <%=System.getProperty("java.vendor")%> <%=System.getProperty("java.version")%> (<%=System.getProperty("java.runtime.name")%> <%=System.getProperty("java.runtime.version")%>)<br>
 <b>Platform:</b> <%=System.getProperty("os.name")%> <%=System.getProperty("os.arch")%> <%=System.getProperty("os.version")%><br>
 <b>Processor:</b> <%=net.i2p.util.NativeBigInteger.cpuModel()%> (<%=net.i2p.util.NativeBigInteger.cpuType()%>)<br>
diff --git a/apps/routerconsole/jsp/summary.jsi b/apps/routerconsole/jsp/summary.jsi
index 5a81e7af3dcd2cc457339a8b7593e211e1aa63f8..46cb366fe2713a52ff5b43021908a3713e073204 100644
--- a/apps/routerconsole/jsp/summary.jsi
+++ b/apps/routerconsole/jsp/summary.jsi
@@ -1,27 +1,41 @@
-<% // put width here too to prevent bad layout at startup %>
-<% // let's remove that for now since we're no longer using percentage width here %>
 <div class="routersummaryouter">
 <%
-    // skip the iframe if refresh disabled
-    String d = request.getParameter("refresh");
-    String newDelay = "";
-    if (d == null || "".equals(d))
-        d = intl.getRefresh();
-    else {
-        d = net.i2p.data.DataHelper.stripHTML(d);  // XSS
-        // pass the new delay parameter to the iframe
-        newDelay = "?refresh=" + d;
+    // The refresh delay, 0 to disable
+    String d = "0";
+    boolean allowIFrame = intl.allowIFrame(request.getHeader("User-Agent"));
+    if (allowIFrame) {
+        // skip the iframe if refresh disabled
+        d = request.getParameter("refresh");
+        String newDelay = "";
+        if (d == null || "".equals(d))
+            d = intl.getRefresh();
+        else {
+            d = net.i2p.data.DataHelper.stripHTML(d);  // XSS
+            // pass the new delay parameter to the iframe
+            newDelay = "?refresh=" + d;
+        }
+        if (!"0".equals(d))
+            out.print("<iframe src=\"/summaryframe.jsp" + newDelay + "\" height=\"1500\" width=\"200\" scrolling=\"auto\" frameborder=\"0\" title=\"sidepanel\">\n");
     }
-    if (!"0".equals(d))
-        out.print("<iframe src=\"/summaryframe.jsp" + newDelay + "\" height=\"1500\" width=\"200\" scrolling=\"auto\" frameborder=\"0\" title=\"sidepanel\">\n");
 %>
 <div class="routersummary">
+<%
+    if (allowIFrame) {
+        // Display the whole summary bar
+%>
 <%@include file="summarynoframe.jsi" %>
 <%
-    // d defined above
+    } else {
+        // Text browsers don't render the two divs side-by-side, so just provide a link
+        out.print("<a href=\"/summaryframe\">");
+        out.print(intl._("Summary Bar"));
+        out.print("</a>");
+    }
+
+    // d and allowIFrame defined above
     if (!"0".equals(d)) {
         out.print("</div></iframe>\n");
-    } else {
+    } else if (allowIFrame) {
         // since we don't have an iframe this will reload the base page, and
         // the new delay will be passed to the iframe above
         out.print("<div class=\"refresh\"><form action=\"" + request.getRequestURI() + "\" method=\"POST\">\n");
@@ -34,6 +48,8 @@
         out.print(intl._("Enable"));
         out.print("</button>\n");
         out.print("</form></div></div>\n");
+    } else {
+        out.print("</div>\n");
     }
 %>
 </div>
diff --git a/apps/routerconsole/jsp/summaryframe.jsp b/apps/routerconsole/jsp/summaryframe.jsp
index 4b8d6b69ef86151e9c0fb4e4be720a9c8119aabf..d0eb8b72afdeb80f42aef069c92741f25a2105ea 100644
--- a/apps/routerconsole/jsp/summaryframe.jsp
+++ b/apps/routerconsole/jsp/summaryframe.jsp
@@ -15,7 +15,9 @@
     String action = request.getParameter("action");
     String d = request.getParameter("refresh");
     // Normal browsers send value, IE sends button label
-    boolean shutdownSoon = "shutdownImmediate".equals(action) || "restartImmediate".equals(action) ||
+    boolean allowIFrame = intl.allowIFrame(request.getHeader("User-Agent"));
+    boolean shutdownSoon = (!allowIFrame) ||
+                           "shutdownImmediate".equals(action) || "restartImmediate".equals(action) ||
                            "Shutdown immediately".equals(action) || "Restart immediately".equals(action);
     if (!shutdownSoon) {
         if (d == null || "".equals(d)) {
@@ -59,7 +61,6 @@
             out.print(":</b> <input size=\"3\" type=\"text\" name=\"refresh\" value=\"60\" >\n");
             out.print("<button type=\"submit\" value=\"Enable\" >");
             out.print(intl._("Enable"));
-            out.print("</button></div>\n");
         } else {
             // this will load in the iframe but subsequent pages will not have the iframe
             out.print("<input type=\"hidden\" name=\"refresh\" value=\"0\" >\n");
@@ -70,9 +71,8 @@
             } catch (NumberFormatException nfe) {}
             String refreshTime = net.i2p.data.DataHelper.formatDuration2(refreshMS);
             out.print(intl._("Disable {0} Refresh", refreshTime));
-            out.print("</button></div>\n");
         }
-        out.print("</form>\n");
+        out.print("</button></form></div>\n");
     }
 %>
 </div></body></html>
diff --git a/apps/routerconsole/jsp/viewhistory.jsp b/apps/routerconsole/jsp/viewhistory.jsp
index 14ee0bbffa644ab63c34bef0ceebe8aba0d16e66..aa3ce4d545d2a5664bc145baa587f0533e22d567 100644
--- a/apps/routerconsole/jsp/viewhistory.jsp
+++ b/apps/routerconsole/jsp/viewhistory.jsp
@@ -11,6 +11,13 @@ String base = net.i2p.I2PAppContext.getGlobalContext().getBaseDir().getAbsoluteP
 try {
     net.i2p.util.FileUtil.readFile("history.txt", base, response.getOutputStream());
 } catch (java.io.IOException ioe) {
-    response.sendError(403, ioe.toString());
+    // prevent 'Committed' IllegalStateException from Jetty
+    if (!response.isCommitted()) {
+        response.sendError(403, ioe.toString());
+    }  else {
+        net.i2p.I2PAppContext.getGlobalContext().logManager().getLog(getClass()).error("Error serving history.txt", ioe);
+        // Jetty doesn't log this
+        throw ioe;
+    }
 }
 %>
\ No newline at end of file
diff --git a/apps/routerconsole/jsp/viewprofile.jsp b/apps/routerconsole/jsp/viewprofile.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..36897d4a9aae345d19e760356554b406ca5f39b6
--- /dev/null
+++ b/apps/routerconsole/jsp/viewprofile.jsp
@@ -0,0 +1,30 @@
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html><head>
+<%@include file="css.jsi" %>
+<%=intl.title("Peer Profile")%>
+</head><body>
+<%@include file="summary.jsi" %>
+<h1><%=intl._("Peer Profile")%></h1>
+<div class="main" id="main"><div class="wideload">
+<%
+    String peerB64 = request.getParameter("peer");
+    if (peerB64 == null || peerB64.length() <= 0) {
+        out.print("No peer specified");
+    } else {
+        peerB64 = net.i2p.data.DataHelper.stripHTML(peerB64);  // XSS
+%>
+<jsp:useBean id="stathelper" class="net.i2p.router.web.StatHelper" />
+<jsp:setProperty name="stathelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
+<jsp:setProperty name="stathelper" property="peer" value="<%=peerB64%>" />
+<% stathelper.storeWriter(out); %>
+<h2><%=intl._("Profile for peer {0}", peerB64)%></h2>
+<pre>
+<jsp:getProperty name="stathelper" property="profile" />
+</pre>
+<%
+    }
+%>
+</div></div></body></html>
diff --git a/apps/routerconsole/jsp/viewtheme.jsp b/apps/routerconsole/jsp/viewtheme.jsp
index 723b0ec3278a1e25f0c24367968195e6ccf32bb6..ce1a6fe3807e065f58f6773f1e4afb8524130387 100644
--- a/apps/routerconsole/jsp/viewtheme.jsp
+++ b/apps/routerconsole/jsp/viewtheme.jsp
@@ -19,7 +19,6 @@ if (uri.endsWith(".css")) {
 } else if (uri.endsWith(".ico")) {
   response.setContentType("image/x-icon");
 }
-response.setHeader("Cache-Control", "max-age=86400");  // cache for a day
 /*
  * User or plugin themes
  * If the request is for /themes/console/foo/bar/baz,
@@ -44,9 +43,33 @@ if (themePath != null)
 else
     base = net.i2p.I2PAppContext.getGlobalContext().getBaseDir().getAbsolutePath() +
               java.io.File.separatorChar + "docs";
+java.io.File file = new java.io.File(base, uri);
+long lastmod = file.lastModified();
+if (lastmod > 0) {
+    long iflast = request.getDateHeader("If-Modified-Since");
+    // iflast is -1 if not present; round down file time
+    if (iflast >= ((lastmod / 1000) * 1000)) {
+        response.sendError(304, "Not Modified");
+        return;
+    }
+    response.setDateHeader("Last-Modified", lastmod);
+    // cache for a day
+    response.setDateHeader("Expires", net.i2p.I2PAppContext.getGlobalContext().clock().now() + 86400000l);
+    response.setHeader("Cache-Control", "public, max-age=86400");
+}
+long length = file.length();
+if (length > 0)
+    response.setHeader("Content-Length", Long.toString(length));
 try {
     net.i2p.util.FileUtil.readFile(uri, base, response.getOutputStream());
 } catch (java.io.IOException ioe) {
-    response.sendError(403, ioe.toString());
+    // prevent 'Committed' IllegalStateException from Jetty
+    if (!response.isCommitted()) {
+        response.sendError(403, ioe.toString());
+    }  else {
+        net.i2p.I2PAppContext.getGlobalContext().logManager().getLog(getClass()).error("Error serving " + uri, ioe);
+        // Jetty doesn't log this
+        throw ioe;
+    }
 }
 %>
\ No newline at end of file
diff --git a/apps/routerconsole/locale/messages_ar.po b/apps/routerconsole/locale/messages_ar.po
new file mode 100644
index 0000000000000000000000000000000000000000..f66b0cd2c008e8509243fb77e34b7511480e3f61
--- /dev/null
+++ b/apps/routerconsole/locale/messages_ar.po
@@ -0,0 +1,5466 @@
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+# Ahmed Mansour <atphalix@inbox.com>, 2011.
+# hamada <hamada@mail.i2p>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P routerconsole\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-03 18:27+0000\n"
+"PO-Revision-Date: 2011-03-04 14:02-0000\n"
+"Last-Translator: hamada <hamada@mail.i2p>\n"
+"Language-Team: hamada@mail.i2p\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
+"X-Generator: Virtaal 0.6.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
+#. 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.
+#. If you want the digit separator in your locale, translate as {0}.
+#. alternates: msec, msecs
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1141
+#, java-format
+msgid "1 ms"
+msgid_plural "{0,number,####} ms"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#. seconds
+#. Note to translators: quantity will always be greater than one.
+#. alternates: secs, sec. 'seconds' is probably too long.
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1146
+#, java-format
+msgid "1 sec"
+msgid_plural "{0} sec"
+msgstr[0] ""
+msgstr[1] ""
+
+#. minutes
+#. Note to translators: quantity will always be greater than one.
+#. alternates: mins, min. 'minutes' is probably too long.
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1151
+#, java-format
+msgid "1 min"
+msgid_plural "{0} min"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#. hours
+#. Note to translators: quantity will always be greater than one.
+#. alternates: hrs, hr., hrs.
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1156
+#, java-format
+msgid "1 hour"
+msgid_plural "{0} hours"
+msgstr[0] ""
+msgstr[1] "{0} ساعات"
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1158
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313
+msgid "n/a"
+msgstr ""
+
+#. days
+#. Note to translators: quantity will always be greater than one.
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1162
+#, java-format
+msgid "1 day"
+msgid_plural "{0} days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:122
+#, java-format
+msgid "Banned by router hash: {0}"
+msgstr "ممنوع من طرف الموجه: {0}"
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:124
+msgid "Banned by router hash"
+msgstr "ممنوع من طرف الموجه"
+
+#. Temporary reason, until the job finishes
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:669
+msgid "IP banned"
+msgstr "IP ممنوع"
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:739
+#, java-format
+msgid "IP banned by blocklist.txt entry {0}"
+msgstr "  {0} عنوان ممنوع"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:92
+msgid "Rejecting tunnels: Shutting down"
+msgstr "جاري التوقيف"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:141
+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");
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:177
+msgid "Rejecting most tunnels: High number of requests"
+msgstr "توقيف غالبية الأنفاق : "
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:233
+msgid "Rejecting tunnels: Limit reached"
+msgstr "رفض الانفاق: وصل الى الحد"
+
+#. .067KBps
+#. * also limited to 90% - see below
+#. always leave at least 4KBps free when allowing
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:301
+msgid "Rejecting tunnels: Bandwidth limit"
+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:371
+msgid "Rejecting most tunnels: Bandwidth limit"
+msgstr "رفض غالبية الانفاق: وصل حد سرعة الاتصال"
+
+#. hard to do {0} from here
+#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of tunnels");
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:375
+msgid "Accepting most tunnels"
+msgstr "قبول غالبية الأنفاق"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:377
+msgid "Accepting tunnels"
+msgstr "قبول الأنفاق"
+
+#. NPE, too early
+#. if (_context.router().getRouterInfo().getBandwidthTier().equals("K"))
+#. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low");
+#. else
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:488
+msgid "Rejecting tunnels"
+msgstr "رفض الأنفاق"
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:105
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
+msgid "Reseeding"
+msgstr "اعادة التوزيع"
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:128
+#, java-format
+msgid "Reseed fetched only 1 router."
+msgid_plural "Reseed fetched only {0} routers."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:135
+msgid "Reseed failed."
+msgstr "فشل اعادة التوزيع"
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:136
+#, java-format
+msgid "See {0} for help."
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:137
+msgid "reseed configuration page"
+msgstr "تم حفظ اعدادات اعادة التوزيع"
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:239
+msgid "Reseeding: fetching seed URL."
+msgstr "اعادة التوزيع: تحميل العنوان"
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:281
+#, java-format
+msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512
+msgid "NetDb entry"
+msgstr ""
+
+#. 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:70
+msgid "No transports (hidden or starting up?)"
+msgstr "ﻻ وسائل النقل (مخفية أو جاري البدء؟)"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450
+msgid "Unreachable on any transport"
+msgstr "صعب الوصول بأية وسيلة"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499
+msgid "Router Transport Addresses"
+msgstr "عموان الموجه للنقل"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504
+#, java-format
+msgid "{0} is used for outbound connections only"
+msgstr "{0} مستعملة للاتصال الخارجي فقط"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123
+msgid "Help"
+msgstr "مساعدة"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519
+msgid "Your transport connection limits are automatically set based on your configured bandwidth."
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521
+msgid "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and i2np.udp.maxConnections=nnn on the advanced configuration page."
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
+msgid "Definitions"
+msgstr "التعاريف"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:735
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
+msgid "Peer"
+msgstr "مستخدم"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
+msgid "The remote peer, identified by router hash"
+msgstr "النظير البعيد"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:736
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
+msgid "Dir"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
+msgid "Inbound connection"
+msgstr "اتصال داخلي"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
+msgid "Outbound connection"
+msgstr "اتصال خارجي"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
+msgid "They offered to introduce us (help other peers traverse our firewall)"
+msgstr "ساعد المستخدمين الآخرين في عبور الجدار الناري"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532
+msgid "We offered to introduce them (help other peers traverse their firewall)"
+msgstr "عرضنا لمساعدتهم (مساعدة أقرانه الآخرين من اجتياز جدار الحماية)"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+msgid "How long since a packet has been received / sent"
+msgstr "مدة تلقى / بعث حزمة  "
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
+msgid "Idle"
+msgstr "خامل"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+msgid "In/Out"
+msgstr "داخل/خارج"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+msgid "The smoothed inbound / outbound transfer rate (KBytes per second)"
+msgstr "سرعة الداخلة / الخارجة للتحويل (KBytes في الثانية)"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+msgid "How long ago this connection was established"
+msgstr "مدة استمرار هذا الاتصال"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905
+msgid "Up"
+msgstr "فوق"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907
+msgid "Skew"
+msgstr "الانحراف"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+msgid "The difference between the peer's clock and your own"
+msgstr "الفرق بين ساعة النظير و ساعتك"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
+msgid "The congestion window, which is how many bytes can be sent without an acknowledgement"
+msgstr "نافذة الازدحام، هي كمية المرسلة دون ازدحام"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
+msgid "The number of sent messages awaiting acknowledgement"
+msgstr "عدد الرسائل المرسلة التي تنتظر الموافقة"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
+msgid "The maximum number of concurrent messages to send"
+msgstr "الحد الأقصى لعدد الرسائل المتزامنة الارسال"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
+msgid "The number of pending sends which exceed congestion window"
+msgstr "عدد المرسلات التي تتجاوز إطار الازدحام"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
+msgid "The slow start threshold"
+msgstr "عتبة بداية بطيئة"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
+msgid "The round trip time in milliseconds"
+msgstr "الوقت الذهاب وإياب في جزء ثانية"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917
+msgid "Dev"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+msgid "The standard deviation of the round trip time in milliseconds"
+msgstr "انحراف الوقت الذهاب وإياب في جزء ثانية"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
+msgid "The retransmit timeout in milliseconds"
+msgstr "اعادة الارسال في جزء ثانية"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
+msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)"
+msgstr "الحد الأقصى الحالي إرسال حجم الحزمة"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
+msgid "TX"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+msgid "The total number of packets sent to the peer"
+msgstr "العدد الاجمالي للحزم المرسلة الى المستخدم"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
+msgid "RX"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+msgid "The total number of packets received from the peer"
+msgstr "العدد الاجمالي للحزم المستقبلة"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929
+msgid "Dup TX"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+msgid "The total number of packets retransmitted to the peer"
+msgstr "العدد الاجمالي للحزم المرسلة الى النظائر"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931
+msgid "Dup RX"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+msgid "The total number of duplicate packets received from the peer"
+msgstr "إجمالي عدد الحزم المكررة الواردة من الزملاء"
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:409
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:627
+#, java-format
+msgid "Excessive clock skew: {0}"
+msgstr "درجة انحراف الساعة: {0}"
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:730
+msgid "NTCP connections"
+msgstr "اتصال NTCP"
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:731
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886
+msgid "Limit"
+msgstr "حد"
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
+msgid "Timeout"
+msgstr "انتهى الوقت"
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743
+msgid "Out Queue"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744
+msgid "Backlogged?"
+msgstr "السجلات"
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+msgid "Inbound"
+msgstr "الداخل"
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+msgid "Outbound"
+msgstr "الخارج"
+
+#. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n");
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:807
+msgid "peers"
+msgstr "نظير"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885
+msgid "UDP connections"
+msgstr "اتصال UDP"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892
+msgid "Sort by peer hash"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
+msgid "Direction/Introduction"
+msgstr "اتجاه/تقديم"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
+msgid "Sort by idle inbound"
+msgstr "حسب الاتصاب الوارد"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
+msgid "Sort by idle outbound"
+msgstr "حسب الاتصال الخارج"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
+msgid "Sort by inbound rate"
+msgstr "حسب معدل الداخل"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903
+msgid "Sort by outbound rate"
+msgstr "حسب معدل الصادرة"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
+msgid "Sort by connection uptime"
+msgstr "حسب مدة الاتصال"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
+msgid "Sort by clock skew"
+msgstr "حسب انحراف الساعة"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911
+msgid "Sort by congestion window"
+msgstr "حسب نافذة الازدحام"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913
+msgid "Sort by slow start threshold"
+msgstr "حسب مدة الانطلاق"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916
+msgid "Sort by round trip time"
+msgstr "حسب الوقت ذهابا وإيابا"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
+msgid "Sort by round trip time deviation"
+msgstr "حسب الوقت ذهابا وإيابا"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920
+msgid "Sort by retransmission timeout"
+msgstr "حسب مهلة إعادة الإرسال"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923
+msgid "Sort by outbound maximum transmit unit"
+msgstr "حسب أقصى مدة"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
+msgid "Sort by packets sent"
+msgstr "حسب الحزم المرسلة"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
+msgid "Sort by packets received"
+msgstr "حسب الحزم المستقبلة"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930
+msgid "Sort by packets retransmitted"
+msgstr "حسب الحزم المعاد ارسالها"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932
+msgid "Sort by packets received more than once"
+msgstr "حسب الحزم المستقبلة اكثر من مرة"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953
+msgid "We offered to introduce them"
+msgstr "عرضنا لتعريفهم"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955
+msgid "They offered to introduce us"
+msgstr "عرصو علينا تقديمهم"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959
+msgid "Choked"
+msgstr "اختنق"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967
+msgid "1 fail"
+msgstr "فشل واحد"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969
+#, java-format
+msgid "{0} fails"
+msgstr "{0} فشل"
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162
+msgid "Banned"
+msgstr "ممنوع"
+
+#. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n");
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106
+msgid "SUMMARY"
+msgstr "ملخص"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124
+msgid "Dropping tunnel requests: Too slow"
+msgstr "تجاوز النفق: بطيئ جدا"
+
+#. don't even bother, since we are so overloaded locally
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267
+msgid "Dropping tunnel requests: Overloaded"
+msgstr "تجاوز النفق: ازدحام"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:460
+msgid "Rejecting tunnels: Request overload"
+msgstr "تجاوز النفق: ازدحام"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:485
+msgid "Rejecting tunnels: Connection limit"
+msgstr "تجاوز النفق: حد الاتصال"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:685
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:706
+msgid "Dropping tunnel requests: High load"
+msgstr "تجاوز النفق: ازدحام كبير"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:698
+msgid "Dropping tunnel requests: Queue time"
+msgstr "تجاوز النفق: وقت الانتظار"
+
+#. Automatically generated pseudo-java for xgettext - do not edit
+#. Translators may wish to translate a few of these, do not bother to translate all of them!!
+#: ../java/build/Countries.java:3
+msgid "Andorra"
+msgstr ""
+
+#: ../java/build/Countries.java:4
+msgid "United Arab Emirates"
+msgstr ""
+
+#: ../java/build/Countries.java:5
+msgid "Afghanistan"
+msgstr ""
+
+#: ../java/build/Countries.java:6
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: ../java/build/Countries.java:7
+msgid "Anguilla"
+msgstr ""
+
+#: ../java/build/Countries.java:8
+msgid "Albania"
+msgstr ""
+
+#: ../java/build/Countries.java:9
+msgid "Armenia"
+msgstr ""
+
+#: ../java/build/Countries.java:10
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: ../java/build/Countries.java:11
+msgid "Angola"
+msgstr ""
+
+#: ../java/build/Countries.java:12
+msgid "Antarctica"
+msgstr ""
+
+#: ../java/build/Countries.java:13
+msgid "Argentina"
+msgstr ""
+
+#: ../java/build/Countries.java:14
+msgid "American Samoa"
+msgstr ""
+
+#: ../java/build/Countries.java:15
+msgid "Austria"
+msgstr ""
+
+#: ../java/build/Countries.java:16
+msgid "Australia"
+msgstr ""
+
+#: ../java/build/Countries.java:17
+msgid "Aruba"
+msgstr ""
+
+#: ../java/build/Countries.java:19
+msgid "Azerbaijan"
+msgstr ""
+
+#: ../java/build/Countries.java:20
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: ../java/build/Countries.java:21
+msgid "Barbados"
+msgstr ""
+
+#: ../java/build/Countries.java:22
+msgid "Bangladesh"
+msgstr ""
+
+#: ../java/build/Countries.java:23
+msgid "Belgium"
+msgstr ""
+
+#: ../java/build/Countries.java:24
+msgid "Burkina Faso"
+msgstr ""
+
+#: ../java/build/Countries.java:25
+msgid "Bulgaria"
+msgstr ""
+
+#: ../java/build/Countries.java:26
+msgid "Bahrain"
+msgstr ""
+
+#: ../java/build/Countries.java:27
+msgid "Burundi"
+msgstr ""
+
+#: ../java/build/Countries.java:28
+msgid "Benin"
+msgstr ""
+
+#: ../java/build/Countries.java:29
+msgid "Bermuda"
+msgstr ""
+
+#: ../java/build/Countries.java:30
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: ../java/build/Countries.java:31
+msgid "Bolivia"
+msgstr ""
+
+#: ../java/build/Countries.java:32
+msgid "Brazil"
+msgstr ""
+
+#: ../java/build/Countries.java:33
+msgid "Bahamas"
+msgstr ""
+
+#: ../java/build/Countries.java:34
+msgid "Bhutan"
+msgstr ""
+
+#: ../java/build/Countries.java:35
+msgid "Bouvet Island"
+msgstr ""
+
+#: ../java/build/Countries.java:36
+msgid "Botswana"
+msgstr ""
+
+#: ../java/build/Countries.java:37
+msgid "Belarus"
+msgstr ""
+
+#: ../java/build/Countries.java:38
+msgid "Belize"
+msgstr ""
+
+#: ../java/build/Countries.java:39
+msgid "Canada"
+msgstr ""
+
+#: ../java/build/Countries.java:40
+msgid "The Democratic Republic of the Congo"
+msgstr ""
+
+#: ../java/build/Countries.java:41
+msgid "Central African Republic"
+msgstr ""
+
+#: ../java/build/Countries.java:42
+msgid "Congo"
+msgstr ""
+
+#: ../java/build/Countries.java:43
+msgid "Switzerland"
+msgstr ""
+
+#: ../java/build/Countries.java:44
+msgid "Cote D'Ivoire"
+msgstr ""
+
+#: ../java/build/Countries.java:45
+msgid "Cook Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:46
+msgid "Chile"
+msgstr ""
+
+#: ../java/build/Countries.java:47
+msgid "Cameroon"
+msgstr ""
+
+#: ../java/build/Countries.java:48
+msgid "China"
+msgstr ""
+
+#: ../java/build/Countries.java:49
+msgid "Colombia"
+msgstr ""
+
+#: ../java/build/Countries.java:50
+msgid "Costa Rica"
+msgstr ""
+
+#: ../java/build/Countries.java:51
+msgid "Serbia and Montenegro"
+msgstr ""
+
+#: ../java/build/Countries.java:52
+msgid "Cuba"
+msgstr ""
+
+#: ../java/build/Countries.java:53
+msgid "Cape Verde"
+msgstr ""
+
+#: ../java/build/Countries.java:54
+msgid "Cyprus"
+msgstr ""
+
+#: ../java/build/Countries.java:55
+msgid "Czech Republic"
+msgstr ""
+
+#: ../java/build/Countries.java:56
+msgid "Germany"
+msgstr ""
+
+#: ../java/build/Countries.java:57
+msgid "Djibouti"
+msgstr ""
+
+#: ../java/build/Countries.java:58
+msgid "Denmark"
+msgstr ""
+
+#: ../java/build/Countries.java:59
+msgid "Dominica"
+msgstr ""
+
+#: ../java/build/Countries.java:60
+msgid "Dominican Republic"
+msgstr ""
+
+#: ../java/build/Countries.java:61
+msgid "Algeria"
+msgstr ""
+
+#: ../java/build/Countries.java:62
+msgid "Ecuador"
+msgstr ""
+
+#: ../java/build/Countries.java:63
+msgid "Estonia"
+msgstr ""
+
+#: ../java/build/Countries.java:64
+msgid "Egypt"
+msgstr ""
+
+#: ../java/build/Countries.java:65
+msgid "Eritrea"
+msgstr ""
+
+#: ../java/build/Countries.java:66
+msgid "Spain"
+msgstr ""
+
+#: ../java/build/Countries.java:67
+msgid "Ethiopia"
+msgstr ""
+
+#: ../java/build/Countries.java:68
+msgid "Finland"
+msgstr ""
+
+#: ../java/build/Countries.java:69
+msgid "Fiji"
+msgstr ""
+
+#: ../java/build/Countries.java:70
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: ../java/build/Countries.java:71
+msgid "Federated States of Micronesia"
+msgstr ""
+
+#: ../java/build/Countries.java:72
+msgid "Faroe Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:73
+msgid "France"
+msgstr ""
+
+#: ../java/build/Countries.java:74
+msgid "Gabon"
+msgstr ""
+
+#: ../java/build/Countries.java:75
+msgid "United Kingdom"
+msgstr ""
+
+#: ../java/build/Countries.java:76
+msgid "Grenada"
+msgstr ""
+
+#: ../java/build/Countries.java:77
+msgid "Georgia"
+msgstr ""
+
+#: ../java/build/Countries.java:78
+msgid "French Guiana"
+msgstr ""
+
+#: ../java/build/Countries.java:79
+msgid "Ghana"
+msgstr ""
+
+#: ../java/build/Countries.java:80
+msgid "Gibraltar"
+msgstr ""
+
+#: ../java/build/Countries.java:81
+msgid "Greenland"
+msgstr ""
+
+#: ../java/build/Countries.java:82
+msgid "Gambia"
+msgstr ""
+
+#: ../java/build/Countries.java:83
+msgid "Guinea"
+msgstr ""
+
+#: ../java/build/Countries.java:84
+msgid "Guadeloupe"
+msgstr ""
+
+#: ../java/build/Countries.java:85
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: ../java/build/Countries.java:86
+msgid "Greece"
+msgstr ""
+
+#: ../java/build/Countries.java:87
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:88
+msgid "Guatemala"
+msgstr ""
+
+#: ../java/build/Countries.java:89
+msgid "Guam"
+msgstr ""
+
+#: ../java/build/Countries.java:90
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: ../java/build/Countries.java:91
+msgid "Guyana"
+msgstr ""
+
+#: ../java/build/Countries.java:92
+msgid "Hong Kong"
+msgstr ""
+
+#: ../java/build/Countries.java:93
+msgid "Honduras"
+msgstr ""
+
+#: ../java/build/Countries.java:94
+msgid "Croatia"
+msgstr ""
+
+#: ../java/build/Countries.java:95
+msgid "Haiti"
+msgstr ""
+
+#: ../java/build/Countries.java:96
+msgid "Hungary"
+msgstr ""
+
+#: ../java/build/Countries.java:97
+msgid "Indonesia"
+msgstr ""
+
+#: ../java/build/Countries.java:98
+msgid "Ireland"
+msgstr ""
+
+#: ../java/build/Countries.java:99
+msgid "Israel"
+msgstr ""
+
+#: ../java/build/Countries.java:101
+msgid "India"
+msgstr ""
+
+#: ../java/build/Countries.java:102
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: ../java/build/Countries.java:103
+msgid "Iraq"
+msgstr ""
+
+#: ../java/build/Countries.java:104
+msgid "Islamic Republic of Iran"
+msgstr ""
+
+#: ../java/build/Countries.java:105
+msgid "Iceland"
+msgstr ""
+
+#: ../java/build/Countries.java:106
+msgid "Italy"
+msgstr ""
+
+#: ../java/build/Countries.java:108
+msgid "Jamaica"
+msgstr ""
+
+#: ../java/build/Countries.java:109
+msgid "Jordan"
+msgstr ""
+
+#: ../java/build/Countries.java:110
+msgid "Japan"
+msgstr ""
+
+#: ../java/build/Countries.java:111
+msgid "Kenya"
+msgstr ""
+
+#: ../java/build/Countries.java:112
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: ../java/build/Countries.java:113
+msgid "Cambodia"
+msgstr ""
+
+#: ../java/build/Countries.java:114
+msgid "Kiribati"
+msgstr ""
+
+#: ../java/build/Countries.java:115
+msgid "Comoros"
+msgstr ""
+
+#: ../java/build/Countries.java:116
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: ../java/build/Countries.java:117
+msgid "Republic of Korea"
+msgstr ""
+
+#: ../java/build/Countries.java:118
+msgid "Kuwait"
+msgstr ""
+
+#: ../java/build/Countries.java:119
+msgid "Cayman Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:120
+msgid "Kazakhstan"
+msgstr ""
+
+#: ../java/build/Countries.java:121
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: ../java/build/Countries.java:122
+msgid "Lebanon"
+msgstr ""
+
+#: ../java/build/Countries.java:123
+msgid "Saint Lucia"
+msgstr ""
+
+#: ../java/build/Countries.java:124
+msgid "Liechtenstein"
+msgstr ""
+
+#: ../java/build/Countries.java:125
+msgid "Sri Lanka"
+msgstr ""
+
+#: ../java/build/Countries.java:126
+msgid "Liberia"
+msgstr ""
+
+#: ../java/build/Countries.java:127
+msgid "Lesotho"
+msgstr ""
+
+#: ../java/build/Countries.java:128
+msgid "Lithuania"
+msgstr ""
+
+#: ../java/build/Countries.java:129
+msgid "Luxembourg"
+msgstr ""
+
+#: ../java/build/Countries.java:130
+msgid "Latvia"
+msgstr ""
+
+#: ../java/build/Countries.java:131
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: ../java/build/Countries.java:132
+msgid "Morocco"
+msgstr ""
+
+#: ../java/build/Countries.java:133
+msgid "Monaco"
+msgstr ""
+
+#: ../java/build/Countries.java:134
+msgid "Republic of Moldova"
+msgstr ""
+
+#: ../java/build/Countries.java:137
+msgid "Madagascar"
+msgstr ""
+
+#: ../java/build/Countries.java:138
+msgid "Marshall Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:139
+msgid "The Former Yugoslav Republic of Macedonia"
+msgstr ""
+
+#: ../java/build/Countries.java:140
+msgid "Mali"
+msgstr ""
+
+#: ../java/build/Countries.java:141
+msgid "Myanmar"
+msgstr ""
+
+#: ../java/build/Countries.java:142
+msgid "Mongolia"
+msgstr ""
+
+#: ../java/build/Countries.java:143
+msgid "Macao"
+msgstr ""
+
+#: ../java/build/Countries.java:144
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:145
+msgid "Martinique"
+msgstr ""
+
+#: ../java/build/Countries.java:146
+msgid "Mauritania"
+msgstr ""
+
+#: ../java/build/Countries.java:147
+msgid "Montserrat"
+msgstr ""
+
+#: ../java/build/Countries.java:148
+msgid "Malta"
+msgstr ""
+
+#: ../java/build/Countries.java:149
+msgid "Mauritius"
+msgstr ""
+
+#: ../java/build/Countries.java:150
+msgid "Maldives"
+msgstr ""
+
+#: ../java/build/Countries.java:151
+msgid "Malawi"
+msgstr ""
+
+#: ../java/build/Countries.java:152
+msgid "Mexico"
+msgstr ""
+
+#: ../java/build/Countries.java:153
+msgid "Malaysia"
+msgstr ""
+
+#: ../java/build/Countries.java:154
+msgid "Mozambique"
+msgstr ""
+
+#: ../java/build/Countries.java:155
+msgid "Namibia"
+msgstr ""
+
+#: ../java/build/Countries.java:156
+msgid "New Caledonia"
+msgstr ""
+
+#: ../java/build/Countries.java:157
+msgid "Niger"
+msgstr ""
+
+#: ../java/build/Countries.java:158
+msgid "Norfolk Island"
+msgstr ""
+
+#: ../java/build/Countries.java:159
+msgid "Nigeria"
+msgstr ""
+
+#: ../java/build/Countries.java:160
+msgid "Nicaragua"
+msgstr ""
+
+#: ../java/build/Countries.java:161
+msgid "Netherlands"
+msgstr ""
+
+#: ../java/build/Countries.java:162
+msgid "Norway"
+msgstr ""
+
+#: ../java/build/Countries.java:163
+msgid "Nepal"
+msgstr ""
+
+#: ../java/build/Countries.java:164
+msgid "Nauru"
+msgstr ""
+
+#: ../java/build/Countries.java:165
+msgid "Niue"
+msgstr ""
+
+#: ../java/build/Countries.java:166
+msgid "New Zealand"
+msgstr ""
+
+#: ../java/build/Countries.java:167
+msgid "Oman"
+msgstr ""
+
+#: ../java/build/Countries.java:168
+msgid "Panama"
+msgstr ""
+
+#: ../java/build/Countries.java:169
+msgid "Peru"
+msgstr ""
+
+#: ../java/build/Countries.java:170
+msgid "French Polynesia"
+msgstr ""
+
+#: ../java/build/Countries.java:171
+msgid "Papua New Guinea"
+msgstr ""
+
+#: ../java/build/Countries.java:172
+msgid "Philippines"
+msgstr ""
+
+#: ../java/build/Countries.java:173
+msgid "Pakistan"
+msgstr ""
+
+#: ../java/build/Countries.java:174
+msgid "Poland"
+msgstr ""
+
+#: ../java/build/Countries.java:175
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: ../java/build/Countries.java:176
+msgid "Puerto Rico"
+msgstr ""
+
+#: ../java/build/Countries.java:177
+msgid "Palestinian Territory"
+msgstr ""
+
+#: ../java/build/Countries.java:178
+msgid "Portugal"
+msgstr ""
+
+#: ../java/build/Countries.java:179
+msgid "Palau"
+msgstr ""
+
+#: ../java/build/Countries.java:180
+msgid "Paraguay"
+msgstr ""
+
+#: ../java/build/Countries.java:181
+msgid "Qatar"
+msgstr ""
+
+#: ../java/build/Countries.java:182
+msgid "Reunion"
+msgstr ""
+
+#: ../java/build/Countries.java:183
+msgid "Romania"
+msgstr ""
+
+#: ../java/build/Countries.java:184
+msgid "Serbia"
+msgstr ""
+
+#: ../java/build/Countries.java:185
+msgid "Russian Federation"
+msgstr ""
+
+#: ../java/build/Countries.java:186
+msgid "Rwanda"
+msgstr ""
+
+#: ../java/build/Countries.java:187
+msgid "Saudi Arabia"
+msgstr ""
+
+#: ../java/build/Countries.java:188
+msgid "Solomon Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:189
+msgid "Seychelles"
+msgstr ""
+
+#: ../java/build/Countries.java:190
+msgid "Sudan"
+msgstr ""
+
+#: ../java/build/Countries.java:191
+msgid "Sweden"
+msgstr ""
+
+#: ../java/build/Countries.java:192
+msgid "Singapore"
+msgstr ""
+
+#: ../java/build/Countries.java:193
+msgid "Slovenia"
+msgstr ""
+
+#: ../java/build/Countries.java:194
+msgid "Slovakia"
+msgstr ""
+
+#: ../java/build/Countries.java:195
+msgid "Sierra Leone"
+msgstr ""
+
+#: ../java/build/Countries.java:196
+msgid "San Marino"
+msgstr ""
+
+#: ../java/build/Countries.java:197
+msgid "Senegal"
+msgstr ""
+
+#: ../java/build/Countries.java:198
+msgid "Somalia"
+msgstr ""
+
+#: ../java/build/Countries.java:199
+msgid "Suriname"
+msgstr ""
+
+#: ../java/build/Countries.java:200
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: ../java/build/Countries.java:201
+msgid "El Salvador"
+msgstr ""
+
+#: ../java/build/Countries.java:202
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: ../java/build/Countries.java:203
+msgid "Swaziland"
+msgstr ""
+
+#: ../java/build/Countries.java:204
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:205
+msgid "Chad"
+msgstr ""
+
+#: ../java/build/Countries.java:206
+msgid "French Southern Territories"
+msgstr ""
+
+#: ../java/build/Countries.java:207
+msgid "Togo"
+msgstr ""
+
+#: ../java/build/Countries.java:208
+msgid "Thailand"
+msgstr ""
+
+#: ../java/build/Countries.java:209
+msgid "Tajikistan"
+msgstr ""
+
+#: ../java/build/Countries.java:210
+msgid "Tokelau"
+msgstr ""
+
+#: ../java/build/Countries.java:211
+msgid "Timor-Leste"
+msgstr ""
+
+#: ../java/build/Countries.java:212
+msgid "Turkmenistan"
+msgstr ""
+
+#: ../java/build/Countries.java:213
+msgid "Tunisia"
+msgstr ""
+
+#: ../java/build/Countries.java:214
+msgid "Tonga"
+msgstr ""
+
+#: ../java/build/Countries.java:215
+msgid "Turkey"
+msgstr ""
+
+#: ../java/build/Countries.java:216
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: ../java/build/Countries.java:217
+msgid "Tuvalu"
+msgstr ""
+
+#: ../java/build/Countries.java:218
+msgid "Taiwan"
+msgstr ""
+
+#: ../java/build/Countries.java:219
+msgid "United Republic of Tanzania"
+msgstr ""
+
+#: ../java/build/Countries.java:220
+msgid "Ukraine"
+msgstr ""
+
+#: ../java/build/Countries.java:221
+msgid "Uganda"
+msgstr ""
+
+#: ../java/build/Countries.java:222
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:223
+msgid "United States"
+msgstr ""
+
+#: ../java/build/Countries.java:224
+msgid "Uruguay"
+msgstr ""
+
+#: ../java/build/Countries.java:225
+msgid "Uzbekistan"
+msgstr ""
+
+#: ../java/build/Countries.java:226
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: ../java/build/Countries.java:227
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: ../java/build/Countries.java:228
+msgid "Venezuela"
+msgstr ""
+
+#: ../java/build/Countries.java:229
+#: ../java/build/Countries.java:230
+msgid "Virgin Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:231
+msgid "Viet Nam"
+msgstr ""
+
+#: ../java/build/Countries.java:232
+msgid "Vanuatu"
+msgstr ""
+
+#: ../java/build/Countries.java:233
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: ../java/build/Countries.java:234
+msgid "Samoa"
+msgstr ""
+
+#: ../java/build/Countries.java:235
+msgid "Yemen"
+msgstr ""
+
+#: ../java/build/Countries.java:236
+msgid "Mayotte"
+msgstr ""
+
+#: ../java/build/Countries.java:237
+msgid "South Africa"
+msgstr ""
+
+#: ../java/build/Countries.java:238
+msgid "Zambia"
+msgstr ""
+
+#: ../java/build/Countries.java:239
+msgid "Zimbabwe"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/CSSHelper.java:58
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37
+#: ../java/strings/Strings.java:29
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:119
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:233
+msgid "I2P Router Console"
+msgstr "مركز تحكم I2P"
+
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:57
+msgid "Error updating the configuration - please see the error logs"
+msgstr "خطأ في ترقية الإعدادات - انظر التفاصيل"
+
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:69
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:266
+msgid "Configuration saved successfully"
+msgstr "تم حفظ الإعدادات بنجاح"
+
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:268
+msgid "Error saving the configuration (applied but not saved) - please see the error logs"
+msgstr "خطأ في تسجيل الاعدادات"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:335
+msgid "Save Client Configuration"
+msgstr "حفظ اعدادات المستخدم"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:405
+msgid "Save Interface Configuration"
+msgstr "حفظ اعدادات الواجهة"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417
+msgid "Save WebApp Configuration"
+msgstr "حفظ اعدادات تطبيق الويب"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427
+msgid "Save Plugin Configuration"
+msgstr "حفظ اعدادات الملحق"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433
+msgid "Install Plugin"
+msgstr "تثبيت الملحق"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87
+#, java-format
+msgid "Deleted plugin {0}"
+msgstr "تم حذف الملحق {0}"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89
+#, java-format
+msgid "Error deleting plugin {0}"
+msgstr "خطأ في حذف الملحق {0}"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101
+#, java-format
+msgid "Stopped plugin {0}"
+msgstr "توقيف الملحق {0}"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103
+#, java-format
+msgid "Error stopping plugin {0}"
+msgstr "خطأ في توقيف الملحق {0}"
+
+#. label (IE)
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255
+msgid "Start"
+msgstr "إبدأ"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33
+msgid "Unsupported"
+msgstr "غير مدعومة"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189
+msgid "New client added"
+msgstr "اضافة مستخدم جديد"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193
+msgid "Client configuration saved successfully - restart required to take effect."
+msgstr "تم حفظ العدادات بنجاح - يجب اعادة التشغيل لأخذها بالاعتبار"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
+msgid "Bad client index."
+msgstr " مؤشر سيء للعميل."
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:384
+msgid "Client"
+msgstr "مستخدم"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
+msgid "started"
+msgstr "إنطلق"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
+msgid "deleted"
+msgstr "حذف"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240
+msgid "WebApp configuration saved."
+msgstr "تم حفظ اعدادات تطبيق ويب."
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256
+msgid "Plugin configuration saved."
+msgstr "تم حفظ اعدادات الملحق ويب."
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+msgid "WebApp"
+msgstr "تطبيق ويب"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273
+msgid "Failed to start"
+msgstr "فشل في الإنطلاق"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278
+msgid "Failed to find server."
+msgstr "فشل في العثور على الخادم."
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284
+msgid "No plugin URL specified."
+msgstr "لم يحدد عنوان الملحق."
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294
+#, java-format
+msgid "No update URL specified for {0}"
+msgstr "لا توجد تحديثات لـ {0}"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325
+msgid "Plugin or update download already in progress."
+msgstr "جارية تحميل التحديث"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118
+#, java-format
+msgid "Downloading plugin from {0}"
+msgstr "تحميل الملحق من {0}"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329
+#, java-format
+msgid "Checking plugin {0} for updates"
+msgstr "بحث عن اصدارات جديدة للملحق{0} "
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339
+#, java-format
+msgid "Started plugin {0}"
+msgstr "الملحق {0} يعمل"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341
+#, java-format
+msgid "Error starting plugin {0}"
+msgstr "خطأ في تطلاق الملحق {0}"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376
+msgid "Interface configuration saved successfully - restart required to take effect."
+msgstr "تم حفظ العدادات بنجاح - يجب اعادة التشغيل لأخذها بالاعتبار"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258
+msgid "Edit"
+msgstr "حرر"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331
+msgid "Add Client"
+msgstr "أضف مستخدم"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+msgid "Class and arguments"
+msgstr "الفئة"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+msgid "Control"
+msgstr "تحكم"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+msgid "Run at Startup?"
+msgstr "تشغيل عند البداية؟"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197
+msgid "Description"
+msgstr "وصف"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+msgid "Plugin"
+msgstr "الملحق"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185
+msgid "Version"
+msgstr "إصدار"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163
+msgid "Signed by"
+msgstr "موقع من طرف"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180
+msgid "Date"
+msgstr "تاريخ"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186
+msgid "Author"
+msgstr "المؤلف"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202
+msgid "License"
+msgstr "رخصة"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207
+msgid "Website"
+msgstr "موقع"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212
+msgid "Update link"
+msgstr "وصلة الترقية"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260
+msgid "Stop"
+msgstr "توقف"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:313
+msgid "Check for updates"
+msgstr "بحث عن الترقية"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:242
+msgid "Update"
+msgstr "ترقية"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268
+#, java-format
+msgid "Are you sure you want to delete {0}?"
+msgstr "هل انت متأكد أنك ترغب في حذف {0}؟"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270
+msgid "Delete"
+msgstr "حذف"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:325
+msgid "Add key"
+msgstr "أضف مفتاح"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:323
+msgid "Delete key"
+msgstr "حذف مفتاح"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:21
+msgid "You must enter a destination"
+msgstr "يجب ادخال وجهة"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:23
+msgid "You must enter a key"
+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 "مفتاح لـ"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34
+msgid "added to keyring"
+msgstr "أضف الى المفاتيح"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:36
+msgid "Invalid destination or key"
+msgstr "وجهة أو مفتاح غير صحيح"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41
+msgid "removed from keyring"
+msgstr "حذف المفتاح"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43
+msgid "not found in keyring"
+msgstr "لم يتم العثور على المفتاح"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:45
+msgid "Invalid destination"
+msgstr "عنوان غير موجود"
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:82
+msgid "Log overrides updated"
+msgstr "اعدا كتابة السجلات"
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:160
+msgid "Log configuration saved"
+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"
+
+#: ../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"
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:50
+msgid "Valid levels are DEBUG, INFO, WARN, ERROR, CRIT"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
+msgid "CRIT"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
+msgid "DEBUG"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
+msgid "ERROR"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
+msgid "INFO"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
+msgid "WARN"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88
+msgid "Remove"
+msgstr "حذف"
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:125
+msgid "Select a class to add"
+msgstr "اختر فئة لإضافتها"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:204
+msgid "Network"
+msgstr "شبكة"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+msgid "Service"
+msgstr "خدمة"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386
+#: ../java/strings/Strings.java:72
+msgid "Tunnels"
+msgstr "نفق"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+msgid "UI"
+msgstr "واجهة مستخدم"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+msgid "Clients"
+msgstr "مستخدم"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:293
+msgid "Keyring"
+msgstr "المفاتيح"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+msgid "Logging"
+msgstr "تسجيل"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260
+#: ../java/strings/Strings.java:67
+msgid "Peers"
+msgstr "المستخدمين"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143
+msgid "Stats"
+msgstr "احصائات"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
+msgid "Advanced"
+msgstr "متقدم"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:352
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:377
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344
+msgid "Save changes"
+msgstr "حفظ التغييرات"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:121
+msgid "Rechecking router reachability..."
+msgstr "إعادة تحديد إمكانية الوصول للموجه..."
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:153
+msgid "Updating IP address"
+msgstr "جاري تعديل عنوان IP"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:171
+msgid "Disabling TCP completely"
+msgstr "الغاء الكامل TCP "
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:175
+msgid "Updating inbound TCP address to"
+msgstr "تحديث عنوان TCP الى"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:179
+msgid "Disabling inbound TCP"
+msgstr "الغاء الاتصال TCP الداخلي"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:181
+msgid "Updating inbound TCP address to auto"
+msgstr "تحديث عنوان TCP الى ذاتي"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:190
+msgid "Updating inbound TCP port to"
+msgstr "تحديث عنوان TCP الى"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:193
+msgid "Updating inbound TCP port to auto"
+msgstr "تحديث عنوان TCP الى ذاتي"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205
+msgid "Updating UDP port from"
+msgstr "تحديث عنوان UDP من"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205
+msgid "to"
+msgstr "إلى"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:221
+msgid "Gracefully restarting into Hidden Router Mode"
+msgstr "اعادة التشغيل على نظام الموجه المتخفي"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:223
+msgid "Gracefully restarting to exit Hidden Router Mode"
+msgstr "اعادة التشغيل على نظام الموجه المتخفي "
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:232
+msgid "Enabling UPnP, restart required to take effect"
+msgstr "تفعيل UPnP، يجب اعادة التشغيل للحصول على النتيجة"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:234
+msgid "Disabling UPnP, restart required to take effect"
+msgstr " الغاء تفعيل UPnP، يجب اعادة التشغيل للحصول على النتيجة"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:242
+msgid "Enabling laptop mode"
+msgstr "تفعيل نظام الحاسوب المحمول"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:244
+msgid "Disabling laptop mode"
+msgstr "الغاء تفعيل نظام الحاسوب المحمول"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:250
+msgid "Requiring SSU introducers"
+msgstr "بحاجة الى SSU"
+
+#. There's a few changes that don't really require restart (e.g. enabling inbound TCP)
+#. But it would be hard to get right, so just do a restart.
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:291
+msgid "Gracefully restarting I2P to change published router address"
+msgstr "إعادة تشغيل جهاز التوجيه I2P لتغيير عنوان  النشر"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:314
+msgid "Updating bandwidth share percentage"
+msgstr "تحديث سرعة الاتصال المشاركة"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:397
+msgid "Updated bandwidth limits"
+msgstr "حد سرعة الاتصال "
+
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62
+msgid "unknown"
+msgstr "غير معروف"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172
+msgid "bits per second"
+msgstr "بايت في الثانية"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173
+#, java-format
+msgid "or {0} bytes per month maximum"
+msgstr "أو {0} بايت لكل شهر"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:315
+msgid "Ban peer until restart"
+msgstr "منع حتى اعادة التشغيل"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:23
+#, java-format
+msgid "Manually banned via {0}"
+msgstr "ممنوع يدويا من طرف {0}"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
+msgid "banned until restart"
+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 "نظير غير صحيح"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317
+msgid "Unban peer"
+msgstr "الغاء منع المستخدم"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
+msgid "unbanned"
+msgstr "الغاء المنع"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
+msgid "is not currently banned"
+msgstr "غير ممنوع"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343
+msgid "Adjust peer bonuses"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47
+msgid "Bad speed value"
+msgstr " سرعة غير جيدة"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:52
+msgid "Bad capacity value"
+msgstr "قدرة غير جيدة"
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350
+msgid "Save changes and reseed now"
+msgstr "حفظ التغييرات"
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21
+msgid "Reseeding is already in progress"
+msgstr "جاري اعادة التوزيع"
+
+#. skip the nonce checking in ReseedHandler
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24
+msgid "Starting reseed process"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66
+msgid "Configuration saved successfully."
+msgstr "تم حفظ الإعدادات بنجاح"
+
+#. Normal browsers send value, IE sends button label
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:293
+msgid "Shutdown immediately"
+msgstr "توقيف حالا"
+
+#. ctx.router().shutdown(Router.EXIT_HARD); // never returns
+#. give the UI time to respond
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:36
+msgid "Cancel shutdown"
+msgstr "الغاء التوقيف"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:37
+msgid "Cancel restart"
+msgstr "الغاء اعادة التشغيل"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:39
+msgid "Restart immediately"
+msgstr "أعد التشغيل الآن"
+
+#. ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns
+#. give the UI time to respond
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:43
+msgid "Restart"
+msgstr "أعد التشغيل"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:46
+msgid "Shutdown"
+msgstr "إيقاف"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:59
+msgid "Restart imminent"
+msgstr "أعد التشغيل الآن"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:61
+msgid "Shutdown imminent"
+msgstr "إغلاق وشيك"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:65
+#, java-format
+msgid "Shutdown in {0}"
+msgstr "توقف في مدة {0}"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:70
+#, java-format
+msgid "Restart in {0}"
+msgstr "اعادة التشغيل في مدة {0}"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:291
+msgid "Shutdown gracefully"
+msgstr "توقف تدريجيا"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:56
+msgid "Graceful shutdown initiated"
+msgstr "بدأ التوقف تدريجيا"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:60
+msgid "Shutdown immediately!  boom bye bye bad bwoy"
+msgstr "توقف الآن !"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:295
+msgid "Cancel graceful shutdown"
+msgstr "ألغي التوقف التدريجي"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:63
+msgid "Graceful shutdown cancelled"
+msgstr "ألغي التوقف التدريجي"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307
+msgid "Graceful restart"
+msgstr "أعد التشغيل التدريجي"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:67
+msgid "Graceful restart requested"
+msgstr "اعادة التشغبل تدريجية"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309
+msgid "Hard restart"
+msgstr "إعادة التشغيل فوري"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:71
+msgid "Hard restart requested"
+msgstr "طلب إعادة التشغيل فوري"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:72
+msgid "Rekey and Restart"
+msgstr "غير المفتاح واعد التشغيل"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:73
+msgid "Rekeying after graceful restart"
+msgstr "تغير المفتاح  بعد اعادة التشغيل"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:76
+msgid "Rekey and Shutdown"
+msgstr "غير المفتاح وتوقف"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:77
+msgid "Rekeying after graceful shutdown"
+msgstr "تغير المفتاح  بعد التوقف"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335
+msgid "Run I2P on startup"
+msgstr "اطلاق I2P عند البداية"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337
+msgid "Don't run I2P on startup"
+msgstr "لا تقوم باطلاق I2P عند البداية"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355
+msgid "Dump threads"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:363
+msgid "View console on startup"
+msgstr "أظهر شاشة التحكم عند البداية"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93
+msgid "Console is to be shown on startup"
+msgstr "سبتم إظهار شاشة التحكم عند البداية"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365
+msgid "Do not view console on startup"
+msgstr "لا تظهر شاشة التحكم عند البداية"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
+msgid "Console is not to be shown on startup"
+msgstr "لن يتم إظهار شاشة التحكم عند البداية"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105
+msgid "Service installed"
+msgstr "تم تثبيت الخدمة"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107
+msgid "Warning: unable to install the service"
+msgstr "تحذير: فشل في تثبيت الخدمة"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
+msgid "Service removed"
+msgstr "تم حذف الخدمة"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
+msgid "Warning: unable to remove the service"
+msgstr "تحذير: فشل في حذف الخدمة"
+
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:111
+msgid "Stat filter and location updated successfully to"
+msgstr "القانون الأساسي لتصفية وتحديث الموقع بنجاح"
+
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:113
+msgid "Failed to update the stat filter and location"
+msgstr "فشل في لتصفية وتحديث الموقع بنجاح"
+
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:114
+msgid "Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>"
+msgstr " لقد تم تحديث الرسم البياني، يستغرق فترة تصل الى 60s أن تنعكس هنا، وعلى<a href=\"graphs.jsp\">صفحة الرسوم البيانية</a>"
+
+#. 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:135
+msgid "Updated settings for all pools."
+msgstr "تحديث إعدادات للجميع."
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:140
+msgid "Exploratory tunnel configuration saved successfully."
+msgstr "تم حفظ إعدادات النفق بنجاح."
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:36
+msgid "Error saving the configuration (applied but not saved) - please see the error logs."
+msgstr "خطأ في حفظ الاعدادات (مطبقة لكنها غير محفوظة) أنظر الاخطاء."
+
+#. * dummies for translation
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14
+#, java-format
+msgid "1 hop"
+msgid_plural "{0} hops"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:15
+#, java-format
+msgid "1 tunnel"
+msgid_plural "{0} tunnels"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
+msgid "Exploratory tunnels"
+msgstr "استكشاف الأنفاق"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61
+msgid "Client tunnels for"
+msgstr "نفق لـ"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69
+msgid "ANONYMITY WARNING - Settings include 0-hop tunnels."
+msgstr "تحذير حول درجة المجهولية: تتضمن إعدادات الأنفاق 0 - نظير."
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
+msgid "ANONYMITY WARNING - Settings include 1-hop tunnels."
+msgstr "تحذير حول درجة المجهولية: الاعدادات تحتوي على نفق واحد."
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77
+msgid "PERFORMANCE WARNING - Settings include very long tunnels."
+msgstr "تحذير الأداء: وتتضمن الإعدادات أنفاق طويلة جدا."
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80
+msgid "PERFORMANCE WARNING - Settings include high tunnel quantities."
+msgstr "تحذير الأداء: وتتضمن الإعدادات عدد كبير من أنفاق طويلة جدا."
+
+#. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n");
+#. tunnel depth
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
+msgid "Length"
+msgstr "طول"
+
+#. tunnel depth variance
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104
+msgid "Randomization"
+msgstr "عشوائي"
+
+#. tunnel quantity
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128
+msgid "Quantity"
+msgstr "الكمية"
+
+#. tunnel backup quantity
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145
+msgid "Backup quantity"
+msgstr "قدر نسخ الاحتياط"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167
+msgid "Inbound options"
+msgstr "اتصال داخلي"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180
+msgid "Outbound options"
+msgstr "اتصال خارجي"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:31
+msgid "Theme change saved."
+msgstr "تم حفظ تغيير التيمة."
+
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:33
+msgid "Refresh the page to view."
+msgstr "أنعش الصفحة"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+msgid "Arabic"
+msgstr "عربية"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+msgid "English"
+msgstr "انجليزية"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+msgid "French"
+msgstr "فرنسية"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+msgid "German"
+msgstr "الألمانية"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+msgid "Spanish"
+msgstr "اسبانية"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+msgid "Dutch"
+msgstr "الهولندية"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+msgid "Portuguese"
+msgstr "برتغالية"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+msgid "Russian"
+msgstr "الروسية"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
+msgid "Chinese"
+msgstr "الصينية"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
+msgid "Swedish"
+msgstr "السويدية"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:85
+msgid "Update available, attempting to download now"
+msgstr "يوجد اصدار جديد "
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:87
+msgid "Update available, click button on left to download"
+msgstr "توجد تحديثات، انقر زر على اليسار للتحميل"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:93
+msgid "No update available"
+msgstr "ﻻتوجد تحديثات"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:101
+msgid "Updating news URL to"
+msgstr "تحديث عنوان جديد الى"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:109
+msgid "Updating proxy host to"
+msgstr "تحديث بروكسي الى"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:117
+msgid "Updating proxy port to"
+msgstr "تحديث منفذ بروكسي الى"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:130
+msgid "Updating refresh frequency to"
+msgstr "تحديث نسبة التردد"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:137
+msgid "Updating update policy to"
+msgstr "تحديث لسياسة التحديث"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:146
+msgid "Updating update URLs."
+msgstr "تحديث العناوين"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:155
+msgid "Updating trusted keys."
+msgstr "تحديث المفاتيح الموثوقة."
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:163
+msgid "Updating unsigned update URL to"
+msgstr "تحديث العنوان"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88
+#: ../java/src/net/i2p/router/web/GraphHelper.java:167
+msgid "Never"
+msgstr "أبد"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:90
+msgid "Every"
+msgstr "كل"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:108
+msgid "Notify only"
+msgstr "إعلام فقط"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:115
+msgid "Download and verify only"
+msgstr "حمل فقط"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:123
+msgid "Download, verify, and restart"
+msgstr "حمل، تحقق و أعد تشغيل"
+
+#: ../java/src/net/i2p/router/web/FormHandler.java:174
+msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."
+msgstr "خطأ في الارسال، ربما لاستعمالك زر 'الرجوع' او 'انعش' في المتصفح. حاول اعادة الارسال."
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:93
+msgid "Combined bandwidth graph"
+msgstr "رسم بياني لسرعة الاتصال"
+
+#. e.g. "statname for 60m"
+#: ../java/src/net/i2p/router/web/GraphHelper.java:107
+#, java-format
+msgid "{0} for {1}"
+msgstr "{0} لكل {1}"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:146
+msgid "Configure Graph Display"
+msgstr "اعدادات الرسم بياني"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:146
+msgid "Select Stats"
+msgstr "حدد الإحصائيات"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:150
+msgid "Periods"
+msgstr "مدة"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:151
+msgid "Plot averages"
+msgstr "ارسم المتوسط"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:152
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333
+msgid "or"
+msgstr "أو"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:152
+msgid "plot events"
+msgstr "ارسم الأحداث"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:153
+msgid "Image sizes"
+msgstr "خجم الصور"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:153
+msgid "width"
+msgstr "العرض"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:154
+msgid "height"
+msgstr "الإرتفاع"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:154
+#: ../java/src/net/i2p/router/web/GraphHelper.java:155
+msgid "pixels"
+msgstr "البيكسل"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:156
+msgid "Refresh delay"
+msgstr "وثيرة التحديث"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:171
+msgid "Redraw"
+msgstr "اعد رسم"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:203
+msgid "Graph settings saved"
+msgstr "حفظ اعدادات الرسم البياني"
+
+#: ../java/src/net/i2p/router/web/LogsHelper.java:13
+#: ../java/src/net/i2p/router/web/LogsHelper.java:37
+msgid "File location"
+msgstr "عنوان الملف"
+
+#: ../java/src/net/i2p/router/web/LogsHelper.java:34
+msgid "File not found"
+msgstr "ملف غير موجود"
+
+#: ../java/src/net/i2p/router/web/LogsHelper.java:52
+msgid "No log messages"
+msgstr "لا تسجيل الرسائل"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:80
+msgid "Network Database RouterInfo Lookup"
+msgstr "قاعدة بيانات الشبكة"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95
+#: ../java/strings/Strings.java:68
+msgid "Router"
+msgstr "موجه"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95
+msgid "not found in network database"
+msgstr "غير موجود في قاعدة الشبكة"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215
+msgid "Network Database Contents"
+msgstr "محتويات قاعدة الشبكة"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108
+msgid "View RouterInfo"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:109
+msgid "LeaseSets"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:131
+msgid "LeaseSet"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:133
+msgid "Local"
+msgstr "محلي"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135
+msgid "Unpublished"
+msgstr "غير منشور"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:136
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:143
+msgid "Destination"
+msgstr "الغاية"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:153
+#, java-format
+msgid "Expires in {0}"
+msgstr "ينتهي في مدة {0}"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:155
+#, java-format
+msgid "Expired {0} ago"
+msgstr "انتهى {0} منذ"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+msgid "Gateway"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167
+msgid "Lease"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:169
+msgid "Tunnel"
+msgstr "نفق"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215
+msgid "View LeaseSets"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:217
+msgid "Not initialized"
+msgstr "لم تتم تهيئة"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:226
+msgid "Routers"
+msgstr "الموجه"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:228
+msgid "Show all routers"
+msgstr "أظهر جميع الموجهات"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:230
+msgid "Show all routers with full stats"
+msgstr "أظهر جميع الموجهات"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265
+msgid "Network Database Router Statistics"
+msgstr "احصائيات قاعدة البيانات I2P"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
+msgid "Count"
+msgstr "عدد"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
+msgid "Transports"
+msgstr "نقل"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
+msgid "Country"
+msgstr "البلد"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342
+msgid "Our info"
+msgstr "المعلومات"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
+msgid "Peer info for"
+msgstr "معلومات النظائر"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348
+msgid "Full entry"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:115
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
+msgid "Hidden"
+msgstr "مختفي"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
+msgid "Updated"
+msgstr "تحديث"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:355
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358
+#, java-format
+msgid "{0} ago"
+msgstr "{0} مدة"
+
+#. shouldnt happen
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361
+msgid "Published"
+msgstr "تم نشره منذ"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
+msgid "Address(es)"
+msgstr "عناوين"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376
+msgid "cost"
+msgstr "ثمن"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+msgid "Hidden or starting up"
+msgstr "مختفي"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+msgid "SSU"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+msgid "SSU with introducers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+msgid "NTCP"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+msgid "NTCP and SSU"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+msgid "NTCP and SSU with introducers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:93
+#, java-format
+msgid "News last updated {0} ago."
+msgstr "آخر تحديث للأخبار {0} "
+
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:99
+#, java-format
+msgid "News last checked {0} ago."
+msgstr "آخر تحديث للأخبار {0} "
+
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:77
+#, java-format
+msgid "Cannot check, plugin {0} is not installed"
+msgstr "لا يمكن التفعيل، الملحق {0} غير مثبت"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:129
+#, java-format
+msgid "Checking for update of plugin {0}"
+msgstr "تحق من اصداؤ جديد للملحق {0}"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:154
+#, java-format
+msgid "New plugin version {0} is available"
+msgstr "يوجد اصدار جديد {0} للملحق"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:156
+#, java-format
+msgid "No new version is available for plugin {0}"
+msgstr "ﻻيوجد اصدار جديد {0} للملحق"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:165
+#, java-format
+msgid "Update check failed for plugin {0}"
+msgstr "فشل البحث عم ترقية للملحق {0}"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:139
+msgid "Downloading plugin"
+msgstr "تحميل ملحق"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:244
+#, java-format
+msgid "{0}B transferred"
+msgstr "{0}B منقول"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153
+msgid "Plugin downloaded"
+msgstr "تم تحميل الملحق"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356
+#, java-format
+msgid "Cannot create plugin directory {0}"
+msgstr "فشل في انشاء مجلد الملحق {0}"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:298
+#, java-format
+msgid "from {0}"
+msgstr "من {0}"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177
+#, java-format
+msgid "Plugin from {0} is corrupt"
+msgstr "الملحق من {0} غير كامل"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188
+#, java-format
+msgid "Plugin from {0} does not contain the required configuration file"
+msgstr "الملحق {0} لا يحتوي على ملف الإعدادات"
+
+#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201
+#, java-format
+msgid "Plugin from {0} contains an invalid key"
+msgstr "الملحق من {0} يحتوي على مفتاح غير صالح"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249
+#, java-format
+msgid "Plugin signature verification of {0} failed"
+msgstr "فشل في التحقق من امضاء {0} الملحق"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264
+#, java-format
+msgid "Plugin from {0} has invalid name or version"
+msgstr "الملحق {0} له اصدار او اسم غير مقبول"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269
+#, java-format
+msgid "Plugin {0} has mismatched versions"
+msgstr "الملحق {0} له اصدار غير متوافق"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277
+#, java-format
+msgid "This plugin requires I2P version {0} or higher"
+msgstr "هذا الملحق يحتاج الى اصدار  {0} أو اكبر"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285
+#, java-format
+msgid "This plugin requires Java version {0} or higher"
+msgstr "هذا الملحق يحتاج الى اصدار جافا {0} او أعلى"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
+msgid "Downloaded plugin is for new installs only, but the plugin is already installed"
+msgstr "تحميل البرنامج المساعد لتثبيت جديد فقط، ولكن تم بالفعل تثبيت البرنامج المساعد"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305
+msgid "Installed plugin does not contain the required configuration file"
+msgstr "الملحق لا يحتوي على ملف الاعدادات"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313
+msgid "Signature of downloaded plugin does not match installed plugin"
+msgstr "توقيع الملحق المحمل لا يطابق الملحق المثبت"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320
+#, java-format
+msgid "Downloaded plugin version {0} is not newer than installed plugin"
+msgstr "اصدار الملحق {0} ليس اكثر حداثة من الملحق المثبت"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327
+#, java-format
+msgid "Plugin update requires installed plugin version {0} or higher"
+msgstr "تحديث الملحق {0} يحتاج الى اصدار"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334
+#, java-format
+msgid "Plugin update requires installed plugin version {0} or lower"
+msgstr "تحديث الملحق يحتاج الى اصدار  {0} او اقل"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351
+msgid "Plugin is for upgrades only, but the plugin is not installed"
+msgstr "الملحق للتحديث فقط لكنه غير مثبت"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364
+#, java-format
+msgid "Failed to install plugin in {0}"
+msgstr "فشل في تثبيت الملحق {0}"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371
+#, java-format
+msgid "Plugin {0} installed, router restart required"
+msgstr "الملحق {0} تم تثبيته"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373
+#, java-format
+msgid "Plugin {0} installed"
+msgstr "الملحق {0} مثبت"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391
+#, java-format
+msgid "Plugin {0} installed and started"
+msgstr "الملحق {0} مثبت ومشغل"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394
+#, java-format
+msgid "Plugin {0} installed but failed to start, check logs"
+msgstr "الملحق {0} مثيت لكن فشل في البداية، تحقق من السجلات"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396
+#, java-format
+msgid "Plugin {0} installed but failed to start"
+msgstr "الملحق {0} مثبت لكنه فشل في انطلاق"
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406
+#, java-format
+msgid "Failed to download plugin from {0}"
+msgstr "فشل في تحميل الملحق من {0}"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:72
+msgid "Peer Profiles"
+msgstr "بروفايل المستخدمين"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73
+#, java-format
+msgid "Showing {0} recent profiles."
+msgstr "اظهار {0} البروفايلات الجديدة."
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75
+#, java-format
+msgid "Hiding {0} older profiles."
+msgstr "اخفاء {0} البروفايلات القديمة."
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77
+#, java-format
+msgid "Hiding {0} standard profiles."
+msgstr "اخفاء  {0} البروفايل الطبيعي."
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82
+msgid "Groups (Caps)"
+msgstr "المجموعات"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335
+msgid "Speed"
+msgstr "سرعة"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:339
+msgid "Capacity"
+msgstr "القدرة"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
+msgid "Integration"
+msgstr "دمج"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:86
+msgid "Status"
+msgstr "الحالة"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:126
+msgid "Fast, High Capacity"
+msgstr "سريع ، قدرة عالية"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:127
+msgid "High Capacity"
+msgstr "قدرة عالية"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:128
+msgid "Standard"
+msgstr "عادي"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:129
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:163
+msgid "Failing"
+msgstr "فشل"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287
+msgid "Integrated"
+msgstr "مدمج"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:164
+msgid "Unreachable"
+msgstr ""
+
+#. hide if < 10%
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171
+msgid "Test Fails"
+msgstr "فشل التجربة"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175
+msgid "profile"
+msgstr "بروفايل"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184
+msgid "Floodfill and Integrated Peers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188
+msgid "Caps"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
+msgid "Integ. Value"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
+msgid "Last Heard About"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
+msgid "Last Heard From"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
+msgid "Last Good Send"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
+msgid "Last Bad Send"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
+msgid "10m Resp. Time"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
+msgid "1h Resp. Time"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
+msgid "1d Resp. Time"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
+msgid "Last Good Lookup"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
+msgid "Last Bad Lookup"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
+msgid "Last Good Store"
+msgstr "آخر حفظ جيد"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
+msgid "Last Bad Store"
+msgstr "آخر حفظ غير جيد"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
+msgid "1h Fail Rate"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
+msgid "1d Fail Rate"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250
+msgid "Thresholds"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+msgid "fast peers"
+msgstr "نظير سريع"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+msgid "high capacity peers"
+msgstr "نظير ذو قدرة عالية"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
+msgid " well integrated peers"
+msgstr "نظير مندمج"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+msgid "as determined by the profile organizer"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+msgid "groups"
+msgstr "مجموعات"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+msgid "capabilities in the netDb, not used to determine profiles"
+msgstr ""
+
+#. capabilities
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+#: ../java/strings/Strings.java:81
+msgid "caps"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+msgid "speed"
+msgstr "سرعة"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+msgid "capacity"
+msgstr "القدرة"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+msgid "how many tunnels can we ask them to join in an hour?"
+msgstr "كم من الانفاق نطلب منهم الانضمام في ساعة؟"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+msgid "how many new peers have they told us about lately?"
+msgstr "كم من النظائر موجودة مؤخرا؟"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+msgid "integration"
+msgstr "انضمام"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+msgid "is the peer banned, or unreachable, or failing tunnel tests?"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+msgid "status"
+msgstr "الحالة"
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57
+#, java-format
+msgid "Temporary ban expiring in {0}"
+msgstr "منع مؤقت {0}"
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59
+#, java-format
+msgid "Banned until restart or in {0}"
+msgstr "ممنوع الى اعادة تشغيل {0}"
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71
+msgid "unban now"
+msgstr "الغاء المنع الآن"
+
+#. Note to translators: all runtime zh translation disabled in this file, no font available in RRD
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:223
+msgid "Bandwidth usage"
+msgstr "استعمال الشيكة"
+
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:230
+msgid "Outbound bytes/sec"
+msgstr "اتصال خارجي bytes/sec"
+
+#. def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3);
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:232
+msgid "Inbound bytes/sec"
+msgstr "اتصال داخلي bytes/sec"
+
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:235
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:236
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:237
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:238
+msgid "bytes/sec"
+msgstr "بايت/ثانية"
+
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:235
+msgid "out average"
+msgstr "متوسط الاتصال الخارجي"
+
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:236
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:238
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:115
+msgid "max"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:237
+msgid "in average"
+msgstr "متوسط الاتصال الداخلي"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:57
+msgid "GO"
+msgstr "اذهب"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:60
+msgid "Statistics gathered during this router's uptime"
+msgstr "تجمع الاحصاءات العامة خلال خدمة الموجه"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:63
+msgid "The data gathered is quantized over a 1 minute period, so should just be used as an estimate."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:64
+msgid "These statistics are primarily used for development and debugging."
+msgstr "هذه الاحصائيات مستعملة في التطوير."
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:105
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:156
+msgid "No lifetime events"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:116
+msgid "frequency"
+msgstr "التردد"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:120
+msgid "Rolling average events per period"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:124
+msgid "Highest events per period"
+msgstr ""
+
+#. 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(num(curFreq.getMinAverageInterval())).append("ms)");
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:135
+msgid "Lifetime average events per period"
+msgstr ""
+
+#. Display the strict average
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:140
+msgid "Lifetime average frequency"
+msgstr "متوسط مدى الحياة"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:168
+msgid "rate"
+msgstr "النسبة"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:170
+msgid "Average"
+msgstr "متوسط"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:173
+msgid "Highest average"
+msgstr "أعلى متوسط"
+
+#. breaking the sentence like before makes translation in my language impossible.
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:201
+#, java-format
+msgid "There were {0} event(s) in this period"
+msgstr "هناك {0} حدث في هذه المدة"
+
+#. buf.append(' ');
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:203
+#, java-format
+msgid " which ended {0} ago."
+msgstr "انتهت منذ {0} "
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:205
+msgid "No events"
+msgstr "لا حدث"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:211
+msgid "Average event count"
+msgstr "متوسط عدد الأحداث"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:213
+msgid "Events in peak period"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:221
+msgid "Graph Data"
+msgstr "رسم بياني"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:223
+msgid "Graph Event Count"
+msgstr "الرسم البياني"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:226
+msgid "Export Data as XML"
+msgstr "تصدير البيانات XML"
+
+#. Display the strict average
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:231
+msgid "Lifetime average value"
+msgstr "متوسط الحياة"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:41
+msgid "I2P Router Help &amp; FAQ"
+msgstr "مساعدة حول I2P"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:43
+msgid "Help &amp; FAQ"
+msgstr "مساعدة"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:55
+msgid "Configure startup of clients and webapps (services); manually start dormant services"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:57
+msgid "I2P Services"
+msgstr "خدمات I2P"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:63
+msgid "Manage your I2P hosts file here (I2P domain name resolution)"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:65
+msgid "Addressbook"
+msgstr "دفتر العناوين"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:69
+msgid "Built-in anonymous BitTorrent Client"
+msgstr "برنامج تورنت مجهول"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:71
+msgid "Torrents"
+msgstr "تورنت"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:75
+msgid "Anonymous webmail client"
+msgstr "بريد الكتروني مجهول"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:77
+msgid "Webmail"
+msgstr "بريد الكتروني"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:81
+msgid "Anonymous resident webserver"
+msgstr "خادم ويب مجهول"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:83
+msgid "Webserver"
+msgstr "سيرفر ويب"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:91
+msgid "Configure I2P Router"
+msgstr "I2P اعدادات موجه"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:93
+msgid "I2P Internals"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384
+msgid "View existing tunnels and tunnel build status"
+msgstr "أظهر الأنفاق الموجودة وحالة الانفاق "
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258
+msgid "Show all current peer connections"
+msgstr "أظهر اتصالات المشاركين"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:111
+msgid "Show recent peer performance profiles"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:113
+msgid "Profiles"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:117
+msgid "Show list of all known I2P routers"
+msgstr "أظهر قائمة بكل I2P المعروفة"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:119
+msgid "NetDB"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123
+msgid "Health Report"
+msgstr "تقرير"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:125
+msgid "Logs"
+msgstr "يجلات"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:135
+msgid "Graph router performance"
+msgstr "أظهر اشتغال الموجه بريم بياني"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:137
+msgid "Graphs"
+msgstr "رسم بياني"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141
+msgid "Textual router performance statistics"
+msgstr "احصائات نصية للموجه"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:370
+msgid "Local Destinations"
+msgstr "الوجهات المحلية"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149
+#: ../java/strings/Strings.java:62
+msgid "I2PTunnel"
+msgstr "الأنفاق I2P"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164
+msgid "I2P Router Help"
+msgstr "مساعدة روتر I2P"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166
+msgid "General"
+msgstr "عام"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171
+msgid "Local Identity"
+msgstr "هوية محلية"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:175
+msgid "Your unique I2P router identity is"
+msgstr "هوية موجهك  I2P هو"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:179
+msgid "never reveal it to anyone"
+msgstr "لاتظهر لأحد"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:181
+msgid "show"
+msgstr "أظهر"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:192
+msgid "How long we've been running for this session"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:195
+msgid "Uptime"
+msgstr "مدة الاشتغال"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202
+msgid "Help with configuring your firewall and router for optimal I2P performance"
+msgstr "مساعدة في اعدادات الجدار الناري لزيادة فعالية I2P"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231
+msgid "Download"
+msgstr "تحميل"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240
+msgid "Download Unsigned"
+msgstr "تحميل"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266
+msgid "Active"
+msgstr "مفعل"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275
+msgid "Fast"
+msgstr "سريع"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281
+msgid "High capacity"
+msgstr "قدرة عالية"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293
+msgid "Known"
+msgstr "معروف"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:308
+msgid "Help with firewall configuration"
+msgstr "مساعدة خول اعدادات الجدار الناري"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:310
+msgid "Check NAT/firewall"
+msgstr "تأكد من NAT/جدار ناري"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:330
+msgid "Reseed"
+msgstr "اعادة توزيع"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:347
+msgid "Configure router bandwidth allocation"
+msgstr "حدد سرعة الموجه"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349
+msgid "Bandwidth in/out"
+msgstr "الاتصال الداخلي/خارجي"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:369
+msgid "Total"
+msgstr "مجموع"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376
+msgid "Used"
+msgstr "مستعمل"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:391
+msgid "Exploratory"
+msgstr "تصفح"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403
+msgid "Participating"
+msgstr "مشارك"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:409
+msgid "Share ratio"
+msgstr "نسبة المشاركة"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415
+msgid "What's in the router's job queue?"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417
+msgid "Congestion"
+msgstr "ازدحام"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422
+msgid "Job lag"
+msgstr "تأخر"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:428
+msgid "Message delay"
+msgstr "تأخر الرسالة"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:434
+msgid "Tunnel lag"
+msgstr "تأخر النفق"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440
+msgid "Backlog"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:106
+msgid "ERR-Client Manager I2CP Error - check logs"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:113
+#, java-format
+msgid "ERR-Clock Skew of {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:122
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
+msgid "OK"
+msgstr "موافق"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:123
+msgid "ERR-Private TCP Address"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:125
+msgid "ERR-SymmetricNAT"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:128
+msgid "WARN-Firewalled with Inbound TCP Enabled"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:130
+msgid "WARN-Firewalled and Floodfill"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:132
+msgid "WARN-Firewalled and Fast"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:133
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
+msgid "Firewalled"
+msgstr "ممنوع من الجدار الناري"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:135
+msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:141
+msgid "ERR-No Active Peers, Check Network Connection and Firewall"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:144
+msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:146
+msgid "WARN-Firewalled with UDP Disabled"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
+msgid "Testing"
+msgstr "جاري التجريب"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:370
+msgid "Add/remove/edit &amp; control your client and server tunnels"
+msgstr "أضف/حذف/حرر  &amp; المستخدم والانفاق"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:382
+msgid "Server"
+msgstr "خادم"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:386
+msgid "Show tunnels"
+msgstr "أظهر الانفاق"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:397
+msgid "Leases expired"
+msgstr ""
+
+#. red or yellow light
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:397
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:398
+msgid "Rebuilding"
+msgstr "اعادة بناية"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:398
+msgid "ago"
+msgstr "هناك"
+
+#. green light
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:401
+msgid "Ready"
+msgstr "مستعد"
+
+#. yellow light
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
+msgid "Building"
+msgstr "بناء"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
+msgid "Building tunnels"
+msgstr "جاري بناء النفق"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:410
+msgid "none"
+msgstr "ﻻشيئ"
+
+#. tunnel nicknames, taken from i2ptunnel.config so they will display
+#. nicely under 'local destinations' in the summary bar
+#. note that if the wording changes in i2ptunnel.config, we have to
+#. keep the old string here as well for existing installs
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:421
+#: ../java/strings/Strings.java:36
+msgid "shared clients"
+msgstr "المستخدمين المشتركين"
+
+#. Note to translators: all runtime zh translation disabled in this file, no font available in RRD
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:89
+#, java-format
+msgid "events in {0}"
+msgstr "أعادة التشغيل في {0}"
+
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:91
+#, java-format
+msgid "averaged for {0}"
+msgstr "متوسط {0}"
+
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:101
+msgid "Events per period"
+msgstr "عدد الأحداث في المدة"
+
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:114
+msgid "avg"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:116
+msgid "now"
+msgstr "الآن"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:63
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:287
+msgid "configure"
+msgstr "إعدادات"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:65
+msgid "dead"
+msgstr "ميت"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:71
+msgid "Participating tunnels"
+msgstr "الأنفاق المشاركة"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:72
+msgid "From"
+msgstr "من"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:72
+msgid "Receive on"
+msgstr "استقبل في"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
+msgid "Expiration"
+msgstr "انتهاء"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
+msgid "Send on"
+msgstr "ارسال الى"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
+msgid "To"
+msgstr "إلى"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74
+msgid "Rate"
+msgstr "معدل"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74
+msgid "Role"
+msgstr "دور"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+msgid "Usage"
+msgstr "استعمال"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:107
+msgid "grace period"
+msgstr "فترة السماح"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:117
+msgid "Outbound Endpoint"
+msgstr "نقطة الخروج"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:119
+msgid "Inbound Gateway"
+msgstr "نقطة الدخول"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:121
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:162
+msgid "Participant"
+msgstr "المشارك"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:126
+msgid "Inactive participating tunnels"
+msgstr "انفاق غير مساهمة"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:127
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:218
+msgid "Lifetime bandwidth usage"
+msgstr "درجة استعمال الشبكة"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+msgid "Expiry"
+msgstr "المدة"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:159
+msgid "Participants"
+msgstr "المشاركون"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:165
+msgid "Endpoint"
+msgstr "نقطة النهاية"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:205
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:212
+msgid "Build in progress"
+msgstr "جاري إنشاء النفق"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:205
+msgid "inbound"
+msgstr "الداخل"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:212
+msgid "outbound"
+msgstr "الخارج"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:217
+msgid "No tunnels; waiting for the grace period to end."
+msgstr "لا يوجد نفق، في انتظار مدة لتوقف"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:219
+msgid "in"
+msgstr "دخل"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:220
+msgid "out"
+msgstr "خرج"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:237
+msgid "Tunnel Counts By Peer"
+msgstr "عدد الأنفاق لكل زوج"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
+msgid "% of total"
+msgstr "% من المجموع"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
+msgid "Our Tunnels"
+msgstr "أنفاق"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
+msgid "Participating Tunnels"
+msgstr "الأنفاق المشاركة"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:256
+msgid "Totals"
+msgstr "المجموع"
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:142
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:237
+msgid "Updating"
+msgstr "ترقية"
+
+#. Process the .sud/.su2 file
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:261
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:286
+msgid "Update downloaded"
+msgstr "طريقة الترقية"
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:91
+#, java-format
+msgid "Unsigned update file from {0} is corrupt"
+msgstr "ملف التحديث غير كامل {0} "
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:281
+msgid "Restarting"
+msgstr "أعد التشغيل"
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:288
+msgid "Click Restart to install"
+msgstr "أنقر اعادة التشغبل للتثبيت"
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:290
+msgid "Click Shutdown and restart to install"
+msgstr "انقر زر التوقف وأعد التشغيل للتثبيت"
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:292
+#, java-format
+msgid "Version {0}"
+msgstr "اصدار {0}"
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:126
+#, java-format
+msgid "Failed copy to {0}"
+msgstr "فشل في نسخ {0}"
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:184
+#, java-format
+msgid "Updating from {0}"
+msgstr "تحديث من {0}"
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:253
+#, java-format
+msgid "No new version found at {0}"
+msgstr "ﻻيوجد اصدار جديد {0} "
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:281
+msgid "Update verified"
+msgstr "انتهى التحديث"
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:307
+#, java-format
+msgid "Transfer failed from {0}"
+msgstr "فشل في النقل {0}"
+
+#. wars for ConfigClientsHelper
+#: ../java/strings/Strings.java:12
+msgid "addressbook"
+msgstr "دفتر العناوين"
+
+#: ../java/strings/Strings.java:13
+msgid "i2psnark"
+msgstr "تورنت"
+
+#: ../java/strings/Strings.java:14
+msgid "i2ptunnel"
+msgstr "نفقi2p"
+
+#: ../java/strings/Strings.java:15
+msgid "susimail"
+msgstr "البريد"
+
+#: ../java/strings/Strings.java:16
+msgid "susidns"
+msgstr ""
+
+#: ../java/strings/Strings.java:17
+msgid "routerconsole"
+msgstr "موجه"
+
+#. clients, taken from clients.config, for ConfigClientsHelper
+#. note that if the wording changes in clients.config, we have to
+#. keep the old string here as well for existing installs
+#: ../java/strings/Strings.java:22
+msgid "Web console"
+msgstr "شاشة التحكم"
+
+#: ../java/strings/Strings.java:23
+msgid "SAM application bridge"
+msgstr ""
+
+#: ../java/strings/Strings.java:24
+msgid "Application tunnels"
+msgstr "نفق البرامج"
+
+#: ../java/strings/Strings.java:25
+msgid "My eepsite web server"
+msgstr " eepsite خادم ويب"
+
+#: ../java/strings/Strings.java:26
+msgid "I2P webserver (eepsite)"
+msgstr "I2P خادم ويب (eepsite)"
+
+#: ../java/strings/Strings.java:27
+msgid "Browser launch at startup"
+msgstr "اطلاق المتصفح عند البداية"
+
+#: ../java/strings/Strings.java:28
+msgid "BOB application bridge"
+msgstr ""
+
+#: ../java/strings/Strings.java:30
+msgid "Open Router Console in web browser at startup"
+msgstr "فتح شاشة التحكم في المتصفح عند البداية"
+
+#: ../java/strings/Strings.java:37
+msgid "IRC proxy"
+msgstr "IRC بروكسي"
+
+#: ../java/strings/Strings.java:38
+msgid "eepsite"
+msgstr ""
+
+#: ../java/strings/Strings.java:39
+msgid "I2P webserver"
+msgstr "I2P خادم ويب"
+
+#: ../java/strings/Strings.java:40
+msgid "HTTP Proxy"
+msgstr ""
+
+#. older names for pre-0.7.4 installs
+#: ../java/strings/Strings.java:42
+msgid "eepProxy"
+msgstr ""
+
+#: ../java/strings/Strings.java:43
+msgid "ircProxy"
+msgstr ""
+
+#. hardcoded in i2psnark
+#: ../java/strings/Strings.java:45
+msgid "I2PSnark"
+msgstr ""
+
+#. hardcoded in iMule?
+#: ../java/strings/Strings.java:47
+msgid "iMule"
+msgstr ""
+
+#. standard themes for ConfigUIHelper
+#: ../java/strings/Strings.java:51
+msgid "classic"
+msgstr ""
+
+#: ../java/strings/Strings.java:52
+msgid "dark"
+msgstr "داكن"
+
+#: ../java/strings/Strings.java:53
+msgid "light"
+msgstr "فاتح"
+
+#: ../java/strings/Strings.java:54
+msgid "midnight"
+msgstr "ليل"
+
+#. stat groups for stats.jsp
+#: ../java/strings/Strings.java:57
+msgid "Bandwidth"
+msgstr "سرعة الاتصال"
+
+#: ../java/strings/Strings.java:58
+msgid "BandwidthLimiter"
+msgstr "تحديد سرعة الاتصال"
+
+#: ../java/strings/Strings.java:59
+msgid "ClientMessages"
+msgstr ""
+
+#: ../java/strings/Strings.java:60
+msgid "Encryption"
+msgstr "التشفير"
+
+#: ../java/strings/Strings.java:61
+msgid "i2cp"
+msgstr ""
+
+#: ../java/strings/Strings.java:63
+msgid "InNetPool"
+msgstr ""
+
+#: ../java/strings/Strings.java:64
+msgid "JobQueue"
+msgstr ""
+
+#: ../java/strings/Strings.java:65
+msgid "NetworkDatabase"
+msgstr "شبكة"
+
+#: ../java/strings/Strings.java:66
+msgid "ntcp"
+msgstr ""
+
+#: ../java/strings/Strings.java:69
+msgid "Stream"
+msgstr ""
+
+#: ../java/strings/Strings.java:70
+msgid "Throttle"
+msgstr ""
+
+#: ../java/strings/Strings.java:71
+msgid "Transport"
+msgstr "نقل"
+
+#: ../java/strings/Strings.java:73
+msgid "udp"
+msgstr ""
+
+#. parameters in transport addresses (netdb.jsp)
+#. may or may not be worth translating
+#: ../java/strings/Strings.java:77
+msgid "host"
+msgstr ""
+
+#: ../java/strings/Strings.java:78
+msgid "key"
+msgstr "مفتاح"
+
+#: ../java/strings/Strings.java:79
+msgid "port"
+msgstr "منفذ"
+
+#. introducer host
+#: ../java/strings/Strings.java:83
+msgid "ihost0"
+msgstr ""
+
+#: ../java/strings/Strings.java:84
+msgid "ihost1"
+msgstr ""
+
+#: ../java/strings/Strings.java:85
+msgid "ihost2"
+msgstr ""
+
+#. introducer port
+#: ../java/strings/Strings.java:87
+msgid "iport0"
+msgstr ""
+
+#: ../java/strings/Strings.java:88
+msgid "iport1"
+msgstr ""
+
+#: ../java/strings/Strings.java:89
+msgid "iport2"
+msgstr ""
+
+#. introducer key
+#: ../java/strings/Strings.java:91
+msgid "ikey0"
+msgstr ""
+
+#: ../java/strings/Strings.java:92
+msgid "ikey1"
+msgstr ""
+
+#: ../java/strings/Strings.java:93
+msgid "ikey2"
+msgstr ""
+
+#. introducer tag
+#: ../java/strings/Strings.java:95
+msgid "itag0"
+msgstr ""
+
+#: ../java/strings/Strings.java:96
+msgid "itag1"
+msgstr ""
+
+#: ../java/strings/Strings.java:97
+msgid "itag2"
+msgstr ""
+
+#. Descriptions for the stats that are graphed by default
+#. There are over 500 stats currently defined, we aren't going to tag them all
+#: ../java/strings/Strings.java:101
+msgid "Low-level bandwidth receive rate"
+msgstr ""
+
+#. bw.recvRate
+#: ../java/strings/Strings.java:102
+msgid "Low-level bandwidth send rate"
+msgstr ""
+
+#. bw.sendRate
+#: ../java/strings/Strings.java:103
+msgid "How many peers we are actively talking with"
+msgstr "كم من المستخدمين نتحاور معهم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106
+msgid "config networking"
+msgstr "اعدادت الشبكة"
+
+#. We have intl defined when this is included, but not when compiled standalone.
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:230
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:215
+msgid "Refresh (s)"
+msgstr "أنعش"
+
+#. ditto
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:219
+msgid "Enable"
+msgstr "فعل"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240
+msgid "I2P Network Configuration"
+msgstr "اعدادات شبكة I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:298
+msgid "Bandwidth limiter"
+msgstr "مخدد سرعة الشبكة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:300
+msgid "I2P will work best if you configure your rates to match the speed of your internet connection."
+msgstr "سيشتغلI2P بفعالية أكبر اذا حددت سرعة الاتصال."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:304
+msgid "KBps In"
+msgstr "KBps الداخلة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318
+msgid "KBps Out"
+msgstr "KBps الخارجة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:334
+msgid "Share"
+msgstr "شارك"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304
+msgid "NOTE"
+msgstr "ملاحظة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343
+#, java-format
+msgid "You have configured I2P to share only {0} KBps."
+msgstr "لقد قمت باعداد I2P لمشاركة {0} KOps."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346
+msgid "I2P requires at least 12KBps to enable sharing. "
+msgstr "يحتاج I2P على الاقل الى 12KBps لتفعيل المشاركة."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347
+msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. "
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:348
+msgid "It improves your anonymity by creating cover traffic, and helps the network."
+msgstr "هذا يزيد من مجهولية المستخدم و يساعد الشبكة بشكل عام."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:351
+#, java-format
+msgid "You have configured I2P to share {0} KBps."
+msgstr "قمت باعداد I2P لمشاركة {0} KOps."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:354
+msgid "The higher the share bandwidth the more you improve your anonymity and help the network."
+msgstr "كلما ارتفر سرعة الشبكة التي تشاركها، كلما زادت نسبة المجهولية وفعالية الشبكة."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:403
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:322
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365
+msgid "Cancel"
+msgstr "ألغي"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375
+msgid "IP and Transport Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:306
+msgid "The default settings will work for most people."
+msgstr "الاعدادات التي تشتغل غالبية الوقت."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379
+msgid "There is help below."
+msgstr "أنظر التعليمات أسفله."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381
+msgid "UPnP Configuration"
+msgstr "اعدادات UPnP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385
+msgid "Enable UPnP to open firewall ports"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387
+msgid "UPnP status"
+msgstr "UPnP حالة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389
+msgid "IP Configuration"
+msgstr "اعدادات IP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
+msgid "Externally reachable hostname or IP address"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
+msgid "Use all auto-detect methods"
+msgstr "استعمال جميع طرق الاكتشاف التلقائي"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
+msgid "Disable UPnP IP address detection"
+msgstr "الغاء UPnP IP اكتشاف عنوان "
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403
+msgid "Ignore local interface IP address"
+msgstr "تجاهل عنوان IP المحلي"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407
+msgid "Use SSU IP address detection only"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
+msgid "Specify hostname or IP"
+msgstr "حدد hostname او IP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
+msgid "Select Interface"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431
+msgid "Hidden mode - do not publish IP"
+msgstr "لا تنشر عنوان  IP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:433
+msgid "(prevents participating traffic)"
+msgstr "(منع مشاركة الاتصال)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
+msgid "Action when IP changes"
+msgstr "عمل عند تغيير IP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439
+msgid "Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:441
+msgid "Experimental"
+msgstr "تجريبي"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443
+msgid "UDP Configuration:"
+msgstr "اعدادات UDP :"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:445
+msgid "UDP port:"
+msgstr "منفذ UDP :"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
+msgid "TCP Configuration"
+msgstr "اعدادات TCP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:465
+msgid "Use auto-detected IP address"
+msgstr "استعمل دائما عنوان IP المكتشف "
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:467
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499
+msgid "currently"
+msgstr "حاليا"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:471
+msgid "if we are not firewalled"
+msgstr "لايوجد جدار ناري"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:475
+msgid "Always use auto-detected IP address (Not firewalled)"
+msgstr "استعمل دائما عنوان IP المكتشف (لا يوجد جدار ناري)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
+msgid "Disable inbound (Firewalled)"
+msgstr "الغاء الاتصال الداخلي (وراء جدار ناري)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489
+msgid "Completely disable"
+msgstr "الغاء"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:491
+msgid "(select only if behind a firewall that throttles or blocks outbound TCP)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493
+msgid "Externally reachable TCP port"
+msgstr "منفذ TCP يمكن الوصول إليها خارجيا"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497
+msgid "Use the same port configured for UDP"
+msgstr "استعمل نفس المنفذ المخصص لمنفذ UDP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:505
+msgid "Specify Port"
+msgstr "إختر المنفذ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:330
+msgid "Note"
+msgstr "ملاحظة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512
+msgid "Changing these settings will restart your router."
+msgstr "تغيير في الإعدادات يقتضي اعادة تشغيل الموجه."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518
+msgid "Configuration Help"
+msgstr "مساعدة حول الاعدادات"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
+msgid "While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522
+msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you."
+msgstr "ان توفرت الامكانية قم بفتح منفذ في الجدار الناري لسماح بوصول اتصال UDP و TCP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524
+msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526
+msgid "Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:528
+msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537
+msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539
+msgid "UPnP support is beta, and may not work for any number of reasons"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541
+msgid "No UPnP-compatible device present"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543
+msgid "UPnP disabled on the device"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545
+msgid "Software firewall interference with UPnP"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547
+msgid "Bugs in the device's UPnP implementation"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549
+msgid "Multiple firewall/routers in the internet connection path"
+msgstr "هناك عدة موجهات و جدار ناري في طريق الاتصال بالانترنت"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:551
+msgid "UPnP device change, reset, or address change"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:553
+msgid "Review the UPnP status here."
+msgstr "راجع حالة UPnP هنا."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
+msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
+msgid "Hostnames entered above will be published in the network database."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559
+msgid "They are <b>not private</b>."
+msgstr "انها <b>غير خاصة</b>."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561
+msgid "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
+msgid "If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
+msgid "When in doubt, leave the settings at the defaults."
+msgstr "ان لم تكن متأكدا دع الاعدادات كما هي."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
+msgid "Reachability Help"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572
+msgid "If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
+msgid "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help diagnose the problem."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
+msgid "Your UDP port does not appear to be firewalled."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
+msgid "Your UDP port appears to be firewalled."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
+msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
+msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589
+msgid "I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591
+msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
+msgid "If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
+msgid "Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
+msgid "The router is currently testing whether your UDP port is firewalled."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
+msgid "The router is not configured to publish its address, therefore it does not expect incoming connections."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
+msgid "WARN - Firewalled and Fast"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
+msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled."
+msgstr "قمت باعداد I2P لمشاركة أكثر من 128KBps، لكنك وراء جدار ناري."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609
+msgid "While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
+msgid "WARN - Firewalled and Floodfill"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
+msgid "You have configured I2P to be a floodfill router, but you are firewalled."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
+msgid "For best participation as a floodfill router, you should open your firewall."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
+msgid "WARN - Firewalled with Inbound TCP Enabled"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
+msgid "You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
+msgid "If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
+msgid "Please open your firewall or disable inbound TCP above."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
+msgid "WARN - Firewalled with UDP Disabled"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
+msgid "You have configured inbound TCP, however you have disabled UDP."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
+msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
+msgid "Please open your firewall or enable UDP."
+msgstr "غير اعدادات الجدار الناري لفتح منفذ UDP."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
+msgid "ERR - Clock Skew"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
+msgid "Your system's clock is skewed, which will make it difficult to participate in the network."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
+msgid "Correct your clock setting if this error persists."
+msgstr "غير اعدادات الساعة اذا استمر هذا الخطأ."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
+msgid "ERR - Private TCP Address"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
+msgid "You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
+msgid "Correct the address or disable inbound TCP above."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
+msgid "ERR - SymmetricNAT"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
+msgid "I2P detected that you are firewalled by a Symmetric NAT."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
+msgid "I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
+msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
+msgid "I2P was unable to bind to port 8887 or other configured port."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655
+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."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657
+msgid "This may be a transient error, if the other program is no longer using the port."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659
+msgid "However, a restart is always required after this error."
+msgstr "اعادة تشغيل ضرورية بعد هذا الخطأ."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661
+msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663
+msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665
+msgid "Therefore your router cannot accept inbound connections."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667
+msgid "Please configure a TCP host and port above or enable UDP."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669
+msgid "ERR - Client Manager I2CP Error - check logs"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671
+msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673
+msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107
+msgid "config advanced"
+msgstr "اعدادات متقدمة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241
+msgid "I2P Advanced Configuration"
+msgstr "اعدادات I2P متقدمة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:301
+msgid "Advanced I2P Configuration"
+msgstr "اعدادات I2P متقدمة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:311
+msgid "Some changes may require a restart to take effect."
+msgstr "بعض التغييرات تحتاج اعادة التشغيل لتفعيلها"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106
+msgid "config clients"
+msgstr "إعدادات المستخدم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:243
+msgid "I2P Client Configuration"
+msgstr "اعدادات I2P "
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312
+msgid "Client Configuration"
+msgstr "اعدادات المستخدم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:314
+msgid "The Java clients listed below are started by the router and run in the same JVM."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:318
+msgid "To change other client options, edit the file"
+msgstr "لتغيير خضائص المستخدم غير الملف"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:415
+msgid "All changes require restart to take effect."
+msgstr "جيمع التغييرات تحتاج اعادة التشغيل ليتم تطبيقها"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:337
+msgid "Advanced Client Interface Configuration"
+msgstr "اعدادات I2P متقدمة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339
+msgid "External I2CP (I2P Client Protocol) Interface Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345
+msgid "Enabled without SSL"
+msgstr "فعل بدون SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351
+msgid "Enabled with SSL required"
+msgstr "تفعيل SSL ضروري"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357
+msgid "Disabled - Clients outside this Java process may not connect"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359
+msgid "I2CP Port"
+msgstr "I2CP منفذ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363
+msgid "I2CP Interface"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379
+msgid "Authorization"
+msgstr "الصلاحية"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385
+msgid "Require username and password"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:387
+msgid "Username"
+msgstr "اسم المستخدم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:391
+msgid "Password"
+msgstr "كلمة السر"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:397
+msgid "Any changes made here must also be configured in the external client."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:399
+msgid "Many clients do not support SSL or authorization."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407
+msgid "WebApp Configuration"
+msgstr "اعدادات تطبيق ويب"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409
+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 separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:411
+msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421
+msgid "Plugin Configuration"
+msgstr "إعدادات الملحق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423
+msgid "The plugins listed below are started by the webConsole client."
+msgstr "الملحقال التالية يتم تشغيلها من طرف شاشة التحكم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429
+msgid "Plugin Installation"
+msgstr "تثبيت الملحق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431
+msgid "To install a plugin, enter the download URL:"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106
+msgid "config keyring"
+msgstr "اعدادات المفاتيح"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:227
+msgid "I2P Keyring Configuration"
+msgstr "اعدادات المفاتيح I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:295
+msgid "The router keyring is used to decrypt encrypted leaseSets."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:298
+msgid "The keyring may contain keys for local or remote encrypted destinations."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:308
+msgid "Manual Keyring Addition"
+msgstr "اضافة المفاتيح يدويا"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:310
+msgid "Enter keys for encrypted remote destinations here."
+msgstr "ادخل مفاتيح الوجهات المشفرة هنا"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:313
+msgid "Keys for local destinations must be entered on the"
+msgstr "يجب ادخال مفاتيح الوجهات المحلية في"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315
+msgid "I2PTunnel page"
+msgstr "صفحة النفق I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317
+msgid "Dest. name, hash, or full key"
+msgstr "نقطة الوصول، اسم، بصمة، او مفتاح كامل"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:319
+msgid "Encryption Key"
+msgstr "مفتاح التشفير"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107
+msgid "config logging"
+msgstr "اعدادت السجلات"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:241
+msgid "I2P Logging Configuration"
+msgstr "اعدادت السجلات I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301
+msgid "Configure I2P Logging Options"
+msgstr "اعدادت السجلات I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:303
+msgid "Logging filename"
+msgstr "ملف السجل"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307
+msgid "(the symbol '@' will be replaced during log rotation)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:309
+msgid "Log record format"
+msgstr "بيانات السجل"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313
+msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:315
+msgid "Log date format"
+msgstr "تاريخ السجل"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
+msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321
+msgid "Max log file size"
+msgstr "أقصى حجم لملف السجل"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325
+msgid "Default log level"
+msgstr "نوع السجل"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329
+msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331
+msgid "Log level overrides"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335
+msgid "New override"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106
+msgid "config peers"
+msgstr "اعدادات النظائر"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:227
+msgid "I2P Peer Configuration"
+msgstr "اعدادات مستخدمي I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:305
+msgid "Manual Peer Controls"
+msgstr "تحكم يدوي في النظائر"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:307
+msgid "Router Hash"
+msgstr "بصمة الموجه"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:311
+msgid "Manually Ban / Unban a Peer"
+msgstr "منع / الغاء منع يدويا لنظير"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:313
+msgid "Banning will prevent the participation of this peer in tunnels you create."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323
+msgid "Adjust Profile Bonuses"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325
+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 Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:327
+msgid "profiles page"
+msgstr "صفحة البروفايل"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:251
+msgid "Banned Peers"
+msgstr "مستخدمون ممنوعون"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366
+msgid "Banned IPs"
+msgstr "عناوين IP الممنوعة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:106
+msgid "config reseeding"
+msgstr "اعدادات اعادة التوزيع"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240
+msgid "I2P Reseeding Configuration"
+msgstr "اعدادات اعادة التوزيع"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:300
+msgid "Reseeding Configuration"
+msgstr "اعدادات اعادة التوزيع"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:302
+msgid "Reseeding is the bootstrapping process used to find other routers when you first install I2P, or when your router has too few router references remaining."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:304
+msgid "If reseeding has failed, you should first check your network connection."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:308
+msgid "Change these only if HTTP is blocked by a restrictive firewall, reseed has failed, and you have access to an HTTP proxy."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:310
+#, java-format
+msgid "See {0} for instructions on reseeding manually."
+msgstr "أنظر {0} التعليمات لاعادة التوزيع اليدوي."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:310
+msgid "the FAQ"
+msgstr "الأسئلة الشائعة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:312
+msgid "Reseed URL Selection"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318
+msgid "Try SSL first then non-SSL"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324
+msgid "Use SSL only"
+msgstr "استعمل SSL فقط"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330
+msgid "Use non-SSL only"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:332
+msgid "Reseed URLs"
+msgstr "اعادة توزيع العناوين"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336
+msgid "Enable HTTP proxy (not used for SSL)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:340
+msgid "HTTP Proxy Host"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:344
+msgid "HTTP Proxy Port"
+msgstr "HTTP Proxy منفذ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106
+msgid "config service"
+msgstr "اعدادات الخدمة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:227
+msgid "I2P Service Configuration"
+msgstr "اعدادات خدمة I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:285
+msgid "Shutdown the router"
+msgstr "توقيف الموجه"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:287
+msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:289
+msgid "If you need to kill the router immediately, that option is available as well."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:299
+msgid "If you want the router to restart itself after shutting down, you can choose one of the following."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:301
+msgid "This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303
+msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately."
+msgstr "اعادة التشغيل ستتم بعد بضع دقائق (لمساعدة النظائر)، بينما اعادة التشغبل الفورية تعيد التشغيل فورا."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305
+msgid "After tearing down the router, it will wait 1 minute before starting back up again."
+msgstr "عند توقيف الموجه، سيتم تشغيله مرة أخرى بعد دقيقة."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:315
+msgid "Systray integration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317
+msgid "On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status"
+msgstr "في نظام ويندوز، هناك برنامج صغير يمكنك من خلال ايقونة معرفة حالة اشتغال الموجه"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319
+msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321
+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:323
+msgid "Show systray icon"
+msgstr "أظهر الأيقونة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325
+msgid "Hide systray icon"
+msgstr "إخفاء أيقونة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327
+msgid "Run on startup"
+msgstr "شغل عند انطلاق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:329
+msgid "You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:331
+msgid "If you prefer the command line, you can also run the "
+msgstr "اذا كنت تفضل استعمال سطر الأوامر، يمكنك تطبيق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341
+msgid "If you are running I2P as service right now, removing it will shut down your router immediately."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343
+msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347
+msgid "Debugging"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349
+msgid "View the job queue"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353
+msgid "At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to <a href=\"logs.jsp#servicelogs\">wrapper.log</a>."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359
+msgid "Launch browser on router startup?"
+msgstr "أطلق المتصفح عند البداية؟"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361
+msgid "I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107
+msgid "config stats"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:228
+msgid "I2P Stats Configuration"
+msgstr "اعدادات احصائيات I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302
+msgid "Configure I2P Stat Collection"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304
+msgid "Enable full stats?"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311
+msgid "change requires restart to take effect"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:313
+msgid "Stat file"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317
+msgid "Filter"
+msgstr "مرشح"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328
+msgid "toggle all"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330
+msgid "Log"
+msgstr "سجل"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:332
+msgid "Graph"
+msgstr "رسم بياني"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:371
+msgid "Advanced filter"
+msgstr "اعدادات متقدمة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106
+msgid "config tunnels"
+msgstr "اعدادات الأنفاق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240
+msgid "I2P Tunnel Configuration"
+msgstr "اعدادات أنفاق I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:306
+msgid "The default settings work for most people."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:310
+msgid "There is a fundamental tradeoff between anonymity and performance."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:313
+msgid "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:316
+msgid "High CPU and/or high outbound bandwidth usage may result."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:319
+msgid "Change these settings with care, and adjust them if you have problems."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:333
+msgid "Exploratory tunnel setting changes are stored in the router.config file."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:336
+msgid "Client tunnel changes are temporary and are not saved."
+msgstr "تغييرات النفق هي مؤقتة وغير محفوظة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338
+msgid "To make permanent client tunnel changes see the"
+msgstr "للقيام بتغييرات دائمة أنظر"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:340
+msgid "i2ptunnel page"
+msgstr "i2ptunnel صفحة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106
+msgid "config UI"
+msgstr "اعدادات واجهة المستخدم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240
+msgid "I2P UI Configuration"
+msgstr "I2P اعدادات واجهة المستخدم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:292
+msgid "Router Console Theme"
+msgstr "تيمة واجهة المستخدم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:310
+msgid "Theme selection disabled for Internet Explorer, sorry."
+msgstr "إختيار التيمة لأنترنت اكسبلورر."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:312
+msgid "If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:316
+msgid "Router Console Language"
+msgstr "لغة لوحة التحكم"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:320
+msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help."
+msgstr "ساهم في ترجمة واجهة الاستخدام بالاتصال بالمطورين على IRC #i2p لطلب المساعدة."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:324
+msgid "Apply"
+msgstr "طبق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106
+msgid "config update"
+msgstr "ترقية الاعدادات"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:227
+msgid "I2P Update Configuration"
+msgstr "اعدادات الترقية I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:303
+msgid "Check for I2P and news updates"
+msgstr "تحقق من اصدارات جديدة لـ I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:305
+msgid "News &amp; I2P Updates"
+msgstr "اخبار I2P واصدارات جديدة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:309
+msgid "Update In Progress"
+msgstr "جاري التحديث"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:317
+msgid "News URL"
+msgstr "عنوان الأخبار"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321
+msgid "Refresh frequency"
+msgstr "تردد الانعاش"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327
+msgid "Update policy"
+msgstr "طريقة الترقية"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331
+msgid "Update through the eepProxy?"
+msgstr "ترقية باستعمال eepProxy؟"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335
+msgid "eepProxy host"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339
+msgid "eepProxy port"
+msgstr "eepProxy منفذ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:343
+msgid "Update URLs"
+msgstr "تحديث العناوين"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:347
+msgid "Trusted keys"
+msgstr "المفاتيح الموثوقة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:351
+msgid "Update with unsigned development builds?"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:355
+msgid "Unsigned Build URL"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
+msgid "I2P updates are disabled because you do not have write permission for the install directory."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367
+msgid "Save"
+msgstr "حفظ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:115
+msgid "Internal Error"
+msgstr "مشكل داخلي"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:117
+msgid "Router Console"
+msgstr "مركز تحكم I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121
+msgid "Configuration"
+msgstr "اعدادات"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129
+msgid "Sorry! There has been an internal error."
+msgstr "خطأ هذا مشكل داخلي"
+
+#. note to translators - both parameters are URLs
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:133
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:232
+#, java-format
+msgid "Please report bugs on {0} or {1}."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:137
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:236
+msgid "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:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:238
+msgid "Please include this information in bug reports"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:141
+msgid "Error Details"
+msgstr "تفاصيل الخطأ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143
+#, java-format
+msgid "Error {0}"
+msgstr "خطأ {0}"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:163
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:228
+msgid "I2P Version and Running Environment"
+msgstr "رقم اصدار I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:191
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266
+msgid "Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117
+msgid "Page Not Found"
+msgstr "صفحة غير موجودة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242
+msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource."
+msgstr "معذرة، انت تقوم بطلب صفحة غير موجودة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:244
+msgid "Error 404"
+msgstr "خطأ 404"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:249
+msgid "not found"
+msgstr "غير موجود"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106
+msgid "graphs"
+msgstr "رسم بياني"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:227
+msgid "I2P Performance Graphs"
+msgstr "رسم بياني لأداء I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105
+msgid "home"
+msgstr "منزل"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105
+msgid "job queue"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:226
+msgid "I2P Router Job Queue"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105
+msgid "logs"
+msgstr "السجلات"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226
+msgid "I2P Router Logs"
+msgstr "I2P سجل الموجه"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:281
+msgid "Critical Logs"
+msgstr "سجلات هامة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:285
+msgid "Router Logs"
+msgstr "سجلات الموجه"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:291
+msgid "Service (Wrapper) Logs"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105
+msgid "network database summary"
+msgstr "قاعدة البيانات"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:226
+msgid "I2P Network Database Summary"
+msgstr "احصائيات قاعدة بيانات الشبكة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109
+msgid "WebApp Not Found"
+msgstr "صفحة غير موجودة"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:230
+msgid "Web Application Not Running"
+msgstr "تطبيق الويب لا يشتغل"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:232
+msgid "The requested web application is not running."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234
+msgid "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</a> to start it."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105
+msgid "peer connections"
+msgstr "الإتصال بالمستخدمين"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:226
+msgid "I2P Network Peers"
+msgstr "I2P شبكة المستخدمين"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105
+msgid "peer profiles"
+msgstr "بروفايل المستخدمين"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:226
+msgid "I2P Network Peer Profiles"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105
+msgid "statistics"
+msgstr "احصائيات"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243
+msgid "I2P Router Statistics"
+msgstr "احصائيات شبكة I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:247
+#, java-format
+msgid "Disable {0} Refresh"
+msgstr "الغاء {0} الانعاش"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105
+msgid "tunnel summary"
+msgstr "فهرس الأنفاق"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:226
+msgid "I2P Tunnel Summary"
+msgstr "فهرس أنفاق I2P"
+
+#~ msgid ""
+#~ "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href="
+#~ "\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" "
+#~ "href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually."
+#~ msgstr ""
+#~ "تحقق من <a target=\"_top\" href=\"logs.jsp\">logs</a> and if nothing "
+#~ "helps، read the <a target=\"_top\" href=\"http://www.i2p2.de/faq.html"
+#~ "\">FAQ</a> about reseeding manually."
+
+#~ msgid "Last reseed failed fully (failed reading seed URL)."
+#~ msgstr "فشل آخر توزيع ( تحميل العنوان)"
+
+#~ msgid "Last reseed failed fully (exception caught)."
+#~ msgstr "فشل آخر توزيع"
+
+#~ msgid "System tray icon enabled."
+#~ msgstr "تم تفعيل ابقونة"
+
+#~ msgid "System tray icon feature not supported on this platform. Sorry!"
+#~ msgstr "إظهار الأيقونة غير مدعوم"
+
+#~ msgid "Warning: unable to contact the systray manager"
+#~ msgstr "خطأ: فشل في الاتصال بمتحكم الأيقونة"
+
+#~ msgid "System tray icon disabled."
+#~ msgstr "أيقونة النظام غير مفعلة."
+
+#~ msgid "hour"
+#~ msgstr "ساعة"
+
+#~ msgid "minute"
+#~ msgstr "دقيقة"
+
+#~ msgid "minutes"
+#~ msgstr "دقائق"
+
+#~ msgid "This is useful in some situations"
+#~ msgstr "C'est utile dans certains cas"
+
+#~ msgid "Start Now"
+#~ msgstr "Démarrer tout de suite"
+
+#~ msgid "Depth"
+#~ msgstr "Profondeur"
+
+#~ msgid "view without"
+#~ msgstr "montrer sans"
+
+#~ msgid "view with"
+#~ msgstr "montrer avec"
+
+#~ msgid "Show the router's workload, and how it's performing"
+#~ msgstr "Montrer les tâches en cours"
+
+#~ msgid "Jobs"
+#~ msgstr "Tâches"
+
+#~ msgid "Tunnels in/out"
+#~ msgstr "Tunnels entrants/sortants"
diff --git a/apps/routerconsole/locale/messages_de.po b/apps/routerconsole/locale/messages_de.po
index 4c323cd8e533ade505d6ac3b50350c82493c7d87..074daa5aa85dded9f13ec6c05d69c4182b25e2a9 100644
--- a/apps/routerconsole/locale/messages_de.po
+++ b/apps/routerconsole/locale/messages_de.po
@@ -8,10 +8,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P routerconsole\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-28 00:08+0000\n"
-"PO-Revision-Date: 2011-01-01 21:19+0100\n"
+"POT-Creation-Date: 2011-03-25 12:46+0000\n"
+"PO-Revision-Date: 2011-04-16 02:57+0100\n"
 "Last-Translator: mixxy <m1xxy@mail.i2p>\n"
 "Language-Team: echelon <echelon@mail.i2p>, Sperreingang <sperrbezirk@mail.i2p>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -26,7 +27,7 @@ msgstr ""
 #. {0,number,####} prevents 1234 from being output as 1,234 in the English locale.
 #. If you want the digit separator in your locale, translate as {0}.
 #. alternates: msec, msecs
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1103
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1141
 #, java-format
 msgid "1 ms"
 msgid_plural "{0,number,####} ms"
@@ -36,7 +37,7 @@ msgstr[1] "{0,number,####} ms"
 #. seconds
 #. Note to translators: quantity will always be greater than one.
 #. alternates: secs, sec. 'seconds' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1108
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1146
 #, java-format
 msgid "1 sec"
 msgid_plural "{0} sec"
@@ -46,7 +47,7 @@ msgstr[1] "{0} s"
 #. minutes
 #. Note to translators: quantity will always be greater than one.
 #. alternates: mins, min. 'minutes' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1113
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1151
 #, java-format
 msgid "1 min"
 msgid_plural "{0} min"
@@ -56,42 +57,42 @@ msgstr[1] "{0} Minuten"
 #. hours
 #. Note to translators: quantity will always be greater than one.
 #. alternates: hrs, hr., hrs.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1118
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1156
 #, java-format
 msgid "1 hour"
 msgid_plural "{0} hours"
 msgstr[0] "1 Stunde"
 msgstr[1] "{0} Stunden"
 
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1120
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1158
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:314
 msgid "n/a"
 msgstr "k.A."
 
 #. days
 #. Note to translators: quantity will always be greater than one.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1124
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1162
 #, java-format
 msgid "1 day"
 msgid_plural "{0} days"
 msgstr[0] "1 Tag"
 msgstr[1] "{0} Tage"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:126
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:122
 #, java-format
 msgid "Banned by router hash: {0}"
 msgstr "Gesperrt über Routerprüfsumme: {0}"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:128
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:124
 msgid "Banned by router hash"
 msgstr "Gesperrt über Routerprüfsumme"
 
 #. Temporary reason, until the job finishes
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:673
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:669
 msgid "IP banned"
 msgstr "IP gesperrt"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:743
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:739
 #, java-format
 msgid "IP banned by blocklist.txt entry {0}"
 msgstr "IP gesperrt wegen blocklist.txt-Eintrags {0}"
@@ -145,35 +146,41 @@ msgstr "Akzeptiere Tunnelanfragen"
 msgid "Rejecting tunnels"
 msgstr "Weise Tunnelanfragen zurück"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:68
-msgid "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually."
-msgstr "Stellen Sie bitte sicher, dass nichts ausgehenden HTTP-Transfer blockiert, überprüfen Sie die <a target=\"_top\" href=\"logs.jsp\">Berichte</a>, und wenn gar nichts hilft, lesen Sie die <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> über das manuelle Reseeden."
-
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:101
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:125
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
 msgid "Reseeding"
 msgstr "Reseeden"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:124
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:141
 #, java-format
 msgid "Reseed fetched only 1 router."
 msgid_plural "Reseed fetched only {0} routers."
-msgstr[0] "Nur Daten eines Routers per Ressed erhalten"
+msgstr[0] "Nur Daten eines Routers per Reseed erhalten"
 msgstr[1] "Nur {0} Routerinformationen per Reseed erhalten"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:131
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:148
 msgid "Reseed failed."
 msgstr "Reseed fehlgeschlagen"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:232
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:149
+#, java-format
+msgid "See {0} for help."
+msgstr "Für Hilfe, siehe {0}!"
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150
+msgid "reseed configuration page"
+msgstr "Einstellungen für den Reseed"
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:293
 msgid "Reseeding: fetching seed URL."
 msgstr "Reseed: Hole die Seed-URL"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:273
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:335
 #, java-format
 msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
 msgstr "Reseed: Holen der Router-Informationen von Seed-URL ({0} erfolgreich, {1} Fehler)."
 
-#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:513
+#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512
 msgid "NetDb entry"
 msgstr "NetzDB-Eintrag"
 
@@ -182,191 +189,192 @@ msgstr "NetzDB-Eintrag"
 msgid "No transports (hidden or starting up?)"
 msgstr "Keine Transporte (Versteckter Modus oder Start?)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:452
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450
 msgid "Unreachable on any transport"
 msgstr "Unerreichbar auf allen Transporten"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:501
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499
 msgid "Router Transport Addresses"
 msgstr "Router-Transport-Adresse"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:506
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504
 #, java-format
 msgid "{0} is used for outbound connections only"
 msgstr "{0} wird nur für ausgehende Verbindungen genutzt"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129
 msgid "Help"
 msgstr "Hilfe"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519
 msgid "Your transport connection limits are automatically set based on your configured bandwidth."
 msgstr "Ihre Verbindungseinstellungen werden, basierend auf der von Ihnen zur Verfügung gestellten Bandbreite, automatisch vorgenommen."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521
 msgid "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and i2np.udp.maxConnections=nnn on the advanced configuration page."
 msgstr "Um diese Einstellungen zu umgehen, fügen Sie folgende Einstellungen der Seite \"Erweiterte Einstellungen\" hinzu: i2np.ntcp.maxConnections=nnn und i2np.udp.maxConnections=nnn"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
 msgid "Definitions"
 msgstr "Definitionen"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:735
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
 msgid "Peer"
 msgstr "Teilnehmer"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
 msgid "The remote peer, identified by router hash"
 msgstr "Der entfernte Teilnehmer, über seine Router-Prüfsumme erkannt"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:736
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
 msgid "Dir"
 msgstr "Richtung"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
 msgid "Inbound connection"
 msgstr "Eingehende Verbindungen"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
 msgid "Outbound connection"
 msgstr "Ausgehende Verbindungen"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
 msgid "They offered to introduce us (help other peers traverse our firewall)"
 msgstr "Sie boten an, uns bekannt zu machen (anderen Teilnehmern helfen, unsere Firewall zu überwinden)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532
 msgid "We offered to introduce them (help other peers traverse their firewall)"
 msgstr "Wir bieten an, sie bekannt zu machen (anderen Teilnehmern helfen, ihre Firewall zu überwinden)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
 msgid "How long since a packet has been received / sent"
 msgstr "Vergangene Zeit seit ein Paket empfangen/gesendet wurde"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
 msgid "Idle"
 msgstr "Untätig"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "In/Out"
 msgstr "Ein-/Ausgehend"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)"
 msgstr "Die geglättete ein-/ausgehende Transferrate (KBytes pro Sekunde)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
 msgid "How long ago this connection was established"
 msgstr "Wie lange die Verbindung schon besteht"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905
 msgid "Up"
 msgstr "Verbunden"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907
 msgid "Skew"
 msgstr "Differenz"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
 msgid "The difference between the peer's clock and your own"
 msgstr "Der Unterschied zwischen Ihrer und der Uhr des Teilnehmers"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
 msgid "The congestion window, which is how many bytes can be sent without an acknowledgement"
 msgstr "Der Pufferspeicher, der angibt, wieviele Bytes Sie ohne Bestätigung senden können"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
 msgid "The number of sent messages awaiting acknowledgement"
 msgstr "Die Anzahl der gesendeten Nachrichten, die auf Bestätigung warten"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
 msgid "The maximum number of concurrent messages to send"
 msgstr "Die maximale Anzahl von gleichzeitig sendbaren Nachrichten"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
 msgid "The number of pending sends which exceed congestion window"
 msgstr "Die Anzahl der ausstehenden Sendeanforderungen, die den Pufferspeicher überschreiten."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
 msgid "The slow start threshold"
 msgstr "Der Grenzwert zum verzögertem Starten"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
 msgid "The round trip time in milliseconds"
 msgstr "Die Rundenzeit zum Server und zurück in Millisekunden"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917
 msgid "Dev"
 msgstr "Abweichung"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
 msgid "The standard deviation of the round trip time in milliseconds"
 msgstr "Standardabweichung der Rundenzeit (in Millisekunden)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
 msgid "The retransmit timeout in milliseconds"
 msgstr "Der Timeout beim erneuten Senden (in Millisekunden)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
 msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)"
 msgstr "Derzeit maximale Größe der gesendeten Pakete / geschätzte maximale Größe der empfangenen Pakete (Bytes)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
 msgid "TX"
 msgstr "Gesendet"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
 msgid "The total number of packets sent to the peer"
 msgstr "Gesamtanzahl der an den Teilnehmer gesendeten Pakete"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
 msgid "RX"
 msgstr "Empfangen"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
 msgid "The total number of packets received from the peer"
 msgstr "Gesamtanzahl der vom Teilnehmer empfangenen Pakete"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929
 msgid "Dup TX"
 msgstr "Mehrfach gesendet"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
 msgid "The total number of packets retransmitted to the peer"
 msgstr "Gesamtanzahl der an den Teilnehmer erneut gesendeten Pakete"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931
 msgid "Dup RX"
 msgstr "Mehrfach empfangen"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
 msgid "The total number of duplicate packets received from the peer"
 msgstr "Gesamtanzahl der vom Teilnehmer erneut empfangenen Pakete"
 
@@ -376,174 +384,175 @@ msgstr "Gesamtanzahl der vom Teilnehmer erneut empfangenen Pakete"
 msgid "Excessive clock skew: {0}"
 msgstr "Zu hohe Abweichung der Uhrzeit: {0}"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:730
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732
 msgid "NTCP connections"
 msgstr "NTCP-Verbindungen"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:731
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:733
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886
 msgid "Limit"
 msgstr "Obere Grenze"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1888
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:734
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
 msgid "Timeout"
 msgstr "Timeout"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:745
 msgid "Out Queue"
 msgstr "Ausgehende Warteschlange"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:746
 msgid "Backlogged?"
 msgstr "Rückstau"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1950
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
 msgid "Inbound"
 msgstr "ankommend"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1952
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:762
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
 msgid "Outbound"
 msgstr "abgehend"
 
 #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:807
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:809
 msgid "peers"
 msgstr "Teilnehmer"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885
 msgid "UDP connections"
 msgstr "UDP-Verbindungen"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892
 msgid "Sort by peer hash"
 msgstr "Nach Router Prüfsumme sortieren"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
 msgid "Direction/Introduction"
 msgstr "Richtung/Bekanntmachung"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1897
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
 msgid "Sort by idle inbound"
 msgstr "Sortieren nach untätigen eingehenden Verbindungen"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1899
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
 msgid "Sort by idle outbound"
 msgstr "Sortieren nach untätigen ausgehenden Verbindungen"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1902
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
 msgid "Sort by inbound rate"
 msgstr "Sortieren nach eingehender Transferrate"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1904
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903
 msgid "Sort by outbound rate"
 msgstr "Sortieren nach ausgehender Transferrate"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
 msgid "Sort by connection uptime"
 msgstr "Sortieren nach Lebensdauer der Verbindung"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1909
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
 msgid "Sort by clock skew"
 msgstr "Sortieren nach Zeitunterschied"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1912
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911
 msgid "Sort by congestion window"
 msgstr "Sortieren nach Größe des Pufferspeichers"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1914
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913
 msgid "Sort by slow start threshold"
 msgstr "Sortieren nach Grenzwert des verzögerten Startens"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916
 msgid "Sort by round trip time"
 msgstr "Sortieren nach Rundenzeit"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1919
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
 msgid "Sort by round trip time deviation"
 msgstr "Sortieren nach Abweichung der Rundenzeit"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920
 msgid "Sort by retransmission timeout"
 msgstr "Sortieren nach Timeout beim erneuten Senden"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923
 msgid "Sort by outbound maximum transmit unit"
 msgstr "Sortieren nach maximaler ausgehender Transferpaketgröße"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
 msgid "Sort by packets sent"
 msgstr "Sortieren nach Anzahl gesendeter Pakete"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1928
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
 msgid "Sort by packets received"
 msgstr "Sortieren nach Anzahl empfangener Pakete"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930
 msgid "Sort by packets retransmitted"
 msgstr "Sortieren nach Anzahl erneut gesendeter Pakete"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1933
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932
 msgid "Sort by packets received more than once"
 msgstr "Sortieren nach Anzahl mehrfach empfangener Pakete"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1954
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953
 msgid "We offered to introduce them"
 msgstr "Wir bieten an, diese bekannt zu machen"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1956
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955
 msgid "They offered to introduce us"
 msgstr "Diese boten an, uns bekannt zu machen"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1960
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959
 msgid "Choked"
 msgstr "gedrosselt"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1968
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967
 msgid "1 fail"
 msgstr "1 Fehler"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1970
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969
 #, java-format
 msgid "{0} fails"
 msgstr "{0} fehlgeschlagen"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1976
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162
 msgid "Banned"
 msgstr "Gesperrt"
 
 #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2107
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106
 msgid "SUMMARY"
 msgstr "ZUSAMMENFASSUNG"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:145
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124
 msgid "Dropping tunnel requests: Too slow"
 msgstr "Ignoriere Tunnelanfragen: zu langsam"
 
 #. don't even bother, since we are so overloaded locally
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:352
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267
 msgid "Dropping tunnel requests: Overloaded"
 msgstr "Ignoriere Tunnelanfragen: überlastet"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:525
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:470
 msgid "Rejecting tunnels: Request overload"
 msgstr "Weise Tunnelanfragen zurück: Überlast an Anfragen"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:550
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:495
 msgid "Rejecting tunnels: Connection limit"
 msgstr "Weise Tunnelanfragen zurück: Verbindungslimit erreicht"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:744
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:695
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:716
 msgid "Dropping tunnel requests: High load"
 msgstr "Ignoriere Tunnelanfragen: Hohe Last"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:753
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:708
 msgid "Dropping tunnel requests: Queue time"
 msgstr "Ignoriere Tunnelanfragen: zu lange Warteschlange"
 
@@ -1474,11 +1483,12 @@ msgstr "Sambia"
 msgid "Zimbabwe"
 msgstr "Simbabwe"
 
-#: ../java/src/net/i2p/router/web/CSSHelper.java:57
+#: ../java/src/net/i2p/router/web/CSSHelper.java:60
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37
 #: ../java/strings/Strings.java:29
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:233
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:125
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:257
 msgid "I2P Router Console"
 msgstr "I2P-Routerkonsole"
 
@@ -1497,28 +1507,27 @@ msgid "Error saving the configuration (applied but not saved) - please see the e
 msgstr "Fehler beim Speichern der Einstellungen (angewendet aber nicht gespeichert) - Bitte schau in die Fehlerberichte!"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:355
 msgid "Save Client Configuration"
 msgstr "Speichere Klienteneinstellungen"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:405
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427
 msgid "Save Interface Configuration"
-msgstr "Speichere Klient-Einstellungen"
+msgstr "Speichere Interface-Einstellungen"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:441
 msgid "Save WebApp Configuration"
 msgstr "Speichere WebApplikations-Einstellungen"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:453
 msgid "Save Plugin Configuration"
 msgstr "Speichere Einstellungen des Zusatzprogrammes"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461
 msgid "Install Plugin"
 msgstr "Zusatzprogramm installieren"
 
@@ -1544,13 +1553,14 @@ msgstr "Fehler beim Stoppen des Zusatzprogramms {0}"
 
 #. label (IE)
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:253
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255
 msgid "Start"
 msgstr "Starten"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33
 msgid "Unsupported"
 msgstr "Nicht unterstützt"
 
@@ -1570,7 +1580,7 @@ msgstr "Falscher Index für den Klienten"
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:392
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:384
 msgid "Client"
 msgstr "Klient"
@@ -1593,7 +1603,7 @@ msgid "Plugin configuration saved."
 msgstr "Einstellungen des Zusatzprogramms gespeichert."
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
 msgid "WebApp"
 msgstr "WebApplikation"
 
@@ -1643,17 +1653,16 @@ msgid "Error starting plugin {0}"
 msgstr "Fehler beim Starten des Zusatzprogramms {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376
-#, fuzzy
 msgid "Interface configuration saved successfully - restart required to take effect."
-msgstr "Klient-Einstellungen erfolgreich gespeichert - Neustart zum Ãœbernehmen erforderlich"
+msgstr "Interface-Einstellungen erfolgreich gespeichert - Neustart zum Ãœbernehmen erforderlich"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:256
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258
 msgid "Edit"
 msgstr "Bearbeiten"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351
 msgid "Add Client"
 msgstr "Klienten hinzufügen"
 
@@ -1662,90 +1671,88 @@ msgid "Class and arguments"
 msgstr "Klasse und Argumente"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Control"
 msgstr "Kontrolle"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Run at Startup?"
 msgstr "Beim Starten des Systems mitstarten?"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:195
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197
 msgid "Description"
 msgstr "Beschreibung"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Plugin"
 msgstr "Zusatzprogramm"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:159
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185
 msgid "Version"
 msgstr "Version"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163
 msgid "Signed by"
 msgstr "unterschrieben von"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:178
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180
 msgid "Date"
 msgstr "Datum"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:184
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186
 msgid "Author"
 msgstr "Autor"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:200
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202
 msgid "License"
 msgstr "Lizenz"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:205
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207
 msgid "Website"
 msgstr "Webseite"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:210
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212
 msgid "Update link"
 msgstr "Adresse des Updates"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260
 msgid "Stop"
 msgstr "Stopp"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331
 msgid "Check for updates"
 msgstr "Auf Aktualisierungen prüfen"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:261
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:242
 msgid "Update"
 msgstr "Aktualisierung"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:266
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268
 #, java-format
 msgid "Are you sure you want to delete {0}?"
 msgstr "Sind Sie sicher, dass Sie {0} löschen wollen?"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270
 msgid "Delete"
 msgstr "löschen"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:343
 msgid "Add key"
 msgstr "Schlüssel hinzufügen"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:341
 msgid "Delete key"
 msgstr "Schlüssel löschen"
 
@@ -1842,7 +1849,7 @@ msgstr "Service"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381
 #: ../java/strings/Strings.java:72
 msgid "Tunnels"
 msgstr "Tunnel"
@@ -1856,7 +1863,7 @@ msgid "Clients"
 msgstr "Klienten"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:293
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315
 msgid "Keyring"
 msgstr "Schlüsselbund"
 
@@ -1866,13 +1873,13 @@ msgstr "Statusmitschnitt"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255
 #: ../java/strings/Strings.java:67
 msgid "Peers"
 msgstr "Teilnehmer"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:389
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143
 msgid "Stats"
 msgstr "Statistiken"
@@ -1883,13 +1890,15 @@ msgstr "Erweitert"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:360
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:341
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:377
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:397
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:362
 msgid "Save changes"
 msgstr "Änderungen speichern"
 
@@ -1993,7 +2002,7 @@ msgid "or {0} bytes per month maximum"
 msgstr "oder maximal {0} Bytes im Monat"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:333
 msgid "Ban peer until restart"
 msgstr "Den Teilnehmer bis zum Neustart sperren"
 
@@ -2013,7 +2022,7 @@ msgid "Invalid peer"
 msgstr "ungültiger Teilnehmer"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335
 msgid "Unban peer"
 msgstr "Sperrung des Teilnehmers aufheben"
 
@@ -2026,7 +2035,7 @@ msgid "is not currently banned"
 msgstr "ist zur Zeit nicht gesperrt"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:361
 msgid "Adjust peer bonuses"
 msgstr "Teilnehmer-Boni anpassen"
 
@@ -2038,10 +2047,28 @@ msgstr "ungültige Geschwindigkeitsangabe"
 msgid "Bad capacity value"
 msgstr "ungültiger Wert für die Kapazität"
 
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:368
+msgid "Save changes and reseed now"
+msgstr "Änderungen speichern und Reseed beginnen"
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21
+msgid "Reseeding is already in progress"
+msgstr "Reseed läuft bereits"
+
+#. skip the nonce checking in ReseedHandler
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24
+msgid "Starting reseed process"
+msgstr "Beginne den Reseed"
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66
+msgid "Configuration saved successfully."
+msgstr "Einstellungen erfolgreich gespeichert"
+
 #. Normal browsers send value, IE sends button label
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:293
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:311
 msgid "Shutdown immediately"
 msgstr "Beende I2P sofort"
 
@@ -2088,7 +2115,7 @@ msgid "Restart in {0}"
 msgstr "Neustart in {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309
 msgid "Shutdown gracefully"
 msgstr "Kontrolliert ausschalten"
 
@@ -2101,7 +2128,7 @@ msgid "Shutdown immediately!  boom bye bye bad bwoy"
 msgstr "Unverzüglich ausschalten! - Und tschüss!"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:313
 msgid "Cancel graceful shutdown"
 msgstr "Kontrolliertes Ausschalten abbrechen"
 
@@ -2110,7 +2137,7 @@ msgid "Graceful shutdown cancelled"
 msgstr "Kontrolliertes Ausschalten abgebrochen"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325
 msgid "Graceful restart"
 msgstr "Kontrollierter Neustart"
 
@@ -2119,7 +2146,7 @@ msgid "Graceful restart requested"
 msgstr "Kontrollierter Neustart angefordert"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327
 msgid "Hard restart"
 msgstr "Harter Neustart"
 
@@ -2144,79 +2171,51 @@ msgid "Rekeying after graceful shutdown"
 msgstr "Neue RouterID nach sanftem Herunterfahren"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353
 msgid "Run I2P on startup"
 msgstr "Starte I2P beim Systemstart"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355
 msgid "Don't run I2P on startup"
 msgstr "Starte I2P nicht beim Systemstart"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:373
 msgid "Dump threads"
 msgstr "Threadliste ausgeben"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323
-msgid "Show systray icon"
-msgstr "Systemtray-Icon anzeigen"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
-msgid "System tray icon enabled."
-msgstr "Systemtray-Icon aktiviert"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110
-msgid "System tray icon feature not supported on this platform. Sorry!"
-msgstr "Systemtry-Icon wird auf diesem System leider nicht unterstützt."
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
-msgid "Warning: unable to contact the systray manager"
-msgstr "Warnung: kann den Systemtray-Manager nicht erreichen"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325
-msgid "Hide systray icon"
-msgstr "Systemtray-Icon deaktivieren"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108
-msgid "System tray icon disabled."
-msgstr "Systemtry-Icon deaktiviert"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:381
 msgid "View console on startup"
 msgstr "Zeige die Konsole nach dem Starten"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93
 msgid "Console is to be shown on startup"
 msgstr "Konsole wird nach dem Starten angezeigt"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:383
 msgid "Do not view console on startup"
 msgstr "Zeige Konsole beim Starten nicht"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
 msgid "Console is not to be shown on startup"
 msgstr "Konsole wird beim Starten nicht gezeigt"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105
 msgid "Service installed"
 msgstr "Service wurde installiert"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107
 msgid "Warning: unable to install the service"
 msgstr "Warnung: Service konnte nicht installiert werden"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
 msgid "Service removed"
 msgstr "Service wurde entfernt"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
 msgid "Warning: unable to remove the service"
 msgstr "Warnung: Service konnte nicht entfernt werden"
 
@@ -2264,58 +2263,58 @@ msgid_plural "{0} tunnels"
 msgstr[0] "1 Tunnel"
 msgstr[1] "{0} Tunnel"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
 msgid "Exploratory tunnels"
 msgstr "Erkundungstunnel"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61
-msgid "Client tunnels for"
-msgstr "Kliententunnel für"
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:51
+#, java-format
+msgid "Client tunnels for {0}"
+msgstr "Kliententunnel für {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
 msgid "ANONYMITY WARNING - Settings include 0-hop tunnels."
 msgstr "ANONYMITÄTSWARNUNG - Einstellungen beinhalten Tunnel ohne Zwischenstationen"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:79
 msgid "ANONYMITY WARNING - Settings include 1-hop tunnels."
 msgstr "ANONYMITÄTSWARNUNG - Einstellungen beinhalten Tunnel mit nur einer Zwischenstation"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
 msgid "PERFORMANCE WARNING - Settings include very long tunnels."
 msgstr "LEISTUNGSWARNUNG - Einstellungen beinhalten sehr lange Tunnel"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:85
 msgid "PERFORMANCE WARNING - Settings include high tunnel quantities."
 msgstr "LEISTUNGSWARNUNG - Einstellungen beinhalten sehr viele Tunnel"
 
 #. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n");
 #. tunnel depth
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:92
 msgid "Length"
 msgstr "Länge"
 
 #. tunnel depth variance
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:109
 msgid "Randomization"
 msgstr "Zufallskomponente"
 
 #. tunnel quantity
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:133
 msgid "Quantity"
 msgstr "Anzahl"
 
 #. tunnel backup quantity
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:150
 msgid "Backup quantity"
 msgstr "Anzahl der Ersatztunnel"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:172
 msgid "Inbound options"
 msgstr "Optionen für eingehende Tunnel"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:185
 msgid "Outbound options"
 msgstr "Optionen für ausgehende Tunnel"
 
@@ -2328,38 +2327,42 @@ msgid "Refresh the page to view."
 msgstr "Laden Sie die Seite neu, damit die Änderungen sichtbar werden!"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+msgid "Arabic"
+msgstr "Arabisch"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "English"
 msgstr "Englisch"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "French"
 msgstr "Französisch"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "German"
 msgstr "Deutsch"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "Spanish"
 msgstr "Spanisch"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Dutch"
 msgstr "Niederländisch"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Portuguese"
 msgstr "Portugiesisch"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Russian"
 msgstr "Russisch"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
 msgid "Chinese"
 msgstr "Chinesisch"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
 msgid "Swedish"
 msgstr "Schwedisch"
 
@@ -2428,7 +2431,7 @@ msgstr "Nur herunterladen und überprüfen"
 msgid "Download, verify, and restart"
 msgstr "Herunterladen, überprüfen und neustarten"
 
-#: ../java/src/net/i2p/router/web/FormHandler.java:174
+#: ../java/src/net/i2p/router/web/FormHandler.java:176
 msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."
 msgstr "Ungültige Übertragung der eingegebenen Daten, möglicherweise da Sie den 'Zurück'- oder 'Neu Laden'-Knopf in Ihrem Browser gedrückt haben. Bitte erneut senden."
 
@@ -2459,8 +2462,8 @@ msgid "Plot averages"
 msgstr "Zeichne Mittelwerte"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:152
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:351
 msgid "or"
 msgstr "oder"
 
@@ -2596,96 +2599,96 @@ msgstr "Zeige alle Router"
 msgid "Show all routers with full stats"
 msgstr "Zeige alle Router mit vollständigen Statistiken"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266
 msgid "Network Database Router Statistics"
 msgstr "Netzwerkdatenbank Routerstatistiken"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
 msgid "Count"
 msgstr "Anzahl"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
 msgid "Transports"
 msgstr "Transporte"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
 msgid "Country"
 msgstr "Land"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
 msgid "Our info"
 msgstr "Informationen über uns"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346
 msgid "Peer info for"
 msgstr "Informationen über den Teilnehmer"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350
 msgid "Full entry"
 msgstr "Ganzer Eintrag"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:115
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
 msgid "Hidden"
 msgstr "Versteckt"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
 msgid "Updated"
 msgstr "Aktualisiert"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:355
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360
 #, java-format
 msgid "{0} ago"
 msgstr "vor {0}"
 
 #. shouldnt happen
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
 msgid "Published"
 msgstr "Veröffentlicht"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365
 msgid "Address(es)"
 msgstr "Adresse(n)"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378
 msgid "cost"
 msgstr "Kosten"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "Hidden or starting up"
 msgstr "Versteckt oder Startphase"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "SSU"
 msgstr "SSU"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "SSU with introducers"
 msgstr "SSU mit Hilfsrouter"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP"
 msgstr "NTCP"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP and SSU"
 msgstr "NTCP und SSU"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP and SSU with introducers"
 msgstr "NTCP und SSU mit Hilfsrouter"
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:93
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:92
 #, java-format
 msgid "News last updated {0} ago."
 msgstr "Zeit seit letzter Aktualisierung der Nachrichten: {0};"
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:99
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:98
 #, java-format
 msgid "News last checked {0} ago."
 msgstr "Zeit seit letzter Prüfung auf neue Nachrichten: {0}"
@@ -2703,7 +2706,7 @@ msgstr "Auf Aktualisierungen des Zusatzprogramms {0} prüfen"
 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:154
 #, java-format
 msgid "New plugin version {0} is available"
-msgstr "Neue Version des Zusatzprogramms {0} ist verfügbar"
+msgstr "Neue Version des Zusatzprogramms ist verfügbar ({0})"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:156
 #, java-format
@@ -2720,132 +2723,132 @@ msgid "Downloading plugin"
 msgstr "Lade Zusatzprogramm herunter"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:244
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:245
 #, java-format
 msgid "{0}B transferred"
 msgstr "{0}Bytes übertragen"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:152
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153
 msgid "Plugin downloaded"
 msgstr "Zusatzprogramm heruntergeladen"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:157
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:344
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356
 #, java-format
 msgid "Cannot create plugin directory {0}"
 msgstr "Kann kein Verzeichnis für das Zusatzprogramm {0} anlegen"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:166
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:298
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:299
 #, java-format
 msgid "from {0}"
 msgstr "von {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:176
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177
 #, java-format
 msgid "Plugin from {0} is corrupt"
 msgstr "Zusatzprogramm von {0} ist beschädigt."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:187
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188
 #, java-format
 msgid "Plugin from {0} does not contain the required configuration file"
 msgstr "Zusatzprogramm von {0} enthält nicht die benötigte Konfigurationsdatei"
 
 #. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:200
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201
 #, java-format
 msgid "Plugin from {0} contains an invalid key"
 msgstr "Zusatzprogramm von {0} enthält einen ungültigen Schlüssel"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:219
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:228
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:237
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249
 #, java-format
 msgid "Plugin signature verification of {0} failed"
 msgstr "Überprüfung der Signatur des Zusatzprogramms {0} ist fehlgeschlagen"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:252
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264
 #, java-format
 msgid "Plugin from {0} has invalid name or version"
 msgstr "Zusatzprogramm von {0} hat einen ungültigen Namen oder Version"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:257
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269
 #, java-format
 msgid "Plugin {0} has mismatched versions"
 msgstr "Zusatzprogramm {0} hat keine passende Version"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:265
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277
 #, java-format
 msgid "This plugin requires I2P version {0} or higher"
 msgstr "Dieses Zusatzprogramm benötigt I2P-Version {0} oder höher"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:273
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285
 #, java-format
 msgid "This plugin requires Java version {0} or higher"
 msgstr "Dieses Zusatzprogramm benötigt Java-Version {0} oder neuer"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:281
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
 msgid "Downloaded plugin is for new installs only, but the plugin is already installed"
 msgstr "Heruntergeladenes Zusatzprogramm lässt sich nur neu installieren, jedoch ist es ist bereits installiert."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305
 msgid "Installed plugin does not contain the required configuration file"
 msgstr "Das installierte Zusatzprogramm enthält nicht die benötigte Konfigurationsdatei"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:301
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313
 msgid "Signature of downloaded plugin does not match installed plugin"
 msgstr "Die Signatur des heruntergeladenen Zusatzprogramms stimmt nicht mit dem installierten Zusatzprogramm überein."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:308
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320
 #, java-format
 msgid "Downloaded plugin version {0} is not newer than installed plugin"
 msgstr "Version {0} des heruntergeladenen Zusatzprogramms ist nicht neuer als die installierte Version"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:315
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or higher"
 msgstr "Aktualisierung des Zusatzprogramms benötigt Version {0} oder höher des Zusatzprogramms"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:322
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or lower"
 msgstr "Aktualisierung des Zusatzprogramms benötigt installierte Version {0} oder älter des Zusatzprogramms"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:339
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351
 msgid "Plugin is for upgrades only, but the plugin is not installed"
 msgstr "Dieses Zusatzprogramm ist nur für Aktualisierungen, aber das Zusatzprogramm ist noch nicht installiert"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:352
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364
 #, java-format
 msgid "Failed to install plugin in {0}"
 msgstr "Installation des Zusatzprogramms in {0} ist fehlgeschlagen"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:359
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371
 #, java-format
 msgid "Plugin {0} installed, router restart required"
 msgstr "Zusatzprogramm {0} installiert, Neustart des Routers erforderlich"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:361
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373
 #, java-format
 msgid "Plugin {0} installed"
 msgstr "Zusatzprogramm {0} wurde installiert"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:379
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391
 #, java-format
 msgid "Plugin {0} installed and started"
 msgstr "Zusatzprogramm {0} installiert und gestartet"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:382
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394
 #, java-format
 msgid "Plugin {0} installed but failed to start, check logs"
 msgstr "Zusatzprogramm {0} wurde installiert konnte jedoch nicht gestartet werden. Überprüfen Sie die Berichte!"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:384
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396
 #, java-format
 msgid "Plugin {0} installed but failed to start"
 msgstr "Zusatzprogramm {0} ist installiert, startet jedoch nicht"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406
 #, java-format
 msgid "Failed to download plugin from {0}"
 msgstr "Konnte Zusatzprogramm von {0} nicht herunterladen"
@@ -2856,37 +2859,43 @@ msgstr "Teilnehmerprofile"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73
 #, java-format
-msgid "Showing {0} recent profiles."
-msgstr "Zeige {0} aktuelle Profile."
+msgid "Showing 1 recent profile."
+msgid_plural "Showing {0} recent profiles."
+msgstr[0] "Zeige ein aktuelles Profil an."
+msgstr[1] "Zeige {0} aktuelle Profile."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75
 #, java-format
-msgid "Hiding {0} older profiles."
-msgstr "Zeige {0} alte Profile nicht an."
+msgid "Hiding 1 older profile."
+msgid_plural "Hiding {0} older profiles."
+msgstr[0] "Zeige ein altes Profil nicht an."
+msgstr[1] "Zeige {0} alte Profile nicht an."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77
 #, java-format
-msgid "Hiding {0} standard profiles."
-msgstr "Zeige {0} Standardprofile nicht an."
+msgid "Hiding 1 standard profile."
+msgid_plural "Hiding {0} standard profiles."
+msgstr[0] "Zeige ein Standardprofil nicht an."
+msgstr[1] "Zeige {0} Standardprofile nicht an."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82
 msgid "Groups (Caps)"
 msgstr "Gruppen (Kategorien)"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:353
 msgid "Speed"
 msgstr "Geschwindigkeit"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:339
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:357
 msgid "Capacity"
 msgstr "Kapazität"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
 msgid "Integration"
 msgstr "Integration"
 
@@ -2912,7 +2921,7 @@ msgid "Failing"
 msgstr "fehlgeschlagen"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282
 msgid "Integrated"
 msgstr "integriert"
 
@@ -2925,151 +2934,156 @@ msgstr "Unerreichbar"
 msgid "Test Fails"
 msgstr "Test fehlgeschlagen"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177
 msgid "profile"
 msgstr "Profil"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186
 msgid "Floodfill and Integrated Peers"
 msgstr "Floodfill und integrierte Teilnhemer"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
 msgid "Caps"
 msgstr "Kategorien"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
 msgid "Integ. Value"
 msgstr "Integrationswert"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
 msgid "Last Heard About"
 msgstr "Zuletzt etwas über ihn gehört"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
 msgid "Last Heard From"
 msgstr "Letzte Nachricht empfangen"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
 msgid "Last Good Send"
 msgstr "Letzte geglückte Sendung"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
 msgid "Last Bad Send"
 msgstr "Letzte fehlgeschlagene Sendung"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
 msgid "10m Resp. Time"
 msgstr "10 Min. Antwortzeit"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
 msgid "1h Resp. Time"
 msgstr "1 Std. Antwortzeit"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
 msgid "1d Resp. Time"
 msgstr "1 Tag Antwortzeit"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
 msgid "Last Good Lookup"
 msgstr "Letzte erfolgreiche Suche"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
 msgid "Last Bad Lookup"
 msgstr "Letzte fehlgeschlagene Suche"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
 msgid "Last Good Store"
 msgstr "Letztes erfolgreiches Speichern"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
 msgid "Last Bad Store"
 msgstr "Letztes fehlgeschlagene Speichern"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203
 msgid "1h Fail Rate"
 msgstr "stündl. Fehlerrate"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204
 msgid "1d Fail Rate"
 msgstr "tägl. Fehlerrate"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
 msgid "Thresholds"
 msgstr "Grenzwerte"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
 msgid "fast peers"
 msgstr "schnelle Teilnehmer"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
 msgid "high capacity peers"
 msgstr "Teilnehmer hoher Kapazität"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
 msgid " well integrated peers"
 msgstr "gut integrierte Teilnehmer"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
 msgid "as determined by the profile organizer"
 msgstr "wie vom Profilorganisator ermittelt"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
 msgid "groups"
 msgstr "Gruppen"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
 msgid "capabilities in the netDb, not used to determine profiles"
 msgstr "Werte in der Netzwerkdatenbank, nicht zum Ermitteln der Profile verwendet"
 
 #. capabilities
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
 #: ../java/strings/Strings.java:81
 msgid "caps"
 msgstr "Kategorien"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
 msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel"
 msgstr "maximaler Durchsatz (Bytes je Tunnel) innerhalb einer Minute, den ein Teilnehmer in einem einzelnen Tunnel erreicht hat"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
 msgid "speed"
 msgstr "Geschwindigkeit"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
 msgid "capacity"
 msgstr "Kapazität"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
 msgid "how many tunnels can we ask them to join in an hour?"
 msgstr "Wie viele Tunnel können wir bei diesem Teilnehmer innerhalb einer Stunde bekommen?"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
 msgid "how many new peers have they told us about lately?"
 msgstr "Wie viele neue Kontakte hat dieser Teilnehmer uns kürzlich mitgeteilt?"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
 msgid "integration"
 msgstr "Integration"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
 msgid "is the peer banned, or unreachable, or failing tunnel tests?"
 msgstr "Ist der Teilnehmer gesperrt, unerreichbar, oder schlagen die Tunneltests fehl?"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
 msgid "status"
 msgstr "Status"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:410
+msgid "none"
+msgstr "keine"
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:62
 #, java-format
 msgid "Temporary ban expiring in {0}"
 msgstr "vorübergehende Sperrung endet in {0}"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64
 #, java-format
 msgid "Banned until restart or in {0}"
 msgstr "Gesperrt bis zum Neustart oder in {0}"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:76
 msgid "unban now"
 msgstr "Bann aufheben"
 
@@ -3124,20 +3138,20 @@ msgstr "Die Daten werden über jeweils 1 Minute erhoben und repräsentieren dahe
 msgid "These statistics are primarily used for development and debugging."
 msgstr "Diese Statistiken dienen vorrangig der Entwicklung und Fehlerbeseitigung."
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:105
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:156
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:106
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:157
 msgid "No lifetime events"
 msgstr "Bisher keine Ereignisse"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:116
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:117
 msgid "frequency"
 msgstr "Häufigkeit"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:120
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:121
 msgid "Rolling average events per period"
 msgstr "Fortschreitender Durchschnittshäufigkeit von Ereignissen je Zeitintervall"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:124
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:125
 msgid "Highest events per period"
 msgstr "höchste Anzahl an Ereignissen je Zeitintervall"
 
@@ -3148,58 +3162,73 @@ msgstr "höchste Anzahl an Ereignissen je Zeitintervall"
 #. }
 #. 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
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:136
 msgid "Lifetime average events per period"
 msgstr "Anzahl an Ereignissen je Zeitintervall über die Lebenszeit gemittelt"
 
 #. Display the strict average
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:140
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:141
 msgid "Lifetime average frequency"
 msgstr "durchschnittliche Häufigkeit über Lebenszeit"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:168
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:144
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:234
+#, java-format
+msgid "1 event"
+msgid_plural "{0} events"
+msgstr[0] "ein Ereignis"
+msgstr[1] "{0} Ereignisse"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:169
 msgid "rate"
 msgstr "Rate"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:170
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:171
 msgid "Average"
 msgstr "Mittelwert"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:173
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:174
 msgid "Highest average"
 msgstr "höchster Durchscnittslwert"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:202
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:201
+#, java-format
+msgid "There was 1 event in this period."
+msgid_plural "There were {0} events in this period."
+msgstr[0] "Es gab ein Vorkommnis in dieser Zeitspanne"
+msgstr[1] "Es gab {0} Vorkommnisse in dieser Zeitspanne."
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:203
 #, java-format
-msgid "in this period which ended {0} ago."
-msgstr "innerhalb dieser Periode, welche vor {0} endete."
+msgid "The period ended {0} ago."
+msgstr "Die Zeitspanne endete vor {0}."
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:204
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:205
 msgid "No events"
 msgstr "keine Ereignisse"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:210
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:211
 msgid "Average event count"
 msgstr "druchschnittliche Anzahl an Ereignissen"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:212
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:213
 msgid "Events in peak period"
 msgstr "Ereignisse im Spitzen-Zeitintervall"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:220
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:221
 msgid "Graph Data"
 msgstr "Daten graphisch darstellen"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:222
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:223
 msgid "Graph Event Count"
 msgstr "Ereignisse graphisch darstellen"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:225
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:226
 msgid "Export Data as XML"
 msgstr "Daten als XML exportieren"
 
 #. Display the strict average
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:230
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:231
 msgid "Lifetime average value"
 msgstr "Durchschnitt über Lebenszeit"
 
@@ -3260,12 +3289,12 @@ msgid "I2P Internals"
 msgstr "Einstellungen"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379
 msgid "View existing tunnels and tunnel build status"
 msgstr "Betrachte die existierenden Tunnel und den Status des Tunnelaufbaus"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253
 msgid "Show all current peer connections"
 msgstr "Zeige alle bestehenden Verbindungen zu Teilnehmern"
 
@@ -3351,93 +3380,97 @@ msgstr "Laufzeit"
 msgid "Help with configuring your firewall and router for optimal I2P performance"
 msgstr "Hilfe bei der Konfiguration Ihrer Firewall und Ihres Routers für eine optimale Leistung."
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231
-msgid "Download"
-msgstr "Herunterladen"
+#. Note to translators: parameter is a version, e.g. "0.8.4"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:232
+#, java-format
+msgid "Download {0} Update"
+msgstr "Aktualisierung herunterladen ({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>
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240
-msgid "Download Unsigned"
-msgstr "unsignierte Aktualisierung herunterladen"
+#, java-format
+msgid "Download Unsigned<br>Update {0}"
+msgstr "unsignierte Aktualisierung herunterladen: {0}"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261
 msgid "Active"
 msgstr "aktiv"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270
 msgid "Fast"
 msgstr "schnell"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276
 msgid "High capacity"
 msgstr "hohe Kapazität"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288
 msgid "Known"
 msgstr "bekannt"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:308
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303
 msgid "Help with firewall configuration"
 msgstr "Hilfe bei der Firewalleinstellung"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:310
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:305
 msgid "Check NAT/firewall"
 msgstr "Überprüfe NAT/Firewall!"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:330
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:325
 msgid "Reseed"
 msgstr "Hole neue Teilnehmerinformationen"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:347
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:342
 msgid "Configure router bandwidth allocation"
 msgstr "Konfigurieren der Bandbreitenzuweisung des Routers"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:344
 msgid "Bandwidth in/out"
 msgstr "Bandbreite ein-/ausgehend"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:369
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:364
 msgid "Total"
 msgstr "gesamt"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:371
 msgid "Used"
 msgstr "genutzt"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:391
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386
 msgid "Exploratory"
 msgstr "Erkundung"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398
 msgid "Participating"
 msgstr "teilnehmend an"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:409
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404
 msgid "Share ratio"
-msgstr ""
-"Verhältnis \n"
-" fremder/eigenen Hops"
+msgstr "Kooperationsfaktor"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:410
 msgid "What's in the router's job queue?"
 msgstr "Was ist in der Aufgabenliste des Routers?"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412
 msgid "Congestion"
 msgstr "Aufgaben"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417
 msgid "Job lag"
 msgstr "Aufgabenverzug"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:428
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:423
 msgid "Message delay"
 msgstr "Nachrichtenverzug"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:434
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:429
 msgid "Tunnel lag"
 msgstr "Tunnelverzug"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435
 msgid "Backlog"
 msgstr "Anfragenrückstau"
 
@@ -3451,7 +3484,7 @@ msgid "ERR-Clock Skew of {0}"
 msgstr "FEHLER: Uhrzeitdifferenz von {0}"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:122
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
 msgid "OK"
 msgstr "OK"
 
@@ -3476,7 +3509,7 @@ msgid "WARN-Firewalled and Fast"
 msgstr "WARNUNG: Firewall aktiv und Schnell"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:133
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
 msgid "Firewalled"
 msgstr "Firewall aktiv"
 
@@ -3497,7 +3530,7 @@ msgid "WARN-Firewalled with UDP Disabled"
 msgstr "WARNUNG: Firewall aktiv und UDP deaktiviert"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:148
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
 msgid "Testing"
 msgstr "Teste"
 
@@ -3541,10 +3574,6 @@ msgstr "Baue auf"
 msgid "Building tunnels"
 msgstr "Baue Tunnel auf"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:410
-msgid "none"
-msgstr "keine"
-
 #. tunnel nicknames, taken from i2ptunnel.config so they will display
 #. nicely under 'local destinations' in the summary bar
 #. note that if the wording changes in i2ptunnel.config, we have to
@@ -3579,10 +3608,14 @@ msgstr "Jetzt"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:63
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:287
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:309
 msgid "configure"
 msgstr "ändern"
 
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61
+msgid "Client tunnels for"
+msgstr "Kliententunnel für"
+
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:65
 msgid "dead"
 msgstr "tot"
@@ -3707,70 +3740,70 @@ msgstr "Fremde Tunnel"
 msgid "Totals"
 msgstr "Gesamt"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:142
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:237
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:143
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:238
 msgid "Updating"
 msgstr "Aktualisiere"
 
 #. Process the .sud/.su2 file
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:261
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:286
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:117
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:262
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:287
 msgid "Update downloaded"
 msgstr "Aktualisierung heruntergeladen"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:91
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:92
 #, java-format
 msgid "Unsigned update file from {0} is corrupt"
 msgstr "Unsignierte Aktualisierungsdatei von {0} ist fehlerhaft"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:281
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:282
 msgid "Restarting"
 msgstr "Starte neu"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:288
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:119
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:289
 msgid "Click Restart to install"
 msgstr "Klicken Sie auf Neustart zum Installieren der"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:290
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:291
 msgid "Click Shutdown and restart to install"
 msgstr "Klicken Sie zum Installieren auf Herunterfahren und Neustarten"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:292
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:122
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:293
 #, java-format
 msgid "Version {0}"
 msgstr "Version {0}"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:126
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:127
 #, java-format
 msgid "Failed copy to {0}"
 msgstr "Kopieren nach {0} fehlgeschlagen"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:184
-#, fuzzy, java-format
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:185
+#, java-format
 msgid "Updating from {0}"
-msgstr "Aktualisiere UDP-Port von"
+msgstr "Aktualisiere von {0}"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:253
-#, fuzzy, java-format
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:254
+#, java-format
 msgid "No new version found at {0}"
-msgstr "Keine neue Version des Zusatzprogrammes {0} verfügbar"
+msgstr "Keine neue Version unter {0} gefunden"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:281
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:282
 msgid "Update verified"
 msgstr "Aktualisierung verifiziert"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:307
-#, fuzzy, java-format
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:308
+#, java-format
 msgid "Transfer failed from {0}"
-msgstr "Ãœbertragung fehlgeschlagen"
+msgstr "Ãœbertragung von {0} fehlgeschlagen"
 
 #. wars for ConfigClientsHelper
 #: ../java/strings/Strings.java:12
@@ -4019,1297 +4052,1471 @@ msgstr "ausgehende Low-Level Ãœbertragungsrate"
 msgid "How many peers we are actively talking with"
 msgstr "Anzahl aktiver Teilnehmer mit denen wir reden"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:112
 msgid "config networking"
 msgstr "Netzwerkeinstellungen"
 
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:222
+msgid "Summary Bar"
+msgstr "Schnellübersicht"
+
 #. 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:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:230
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:227
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:222
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:235
 msgid "Refresh (s)"
 msgstr "Auffrischen {s}"
 
 #. ditto
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:226
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:237
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:239
 msgid "Enable"
 msgstr "Aktiviere"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:262
 msgid "I2P Network Configuration"
 msgstr "I2P-Netzwerkeinstellungen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:298
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:316
 msgid "Bandwidth limiter"
 msgstr "Bandbreitenbegrenzer"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:300
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318
 msgid "I2P will work best if you configure your rates to match the speed of your internet connection."
 msgstr ""
 "I2P funktioniert am besten, wenn Sie die Werte so konfigurieren, \n"
 "dass die Geschwindigkeit zu Ihrer Internetverbindung passt."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:322
 msgid "KBps In"
 msgstr "kByte/s eingehend"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336
 msgid "KBps Out"
 msgstr "kByte/s ausgehend"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:352
 msgid "Share"
 msgstr "für andere zur Benutzung freigegeben"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:341
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:326
 msgid "NOTE"
 msgstr "HINWEIS"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361
 #, java-format
 msgid "You have configured I2P to share only {0} KBps."
 msgstr "Sie haben I2P angewiesen, nur {0} kbit/s mit anderen zu teilen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:364
 msgid "I2P requires at least 12KBps to enable sharing. "
 msgstr "I2P benötigt mindestens 12 kbit/s, um das Durchleiten zu ermöglichen. "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365
 msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. "
 msgstr ""
 "Bitte aktivieren Sie die gemeinsame Nutzung (Teilnahme an Tunneln),\n"
 "indem Sie mehr Bandbreite freigeben. "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:366
 msgid "It improves your anonymity by creating cover traffic, and helps the network."
 msgstr ""
 "Es verbessert Ihre Anonymität durch Herstellen von s.&nbsp;g. Rauschen und \n"
 "es hilft zudem dem Netzwerk."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369
 #, java-format
 msgid "You have configured I2P to share {0} KBps."
-msgstr "Sie haben I2P konfiguriert, {0} kbit/s durchzuleiten. "
+msgstr "Sie haben I2P konfiguriert, {0} kBytes/s durchzuleiten. "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:354
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:372
 msgid "The higher the share bandwidth the more you improve your anonymity and help the network."
 msgstr ""
 "Je höher der Anteil an geteilter Bandbreite ist, desto mehr verbessert sich \n"
 "Ihre Anonymität, und darüber hinaus hilft es dem Netz. "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:358
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:403
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:342
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:322
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:425
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:383
 msgid "Cancel"
 msgstr "Abbruch"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:393
 msgid "IP and Transport Configuration"
 msgstr "IP- und Transport-Einstellungen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324
 msgid "The default settings will work for most people."
 msgstr "Die Standardeinstellungen funktionieren für die meisten Anwender."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397
 msgid "There is help below."
 msgstr "Weiter unten finden Sie eine Hilfe."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
 msgid "UPnP Configuration"
 msgstr "UPnP-Einstellungen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403
 msgid "Enable UPnP to open firewall ports"
 msgstr "Aktiviere UPnP, um Ports in der Firewall freizuschalten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405
 msgid "UPnP status"
 msgstr "UPnP-Status"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407
 msgid "IP Configuration"
 msgstr "IP-Einstellungen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
 msgid "Externally reachable hostname or IP address"
 msgstr "Extern erreichbarer Hostname oder IP-Adresse"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413
 msgid "Use all auto-detect methods"
 msgstr "Alle automatisch erkannten Modi benutzen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
 msgid "Disable UPnP IP address detection"
 msgstr "UPnP IP-Adresserkennung deaktivieren"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421
 msgid "Ignore local interface IP address"
 msgstr "IP-Adresse der lokalen Schnittstelle ignorieren"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425
 msgid "Use SSU IP address detection only"
 msgstr "Nur die SSU-Adresserkennung benutzen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497
 msgid "Specify hostname or IP"
 msgstr "Hostnamen oder IP angeben"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
 msgid "Select Interface"
 msgstr "Schnittstelle auswählen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449
 msgid "Hidden mode - do not publish IP"
 msgstr "Versteckter Modus - veröffentlicht die IP-Adresse nicht"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:433
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451
 msgid "(prevents participating traffic)"
 msgstr "(verhindert die Teilnahme an fremden Tunneln)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453
 msgid "Action when IP changes"
 msgstr "Aktion wenn sich die IP-Adresse ändert"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457
 msgid "Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity"
 msgstr "Laptop Modus - ändert zur Erhöhung der Anonymität Ihre Router-Identifikation und den UDP-Port, wenn sich Ihre IP ändert"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:441
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
 msgid "Experimental"
 msgstr "experimentell"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
 msgid "UDP Configuration:"
 msgstr "UDP-Einstellungen:"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:445
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463
 msgid "UDP port:"
 msgstr "UDP-Port:"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477
 msgid "TCP Configuration"
 msgstr "TCP-Einstellungen:"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:465
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:483
 msgid "Use auto-detected IP address"
 msgstr "Automatisch erkannte IP-Adresse benutzen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:467
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517
 msgid "currently"
 msgstr "derzeit"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:471
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489
 msgid "if we are not firewalled"
 msgstr "wenn keine Firewall aktiv ist"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:475
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493
 msgid "Always use auto-detected IP address (Not firewalled)"
 msgstr "Immer die automatisch erkannte IP-Adresse benutzen (bei inaktiver Firewall)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:503
 msgid "Disable inbound (Firewalled)"
 msgstr "Deaktiviere eingehende Verbindungen (Firewall ist aktiv)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:507
 msgid "Completely disable"
 msgstr "Komplett deaktivieren"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:491
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509
 msgid "(select only if behind a firewall that throttles or blocks outbound TCP)"
 msgstr ""
 "(nur auswählen, wenn dieser Router hinter einer Firewall ist, die ausgehenden \n"
 "TCP-Verkehr blokiertt oder begrenzt)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511
 msgid "Externally reachable TCP port"
 msgstr "Extern erreichbarer TCP-Port"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515
 msgid "Use the same port configured for UDP"
 msgstr "Den selben Port wie für UDP benutzen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:505
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523
 msgid "Specify Port"
 msgstr "Gib den Port an"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:348
 msgid "Note"
 msgstr "Hinweis"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:530
 msgid "Changing these settings will restart your router."
 msgstr "Veränderungen an diesen Werten bewirken einen Neustart des Routers."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536
 msgid "Configuration Help"
 msgstr "Konfigurationshilfe"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
 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 funktioniert auch hinter den meisten Firewalls, aber die Geschwindigkeit und Integration ins I2P-Netz erhöhen sich, wenn der I2P-Port in der Firewall für TCP und UDP freigegeben und auf Ihren Computer weitergeleitet wird."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540
 msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you."
 msgstr ""
 "Falls es Ihnen möglich ist, richten Sie bitte Ihre Firewall so ein, dass \n"
 "TCP- und UDP-Pakete Ihren Computer unverändert erreichen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542
 msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic."
 msgstr ""
 "Falls Ihnen das nicht möglich ist, hat I2P UPnP-Unterstützung (Universelles \n"
 "Plug and Play) und UDP-Weiterleitung mit Hilfe der „SSU-Hilfsrouter“ eingebaut."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544
 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 ""
 "Die meisten der obenstehenden Optionen sind für besondere Situationen,\n"
 "wenn z.&nbsp;B. UPnP nicht funktioniert oder die Firewall nicht geändert werden \n"
 "kann und Probleme bereitet."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:528
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546
 msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
 msgstr ""
 "Bestimmte Firewalls, wie auch symmetrische NATs, arbeiten unter Umständen\n"
 "nicht gut mit I2P zusammen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
 msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports."
 msgstr ""
 "UPnP kommuniziert normalerweise mit den Internet Gateway Devices (IGDs), um \n"
 "die extern erreichbare IP-Adresse zu ermitteln und die Ports weiterzuleiten."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
 msgid "UPnP support is beta, and may not work for any number of reasons"
 msgstr ""
 "Die Unterstützung für UPnP ist noch in der Testphase und kann aus vielen\n"
 "Gründen nicht funktionieren"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559
 msgid "No UPnP-compatible device present"
 msgstr "Kein UPnP-fähiges Gerät gefunden"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561
 msgid "UPnP disabled on the device"
 msgstr "UPnP ist für dieses Gerät deaktiviert"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
 msgid "Software firewall interference with UPnP"
 msgstr "Die Software-Firewall stört UPnP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
 msgid "Bugs in the device's UPnP implementation"
 msgstr "Fehlerhafte UPnP-Integration im Gerät"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
 msgid "Multiple firewall/routers in the internet connection path"
 msgstr "Mehrere Firewalls / Router in der Verbindung zum Internet"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:551
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
 msgid "UPnP device change, reset, or address change"
 msgstr "UPnP-Gerät geändert, neugestartet oder mit geänderter Adresse"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:553
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571
 msgid "Review the UPnP status here."
 msgstr "Überprüfen Sie hier den UPnP-Status."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573
 msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect."
 msgstr ""
 "UPnP kann aktiviert oder deaktiviert werden, aber ein wechseln \n"
 "erfordert einen Routerneustart um wirksam zu werden."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
 msgid "Hostnames entered above will be published in the network database."
 msgstr "Oben eingegebene Hostnamen werden in der Netzwerk-Datenbank veröffentlicht."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
 msgid "They are <b>not private</b>."
 msgstr "Sie sind <b>nicht geheim</b>."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
 msgid "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
 msgstr ""
 "Geben Sie auch <b>keine IP-Adresse für den privaten Gebrauch</b> wie\n"
 "127.0.0.1 oder 192.168.1.1 an!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
 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 ""
 "Wenn Sie eine falsche IP-Adresse oder einen falschen Hostnamen angeben, oder Ihre Firewall oder NAT nicht richtig konfigurieren, \n"
 "wird sich Ihre Netzwerk-Performance erheblich verschlechtern."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
 msgid "When in doubt, leave the settings at the defaults."
 msgstr "Wenn Sie Zweifel haben, lassen Sie die Einstellungen auf den Standardwerten."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
 msgid "Reachability Help"
 msgstr "Hilfe zur Erreichbarkeit"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590
 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 ""
 "Wenn Sie meinen, Sie haben Ihre Firewall geöffnet und I2P breichtet dennoch, es wäre\n"
 "hinter einer Firewall, dann prüfen Sie, ob Sie möglicherweise mehrere Firewalls\n"
 "- zum Beispiel sowohl Software- als auch externer Hardware-Router - haben."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
 msgid "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help diagnose the problem."
 msgstr ""
 "Wenn ein Fehler auftritt, können die <a href=\"logs.jsp\">Berichte</a> helfen, \n"
 "das Problem zu diagnostizieren."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
 msgid "Your UDP port does not appear to be firewalled."
 msgstr "Ihr UDP-Port wird anscheinend nicht von der Firewall geblockt."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
 msgid "Your UDP port appears to be firewalled."
 msgstr "Ihr UDP-Port wird anscheinend von der Firewall geblockt."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
 msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error."
 msgstr ""
 "Da die Firewall-Nachweismethoden nicht zu 100% zuverlässig sind, ist die \n"
 "Anzeige gelegentlich fehlerhaft."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
 msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port."
 msgstr ""
 "Wenn es allerdings dauerhaft angezeigt wird, sollten Sie überprüfen, ob Ihre Ports,\n"
 "sowohl der externen wie auch der internen Firewall, geöffnet sind."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
 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 wird auch mit geschlossener Firewall gut funktionieren, es besteht kein \n"
 "Grund zur Besorgnis. Bei geschlossener Firewall verwendet der Router \n"
 "\"Hilfsrouter\", um eingehende Verbindungen zu übertragen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609
 msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)."
 msgstr "Falls Sie Ihre Firewall(s) öffnen, helfen Sie dem Netzwerk mehr und gleichzeitig erhöhen Sie Ihre Anonymität durch die Teilnahme an fremden Tunneln."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
 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 "Falls Sie dies schon getan haben, denken Sie bitte daran, dass Sie eine Hardware- und eine Software-Firewall haben könnten, oder aber hinter einer Firewall sind, die Sie nicht ändern können (z.B. seitens Ihres Providers)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
 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 "Auch können manche Router nicht TCP und UDP korrekt auf dem selben Port weiterleiten, oder haben andere Beschränkungen oder Fehler, die die Portweiterleitung an den I2P-Router behindern."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
 msgid "The router is currently testing whether your UDP port is firewalled."
 msgstr "Der Router testet gerade, ob Ihr UDP-Port offen ist."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
 msgid "The router is not configured to publish its address, therefore it does not expect incoming connections."
 msgstr "Die Einstellungen des Routers verhindern die Veröffentlichung der Adresse, deswegen akzeptiert er keine eingehenden Verbindungen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
 msgid "WARN - Firewalled and Fast"
 msgstr "WARNUNG: Firewall aktiv und schnell"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
 msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled."
 msgstr "Sie haben I2P angewiesen, mehr als 128 kbit/s Bandbreite zu teilen, aber leider sind Sie hinter einer Firewall."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
 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 funktioniert zwar auch mit dieser Einstellung, falls Sie jedoch wirklich über mehr als 128 kbit/s Bandbreite zum Teilen verfügen, sind Sie mit einer offenen Firewall viel hilfreicher für das Netzwerk."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
 msgid "WARN - Firewalled and Floodfill"
 msgstr "WARNUNG: Firewall und Floodfillfunktion aktiv"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
 msgid "You have configured I2P to be a floodfill router, but you are firewalled."
 msgstr "Sie haben I2P als Floodfill-Router eingerichtet, jedoch sind sie hinter einer Firewall."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
 msgid "For best participation as a floodfill router, you should open your firewall."
 msgstr "Für die beste Teilnahme als Floodfill-Router, sollten Sie Ihre Firewall öffnen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
 msgid "WARN - Firewalled with Inbound TCP Enabled"
 msgstr "WARNUNG: von Firewall geblockt und ankommendes TCP aktiviert"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
 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 "Sie haben eingehendes TCP konfiguriert, jedoch ist ihr UDP-Port hinter einer Firewall. Deswegen ist es wahrscheinlich, dass Ihr TCP-Port auch hinter einer Firewall ist."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
 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 "Falls Ihr TCP Port gesperrt ist und Sie \"eingehendes TCP\" aktiviert haben, werden andere Router Sie nicht via TCP erreichen können. Dies schadet dem Netzwerk."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
 msgid "Please open your firewall or disable inbound TCP above."
 msgstr "Bitte öffnen Sie Ihre Firewall oder schalten Sie ankommendes TCP oben aus"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
 msgid "WARN - Firewalled with UDP Disabled"
 msgstr "WARNUNG: Firewall aktiv und UDP deaktiviert"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
 msgid "You have configured inbound TCP, however you have disabled UDP."
 msgstr "Sie haben eingehendes TCP aktiviert, jedoch UDP deaktiviert."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
 msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections."
 msgstr "Sie scheinen auf TCP eine Firewall zu haben, deswegen kann Ihr Router keine eingehenden Verbindungen entgegennehmen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
 msgid "Please open your firewall or enable UDP."
 msgstr "Bitte öffnen Sie Ihre Firewall oder aktivieren Sie UDP!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
 msgid "ERR - Clock Skew"
 msgstr "FEHLER: Uhr nicht synchron"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
 msgid "Your system's clock is skewed, which will make it difficult to participate in the network."
 msgstr "Ihre Uhrzeit ist nicht synchron mit dem Netzwerk, dies macht es schwierig, am Netzwerk teilzunehmen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655
 msgid "Correct your clock setting if this error persists."
 msgstr "Korrigieren Sie Ihre Uhrzeit falls dieser Fehler bestehen bleibt!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657
 msgid "ERR - Private TCP Address"
 msgstr "FEHLER: Private TCP-Adresse"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659
 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 "Sie dürfen nie eine nicht routebare IP wie 127.0.0.1 oder 192.168.1.1 als Ihre extern erreichbare Adresse angeben."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661
 msgid "Correct the address or disable inbound TCP above."
 msgstr "Korrigieren Sie die Adresse oder deaktivieren Sie eingehendes TCP oben!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663
 msgid "ERR - SymmetricNAT"
 msgstr "FEHLER: symmetrische NAT"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665
 msgid "I2P detected that you are firewalled by a Symmetric NAT."
 msgstr "I2P hat erkannt, dass Sie hinter einer symmetrischen NAT gesperrt sind."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667
 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 funktioniert hinter diesem Typ Firewall nicht gut. Sie können wahrscheinlich keine eingehenden Verbindungen akzeptieren, was Ihre Teilnahme am Netzwerk beeinträchtigt."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669
 msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
 msgstr "FEHLER: UDP-Port wird schon benutzt. Setzen Sie i2np.udp.internalPort=xxxx in den erweiterten Einstellungen und starten Sie neu!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671
 msgid "I2P was unable to bind to port 8887 or other configured port."
 msgstr "I2P konnte sich nicht auf den konfigurierten Port binden."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673
 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 "Überprüfen Sie, ob ein anderes Programm den eingestellten Port benutzt. Falls ja, beenden Sie dieses Programm oder wählen Sie einen anderen Port für I2P!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:675
 msgid "This may be a transient error, if the other program is no longer using the port."
 msgstr "Dies kann ein vorübergehender Fehler sein, falls das andere Programm diesen Port nicht mehr nutzt."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:677
 msgid "However, a restart is always required after this error."
 msgstr "Jedoch ist nach diesem Fehler immer ein Neustart erforderlich."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:679
 msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
 msgstr "FEHLER: UDP deaktiviert und eingehende TCP-Adresse/Port nicht konfiguriert"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:681
 msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP."
 msgstr "Sie haben unter TCP eingehend keinen Hostnamen und Port eingetragen und dennoch UDP deaktiviert."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:683
 msgid "Therefore your router cannot accept inbound connections."
 msgstr "Somit kann Ihr Router keine eigehenden Verbindungen akzeptieren."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:685
 msgid "Please configure a TCP host and port above or enable UDP."
 msgstr "Bitte konfigurieren Sie eine Adresse und einen Port im oberen Bereich für TCP oder aktivieren Sie UDP!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:687
 msgid "ERR - Client Manager I2CP Error - check logs"
 msgstr "FEHLER: Klientenmanager I2CP Fehler - Schauen Sie in die Berichte!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:689
 msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
 msgstr "Dies geschieht für gewöhnlich wegen eines Konflikts auf Port 7654. Prüfen Sie die Berichte, um dies zu verifizieren!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:691
 msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P."
 msgstr "Haben Sie eine zweite I2P-Instanz laufen? Beenden Sie das störende Programm und starten Sie I2P neu!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:113
 msgid "config advanced"
 msgstr "Erweiterte Einstellungen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:263
 msgid "I2P Advanced Configuration"
 msgstr "I2P - Erweiterte Einstellungen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:319
 msgid "Advanced I2P Configuration"
 msgstr "Erweiterte I2P-Einstellungen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:329
 msgid "Some changes may require a restart to take effect."
 msgstr "Einige Einstellungen benötigen einen Routerneustart, um aktiv zu werden."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:112
 msgid "config clients"
 msgstr "Klienten einrichten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:265
 msgid "I2P Client Configuration"
 msgstr "Konfiguration der I2P-Klienten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330
 msgid "Client Configuration"
 msgstr "Klienten-Konfiguration"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:314
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:332
 msgid "The Java clients listed below are started by the router and run in the same JVM."
 msgstr ""
 "Die Java-Klienten unten werden durch den Router gestartet und laufen in der \n"
 "selben JVM."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338
 msgid "To change other client options, edit the file"
 msgstr "Bearbeiten Sie diese Datei, um andere Klienten-Optionen zu ändern:"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:415
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439
 msgid "All changes require restart to take effect."
 msgstr "Alle Änderungen erfordern einen Neustart, um aktiv zu werden."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:337
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357
 msgid "Advanced Client Interface Configuration"
-msgstr "Erweiterte I2P-Einstellungen"
+msgstr "Erweiterte Einstellungen des Klienten-Interfaces"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361
 msgid "External I2CP (I2P Client Protocol) Interface Configuration"
-msgstr ""
+msgstr "Eintellungen des externen I2CP-Interfaces (I2P-Klienten-Protokoll)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367
 msgid "Enabled without SSL"
-msgstr ""
+msgstr "Aktiviert; ohne SSL"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373
 msgid "Enabled with SSL required"
-msgstr ""
+msgstr "Aktiviert, SSL erforderlich"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379
 msgid "Disabled - Clients outside this Java process may not connect"
-msgstr ""
+msgstr "Deaktiviert - Klienten außerhalb dieses Javaprozesses können sich nicht verbinden"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:381
 msgid "I2CP Port"
-msgstr ""
+msgstr "I2CP-Port"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385
 msgid "I2CP Interface"
-msgstr "Einstellungen"
+msgstr "I2CP-Interface"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401
 msgid "Authorization"
-msgstr "Autor"
+msgstr "Autorisation"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385
-msgid "Requre username and password"
-msgstr ""
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407
+msgid "Require username and password"
+msgstr "Zugangskontrolle per Benutzername und Passwort aktivieren"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:387
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409
 msgid "Username"
-msgstr "Surinam"
+msgstr "Benutzername"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:391
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413
 msgid "Password"
-msgstr ""
+msgstr "Passwort"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:397
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:419
 msgid "Any changes made here must also be configured in the external client."
-msgstr ""
+msgstr "Alle hier vorgenommenen Änderungen müssen auch in den externen Klienten vorgenommen werden."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421
 msgid "Many clients do not support SSL or authorization."
-msgstr ""
+msgstr "Vielle Klienten unterstützen kein SSL und/oder keine Authentifikation."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429
 msgid "WebApp Configuration"
 msgstr "WebApp-Einstellungen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431
 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 separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)."
 msgstr "Untengenannte Java-Anwendungen werden vom WebKonsolen-Klienten gestartet und laufen in der selben JVM wie der Router. Es handelt sich dabei normalerweise Web-Anwendungen, die über die Routerkonsole erreichbar sind. Es können komplette Anwendungen (z.B. i2psnark), reine Oberflächen für andere Klienten, Anwendungen, die separat aktiviert werden müssen (z.B. susidns, i2ptunnel), oder Anwendungen ohne Oberfläche (Adressbuch) sein."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:411
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433
 msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method."
 msgstr "Eine Webanwendung kann auch durch das Entfernen der .war-Datei deaktiviert werden. Jedoch werden die .war-Datei und die Anwendung nach einer Aktualisierung des Routers wieder erscheinen. Somit ist das Deaktivieren der Web-Anwendung hier die bevorzugte Methode."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:445
 msgid "Plugin Configuration"
 msgstr "Konfiguration der Zusatzprogramme"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:447
 msgid "The plugins listed below are started by the webConsole client."
 msgstr "Die unten aufgelisteten Zusatzprogramme werden vom WebKonsolen-Klienten gestartet."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455
 msgid "Plugin Installation"
 msgstr "Installation von Zusatzprogrammen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:457
 msgid "To install a plugin, enter the download URL:"
 msgstr "Für die Installation eines Zusatzprogramms bitte die Download-URL eingeben:"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:112
 msgid "config keyring"
 msgstr "Schlüsselbund einrichten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:249
 msgid "I2P Keyring Configuration"
 msgstr "Einstellungen des I2P-Schlüsselbunds"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317
 msgid "The router keyring is used to decrypt encrypted leaseSets."
 msgstr "Der Router-Schlüsselbund wird zum Entschlüsseln verschlüsselter LeaseSets verwendet."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:298
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320
 msgid "The keyring may contain keys for local or remote encrypted destinations."
 msgstr "Der Schlüsselbund kann Schlüssel für lokale oder entfernte verschlüsselte Leasesets enthalten."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326
 msgid "Manual Keyring Addition"
 msgstr "Manuelles Hinzufügen zum Schlüsselbund"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:328
 msgid "Enter keys for encrypted remote destinations here."
 msgstr "Geben Sie hier die Schlüssel für entfernte verschlüsselte Ziele ein!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:331
 msgid "Keys for local destinations must be entered on the"
 msgstr "Schlüssel für lokale Ziele müssen dort eingegeben werden"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:333
 msgid "I2PTunnel page"
 msgstr "I2PTunnel-Seite"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335
 msgid "Dest. name, hash, or full key"
 msgstr "Name des Ziels, Prüfsumme oder ganzer Schlüssel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337
 msgid "Encryption Key"
 msgstr "Schlüssel zum Kodieren"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:113
 msgid "config logging"
 msgstr "Berichte einrichten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:263
 msgid "I2P Logging Configuration"
 msgstr "Einstellungen der I2P-Berichte"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
 msgid "Configure I2P Logging Options"
 msgstr "Richte I2P-Berichte ein"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321
 msgid "Logging filename"
 msgstr "Dateiname für Berichte"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325
 msgid "(the symbol '@' will be replaced during log rotation)"
 msgstr "(Das Zeichen '@' wird bei der Rotation der Berichtedatei ersetzt)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327
 msgid "Log record format"
 msgstr "Format der Berichtedatei"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331
 msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
 msgstr "(Benutzen Sie 'd' = Datum, 'c' = Klasse, 't' = Thread, 'p' = Priorität, 'm' = Nachricht)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333
 msgid "Log date format"
 msgstr "Datumsformat der Berichte"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337
 msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)"
 msgstr "('MM' = Monat, 'dd' = Tag, 'HH' = Stunde, 'mm' = Minute, 'ss' = Sekunde, 'SSS' = Millisekunde)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339
 msgid "Max log file size"
 msgstr "max. Dateigröße der Berichte"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:343
 msgid "Default log level"
 msgstr "Standardlevel für Berichte"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:347
 msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)"
 msgstr "(DEBUG und INFO sind nicht empfohlen, da diese den Router drastisch verlangsamen)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:349
 msgid "Log level overrides"
 msgstr "Berichtelevel - Sonderoptionen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:353
 msgid "New override"
 msgstr "Neue Zusatzoption"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:112
 msgid "config peers"
 msgstr "Teilnehmer einrichten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:249
 msgid "I2P Peer Configuration"
 msgstr "Einstellungen zu I2P-Teilnehmern"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323
 msgid "Manual Peer Controls"
 msgstr "Manuelles Verwalten der Teilnehmer"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325
 msgid "Router Hash"
 msgstr "Router-Prüfsumme"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:329
 msgid "Manually Ban / Unban a Peer"
 msgstr "Einen Teilnehmer manuell sperren/entsperren"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:331
 msgid "Banning will prevent the participation of this peer in tunnels you create."
 msgstr "Eine Sperrung verhindert, dass der Teilnehmer in von Ihnen aufgebauten Tunneln partizipiert."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:341
 msgid "Adjust Profile Bonuses"
 msgstr "Profilboni anpassen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343
 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 Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the"
 msgstr "Boni können positiv oder negativ sein. Sie beeinflussen die Aufnahme der Teilnehmer in die  Klassen schneller Router und Router hoher Kapazität. Schnelle Teilnehmer werden für Klienten-Tunnel genutzt, Teilnehmer mit hoher Kapazität für einige Erkundungstunnel. Derzeitige Boni werden dargestellt auf der "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345
 msgid "profiles page"
 msgstr "Profile-Seite"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:273
 msgid "Banned Peers"
 msgstr "Gesperrte Teilnehmer"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:384
 msgid "Banned IPs"
 msgstr "Gesperrte IPs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:112
+msgid "config reseeding"
+msgstr "Reseed-Einstellungen"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:262
+msgid "I2P Reseeding Configuration"
+msgstr "I2P-Reseed-Einstellungen"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318
+msgid "Reseeding Configuration"
+msgstr "Reseed-Einstellungen"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:320
+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 "Der Reseed ist ein \"bootstrapping\"-Prozess, der das erstmalige Verbinden mit dem Netzwerk ermöglicht. Hierbei werden andere Netzwerkteilnehmer gefunden. Dies ist nötig nach der Installation oder wenn der Router aus anderen Gründen nur noch sehr wenige Kontakte gespeichert hat."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:322
+msgid "If reseeding has failed, you should first check your network connection."
+msgstr "Schlägt der Reseed fehl, solltest du zuallererst deine Internetverbindung überprüfen."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:326
+msgid "Change these only if HTTP is blocked by a restrictive firewall, reseed has failed, and you have access to an HTTP proxy."
+msgstr "Ändere diese Einstellungen nur wenn HTTP von einer restriktiven Firewall blockiert wird, der Reseed fehlschlägt, und dir ein HTTP-Proxy zur Verfügung steht."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328
+#, java-format
+msgid "See {0} for instructions on reseeding manually."
+msgstr "Für einen manuellen Reseed, lies die Anleitung unter {0}!"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328
+msgid "the FAQ"
+msgstr "die FAQ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330
+msgid "Reseed URL Selection"
+msgstr "Auswahl der Reseed-URL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336
+msgid "Try SSL first then non-SSL"
+msgstr "Probiere zunächst SSL, dann nicht-SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:342
+msgid "Use SSL only"
+msgstr "nur SSL verwenden"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348
+msgid "Use non-SSL only"
+msgstr "kein SSL verwenden"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350
+msgid "Reseed URLs"
+msgstr "Reseed-URLs"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:354
+msgid "Enable HTTP proxy (not used for SSL)"
+msgstr "HTTP-Proxy aktivieren (nicht für SSL)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:358
+msgid "HTTP Proxy Host"
+msgstr "IP der HTTP-Brücke"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:362
+msgid "HTTP Proxy Port"
+msgstr "Port der HTTP-Brücke"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:112
 msgid "config service"
 msgstr "Dienste einrichten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:249
 msgid "I2P Service Configuration"
 msgstr "I2P-Dienste-Einstellungen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:285
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303
 msgid "Shutdown the router"
 msgstr "Router herunterfahren"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:287
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305
 msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes."
 msgstr "Das kontrollierte Herunterfahren lässt dem Router Zeit, alle Zusagen, die er gemacht hat, noch zu erfüllen. Dafür benötigt er bis zu 11 Minuten."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:289
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307
 msgid "If you need to kill the router immediately, that option is available as well."
 msgstr "Es gibt auch eine Option zum sofortigen Beenden des Routers, falls Sie diese benötigen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317
 msgid "If you want the router to restart itself after shutting down, you can choose one of the following."
 msgstr "Falls Sie den Router nach dem Herunterfahren automatisch wieder starten lassen wollen, wählen Sie eine der folgenden Optionen aus."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319
 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 "Dies ist in manchen Situationen hilfreich - zum Beispiel wenn Sie einige Optionen geändert haben, die die Klienten-Anwendung nur beim Starten einliest (Routerkonsolen-Passwort oder das Interface auf dem es arbeitet)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321
 msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately."
 msgstr "Ein kontrollierter Neustart benötigt bis zu 11 Minuten (Ihre Teilnehmer sind für Ihre Geduld dankbar); ein harter Neustart erfolgt sofort."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323
 msgid "After tearing down the router, it will wait 1 minute before starting back up again."
 msgstr "Nachdem der Router heruntergefahren ist, wartet er eine Minute, bevor er wieder startet."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333
 msgid "Systray integration"
 msgstr "Systemtray-Integration"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335
 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 "Auf Windows-Systemen gibt es eine kleine Anwendung, die es Ihnen ermöglicht, den Routerstatus im Systemtray zu sehen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337
 msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)."
 msgstr "(Später werden I2P-Anwendungen auch ihre eigenen Funktionen in den Systemtray integrieren können)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339
 msgid "If you are on windows, you can either enable or disable that icon here."
 msgstr "Falls Sie Windows nutzen, können Sie hier dieses Symbol aktiveren oder deaktivieren."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341
+msgid "Show systray icon"
+msgstr "Systemtray-Icon anzeigen"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343
+msgid "Hide systray icon"
+msgstr "Systemtray-Icon deaktivieren"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:345
 msgid "Run on startup"
 msgstr "Beim Hochfahren starten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347
 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 "Sie können mit folgenden Optionen festlegen, ob I2P beim Hochfahren gestartet wird oder nicht - I2P wird dementsprechend einen Service einrichten (oder ggf. entfernen)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349
 msgid "If you prefer the command line, you can also run the "
 msgstr "Falls Sie die Eingabeaufforderung bevorzugen, können Sie auch folgendes ausführen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359
 msgid "If you are running I2P as service right now, removing it will shut down your router immediately."
 msgstr "Falls Sie I2P zurzeit als Service gestartet haben, wird ein Entfernen des Services den Router sofort beenden."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361
 msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat."
 msgstr "Sie sollten I2P, wie oben beschrieben, kontrolliert herunterfahren und dann uninstall_i2p_service_winnt.bat ausführen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365
 msgid "Debugging"
 msgstr "Debuggen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:367
 msgid "View the job queue"
 msgstr "Die Auftragswarteschlange ansehen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:371
 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 "Manchmal ist es zur Fehlerbeseitigung in I2P hilfreich, eine Liste der aktiven Prozesse zu erzeugen. Dafür wählen Sie bitte folgende Option aus und überprüfen die Liste der aktiven Prozesse in der <a href=\"logs.jsp#servicelogs\">wrapper.log Datei</a>!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:377
 msgid "Launch browser on router startup?"
 msgstr "Beim Starten einen Browser aufrufen?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:379
 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 "Die Web-Konsole ist I2Ps wichtigstes Interface für Einstellungen. I2P kann für Sie beim Starten einen Browser öffnen und die Routerkonsole anzeigen, unter"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:113
 msgid "config stats"
 msgstr "Statistiken einrichten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:250
 msgid "I2P Stats Configuration"
 msgstr "I2P - Einstellungen zu den Statistiken"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:320
 msgid "Configure I2P Stat Collection"
 msgstr "I2P-Statistiken anpassen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:322
 msgid "Enable full stats?"
 msgstr "Vollständige Statistiken aktivieren?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329
 msgid "change requires restart to take effect"
 msgstr "Änderungen erfordern einen Routerneustart"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331
 msgid "Stat file"
 msgstr "Status Datei"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:335
 msgid "Filter"
 msgstr "Filter"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:319
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:348
 msgid "toggle all"
 msgstr "Wähle alle"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:350
 msgid "Log"
 msgstr "Berichte"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:332
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:352
 msgid "Graph"
 msgstr "Graphen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:371
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:391
 msgid "Advanced filter"
 msgstr "Erweiterte Filter"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:112
 msgid "config tunnels"
 msgstr "Tunnel einrichten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:262
 msgid "I2P Tunnel Configuration"
 msgstr "Einstellungen der I2P-Tunnel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:328
 msgid "The default settings work for most people."
 msgstr "Die Standardeinstellungen funktionieren für die meisten."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332
 msgid "There is a fundamental tradeoff between anonymity and performance."
 msgstr "Es gibt einen grundsätzlichen Kompromiss zwischen Anonymität und Performance."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335
 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 "Tunnel mit mehr als 3 Zwischenstationen (z.B. 2+0-2, 3+0-1 oder 3+0-2) oder eine große Anzahl an Tunneln + Ersatztunneln kann die Performance oder Zuverlässigkeit erheblich verringern."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338
 msgid "High CPU and/or high outbound bandwidth usage may result."
 msgstr "Eine hohe CPU-Last und/oder hohe ausgehende Bandbreite können die Folge sein."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341
 msgid "Change these settings with care, and adjust them if you have problems."
 msgstr "Ändern Sie diese Einstellungen nur, wenn Sie Probleme haben, und stets mit besonderer Vorsicht!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:333
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:351
 msgid "Exploratory tunnel setting changes are stored in the router.config file."
 msgstr "Einstellungen der Erkundungstunnel sind in der Datei router.config gespeichert."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:336
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:354
 msgid "Client tunnel changes are temporary and are not saved."
 msgstr "Änderungen an den Kliententunneln sind nur temporär und werden nicht gespeichert."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:356
 msgid "To make permanent client tunnel changes see the"
 msgstr "Um permanente Änderungen an den Kliententunneln zu machen, gehen Sie auf die "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:358
 msgid "i2ptunnel page"
 msgstr "I2PTunnel-Seite"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:112
 msgid "config UI"
 msgstr "konfiguriere UI"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:262
 msgid "I2P UI Configuration"
 msgstr "I2P UI-Konfiguration"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:292
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314
 msgid "Router Console Theme"
 msgstr "Thema der Routerkonsole"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:339
 msgid "Theme selection disabled for Internet Explorer, sorry."
 msgstr "Themenauswahl für den Internet Explorer ist ausgeschaltet, bedauere."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:341
 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 "Falls Sie nicht den Internet Explorer (IE) benutzen, gibt Ihr Browser wahrscheinlich vor, IE zu sein. Wenn Sie die Konsolenthemen nutzen möchten, ändern Sie bitte Ihren Browser (oder Proxy) so, dass er einen anderen User-Agenten sendet!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:345
 msgid "Router Console Language"
 msgstr "Sprache der Routerkonsole"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:349
 msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help."
 msgstr ""
 "Bitte tragen Sie zum Routerkonsolen-Ãœbersetzungsprojekt bei! Kontaktieren \n"
 "Sie hierzu die Entwickler über den IRC-Kanal #i2p!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:324
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353
 msgid "Apply"
 msgstr "Anwenden"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:112
 msgid "config update"
 msgstr "Aktualisierung der Konfiguration"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:249
 msgid "I2P Update Configuration"
 msgstr "Einstellungen zu Aktualisierungen von I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321
 msgid "Check for I2P and news updates"
 msgstr "Überprüfe auf Aktualisierungen von I2P und auf Nachrichten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:323
 msgid "News &amp; I2P Updates"
 msgstr "Neuigkeiten &amp; Aktualisierungen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327
 msgid "Update In Progress"
 msgstr "Aktualisierung wird vorgenommen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335
 msgid "News URL"
 msgstr "Nachrichten-URL"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339
 msgid "Refresh frequency"
 msgstr "Aktualisierungshäufigkeit"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:345
 msgid "Update policy"
 msgstr "Aktualisierungsregeln"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:349
 msgid "Update through the eepProxy?"
 msgstr "Aktualisierung durch den eepProxy?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:353
 msgid "eepProxy host"
 msgstr "eepProxy-Host"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:357
 msgid "eepProxy port"
 msgstr "eepProxy-Port"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
 msgid "Update URLs"
 msgstr "URLs aktualisieren"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365
 msgid "Trusted keys"
 msgstr "Vertraute Schlüssel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369
 msgid "Update with unsigned development builds?"
 msgstr "Aktualisieren mit unsignierten Entwicklerversionen?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:355
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:373
 msgid "Unsigned Build URL"
 msgstr "URL für nicht signierte Aktualisierungen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:379
 msgid "I2P updates are disabled because you do not have write permission for the install directory."
 msgstr "Aktualisierungen für I2P sind deaktiviert, da Sie (I2P) keine Schreibberechtigung im Installationsverzeichnis haben."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385
 msgid "Save"
 msgstr "Speichern"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121
+msgid "Internal Error"
+msgstr "interner Fehler"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123
+msgid "Router Console"
+msgstr "I2P-Routerkonsole"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:127
+msgid "Configuration"
+msgstr "Einstellungen"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135
+msgid "Sorry! There has been an internal error."
+msgstr "Entschuldigung! es gab einen internen Fehler."
+
+#. note to translators - both parameters are URLs
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:254
+#, java-format
+msgid "Please report bugs on {0} or {1}."
+msgstr "Bitte melden Sie Fehler unter {0} oder {1}!"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258
+msgid "You may use the username \"guest\" and password \"guest\" if you do not wish to register."
+msgstr "Sie können hierfür den Benutzernamen \"guest\" und das Passwort \"guest\" verwenden, wenn Sie sich nicht registrieren wollen."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:145
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:260
+msgid "Please include this information in bug reports"
+msgstr "Bitte fügen Sie folgende Informationen dem Bugreport bei!"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147
+msgid "Error Details"
+msgstr "Fehlerdetails"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:149
+#, java-format
+msgid "Error {0}"
+msgstr "Fehler {0}"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:169
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:250
+msgid "I2P Version and Running Environment"
+msgstr "I2P-Version & Laufzeitumgebung"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:197
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:288
+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 "Beachten Sie, dass Systeminformationen, Zeitstempel der Berichte sowie die Fehlerberichte selbst Hinweise auf Ihren Standort enthalten können. Bitte überprüfen Sie Fehlerberichte, die Sie einreichen wollen, diesbezüglich!"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:123
 msgid "Page Not Found"
 msgstr "Seite nicht gefunden"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:264
 msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource."
 msgstr ""
 "Bedaure. Anscheinend haben Sie eine nicht vorhandene Routerkonsolenseite\n"
 "oder -Ressource angefordert."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:266
 msgid "Error 404"
 msgstr "Fehler 404"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:249
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:271
 msgid "not found"
 msgstr "nicht gefunden"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:112
 msgid "graphs"
 msgstr "Diagramme"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:249
 msgid "I2P Performance Graphs"
 msgstr "I2P-Leistungsdiagramme"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:111
 msgid "home"
 msgstr "Heim"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:331
+msgid "Welcome to I2P"
+msgstr "Willkommen im I2P!"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:111
 msgid "job queue"
 msgstr "Auftragswarteschlange"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:248
 msgid "I2P Router Job Queue"
 msgstr "I2P-Router-Auftragswarteschlange"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:111
 msgid "logs"
 msgstr "Protokolle"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:248
 msgid "I2P Router Logs"
 msgstr "I2P-Router-Protokolle"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:228
-msgid "I2P Version & Running Environment"
-msgstr "I2P-Version & Laufzeitumgebung"
-
-#. note to translators - both parameters are URLs
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:232
-#, java-format
-msgid "Please report bugs on {0} or {1}."
-msgstr "Bitte melden Sie Fehler unter {0} oder {1}!"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:236
-msgid "You may use the username \"guest\" and password \"guest\" if you do not wish to register."
-msgstr "Sie können hierfür den Benutzernamen \"guest\" und das Passwort \"guest\" verwenden, wenn Sie sich nicht registrieren wollen."
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:238
-msgid "Please include this information in bug reports"
-msgstr "Bitte fügen Sie folgende Informationen dem Bugreport bei!"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266
-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 "Beachten Sie, dass Systeminformationen, Zeitstempel der Berichte sowie die Fehlerberichte selbst Hinweise auf Ihren Standort enthalten können. Bitte überprüfen Sie Fehlerberichte, die Sie einreichen wollen, diesbezüglich!"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:281
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303
 msgid "Critical Logs"
 msgstr "Berichte kritischer Ereignisse"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:285
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:307
 msgid "Router Logs"
 msgstr "Router-Berichte"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:313
 msgid "Service (Wrapper) Logs"
 msgstr "Berichte des Services (Wrapper)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:111
 msgid "network database summary"
 msgstr "Netzwerkdatenbank Zusammenfassung"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:248
 msgid "I2P Network Database Summary"
 msgstr "I2P-Netzwerkdatenbank Zusammenfassung"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:115
 msgid "WebApp Not Found"
 msgstr "WebApplikation nicht gefunden"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:230
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:252
 msgid "Web Application Not Running"
 msgstr "Web Applikation ist nicht aktiv"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:232
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:254
 msgid "The requested web application is not running."
 msgstr "Die angeforderte Web-Anwendung ist nicht aktiv."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:256
 msgid "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</a> to start it."
 msgstr "Bitte besuchen Sie die <a href=\"/configclients.jsp#webapp\">Klienten-Konfigurations Seite</a>, um diese zu starten."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:111
 msgid "peer connections"
 msgstr "Verbindungen zu Teilnehmern"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:248
 msgid "I2P Network Peers"
 msgstr "I2P-Netzwerkteilnehmer"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:111
 msgid "peer profiles"
 msgstr "Teilnehmerprofile"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:248
 msgid "I2P Network Peer Profiles"
 msgstr "Profile der I2P-Netzwerkteilnehmer"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:111
 msgid "statistics"
 msgstr "Statistiken"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:265
 msgid "I2P Router Statistics"
 msgstr "I2P-Router-Statistiken"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:255
 #, java-format
 msgid "Disable {0} Refresh"
 msgstr "Alle-{0}-Auffrischen<br>ausschalten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:111
 msgid "tunnel summary"
 msgstr "Tunnel Zusammenfassung"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:248
 msgid "I2P Tunnel Summary"
 msgstr "I2P-Tunnel Zusammenfassung"
 
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:248
+msgid "Peer Profile"
+msgstr "Teilnehmerprofil"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:275
+#, java-format
+msgid "Profile for peer {0}"
+msgstr "Teilnehmerprofil von {0}"
+
+#~ msgid "Download"
+#~ msgstr "Herunterladen"
+#~ msgid ""
+#~ "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href="
+#~ "\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" "
+#~ "href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually."
+#~ msgstr ""
+#~ "Stellen Sie bitte sicher, dass nichts ausgehenden HTTP-Transfer "
+#~ "blockiert, überprüfen Sie die <a target=\"_top\" href=\"logs.jsp"
+#~ "\">Berichte</a>, und wenn gar nichts hilft, lesen Sie die <a target=\"_top"
+#~ "\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> über das manuelle "
+#~ "Reseeden."
+#~ msgid "System tray icon enabled."
+#~ msgstr "Systemtray-Icon aktiviert"
+#~ msgid "System tray icon feature not supported on this platform. Sorry!"
+#~ msgstr "Systemtry-Icon wird auf diesem System leider nicht unterstützt."
+#~ msgid "Warning: unable to contact the systray manager"
+#~ msgstr "Warnung: kann den Systemtray-Manager nicht erreichen"
+#~ msgid "System tray icon disabled."
+#~ msgstr "Systemtry-Icon deaktiviert"
 #~ msgid "hour"
 #~ msgstr "Stunde"
 #~ msgid "minute"
@@ -5337,8 +5544,6 @@ msgstr "I2P-Tunnel Zusammenfassung"
 #~ "newticket\">trac.i2p2.i2p</a>!"
 #~ msgid "avg value"
 #~ msgstr "Durchschnitt"
-#~ msgid "events"
-#~ msgstr "Ereignisse"
 #~ msgid "lifetime average"
 #~ msgstr "Mittelwert seit Start"
 #~ msgid "peak average"
diff --git a/apps/routerconsole/locale/messages_en.po b/apps/routerconsole/locale/messages_en.po
new file mode 100644
index 0000000000000000000000000000000000000000..3da36a223a3987eecc682a38d90b0b41d753da18
--- /dev/null
+++ b/apps/routerconsole/locale/messages_en.po
@@ -0,0 +1,5633 @@
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P routerconsole\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-21 18:01+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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\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
+#. 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.
+#. If you want the digit separator in your locale, translate as {0}.
+#. alternates: msec, msecs
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1141
+#, java-format
+msgid "1 ms"
+msgid_plural "{0,number,####} ms"
+msgstr[0] ""
+msgstr[1] ""
+
+#. seconds
+#. Note to translators: quantity will always be greater than one.
+#. alternates: secs, sec. 'seconds' is probably too long.
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1146
+#, java-format
+msgid "1 sec"
+msgid_plural "{0} sec"
+msgstr[0] ""
+msgstr[1] ""
+
+#. minutes
+#. Note to translators: quantity will always be greater than one.
+#. alternates: mins, min. 'minutes' is probably too long.
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1151
+#, java-format
+msgid "1 min"
+msgid_plural "{0} min"
+msgstr[0] ""
+msgstr[1] ""
+
+#. hours
+#. Note to translators: quantity will always be greater than one.
+#. alternates: hrs, hr., hrs.
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1156
+#, java-format
+msgid "1 hour"
+msgid_plural "{0} hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1158
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:314
+msgid "n/a"
+msgstr ""
+
+#. days
+#. Note to translators: quantity will always be greater than one.
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1162
+#, java-format
+msgid "1 day"
+msgid_plural "{0} days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:122
+#, java-format
+msgid "Banned by router hash: {0}"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:124
+msgid "Banned by router hash"
+msgstr ""
+
+#. Temporary reason, until the job finishes
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:669
+msgid "IP banned"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:739
+#, java-format
+msgid "IP banned by blocklist.txt entry {0}"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:92
+msgid "Rejecting tunnels: Shutting down"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:141
+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");
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:177
+msgid "Rejecting most tunnels: High number of requests"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:233
+msgid "Rejecting tunnels: Limit reached"
+msgstr ""
+
+#. .067KBps
+#. * also limited to 90% - see below
+#. always leave at least 4KBps free when allowing
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:301
+msgid "Rejecting tunnels: Bandwidth limit"
+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:371
+msgid "Rejecting most tunnels: Bandwidth limit"
+msgstr ""
+
+#. hard to do {0} from here
+#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of tunnels");
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:375
+msgid "Accepting most tunnels"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:377
+msgid "Accepting tunnels"
+msgstr ""
+
+#. NPE, too early
+#. if (_context.router().getRouterInfo().getBandwidthTier().equals("K"))
+#. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low");
+#. else
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:488
+msgid "Rejecting tunnels"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:125
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
+msgid "Reseeding"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:141
+#, 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:148
+msgid "Reseed failed."
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:149
+#, java-format
+msgid "See {0} for help."
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150
+msgid "reseed configuration page"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:293
+msgid "Reseeding: fetching seed URL."
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:335
+#, java-format
+msgid ""
+"Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512
+msgid "NetDb entry"
+msgstr ""
+
+#. 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:70
+msgid "No transports (hidden or starting up?)"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450
+msgid "Unreachable on any transport"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499
+msgid "Router Transport Addresses"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504
+#, java-format
+msgid "{0} is used for outbound connections only"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129
+msgid "Help"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519
+msgid ""
+"Your transport connection limits are automatically set based on your "
+"configured bandwidth."
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521
+msgid ""
+"To override these limits, add the settings i2np.ntcp.maxConnections=nnn and "
+"i2np.udp.maxConnections=nnn on the advanced configuration page."
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+msgid "Definitions"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:735
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
+msgid "Peer"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
+msgid "The remote peer, identified by router hash"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:736
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
+msgid "Dir"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
+msgid "Inbound connection"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
+msgid "Outbound connection"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
+msgid "They offered to introduce us (help other peers traverse our firewall)"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532
+msgid "We offered to introduce them (help other peers traverse their firewall)"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+msgid "How long since a packet has been received / sent"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
+msgid "Idle"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+msgid "In/Out"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+msgid "The smoothed inbound / outbound transfer rate (KBytes per second)"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+msgid "How long ago this connection was established"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905
+msgid "Up"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907
+msgid "Skew"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+msgid "The difference between the peer's clock and your own"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
+msgid ""
+"The congestion window, which is how many bytes can be sent without an "
+"acknowledgement"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
+msgid "The number of sent messages awaiting acknowledgement"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
+msgid "The maximum number of concurrent messages to send"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
+msgid "The number of pending sends which exceed congestion window"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
+msgid "The slow start threshold"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
+msgid "The round trip time in milliseconds"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917
+msgid "Dev"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+msgid "The standard deviation of the round trip time in milliseconds"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
+msgid "The retransmit timeout in milliseconds"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
+msgid ""
+"Current maximum send packet size / estimated maximum receive packet size "
+"(bytes)"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
+msgid "TX"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+msgid "The total number of packets sent to the peer"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
+msgid "RX"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+msgid "The total number of packets received from the peer"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929
+msgid "Dup TX"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+msgid "The total number of packets retransmitted to the peer"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931
+msgid "Dup RX"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+msgid "The total number of duplicate packets received from the peer"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:409
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:627
+#, java-format
+msgid "Excessive clock skew: {0}"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:730
+msgid "NTCP connections"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:731
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886
+msgid "Limit"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
+msgid "Timeout"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743
+msgid "Out Queue"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744
+msgid "Backlogged?"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
+msgid "Inbound"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
+msgid "Outbound"
+msgstr ""
+
+#. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n");
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:807
+msgid "peers"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885
+msgid "UDP connections"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892
+msgid "Sort by peer hash"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
+msgid "Direction/Introduction"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
+msgid "Sort by idle inbound"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
+msgid "Sort by idle outbound"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
+msgid "Sort by inbound rate"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903
+msgid "Sort by outbound rate"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
+msgid "Sort by connection uptime"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
+msgid "Sort by clock skew"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911
+msgid "Sort by congestion window"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913
+msgid "Sort by slow start threshold"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916
+msgid "Sort by round trip time"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
+msgid "Sort by round trip time deviation"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920
+msgid "Sort by retransmission timeout"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923
+msgid "Sort by outbound maximum transmit unit"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
+msgid "Sort by packets sent"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
+msgid "Sort by packets received"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930
+msgid "Sort by packets retransmitted"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932
+msgid "Sort by packets received more than once"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953
+msgid "We offered to introduce them"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955
+msgid "They offered to introduce us"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959
+msgid "Choked"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967
+msgid "1 fail"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969
+#, java-format
+msgid "{0} fails"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162
+msgid "Banned"
+msgstr ""
+
+#. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n");
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106
+msgid "SUMMARY"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124
+msgid "Dropping tunnel requests: Too slow"
+msgstr ""
+
+#. don't even bother, since we are so overloaded locally
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267
+msgid "Dropping tunnel requests: Overloaded"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:470
+msgid "Rejecting tunnels: Request overload"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:495
+msgid "Rejecting tunnels: Connection limit"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:695
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:716
+msgid "Dropping tunnel requests: High load"
+msgstr ""
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:708
+msgid "Dropping tunnel requests: Queue time"
+msgstr ""
+
+#. Automatically generated pseudo-java for xgettext - do not edit
+#. Translators may wish to translate a few of these, do not bother to translate all of them!!
+#: ../java/build/Countries.java:3
+msgid "Andorra"
+msgstr ""
+
+#: ../java/build/Countries.java:4
+msgid "United Arab Emirates"
+msgstr ""
+
+#: ../java/build/Countries.java:5
+msgid "Afghanistan"
+msgstr ""
+
+#: ../java/build/Countries.java:6
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#: ../java/build/Countries.java:7
+msgid "Anguilla"
+msgstr ""
+
+#: ../java/build/Countries.java:8
+msgid "Albania"
+msgstr ""
+
+#: ../java/build/Countries.java:9
+msgid "Armenia"
+msgstr ""
+
+#: ../java/build/Countries.java:10
+msgid "Netherlands Antilles"
+msgstr ""
+
+#: ../java/build/Countries.java:11
+msgid "Angola"
+msgstr ""
+
+#: ../java/build/Countries.java:12
+msgid "Antarctica"
+msgstr ""
+
+#: ../java/build/Countries.java:13
+msgid "Argentina"
+msgstr ""
+
+#: ../java/build/Countries.java:14
+msgid "American Samoa"
+msgstr ""
+
+#: ../java/build/Countries.java:15
+msgid "Austria"
+msgstr ""
+
+#: ../java/build/Countries.java:16
+msgid "Australia"
+msgstr ""
+
+#: ../java/build/Countries.java:17
+msgid "Aruba"
+msgstr ""
+
+#: ../java/build/Countries.java:19
+msgid "Azerbaijan"
+msgstr ""
+
+#: ../java/build/Countries.java:20
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#: ../java/build/Countries.java:21
+msgid "Barbados"
+msgstr ""
+
+#: ../java/build/Countries.java:22
+msgid "Bangladesh"
+msgstr ""
+
+#: ../java/build/Countries.java:23
+msgid "Belgium"
+msgstr ""
+
+#: ../java/build/Countries.java:24
+msgid "Burkina Faso"
+msgstr ""
+
+#: ../java/build/Countries.java:25
+msgid "Bulgaria"
+msgstr ""
+
+#: ../java/build/Countries.java:26
+msgid "Bahrain"
+msgstr ""
+
+#: ../java/build/Countries.java:27
+msgid "Burundi"
+msgstr ""
+
+#: ../java/build/Countries.java:28
+msgid "Benin"
+msgstr ""
+
+#: ../java/build/Countries.java:29
+msgid "Bermuda"
+msgstr ""
+
+#: ../java/build/Countries.java:30
+msgid "Brunei Darussalam"
+msgstr ""
+
+#: ../java/build/Countries.java:31
+msgid "Bolivia"
+msgstr ""
+
+#: ../java/build/Countries.java:32
+msgid "Brazil"
+msgstr ""
+
+#: ../java/build/Countries.java:33
+msgid "Bahamas"
+msgstr ""
+
+#: ../java/build/Countries.java:34
+msgid "Bhutan"
+msgstr ""
+
+#: ../java/build/Countries.java:35
+msgid "Bouvet Island"
+msgstr ""
+
+#: ../java/build/Countries.java:36
+msgid "Botswana"
+msgstr ""
+
+#: ../java/build/Countries.java:37
+msgid "Belarus"
+msgstr ""
+
+#: ../java/build/Countries.java:38
+msgid "Belize"
+msgstr ""
+
+#: ../java/build/Countries.java:39
+msgid "Canada"
+msgstr ""
+
+#: ../java/build/Countries.java:40
+msgid "The Democratic Republic of the Congo"
+msgstr ""
+
+#: ../java/build/Countries.java:41
+msgid "Central African Republic"
+msgstr ""
+
+#: ../java/build/Countries.java:42
+msgid "Congo"
+msgstr ""
+
+#: ../java/build/Countries.java:43
+msgid "Switzerland"
+msgstr ""
+
+#: ../java/build/Countries.java:44
+msgid "Cote D'Ivoire"
+msgstr ""
+
+#: ../java/build/Countries.java:45
+msgid "Cook Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:46
+msgid "Chile"
+msgstr ""
+
+#: ../java/build/Countries.java:47
+msgid "Cameroon"
+msgstr ""
+
+#: ../java/build/Countries.java:48
+msgid "China"
+msgstr ""
+
+#: ../java/build/Countries.java:49
+msgid "Colombia"
+msgstr ""
+
+#: ../java/build/Countries.java:50
+msgid "Costa Rica"
+msgstr ""
+
+#: ../java/build/Countries.java:51
+msgid "Serbia and Montenegro"
+msgstr ""
+
+#: ../java/build/Countries.java:52
+msgid "Cuba"
+msgstr ""
+
+#: ../java/build/Countries.java:53
+msgid "Cape Verde"
+msgstr ""
+
+#: ../java/build/Countries.java:54
+msgid "Cyprus"
+msgstr ""
+
+#: ../java/build/Countries.java:55
+msgid "Czech Republic"
+msgstr ""
+
+#: ../java/build/Countries.java:56
+msgid "Germany"
+msgstr ""
+
+#: ../java/build/Countries.java:57
+msgid "Djibouti"
+msgstr ""
+
+#: ../java/build/Countries.java:58
+msgid "Denmark"
+msgstr ""
+
+#: ../java/build/Countries.java:59
+msgid "Dominica"
+msgstr ""
+
+#: ../java/build/Countries.java:60
+msgid "Dominican Republic"
+msgstr ""
+
+#: ../java/build/Countries.java:61
+msgid "Algeria"
+msgstr ""
+
+#: ../java/build/Countries.java:62
+msgid "Ecuador"
+msgstr ""
+
+#: ../java/build/Countries.java:63
+msgid "Estonia"
+msgstr ""
+
+#: ../java/build/Countries.java:64
+msgid "Egypt"
+msgstr ""
+
+#: ../java/build/Countries.java:65
+msgid "Eritrea"
+msgstr ""
+
+#: ../java/build/Countries.java:66
+msgid "Spain"
+msgstr ""
+
+#: ../java/build/Countries.java:67
+msgid "Ethiopia"
+msgstr ""
+
+#: ../java/build/Countries.java:68
+msgid "Finland"
+msgstr ""
+
+#: ../java/build/Countries.java:69
+msgid "Fiji"
+msgstr ""
+
+#: ../java/build/Countries.java:70
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#: ../java/build/Countries.java:71
+msgid "Federated States of Micronesia"
+msgstr ""
+
+#: ../java/build/Countries.java:72
+msgid "Faroe Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:73
+msgid "France"
+msgstr ""
+
+#: ../java/build/Countries.java:74
+msgid "Gabon"
+msgstr ""
+
+#: ../java/build/Countries.java:75
+msgid "United Kingdom"
+msgstr ""
+
+#: ../java/build/Countries.java:76
+msgid "Grenada"
+msgstr ""
+
+#: ../java/build/Countries.java:77
+msgid "Georgia"
+msgstr ""
+
+#: ../java/build/Countries.java:78
+msgid "French Guiana"
+msgstr ""
+
+#: ../java/build/Countries.java:79
+msgid "Ghana"
+msgstr ""
+
+#: ../java/build/Countries.java:80
+msgid "Gibraltar"
+msgstr ""
+
+#: ../java/build/Countries.java:81
+msgid "Greenland"
+msgstr ""
+
+#: ../java/build/Countries.java:82
+msgid "Gambia"
+msgstr ""
+
+#: ../java/build/Countries.java:83
+msgid "Guinea"
+msgstr ""
+
+#: ../java/build/Countries.java:84
+msgid "Guadeloupe"
+msgstr ""
+
+#: ../java/build/Countries.java:85
+msgid "Equatorial Guinea"
+msgstr ""
+
+#: ../java/build/Countries.java:86
+msgid "Greece"
+msgstr ""
+
+#: ../java/build/Countries.java:87
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:88
+msgid "Guatemala"
+msgstr ""
+
+#: ../java/build/Countries.java:89
+msgid "Guam"
+msgstr ""
+
+#: ../java/build/Countries.java:90
+msgid "Guinea-Bissau"
+msgstr ""
+
+#: ../java/build/Countries.java:91
+msgid "Guyana"
+msgstr ""
+
+#: ../java/build/Countries.java:92
+msgid "Hong Kong"
+msgstr ""
+
+#: ../java/build/Countries.java:93
+msgid "Honduras"
+msgstr ""
+
+#: ../java/build/Countries.java:94
+msgid "Croatia"
+msgstr ""
+
+#: ../java/build/Countries.java:95
+msgid "Haiti"
+msgstr ""
+
+#: ../java/build/Countries.java:96
+msgid "Hungary"
+msgstr ""
+
+#: ../java/build/Countries.java:97
+msgid "Indonesia"
+msgstr ""
+
+#: ../java/build/Countries.java:98
+msgid "Ireland"
+msgstr ""
+
+#: ../java/build/Countries.java:99
+msgid "Israel"
+msgstr ""
+
+#: ../java/build/Countries.java:101
+msgid "India"
+msgstr ""
+
+#: ../java/build/Countries.java:102
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#: ../java/build/Countries.java:103
+msgid "Iraq"
+msgstr ""
+
+#: ../java/build/Countries.java:104
+msgid "Islamic Republic of Iran"
+msgstr ""
+
+#: ../java/build/Countries.java:105
+msgid "Iceland"
+msgstr ""
+
+#: ../java/build/Countries.java:106
+msgid "Italy"
+msgstr ""
+
+#: ../java/build/Countries.java:108
+msgid "Jamaica"
+msgstr ""
+
+#: ../java/build/Countries.java:109
+msgid "Jordan"
+msgstr ""
+
+#: ../java/build/Countries.java:110
+msgid "Japan"
+msgstr ""
+
+#: ../java/build/Countries.java:111
+msgid "Kenya"
+msgstr ""
+
+#: ../java/build/Countries.java:112
+msgid "Kyrgyzstan"
+msgstr ""
+
+#: ../java/build/Countries.java:113
+msgid "Cambodia"
+msgstr ""
+
+#: ../java/build/Countries.java:114
+msgid "Kiribati"
+msgstr ""
+
+#: ../java/build/Countries.java:115
+msgid "Comoros"
+msgstr ""
+
+#: ../java/build/Countries.java:116
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#: ../java/build/Countries.java:117
+msgid "Republic of Korea"
+msgstr ""
+
+#: ../java/build/Countries.java:118
+msgid "Kuwait"
+msgstr ""
+
+#: ../java/build/Countries.java:119
+msgid "Cayman Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:120
+msgid "Kazakhstan"
+msgstr ""
+
+#: ../java/build/Countries.java:121
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#: ../java/build/Countries.java:122
+msgid "Lebanon"
+msgstr ""
+
+#: ../java/build/Countries.java:123
+msgid "Saint Lucia"
+msgstr ""
+
+#: ../java/build/Countries.java:124
+msgid "Liechtenstein"
+msgstr ""
+
+#: ../java/build/Countries.java:125
+msgid "Sri Lanka"
+msgstr ""
+
+#: ../java/build/Countries.java:126
+msgid "Liberia"
+msgstr ""
+
+#: ../java/build/Countries.java:127
+msgid "Lesotho"
+msgstr ""
+
+#: ../java/build/Countries.java:128
+msgid "Lithuania"
+msgstr ""
+
+#: ../java/build/Countries.java:129
+msgid "Luxembourg"
+msgstr ""
+
+#: ../java/build/Countries.java:130
+msgid "Latvia"
+msgstr ""
+
+#: ../java/build/Countries.java:131
+msgid "Libyan Arab Jamahiriya"
+msgstr ""
+
+#: ../java/build/Countries.java:132
+msgid "Morocco"
+msgstr ""
+
+#: ../java/build/Countries.java:133
+msgid "Monaco"
+msgstr ""
+
+#: ../java/build/Countries.java:134
+msgid "Republic of Moldova"
+msgstr ""
+
+#: ../java/build/Countries.java:137
+msgid "Madagascar"
+msgstr ""
+
+#: ../java/build/Countries.java:138
+msgid "Marshall Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:139
+msgid "The Former Yugoslav Republic of Macedonia"
+msgstr ""
+
+#: ../java/build/Countries.java:140
+msgid "Mali"
+msgstr ""
+
+#: ../java/build/Countries.java:141
+msgid "Myanmar"
+msgstr ""
+
+#: ../java/build/Countries.java:142
+msgid "Mongolia"
+msgstr ""
+
+#: ../java/build/Countries.java:143
+msgid "Macao"
+msgstr ""
+
+#: ../java/build/Countries.java:144
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:145
+msgid "Martinique"
+msgstr ""
+
+#: ../java/build/Countries.java:146
+msgid "Mauritania"
+msgstr ""
+
+#: ../java/build/Countries.java:147
+msgid "Montserrat"
+msgstr ""
+
+#: ../java/build/Countries.java:148
+msgid "Malta"
+msgstr ""
+
+#: ../java/build/Countries.java:149
+msgid "Mauritius"
+msgstr ""
+
+#: ../java/build/Countries.java:150
+msgid "Maldives"
+msgstr ""
+
+#: ../java/build/Countries.java:151
+msgid "Malawi"
+msgstr ""
+
+#: ../java/build/Countries.java:152
+msgid "Mexico"
+msgstr ""
+
+#: ../java/build/Countries.java:153
+msgid "Malaysia"
+msgstr ""
+
+#: ../java/build/Countries.java:154
+msgid "Mozambique"
+msgstr ""
+
+#: ../java/build/Countries.java:155
+msgid "Namibia"
+msgstr ""
+
+#: ../java/build/Countries.java:156
+msgid "New Caledonia"
+msgstr ""
+
+#: ../java/build/Countries.java:157
+msgid "Niger"
+msgstr ""
+
+#: ../java/build/Countries.java:158
+msgid "Norfolk Island"
+msgstr ""
+
+#: ../java/build/Countries.java:159
+msgid "Nigeria"
+msgstr ""
+
+#: ../java/build/Countries.java:160
+msgid "Nicaragua"
+msgstr ""
+
+#: ../java/build/Countries.java:161
+msgid "Netherlands"
+msgstr ""
+
+#: ../java/build/Countries.java:162
+msgid "Norway"
+msgstr ""
+
+#: ../java/build/Countries.java:163
+msgid "Nepal"
+msgstr ""
+
+#: ../java/build/Countries.java:164
+msgid "Nauru"
+msgstr ""
+
+#: ../java/build/Countries.java:165
+msgid "Niue"
+msgstr ""
+
+#: ../java/build/Countries.java:166
+msgid "New Zealand"
+msgstr ""
+
+#: ../java/build/Countries.java:167
+msgid "Oman"
+msgstr ""
+
+#: ../java/build/Countries.java:168
+msgid "Panama"
+msgstr ""
+
+#: ../java/build/Countries.java:169
+msgid "Peru"
+msgstr ""
+
+#: ../java/build/Countries.java:170
+msgid "French Polynesia"
+msgstr ""
+
+#: ../java/build/Countries.java:171
+msgid "Papua New Guinea"
+msgstr ""
+
+#: ../java/build/Countries.java:172
+msgid "Philippines"
+msgstr ""
+
+#: ../java/build/Countries.java:173
+msgid "Pakistan"
+msgstr ""
+
+#: ../java/build/Countries.java:174
+msgid "Poland"
+msgstr ""
+
+#: ../java/build/Countries.java:175
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#: ../java/build/Countries.java:176
+msgid "Puerto Rico"
+msgstr ""
+
+#: ../java/build/Countries.java:177
+msgid "Palestinian Territory"
+msgstr ""
+
+#: ../java/build/Countries.java:178
+msgid "Portugal"
+msgstr ""
+
+#: ../java/build/Countries.java:179
+msgid "Palau"
+msgstr ""
+
+#: ../java/build/Countries.java:180
+msgid "Paraguay"
+msgstr ""
+
+#: ../java/build/Countries.java:181
+msgid "Qatar"
+msgstr ""
+
+#: ../java/build/Countries.java:182
+msgid "Reunion"
+msgstr ""
+
+#: ../java/build/Countries.java:183
+msgid "Romania"
+msgstr ""
+
+#: ../java/build/Countries.java:184
+msgid "Serbia"
+msgstr ""
+
+#: ../java/build/Countries.java:185
+msgid "Russian Federation"
+msgstr ""
+
+#: ../java/build/Countries.java:186
+msgid "Rwanda"
+msgstr ""
+
+#: ../java/build/Countries.java:187
+msgid "Saudi Arabia"
+msgstr ""
+
+#: ../java/build/Countries.java:188
+msgid "Solomon Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:189
+msgid "Seychelles"
+msgstr ""
+
+#: ../java/build/Countries.java:190
+msgid "Sudan"
+msgstr ""
+
+#: ../java/build/Countries.java:191
+msgid "Sweden"
+msgstr ""
+
+#: ../java/build/Countries.java:192
+msgid "Singapore"
+msgstr ""
+
+#: ../java/build/Countries.java:193
+msgid "Slovenia"
+msgstr ""
+
+#: ../java/build/Countries.java:194
+msgid "Slovakia"
+msgstr ""
+
+#: ../java/build/Countries.java:195
+msgid "Sierra Leone"
+msgstr ""
+
+#: ../java/build/Countries.java:196
+msgid "San Marino"
+msgstr ""
+
+#: ../java/build/Countries.java:197
+msgid "Senegal"
+msgstr ""
+
+#: ../java/build/Countries.java:198
+msgid "Somalia"
+msgstr ""
+
+#: ../java/build/Countries.java:199
+msgid "Suriname"
+msgstr ""
+
+#: ../java/build/Countries.java:200
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#: ../java/build/Countries.java:201
+msgid "El Salvador"
+msgstr ""
+
+#: ../java/build/Countries.java:202
+msgid "Syrian Arab Republic"
+msgstr ""
+
+#: ../java/build/Countries.java:203
+msgid "Swaziland"
+msgstr ""
+
+#: ../java/build/Countries.java:204
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:205
+msgid "Chad"
+msgstr ""
+
+#: ../java/build/Countries.java:206
+msgid "French Southern Territories"
+msgstr ""
+
+#: ../java/build/Countries.java:207
+msgid "Togo"
+msgstr ""
+
+#: ../java/build/Countries.java:208
+msgid "Thailand"
+msgstr ""
+
+#: ../java/build/Countries.java:209
+msgid "Tajikistan"
+msgstr ""
+
+#: ../java/build/Countries.java:210
+msgid "Tokelau"
+msgstr ""
+
+#: ../java/build/Countries.java:211
+msgid "Timor-Leste"
+msgstr ""
+
+#: ../java/build/Countries.java:212
+msgid "Turkmenistan"
+msgstr ""
+
+#: ../java/build/Countries.java:213
+msgid "Tunisia"
+msgstr ""
+
+#: ../java/build/Countries.java:214
+msgid "Tonga"
+msgstr ""
+
+#: ../java/build/Countries.java:215
+msgid "Turkey"
+msgstr ""
+
+#: ../java/build/Countries.java:216
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#: ../java/build/Countries.java:217
+msgid "Tuvalu"
+msgstr ""
+
+#: ../java/build/Countries.java:218
+msgid "Taiwan"
+msgstr ""
+
+#: ../java/build/Countries.java:219
+msgid "United Republic of Tanzania"
+msgstr ""
+
+#: ../java/build/Countries.java:220
+msgid "Ukraine"
+msgstr ""
+
+#: ../java/build/Countries.java:221
+msgid "Uganda"
+msgstr ""
+
+#: ../java/build/Countries.java:222
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:223
+msgid "United States"
+msgstr ""
+
+#: ../java/build/Countries.java:224
+msgid "Uruguay"
+msgstr ""
+
+#: ../java/build/Countries.java:225
+msgid "Uzbekistan"
+msgstr ""
+
+#: ../java/build/Countries.java:226
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#: ../java/build/Countries.java:227
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#: ../java/build/Countries.java:228
+msgid "Venezuela"
+msgstr ""
+
+#: ../java/build/Countries.java:229 ../java/build/Countries.java:230
+msgid "Virgin Islands"
+msgstr ""
+
+#: ../java/build/Countries.java:231
+msgid "Viet Nam"
+msgstr ""
+
+#: ../java/build/Countries.java:232
+msgid "Vanuatu"
+msgstr ""
+
+#: ../java/build/Countries.java:233
+msgid "Wallis and Futuna"
+msgstr ""
+
+#: ../java/build/Countries.java:234
+msgid "Samoa"
+msgstr ""
+
+#: ../java/build/Countries.java:235
+msgid "Yemen"
+msgstr ""
+
+#: ../java/build/Countries.java:236
+msgid "Mayotte"
+msgstr ""
+
+#: ../java/build/Countries.java:237
+msgid "South Africa"
+msgstr ""
+
+#: ../java/build/Countries.java:238
+msgid "Zambia"
+msgstr ""
+
+#: ../java/build/Countries.java:239
+msgid "Zimbabwe"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/CSSHelper.java:60
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37
+#: ../java/strings/Strings.java:29
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:125
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:257
+msgid "I2P Router Console"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:57
+msgid "Error updating the configuration - please see the error logs"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:69
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:266
+msgid "Configuration saved successfully"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:268
+msgid ""
+"Error saving the configuration (applied but not saved) - please see the "
+"error logs"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:355
+msgid "Save Client Configuration"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427
+msgid "Save Interface Configuration"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:441
+msgid "Save WebApp Configuration"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:453
+msgid "Save Plugin Configuration"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461
+msgid "Install Plugin"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87
+#, java-format
+msgid "Deleted plugin {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89
+#, java-format
+msgid "Error deleting plugin {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101
+#, java-format
+msgid "Stopped plugin {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103
+#, java-format
+msgid "Error stopping plugin {0}"
+msgstr ""
+
+#. label (IE)
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255
+msgid "Start"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33
+msgid "Unsupported"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189
+msgid "New client added"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193
+msgid ""
+"Client configuration saved successfully - restart required to take effect."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
+msgid "Bad client index."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:392
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:384
+msgid "Client"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
+msgid "started"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
+msgid "deleted"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240
+msgid "WebApp configuration saved."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256
+msgid "Plugin configuration saved."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+msgid "WebApp"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273
+msgid "Failed to start"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278
+msgid "Failed to find server."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284
+msgid "No plugin URL specified."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294
+#, java-format
+msgid "No update URL specified for {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325
+msgid "Plugin or update download already in progress."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118
+#, java-format
+msgid "Downloading plugin from {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329
+#, java-format
+msgid "Checking plugin {0} for updates"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339
+#, java-format
+msgid "Started plugin {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341
+#, java-format
+msgid "Error starting plugin {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376
+msgid ""
+"Interface configuration saved successfully - restart required to take effect."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258
+msgid "Edit"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351
+msgid "Add Client"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+msgid "Class and arguments"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+msgid "Control"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+msgid "Run at Startup?"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197
+msgid "Description"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+msgid "Plugin"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185
+msgid "Version"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163
+msgid "Signed by"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180
+msgid "Date"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186
+msgid "Author"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202
+msgid "License"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207
+msgid "Website"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212
+msgid "Update link"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260
+msgid "Stop"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331
+msgid "Check for updates"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+msgid "Update"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268
+#, java-format
+msgid "Are you sure you want to delete {0}?"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270
+msgid "Delete"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:343
+msgid "Add key"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:341
+msgid "Delete key"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:21
+msgid "You must enter a destination"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:23
+msgid "You must enter a key"
+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 ""
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34
+msgid "added to keyring"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:36
+msgid "Invalid destination or key"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41
+msgid "removed from keyring"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43
+msgid "not found in keyring"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:45
+msgid "Invalid destination"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:82
+msgid "Log overrides updated"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:160
+msgid "Log configuration saved"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:48
+msgid ""
+"Add additional logging statements above. Example: net.i2p.router.tunnel=WARN"
+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"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:50
+msgid "Valid levels are DEBUG, INFO, WARN, ERROR, CRIT"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
+msgid "CRIT"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
+msgid "DEBUG"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
+msgid "ERROR"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
+msgid "INFO"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
+msgid "WARN"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88
+msgid "Remove"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:125
+msgid "Select a class to add"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:204
+msgid "Network"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+msgid "Service"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381
+#: ../java/strings/Strings.java:72
+msgid "Tunnels"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+msgid "UI"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+msgid "Clients"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315
+msgid "Keyring"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+msgid "Logging"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255
+#: ../java/strings/Strings.java:67
+msgid "Peers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:389
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143
+msgid "Stats"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
+msgid "Advanced"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:397
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:362
+msgid "Save changes"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:121
+msgid "Rechecking router reachability..."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:153
+msgid "Updating IP address"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:171
+msgid "Disabling TCP completely"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:175
+msgid "Updating inbound TCP address to"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:179
+msgid "Disabling inbound TCP"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:181
+msgid "Updating inbound TCP address to auto"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:190
+msgid "Updating inbound TCP port to"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:193
+msgid "Updating inbound TCP port to auto"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205
+msgid "Updating UDP port from"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205
+msgid "to"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:221
+msgid "Gracefully restarting into Hidden Router Mode"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:223
+msgid "Gracefully restarting to exit Hidden Router Mode"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:232
+msgid "Enabling UPnP, restart required to take effect"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:234
+msgid "Disabling UPnP, restart required to take effect"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:242
+msgid "Enabling laptop mode"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:244
+msgid "Disabling laptop mode"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:250
+msgid "Requiring SSU introducers"
+msgstr ""
+
+#. There's a few changes that don't really require restart (e.g. enabling inbound TCP)
+#. But it would be hard to get right, so just do a restart.
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:291
+msgid "Gracefully restarting I2P to change published router address"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:314
+msgid "Updating bandwidth share percentage"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:397
+msgid "Updated bandwidth limits"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62
+msgid "unknown"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172
+msgid "bits per second"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173
+#, java-format
+msgid "or {0} bytes per month maximum"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:333
+msgid "Ban peer until restart"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:23
+#, java-format
+msgid "Manually banned via {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
+msgid "banned until restart"
+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 ""
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335
+msgid "Unban peer"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
+msgid "unbanned"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
+msgid "is not currently banned"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:361
+msgid "Adjust peer bonuses"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47
+msgid "Bad speed value"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:52
+msgid "Bad capacity value"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:368
+msgid "Save changes and reseed now"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21
+msgid "Reseeding is already in progress"
+msgstr ""
+
+#. skip the nonce checking in ReseedHandler
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24
+msgid "Starting reseed process"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66
+msgid "Configuration saved successfully."
+msgstr ""
+
+#. Normal browsers send value, IE sends button label
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:311
+msgid "Shutdown immediately"
+msgstr ""
+
+#. ctx.router().shutdown(Router.EXIT_HARD); // never returns
+#. give the UI time to respond
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:36
+msgid "Cancel shutdown"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:37
+msgid "Cancel restart"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:39
+msgid "Restart immediately"
+msgstr ""
+
+#. ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns
+#. give the UI time to respond
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:43
+msgid "Restart"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:46
+msgid "Shutdown"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:59
+msgid "Restart imminent"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:61
+msgid "Shutdown imminent"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:65
+#, java-format
+msgid "Shutdown in {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:70
+#, java-format
+msgid "Restart in {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309
+msgid "Shutdown gracefully"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:56
+msgid "Graceful shutdown initiated"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:60
+msgid "Shutdown immediately!  boom bye bye bad bwoy"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:313
+msgid "Cancel graceful shutdown"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:63
+msgid "Graceful shutdown cancelled"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325
+msgid "Graceful restart"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:67
+msgid "Graceful restart requested"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327
+msgid "Hard restart"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:71
+msgid "Hard restart requested"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:72
+msgid "Rekey and Restart"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:73
+msgid "Rekeying after graceful restart"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:76
+msgid "Rekey and Shutdown"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:77
+msgid "Rekeying after graceful shutdown"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353
+msgid "Run I2P on startup"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355
+msgid "Don't run I2P on startup"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:373
+msgid "Dump threads"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:381
+msgid "View console on startup"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93
+msgid "Console is to be shown on startup"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:383
+msgid "Do not view console on startup"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
+msgid "Console is not to be shown on startup"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105
+msgid "Service installed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107
+msgid "Warning: unable to install the service"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
+msgid "Service removed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
+msgid "Warning: unable to remove the service"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:111
+msgid "Stat filter and location updated successfully to"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:113
+msgid "Failed to update the stat filter and location"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:114
+msgid ""
+"Graph list updated, may take up to 60s to be reflected here and on the <a "
+"href=\"graphs.jsp\">Graphs Page</a>"
+msgstr ""
+
+#. the count isn't really correct anyway, since we don't check for actual changes
+#. addFormNotice("Updated settings for " + updated + " pools.");
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:135
+msgid "Updated settings for all pools."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:140
+msgid "Exploratory tunnel configuration saved successfully."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:36
+msgid ""
+"Error saving the configuration (applied but not saved) - please see the "
+"error logs."
+msgstr ""
+
+#. * dummies for translation
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14
+#, java-format
+msgid "1 hop"
+msgid_plural "{0} hops"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:15
+#, java-format
+msgid "1 tunnel"
+msgid_plural "{0} tunnels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
+msgid "Exploratory tunnels"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:51
+#, java-format
+msgid "Client tunnels for {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
+msgid "ANONYMITY WARNING - Settings include 0-hop tunnels."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:79
+msgid "ANONYMITY WARNING - Settings include 1-hop tunnels."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+msgid "PERFORMANCE WARNING - Settings include very long tunnels."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:85
+msgid "PERFORMANCE WARNING - Settings include high tunnel quantities."
+msgstr ""
+
+#. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n");
+#. tunnel depth
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:92
+msgid "Length"
+msgstr ""
+
+#. tunnel depth variance
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:109
+msgid "Randomization"
+msgstr ""
+
+#. tunnel quantity
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:133
+msgid "Quantity"
+msgstr ""
+
+#. tunnel backup quantity
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:150
+msgid "Backup quantity"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:172
+msgid "Inbound options"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:185
+msgid "Outbound options"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:31
+msgid "Theme change saved."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:33
+msgid "Refresh the page to view."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+msgid "Arabic"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+msgid "English"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+msgid "French"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+msgid "German"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+msgid "Spanish"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+msgid "Dutch"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+msgid "Portuguese"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+msgid "Russian"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
+msgid "Chinese"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
+msgid "Swedish"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:85
+msgid "Update available, attempting to download now"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:87
+msgid "Update available, click button on left to download"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:93
+msgid "No update available"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:101
+msgid "Updating news URL to"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:109
+msgid "Updating proxy host to"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:117
+msgid "Updating proxy port to"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:130
+msgid "Updating refresh frequency to"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:137
+msgid "Updating update policy to"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:146
+msgid "Updating update URLs."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:155
+msgid "Updating trusted keys."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:163
+msgid "Updating unsigned update URL to"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88
+#: ../java/src/net/i2p/router/web/GraphHelper.java:167
+msgid "Never"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:90
+msgid "Every"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:108
+msgid "Notify only"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:115
+msgid "Download and verify only"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:123
+msgid "Download, verify, and restart"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/FormHandler.java:176
+msgid ""
+"Invalid form submission, probably because you used the 'back' or 'reload' "
+"button on your browser. Please resubmit."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:93
+msgid "Combined bandwidth graph"
+msgstr ""
+
+#. e.g. "statname for 60m"
+#: ../java/src/net/i2p/router/web/GraphHelper.java:107
+#, java-format
+msgid "{0} for {1}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:146
+msgid "Configure Graph Display"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:146
+msgid "Select Stats"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:150
+msgid "Periods"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:151
+msgid "Plot averages"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:152
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:351
+msgid "or"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:152
+msgid "plot events"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:153
+msgid "Image sizes"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:153
+msgid "width"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:154
+msgid "height"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:154
+#: ../java/src/net/i2p/router/web/GraphHelper.java:155
+msgid "pixels"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:156
+msgid "Refresh delay"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:171
+msgid "Redraw"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:203
+msgid "Graph settings saved"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/LogsHelper.java:13
+#: ../java/src/net/i2p/router/web/LogsHelper.java:37
+msgid "File location"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/LogsHelper.java:34
+msgid "File not found"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/LogsHelper.java:52
+msgid "No log messages"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:80
+msgid "Network Database RouterInfo Lookup"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95
+#: ../java/strings/Strings.java:68
+msgid "Router"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95
+msgid "not found in network database"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215
+msgid "Network Database Contents"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108
+msgid "View RouterInfo"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:109
+msgid "LeaseSets"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:131
+msgid "LeaseSet"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:133
+msgid "Local"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135
+msgid "Unpublished"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:136
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:143
+msgid "Destination"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:153
+#, java-format
+msgid "Expires in {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:155
+#, java-format
+msgid "Expired {0} ago"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+msgid "Gateway"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167
+msgid "Lease"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:169
+msgid "Tunnel"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215
+msgid "View LeaseSets"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:217
+msgid "Not initialized"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:226
+msgid "Routers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:228
+msgid "Show all routers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:230
+msgid "Show all routers with full stats"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266
+msgid "Network Database Router Statistics"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
+msgid "Count"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
+msgid "Transports"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
+msgid "Country"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
+msgid "Our info"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346
+msgid "Peer info for"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350
+msgid "Full entry"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:115
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
+msgid "Hidden"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
+msgid "Updated"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360
+#, java-format
+msgid "{0} ago"
+msgstr ""
+
+#. shouldnt happen
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
+msgid "Published"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365
+msgid "Address(es)"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378
+msgid "cost"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+msgid "Hidden or starting up"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+msgid "SSU"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+msgid "SSU with introducers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
+msgid "NTCP"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
+msgid "NTCP and SSU"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
+msgid "NTCP and SSU with introducers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:92
+#, java-format
+msgid "News last updated {0} ago."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:98
+#, java-format
+msgid "News last checked {0} ago."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:77
+#, java-format
+msgid "Cannot check, plugin {0} is not installed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:129
+#, java-format
+msgid "Checking for update of plugin {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:154
+#, java-format
+msgid "New plugin version {0} is available"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:156
+#, java-format
+msgid "No new version is available for plugin {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:165
+#, java-format
+msgid "Update check failed for plugin {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:139
+msgid "Downloading plugin"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:245
+#, java-format
+msgid "{0}B transferred"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153
+msgid "Plugin downloaded"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356
+#, java-format
+msgid "Cannot create plugin directory {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:299
+#, java-format
+msgid "from {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177
+#, java-format
+msgid "Plugin from {0} is corrupt"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188
+#, java-format
+msgid "Plugin from {0} does not contain the required configuration file"
+msgstr ""
+
+#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201
+#, java-format
+msgid "Plugin from {0} contains an invalid key"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249
+#, java-format
+msgid "Plugin signature verification of {0} failed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264
+#, java-format
+msgid "Plugin from {0} has invalid name or version"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269
+#, java-format
+msgid "Plugin {0} has mismatched versions"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277
+#, java-format
+msgid "This plugin requires I2P version {0} or higher"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285
+#, java-format
+msgid "This plugin requires Java version {0} or higher"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
+msgid ""
+"Downloaded plugin is for new installs only, but the plugin is already "
+"installed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305
+msgid "Installed plugin does not contain the required configuration file"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313
+msgid "Signature of downloaded plugin does not match installed plugin"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320
+#, java-format
+msgid "Downloaded plugin version {0} is not newer than installed plugin"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327
+#, java-format
+msgid "Plugin update requires installed plugin version {0} or higher"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334
+#, java-format
+msgid "Plugin update requires installed plugin version {0} or lower"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351
+msgid "Plugin is for upgrades only, but the plugin is not installed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364
+#, java-format
+msgid "Failed to install plugin in {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371
+#, java-format
+msgid "Plugin {0} installed, router restart required"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373
+#, java-format
+msgid "Plugin {0} installed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391
+#, java-format
+msgid "Plugin {0} installed and started"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394
+#, java-format
+msgid "Plugin {0} installed but failed to start, check logs"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396
+#, java-format
+msgid "Plugin {0} installed but failed to start"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406
+#, java-format
+msgid "Failed to download plugin from {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:72
+msgid "Peer Profiles"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73
+#, java-format
+msgid "Showing 1 recent profile."
+msgid_plural "Showing {0} recent profiles."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75
+#, java-format
+msgid "Hiding 1 older profile."
+msgid_plural "Hiding {0} older profiles."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77
+#, java-format
+msgid "Hiding 1 standard profile."
+msgid_plural "Hiding {0} standard profiles."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82
+msgid "Groups (Caps)"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:353
+msgid "Speed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:357
+msgid "Capacity"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
+msgid "Integration"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:86
+msgid "Status"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:126
+msgid "Fast, High Capacity"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:127
+msgid "High Capacity"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:128
+msgid "Standard"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:129
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:163
+msgid "Failing"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282
+msgid "Integrated"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:164
+msgid "Unreachable"
+msgstr ""
+
+#. hide if < 10%
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171
+msgid "Test Fails"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177
+msgid "profile"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186
+msgid "Floodfill and Integrated Peers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
+msgid "Caps"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
+msgid "Integ. Value"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
+msgid "Last Heard About"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
+msgid "Last Heard From"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
+msgid "Last Good Send"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
+msgid "Last Bad Send"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
+msgid "10m Resp. Time"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
+msgid "1h Resp. Time"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
+msgid "1d Resp. Time"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
+msgid "Last Good Lookup"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
+msgid "Last Bad Lookup"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
+msgid "Last Good Store"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
+msgid "Last Bad Store"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203
+msgid "1h Fail Rate"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204
+msgid "1d Fail Rate"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
+msgid "Thresholds"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
+msgid "fast peers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
+msgid "high capacity peers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
+msgid " well integrated peers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+msgid "as determined by the profile organizer"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+msgid "groups"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+msgid "capabilities in the netDb, not used to determine profiles"
+msgstr ""
+
+#. capabilities
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#: ../java/strings/Strings.java:81
+msgid "caps"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+msgid ""
+"peak throughput (bytes per second) over a 1 minute period that the peer has "
+"sustained in a single tunnel"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+msgid "speed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+msgid "capacity"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+msgid "how many tunnels can we ask them to join in an hour?"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+msgid "how many new peers have they told us about lately?"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+msgid "integration"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
+msgid "is the peer banned, or unreachable, or failing tunnel tests?"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
+msgid "status"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:410
+msgid "none"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:62
+#, java-format
+msgid "Temporary ban expiring in {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64
+#, java-format
+msgid "Banned until restart or in {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:76
+msgid "unban now"
+msgstr ""
+
+#. Note to translators: all runtime zh translation disabled in this file, no font available in RRD
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:223
+msgid "Bandwidth usage"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:230
+msgid "Outbound bytes/sec"
+msgstr ""
+
+#. def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3);
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:232
+msgid "Inbound bytes/sec"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:235
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:236
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:237
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:238
+msgid "bytes/sec"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:235
+msgid "out average"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:236
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:238
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:115
+msgid "max"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:237
+msgid "in average"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:57
+msgid "GO"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:60
+msgid "Statistics gathered during this router's uptime"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:63
+msgid ""
+"The data gathered is quantized over a 1 minute period, so should just be "
+"used as an estimate."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:64
+msgid "These statistics are primarily used for development and debugging."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:106
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:157
+msgid "No lifetime events"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:117
+msgid "frequency"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:121
+msgid "Rolling average events per period"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:125
+msgid "Highest events per period"
+msgstr ""
+
+#. 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(num(curFreq.getMinAverageInterval())).append("ms)");
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:136
+msgid "Lifetime average events per period"
+msgstr ""
+
+#. Display the strict average
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:141
+msgid "Lifetime average frequency"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:144
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:234
+#, java-format
+msgid "1 event"
+msgid_plural "{0} events"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:169
+msgid "rate"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:171
+msgid "Average"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:174
+msgid "Highest average"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:201
+#, java-format
+msgid "There was 1 event in this period."
+msgid_plural "There were {0} events in this period."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:203
+#, java-format
+msgid "The period ended {0} ago."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:205
+msgid "No events"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:211
+msgid "Average event count"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:213
+msgid "Events in peak period"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:221
+msgid "Graph Data"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:223
+msgid "Graph Event Count"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:226
+msgid "Export Data as XML"
+msgstr ""
+
+#. Display the strict average
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:231
+msgid "Lifetime average value"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:41
+msgid "I2P Router Help &amp; FAQ"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:43
+msgid "Help &amp; FAQ"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:55
+msgid ""
+"Configure startup of clients and webapps (services); manually start dormant "
+"services"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:57
+msgid "I2P Services"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:63
+msgid "Manage your I2P hosts file here (I2P domain name resolution)"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:65
+msgid "Addressbook"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:69
+msgid "Built-in anonymous BitTorrent Client"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:71
+msgid "Torrents"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:75
+msgid "Anonymous webmail client"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:77
+msgid "Webmail"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:81
+msgid "Anonymous resident webserver"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:83
+msgid "Webserver"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:91
+msgid "Configure I2P Router"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:93
+msgid "I2P Internals"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379
+msgid "View existing tunnels and tunnel build status"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253
+msgid "Show all current peer connections"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:111
+msgid "Show recent peer performance profiles"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:113
+msgid "Profiles"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:117
+msgid "Show list of all known I2P routers"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:119
+msgid "NetDB"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123
+msgid "Health Report"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:125
+msgid "Logs"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:135
+msgid "Graph router performance"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:137
+msgid "Graphs"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141
+msgid "Textual router performance statistics"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:370
+msgid "Local Destinations"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149
+#: ../java/strings/Strings.java:62
+msgid "I2PTunnel"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164
+msgid "I2P Router Help"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166
+msgid "General"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171
+msgid "Local Identity"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:175
+msgid "Your unique I2P router identity is"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:179
+msgid "never reveal it to anyone"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:181
+msgid "show"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:192
+msgid "How long we've been running for this session"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:195
+msgid "Uptime"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202
+msgid ""
+"Help with configuring your firewall and router for optimal I2P performance"
+msgstr ""
+
+#. Note to translators: parameter is a version, e.g. "0.8.4"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:232
+#, java-format
+msgid "Download {0} Update"
+msgstr ""
+
+#. Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC"
+#. <br> is optional, to help the browser make the lines even in the button
+#. If the translation is shorter than the English, you should probably not include <br>
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240
+#, java-format
+msgid "Download Unsigned<br>Update {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261
+msgid "Active"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270
+msgid "Fast"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276
+msgid "High capacity"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288
+msgid "Known"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303
+msgid "Help with firewall configuration"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:305
+msgid "Check NAT/firewall"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:325
+msgid "Reseed"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:342
+msgid "Configure router bandwidth allocation"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:344
+msgid "Bandwidth in/out"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:364
+msgid "Total"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:371
+msgid "Used"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386
+msgid "Exploratory"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398
+msgid "Participating"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404
+msgid "Share ratio"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:410
+msgid "What's in the router's job queue?"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412
+msgid "Congestion"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417
+msgid "Job lag"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:423
+msgid "Message delay"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:429
+msgid "Tunnel lag"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435
+msgid "Backlog"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:106
+msgid "ERR-Client Manager I2CP Error - check logs"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:113
+#, java-format
+msgid "ERR-Clock Skew of {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:122
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
+msgid "OK"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:123
+msgid "ERR-Private TCP Address"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:125
+msgid "ERR-SymmetricNAT"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:128
+msgid "WARN-Firewalled with Inbound TCP Enabled"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:130
+msgid "WARN-Firewalled and Floodfill"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:132
+msgid "WARN-Firewalled and Fast"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:133
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
+msgid "Firewalled"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:135
+msgid ""
+"ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and "
+"restart"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:141
+msgid "ERR-No Active Peers, Check Network Connection and Firewall"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:144
+msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:146
+msgid "WARN-Firewalled with UDP Disabled"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
+msgid "Testing"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:370
+msgid "Add/remove/edit &amp; control your client and server tunnels"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:382
+msgid "Server"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:386
+msgid "Show tunnels"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:397
+msgid "Leases expired"
+msgstr ""
+
+#. red or yellow light
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:397
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:398
+msgid "Rebuilding"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:398
+msgid "ago"
+msgstr ""
+
+#. green light
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:401
+msgid "Ready"
+msgstr ""
+
+#. yellow light
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
+msgid "Building"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
+msgid "Building tunnels"
+msgstr ""
+
+#. tunnel nicknames, taken from i2ptunnel.config so they will display
+#. nicely under 'local destinations' in the summary bar
+#. note that if the wording changes in i2ptunnel.config, we have to
+#. keep the old string here as well for existing installs
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:421
+#: ../java/strings/Strings.java:36
+msgid "shared clients"
+msgstr ""
+
+#. Note to translators: all runtime zh translation disabled in this file, no font available in RRD
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:89
+#, java-format
+msgid "events in {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:91
+#, java-format
+msgid "averaged for {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:101
+msgid "Events per period"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:114
+msgid "avg"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:116
+msgid "now"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:63
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:309
+msgid "configure"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61
+msgid "Client tunnels for"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:65
+msgid "dead"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:71
+msgid "Participating tunnels"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:72
+msgid "From"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:72
+msgid "Receive on"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
+msgid "Expiration"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
+msgid "Send on"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
+msgid "To"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74
+msgid "Rate"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74
+msgid "Role"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+msgid "Usage"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:107
+msgid "grace period"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:117
+msgid "Outbound Endpoint"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:119
+msgid "Inbound Gateway"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:121
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:162
+msgid "Participant"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:126
+msgid "Inactive participating tunnels"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:127
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:218
+msgid "Lifetime bandwidth usage"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+msgid "Expiry"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:159
+msgid "Participants"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:165
+msgid "Endpoint"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:205
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:212
+msgid "Build in progress"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:205
+msgid "inbound"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:212
+msgid "outbound"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:217
+msgid "No tunnels; waiting for the grace period to end."
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:219
+msgid "in"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:220
+msgid "out"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:237
+msgid "Tunnel Counts By Peer"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
+msgid "% of total"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
+msgid "Our Tunnels"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
+msgid "Participating Tunnels"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:256
+msgid "Totals"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:143
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:238
+msgid "Updating"
+msgstr ""
+
+#. Process the .sud/.su2 file
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:117
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:262
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:287
+msgid "Update downloaded"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:92
+#, java-format
+msgid "Unsigned update file from {0} is corrupt"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:282
+msgid "Restarting"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:119
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:289
+msgid "Click Restart to install"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:291
+msgid "Click Shutdown and restart to install"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:122
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:293
+#, java-format
+msgid "Version {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:127
+#, java-format
+msgid "Failed copy to {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:185
+#, java-format
+msgid "Updating from {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:254
+#, java-format
+msgid "No new version found at {0}"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:282
+msgid "Update verified"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:308
+#, java-format
+msgid "Transfer failed from {0}"
+msgstr ""
+
+#. wars for ConfigClientsHelper
+#: ../java/strings/Strings.java:12
+msgid "addressbook"
+msgstr ""
+
+#: ../java/strings/Strings.java:13
+msgid "i2psnark"
+msgstr ""
+
+#: ../java/strings/Strings.java:14
+msgid "i2ptunnel"
+msgstr ""
+
+#: ../java/strings/Strings.java:15
+msgid "susimail"
+msgstr ""
+
+#: ../java/strings/Strings.java:16
+msgid "susidns"
+msgstr ""
+
+#: ../java/strings/Strings.java:17
+msgid "routerconsole"
+msgstr ""
+
+#. clients, taken from clients.config, for ConfigClientsHelper
+#. note that if the wording changes in clients.config, we have to
+#. keep the old string here as well for existing installs
+#: ../java/strings/Strings.java:22
+msgid "Web console"
+msgstr ""
+
+#: ../java/strings/Strings.java:23
+msgid "SAM application bridge"
+msgstr ""
+
+#: ../java/strings/Strings.java:24
+msgid "Application tunnels"
+msgstr ""
+
+#: ../java/strings/Strings.java:25
+msgid "My eepsite web server"
+msgstr ""
+
+#: ../java/strings/Strings.java:26
+msgid "I2P webserver (eepsite)"
+msgstr ""
+
+#: ../java/strings/Strings.java:27
+msgid "Browser launch at startup"
+msgstr ""
+
+#: ../java/strings/Strings.java:28
+msgid "BOB application bridge"
+msgstr ""
+
+#: ../java/strings/Strings.java:30
+msgid "Open Router Console in web browser at startup"
+msgstr ""
+
+#: ../java/strings/Strings.java:37
+msgid "IRC proxy"
+msgstr ""
+
+#: ../java/strings/Strings.java:38
+msgid "eepsite"
+msgstr ""
+
+#: ../java/strings/Strings.java:39
+msgid "I2P webserver"
+msgstr ""
+
+#: ../java/strings/Strings.java:40
+msgid "HTTP Proxy"
+msgstr ""
+
+#. older names for pre-0.7.4 installs
+#: ../java/strings/Strings.java:42
+msgid "eepProxy"
+msgstr ""
+
+#: ../java/strings/Strings.java:43
+msgid "ircProxy"
+msgstr ""
+
+#. hardcoded in i2psnark
+#: ../java/strings/Strings.java:45
+msgid "I2PSnark"
+msgstr ""
+
+#. hardcoded in iMule?
+#: ../java/strings/Strings.java:47
+msgid "iMule"
+msgstr ""
+
+#. standard themes for ConfigUIHelper
+#: ../java/strings/Strings.java:51
+msgid "classic"
+msgstr ""
+
+#: ../java/strings/Strings.java:52
+msgid "dark"
+msgstr ""
+
+#: ../java/strings/Strings.java:53
+msgid "light"
+msgstr ""
+
+#: ../java/strings/Strings.java:54
+msgid "midnight"
+msgstr ""
+
+#. stat groups for stats.jsp
+#: ../java/strings/Strings.java:57
+msgid "Bandwidth"
+msgstr ""
+
+#: ../java/strings/Strings.java:58
+msgid "BandwidthLimiter"
+msgstr ""
+
+#: ../java/strings/Strings.java:59
+msgid "ClientMessages"
+msgstr ""
+
+#: ../java/strings/Strings.java:60
+msgid "Encryption"
+msgstr ""
+
+#: ../java/strings/Strings.java:61
+msgid "i2cp"
+msgstr ""
+
+#: ../java/strings/Strings.java:63
+msgid "InNetPool"
+msgstr ""
+
+#: ../java/strings/Strings.java:64
+msgid "JobQueue"
+msgstr ""
+
+#: ../java/strings/Strings.java:65
+msgid "NetworkDatabase"
+msgstr ""
+
+#: ../java/strings/Strings.java:66
+msgid "ntcp"
+msgstr ""
+
+#: ../java/strings/Strings.java:69
+msgid "Stream"
+msgstr ""
+
+#: ../java/strings/Strings.java:70
+msgid "Throttle"
+msgstr ""
+
+#: ../java/strings/Strings.java:71
+msgid "Transport"
+msgstr ""
+
+#: ../java/strings/Strings.java:73
+msgid "udp"
+msgstr ""
+
+#. parameters in transport addresses (netdb.jsp)
+#. may or may not be worth translating
+#: ../java/strings/Strings.java:77
+msgid "host"
+msgstr ""
+
+#: ../java/strings/Strings.java:78
+msgid "key"
+msgstr ""
+
+#: ../java/strings/Strings.java:79
+msgid "port"
+msgstr ""
+
+#. introducer host
+#: ../java/strings/Strings.java:83
+msgid "ihost0"
+msgstr ""
+
+#: ../java/strings/Strings.java:84
+msgid "ihost1"
+msgstr ""
+
+#: ../java/strings/Strings.java:85
+msgid "ihost2"
+msgstr ""
+
+#. introducer port
+#: ../java/strings/Strings.java:87
+msgid "iport0"
+msgstr ""
+
+#: ../java/strings/Strings.java:88
+msgid "iport1"
+msgstr ""
+
+#: ../java/strings/Strings.java:89
+msgid "iport2"
+msgstr ""
+
+#. introducer key
+#: ../java/strings/Strings.java:91
+msgid "ikey0"
+msgstr ""
+
+#: ../java/strings/Strings.java:92
+msgid "ikey1"
+msgstr ""
+
+#: ../java/strings/Strings.java:93
+msgid "ikey2"
+msgstr ""
+
+#. introducer tag
+#: ../java/strings/Strings.java:95
+msgid "itag0"
+msgstr ""
+
+#: ../java/strings/Strings.java:96
+msgid "itag1"
+msgstr ""
+
+#: ../java/strings/Strings.java:97
+msgid "itag2"
+msgstr ""
+
+#. Descriptions for the stats that are graphed by default
+#. There are over 500 stats currently defined, we aren't going to tag them all
+#: ../java/strings/Strings.java:101
+msgid "Low-level bandwidth receive rate"
+msgstr ""
+
+#. bw.recvRate
+#: ../java/strings/Strings.java:102
+msgid "Low-level bandwidth send rate"
+msgstr ""
+
+#. bw.sendRate
+#: ../java/strings/Strings.java:103
+msgid "How many peers we are actively talking with"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:112
+msgid "config networking"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:222
+msgid "Summary Bar"
+msgstr ""
+
+#. We have intl defined when this is included, but not when compiled standalone.
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:235
+msgid "Refresh (s)"
+msgstr ""
+
+#. ditto
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:239
+msgid "Enable"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:262
+msgid "I2P Network Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:316
+msgid "Bandwidth limiter"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318
+msgid ""
+"I2P will work best if you configure your rates to match the speed of your "
+"internet connection."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:322
+msgid "KBps In"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336
+msgid "KBps Out"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:352
+msgid "Share"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:326
+msgid "NOTE"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361
+#, java-format
+msgid "You have configured I2P to share only {0} KBps."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:364
+msgid "I2P requires at least 12KBps to enable sharing. "
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365
+msgid ""
+"Please enable sharing (participating in tunnels) by configuring more "
+"bandwidth. "
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:366
+msgid ""
+"It improves your anonymity by creating cover traffic, and helps the network."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369
+#, java-format
+msgid "You have configured I2P to share {0} KBps."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:372
+msgid ""
+"The higher the share bandwidth the more you improve your anonymity and help "
+"the network."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:425
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:383
+msgid "Cancel"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:393
+msgid "IP and Transport Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324
+msgid "The default settings will work for most people."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397
+msgid "There is help below."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
+msgid "UPnP Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403
+msgid "Enable UPnP to open firewall ports"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405
+msgid "UPnP status"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407
+msgid "IP Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
+msgid "Externally reachable hostname or IP address"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413
+msgid "Use all auto-detect methods"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
+msgid "Disable UPnP IP address detection"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421
+msgid "Ignore local interface IP address"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425
+msgid "Use SSU IP address detection only"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497
+msgid "Specify hostname or IP"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
+msgid "Select Interface"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449
+msgid "Hidden mode - do not publish IP"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451
+msgid "(prevents participating traffic)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453
+msgid "Action when IP changes"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457
+msgid ""
+"Laptop mode - Change router identity and UDP port when IP changes for "
+"enhanced anonymity"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
+msgid "Experimental"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
+msgid "UDP Configuration:"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463
+msgid "UDP port:"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477
+msgid "TCP Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:483
+msgid "Use auto-detected IP address"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517
+msgid "currently"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489
+msgid "if we are not firewalled"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493
+msgid "Always use auto-detected IP address (Not firewalled)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:503
+msgid "Disable inbound (Firewalled)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:507
+msgid "Completely disable"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509
+msgid ""
+"(select only if behind a firewall that throttles or blocks outbound TCP)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511
+msgid "Externally reachable TCP port"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515
+msgid "Use the same port configured for UDP"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523
+msgid "Specify Port"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:348
+msgid "Note"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:530
+msgid "Changing these settings will restart your router."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536
+msgid "Configuration Help"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
+msgid ""
+"While I2P will work fine behind most firewalls, your speeds and network "
+"integration will generally improve if the I2P port is forwarded for both UDP "
+"and TCP."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540
+msgid ""
+"If you can, please poke a hole in your firewall to allow unsolicited UDP and "
+"TCP packets to reach you."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542
+msgid ""
+"If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole "
+"punching with \"SSU introductions\" to relay traffic."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544
+msgid ""
+"Most of the options above are for special situations, for example where UPnP "
+"does not work correctly, or a firewall not under your control is doing harm."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546
+msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
+msgid ""
+"UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect "
+"the external IP address and forward ports."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
+msgid "UPnP support is beta, and may not work for any number of reasons"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559
+msgid "No UPnP-compatible device present"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561
+msgid "UPnP disabled on the device"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
+msgid "Software firewall interference with UPnP"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
+msgid "Bugs in the device's UPnP implementation"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
+msgid "Multiple firewall/routers in the internet connection path"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
+msgid "UPnP device change, reset, or address change"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571
+msgid "Review the UPnP status here."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573
+msgid ""
+"UPnP may be enabled or disabled above, but a change requires a router "
+"restart to take effect."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
+msgid "Hostnames entered above will be published in the network database."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
+msgid "They are <b>not private</b>."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
+msgid ""
+"Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
+msgid ""
+"If you specify the wrong IP address or hostname, or do not properly "
+"configure your NAT or firewall, your network performance will degrade "
+"substantially."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
+msgid "When in doubt, leave the settings at the defaults."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
+msgid "Reachability Help"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590
+msgid ""
+"If you think you have opened up your firewall and I2P still thinks you are "
+"firewalled, remember that you may have multiple firewalls, for example both "
+"software packages and external hardware routers."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
+msgid ""
+"If there is an error, the <a href=\"logs.jsp\">logs</a> may also help "
+"diagnose the problem."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
+msgid "Your UDP port does not appear to be firewalled."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
+msgid "Your UDP port appears to be firewalled."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
+msgid ""
+"As the firewall detection methods are not 100% reliable, this may "
+"occasionally be displayed in error."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
+msgid ""
+"However, if it appears consistently, you should check whether both your "
+"external and internal firewalls are open for your port."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
+msgid ""
+"I2P will work fine when firewalled, there is no reason for concern. When "
+"firewalled, the router uses \"introducers\" to relay inbound connections."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609
+msgid ""
+"However, you will get more participating traffic and help the network more "
+"if you can open your firewall(s)."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
+msgid ""
+"If you think you have already done so, remember that you may have both a "
+"hardware and a software firewall, or be behind an additional, institutional "
+"firewall you cannot control."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
+msgid ""
+"Also, some routers cannot correctly forward both TCP and UDP on a single "
+"port, or may have other limitations or bugs that prevent them from passing "
+"traffic through to I2P."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
+msgid "The router is currently testing whether your UDP port is firewalled."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
+msgid ""
+"The router is not configured to publish its address, therefore it does not "
+"expect incoming connections."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
+msgid "WARN - Firewalled and Fast"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
+msgid ""
+"You have configured I2P to share more than 128KBps of bandwidth, but you are "
+"firewalled."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
+msgid ""
+"While I2P will work fine in this configuration, if you really have over "
+"128KBps of bandwidth to share, it will be much more helpful to the network "
+"if you open your firewall."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
+msgid "WARN - Firewalled and Floodfill"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
+msgid ""
+"You have configured I2P to be a floodfill router, but you are firewalled."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
+msgid ""
+"For best participation as a floodfill router, you should open your firewall."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
+msgid "WARN - Firewalled with Inbound TCP Enabled"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
+msgid ""
+"You have configured inbound TCP, however your UDP port is firewalled, and "
+"therefore it is likely that your TCP port is firewalled as well."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
+msgid ""
+"If your TCP port is firewalled with inbound TCP enabled, routers will not be "
+"able to contact you via TCP, which will hurt the network."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
+msgid "Please open your firewall or disable inbound TCP above."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
+msgid "WARN - Firewalled with UDP Disabled"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
+msgid "You have configured inbound TCP, however you have disabled UDP."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
+msgid ""
+"You appear to be firewalled on TCP, therefore your router cannot accept "
+"inbound connections."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
+msgid "Please open your firewall or enable UDP."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
+msgid "ERR - Clock Skew"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
+msgid ""
+"Your system's clock is skewed, which will make it difficult to participate "
+"in the network."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655
+msgid "Correct your clock setting if this error persists."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657
+msgid "ERR - Private TCP Address"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659
+msgid ""
+"You must never advertise an unroutable IP address such as 127.0.0.1 or "
+"192.168.1.1 as your external address."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661
+msgid "Correct the address or disable inbound TCP above."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663
+msgid "ERR - SymmetricNAT"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665
+msgid "I2P detected that you are firewalled by a Symmetric NAT."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667
+msgid ""
+"I2P does not work well behind this type of firewall. You will probably not "
+"be able to accept inbound connections, which will limit your participation "
+"in the network."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669
+msgid ""
+"ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config "
+"and restart"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671
+msgid "I2P was unable to bind to port 8887 or other configured port."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673
+msgid ""
+"Check to see if another program is using the configured port. If so, stop "
+"that program or configure I2P to use a different port."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:675
+msgid ""
+"This may be a transient error, if the other program is no longer using the "
+"port."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:677
+msgid "However, a restart is always required after this error."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:679
+msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:681
+msgid ""
+"You have not configured inbound TCP with a hostname and port above, however "
+"you have disabled UDP."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:683
+msgid "Therefore your router cannot accept inbound connections."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:685
+msgid "Please configure a TCP host and port above or enable UDP."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:687
+msgid "ERR - Client Manager I2CP Error - check logs"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:689
+msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:691
+msgid ""
+"Do you have another I2P instance running? Stop the conflicting program and "
+"restart I2P."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:113
+msgid "config advanced"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:263
+msgid "I2P Advanced Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:319
+msgid "Advanced I2P Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:329
+msgid "Some changes may require a restart to take effect."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:112
+msgid "config clients"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:265
+msgid "I2P Client Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330
+msgid "Client Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:332
+msgid ""
+"The Java clients listed below are started by the router and run in the same "
+"JVM."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338
+msgid "To change other client options, edit the file"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439
+msgid "All changes require restart to take effect."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357
+msgid "Advanced Client Interface Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361
+msgid "External I2CP (I2P Client Protocol) Interface Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367
+msgid "Enabled without SSL"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373
+msgid "Enabled with SSL required"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379
+msgid "Disabled - Clients outside this Java process may not connect"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:381
+msgid "I2CP Port"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385
+msgid "I2CP Interface"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401
+msgid "Authorization"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407
+msgid "Require username and password"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409
+msgid "Username"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413
+msgid "Password"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:419
+msgid "Any changes made here must also be configured in the external client."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421
+msgid "Many clients do not support SSL or authorization."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429
+msgid "WebApp Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431
+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 "
+"separately enabled (e.g. susidns, i2ptunnel), or have no web interface at "
+"all (e.g. addressbook)."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433
+msgid ""
+"A web app may also be disabled by removing the .war file from the webapps "
+"directory; however the .war file and web app will reappear when you update "
+"your router to a newer version, so disabling the web app here is the "
+"preferred method."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:445
+msgid "Plugin Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:447
+msgid "The plugins listed below are started by the webConsole client."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455
+msgid "Plugin Installation"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:457
+msgid "To install a plugin, enter the download URL:"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:112
+msgid "config keyring"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:249
+msgid "I2P Keyring Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317
+msgid "The router keyring is used to decrypt encrypted leaseSets."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320
+msgid ""
+"The keyring may contain keys for local or remote encrypted destinations."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326
+msgid "Manual Keyring Addition"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:328
+msgid "Enter keys for encrypted remote destinations here."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:331
+msgid "Keys for local destinations must be entered on the"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:333
+msgid "I2PTunnel page"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335
+msgid "Dest. name, hash, or full key"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337
+msgid "Encryption Key"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:113
+msgid "config logging"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:263
+msgid "I2P Logging Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
+msgid "Configure I2P Logging Options"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321
+msgid "Logging filename"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325
+msgid "(the symbol '@' will be replaced during log rotation)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327
+msgid "Log record format"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331
+msgid ""
+"(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333
+msgid "Log date format"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337
+msgid ""
+"('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' "
+"= millisecond)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339
+msgid "Max log file size"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:343
+msgid "Default log level"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:347
+msgid ""
+"(DEBUG and INFO are not recommended defaults, as they will drastically slow "
+"down your router)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:349
+msgid "Log level overrides"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:353
+msgid "New override"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:112
+msgid "config peers"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:249
+msgid "I2P Peer Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323
+msgid "Manual Peer Controls"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325
+msgid "Router Hash"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:329
+msgid "Manually Ban / Unban a Peer"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:331
+msgid ""
+"Banning will prevent the participation of this peer in tunnels you create."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:341
+msgid "Adjust Profile Bonuses"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343
+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 "
+"Capacity peers are used for some exploratory tunnels. Current bonuses are "
+"displayed on the"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345
+msgid "profiles page"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:273
+msgid "Banned Peers"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:384
+msgid "Banned IPs"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:112
+msgid "config reseeding"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:262
+msgid "I2P Reseeding Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318
+msgid "Reseeding Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:320
+msgid ""
+"Reseeding is the bootstrapping process used to find other routers when you "
+"first install I2P, or when your router has too few router references "
+"remaining."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:322
+msgid ""
+"If reseeding has failed, you should first check your network connection."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:326
+msgid ""
+"Change these only if HTTP is blocked by a restrictive firewall, reseed has "
+"failed, and you have access to an HTTP proxy."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328
+#, java-format
+msgid "See {0} for instructions on reseeding manually."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328
+msgid "the FAQ"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330
+msgid "Reseed URL Selection"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336
+msgid "Try SSL first then non-SSL"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:342
+msgid "Use SSL only"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348
+msgid "Use non-SSL only"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350
+msgid "Reseed URLs"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:354
+msgid "Enable HTTP proxy (not used for SSL)"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:358
+msgid "HTTP Proxy Host"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:362
+msgid "HTTP Proxy Port"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:112
+msgid "config service"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:249
+msgid "I2P Service Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303
+msgid "Shutdown the router"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305
+msgid ""
+"Graceful shutdown lets the router satisfy the agreements it has already made "
+"before shutting down, but may take a few minutes."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307
+msgid ""
+"If you need to kill the router immediately, that option is available as well."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317
+msgid ""
+"If you want the router to restart itself after shutting down, you can choose "
+"one of the following."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319
+msgid ""
+"This is useful in some situations - for example, if you changed some "
+"settings that client applications only read at startup, such as the "
+"routerconsole password or the interface it listens on."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321
+msgid ""
+"A graceful restart will take a few minutes (but your peers will appreciate "
+"your patience), while a hard restart does so immediately."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323
+msgid ""
+"After tearing down the router, it will wait 1 minute before starting back up "
+"again."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333
+msgid "Systray integration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335
+msgid ""
+"On the windows platform, there is a small application to sit in the system "
+"tray, allowing you to view the router's status"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337
+msgid ""
+"(later on, I2P client applications will be able to integrate their own "
+"functionality into the system tray as well)."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339
+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:341
+msgid "Show systray icon"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343
+msgid "Hide systray icon"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:345
+msgid "Run on startup"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347
+msgid ""
+"You can control whether I2P is run on startup or not by selecting one of the "
+"following options - I2P will install (or remove) a service accordingly."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349
+msgid "If you prefer the command line, you can also run the "
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359
+msgid ""
+"If you are running I2P as service right now, removing it will shut down your "
+"router immediately."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361
+msgid ""
+"You may want to consider shutting down gracefully, as above, then running "
+"uninstall_i2p_service_winnt.bat."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365
+msgid "Debugging"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:367
+msgid "View the job queue"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:371
+msgid ""
+"At times, it may be helpful to debug I2P by getting a thread dump. To do so, "
+"please select the following option and review the thread dumped to <a href="
+"\"logs.jsp#servicelogs\">wrapper.log</a>."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:377
+msgid "Launch browser on router startup?"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:379
+msgid ""
+"I2P's main configuration interface is this web console, so for your "
+"convenience I2P can launch a web browser on startup pointing at"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:113
+msgid "config stats"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:250
+msgid "I2P Stats Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:320
+msgid "Configure I2P Stat Collection"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:322
+msgid "Enable full stats?"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329
+msgid "change requires restart to take effect"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331
+msgid "Stat file"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:335
+msgid "Filter"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:348
+msgid "toggle all"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:350
+msgid "Log"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:352
+msgid "Graph"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:391
+msgid "Advanced filter"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:112
+msgid "config tunnels"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:262
+msgid "I2P Tunnel Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:328
+msgid "The default settings work for most people."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332
+msgid "There is a fundamental tradeoff between anonymity and performance."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335
+msgid ""
+"Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 "
+"hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely "
+"reduce performance or reliability."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338
+msgid "High CPU and/or high outbound bandwidth usage may result."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341
+msgid "Change these settings with care, and adjust them if you have problems."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:351
+msgid ""
+"Exploratory tunnel setting changes are stored in the router.config file."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:354
+msgid "Client tunnel changes are temporary and are not saved."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:356
+msgid "To make permanent client tunnel changes see the"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:358
+msgid "i2ptunnel page"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:112
+msgid "config UI"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:262
+msgid "I2P UI Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314
+msgid "Router Console Theme"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:339
+msgid "Theme selection disabled for Internet Explorer, sorry."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:341
+msgid ""
+"If you're not using IE, it's likely that your browser is pretending to be "
+"IE; please configure your browser (or proxy) to use a different User Agent "
+"string if you'd like to access the console themes."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:345
+msgid "Router Console Language"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:349
+msgid ""
+"Please contribute to the router console translation project! Contact the "
+"developers on IRC #i2p to help."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353
+msgid "Apply"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:112
+msgid "config update"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:249
+msgid "I2P Update Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321
+msgid "Check for I2P and news updates"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:323
+msgid "News &amp; I2P Updates"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327
+msgid "Update In Progress"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335
+msgid "News URL"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339
+msgid "Refresh frequency"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:345
+msgid "Update policy"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:349
+msgid "Update through the eepProxy?"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:353
+msgid "eepProxy host"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:357
+msgid "eepProxy port"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
+msgid "Update URLs"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365
+msgid "Trusted keys"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369
+msgid "Update with unsigned development builds?"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:373
+msgid "Unsigned Build URL"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:379
+msgid ""
+"I2P updates are disabled because you do not have write permission for the "
+"install directory."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385
+msgid "Save"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121
+msgid "Internal Error"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123
+msgid "Router Console"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:127
+msgid "Configuration"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135
+msgid "Sorry! There has been an internal error."
+msgstr ""
+
+#. note to translators - both parameters are URLs
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:254
+#, java-format
+msgid "Please report bugs on {0} or {1}."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258
+msgid ""
+"You may use the username \"guest\" and password \"guest\" if you do not wish "
+"to register."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:145
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:260
+msgid "Please include this information in bug reports"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147
+msgid "Error Details"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:149
+#, java-format
+msgid "Error {0}"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:169
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:250
+msgid "I2P Version and Running Environment"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:197
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:288
+msgid ""
+"Note that system information, log timestamps, and log messages may provide "
+"clues to your location; please review everything you include in a bug report."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:123
+msgid "Page Not Found"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:264
+msgid ""
+"Sorry! You appear to be requesting a non-existent Router Console page or "
+"resource."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:266
+msgid "Error 404"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:271
+msgid "not found"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:112
+msgid "graphs"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:249
+msgid "I2P Performance Graphs"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:111
+msgid "home"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:331
+msgid "Welcome to I2P"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:111
+msgid "job queue"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:248
+msgid "I2P Router Job Queue"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:111
+msgid "logs"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:248
+msgid "I2P Router Logs"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303
+msgid "Critical Logs"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:307
+msgid "Router Logs"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:313
+msgid "Service (Wrapper) Logs"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:111
+msgid "network database summary"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:248
+msgid "I2P Network Database Summary"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:115
+msgid "WebApp Not Found"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:252
+msgid "Web Application Not Running"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:254
+msgid "The requested web application is not running."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:256
+msgid ""
+"Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</"
+"a> to start it."
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:111
+msgid "peer connections"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:248
+msgid "I2P Network Peers"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:111
+msgid "peer profiles"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:248
+msgid "I2P Network Peer Profiles"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:111
+msgid "statistics"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:265
+msgid "I2P Router Statistics"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:255
+#, java-format
+msgid "Disable {0} Refresh"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:111
+msgid "tunnel summary"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:248
+msgid "I2P Tunnel Summary"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:248
+msgid "Peer Profile"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:275
+#, java-format
+msgid "Profile for peer {0}"
+msgstr ""
diff --git a/apps/routerconsole/locale/messages_es.po b/apps/routerconsole/locale/messages_es.po
index 77de2b2d410cb4bafb5100d4200f2625ed393eaa..21a79717d3e436e71984f59955197013595c8d0e 100644
--- a/apps/routerconsole/locale/messages_es.po
+++ b/apps/routerconsole/locale/messages_es.po
@@ -6,27 +6,30 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: I2P routerconsole\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-28 00:08+0000\n"
-"PO-Revision-Date: 2011-01-03 01:13+0100\n"
+"Project-Id-Version: I2P\n"
+"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
+"POT-Creation-Date: 2011-03-21 18:01+0000\n"
+"PO-Revision-Date: 2011-05-18 23:34+0100\n"
 "Last-Translator: mixxy <m1xxy@mail.i2p>\n"
-"Language-Team: foo <foo@bar>\n"
+"Language-Team: Spanish (Castilian) <None>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: French\n"
+"Language: es\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:1103
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1141
 #, java-format
 msgid "1 ms"
 msgid_plural "{0,number,####} ms"
@@ -36,7 +39,7 @@ msgstr[1] "{0,number,####} ms"
 #. seconds
 #. Note to translators: quantity will always be greater than one.
 #. alternates: secs, sec. 'seconds' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1108
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1146
 #, java-format
 msgid "1 sec"
 msgid_plural "{0} sec"
@@ -46,55 +49,55 @@ msgstr[1] "{0} s"
 #. minutes
 #. Note to translators: quantity will always be greater than one.
 #. alternates: mins, min. 'minutes' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1113
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1151
 #, java-format
 msgid "1 min"
 msgid_plural "{0} min"
-msgstr[0] "{0} min"
+msgstr[0] "1 min"
 msgstr[1] "{0} min"
 
 #. hours
 #. Note to translators: quantity will always be greater than one.
 #. alternates: hrs, hr., hrs.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1118
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1156
 #, java-format
 msgid "1 hour"
 msgid_plural "{0} hours"
 msgstr[0] "1 hora"
 msgstr[1] "{0} horas"
 
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1120
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1158
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:314
 msgid "n/a"
-msgstr ""
+msgstr "n/d"
 
 #. days
 #. Note to translators: quantity will always be greater than one.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1124
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1162
 #, java-format
 msgid "1 day"
 msgid_plural "{0} days"
 msgstr[0] "1 día"
 msgstr[1] "{0} días"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:126
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:122
 #, java-format
 msgid "Banned by router hash: {0}"
-msgstr ""
+msgstr "Baneado por el hash del router: {0}"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:128
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:124
 msgid "Banned by router hash"
-msgstr "baneado por hash del enrutador"
+msgstr "baneado por hash del router"
 
 #. Temporary reason, until the job finishes
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:673
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:669
 msgid "IP banned"
-msgstr "IP baneado"
+msgstr "IP baneada"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:743
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:739
 #, java-format
 msgid "IP banned by blocklist.txt entry {0}"
-msgstr ""
+msgstr "IP baneada por la blocklist.txt: {0}"
 
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:92
 msgid "Rejecting tunnels: Shutting down"
@@ -102,13 +105,14 @@ msgstr "rechazando túneles: apagando"
 
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:141
 msgid "Rejecting tunnels: High message delay"
-msgstr "rechazando túneles: alta tardanza de los mensajes"
+msgstr "rechazando túneles: mucha tardanza de los mensajes"
 
 #. 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:177
 msgid "Rejecting most tunnels: High number of requests"
-msgstr "rechazando la mayor parte de los túneles: alto número de peticiones"
+msgstr "rechazando la mayoría de túneles: alto número de peticiones"
 
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:233
 msgid "Rejecting tunnels: Limit reached"
@@ -119,455 +123,468 @@ msgstr "rechazando túneles: límite alcanzado"
 #. always leave at least 4KBps free when allowing
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:301
 msgid "Rejecting tunnels: Bandwidth limit"
-msgstr "rechazando túneles: límite del ancho de banda"
+msgstr "rechazando túneles: límite de ancho 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:371
 msgid "Rejecting most tunnels: Bandwidth limit"
-msgstr "rechazando la mayor parte de los túneles: límite del ancho de banda"
+msgstr "rechazando la mayor parte de los túneles: límite de ancho 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:375
 msgid "Accepting most tunnels"
-msgstr "Acceptando la mayoría de los túneles"
+msgstr "Aceptando la mayoría de los túneles"
 
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:377
 msgid "Accepting tunnels"
-msgstr "acceptando túneles"
+msgstr "aceptando túneles"
 
 #. 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:488
 msgid "Rejecting tunnels"
 msgstr "Rechazando túneles"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:68
-msgid "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually."
-msgstr ""
-
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:101
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:125
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
 msgid "Reseeding"
-msgstr ""
+msgstr "Resembrando"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:124
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:141
 #, java-format
 msgid "Reseed fetched only 1 router."
 msgid_plural "Reseed fetched only {0} routers."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "El proceso de resembrar ha encontrado un solo router."
+msgstr[1] "El proceso de resembrar ha encontrado sólo {0} routers."
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:131
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:148
 msgid "Reseed failed."
-msgstr ""
+msgstr "El proceso de resembrar ha fallado"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:232
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:149
+#, java-format
+msgid "See {0} for help."
+msgstr "Consulta {0} para obtener ayuda."
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150
+msgid "reseed configuration page"
+msgstr "Página de configuración del proceso de resembrar"
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:293
 msgid "Reseeding: fetching seed URL."
-msgstr ""
+msgstr "Resembrar: Buscando URL sembradora"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:273
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:335
 #, java-format
 msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
-msgstr ""
+msgstr "Resembrar: buscando informaciones de routers desde la URL sembradora ({0} exitosas, {1} errores)."
 
-#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:513
+#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512
 msgid "NetDb entry"
-msgstr ""
+msgstr "Entrada de la 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:70
 msgid "No transports (hidden or starting up?)"
-msgstr ""
+msgstr "No hay transportes (oculto o iniciando?)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:452
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450
 msgid "Unreachable on any transport"
-msgstr ""
+msgstr "Inalcanzable en cualquier transporte"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:501
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499
 msgid "Router Transport Addresses"
-msgstr ""
+msgstr "Direcciones de transporte del router "
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:506
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504
 #, java-format
 msgid "{0} is used for outbound connections only"
-msgstr ""
+msgstr "{0} se utiliza sólo para conexiones salientes"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129
 msgid "Help"
-msgstr ""
+msgstr "Ayuda"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519
 msgid "Your transport connection limits are automatically set based on your configured bandwidth."
-msgstr ""
+msgstr "Los límites de conexiones de transporte se ajustan automáticamente basándose en el ancho de banda configurado."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521
 msgid "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and i2np.udp.maxConnections=nnn on the advanced configuration page."
-msgstr ""
+msgstr "Para sobreescribir estos límites, se deben agregar los comandos i2np.ntcp.maxConnections = nnn y i2np.udp.maxConnections = nnn en la página de configuración avanzada."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
 msgid "Definitions"
 msgstr "Definiciones"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:735
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
 msgid "Peer"
 msgstr "Par"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
 msgid "The remote peer, identified by router hash"
-msgstr ""
+msgstr "El par remoto, identificado por el hash del router"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:736
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
 msgid "Dir"
-msgstr ""
+msgstr "Dir"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
 msgid "Inbound connection"
 msgstr "Conexión entrante"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
 msgid "Outbound connection"
 msgstr "Conexión saliente"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
 msgid "They offered to introduce us (help other peers traverse our firewall)"
-msgstr ""
+msgstr "Se han ofrecido a introducirnos (a ayudar a otros pares a atravesar nuestro cortafuegos)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532
 msgid "We offered to introduce them (help other peers traverse their firewall)"
-msgstr ""
+msgstr "Nos hemos ofrecido a introducirlos (a ayudar a otros compañeros a atravesar su cortafuegos)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
 msgid "How long since a packet has been received / sent"
-msgstr ""
+msgstr "Cuánto tiempo hace que un paquete ha sido recibido / enviado"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
 msgid "Idle"
-msgstr ""
+msgstr "inactivo"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "In/Out"
 msgstr "Entrante/Saliente"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)"
-msgstr ""
+msgstr "Tasa de transferencia de entrada / salida (KBytes por segundo)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
 msgid "How long ago this connection was established"
-msgstr ""
+msgstr "Cuánto tiempo hace que se estableció esta conexión"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905
 msgid "Up"
-msgstr ""
+msgstr "Subida"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907
 msgid "Skew"
-msgstr ""
+msgstr "Desincronización"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
 msgid "The difference between the peer's clock and your own"
-msgstr ""
+msgstr "La diferencia entre el reloj del par y el tuyo"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
 msgid "The congestion window, which is how many bytes can be sent without an acknowledgement"
-msgstr ""
+msgstr "El rango de congestión, que es la cantidad de bytes que se pueden enviar sin recibir confirmación"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
 msgid "The number of sent messages awaiting acknowledgement"
-msgstr ""
+msgstr "El número de mensajes enviados a la espera de confirmación"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
 msgid "The maximum number of concurrent messages to send"
-msgstr ""
+msgstr "El número máximo de mensajes simultáneos para enviar"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
 msgid "The number of pending sends which exceed congestion window"
-msgstr ""
+msgstr "El número de envíos pendientes que superen el rango de congestión"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
 msgid "The slow start threshold"
-msgstr ""
+msgstr "El umbral de incicio lento"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
 msgid "The round trip time in milliseconds"
-msgstr ""
+msgstr "El tiempo de ida y vuelta en milisegundos"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917
 msgid "Dev"
-msgstr ""
+msgstr "Dev"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
 msgid "The standard deviation of the round trip time in milliseconds"
-msgstr ""
+msgstr "La desviación estándar del tiempo de ida y vuelta en milisegundos"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
 msgid "The retransmit timeout in milliseconds"
-msgstr ""
+msgstr "El tiempo de vencimiento de la retransmisión en milisegundos"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
 msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)"
-msgstr ""
+msgstr "Tamaño máximo actual de envío de paquetes / tamaño máximo estimado de paquetes entrantes (bytes)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
 msgid "TX"
-msgstr ""
+msgstr "TX"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
 msgid "The total number of packets sent to the peer"
-msgstr ""
+msgstr "El número total de paquetes enviados al par"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
 msgid "RX"
-msgstr ""
+msgstr "RX"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
 msgid "The total number of packets received from the peer"
-msgstr ""
+msgstr "El número total de paquetes recibidos del par"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929
 msgid "Dup TX"
-msgstr ""
+msgstr "TX dup"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
 msgid "The total number of packets retransmitted to the peer"
-msgstr ""
+msgstr "El número total de paquetes retransmitidos al par"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931
 msgid "Dup RX"
-msgstr ""
+msgstr "RX dup"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
 msgid "The total number of duplicate packets received from the peer"
-msgstr ""
+msgstr "El número total de paquetes duplicados recibidos de los pares"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:409
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:627
 #, java-format
 msgid "Excessive clock skew: {0}"
-msgstr ""
+msgstr "Desincronización excesiva del reloj: {0}"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:730
 msgid "NTCP connections"
-msgstr "conexiones NTCP"
+msgstr "Conexiones NTCP"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:731
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886
 msgid "Limit"
-msgstr ""
+msgstr "Límite"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1888
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
 msgid "Timeout"
-msgstr ""
+msgstr "Tiempo de espera"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743
 msgid "Out Queue"
-msgstr ""
+msgstr "cola de salida"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744
 msgid "Backlogged?"
-msgstr ""
+msgstr "Atrasadas?"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1950
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
 msgid "Inbound"
 msgstr "Entrante"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1952
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
 msgid "Outbound"
 msgstr "Saliente"
 
 #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n");
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:807
 msgid "peers"
-msgstr "Pares"
+msgstr "pares"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885
 msgid "UDP connections"
 msgstr "conexiones UDP"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892
 msgid "Sort by peer hash"
-msgstr ""
+msgstr "Ordenar por hash"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
 msgid "Direction/Introduction"
-msgstr ""
+msgstr "Dirección/Introducción"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1897
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
 msgid "Sort by idle inbound"
-msgstr ""
+msgstr "Ordenar por inactividad de entrada"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1899
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
 msgid "Sort by idle outbound"
-msgstr ""
+msgstr "Ordenar por inactividad de salida"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1902
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
 msgid "Sort by inbound rate"
-msgstr ""
+msgstr "Ordenar por tasa de entrada"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1904
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903
 msgid "Sort by outbound rate"
-msgstr ""
+msgstr "Ordenar por tasa de salida"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
 msgid "Sort by connection uptime"
-msgstr ""
+msgstr "Ordenar por el tiempo de actividad"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1909
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
 msgid "Sort by clock skew"
-msgstr ""
+msgstr "Ordenar por desviación de reloj"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1912
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911
 msgid "Sort by congestion window"
-msgstr ""
+msgstr "Ordenar por ventana de congestión"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1914
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913
 msgid "Sort by slow start threshold"
-msgstr ""
+msgstr "Ordenar por umbral de inicio lento"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916
 msgid "Sort by round trip time"
-msgstr ""
+msgstr "Ordenar por el tiempo de ida y vuelta"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1919
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
 msgid "Sort by round trip time deviation"
-msgstr ""
+msgstr "Ordenar por desviación de tiempo de ida y vuelta"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920
 msgid "Sort by retransmission timeout"
-msgstr ""
+msgstr "Ordenar por tiempo de espera de retransmisión"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923
 msgid "Sort by outbound maximum transmit unit"
-msgstr ""
+msgstr "Ordenar por unidad de transmisión máxima de salida"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
 msgid "Sort by packets sent"
-msgstr ""
+msgstr "Ordenar por paquetes enviados"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1928
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
 msgid "Sort by packets received"
-msgstr ""
+msgstr "Ordenar por paquetes recibidos"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930
 msgid "Sort by packets retransmitted"
-msgstr ""
+msgstr "Ordenar por paquetes retransmitidos"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1933
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932
 msgid "Sort by packets received more than once"
-msgstr ""
+msgstr "Ordenar por paquetes recibidos más de una vez"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1954
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953
 msgid "We offered to introduce them"
-msgstr ""
+msgstr "Nos hemos ofrecido a introducirlos"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1956
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955
 msgid "They offered to introduce us"
-msgstr ""
+msgstr "Se han ofrecido a introducirnos"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1960
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959
 msgid "Choked"
-msgstr ""
+msgstr "Atascado"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1968
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967
 msgid "1 fail"
-msgstr ""
+msgstr "1 fallo"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1970
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969
 #, java-format
 msgid "{0} fails"
-msgstr ""
+msgstr "{0} fallos"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1976
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162
 msgid "Banned"
-msgstr ""
+msgstr "Baneado"
 
 #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2107
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106
 msgid "SUMMARY"
-msgstr ""
+msgstr "RESUMEN"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:145
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124
 msgid "Dropping tunnel requests: Too slow"
-msgstr ""
+msgstr "Descartando túneles: Demasiado lento"
 
 #. don't even bother, since we are so overloaded locally
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:352
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267
 msgid "Dropping tunnel requests: Overloaded"
-msgstr ""
+msgstr "Descartando solicitudes de túnel: sobrecarga"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:525
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:470
 msgid "Rejecting tunnels: Request overload"
-msgstr ""
+msgstr "Rechazando túneles: Sobrecarga de solicitudes"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:550
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:495
 msgid "Rejecting tunnels: Connection limit"
-msgstr ""
+msgstr "Rechazando túneles: Límite de conexión"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:744
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:695
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:716
 msgid "Dropping tunnel requests: High load"
-msgstr ""
+msgstr "Descartando solicitudes de túnel: Carga alta"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:753
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:708
 msgid "Dropping tunnel requests: Queue time"
-msgstr ""
+msgstr "Descartando solicitudes de túnel: Tiempo de cola"
 
 #. Automatically generated pseudo-java for xgettext - do not edit
-#. Translators may wish to translate a few of these, do not bother to translate all of them!!
+#. Translators may wish to translate a few of these, do not bother to
+#. translate all of them!!
 #: ../java/build/Countries.java:3
 msgid "Andorra"
-msgstr "Andorre"
+msgstr "Andorra"
 
 #: ../java/build/Countries.java:4
 msgid "United Arab Emirates"
-msgstr ""
+msgstr "Emiratos Árabes Unidos"
 
 #: ../java/build/Countries.java:5
 msgid "Afghanistan"
-msgstr ""
+msgstr "Afganistán"
 
 #: ../java/build/Countries.java:6
 msgid "Antigua and Barbuda"
-msgstr ""
+msgstr "Antigua y Barbuda"
 
 #: ../java/build/Countries.java:7
 msgid "Anguilla"
-msgstr ""
+msgstr "Anguila"
 
 #: ../java/build/Countries.java:8
 msgid "Albania"
@@ -575,19 +592,19 @@ msgstr "Albania"
 
 #: ../java/build/Countries.java:9
 msgid "Armenia"
-msgstr ""
+msgstr "Armenia"
 
 #: ../java/build/Countries.java:10
 msgid "Netherlands Antilles"
-msgstr ""
+msgstr "Antillas Holandesas"
 
 #: ../java/build/Countries.java:11
 msgid "Angola"
-msgstr ""
+msgstr "Angola"
 
 #: ../java/build/Countries.java:12
 msgid "Antarctica"
-msgstr ""
+msgstr "La Antártida"
 
 #: ../java/build/Countries.java:13
 msgid "Argentina"
@@ -595,7 +612,7 @@ msgstr "Argentina"
 
 #: ../java/build/Countries.java:14
 msgid "American Samoa"
-msgstr ""
+msgstr "Samoa Americana"
 
 #: ../java/build/Countries.java:15
 msgid "Austria"
@@ -603,227 +620,227 @@ msgstr "Austria"
 
 #: ../java/build/Countries.java:16
 msgid "Australia"
-msgstr ""
+msgstr "Australia"
 
 #: ../java/build/Countries.java:17
 msgid "Aruba"
-msgstr ""
+msgstr "Aruba"
 
 #: ../java/build/Countries.java:19
 msgid "Azerbaijan"
-msgstr ""
+msgstr "Azerbaiyán"
 
 #: ../java/build/Countries.java:20
 msgid "Bosnia and Herzegovina"
-msgstr ""
+msgstr "Bosnia y Herzegovina"
 
 #: ../java/build/Countries.java:21
 msgid "Barbados"
-msgstr ""
+msgstr "Barbados"
 
 #: ../java/build/Countries.java:22
 msgid "Bangladesh"
-msgstr ""
+msgstr "Bangladesh"
 
 #: ../java/build/Countries.java:23
 msgid "Belgium"
-msgstr ""
+msgstr "Bélgica"
 
 #: ../java/build/Countries.java:24
 msgid "Burkina Faso"
-msgstr ""
+msgstr "Burkina Fasso"
 
 #: ../java/build/Countries.java:25
 msgid "Bulgaria"
-msgstr ""
+msgstr "Bulgaria"
 
 #: ../java/build/Countries.java:26
 msgid "Bahrain"
-msgstr ""
+msgstr "Bahrein"
 
 #: ../java/build/Countries.java:27
 msgid "Burundi"
-msgstr ""
+msgstr "Burundi"
 
 #: ../java/build/Countries.java:28
 msgid "Benin"
-msgstr ""
+msgstr "Benin"
 
 #: ../java/build/Countries.java:29
 msgid "Bermuda"
-msgstr ""
+msgstr "Bermudas"
 
 #: ../java/build/Countries.java:30
 msgid "Brunei Darussalam"
-msgstr ""
+msgstr "Brunei Darussalam"
 
 #: ../java/build/Countries.java:31
 msgid "Bolivia"
-msgstr ""
+msgstr "Bolivia"
 
 #: ../java/build/Countries.java:32
 msgid "Brazil"
-msgstr ""
+msgstr "Brasil"
 
 #: ../java/build/Countries.java:33
 msgid "Bahamas"
-msgstr ""
+msgstr "Bahamas"
 
 #: ../java/build/Countries.java:34
 msgid "Bhutan"
-msgstr ""
+msgstr "Bhután"
 
 #: ../java/build/Countries.java:35
 msgid "Bouvet Island"
-msgstr ""
+msgstr "Isla Bouvet"
 
 #: ../java/build/Countries.java:36
 msgid "Botswana"
-msgstr ""
+msgstr "Botswana"
 
 #: ../java/build/Countries.java:37
 msgid "Belarus"
-msgstr ""
+msgstr "Bielorrusia"
 
 #: ../java/build/Countries.java:38
 msgid "Belize"
-msgstr ""
+msgstr "Belice"
 
 #: ../java/build/Countries.java:39
 msgid "Canada"
-msgstr ""
+msgstr "Canadá"
 
 #: ../java/build/Countries.java:40
 msgid "The Democratic Republic of the Congo"
-msgstr ""
+msgstr "República Democrática del Congo"
 
 #: ../java/build/Countries.java:41
 msgid "Central African Republic"
-msgstr ""
+msgstr "República Centroafricana"
 
 #: ../java/build/Countries.java:42
 msgid "Congo"
-msgstr ""
+msgstr "Congo"
 
 #: ../java/build/Countries.java:43
 msgid "Switzerland"
-msgstr ""
+msgstr "Suiza"
 
 #: ../java/build/Countries.java:44
 msgid "Cote D'Ivoire"
-msgstr ""
+msgstr "Costa de Marfil"
 
 #: ../java/build/Countries.java:45
 msgid "Cook Islands"
-msgstr ""
+msgstr "Islas Cook"
 
 #: ../java/build/Countries.java:46
 msgid "Chile"
-msgstr ""
+msgstr "Chile"
 
 #: ../java/build/Countries.java:47
 msgid "Cameroon"
-msgstr ""
+msgstr "Camerún"
 
 #: ../java/build/Countries.java:48
 msgid "China"
-msgstr ""
+msgstr "China"
 
 #: ../java/build/Countries.java:49
 msgid "Colombia"
-msgstr ""
+msgstr "Colombia"
 
 #: ../java/build/Countries.java:50
 msgid "Costa Rica"
-msgstr ""
+msgstr "Costa Rica"
 
 #: ../java/build/Countries.java:51
 msgid "Serbia and Montenegro"
-msgstr ""
+msgstr "Serbia y Montenegro"
 
 #: ../java/build/Countries.java:52
 msgid "Cuba"
-msgstr ""
+msgstr "Cuba"
 
 #: ../java/build/Countries.java:53
 msgid "Cape Verde"
-msgstr ""
+msgstr "Cabo Verde"
 
 #: ../java/build/Countries.java:54
 msgid "Cyprus"
-msgstr ""
+msgstr "Chipre"
 
 #: ../java/build/Countries.java:55
 msgid "Czech Republic"
-msgstr ""
+msgstr "República Checa"
 
 #: ../java/build/Countries.java:56
 msgid "Germany"
-msgstr "Allemania"
+msgstr "Alemania"
 
 #: ../java/build/Countries.java:57
 msgid "Djibouti"
-msgstr ""
+msgstr "Djibouti"
 
 #: ../java/build/Countries.java:58
 msgid "Denmark"
-msgstr ""
+msgstr "Dinamarca"
 
 #: ../java/build/Countries.java:59
 msgid "Dominica"
-msgstr ""
+msgstr "Dominica"
 
 #: ../java/build/Countries.java:60
 msgid "Dominican Republic"
-msgstr ""
+msgstr "República Dominicana"
 
 #: ../java/build/Countries.java:61
 msgid "Algeria"
-msgstr ""
+msgstr "Argelia"
 
 #: ../java/build/Countries.java:62
 msgid "Ecuador"
-msgstr ""
+msgstr "Ecuador"
 
 #: ../java/build/Countries.java:63
 msgid "Estonia"
-msgstr ""
+msgstr "Estonia"
 
 #: ../java/build/Countries.java:64
 msgid "Egypt"
-msgstr ""
+msgstr "Egipto"
 
 #: ../java/build/Countries.java:65
 msgid "Eritrea"
-msgstr ""
+msgstr "Eritrea"
 
 #: ../java/build/Countries.java:66
 msgid "Spain"
-msgstr ""
+msgstr "España"
 
 #: ../java/build/Countries.java:67
 msgid "Ethiopia"
-msgstr ""
+msgstr "Etiopía"
 
 #: ../java/build/Countries.java:68
 msgid "Finland"
-msgstr ""
+msgstr "Finlandia"
 
 #: ../java/build/Countries.java:69
 msgid "Fiji"
-msgstr ""
+msgstr "Fiji"
 
 #: ../java/build/Countries.java:70
 msgid "Falkland Islands (Malvinas)"
-msgstr ""
+msgstr "Islas Malvinas"
 
 #: ../java/build/Countries.java:71
 msgid "Federated States of Micronesia"
-msgstr ""
+msgstr "Estados Federados de Micronesia"
 
 #: ../java/build/Countries.java:72
 msgid "Faroe Islands"
-msgstr ""
+msgstr "Islas Feroe"
 
 #: ../java/build/Countries.java:73
 msgid "France"
@@ -831,660 +848,661 @@ msgstr "Francia"
 
 #: ../java/build/Countries.java:74
 msgid "Gabon"
-msgstr ""
+msgstr "Gabón"
 
 #: ../java/build/Countries.java:75
 msgid "United Kingdom"
-msgstr ""
+msgstr "Reino Unido"
 
 #: ../java/build/Countries.java:76
 msgid "Grenada"
-msgstr ""
+msgstr "Granada"
 
 #: ../java/build/Countries.java:77
 msgid "Georgia"
-msgstr ""
+msgstr "Georgia"
 
 #: ../java/build/Countries.java:78
 msgid "French Guiana"
-msgstr ""
+msgstr "Guayana Francesa"
 
 #: ../java/build/Countries.java:79
 msgid "Ghana"
-msgstr ""
+msgstr "Ghana"
 
 #: ../java/build/Countries.java:80
 msgid "Gibraltar"
-msgstr ""
+msgstr "Gibraltar"
 
 #: ../java/build/Countries.java:81
 msgid "Greenland"
-msgstr ""
+msgstr "Groenlandia"
 
 #: ../java/build/Countries.java:82
 msgid "Gambia"
-msgstr ""
+msgstr "Gambia"
 
 #: ../java/build/Countries.java:83
 msgid "Guinea"
-msgstr ""
+msgstr "Guinea"
 
 #: ../java/build/Countries.java:84
 msgid "Guadeloupe"
-msgstr ""
+msgstr "Guadalupe"
 
 #: ../java/build/Countries.java:85
 msgid "Equatorial Guinea"
-msgstr ""
+msgstr "Guinea Ecuatorial"
 
 #: ../java/build/Countries.java:86
 msgid "Greece"
-msgstr ""
+msgstr "Grecia"
 
 #: ../java/build/Countries.java:87
 msgid "South Georgia and the South Sandwich Islands"
-msgstr ""
+msgstr "Georgia del Sur e Islas Sandwich del Sur"
 
 #: ../java/build/Countries.java:88
 msgid "Guatemala"
-msgstr ""
+msgstr "Guatemala"
 
 #: ../java/build/Countries.java:89
 msgid "Guam"
-msgstr ""
+msgstr "Guam"
 
 #: ../java/build/Countries.java:90
 msgid "Guinea-Bissau"
-msgstr ""
+msgstr "Guinea-Bissau"
 
 #: ../java/build/Countries.java:91
 msgid "Guyana"
-msgstr ""
+msgstr "Guyana"
 
 #: ../java/build/Countries.java:92
 msgid "Hong Kong"
-msgstr ""
+msgstr "Hong Kong"
 
 #: ../java/build/Countries.java:93
 msgid "Honduras"
-msgstr ""
+msgstr "Honduras"
 
 #: ../java/build/Countries.java:94
 msgid "Croatia"
-msgstr ""
+msgstr "Croacia"
 
 #: ../java/build/Countries.java:95
 msgid "Haiti"
-msgstr ""
+msgstr "Haití"
 
 #: ../java/build/Countries.java:96
 msgid "Hungary"
-msgstr ""
+msgstr "Hungría"
 
 #: ../java/build/Countries.java:97
 msgid "Indonesia"
-msgstr ""
+msgstr "Indonesia"
 
 #: ../java/build/Countries.java:98
 msgid "Ireland"
-msgstr ""
+msgstr "Irlanda"
 
 #: ../java/build/Countries.java:99
 msgid "Israel"
-msgstr ""
+msgstr "Israel"
 
 #: ../java/build/Countries.java:101
 msgid "India"
-msgstr ""
+msgstr "India"
 
 #: ../java/build/Countries.java:102
 msgid "British Indian Ocean Territory"
-msgstr ""
+msgstr "Territorio Británico del Océano"
 
 #: ../java/build/Countries.java:103
 msgid "Iraq"
-msgstr ""
+msgstr "Irak"
 
 #: ../java/build/Countries.java:104
 msgid "Islamic Republic of Iran"
-msgstr ""
+msgstr "República Islámica de Irán"
 
 #: ../java/build/Countries.java:105
 msgid "Iceland"
-msgstr ""
+msgstr "Islandia"
 
 #: ../java/build/Countries.java:106
 msgid "Italy"
-msgstr ""
+msgstr "Italia"
 
 #: ../java/build/Countries.java:108
 msgid "Jamaica"
-msgstr ""
+msgstr "Jamaica"
 
 #: ../java/build/Countries.java:109
 msgid "Jordan"
-msgstr ""
+msgstr "Jordania"
 
 #: ../java/build/Countries.java:110
 msgid "Japan"
-msgstr ""
+msgstr "Japón"
 
 #: ../java/build/Countries.java:111
 msgid "Kenya"
-msgstr ""
+msgstr "Kenya"
 
 #: ../java/build/Countries.java:112
 msgid "Kyrgyzstan"
-msgstr ""
+msgstr "Kirguistán"
 
 #: ../java/build/Countries.java:113
 msgid "Cambodia"
-msgstr ""
+msgstr "Camboya"
 
 #: ../java/build/Countries.java:114
 msgid "Kiribati"
-msgstr ""
+msgstr "Kiribati"
 
 #: ../java/build/Countries.java:115
 msgid "Comoros"
-msgstr ""
+msgstr "Comoras"
 
 #: ../java/build/Countries.java:116
 msgid "Saint Kitts and Nevis"
-msgstr ""
+msgstr "Saint Kitts y Nevis"
 
 #: ../java/build/Countries.java:117
 msgid "Republic of Korea"
-msgstr ""
+msgstr "República de Corea"
 
 #: ../java/build/Countries.java:118
 msgid "Kuwait"
-msgstr ""
+msgstr "Kuwait"
 
 #: ../java/build/Countries.java:119
 msgid "Cayman Islands"
-msgstr ""
+msgstr "Islas Caimán"
 
 #: ../java/build/Countries.java:120
 msgid "Kazakhstan"
-msgstr ""
+msgstr "Kazajstán"
 
 #: ../java/build/Countries.java:121
 msgid "Lao People's Democratic Republic"
-msgstr ""
+msgstr "República Democrática Popular Lao"
 
 #: ../java/build/Countries.java:122
 msgid "Lebanon"
-msgstr ""
+msgstr "Líbano"
 
 #: ../java/build/Countries.java:123
 msgid "Saint Lucia"
-msgstr ""
+msgstr "Santa Lucía"
 
 #: ../java/build/Countries.java:124
 msgid "Liechtenstein"
-msgstr ""
+msgstr "Liechtenstein"
 
 #: ../java/build/Countries.java:125
 msgid "Sri Lanka"
-msgstr ""
+msgstr "Sri Lanka"
 
 #: ../java/build/Countries.java:126
 msgid "Liberia"
-msgstr ""
+msgstr "Liberia"
 
 #: ../java/build/Countries.java:127
 msgid "Lesotho"
-msgstr ""
+msgstr "Lesotho"
 
 #: ../java/build/Countries.java:128
 msgid "Lithuania"
-msgstr ""
+msgstr "Lituania"
 
 #: ../java/build/Countries.java:129
 msgid "Luxembourg"
-msgstr ""
+msgstr "Luxemburgo"
 
 #: ../java/build/Countries.java:130
 msgid "Latvia"
-msgstr ""
+msgstr "Letonia"
 
 #: ../java/build/Countries.java:131
 msgid "Libyan Arab Jamahiriya"
-msgstr ""
+msgstr "Jamahiriya Árabe Libia"
 
 #: ../java/build/Countries.java:132
 msgid "Morocco"
-msgstr ""
+msgstr "Marruecos"
 
 #: ../java/build/Countries.java:133
 msgid "Monaco"
-msgstr ""
+msgstr "Mónaco"
 
 #: ../java/build/Countries.java:134
 msgid "Republic of Moldova"
-msgstr ""
+msgstr "República de Moldavia"
 
 #: ../java/build/Countries.java:137
 msgid "Madagascar"
-msgstr ""
+msgstr "Madagascar"
 
 #: ../java/build/Countries.java:138
 msgid "Marshall Islands"
-msgstr ""
+msgstr "Las Islas Marshall"
 
 #: ../java/build/Countries.java:139
 msgid "The Former Yugoslav Republic of Macedonia"
-msgstr ""
+msgstr "La Antigua República Yugoslava de Macedonia"
 
 #: ../java/build/Countries.java:140
 msgid "Mali"
-msgstr ""
+msgstr "Malí"
 
 #: ../java/build/Countries.java:141
 msgid "Myanmar"
-msgstr ""
+msgstr "Myanmar"
 
 #: ../java/build/Countries.java:142
 msgid "Mongolia"
-msgstr ""
+msgstr "Mongolia"
 
 #: ../java/build/Countries.java:143
 msgid "Macao"
-msgstr ""
+msgstr "Macao"
 
 #: ../java/build/Countries.java:144
 msgid "Northern Mariana Islands"
-msgstr ""
+msgstr "Islas Marianas del Norte"
 
 #: ../java/build/Countries.java:145
 msgid "Martinique"
-msgstr ""
+msgstr "Martinica"
 
 #: ../java/build/Countries.java:146
 msgid "Mauritania"
-msgstr ""
+msgstr "Mauritania"
 
 #: ../java/build/Countries.java:147
 msgid "Montserrat"
-msgstr ""
+msgstr "Montserrat"
 
 #: ../java/build/Countries.java:148
 msgid "Malta"
-msgstr ""
+msgstr "Malta"
 
 #: ../java/build/Countries.java:149
 msgid "Mauritius"
-msgstr ""
+msgstr "Mauricio"
 
 #: ../java/build/Countries.java:150
 msgid "Maldives"
-msgstr ""
+msgstr "Maldivas"
 
 #: ../java/build/Countries.java:151
 msgid "Malawi"
-msgstr ""
+msgstr "Malawi"
 
 #: ../java/build/Countries.java:152
 msgid "Mexico"
-msgstr ""
+msgstr "México"
 
 #: ../java/build/Countries.java:153
 msgid "Malaysia"
-msgstr ""
+msgstr "Malasia"
 
 #: ../java/build/Countries.java:154
 msgid "Mozambique"
-msgstr ""
+msgstr "Mozambique"
 
 #: ../java/build/Countries.java:155
 msgid "Namibia"
-msgstr ""
+msgstr "Namibia"
 
 #: ../java/build/Countries.java:156
 msgid "New Caledonia"
-msgstr ""
+msgstr "Nueva Caledonia"
 
 #: ../java/build/Countries.java:157
 msgid "Niger"
-msgstr ""
+msgstr "Níger"
 
 #: ../java/build/Countries.java:158
 msgid "Norfolk Island"
-msgstr ""
+msgstr "Isla Norfolk"
 
 #: ../java/build/Countries.java:159
 msgid "Nigeria"
-msgstr ""
+msgstr "Nigeria"
 
 #: ../java/build/Countries.java:160
 msgid "Nicaragua"
-msgstr ""
+msgstr "Nicaragua"
 
 #: ../java/build/Countries.java:161
 msgid "Netherlands"
-msgstr ""
+msgstr "Países Bajos"
 
 #: ../java/build/Countries.java:162
 msgid "Norway"
-msgstr ""
+msgstr "Noruega"
 
 #: ../java/build/Countries.java:163
 msgid "Nepal"
-msgstr ""
+msgstr "Nepal"
 
 #: ../java/build/Countries.java:164
 msgid "Nauru"
-msgstr ""
+msgstr "Nauru"
 
 #: ../java/build/Countries.java:165
 msgid "Niue"
-msgstr ""
+msgstr "Niue"
 
 #: ../java/build/Countries.java:166
 msgid "New Zealand"
-msgstr ""
+msgstr "Nueva Zelanda"
 
 #: ../java/build/Countries.java:167
 msgid "Oman"
-msgstr ""
+msgstr "Omán"
 
 #: ../java/build/Countries.java:168
 msgid "Panama"
-msgstr ""
+msgstr "Panamá"
 
 #: ../java/build/Countries.java:169
 msgid "Peru"
-msgstr ""
+msgstr "Perú"
 
 #: ../java/build/Countries.java:170
 msgid "French Polynesia"
-msgstr ""
+msgstr "Polinesia francésa"
 
 #: ../java/build/Countries.java:171
 msgid "Papua New Guinea"
-msgstr ""
+msgstr "Papua Nueva Guinea"
 
 #: ../java/build/Countries.java:172
 msgid "Philippines"
-msgstr ""
+msgstr "Filipinas"
 
 #: ../java/build/Countries.java:173
 msgid "Pakistan"
-msgstr ""
+msgstr "Pakistán"
 
 #: ../java/build/Countries.java:174
 msgid "Poland"
-msgstr ""
+msgstr "Polonia"
 
 #: ../java/build/Countries.java:175
 msgid "Saint Pierre and Miquelon"
-msgstr ""
+msgstr "San Pedro y Miquelón"
 
 #: ../java/build/Countries.java:176
 msgid "Puerto Rico"
-msgstr ""
+msgstr "Puerto Rico"
 
 #: ../java/build/Countries.java:177
 msgid "Palestinian Territory"
-msgstr ""
+msgstr "Territorio Palestino"
 
 #: ../java/build/Countries.java:178
 msgid "Portugal"
-msgstr ""
+msgstr "Portugal"
 
 #: ../java/build/Countries.java:179
 msgid "Palau"
-msgstr ""
+msgstr "Palau"
 
 #: ../java/build/Countries.java:180
 msgid "Paraguay"
-msgstr ""
+msgstr "Paraguay"
 
 #: ../java/build/Countries.java:181
 msgid "Qatar"
-msgstr ""
+msgstr "Qatar"
 
 #: ../java/build/Countries.java:182
 msgid "Reunion"
-msgstr ""
+msgstr "Reunión"
 
 #: ../java/build/Countries.java:183
 msgid "Romania"
-msgstr ""
+msgstr "Rumania"
 
 #: ../java/build/Countries.java:184
 msgid "Serbia"
-msgstr ""
+msgstr "Serbia"
 
 #: ../java/build/Countries.java:185
 msgid "Russian Federation"
-msgstr ""
+msgstr "Federación de Rusia"
 
 #: ../java/build/Countries.java:186
 msgid "Rwanda"
-msgstr ""
+msgstr "Ruanda"
 
 #: ../java/build/Countries.java:187
 msgid "Saudi Arabia"
-msgstr ""
+msgstr "Arabia Saudí"
 
 #: ../java/build/Countries.java:188
 msgid "Solomon Islands"
-msgstr ""
+msgstr "Islas Salomón"
 
 #: ../java/build/Countries.java:189
 msgid "Seychelles"
-msgstr ""
+msgstr "Seychelles"
 
 #: ../java/build/Countries.java:190
 msgid "Sudan"
-msgstr ""
+msgstr "Sudán"
 
 #: ../java/build/Countries.java:191
 msgid "Sweden"
-msgstr ""
+msgstr "Suecia"
 
 #: ../java/build/Countries.java:192
 msgid "Singapore"
-msgstr ""
+msgstr "Singapur"
 
 #: ../java/build/Countries.java:193
 msgid "Slovenia"
-msgstr ""
+msgstr "Eslovenia"
 
 #: ../java/build/Countries.java:194
 msgid "Slovakia"
-msgstr ""
+msgstr "Eslovaquia"
 
 #: ../java/build/Countries.java:195
 msgid "Sierra Leone"
-msgstr ""
+msgstr "Sierra Leona"
 
 #: ../java/build/Countries.java:196
 msgid "San Marino"
-msgstr ""
+msgstr "San Marino"
 
 #: ../java/build/Countries.java:197
 msgid "Senegal"
-msgstr ""
+msgstr "Senegal"
 
 #: ../java/build/Countries.java:198
 msgid "Somalia"
-msgstr ""
+msgstr "Somalia"
 
 #: ../java/build/Countries.java:199
 msgid "Suriname"
-msgstr ""
+msgstr "Surinam"
 
 #: ../java/build/Countries.java:200
 msgid "Sao Tome and Principe"
-msgstr ""
+msgstr "Santo Tomé y Príncipe"
 
 #: ../java/build/Countries.java:201
 msgid "El Salvador"
-msgstr ""
+msgstr "El Salvador"
 
 #: ../java/build/Countries.java:202
 msgid "Syrian Arab Republic"
-msgstr ""
+msgstr "República Árabe Siria"
 
 #: ../java/build/Countries.java:203
 msgid "Swaziland"
-msgstr ""
+msgstr "Swazilandia"
 
 #: ../java/build/Countries.java:204
 msgid "Turks and Caicos Islands"
-msgstr ""
+msgstr "Islas Turcas y Caicos"
 
 #: ../java/build/Countries.java:205
 msgid "Chad"
-msgstr ""
+msgstr "Chad"
 
 #: ../java/build/Countries.java:206
 msgid "French Southern Territories"
-msgstr ""
+msgstr "Sur de Francia"
 
 #: ../java/build/Countries.java:207
 msgid "Togo"
-msgstr ""
+msgstr "Togo"
 
 #: ../java/build/Countries.java:208
 msgid "Thailand"
-msgstr ""
+msgstr "Tailandia"
 
 #: ../java/build/Countries.java:209
 msgid "Tajikistan"
-msgstr ""
+msgstr "Tayikistán"
 
 #: ../java/build/Countries.java:210
 msgid "Tokelau"
-msgstr ""
+msgstr "Tokelau"
 
 #: ../java/build/Countries.java:211
 msgid "Timor-Leste"
-msgstr ""
+msgstr "Timor-Leste"
 
 #: ../java/build/Countries.java:212
 msgid "Turkmenistan"
-msgstr ""
+msgstr "Turkmenistán"
 
 #: ../java/build/Countries.java:213
 msgid "Tunisia"
-msgstr ""
+msgstr "Túnez"
 
 #: ../java/build/Countries.java:214
 msgid "Tonga"
-msgstr ""
+msgstr "Tonga"
 
 #: ../java/build/Countries.java:215
 msgid "Turkey"
-msgstr ""
+msgstr "Turquía"
 
 #: ../java/build/Countries.java:216
 msgid "Trinidad and Tobago"
-msgstr ""
+msgstr "Trinidad y Tobago"
 
 #: ../java/build/Countries.java:217
 msgid "Tuvalu"
-msgstr ""
+msgstr "Tuvalu"
 
 #: ../java/build/Countries.java:218
 msgid "Taiwan"
-msgstr ""
+msgstr "Taiwan"
 
 #: ../java/build/Countries.java:219
 msgid "United Republic of Tanzania"
-msgstr ""
+msgstr "República Unida de Tanzanía"
 
 #: ../java/build/Countries.java:220
 msgid "Ukraine"
-msgstr ""
+msgstr "Ucrania"
 
 #: ../java/build/Countries.java:221
 msgid "Uganda"
-msgstr ""
+msgstr "Uganda"
 
 #: ../java/build/Countries.java:222
 msgid "United States Minor Outlying Islands"
-msgstr ""
+msgstr "Islas Menores de Estados Unidos"
 
 #: ../java/build/Countries.java:223
 msgid "United States"
-msgstr ""
+msgstr "Estados Unidos"
 
 #: ../java/build/Countries.java:224
 msgid "Uruguay"
-msgstr ""
+msgstr "Uruguay"
 
 #: ../java/build/Countries.java:225
 msgid "Uzbekistan"
-msgstr ""
+msgstr "Uzbekistán"
 
 #: ../java/build/Countries.java:226
 msgid "Holy See (Vatican City State)"
-msgstr ""
+msgstr "Santa Sede (Ciudad del Vaticano)"
 
 #: ../java/build/Countries.java:227
 msgid "Saint Vincent and the Grenadines"
-msgstr ""
+msgstr "San Vicente y las Granadinas"
 
 #: ../java/build/Countries.java:228
 msgid "Venezuela"
-msgstr ""
+msgstr "Venezuela"
 
 #: ../java/build/Countries.java:229
 #: ../java/build/Countries.java:230
 msgid "Virgin Islands"
-msgstr ""
+msgstr "Islas Vírgenes"
 
 #: ../java/build/Countries.java:231
 msgid "Viet Nam"
-msgstr ""
+msgstr "Viet Nam"
 
 #: ../java/build/Countries.java:232
 msgid "Vanuatu"
-msgstr ""
+msgstr "Vanuatu"
 
 #: ../java/build/Countries.java:233
 msgid "Wallis and Futuna"
-msgstr ""
+msgstr "Wallis y Futuna"
 
 #: ../java/build/Countries.java:234
 msgid "Samoa"
-msgstr ""
+msgstr "Samoa"
 
 #: ../java/build/Countries.java:235
 msgid "Yemen"
-msgstr ""
+msgstr "Yemen"
 
 #: ../java/build/Countries.java:236
 msgid "Mayotte"
-msgstr ""
+msgstr "Mayotte"
 
 #: ../java/build/Countries.java:237
 msgid "South Africa"
-msgstr ""
+msgstr "Sudáfrica"
 
 #: ../java/build/Countries.java:238
 msgid "Zambia"
-msgstr ""
+msgstr "Zambia"
 
 #: ../java/build/Countries.java:239
 msgid "Zimbabwe"
-msgstr ""
+msgstr "Zimbabwe"
 
-#: ../java/src/net/i2p/router/web/CSSHelper.java:57
+#: ../java/src/net/i2p/router/web/CSSHelper.java:60
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37
 #: ../java/strings/Strings.java:29
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:233
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:125
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:257
 msgid "I2P Router Console"
-msgstr "Console del Enrutador I2P"
+msgstr "Consola del Router I2P"
 
 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:57
 msgid "Error updating the configuration - please see the error logs"
-msgstr ""
+msgstr "Error al actualizar la configuración - por favor consulte los registros de errores"
 
 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:69
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:266
@@ -1494,83 +1512,83 @@ msgstr "Configuración guardada con éxito"
 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:268
 msgid "Error saving the configuration (applied but not saved) - please see the error logs"
-msgstr ""
+msgstr "Error al guardar la configuración (aplicada pero no guardada) - por favor consulte los registros de errores"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:355
 msgid "Save Client Configuration"
 msgstr "Guardar la configuración de clientes"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:405
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427
 msgid "Save Interface Configuration"
-msgstr "Guardar la configuración de clientes"
+msgstr "Guardar configuración de interfaz"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:441
 msgid "Save WebApp Configuration"
-msgstr ""
+msgstr "Guardar configuración de aplicaciones web"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:453
 msgid "Save Plugin Configuration"
-msgstr ""
+msgstr "Guardar configuración de complementos"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461
 msgid "Install Plugin"
-msgstr ""
+msgstr "Instalar complemento"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87
 #, java-format
 msgid "Deleted plugin {0}"
-msgstr ""
+msgstr "Eliminado el complemento {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89
 #, java-format
 msgid "Error deleting plugin {0}"
-msgstr ""
+msgstr "Error al eliminar el complemento {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101
 #, java-format
 msgid "Stopped plugin {0}"
-msgstr ""
+msgstr "Detenido complemento {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103
 #, java-format
 msgid "Error stopping plugin {0}"
-msgstr ""
+msgstr "Error al detener el complemento {0}"
 
 #. label (IE)
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:253
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255
 msgid "Start"
 msgstr "Lanzar"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33
 msgid "Unsupported"
-msgstr ""
+msgstr "No soportado"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189
 msgid "New client added"
-msgstr ""
+msgstr "Nuevo cliente añadido"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193
 msgid "Client configuration saved successfully - restart required to take effect."
-msgstr ""
+msgstr "configuración de cliente guardada correctamente - Es necesario reiniciar para que los cambios surtan efecto."
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
 msgid "Bad client index."
-msgstr ""
+msgstr "índice de clientes en mal estado."
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:392
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:384
 msgid "Client"
 msgstr "Cliente"
@@ -1582,24 +1600,24 @@ msgstr "lanzado"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
 msgid "deleted"
-msgstr ""
+msgstr "eliminado"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240
 msgid "WebApp configuration saved."
-msgstr ""
+msgstr "configuración de aplicación Web guardada."
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256
 msgid "Plugin configuration saved."
-msgstr ""
+msgstr "configuración del complemento guardada."
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
 msgid "WebApp"
-msgstr ""
+msgstr "Aplicación Web"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273
 msgid "Failed to start"
-msgstr "Fallido el lanzamiento"
+msgstr "lanzamiento fallido"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278
 msgid "Failed to find server."
@@ -1607,154 +1625,152 @@ msgstr "No se encontró el servidor"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284
 msgid "No plugin URL specified."
-msgstr ""
+msgstr "Ninguna URL de complementos especificada."
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294
 #, java-format
 msgid "No update URL specified for {0}"
-msgstr ""
+msgstr "Ninguna URL de actualización especificado para {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325
 msgid "Plugin or update download already in progress."
-msgstr ""
+msgstr "Descarga del complemento o de la actualización ya en curso."
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311
 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118
 #, java-format
 msgid "Downloading plugin from {0}"
-msgstr ""
+msgstr "Descargar complemento de {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329
 #, java-format
 msgid "Checking plugin {0} for updates"
-msgstr ""
+msgstr "Buscando actualizaciones para el complemento {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339
 #, java-format
 msgid "Started plugin {0}"
-msgstr ""
+msgstr "Complemento {0} iniciado"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341
 #, java-format
 msgid "Error starting plugin {0}"
-msgstr ""
+msgstr "Error al iniciar el complemento {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376
 msgid "Interface configuration saved successfully - restart required to take effect."
-msgstr ""
+msgstr "configuración de interfaz guardada correctamente - Es necesario reiniciar para que los cambios surtan efecto."
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:256
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258
 msgid "Edit"
-msgstr ""
+msgstr "Editar"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351
 msgid "Add Client"
 msgstr "Añadir cliente"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
 msgid "Class and arguments"
-msgstr ""
+msgstr "Clase y argumentos"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Control"
-msgstr ""
+msgstr "Control"
 
 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Run at Startup?"
 msgstr "Lanzar al iniciarse?"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:195
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197
 msgid "Description"
-msgstr ""
+msgstr "Descripción"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Plugin"
-msgstr ""
+msgstr "Complemento"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:159
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185
 msgid "Version"
 msgstr "Versión"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163
 msgid "Signed by"
-msgstr ""
+msgstr "Firmado por"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:178
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180
 msgid "Date"
 msgstr "Fecha"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:184
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186
 msgid "Author"
 msgstr "Autor"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:200
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202
 msgid "License"
-msgstr ""
+msgstr "Licencia"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:205
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207
 msgid "Website"
-msgstr ""
+msgstr "Sitio web"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:210
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212
 msgid "Update link"
 msgstr "Enlace para actualizaciones"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260
 msgid "Stop"
-msgstr ""
+msgstr "Detener"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331
 msgid "Check for updates"
 msgstr "Buscar actualizaciones"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:261
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:242
 msgid "Update"
 msgstr "Actualización"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:266
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268
 #, java-format
 msgid "Are you sure you want to delete {0}?"
-msgstr ""
+msgstr "¿Está seguro que desea eliminar {0}?"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270
 msgid "Delete"
 msgstr "Borrar"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:343
 msgid "Add key"
 msgstr "Añadir clave"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:341
 msgid "Delete key"
 msgstr "Borrar clave"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:21
 msgid "You must enter a destination"
-msgstr "¡Tienes que entrar un destino!"
+msgstr "Tienes que introducir un destino"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:23
 msgid "You must enter a key"
-msgstr "Tienes que entrar una clave"
+msgstr "Tienes que introducir una clave"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41
@@ -1768,7 +1784,7 @@ msgstr "añadida al llavero"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:36
 msgid "Invalid destination or key"
-msgstr ""
+msgstr "Clave de destino o llave no válida"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41
 msgid "removed from keyring"
@@ -1784,43 +1800,43 @@ msgstr "Destino no válido"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:82
 msgid "Log overrides updated"
-msgstr ""
+msgstr "Reemplazos del registro actualizados"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:160
 msgid "Log configuration saved"
-msgstr "Guardados los ajustes de registros"
+msgstr "Guardados los ajustes de los registros"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:48
 msgid "Add additional logging statements above. Example: net.i2p.router.tunnel=WARN"
-msgstr ""
+msgstr "Añadir nuevos argumentos para el registro arriba. Ejemplo: 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 "O añadir nuevos argumentos en el archivo logger.config Ejemplo: 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 "Los niveles válidos son DEBUG, INFO, WARN, ERROR, CRIT"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 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
 msgid "ERROR"
-msgstr ""
+msgstr "ERROR"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 msgid "INFO"
-msgstr ""
+msgstr "INFO"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 msgid "WARN"
-msgstr ""
+msgstr "WARN"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88
 msgid "Remove"
@@ -1828,7 +1844,7 @@ msgstr "Quitar"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:125
 msgid "Select a class to add"
-msgstr ""
+msgstr "Selecciona una clase para agregar"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:204
@@ -1841,7 +1857,7 @@ msgstr "Servicio"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381
 #: ../java/strings/Strings.java:72
 msgid "Tunnels"
 msgstr "Túneles"
@@ -1855,7 +1871,7 @@ msgid "Clients"
 msgstr "Clientes"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:293
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315
 msgid "Keyring"
 msgstr "Llavero"
 
@@ -1865,13 +1881,13 @@ msgstr "Registros"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255
 #: ../java/strings/Strings.java:67
 msgid "Peers"
 msgstr "Pares"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:389
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143
 msgid "Stats"
 msgstr "Estadísticas"
@@ -1882,19 +1898,21 @@ msgstr "Avanzado"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:360
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:341
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:377
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:397
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:362
 msgid "Save changes"
-msgstr "Guardar"
+msgstr "Guardar cambios"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:121
 msgid "Rechecking router reachability..."
-msgstr ""
+msgstr "Segunda verificación de accesibilidad del router ..."
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:153
 msgid "Updating IP address"
@@ -1902,31 +1920,31 @@ msgstr "Actualizando dirección IP"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:171
 msgid "Disabling TCP completely"
-msgstr ""
+msgstr "Desactivando TCP completamente"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:175
 msgid "Updating inbound TCP address to"
-msgstr ""
+msgstr "Actualizando las direcciones de entrada TCP a "
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:179
 msgid "Disabling inbound TCP"
-msgstr ""
+msgstr "Desactivando TCP entrante"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:181
 msgid "Updating inbound TCP address to auto"
-msgstr ""
+msgstr "Actualizando la dirección TCP de entrada a automático"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:190
 msgid "Updating inbound TCP port to"
-msgstr ""
+msgstr "Actualizando el puerto de entrada TCP a "
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:193
 msgid "Updating inbound TCP port to auto"
-msgstr ""
+msgstr "Actualizando el puerto de entrada TCP a automático"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205
 msgid "Updating UDP port from"
-msgstr ""
+msgstr "Actualizando el puerto UDP desde"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205
 msgid "to"
@@ -1934,37 +1952,38 @@ msgstr "a"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:221
 msgid "Gracefully restarting into Hidden Router Mode"
-msgstr ""
+msgstr "Reiniciando de forma controlada en modo router oculto"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:223
 msgid "Gracefully restarting to exit Hidden Router Mode"
-msgstr ""
+msgstr "Reiniciando de forma controlada para salir del modo router oculto"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:232
 msgid "Enabling UPnP, restart required to take effect"
-msgstr ""
+msgstr "Activando UPnP, Se requiere reiniciar para que los cambios surtan efecto"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:234
 msgid "Disabling UPnP, restart required to take effect"
-msgstr ""
+msgstr "Deshabilitando UPnP, se requiere un reinicio para que los cambios surtan efectp"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:242
 msgid "Enabling laptop mode"
-msgstr ""
+msgstr "Activando el modo ordenador portátil"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:244
 msgid "Disabling laptop mode"
-msgstr ""
+msgstr "Desactivando el modo ordenador portátil"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:250
 msgid "Requiring SSU introducers"
-msgstr ""
+msgstr "Exigir introductores SSU"
 
-#. There's a few changes that don't really require restart (e.g. enabling inbound TCP)
+#. There's a few changes that don't really require restart (e.g. enabling
+#. inbound TCP)
 #. But it would be hard to get right, so just do a restart.
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:291
 msgid "Gracefully restarting I2P to change published router address"
-msgstr ""
+msgstr "Reiniciando I2P de forma controlada para cambiar la dirección publicada del router"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:314
 msgid "Updating bandwidth share percentage"
@@ -1989,58 +2008,76 @@ msgstr "bits por segundo"
 #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173
 #, java-format
 msgid "or {0} bytes per month maximum"
-msgstr ""
+msgstr "ó {0} bytes por mes como máximo"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:333
 msgid "Ban peer until restart"
-msgstr ""
+msgstr "Banear par hasta el reinicio"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:23
 #, java-format
 msgid "Manually banned via {0}"
-msgstr ""
+msgstr "Manualmente baneado a través de {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
 msgid "banned until restart"
-msgstr ""
+msgstr "baneado hasta el reinicio"
 
 #: ../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 "par no válido"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335
 msgid "Unban peer"
-msgstr ""
+msgstr "Desbanear par"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
 msgid "unbanned"
-msgstr ""
+msgstr "desbaneado"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
 msgid "is not currently banned"
-msgstr ""
+msgstr "no se encuentra baneado"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:361
 msgid "Adjust peer bonuses"
-msgstr ""
+msgstr "Ajustar bonus de pares"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47
 msgid "Bad speed value"
-msgstr ""
+msgstr "valor de velocidad Malo"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:52
 msgid "Bad capacity value"
-msgstr ""
+msgstr "valor de la capacidad Malo"
 
-#. Normal browsers send value, IE sends button label
-#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:368
+msgid "Save changes and reseed now"
+msgstr "Guardar cambios y resembrar ahora"
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21
+msgid "Reseeding is already in progress"
+msgstr "Resembrar ya está en proceso"
+
+#. skip the nonce checking in ReseedHandler
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24
+msgid "Starting reseed process"
+msgstr "Iniciando el proceso de resembrar"
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66
+msgid "Configuration saved successfully."
+msgstr "Configuración guardada correctamente."
+
+#. Normal browsers send value, IE sends button label
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:293
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:311
 msgid "Shutdown immediately"
 msgstr "Apagar en seguida"
 
@@ -2048,15 +2085,15 @@ msgstr "Apagar en seguida"
 #. give the UI time to respond
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:36
 msgid "Cancel shutdown"
-msgstr "Cancelar el apagarse"
+msgstr "Cancelar apagado"
 
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:37
 msgid "Cancel restart"
-msgstr "Cancelar el reiniciarse"
+msgstr "Cancelar reinicio"
 
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:39
 msgid "Restart immediately"
-msgstr "Reiniciar en seguida"
+msgstr "Reiniciar inmediatamente"
 
 #. ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns
 #. give the UI time to respond
@@ -2070,11 +2107,11 @@ msgstr "Apagar"
 
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:59
 msgid "Restart imminent"
-msgstr "por reiniciarse"
+msgstr "Reinicio inminente"
 
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:61
 msgid "Shutdown imminent"
-msgstr "por apagarse"
+msgstr "Apagado inminente"
 
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:65
 #, java-format
@@ -2087,155 +2124,128 @@ msgid "Restart in {0}"
 msgstr "Reiniciando en {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309
 msgid "Shutdown gracefully"
-msgstr ""
+msgstr "Apagar de forma controlada"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:56
 msgid "Graceful shutdown initiated"
-msgstr ""
+msgstr "Iniciado el apagado controlado"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:60
 msgid "Shutdown immediately!  boom bye bye bad bwoy"
-msgstr ""
+msgstr "Apagar inmediatamente!   Boom adiós chico malo"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:313
 msgid "Cancel graceful shutdown"
-msgstr ""
+msgstr "Cancelar el apagado controlado"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:63
 msgid "Graceful shutdown cancelled"
-msgstr ""
+msgstr "Cancelado el apagado controlado"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325
 msgid "Graceful restart"
-msgstr ""
+msgstr "Reinicio controlado"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:67
 msgid "Graceful restart requested"
-msgstr ""
+msgstr "Ha sido solicitado el reinicio controlado"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327
 msgid "Hard restart"
-msgstr ""
+msgstr "Reinicio rápido"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:71
 msgid "Hard restart requested"
-msgstr ""
+msgstr "Reinicio rápido solicitado"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:72
 msgid "Rekey and Restart"
-msgstr ""
+msgstr "limpiar claves y reiniciar"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:73
 msgid "Rekeying after graceful restart"
-msgstr ""
+msgstr "Reinicio de claves después del reinicio controlado"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:76
 msgid "Rekey and Shutdown"
-msgstr ""
+msgstr "limpiar claves y apagar"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:77
 msgid "Rekeying after graceful shutdown"
-msgstr ""
+msgstr "Reinicio de claves después del apagado controlado"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353
 msgid "Run I2P on startup"
-msgstr ""
+msgstr "Ejecutar I2P al arrancar el sistema"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355
 msgid "Don't run I2P on startup"
-msgstr ""
+msgstr "No ejecutar I2P al arrancar el sistema"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:373
 msgid "Dump threads"
-msgstr ""
+msgstr "deshechar threads"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323
-msgid "Show systray icon"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
-msgid "System tray icon enabled."
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110
-msgid "System tray icon feature not supported on this platform. Sorry!"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
-msgid "Warning: unable to contact the systray manager"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325
-msgid "Hide systray icon"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108
-msgid "System tray icon disabled."
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:381
 msgid "View console on startup"
-msgstr ""
+msgstr "Mostrar consola al iniciar"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93
 msgid "Console is to be shown on startup"
-msgstr ""
+msgstr "La consola se mostrará al iniciar"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:383
 msgid "Do not view console on startup"
-msgstr ""
+msgstr "No mostrar consola al iniciar"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
 msgid "Console is not to be shown on startup"
-msgstr ""
+msgstr "La consola no se mostrará al iniciar"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105
 msgid "Service installed"
 msgstr "Servicio instalado"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107
 msgid "Warning: unable to install the service"
-msgstr ""
+msgstr "Advertencia: no se puede instalar el servicio"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
 msgid "Service removed"
 msgstr "Servicio quitado"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
 msgid "Warning: unable to remove the service"
-msgstr ""
+msgstr "Advertencia: no se puede quitar el servicio"
 
 #: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:111
 msgid "Stat filter and location updated successfully to"
-msgstr ""
+msgstr "Filtro de estadísticas y ubicación actualizados correctamente a "
 
 #: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:113
 msgid "Failed to update the stat filter and location"
-msgstr ""
+msgstr "No se pudo actualizar el filtro de estadísticas y ubicación"
 
 #: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:114
 msgid "Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>"
-msgstr ""
+msgstr "Lista del gráfico actualizada, puede tardar hasta 60s en reflejarse aquí y en la <a href=\"graphs.jsp\">Página de Gráficos</a>"
 
-#. 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:135
 msgid "Updated settings for all pools."
-msgstr ""
+msgstr "Actualizada la configuración para todos los valores."
 
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:140
 msgid "Exploratory tunnel configuration saved successfully."
@@ -2244,7 +2254,7 @@ msgstr "Ajustes de los túneles exploratorios guardados con éxito"
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142
 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:36
 msgid "Error saving the configuration (applied but not saved) - please see the error logs."
-msgstr ""
+msgstr "Error al guardar la configuración (aplicada pero no guardada) - por favor consulte los registros de errores."
 
 #. * dummies for translation
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14
@@ -2258,61 +2268,61 @@ msgstr[1] "{0} saltos"
 #, java-format
 msgid "1 tunnel"
 msgid_plural "{0} tunnels"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 túnel"
+msgstr[1] "{0} túneles"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
 msgid "Exploratory tunnels"
 msgstr "Túneles exploratorios"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61
-msgid "Client tunnels for"
-msgstr "Túneles clientes para"
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:51
+#, java-format
+msgid "Client tunnels for {0}"
+msgstr "Túneles de cliente para {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
 msgid "ANONYMITY WARNING - Settings include 0-hop tunnels."
-msgstr ""
+msgstr "ADVERTENCIA DE ANONIMATO - Los ajustes incluyen túneles de 0 saltos."
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:79
 msgid "ANONYMITY WARNING - Settings include 1-hop tunnels."
-msgstr ""
+msgstr "ADVERTENCIA DE ANONIMATO - Los ajustes incluyen los túneles de 1 salto."
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
 msgid "PERFORMANCE WARNING - Settings include very long tunnels."
-msgstr ""
+msgstr "ADVERTENCIA DE RENDIMIENTO - Los ajustes incluyen túneles de gran longitud."
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:85
 msgid "PERFORMANCE WARNING - Settings include high tunnel quantities."
-msgstr ""
+msgstr "ADVERTENCIA DE RENDIMIENTO - Los ajustes incluyen grandes cantidades de túneles."
 
 #. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n");
 #. tunnel depth
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:92
 msgid "Length"
-msgstr ""
+msgstr "Longitud"
 
 #. tunnel depth variance
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:109
 msgid "Randomization"
-msgstr ""
+msgstr "Aleatoriedad"
 
 #. tunnel quantity
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:133
 msgid "Quantity"
 msgstr "Cantidad"
 
 #. tunnel backup quantity
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:150
 msgid "Backup quantity"
 msgstr "Cantidad de reserva"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:172
 msgid "Inbound options"
 msgstr "Opciones de Entrada"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:185
 msgid "Outbound options"
 msgstr "Opciones de Salida"
 
@@ -2322,42 +2332,45 @@ msgstr "Cambio del tema guardado."
 
 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:33
 msgid "Refresh the page to view."
-msgstr ""
+msgstr "Actualiza la página para ver."
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+msgid "Arabic"
+msgstr "Árabe"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "English"
 msgstr "Inglés"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "French"
 msgstr "Francés"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "German"
 msgstr "Alemán"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "Spanish"
 msgstr "Español"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Dutch"
 msgstr "Neerlandés"
 
-# added manually
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Portuguese"
 msgstr "Portugués"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Russian"
 msgstr "Ruso"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
 msgid "Chinese"
 msgstr "Chino"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
 msgid "Swedish"
 msgstr "Sueco"
 
@@ -2371,39 +2384,39 @@ msgstr "Actualización disponible; ¡presiona el botón al lado izquierdo para d
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:93
 msgid "No update available"
-msgstr "No está disponible ninguna actualización"
+msgstr "Ninguna actualización disponible"
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:101
 msgid "Updating news URL to"
-msgstr ""
+msgstr "Actualizando URL de noticias a "
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:109
 msgid "Updating proxy host to"
-msgstr ""
+msgstr "Actualizando host de proxy a "
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:117
 msgid "Updating proxy port to"
-msgstr ""
+msgstr "Actualizando puerto del servidor proxy a "
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:130
 msgid "Updating refresh frequency to"
-msgstr ""
+msgstr "Actualizando frecuencia de refresco a "
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:137
 msgid "Updating update policy to"
-msgstr ""
+msgstr "Actualizando política de actualización a "
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:146
 msgid "Updating update URLs."
-msgstr ""
+msgstr "Actualizando URLs para la actualización"
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:155
 msgid "Updating trusted keys."
-msgstr ""
+msgstr "Actualizando claves de confianza."
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:163
 msgid "Updating unsigned update URL to"
-msgstr ""
+msgstr "Actualizando URL de actualización no firmada a "
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88
 #: ../java/src/net/i2p/router/web/GraphHelper.java:167
@@ -2426,27 +2439,27 @@ msgstr "Sólo descargar y verificar"
 msgid "Download, verify, and restart"
 msgstr "Descargar, verificar y reiniciar"
 
-#: ../java/src/net/i2p/router/web/FormHandler.java:174
+#: ../java/src/net/i2p/router/web/FormHandler.java:176
 msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."
-msgstr ""
+msgstr "El formulario introducido es inválido, probablemente por haber utilizado el botón 'atrás' ó 'refrescar' del navegador. Por favor, reinténtelo."
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:93
 msgid "Combined bandwidth graph"
-msgstr ""
+msgstr "gráfico de ancho de banda combinado"
 
 #. e.g. "statname for 60m"
 #: ../java/src/net/i2p/router/web/GraphHelper.java:107
 #, java-format
 msgid "{0} for {1}"
-msgstr ""
+msgstr "{0} para {1}"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:146
 msgid "Configure Graph Display"
-msgstr ""
+msgstr "Configuración de la gráfica"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:146
 msgid "Select Stats"
-msgstr ""
+msgstr "Seleccionar Estadísticas"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:150
 msgid "Periods"
@@ -2454,17 +2467,17 @@ msgstr "Períodos"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:151
 msgid "Plot averages"
-msgstr ""
+msgstr "promedios de la trama"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:152
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:351
 msgid "or"
 msgstr "o"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:152
 msgid "plot events"
-msgstr ""
+msgstr "eventos de la trama"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:153
 msgid "Image sizes"
@@ -2476,7 +2489,7 @@ msgstr "ancho"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:154
 msgid "height"
-msgstr "altura"
+msgstr "alto"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:154
 #: ../java/src/net/i2p/router/web/GraphHelper.java:155
@@ -2485,20 +2498,20 @@ msgstr "píxeles"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:156
 msgid "Refresh delay"
-msgstr ""
+msgstr "Retardo de actualización"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:171
 msgid "Redraw"
-msgstr ""
+msgstr "Redibujar"
 
 #: ../java/src/net/i2p/router/web/GraphHelper.java:203
 msgid "Graph settings saved"
-msgstr ""
+msgstr "configuración de gráfico guardada"
 
 #: ../java/src/net/i2p/router/web/LogsHelper.java:13
 #: ../java/src/net/i2p/router/web/LogsHelper.java:37
 msgid "File location"
-msgstr ""
+msgstr "Ubicación del archivo"
 
 #: ../java/src/net/i2p/router/web/LogsHelper.java:34
 msgid "File not found"
@@ -2506,37 +2519,37 @@ msgstr "Archivo no encontrado"
 
 #: ../java/src/net/i2p/router/web/LogsHelper.java:52
 msgid "No log messages"
-msgstr ""
+msgstr "No hay mensajes de registro"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:80
 msgid "Network Database RouterInfo Lookup"
-msgstr ""
+msgstr "Busqueda de RouterInfo en la base de datos de red"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:95
 #: ../java/strings/Strings.java:68
 msgid "Router"
-msgstr "Enrutador"
+msgstr "Router"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:95
 msgid "not found in network database"
-msgstr ""
+msgstr "no se encuentra en la base de datos de red"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:107
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:215
 msgid "Network Database Contents"
-msgstr ""
+msgstr "Contenido de la base de datos de red"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:108
 msgid "View RouterInfo"
-msgstr ""
+msgstr "Ver RouterInfo"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:109
 msgid "LeaseSets"
-msgstr ""
+msgstr "LeaseSets"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:131
 msgid "LeaseSet"
-msgstr ""
+msgstr "LeaseSet"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:133
 msgid "Local"
@@ -2549,7 +2562,7 @@ msgstr "No publicado"
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:136
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:143
 msgid "Destination"
-msgstr ""
+msgstr "Destino"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:153
 #, java-format
@@ -2564,19 +2577,19 @@ msgstr "Caducó hace {0}"
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:167
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "Gateway"
-msgstr ""
+msgstr "Gateway"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:167
 msgid "Lease"
-msgstr ""
+msgstr "Lease"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:169
 msgid "Tunnel"
-msgstr ""
+msgstr "Túnel"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:215
 msgid "View LeaseSets"
-msgstr ""
+msgstr "Ver LeaseSets"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:217
 msgid "Not initialized"
@@ -2584,7 +2597,7 @@ msgstr "No inicializado"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:226
 msgid "Routers"
-msgstr "Enrutadores"
+msgstr "Routers"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:228
 msgid "Show all routers"
@@ -2592,98 +2605,98 @@ msgstr "Mostrar todos los enrutadores"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:230
 msgid "Show all routers with full stats"
-msgstr ""
+msgstr "Mostrar las estadísticas completas de todos los routers"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266
 msgid "Network Database Router Statistics"
-msgstr ""
+msgstr "Estadísticas de la base de datos de red del router"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
 msgid "Count"
-msgstr ""
+msgstr "Cuenta"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
 msgid "Transports"
-msgstr ""
+msgstr "Transportes"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
 msgid "Country"
 msgstr "País"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
 msgid "Our info"
-msgstr ""
+msgstr "Nuestra información"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346
 msgid "Peer info for"
-msgstr ""
+msgstr "Información de interlocutor para"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350
 msgid "Full entry"
-msgstr ""
+msgstr "Campo completo"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:115
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
 msgid "Hidden"
 msgstr "Oculto"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
 msgid "Updated"
 msgstr "Actualizado"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:355
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360
 #, java-format
 msgid "{0} ago"
 msgstr "hace {0}"
 
 #. shouldnt happen
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
 msgid "Published"
 msgstr "Publicado"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365
 msgid "Address(es)"
 msgstr "Dirección(es)"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378
 msgid "cost"
-msgstr ""
+msgstr "coste"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "Hidden or starting up"
-msgstr ""
+msgstr "Oculto o iniciando"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "SSU"
-msgstr ""
+msgstr "SSU"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "SSU with introducers"
-msgstr ""
+msgstr "SSU con introductores"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP"
-msgstr ""
+msgstr "NTCP"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP and SSU"
-msgstr ""
+msgstr "NTCP y SSU"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP and SSU with introducers"
-msgstr ""
+msgstr "NTCP y SSU con introductores"
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:93
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:92
 #, java-format
 msgid "News last updated {0} ago."
 msgstr "Noticias actualizadas hace {0}."
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:99
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:98
 #, java-format
 msgid "News last checked {0} ago."
 msgstr "Noticias chequeadas hace {0}."
@@ -2691,162 +2704,163 @@ msgstr "Noticias chequeadas hace {0}."
 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:77
 #, java-format
 msgid "Cannot check, plugin {0} is not installed"
-msgstr ""
+msgstr "No se puede comprobar, el complemento {0} no está instalado"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:129
 #, java-format
 msgid "Checking for update of plugin {0}"
-msgstr ""
+msgstr "Buscando actualizaciones para el complemento {0}"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:154
 #, java-format
 msgid "New plugin version {0} is available"
-msgstr ""
+msgstr "Hay una nueva versión del complemento {0} disponible"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:156
 #, java-format
 msgid "No new version is available for plugin {0}"
-msgstr ""
+msgstr "No hay nuevas versiones disponibles para el complemento {0}"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:165
 #, java-format
 msgid "Update check failed for plugin {0}"
-msgstr ""
+msgstr "Fallo al buscar actualizaciones para el complemento {0}"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:139
 msgid "Downloading plugin"
-msgstr ""
+msgstr "Descargando complemento"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:244
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:245
 #, java-format
 msgid "{0}B transferred"
-msgstr ""
+msgstr "{0}B transferidos"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:152
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153
 msgid "Plugin downloaded"
-msgstr ""
+msgstr "Complemento descargado"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:157
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:344
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356
 #, java-format
 msgid "Cannot create plugin directory {0}"
-msgstr ""
+msgstr "No se puede crear directorio del complemento {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:166
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:298
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:299
 #, java-format
 msgid "from {0}"
-msgstr ""
+msgstr "de {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:176
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177
 #, java-format
 msgid "Plugin from {0} is corrupt"
-msgstr ""
+msgstr "El complemento de {0} está dañado."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:187
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188
 #, java-format
 msgid "Plugin from {0} does not contain the required configuration file"
-msgstr ""
+msgstr "El complemento de {0} no contiene el archivo de configuración necesario."
 
-#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:200
+#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' '
+#. + signer + "</b>");
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201
 #, java-format
 msgid "Plugin from {0} contains an invalid key"
-msgstr ""
+msgstr "El complemento de {0} contiene una clave no válida."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:219
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:228
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:237
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249
 #, java-format
 msgid "Plugin signature verification of {0} failed"
-msgstr ""
+msgstr "Verificación de la firma del complemento de {0} ha fallado"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:252
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264
 #, java-format
 msgid "Plugin from {0} has invalid name or version"
-msgstr ""
+msgstr "El complemento de {0} tiene nombre o versión no válido."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:257
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269
 #, java-format
 msgid "Plugin {0} has mismatched versions"
-msgstr ""
+msgstr "El complemento {0} tiene versiones no coincidentes."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:265
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277
 #, java-format
 msgid "This plugin requires I2P version {0} or higher"
-msgstr ""
+msgstr "Este complemento requiere la versión {0} o superior de I2P."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:273
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285
 #, java-format
 msgid "This plugin requires Java version {0} or higher"
-msgstr ""
+msgstr "Este complemento requiere la versión {0} o superior de Java."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:281
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
 msgid "Downloaded plugin is for new installs only, but the plugin is already installed"
-msgstr ""
+msgstr "El complemento descargado es sólo para instalaciones nuevas, pero el complemento ya está instalado."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305
 msgid "Installed plugin does not contain the required configuration file"
-msgstr ""
+msgstr "El complemento instalado no contiene el archivo de configuración necesario."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:301
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313
 msgid "Signature of downloaded plugin does not match installed plugin"
-msgstr ""
+msgstr "La firma del complemento descargado no coincide con la del instalado."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:308
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320
 #, java-format
 msgid "Downloaded plugin version {0} is not newer than installed plugin"
-msgstr ""
+msgstr "El complemento descargado con versión {0} no es más reciente que la versión ya instalada."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:315
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or higher"
-msgstr ""
+msgstr "La actualización del complemento requiere tener instalada la versión {0} o superior de este complemento."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:322
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or lower"
-msgstr ""
+msgstr "La actualización del complemento requiere tener instalada la versión {0} o inferior de este complemento."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:339
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351
 msgid "Plugin is for upgrades only, but the plugin is not installed"
-msgstr ""
+msgstr "El complemento es sólo para actualizaciones, pero el complemento aún no está instalado."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:352
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364
 #, java-format
 msgid "Failed to install plugin in {0}"
-msgstr ""
+msgstr "No se pudo instalar el complemento en {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:359
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371
 #, java-format
 msgid "Plugin {0} installed, router restart required"
-msgstr ""
+msgstr "Complemento {0} instalado, se requiere un reinicio del router."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:361
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373
 #, java-format
 msgid "Plugin {0} installed"
-msgstr ""
+msgstr "Complemento {0} instalado"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:379
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391
 #, java-format
 msgid "Plugin {0} installed and started"
-msgstr ""
+msgstr "Complemento {0} instalado e iniciado"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:382
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394
 #, java-format
 msgid "Plugin {0} installed but failed to start, check logs"
-msgstr ""
+msgstr "Complemento {0} instalado pero no funciona, ¡revisa los registros!"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:384
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396
 #, java-format
 msgid "Plugin {0} installed but failed to start"
-msgstr ""
+msgstr "Complemento {0} instalado, pero no se pudo iniciar."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406
 #, java-format
 msgid "Failed to download plugin from {0}"
-msgstr ""
+msgstr "No se pudo descargar el complemento de {0}."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:72
 msgid "Peer Profiles"
@@ -2854,37 +2868,43 @@ msgstr "Perfiles de los pares"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73
 #, java-format
-msgid "Showing {0} recent profiles."
-msgstr "Mostrando {0} perfiles recientes"
+msgid "Showing 1 recent profile."
+msgid_plural "Showing {0} recent profiles."
+msgstr[0] "Mostrando 1 perfil reciente."
+msgstr[1] "Mostrando {0} Perfiles recientes."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75
 #, java-format
-msgid "Hiding {0} older profiles."
-msgstr "Ocultando {0} perfiles antiguos"
+msgid "Hiding 1 older profile."
+msgid_plural "Hiding {0} older profiles."
+msgstr[0] "Ocultando 1 perfil más antiguo."
+msgstr[1] "Ocultando {0} perfiles más antiguos."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77
 #, java-format
-msgid "Hiding {0} standard profiles."
-msgstr "Ocultando {0} perfiles estándar"
+msgid "Hiding 1 standard profile."
+msgid_plural "Hiding {0} standard profiles."
+msgstr[0] "Ocultando 1 perfil estándar."
+msgstr[1] "Ocultando {0} perfiles estándar."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82
 msgid "Groups (Caps)"
-msgstr ""
+msgstr "Grupos (Caps)"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:353
 msgid "Speed"
 msgstr "Velocidad"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:339
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:357
 msgid "Capacity"
 msgstr "Capacidad"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
 msgid "Integration"
 msgstr "Integración"
 
@@ -2902,7 +2922,7 @@ msgstr "Alta  Capacidad"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:128
 msgid "Standard"
-msgstr ""
+msgstr "Estándar"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:129
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:163
@@ -2910,7 +2930,7 @@ msgid "Failing"
 msgstr "Fallando"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282
 msgid "Integrated"
 msgstr "Integrados"
 
@@ -2923,287 +2943,310 @@ msgstr "Inaccesible"
 msgid "Test Fails"
 msgstr "Test fallido"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177
 msgid "profile"
 msgstr "perfil"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186
 msgid "Floodfill and Integrated Peers"
-msgstr ""
+msgstr "Floodfill e pares Integrados"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
 msgid "Caps"
 msgstr "Categorías"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
 msgid "Integ. Value"
 msgstr "Valor de Integración"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
 msgid "Last Heard About"
-msgstr ""
+msgstr "sabido por última vez sobre"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
 msgid "Last Heard From"
-msgstr ""
+msgstr "sabido por última vez de"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
 msgid "Last Good Send"
-msgstr ""
+msgstr "Último Enviado Correctamente"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
 msgid "Last Bad Send"
-msgstr ""
+msgstr "Último Enviado con Errores"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
 msgid "10m Resp. Time"
-msgstr ""
+msgstr "Tiempo resp. 10m"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
 msgid "1h Resp. Time"
-msgstr ""
+msgstr "Tiempo resp. 1h"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
 msgid "1d Resp. Time"
-msgstr ""
+msgstr "Tiempo resp. 1d"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
 msgid "Last Good Lookup"
-msgstr ""
+msgstr "Última Buena Búsqueda"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
 msgid "Last Bad Lookup"
-msgstr ""
+msgstr "Última Mala Búsqueda"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
 msgid "Last Good Store"
-msgstr ""
+msgstr "Última Buena Guardada"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
 msgid "Last Bad Store"
-msgstr ""
+msgstr "Última Mala Guardada"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203
 msgid "1h Fail Rate"
-msgstr ""
+msgstr "Tasa de error de 1h"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204
 msgid "1d Fail Rate"
-msgstr ""
+msgstr "Tasa de error de 1d"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
 msgid "Thresholds"
-msgstr ""
+msgstr "Umbrales"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
 msgid "fast peers"
 msgstr "pares rápidos"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
 msgid "high capacity peers"
 msgstr "pares de alta capacidad"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
 msgid " well integrated peers"
-msgstr ""
+msgstr "Pares bien integrados"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
 msgid "as determined by the profile organizer"
-msgstr ""
+msgstr "según lo determinado por el organizador del perfil"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
 msgid "groups"
 msgstr "grupos"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
 msgid "capabilities in the netDb, not used to determine profiles"
-msgstr ""
+msgstr "capacidades en el netDb, no se utilizan para determinar los perfiles"
 
 #. capabilities
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
 #: ../java/strings/Strings.java:81
 msgid "caps"
-msgstr ""
+msgstr "límites"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
 msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel"
-msgstr ""
+msgstr "rendimiento máximo (bytes por segundo) durante un período de 1 minuto que el par ha sostenido en un solo túnel"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
 msgid "speed"
 msgstr "velocidad"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
 msgid "capacity"
 msgstr "capacidad"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
 msgid "how many tunnels can we ask them to join in an hour?"
-msgstr ""
+msgstr "a cuántos túneles podemos pedirlos que se unan en una hora?"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
 msgid "how many new peers have they told us about lately?"
-msgstr ""
+msgstr "de cuántos nuevos pares nos han hablado últimamente?"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
 msgid "integration"
 msgstr "integración"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
 msgid "is the peer banned, or unreachable, or failing tunnel tests?"
-msgstr ""
+msgstr "está el par baneado, o inalcanzable, o fallando las pruebas de túnel?"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
 msgid "status"
 msgstr "estado"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:410
+msgid "none"
+msgstr "ninguno"
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:62
 #, java-format
 msgid "Temporary ban expiring in {0}"
-msgstr ""
+msgstr "El baneado temporal expirará en {0}"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64
 #, java-format
 msgid "Banned until restart or in {0}"
-msgstr ""
+msgstr "Baneado hasta reinicio o en {0}"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:76
 msgid "unban now"
-msgstr ""
+msgstr "Desbanear ahora"
 
-#. Note to translators: all runtime zh translation disabled in this file, no font available in RRD
+#. Note to translators: all runtime zh translation disabled in this file, no
+#. font available in RRD
 #: ../java/src/net/i2p/router/web/StatSummarizer.java:223
 msgid "Bandwidth usage"
-msgstr ""
+msgstr "Uso de ancho de banda"
 
 #: ../java/src/net/i2p/router/web/StatSummarizer.java:230
 msgid "Outbound bytes/sec"
-msgstr ""
+msgstr "bytes/seg de salida"
 
 #. def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3);
 #: ../java/src/net/i2p/router/web/StatSummarizer.java:232
 msgid "Inbound bytes/sec"
-msgstr ""
+msgstr "bytes/seg entrantes"
 
 #: ../java/src/net/i2p/router/web/StatSummarizer.java:235
 #: ../java/src/net/i2p/router/web/StatSummarizer.java:236
 #: ../java/src/net/i2p/router/web/StatSummarizer.java:237
 #: ../java/src/net/i2p/router/web/StatSummarizer.java:238
 msgid "bytes/sec"
-msgstr ""
+msgstr "bytes/seg"
 
 #: ../java/src/net/i2p/router/web/StatSummarizer.java:235
 msgid "out average"
-msgstr ""
+msgstr "media de salida"
 
 #: ../java/src/net/i2p/router/web/StatSummarizer.java:236
 #: ../java/src/net/i2p/router/web/StatSummarizer.java:238
 #: ../java/src/net/i2p/router/web/SummaryRenderer.java:115
 msgid "max"
-msgstr ""
+msgstr "max"
 
 #: ../java/src/net/i2p/router/web/StatSummarizer.java:237
 msgid "in average"
-msgstr ""
+msgstr "en promedio"
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:57
 msgid "GO"
-msgstr ""
+msgstr "GO"
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:60
 msgid "Statistics gathered during this router's uptime"
-msgstr ""
+msgstr "Estadísticas recopiladas durante el funcionamiento de este router"
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:63
 msgid "The data gathered is quantized over a 1 minute period, so should just be used as an estimate."
-msgstr ""
+msgstr "Los datos recogidos se cuantifican en un período de 1 minuto, por lo que sólo deben utilizarse como estimación."
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:64
 msgid "These statistics are primarily used for development and debugging."
-msgstr ""
+msgstr "Estas estadísticas se utilizan principalmente para el desarrollo y depuración."
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:105
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:156
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:106
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:157
 msgid "No lifetime events"
-msgstr ""
+msgstr "No hay eventos de duración ilimitada"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:116
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:117
 msgid "frequency"
 msgstr "frecuencia"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:120
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:121
 msgid "Rolling average events per period"
-msgstr ""
+msgstr "Promedio de eventos móviles por período"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:124
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:125
 msgid "Highest events per period"
-msgstr ""
+msgstr "Más eventos por período"
 
-#. 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
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:136
 msgid "Lifetime average events per period"
-msgstr ""
+msgstr "Media de eventos por período en la vida"
 
 #. Display the strict average
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:140
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:141
 msgid "Lifetime average frequency"
-msgstr ""
+msgstr "Frecuencia media en la vida"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:144
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:234
+#, java-format
+msgid "1 event"
+msgid_plural "{0} events"
+msgstr[0] "1 evento"
+msgstr[1] "{0} eventos"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:168
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:169
 msgid "rate"
 msgstr "Tasa"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:170
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:171
 msgid "Average"
 msgstr "Promedio"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:173
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:174
 msgid "Highest average"
 msgstr "Promedio máximo"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:202
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:201
 #, java-format
-msgid "in this period which ended {0} ago."
-msgstr ""
+msgid "There was 1 event in this period."
+msgid_plural "There were {0} events in this period."
+msgstr[0] "Hubo 1 evento en este período."
+msgstr[1] "Hubo {0} eventos en este período."
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:204
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:203
+#, java-format
+msgid "The period ended {0} ago."
+msgstr "El período terminó hace {0}."
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:205
 msgid "No events"
 msgstr "sin acontecimientos"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:210
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:211
 msgid "Average event count"
-msgstr ""
+msgstr "número medio de eventos"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:212
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:213
 msgid "Events in peak period"
-msgstr ""
+msgstr "Eventos en temporada alta"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:220
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:221
 msgid "Graph Data"
-msgstr ""
+msgstr "Datos de gráfica"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:222
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:223
 msgid "Graph Event Count"
-msgstr ""
+msgstr "Número de eventos en el Gráfico"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:225
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:226
 msgid "Export Data as XML"
-msgstr ""
+msgstr "Exportar datos como XML"
 
 #. Display the strict average
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:230
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:231
 msgid "Lifetime average value"
-msgstr ""
+msgstr "Valor medio total"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:41
 msgid "I2P Router Help &amp; FAQ"
-msgstr "Ayuda acerca del enrutador I2P &amp; FAQ"
+msgstr "Ayuda del router I2P &amp; preguntas frecuentes"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:43
 msgid "Help &amp; FAQ"
@@ -3211,7 +3254,7 @@ msgstr "Ayuda"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:55
 msgid "Configure startup of clients and webapps (services); manually start dormant services"
-msgstr "Configura el arranque de clientes y servicios o lanza servicios no activados"
+msgstr "Configura el arranque de clientes y servicios (webapps) o lanza servicios no activados"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:57
 msgid "I2P Services"
@@ -3219,7 +3262,7 @@ msgstr "Servicios I2P"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:63
 msgid "Manage your I2P hosts file here (I2P domain name resolution)"
-msgstr ""
+msgstr "Administrar el archivo hosts de I2P aquí (resolución de nombres de dominio I2P)"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:65
 msgid "Addressbook"
@@ -3227,7 +3270,7 @@ msgstr "Libreta de direcciones"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:69
 msgid "Built-in anonymous BitTorrent Client"
-msgstr ""
+msgstr "Cliente BitTorrent anónimo integrado"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:71
 msgid "Torrents"
@@ -3235,35 +3278,35 @@ msgstr "Torrents"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:75
 msgid "Anonymous webmail client"
-msgstr ""
+msgstr "Cliente webmail anónimo"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:77
 msgid "Webmail"
-msgstr "Mensagería web"
+msgstr "Webmail"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:81
 msgid "Anonymous resident webserver"
-msgstr ""
+msgstr "Servidor web residente anónimo "
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:83
 msgid "Webserver"
-msgstr "Servidor web"
+msgstr "ServidorWeb"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:91
 msgid "Configure I2P Router"
-msgstr "Configura enrutador I2P"
+msgstr "Configurar router I2P"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:93
 msgid "I2P Internals"
 msgstr "Configuración"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379
 msgid "View existing tunnels and tunnel build status"
-msgstr ""
+msgstr "Ver los túneles existentes y el estado de construcción de túneles"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253
 msgid "Show all current peer connections"
 msgstr "Mostrar todas las conexiones actuales con pares"
 
@@ -3277,23 +3320,23 @@ msgstr "Perfiles"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:117
 msgid "Show list of all known I2P routers"
-msgstr "Mostrar lista de todos los enrutadores I2P conocidos"
+msgstr "Mostrar lista de todos los routers I2P conocidos"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:119
 msgid "NetDB"
-msgstr ""
+msgstr "NetDB"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123
 msgid "Health Report"
-msgstr ""
+msgstr "Informe de salud"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:125
 msgid "Logs"
-msgstr ""
+msgstr "Registros"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:135
 msgid "Graph router performance"
-msgstr "Mostrar el rendimiento del enrutador"
+msgstr "Mostrar el rendimiento del router"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:137
 msgid "Graphs"
@@ -3301,7 +3344,7 @@ msgstr "Gráficos"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141
 msgid "Textual router performance statistics"
-msgstr "Estadísticas textuales del rendimiento del enrutador"
+msgstr "Estadísticas textuales del rendimiento del router"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:370
@@ -3311,11 +3354,11 @@ msgstr "Destinos locales"
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149
 #: ../java/strings/Strings.java:62
 msgid "I2PTunnel"
-msgstr "I2PTunnel"
+msgstr "Túnel I2P"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164
 msgid "I2P Router Help"
-msgstr ""
+msgstr "Ayuda de Router I2P"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166
 msgid "General"
@@ -3339,7 +3382,7 @@ msgstr "mostrar"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:192
 msgid "How long we've been running for this session"
-msgstr ""
+msgstr "Cuanto tiempo hemos estado en funcionamiento durante esta sesión"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:195
 msgid "Uptime"
@@ -3347,159 +3390,166 @@ msgstr "Tiempo de servicio"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202
 msgid "Help with configuring your firewall and router for optimal I2P performance"
-msgstr ""
+msgstr "Ayuda con la configuración de cortafuegos y router para un rendimiento óptimo de I2P"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231
-msgid "Download"
-msgstr "Descargar"
+#. Note to translators: parameter is a version, e.g. "0.8.4"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:232
+#, java-format
+msgid "Download {0} Update"
+msgstr "Descargar actualización ( {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>
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240
-msgid "Download Unsigned"
-msgstr "Descargar de forma no authentificada"
+#, java-format
+msgid "Download Unsigned<br>Update {0}"
+msgstr "Descargar actualización<br>no firmada del {0}"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261
 msgid "Active"
 msgstr "Activos"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270
 msgid "Fast"
 msgstr "Rápidos"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276
 msgid "High capacity"
 msgstr "Alta capacidad"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288
 msgid "Known"
 msgstr "Conocidos"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:308
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303
 msgid "Help with firewall configuration"
-msgstr ""
+msgstr "Ayuda con la configuración del cortafuegos"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:310
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:305
 msgid "Check NAT/firewall"
-msgstr ""
+msgstr "Comprobar NAT/cortafuegos"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:330
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:325
 msgid "Reseed"
-msgstr ""
+msgstr "Rresembrar"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:347
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:342
 msgid "Configure router bandwidth allocation"
 msgstr "Configurar ancho de banda del enrutador I2P"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:344
 msgid "Bandwidth in/out"
 msgstr "Ancho de Banda entrante/saliente"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:369
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:364
 msgid "Total"
 msgstr "Total"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:371
 msgid "Used"
 msgstr "Usado"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:391
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386
 msgid "Exploratory"
 msgstr "Exploratorios"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398
 msgid "Participating"
-msgstr "Participando&nbsp;en"
+msgstr "Participando en"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:409
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404
 msgid "Share ratio"
-msgstr "Compartición"
+msgstr "Relación de compartición"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:410
 msgid "What's in the router's job queue?"
-msgstr "¿Qué está en la cola de tareas del enrutador?"
+msgstr "¿Qué está en la cola de tareas del router?"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412
 msgid "Congestion"
 msgstr "Tareas"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417
 msgid "Job lag"
 msgstr "Demora - tareas"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:428
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:423
 msgid "Message delay"
 msgstr "Demora - mensajes"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:434
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:429
 msgid "Tunnel lag"
-msgstr "Demora - túnel"
+msgstr "Demora - túneles"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435
 msgid "Backlog"
 msgstr "Peticiones pendientes"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:106
 msgid "ERR-Client Manager I2CP Error - check logs"
-msgstr ""
+msgstr "ERR- Error Administrador de Clientes I2CP - comprobar registros"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:113
 #, java-format
 msgid "ERR-Clock Skew of {0}"
-msgstr ""
+msgstr "ERR-Desviación del Reloj de {0}"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:122
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
 msgid "OK"
-msgstr "BIEN"
+msgstr "Bien"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:123
 msgid "ERR-Private TCP Address"
-msgstr ""
+msgstr "ERR-Dirección TCP Privada"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:125
 msgid "ERR-SymmetricNAT"
-msgstr ""
+msgstr "ERR-NAT Simétrico"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:128
 msgid "WARN-Firewalled with Inbound TCP Enabled"
-msgstr ""
+msgstr "AVISO-Tras cortafuegos con TCP entrante Activado"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:130
 msgid "WARN-Firewalled and Floodfill"
-msgstr ""
+msgstr "AVISO-Tras cortafuegos y Floodfill"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:132
 msgid "WARN-Firewalled and Fast"
-msgstr ""
+msgstr "AVISO-Tras cortafuegos y rápido"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:133
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
 msgid "Firewalled"
-msgstr "Bloqueado por un corta-fuegos"
+msgstr "Bloqueado por un cortafuegos"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:135
 msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
-msgstr ""
+msgstr "ERR-puerto UDP en uso - establezca i2np.udp.internalPort=xxxx = en configuración avanzada y reinicie"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:141
 msgid "ERR-No Active Peers, Check Network Connection and Firewall"
-msgstr ""
+msgstr "ERR-No hay pares activos, Compruebe la conexión de red y cortafuegos"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:144
 msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
-msgstr ""
+msgstr "ERR-UDP deshabilitado y el puerto/host de entrada TCP no ha sido establecido"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:146
 msgid "WARN-Firewalled with UDP Disabled"
-msgstr ""
+msgstr "AVISO-Tras cortafuegos con UDP deshabilitado"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:148
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
 msgid "Testing"
 msgstr "Comprobando"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:370
 msgid "Add/remove/edit &amp; control your client and server tunnels"
-msgstr ""
+msgstr "Agregar/quitar/editar &amp; controlar sus túneles de cliente y servidor"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:382
 msgid "Server"
@@ -3507,17 +3557,17 @@ msgstr "Servidor"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:386
 msgid "Show tunnels"
-msgstr "Mostrar los túneles"
+msgstr "Mostrar túneles"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:397
 msgid "Leases expired"
-msgstr ""
+msgstr "Leases expirados"
 
 #. red or yellow light
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:397
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:398
 msgid "Rebuilding"
-msgstr ""
+msgstr "Reconstruyendo"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:398
 msgid "ago"
@@ -3531,16 +3581,12 @@ msgstr "Listo"
 #. yellow light
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:405
 msgid "Building"
-msgstr ""
+msgstr "Construyendo"
 
 #: ../java/src/net/i2p/router/web/SummaryHelper.java:405
 msgid "Building tunnels"
 msgstr "Creando túneles"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:410
-msgid "none"
-msgstr "ninguno"
-
 #. tunnel nicknames, taken from i2ptunnel.config so they will display
 #. nicely under 'local destinations' in the summary bar
 #. note that if the wording changes in i2ptunnel.config, we have to
@@ -3550,20 +3596,21 @@ msgstr "ninguno"
 msgid "shared clients"
 msgstr "clientes diferentes"
 
-#. Note to translators: all runtime zh translation disabled in this file, no font available in RRD
+#. Note to translators: all runtime zh translation disabled in this file, no
+#. font available in RRD
 #: ../java/src/net/i2p/router/web/SummaryRenderer.java:89
 #, java-format
 msgid "events in {0}"
-msgstr ""
+msgstr "eventos en {0}"
 
 #: ../java/src/net/i2p/router/web/SummaryRenderer.java:91
 #, java-format
 msgid "averaged for {0}"
-msgstr ""
+msgstr "promedio por {0}"
 
 #: ../java/src/net/i2p/router/web/SummaryRenderer.java:101
 msgid "Events per period"
-msgstr ""
+msgstr "Eventos por período"
 
 #: ../java/src/net/i2p/router/web/SummaryRenderer.java:114
 msgid "avg"
@@ -3575,10 +3622,14 @@ msgstr "ahora"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:63
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:287
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:309
 msgid "configure"
 msgstr "configurar"
 
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61
+msgid "Client tunnels for"
+msgstr "Túneles de clientes para"
+
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:65
 msgid "dead"
 msgstr "muerto"
@@ -3618,37 +3669,37 @@ msgstr "Papel"
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:74
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "Usage"
-msgstr ""
+msgstr "Uso"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:107
 msgid "grace period"
-msgstr ""
+msgstr "período de gracia"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:117
 msgid "Outbound Endpoint"
-msgstr ""
+msgstr "Salida de punto final"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:119
 msgid "Inbound Gateway"
-msgstr ""
+msgstr "Gateway de entrada"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:121
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:162
 msgid "Participant"
-msgstr ""
+msgstr "Participante"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:126
 msgid "Inactive participating tunnels"
-msgstr ""
+msgstr "Túneles Inactivos participantes"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:127
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:218
 msgid "Lifetime bandwidth usage"
-msgstr ""
+msgstr "Uso de ancho de banda total"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "Expiry"
-msgstr ""
+msgstr "Expiración"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:159
 msgid "Participants"
@@ -3656,7 +3707,7 @@ msgstr "Participantes"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:165
 msgid "Endpoint"
-msgstr ""
+msgstr "Punto final"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:205
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:212
@@ -3673,7 +3724,7 @@ msgstr "saliente"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:217
 msgid "No tunnels; waiting for the grace period to end."
-msgstr ""
+msgstr "No hay túneles, esperando que termine el período de gracia."
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:219
 msgid "in"
@@ -3701,72 +3752,72 @@ msgstr "participando en"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:256
 msgid "Totals"
-msgstr "Total"
+msgstr "Totales"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:142
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:237
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:143
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:238
 msgid "Updating"
 msgstr "Actualizando"
 
 #. Process the .sud/.su2 file
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:261
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:286
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:117
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:262
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:287
 msgid "Update downloaded"
-msgstr "actualización descargada"
+msgstr "Actualización descargada"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:91
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:92
 #, java-format
 msgid "Unsigned update file from {0} is corrupt"
-msgstr ""
+msgstr "Archivo de actualización no firmado del {0} está dañado"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:281
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:282
 msgid "Restarting"
 msgstr "Reiniciando"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:288
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:119
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:289
 msgid "Click Restart to install"
 msgstr "¡Pincha en \"Reiniciar\" para instalar!"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:290
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:291
 msgid "Click Shutdown and restart to install"
 msgstr "¡Pincha en \"Apagar\" y reinicia para instalar!"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:292
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:122
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:293
 #, java-format
 msgid "Version {0}"
 msgstr "Versión {0}"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:126
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:127
 #, java-format
 msgid "Failed copy to {0}"
-msgstr "Fallido copiar a {0}"
+msgstr "Fallada copia a {0}"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:184
-#, fuzzy, java-format
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:185
+#, java-format
 msgid "Updating from {0}"
-msgstr "Actualizando"
+msgstr "Actualizando de {0}"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:253
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:254
 #, java-format
 msgid "No new version found at {0}"
-msgstr ""
+msgstr "Ninguna versión nueva encontrada en {0}"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:281
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:282
 msgid "Update verified"
-msgstr "Actualización actualizada"
+msgstr "Actualización verificada"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:307
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:308
 #, java-format
 msgid "Transfer failed from {0}"
-msgstr ""
+msgstr "Transferencia fallida de {0}"
 
 #. wars for ConfigClientsHelper
 #: ../java/strings/Strings.java:12
@@ -3791,18 +3842,18 @@ msgstr "Susidns"
 
 #: ../java/strings/Strings.java:17
 msgid "routerconsole"
-msgstr ""
+msgstr "Consola del router"
 
 #. clients, taken from clients.config, for ConfigClientsHelper
 #. note that if the wording changes in clients.config, we have to
 #. keep the old string here as well for existing installs
 #: ../java/strings/Strings.java:22
 msgid "Web console"
-msgstr ""
+msgstr "Consola Web"
 
 #: ../java/strings/Strings.java:23
 msgid "SAM application bridge"
-msgstr ""
+msgstr "Puente de aplicación SAM"
 
 #: ../java/strings/Strings.java:24
 msgid "Application tunnels"
@@ -3810,23 +3861,23 @@ msgstr "Túneles de aplicaciónes"
 
 #: ../java/strings/Strings.java:25
 msgid "My eepsite web server"
-msgstr ""
+msgstr "Mi servidor web I2P"
 
 #: ../java/strings/Strings.java:26
 msgid "I2P webserver (eepsite)"
-msgstr ""
+msgstr "Servidor web I2P (eepsite)"
 
 #: ../java/strings/Strings.java:27
 msgid "Browser launch at startup"
-msgstr ""
+msgstr "Lanzar el navegador al iniciar"
 
 #: ../java/strings/Strings.java:28
 msgid "BOB application bridge"
-msgstr ""
+msgstr "Puente de aplicación BOB"
 
 #: ../java/strings/Strings.java:30
 msgid "Open Router Console in web browser at startup"
-msgstr ""
+msgstr "Abrir la consola del router en el navegador web al iniciar"
 
 #: ../java/strings/Strings.java:37
 msgid "IRC proxy"
@@ -3834,24 +3885,24 @@ msgstr "proxy IRC"
 
 #: ../java/strings/Strings.java:38
 msgid "eepsite"
-msgstr ""
+msgstr "sitio I2P"
 
 #: ../java/strings/Strings.java:39
 msgid "I2P webserver"
-msgstr ""
+msgstr "Servidor web I2P"
 
 #: ../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 "Proxy irc"
 
 #. hardcoded in i2psnark
 #: ../java/strings/Strings.java:45
@@ -3861,7 +3912,7 @@ msgstr "I2PSnark"
 #. hardcoded in iMule?
 #: ../java/strings/Strings.java:47
 msgid "iMule"
-msgstr ""
+msgstr "iMule"
 
 #. standard themes for ConfigUIHelper
 #: ../java/strings/Strings.java:51
@@ -3895,15 +3946,15 @@ msgstr "Mensajes de Clientes"
 
 #: ../java/strings/Strings.java:60
 msgid "Encryption"
-msgstr "Clave del Cifrado"
+msgstr "Cifrado"
 
 #: ../java/strings/Strings.java:61
 msgid "i2cp"
-msgstr ""
+msgstr "i2cp"
 
 #: ../java/strings/Strings.java:63
 msgid "InNetPool"
-msgstr ""
+msgstr "InNetPool"
 
 #: ../java/strings/Strings.java:64
 msgid "JobQueue"
@@ -3915,29 +3966,29 @@ msgstr "BaseDeDatosRed"
 
 #: ../java/strings/Strings.java:66
 msgid "ntcp"
-msgstr ""
+msgstr "ntcp"
 
 #: ../java/strings/Strings.java:69
 msgid "Stream"
-msgstr ""
+msgstr "Corriente"
 
 #: ../java/strings/Strings.java:70
 msgid "Throttle"
-msgstr ""
+msgstr "Regular"
 
 #: ../java/strings/Strings.java:71
 msgid "Transport"
-msgstr ""
+msgstr "Transporte"
 
 #: ../java/strings/Strings.java:73
 msgid "udp"
-msgstr ""
+msgstr "udp"
 
 #. parameters in transport addresses (netdb.jsp)
 #. may or may not be worth translating
 #: ../java/strings/Strings.java:77
 msgid "host"
-msgstr ""
+msgstr "host"
 
 #: ../java/strings/Strings.java:78
 msgid "key"
@@ -3950,1332 +4001,1467 @@ msgstr "puerto"
 #. introducer host
 #: ../java/strings/Strings.java:83
 msgid "ihost0"
-msgstr ""
+msgstr "ihost0"
 
 #: ../java/strings/Strings.java:84
 msgid "ihost1"
-msgstr ""
+msgstr "ihost1"
 
 #: ../java/strings/Strings.java:85
 msgid "ihost2"
-msgstr ""
+msgstr "ihost2"
 
 #. introducer port
 #: ../java/strings/Strings.java:87
 msgid "iport0"
-msgstr ""
+msgstr "iport0"
 
 #: ../java/strings/Strings.java:88
 msgid "iport1"
-msgstr ""
+msgstr "iport1"
 
 #: ../java/strings/Strings.java:89
 msgid "iport2"
-msgstr ""
+msgstr "iport2"
 
 #. introducer key
 #: ../java/strings/Strings.java:91
 msgid "ikey0"
-msgstr ""
+msgstr "ikey0"
 
 #: ../java/strings/Strings.java:92
 msgid "ikey1"
-msgstr ""
+msgstr "ikey1"
 
 #: ../java/strings/Strings.java:93
 msgid "ikey2"
-msgstr ""
+msgstr "ikey2"
 
 #. introducer tag
 #: ../java/strings/Strings.java:95
 msgid "itag0"
-msgstr ""
+msgstr "itag0"
 
 #: ../java/strings/Strings.java:96
 msgid "itag1"
-msgstr ""
+msgstr "itag1"
 
 #: ../java/strings/Strings.java:97
 msgid "itag2"
-msgstr ""
+msgstr "itag2"
 
 #. Descriptions for the stats that are graphed by default
 #. There are over 500 stats currently defined, we aren't going to tag them all
 #: ../java/strings/Strings.java:101
 msgid "Low-level bandwidth receive rate"
-msgstr ""
+msgstr "tasa de recepción de ancho de banda de bajo nivel"
 
 #. bw.recvRate
 #: ../java/strings/Strings.java:102
 msgid "Low-level bandwidth send rate"
-msgstr ""
+msgstr "tasa de envío de ancho de banda de bajo nivel"
 
 #. bw.sendRate
 #: ../java/strings/Strings.java:103
 msgid "How many peers we are actively talking with"
-msgstr ""
+msgstr "Con cuántos pares estamos hablando activamente"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:112
 msgid "config networking"
-msgstr ""
-
-#. We have intl defined when this is included, but not when compiled standalone.
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:230
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:227
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:222
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:215
+msgstr "configuración de red"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:222
+msgid "Summary Bar"
+msgstr "Barra resumen"
+
+#. 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:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:235
 msgid "Refresh (s)"
 msgstr "Actualizar (s)"
 
 #. ditto
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:226
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:237
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:239
 msgid "Enable"
 msgstr "Activar"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:262
 msgid "I2P Network Configuration"
-msgstr ""
+msgstr "Configuración de red I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:298
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:316
 msgid "Bandwidth limiter"
-msgstr "Limitador del ancho de banda"
+msgstr "Limitador de ancho de banda"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:300
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318
 msgid "I2P will work best if you configure your rates to match the speed of your internet connection."
-msgstr ""
+msgstr "I2P funcionará mejor si configuras tus tasas para que coincida con la velocidad de tu conexión a Internet."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:322
 msgid "KBps In"
 msgstr "KB/s entrantes"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336
 msgid "KBps Out"
 msgstr "KB/s salientes"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:352
 msgid "Share"
 msgstr "Compartir"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:341
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:326
 msgid "NOTE"
-msgstr "AVISO"
+msgstr "NOTA"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361
 #, java-format
 msgid "You have configured I2P to share only {0} KBps."
-msgstr ""
+msgstr "Has configurado I2P para compartir sólo {0} KBps."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:364
 msgid "I2P requires at least 12KBps to enable sharing. "
-msgstr ""
+msgstr "I2P requiere al menos 12KBps para permitir el intercambio."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365
 msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. "
-msgstr ""
+msgstr "Por favor, active el intercambio (participación en túneles) configurando un mayor ancho de banda."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:366
 msgid "It improves your anonymity by creating cover traffic, and helps the network."
-msgstr ""
+msgstr "Esto mejora tu anonimato creando tráfico de cobertura, y ayuda a la red."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369
 #, java-format
 msgid "You have configured I2P to share {0} KBps."
-msgstr ""
+msgstr "Has configurado I2P para compartir {0} KBps."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:354
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:372
 msgid "The higher the share bandwidth the more you improve your anonymity and help the network."
-msgstr ""
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:358
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:403
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:342
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:322
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365
+msgstr "Cuanto mayor sea el ancho de banda compartido, mayor es el anonimato y más se ayuda a la red."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:425
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:383
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:393
 msgid "IP and Transport Configuration"
-msgstr ""
+msgstr "IP y configuración de transporte"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324
 msgid "The default settings will work for most people."
-msgstr ""
+msgstr "La configuración por defecto funcionará para la mayoría de gente."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397
 msgid "There is help below."
-msgstr "Hay una ayuda abjo."
+msgstr "Hay ayuda debajo."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
 msgid "UPnP Configuration"
 msgstr "Configuración UPnP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403
 msgid "Enable UPnP to open firewall ports"
-msgstr ""
+msgstr "Activar UPnP para abrir puertos del cortafuegos"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405
 msgid "UPnP status"
 msgstr "Estado UPnP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407
 msgid "IP Configuration"
 msgstr "Configuración IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
 msgid "Externally reachable hostname or IP address"
-msgstr ""
+msgstr "Nombre de host o dirección IP accesible externamente"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413
 msgid "Use all auto-detect methods"
-msgstr ""
+msgstr "Utilizar todos los métodos de detección automática"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
 msgid "Disable UPnP IP address detection"
-msgstr ""
+msgstr "Desactivar detección de direcciones IP por UPnP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421
 msgid "Ignore local interface IP address"
-msgstr ""
+msgstr "Ingonrar la dirección IP de la interfaz local"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425
 msgid "Use SSU IP address detection only"
-msgstr ""
+msgstr "Utilizar detección de direcciones IP sólo por SSU"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497
 msgid "Specify hostname or IP"
-msgstr ""
+msgstr "Especificar nombre de host o IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
 msgid "Select Interface"
-msgstr "Elige interfaz"
+msgstr "Elegir interfaz"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449
 msgid "Hidden mode - do not publish IP"
-msgstr "Modo oculto - no se publica el IP"
+msgstr "Modo oculto - no publicar IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:433
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451
 msgid "(prevents participating traffic)"
-msgstr ""
+msgstr "(Evita el tráfico de participantes)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453
 msgid "Action when IP changes"
-msgstr ""
+msgstr "Acción al cambiar de IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457
 msgid "Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity"
-msgstr ""
+msgstr "Modo Portátil - Cambiar identidad del router y puerto UDP cuando cambie la IP para aumentar el anonimato"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:441
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
 msgid "Experimental"
-msgstr ""
+msgstr "Experimental"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
 msgid "UDP Configuration:"
 msgstr "Ajustes de UDP:"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:445
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463
 msgid "UDP port:"
 msgstr "Puerto UDP :"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477
 msgid "TCP Configuration"
-msgstr "Ajustes de TCP:"
+msgstr "Ajustes de TCP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:465
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:483
 msgid "Use auto-detected IP address"
-msgstr ""
+msgstr "Utilizar dirección IP detectada automáticamente"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:467
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517
 msgid "currently"
 msgstr "actualmente"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:471
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489
 msgid "if we are not firewalled"
 msgstr "si no estamos bloqueados por el corta-fuegos"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:475
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493
 msgid "Always use auto-detected IP address (Not firewalled)"
-msgstr ""
+msgstr "Siempre utilizar la dirección IP detectada automáticamente (no bloqueada por cortafuegos)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:503
 msgid "Disable inbound (Firewalled)"
-msgstr ""
+msgstr "Deshabilitar entrada (bloqueado por cortafuegos)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:507
 msgid "Completely disable"
 msgstr "Desactivar por completo"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:491
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509
 msgid "(select only if behind a firewall that throttles or blocks outbound TCP)"
-msgstr ""
+msgstr "(Selecciona sólo si estás detrás de un cortafuegos que regule o bloquee la salida por TCP)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511
 msgid "Externally reachable TCP port"
-msgstr ""
+msgstr "Puerto TCP externamente accesible"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515
 msgid "Use the same port configured for UDP"
-msgstr ""
+msgstr "Usar el mismo puerto configurado para UDP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:505
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523
 msgid "Specify Port"
 msgstr "Elegir un puerto"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:348
 msgid "Note"
-msgstr ""
+msgstr "Nota"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:530
 msgid "Changing these settings will restart your router."
-msgstr ""
+msgstr "Cambiar estos ajustes reiniciará el router."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536
 msgid "Configuration Help"
-msgstr ""
+msgstr "Ayuda de Configuración"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
 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 ""
+msgstr "Aunque I2P funcionrá bien aún bloqueado por la mayoría de cotrafuegos, las velocidades y la integración de la red en general mejorará si el puerto I2P está abierto tanto por UDP como por TCP."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540
 msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you."
-msgstr ""
+msgstr "Si es posiible, por favor permite el paso de los paquetes TCP y UDP no solicitados por el cortafuegos."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542
 msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic."
-msgstr ""
+msgstr "Si no puede ser, I2P soporta UPnP (Universal Plug and Play) y UDP hole punching con \"introducciones SSU\" para transmitir tráfico."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544
 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 ""
+msgstr "La mayoría de las opciones anteriores son para situaciones especiales, por ejemplo, cuando UPnP no funciona correctamente, o un cortafuegos que no está bajo tu control está haciendo daño."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:528
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546
 msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
-msgstr ""
+msgstr "Algunos cortafuegos como NATs simétricos pueden no funcionar bien con I2P."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
 msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports."
-msgstr ""
+msgstr "UPnP se utiliza para comunicarse con dispositivos de puerta de enlace a Internet (IGDs) para detectar la dirección IP externa y los puertos que se deben abrir."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
 msgid "UPnP support is beta, and may not work for any number of reasons"
-msgstr ""
+msgstr "El soporte de UPnP está en fase beta, y puede no funcionar correctamente por varias razones"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559
 msgid "No UPnP-compatible device present"
-msgstr ""
+msgstr "No se encuentra ningún dispositivo compatible con UPnP presente"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561
 msgid "UPnP disabled on the device"
-msgstr ""
+msgstr "UPnP desactivado en el dispositivo"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
 msgid "Software firewall interference with UPnP"
-msgstr ""
+msgstr "Un cortafuegos de software interfiere con UPnP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
 msgid "Bugs in the device's UPnP implementation"
-msgstr ""
+msgstr "Errores en la implementación de UPnP del dispositivo"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
 msgid "Multiple firewall/routers in the internet connection path"
-msgstr ""
+msgstr "Múltiples cotrafuegos/routers en la ruta de conexión a Internet"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:551
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
 msgid "UPnP device change, reset, or address change"
-msgstr ""
+msgstr "El dispositivo UPnP ha cambiado, reiniciado, o ha cambiado de dirección"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:553
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571
 msgid "Review the UPnP status here."
-msgstr ""
+msgstr "Revisar el estado de UPnP aquí."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573
 msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect."
-msgstr ""
+msgstr "Encima de esto UPnP puede ser activado o desactivado, pero un cambio requiere reiniciar el router para que surta efecto."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
 msgid "Hostnames entered above will be published in the network database."
-msgstr ""
+msgstr "Los nombres de host introducidos arriba se publicarán en la base de datos de red."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
 msgid "They are <b>not private</b>."
-msgstr ""
+msgstr "<b>No son privados.</b>"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
 msgid "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
-msgstr ""
+msgstr "Además, <b>no se debe introducir una dirección IP privada</b> como 127.0.0.1 o 192.168.1.1."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
 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 ""
+msgstr "Si se especifica una dirección IP o nombre de host incorrectos, o no se configura correctamente el NAT o cortafuegos, el rendimiento de la red se degradará considerablemente."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
 msgid "When in doubt, leave the settings at the defaults."
-msgstr ""
+msgstr "En caso de duda, deje los ajustes con los valores predeterminados."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
 msgid "Reachability Help"
-msgstr ""
+msgstr "Ayuda de Accesibilidad"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590
 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 ""
+msgstr "Si crees que has abierto el cortafuegos y I2P todavía piensa que sigue bloqueado por uno, recuerda que podrías tener múltiples cortafuegos, por ejemplo, en paquetes de software o en routers externos."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
 msgid "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help diagnose the problem."
-msgstr ""
+msgstr "Si hay un error, el <a href=\"logs.jsp\">registro</a> también puede ayudar a diagnosticar el problema."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
 msgid "Your UDP port does not appear to be firewalled."
-msgstr ""
+msgstr "El puerto UDP no parece estar bloqueado por un cortafuegos."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
 msgid "Your UDP port appears to be firewalled."
-msgstr ""
+msgstr "El puerto UDP parece estar bloqueado por un cortafuegos."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
 msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error."
-msgstr ""
+msgstr "Como los métodos de detección de cortafuegos no son 100% fiables, esto puede aparecer por error."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
 msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port."
-msgstr ""
+msgstr "Sin embargo, si aparece constantemente, deberías comprobar si tanto el cortafuegos interno como externo tienen los puertos abiertos."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
 msgid "I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections."
-msgstr ""
+msgstr "I2P funcionará bien aún bloqueado por un cortafuegos, no hay motivo de preocupación. Si se está detrás de un cortafuegos, el router utiliza \"introductores\" para transmitir las conexiones entrantes."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609
 msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)."
-msgstr ""
+msgstr "No obstante, obtendrás más tráfico participante y ayudará más a la red si puedes abrir el/los cortafuegos."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
 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 "Si crees que ya lo has hecho, recuerda que podrías tener tanto un cortafuegos de hardware como un cortafuegos por software, o podrías estar detrás de otro cortafuegos institucional fuera de tu control."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
 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 ""
+msgstr "Además, algunos routers no pueden encaminar correctamente TCP y UDP por el mismo puerto, o pueden tener otras limitaciones o bugs que les impidan pasar tráfico a través de I2P."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
 msgid "The router is currently testing whether your UDP port is firewalled."
-msgstr ""
+msgstr "El router está probando si tu puerto UDP está bloqueado por un cortafuegos."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
 msgid "The router is not configured to publish its address, therefore it does not expect incoming connections."
-msgstr ""
+msgstr "El router no está configurado para publicar su dirección, por lo tanto, no espera conexiones entrantes."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
 msgid "WARN - Firewalled and Fast"
-msgstr ""
+msgstr "AVISO - Bloqueado por cortafuegos y rápido"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
 msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled."
-msgstr ""
+msgstr "Has configurado I2P para compartir más de 128 kbps de ancho de banda, pero te encuentras bloqueado por un cortafuegos"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
 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 ""
+msgstr "Aunque I2P funcionará bien con esta configuración, si realmente tiene más de 128 kbps de ancho de banda para compartir, será mucho más útil a la red si abre los puertos de su router."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
 msgid "WARN - Firewalled and Floodfill"
-msgstr ""
+msgstr "AVISO - Bloqueado por cortafuegos y Floodfill"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
 msgid "You have configured I2P to be a floodfill router, but you are firewalled."
-msgstr ""
+msgstr "Has configurado I2P ser un router floodfill, pero estás bloqueado por un cortafuegos."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
 msgid "For best participation as a floodfill router, you should open your firewall."
-msgstr ""
+msgstr "Para mejorar la participación como router floodfill, deberías abrir tu cortafuegos."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
 msgid "WARN - Firewalled with Inbound TCP Enabled"
-msgstr ""
+msgstr "AVISO - Bloqueado por cortafuegos con TCP entrante activado"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
 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 ""
+msgstr "Has configurado TCP entrante, sin embargo el puerto UDP está bloqueado por un cortafuegos, y por lo tanto es probable que el puerto TCP esté bloqueado también."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
 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 ""
+msgstr "Si el puerto TCP está bloqueado por un cortafuegos con TCP entrante habilitado, los routers no podrán ponerse en contacto con el tuyo a través de TCP, lo que perjudicará a la red."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
 msgid "Please open your firewall or disable inbound TCP above."
-msgstr ""
+msgstr "Por favor, ¡abre los puertos del cortafuegos o desactiva TCP entrante arriba!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
 msgid "WARN - Firewalled with UDP Disabled"
-msgstr ""
+msgstr "AVISO - Bloqueado por cortafuegos con UDP deshabilitado"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
 msgid "You have configured inbound TCP, however you have disabled UDP."
-msgstr ""
+msgstr "Has configurado TCP entrante, sin embargo has deshabilitado UDP."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
 msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections."
-msgstr ""
+msgstr "Parece que estás siendo bloqueado por un cortafuegos en TCP, por lo tanto el router no puede aceptar conexiones entrantes."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
 msgid "Please open your firewall or enable UDP."
-msgstr ""
+msgstr "Por favor, ¡abre el cortafuegos o habilita UDP!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
 msgid "ERR - Clock Skew"
-msgstr ""
+msgstr "ERR - desviación de reloj"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
 msgid "Your system's clock is skewed, which will make it difficult to participate in the network."
-msgstr ""
+msgstr "El reloj del sistema está desviado, lo que hará difícil participar en la red."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655
 msgid "Correct your clock setting if this error persists."
-msgstr ""
+msgstr "Corrija su ajuste del reloj, si este error persiste."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657
 msgid "ERR - Private TCP Address"
-msgstr ""
+msgstr "ERR - Dirección TCP privada"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659
 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 ""
+msgstr "Nunca debe anunciar una dirección IP no enrutable, como 127.0.0.1 o 192.168.1.1 como su dirección externa."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661
 msgid "Correct the address or disable inbound TCP above."
-msgstr ""
+msgstr "Corrija la dirección o desactive TCP entrante arriba."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663
 msgid "ERR - SymmetricNAT"
-msgstr ""
+msgstr "ERR - NAT Simétrico"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665
 msgid "I2P detected that you are firewalled by a Symmetric NAT."
-msgstr ""
+msgstr "I2P ha detectado que está siendo bloqueado por un NAT simétrico."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667
 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 ""
+msgstr "I2P no funciona bien detrás de este tipo de cortafuegos. Probablemente no serás capaz de aceptar conexiones entrantes, lo que limitará tu participación en la red."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669
 msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
-msgstr ""
+msgstr "ERR - el puerto UDP está en uso - Establezca i2np.udp.internalPort=xxxx en configuración avanzada reinicie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671
 msgid "I2P was unable to bind to port 8887 or other configured port."
-msgstr ""
+msgstr "I2P no pudo enlazar con el puerto 8887 o el otro puerto configurado."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673
 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 "Compruebe si otro programa está utilizando el puerto configurado. Si es así, cierre el programa o configure I2P para utilizar un puerto diferente."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:675
 msgid "This may be a transient error, if the other program is no longer using the port."
-msgstr ""
+msgstr "Esto puede ser un error transitorio, si el otro programa ya no utiliza el puerto."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:677
 msgid "However, a restart is always required after this error."
-msgstr ""
+msgstr "Sin embargo, siempre es necesario reiniciar después de que aparezca este error."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:679
 msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
-msgstr ""
+msgstr "ERR - UDP deshabilitado y el host/puerto de entrada TCP no ha sido establecido"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:681
 msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP."
-msgstr ""
+msgstr "Arriba no has configurado TCP entrante con un nombre de host y puerto, sin embargo has deshabilitado UDP."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:683
 msgid "Therefore your router cannot accept inbound connections."
-msgstr ""
+msgstr "Por lo tanto el router no puede aceptar conexiones entrantes."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:685
 msgid "Please configure a TCP host and port above or enable UDP."
-msgstr ""
+msgstr "Por favor, configure un host y puerto TCP arriba o permita UDP."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:687
 msgid "ERR - Client Manager I2CP Error - check logs"
-msgstr ""
+msgstr "ERR - Error Client Manager I2CP - verificar los registros"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:689
 msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
-msgstr ""
+msgstr "Esto se debe generalmente a un conflicto en el puerto 7654. Revisa los registros para verificarlo."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:691
 msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P."
-msgstr ""
+msgstr "¿Tiene otra instancia I2P funcionando? Detenga el programa en conflicto y reinicie I2P."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:113
 msgid "config advanced"
 msgstr "configuración avanzada"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:263
 msgid "I2P Advanced Configuration"
 msgstr "Ajustes Avanzados de I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:319
 msgid "Advanced I2P Configuration"
-msgstr ""
+msgstr "Configuración I2P avanzada"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:329
 msgid "Some changes may require a restart to take effect."
-msgstr ""
+msgstr "Algunos cambios pueden requerir unreiniciar para que surtan efecto."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:112
 msgid "config clients"
 msgstr "configuración de clientes"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:265
 msgid "I2P Client Configuration"
 msgstr "Configuración de Clientes I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330
 msgid "Client Configuration"
 msgstr "Configuración Clientes"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:314
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:332
 msgid "The Java clients listed below are started by the router and run in the same JVM."
-msgstr ""
+msgstr "Los clientes de Java que se enumeran a continuación son iniciados por el router y se ejecutan en la misma JVM."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338
 msgid "To change other client options, edit the file"
-msgstr ""
+msgstr "Para cambiar otras opciones clientes, edita el archivo"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:415
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439
 msgid "All changes require restart to take effect."
-msgstr ""
+msgstr "Todos los cambios requieren reiniciar para que surtan efecto."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:337
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357
 msgid "Advanced Client Interface Configuration"
-msgstr "Guardar la configuración de clientes"
+msgstr "Configuración avanzada de la interfaz del cliente"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361
 msgid "External I2CP (I2P Client Protocol) Interface Configuration"
-msgstr ""
+msgstr "Configuración de la interfaz I2CP Exterior (I2P Protocolo de clientes)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367
 msgid "Enabled without SSL"
-msgstr ""
+msgstr "Habilitado sin SSL"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373
 msgid "Enabled with SSL required"
-msgstr ""
+msgstr "Habilitado con SSL obligatorio"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379
 msgid "Disabled - Clients outside this Java process may not connect"
-msgstr ""
+msgstr "Deshabilitado - Los clientes fuera de este proceso Java podrían no conectar"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:381
 msgid "I2CP Port"
-msgstr ""
+msgstr "Puerto I2CP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385
 msgid "I2CP Interface"
-msgstr "Configuración"
+msgstr "Interfaz I2CP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401
 msgid "Authorization"
-msgstr "Autor"
+msgstr "Autorización"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385
-msgid "Requre username and password"
-msgstr ""
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407
+msgid "Require username and password"
+msgstr "Requerir nombre de usuario y contraseña"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:387
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409
 msgid "Username"
-msgstr ""
+msgstr "Nombre de usuario"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:391
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413
 msgid "Password"
-msgstr ""
+msgstr "Contraseña"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:397
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:419
 msgid "Any changes made here must also be configured in the external client."
-msgstr ""
+msgstr "Cualquier cambio realizado aquí también debe configurarse en el cliente externo."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421
 msgid "Many clients do not support SSL or authorization."
-msgstr ""
+msgstr "Muchos clientes no soportan SSL o autorización."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429
 msgid "WebApp Configuration"
 msgstr "Configuración de las Applicaciones Web"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431
 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 separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)."
-msgstr ""
+msgstr "Las aplicaciones web Java que se enumeran a continuación son iniciadas por el cliente de consola web y se ejecutan en la misma JVM que el router. Por lo general son aplicaciones web, accesibles a través de la consola del router. Pueden ser aplicaciones completas (i2psnark por ejemplo), interfaces de otro cliente o aplicaciónes que deben ser habilitadas por separado (por ejemplo, susidns, i2ptunnel), o que no tienen interfaz web en absoluto (por ejemplo, la libreta de direcciones)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:411
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433
 msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method."
-msgstr ""
+msgstr "Una aplicación web también se puede desactivar quitando el archivo .war del directorio de aplicaciones web; Sin embargo, el archivo .war y la aplicación web volverán a aparecer al actualizar el router a una nueva versión, así que el método preferido es deshabilitar la aplicación web aquí."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:445
 msgid "Plugin Configuration"
 msgstr "Configuración de Complementos"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:447
 msgid "The plugins listed below are started by the webConsole client."
-msgstr ""
+msgstr "Los complementos enumerados a continuación son iniciados por el cliente de consola web."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455
 msgid "Plugin Installation"
-msgstr ""
+msgstr "Instalación de Complementos"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:457
 msgid "To install a plugin, enter the download URL:"
-msgstr ""
+msgstr "Para instalar un complemento, ¡introduce la URL de descarga!"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:112
 msgid "config keyring"
-msgstr ""
+msgstr "configuración de llavero"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:249
 msgid "I2P Keyring Configuration"
 msgstr "Configuración del Llavero"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317
 msgid "The router keyring is used to decrypt encrypted leaseSets."
-msgstr ""
+msgstr "El llavero del router se utiliza para descifrar leaseSets encriptados."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:298
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320
 msgid "The keyring may contain keys for local or remote encrypted destinations."
-msgstr ""
+msgstr "El anillo puede contener claves de cifrado para los destinos locales o remotos."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326
 msgid "Manual Keyring Addition"
-msgstr ""
+msgstr "Adición manual al Llavero"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:328
 msgid "Enter keys for encrypted remote destinations here."
-msgstr ""
+msgstr "Introduzca las claves de cifrado para destinos remotos aquí."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:331
 msgid "Keys for local destinations must be entered on the"
-msgstr ""
+msgstr "Las claves para los destinos locales deben introducirse en la"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:333
 msgid "I2PTunnel page"
-msgstr ""
+msgstr "Página de túnelesI2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335
 msgid "Dest. name, hash, or full key"
 msgstr "Nombre del destino, hash o clave completa"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337
 msgid "Encryption Key"
 msgstr "Clave de cifrado"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:113
 msgid "config logging"
-msgstr ""
+msgstr "configuración de registro"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:263
 msgid "I2P Logging Configuration"
-msgstr ""
+msgstr "Configuración del registro I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
 msgid "Configure I2P Logging Options"
-msgstr ""
+msgstr "Configurar las opciones de registro I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321
 msgid "Logging filename"
-msgstr ""
+msgstr "Nombre de archivo del registro"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325
 msgid "(the symbol '@' will be replaced during log rotation)"
-msgstr ""
+msgstr "(El símbolo '@' será reemplazado durante la rotación de registro)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327
 msgid "Log record format"
-msgstr ""
+msgstr "Formato de escritura del registro"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331
 msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
 msgstr "(use 'd' = fecha, 'c' = clase, 't' = hilo, 'p' = prioridad, 'm' = mensaje)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333
 msgid "Log date format"
-msgstr ""
+msgstr "Formato de fecha del registro"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337
 msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)"
 msgstr "('MM' = mes, 'dd' = día, 'HH' = hora, 'mm' = minuto, 'ss' = segundo, 'SSS' = milisegundo)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339
 msgid "Max log file size"
-msgstr ""
+msgstr "Tamaño máximo del archivo de registro"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:343
 msgid "Default log level"
-msgstr ""
+msgstr "Nivel predeterminado de registro"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:347
 msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)"
-msgstr ""
+msgstr "(DEBUG e INFO no se recomiendan por defecto, ya que ralentizaran drásticamente el router)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:349
 msgid "Log level overrides"
-msgstr ""
+msgstr "Reemplazos a nivel de registros"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:353
 msgid "New override"
-msgstr ""
+msgstr "Nueva reemplazo"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:112
 msgid "config peers"
-msgstr "configuración de los pares"
+msgstr "configuración de pares"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:249
 msgid "I2P Peer Configuration"
-msgstr "Configuración de los Pares I2P"
+msgstr "Configuración de los pares I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323
 msgid "Manual Peer Controls"
-msgstr ""
+msgstr "Controles Manuales de pares"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325
 msgid "Router Hash"
-msgstr "Hash del Enrutador"
+msgstr "Hash del Router"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:329
 msgid "Manually Ban / Unban a Peer"
-msgstr ""
+msgstr "Banear / Desbanear manualmente a un par"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:331
 msgid "Banning will prevent the participation of this peer in tunnels you create."
-msgstr ""
+msgstr "Banear evitará que ese par participe en cualquiera de los túneles que usted cree."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:341
 msgid "Adjust Profile Bonuses"
-msgstr ""
+msgstr "Ajustar Perfil de Bonus"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343
 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 Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the"
-msgstr ""
+msgstr "Los bonus pueden ser positivos o negativos, y afectan a la inclusión de un par en los niveles 'Rápido' y 'de alta capacidad'. Los pares rápidos se utilizan para los túneles de clientes, los par de alta capacidad se utilizan para algunos túneles exploratorios. Los bonus actuales se muestran en la"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345
 msgid "profiles page"
 msgstr "página de perfiles"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:273
 msgid "Banned Peers"
-msgstr "Pares Relegados"
+msgstr "pares baneados"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:384
 msgid "Banned IPs"
-msgstr ""
+msgstr "IPs Baneadas"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:112
+msgid "config reseeding"
+msgstr "config para resembrar "
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:262
+msgid "I2P Reseeding Configuration"
+msgstr "Configuración del proceso de resembrar I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318
+msgid "Reseeding Configuration"
+msgstr "Configuración de Resembrar"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:320
+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 "Resembrar es el proceso de bootstrapping para encontrar otros routers cuando I2P se instala por primera vez o cuando al router le quedan muy pocas referencias de otros routers."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:322
+msgid "If reseeding has failed, you should first check your network connection."
+msgstr "El proceso de resembrar ha fallado, primero debes comprobar la conexión de red."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:326
+msgid "Change these only if HTTP is blocked by a restrictive firewall, reseed has failed, and you have access to an HTTP proxy."
+msgstr "¡Cambia estos parámetros solamente si HTTP está bloqueado por un cortafuegos restrictivo, el proceso de resembrar ha fracasado, y si tienes acceso a un proxy HTTP!"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328
+#, java-format
+msgid "See {0} for instructions on reseeding manually."
+msgstr "Ver {0} para obtener instrucciones sobre cómo resembrar manualmente."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328
+msgid "the FAQ"
+msgstr "las preguntas más frecuentes"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330
+msgid "Reseed URL Selection"
+msgstr "Selección de URL resembradora"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336
+msgid "Try SSL first then non-SSL"
+msgstr "Probar SSL primero y luego no-SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:342
+msgid "Use SSL only"
+msgstr "Usar SSL exclusivamente"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348
+msgid "Use non-SSL only"
+msgstr "Usar no-SSL exclusivamente"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350
+msgid "Reseed URLs"
+msgstr "URLs resembradoras"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:354
+msgid "Enable HTTP proxy (not used for SSL)"
+msgstr "Habilitar proxy HTTP (no utilizado para SSL)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:358
+msgid "HTTP Proxy Host"
+msgstr "Host HTTP Proxy"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:362
+msgid "HTTP Proxy Port"
+msgstr "Puerto HTTP Proxy"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:112
 msgid "config service"
 msgstr "configuración de servicios"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:249
 msgid "I2P Service Configuration"
 msgstr "Configuración de Servicios I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:285
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303
 msgid "Shutdown the router"
-msgstr "Apagar el enrutador"
+msgstr "Apagar el router"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:287
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305
 msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes."
-msgstr ""
+msgstr "El apagado controlado permite al router cumplir los acuerdos que ya ha hecho antes de apagar, pero puede tardar unos minutos."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:289
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307
 msgid "If you need to kill the router immediately, that option is available as well."
-msgstr ""
+msgstr "Si tiene que apagar el router inmediatamente, también tiene esa opción"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317
 msgid "If you want the router to restart itself after shutting down, you can choose one of the following."
-msgstr ""
+msgstr "Si deseas que el router se reinicie después del apagado, puedes elegir una de las siguientes opciones."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319
 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 "Esto es útil en algunas situaciones - por ejemplo, si has cambiado algunas opciones de aplicaciones cliente que sólo se leen al iniciar, como la contraseña de la consola del router o tu interfaz de escucha."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321
 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 "Un reinicio controlado tardará unos minutos (pero tus pares te agradecerán tu paciencia), mientras que un reinicio duro lo hace inmediatamente."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323
 msgid "After tearing down the router, it will wait 1 minute before starting back up again."
-msgstr ""
+msgstr "Después de apagar completamente el router, esperará 1 minuto antes de volverse a iniciar."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333
 msgid "Systray integration"
-msgstr ""
+msgstr "integración con la bandeja del sistema"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335
 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 ""
+msgstr "En la plataforma Windows, hay una pequeña aplicación que se queda en la bandeja del sistema, lo que le permite ver el estado del router"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337
 msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)."
-msgstr ""
+msgstr "(Más adelante, las aplicaciones I2P de clientes serán capaces de integrar su propia funcionalidad en la bandeja de sistema también)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339
 msgid "If you are on windows, you can either enable or disable that icon here."
-msgstr ""
+msgstr "Si usted está en Windows, puede activar o desactivar ese icono que aquí."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341
+msgid "Show systray icon"
+msgstr "Mostrar icono de la bandeja del sistema"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343
+msgid "Hide systray icon"
+msgstr "Ocultar icono de la bandeja del sistema"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:345
 msgid "Run on startup"
-msgstr "Lanzar al iniciar el enrutador"
+msgstr "Lanzar al iniciar"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347
 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 ""
+msgstr "Puede controlar si I2P se ejecuta en el arranque o no seleccionando una de las siguientes opciones - I2P instalará (o eliminará) un servicio en consecuencia."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349
 msgid "If you prefer the command line, you can also run the "
-msgstr ""
+msgstr "Si usted prefiere la línea de comandos, también puede ejecutar"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359
 msgid "If you are running I2P as service right now, removing it will shut down your router immediately."
-msgstr ""
+msgstr "Si está ejecutando I2p como servicio en este momento, quitarlo hará que se apague el router de inmediato."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361
 msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat."
-msgstr ""
+msgstr "Es posible que desees considerar el apagado controlado como se indica arriba, para ello, ejecuta uninstall_i2p_service_winnt.bat."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365
 msgid "Debugging"
-msgstr ""
+msgstr "Debugging"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:367
 msgid "View the job queue"
 msgstr "Ver cola de tareas"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:371
 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 ""
+msgstr "A veces, puede ser útil depurar I2P consiguiendo un volcado de hilo. Para ello, selecciona la opción siguiente y revisa el dump en <a href=\"logs.jsp#servicelogs\">wrapper.log</a> ."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:377
 msgid "Launch browser on router startup?"
-msgstr ""
+msgstr "Iniciar el navegador al arrancar el router?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:379
 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 ""
+msgstr "La interfaz de configuración principal de I2P es esta consola Web. Para tu comodidad I2P puede lanzar el navegador web en al iniciar apuntando a"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:113
 msgid "config stats"
-msgstr ""
+msgstr "config de estadísticas"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:250
 msgid "I2P Stats Configuration"
 msgstr "Ajustes de Estadísticas I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:320
 msgid "Configure I2P Stat Collection"
-msgstr ""
+msgstr "Configurar colección de estadísticas I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:322
 msgid "Enable full stats?"
-msgstr ""
+msgstr "Habilitar estadísticas completas?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329
 msgid "change requires restart to take effect"
-msgstr ""
+msgstr "cambiar esto requiere reiniciar para que los cambios surtan efecto"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331
 msgid "Stat file"
-msgstr ""
+msgstr "Archivo de estadísticas"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:335
 msgid "Filter"
 msgstr "Filtro"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:319
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:348
 msgid "toggle all"
-msgstr ""
+msgstr "cambiar todos"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:350
 msgid "Log"
-msgstr ""
+msgstr "Registro"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:332
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:352
 msgid "Graph"
 msgstr "Gráficas"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:371
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:391
 msgid "Advanced filter"
-msgstr ""
+msgstr "Filtro avanzado"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:112
 msgid "config tunnels"
 msgstr "Configuración de túneles"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:262
 msgid "I2P Tunnel Configuration"
-msgstr "Configuración de los túneles I2P"
+msgstr "Configuración de túneles I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:328
 msgid "The default settings work for most people."
-msgstr ""
+msgstr "La configuración por defecto funciona para la mayoría de gente."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332
 msgid "There is a fundamental tradeoff between anonymity and performance."
-msgstr ""
+msgstr "Hay un equilibrio fundamental entre el anonimato y el rendimiento."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335
 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 ""
+msgstr "Los túneles de más de tres saltos (por ejemplo, 2 + 0-2 saltos, 3 saltos+ 0-1 saltos, 3 saltos + 0-2 saltos), o una alta cantidad incluyendo túneles de respaldo, pueden reducir severamente el rendimiento o la fiabilidad."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338
 msgid "High CPU and/or high outbound bandwidth usage may result."
-msgstr ""
+msgstr "Puede resultar en un uso alto de CPU y/o un uso de gran ancho de banda de salida "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341
 msgid "Change these settings with care, and adjust them if you have problems."
-msgstr ""
+msgstr "Cambia esta configuración con cuidado, y ajústala en caso de tener problemas."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:333
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:351
 msgid "Exploratory tunnel setting changes are stored in the router.config file."
-msgstr ""
+msgstr "Los cambios en los túneles exploratorios se almacenan en el archivo router.config."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:336
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:354
 msgid "Client tunnel changes are temporary and are not saved."
-msgstr ""
+msgstr "Los cambios en túnel de cliente son de carácter temporal y no se guardan."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:356
 msgid "To make permanent client tunnel changes see the"
-msgstr ""
+msgstr "Para hacer cambios permanentes al túnel de cliente ve a la"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:358
 msgid "i2ptunnel page"
-msgstr ""
+msgstr "Página túnel I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:112
 msgid "config UI"
 msgstr "configuración IU"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:262
 msgid "I2P UI Configuration"
 msgstr "Interfaz de Usuario"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:292
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314
 msgid "Router Console Theme"
-msgstr ""
+msgstr "Tema de la Consola del Router"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:339
 msgid "Theme selection disabled for Internet Explorer, sorry."
-msgstr ""
+msgstr "Lo sentimos, pero la selección de temas está deshabilitada para Internet Explorer."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:341
 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 ""
+msgstr "Si no estás utilizando Internet Explorer, es probable que tu navegador se esté haciendo pasar por el IE, por favor, configura tu navegador (o proxy) para utilizar un agente de usuario diferente si deseas acceder a los temas de la consola."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:345
 msgid "Router Console Language"
-msgstr ""
+msgstr "Idioma de la Consola del Router"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:349
 msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help."
-msgstr ""
+msgstr "Por favor, contribuye al proyecto de traducción de la consola del router. Ponte en contacto con los desarrolladores en el IRC #I2P o #I2P-ES para ayudar."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:324
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353
 msgid "Apply"
 msgstr "Aplicar"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:112
 msgid "config update"
 msgstr "Actualización de la configuración"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:249
 msgid "I2P Update Configuration"
 msgstr "Configuración de actualizaciones I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321
 msgid "Check for I2P and news updates"
-msgstr ""
+msgstr "Comprobar si hay actualizaciones de I2P o noticias"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:323
 msgid "News &amp; I2P Updates"
 msgstr "Noticias &amp; actualizaciones de I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327
 msgid "Update In Progress"
 msgstr "Actualizando"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335
 msgid "News URL"
 msgstr "URL de noticias"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339
 msgid "Refresh frequency"
 msgstr "Frecuencia de actualización"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:345
 msgid "Update policy"
-msgstr ""
+msgstr "Política de actualizaciones"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:349
 msgid "Update through the eepProxy?"
-msgstr "¿Actualizar ustilizando el eeProxy?"
+msgstr "¿Actualizar utilizando el eepProxy?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:353
 msgid "eepProxy host"
-msgstr ""
+msgstr "host eepProxy"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:357
 msgid "eepProxy port"
-msgstr ""
+msgstr "puerto eepProxy"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
 msgid "Update URLs"
-msgstr ""
+msgstr "URLs de actualizaciones"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365
 msgid "Trusted keys"
 msgstr "Claves confiadas"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369
 msgid "Update with unsigned development builds?"
-msgstr ""
+msgstr "Actualizar con las versiones en desarrollo no firmadas?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:355
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:373
 msgid "Unsigned Build URL"
-msgstr ""
+msgstr "URL de versión no firmada"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:379
 msgid "I2P updates are disabled because you do not have write permission for the install directory."
-msgstr ""
+msgstr "Las actualizaciones de I2P están desactivadas porque no tienes permiso de escritura en el directorio de la instalación."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385
 msgid "Save"
 msgstr "Guardar"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121
+msgid "Internal Error"
+msgstr "Error interno"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123
+msgid "Router Console"
+msgstr "Consola del Router"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:127
+msgid "Configuration"
+msgstr "Configuración"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135
+msgid "Sorry! There has been an internal error."
+msgstr "Lo sentimos! Se ha producido un error interno."
+
+#. note to translators - both parameters are URLs
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:254
+#, java-format
+msgid "Please report bugs on {0} or {1}."
+msgstr "Por favor, informar sobre errores en {0} o {1}."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258
+msgid "You may use the username \"guest\" and password \"guest\" if you do not wish to register."
+msgstr "Se puede utilizar el nombre de usuario \"guest\" y contraseña \"guest\" si no desea registrarse."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:145
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:260
+msgid "Please include this information in bug reports"
+msgstr "Por favor, incluya esta información en los informes de error"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147
+msgid "Error Details"
+msgstr "Detalles del error"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:149
+#, java-format
+msgid "Error {0}"
+msgstr "Error {0}"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:169
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:250
+msgid "I2P Version and Running Environment"
+msgstr "Versión I2P y medio de ejecución"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:197
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:288
+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 "Tenga en cuenta que la información del sistema, las marcas de tiempo del registro y los mensajes del registro pueden proporcionar pistas sobre su ubicación, por favor, revise todos los datos que se incluyen en un informe de error."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:123
 msgid "Page Not Found"
 msgstr "Página no encontrada"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:264
 msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource."
-msgstr ""
+msgstr "Lo sentimos! Pareces estar intentando entrar en una página de Consola de Router inexistente u otro recurso."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:266
 msgid "Error 404"
 msgstr "Error 404"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:249
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:271
 msgid "not found"
 msgstr "no encontrado"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:112
 msgid "graphs"
 msgstr "gráficas"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:249
 msgid "I2P Performance Graphs"
-msgstr ""
+msgstr "Gráficos de rendimiento I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:111
 msgid "home"
-msgstr "página de inicio"
+msgstr "Página de Inicio"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:331
+msgid "Welcome to I2P"
+msgstr "¡Bienvenido a I2P!"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:111
 msgid "job queue"
 msgstr "cola de tareas"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:248
 msgid "I2P Router Job Queue"
-msgstr ""
+msgstr "Cola de trabajos del router I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:111
 msgid "logs"
-msgstr ""
+msgstr "registros"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:248
 msgid "I2P Router Logs"
-msgstr ""
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:228
-msgid "I2P Version & Running Environment"
-msgstr ""
-
-#. note to translators - both parameters are URLs
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:232
-#, java-format
-msgid "Please report bugs on {0} or {1}."
-msgstr ""
+msgstr "Registros del Router I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:236
-msgid "You may use the username \"guest\" and password \"guest\" if you do not wish to register."
-msgstr ""
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:238
-msgid "Please include this information in bug reports"
-msgstr ""
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266
-msgid "Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report."
-msgstr ""
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:281
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303
 msgid "Critical Logs"
-msgstr ""
+msgstr "Registros críticos"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:285
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:307
 msgid "Router Logs"
-msgstr ""
+msgstr "Registros del Router"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:313
 msgid "Service (Wrapper) Logs"
-msgstr ""
+msgstr "Registros de Servicio (Wrapper)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:111
 msgid "network database summary"
-msgstr ""
+msgstr "Resumen de la base de datos de red"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:248
 msgid "I2P Network Database Summary"
-msgstr ""
+msgstr "Resumen de la base de datos de red I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:115
 msgid "WebApp Not Found"
-msgstr ""
+msgstr "Aplicación web no encontrada"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:230
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:252
 msgid "Web Application Not Running"
-msgstr ""
+msgstr "La Aplicación Web no se está ejecutando"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:232
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:254
 msgid "The requested web application is not running."
-msgstr ""
+msgstr "La aplicación Web solicitada no se está ejecutando"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:256
 msgid "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</a> to start it."
-msgstr ""
+msgstr "Por favor visita la <a href=\"/configclients.jsp#webapp\">página de configuración de clientes</a> para iniciarla."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:111
 msgid "peer connections"
 msgstr "conexiones con pares"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:248
 msgid "I2P Network Peers"
-msgstr ""
+msgstr "pares de la red I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:111
 msgid "peer profiles"
 msgstr "perfiles de los pares"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:248
 msgid "I2P Network Peer Profiles"
-msgstr ""
+msgstr "Perfiles de los pares de la red I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:111
 msgid "statistics"
 msgstr "estadísticas"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:265
 msgid "I2P Router Statistics"
-msgstr "Estadísticas del enrutador I2P"
+msgstr "Estadísticas del router I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:255
 #, java-format
 msgid "Disable {0} Refresh"
-msgstr "Deshabilitar el recargar cada {0}"
+msgstr "Deshabilitar la recarga de cada {0}"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:111
 msgid "tunnel summary"
-msgstr ""
+msgstr "Sumario de tuneles"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:248
 msgid "I2P Tunnel Summary"
-msgstr ""
+msgstr "Sumario de tuneles I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:248
+msgid "Peer Profile"
+msgstr "Perfil de pares"
 
-#~ msgid "hour"
-#~ msgstr "hora"
-#~ msgid "minutes"
-#~ msgstr "minutos"
-#~ msgid "This is useful in some situations"
-#~ msgstr "C'est utile dans certains cas"
-#~ msgid "Start Now"
-#~ msgstr "Démarrer tout de suite"
-#~ msgid "Depth"
-#~ msgstr "Profondeur"
-#~ msgid "view without"
-#~ msgstr "montrer sans"
-#~ msgid "view with"
-#~ msgstr "montrer avec"
-#~ msgid "Show the router's workload, and how it's performing"
-#~ msgstr "Montrer les tâches en cours"
-#~ msgid "Jobs"
-#~ msgstr "Tâches"
-#~ msgid "Tunnels in/out"
-#~ msgstr "Tunnels entrants/sortants"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:275
+#, java-format
+msgid "Profile for peer {0}"
+msgstr "Perfil para par {0}"
 
diff --git a/apps/routerconsole/locale/messages_fr.po b/apps/routerconsole/locale/messages_fr.po
index 1d0ae74eaea698045706ddf03c4eb4172eb706b0..e5a733652ca68845bbb20f30fff3ae56665ef774 100644
--- a/apps/routerconsole/locale/messages_fr.po
+++ b/apps/routerconsole/locale/messages_fr.po
@@ -8,15 +8,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P routerconsole\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-19 18:16+0000\n"
-"PO-Revision-Date: 2010-11-19 20:04+0100\n"
-"Last-Translator: mixxy <m1xxy@mail.i2p>\n"
-"Language-Team: foo <foo@bar>\n"
+"POT-Creation-Date: 2011-05-18 10:29+0000\n"
+"PO-Revision-Date: 2011-05-18 13:35+0100\n"
+"Last-Translator: magma <magma@mail.i2p>\n"
+"Language-Team: I2P Project <foo@bar>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Poedit-Language: French\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n >= 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
@@ -26,535 +27,648 @@ msgstr ""
 #. {0,number,####} prevents 1234 from being output as 1,234 in the English locale.
 #. If you want the digit separator in your locale, translate as {0}.
 #. alternates: msec, msecs
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1086
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1140
 #, java-format
 msgid "1 ms"
 msgid_plural "{0,number,####} ms"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{0,number,####}ms"
+msgstr[1] "{0,number,####}ms"
 
 #. seconds
 #. Note to translators: quantity will always be greater than one.
 #. alternates: secs, sec. 'seconds' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1091
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1145
 #, java-format
 msgid "1 sec"
 msgid_plural "{0} sec"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{0}s"
+msgstr[1] "{0}s"
 
 #. minutes
 #. Note to translators: quantity will always be greater than one.
 #. alternates: mins, min. 'minutes' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1096
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1150
 #, java-format
 msgid "1 min"
 msgid_plural "{0} min"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{0}mn"
+msgstr[1] "{0}mn"
 
 #. hours
 #. Note to translators: quantity will always be greater than one.
 #. alternates: hrs, hr., hrs.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1101
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1155
 #, java-format
 msgid "1 hour"
 msgid_plural "{0} hours"
-msgstr[0] "1 heure"
-msgstr[1] "{0} heures"
+msgstr[0] "{0}h"
+msgstr[1] "{0}h"
 
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1103
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1157
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:314
 msgid "n/a"
-msgstr ""
+msgstr "n/d"
 
 #. days
 #. Note to translators: quantity will always be greater than one.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1107
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1161
 #, java-format
 msgid "1 day"
 msgid_plural "{0} days"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{0}j"
+msgstr[1] "{0}j"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:126
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:122
 #, java-format
 msgid "Banned by router hash: {0}"
-msgstr ""
+msgstr "Banni(s) par hachage routeur: {0}"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:128
-#, fuzzy
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:124
 msgid "Banned by router hash"
-msgstr "Pairs interdits"
+msgstr "Banni via hachage du routeur"
 
 #. Temporary reason, until the job finishes
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:673
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:669
 msgid "IP banned"
-msgstr "IP interdit"
+msgstr "IP bannie"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:743
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:739
 #, java-format
 msgid "IP banned by blocklist.txt entry {0}"
-msgstr ""
+msgstr "IP bannie(s) via entrée blocklist.txt {0}"
 
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:92
 msgid "Rejecting tunnels: Shutting down"
-msgstr ""
+msgstr "Refuse les tunnels: (arrêt en cours)"
 
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:141
 msgid "Rejecting tunnels: High message delay"
-msgstr ""
+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");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:177
 msgid "Rejecting most tunnels: High number of requests"
-msgstr ""
+msgstr "Refuse la plupart des tunnels: (trop de requêtes)"
 
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:233
 msgid "Rejecting tunnels: Limit reached"
-msgstr ""
+msgstr "Refus de tunnels: (limite atteinte)"
 
 #. .067KBps
 #. * also limited to 90% - see below
 #. always leave at least 4KBps free when allowing
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:301
 msgid "Rejecting tunnels: Bandwidth limit"
-msgstr ""
+msgstr "Refus de tunnels: (limite de bande passante)"
 
 #. hard to do {0} from here
 #. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels: Bandwidth limit");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:371
 msgid "Rejecting most tunnels: Bandwidth limit"
-msgstr ""
+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");
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:375
-#, fuzzy
 msgid "Accepting most tunnels"
-msgstr "tunnels participants"
+msgstr "Accepte la plupart des tunnels"
 
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:377
 msgid "Accepting tunnels"
-msgstr ""
+msgstr "Accepte les tunnels"
 
 #. NPE, too early
 #. if (_context.router().getRouterInfo().getBandwidthTier().equals("K"))
 #. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low");
 #. else
 #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:488
-#, fuzzy
 msgid "Rejecting tunnels"
-msgstr "Configuration des tunnels"
+msgstr "Refus des tunnels"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:50
-msgid "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually."
-msgstr ""
-
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:82
-#, fuzzy
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:125
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
 msgid "Reseeding"
-msgstr "Test en cours"
+msgstr "Réamorçage"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:146
-msgid "Reseeding: fetching seed URL."
-msgstr ""
-
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:152
-msgid "Last reseed failed fully (failed reading seed URL)."
-msgstr ""
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:141
+#, java-format
+msgid "Reseed fetched only 1 router."
+msgid_plural "Reseed fetched only {0} routers."
+msgstr[0] "Le réamorçage n'a trouvé qu'un seul routeur."
+msgstr[1] "Le réamorçage n''a trouvé que {0} routeurs."
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:178
-msgid "Last reseed failed fully (no routerInfo URLs at seed URL)."
-msgstr ""
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:148
+msgid "Reseed failed."
+msgstr "Échec de réamorçage"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:191
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:149
 #, java-format
-msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
-msgstr ""
+msgid "See {0} for help."
+msgstr "Voir {0} pour l''aide."
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:212
-#, java-format
-msgid "Last reseed failed partly ({0}% of {1})."
-msgstr ""
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150
+msgid "reseed configuration page"
+msgstr "page de configuration du réamorçage"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:217
-#, java-format
-msgid "Last reseed failed ({0}% of {1})."
-msgstr ""
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:293
+msgid "Reseeding: fetching seed URL."
+msgstr "Réamorçage: collecte des URL sources."
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:227
-msgid "Last reseed failed fully (exception caught)."
-msgstr ""
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:335
+#, 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)."
 
-#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:510
+#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512
 msgid "NetDb entry"
-msgstr ""
+msgstr "Entrée 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:70
 msgid "No transports (hidden or starting up?)"
-msgstr ""
+msgstr "Pas de transports (masqués ou en cours de démarrage?)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:451
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450
 msgid "Unreachable on any transport"
-msgstr ""
+msgstr "Inaccessible sur tout transport"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:500
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499
 msgid "Router Transport Addresses"
-msgstr ""
+msgstr "Adresses de transport du routeur"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:505
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504
 #, java-format
 msgid "{0} is used for outbound connections only"
-msgstr ""
+msgstr "{0} est utilisé seulement pour les connexions sortantes"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129
+msgid "Help"
+msgstr "Aide"
 
 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
+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 configuration de bande passante."
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521
+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."
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
 msgid "Definitions"
 msgstr "Définitions"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:715
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1888
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
 msgid "Peer"
 msgstr "Pair"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
 msgid "The remote peer, identified by router hash"
-msgstr ""
+msgstr "Le pair distant, identifié par son hachage routeur"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:716
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
 msgid "Dir"
-msgstr ""
+msgstr "Sens"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:522
-#, fuzzy
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
 msgid "Inbound connection"
-msgstr "Options Entrants"
+msgstr "Connexion entrante"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
-#, fuzzy
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
 msgid "Outbound connection"
-msgstr "Options Sortants"
+msgstr "Connexion sortante"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
 msgid "They offered to introduce us (help other peers traverse our firewall)"
-msgstr ""
+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:528
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532
 msgid "We offered to introduce them (help other peers traverse their firewall)"
-msgstr ""
+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:529
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
 msgid "How long since a packet has been received / sent"
-msgstr ""
+msgstr "Temps écoulé depuis la dernière réception/émission d'un paquet "
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:717
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
 msgid "Idle"
-msgstr ""
+msgstr "En attente"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:718
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "In/Out"
 msgstr "Entrant/Sortant"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)"
-msgstr ""
+msgstr "Taux de transfert entrant/sortant lissé (ko/s)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
 msgid "How long ago this connection was established"
-msgstr ""
+msgstr "Depuis combien de temps cette connexion est établie"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:719
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905
 msgid "Up"
-msgstr ""
+msgstr "En marche"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:720
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907
 msgid "Skew"
-msgstr ""
+msgstr "Dérive"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
 msgid "The difference between the peer's clock and your own"
-msgstr ""
+msgstr "Écart de temps entre l'horloge du pair et la votre"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
 msgid "The congestion window, which is how many bytes can be sent without an acknowledgement"
-msgstr ""
+msgstr "Fenêtre de congestion, en nombre d'octets transmissibles sans acquittement"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
 msgid "The number of sent messages awaiting acknowledgement"
-msgstr ""
+msgstr "Nombre de messages en attente d'acquittement"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
 msgid "The maximum number of concurrent messages to send"
-msgstr ""
+msgstr "Nombre maximum de messages simultanés à envoyer"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
 msgid "The number of pending sends which exceed congestion window"
-msgstr ""
+msgstr "Nombre d'envois en attente qui débordent de la fenêtre de congestion"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
 msgid "The slow start threshold"
-msgstr ""
+msgstr "Seuil de démarrage lent"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
 msgid "The round trip time in milliseconds"
-msgstr ""
+msgstr "Aller-retour en ms"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1915
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917
 msgid "Dev"
-msgstr ""
+msgstr "Deviat."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
 msgid "The standard deviation of the round trip time in milliseconds"
-msgstr ""
+msgstr "Dérive standard d'aller-retour en ms"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
 msgid "The retransmit timeout in milliseconds"
-msgstr ""
+msgstr "Délai de retransmission en millisecondes"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
 msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)"
-msgstr ""
+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:542
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:721
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1922
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
 msgid "TX"
-msgstr ""
+msgstr "TX"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
 msgid "The total number of packets sent to the peer"
-msgstr ""
+msgstr "Nombre de paquets envoyés au pair"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:722
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
 msgid "RX"
-msgstr ""
+msgstr "RX"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
 msgid "The total number of packets received from the peer"
-msgstr ""
+msgstr "Nombre de paquets reçus du pair"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929
 msgid "Dup TX"
-msgstr ""
+msgstr "TX dupl."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
 msgid "The total number of packets retransmitted to the peer"
-msgstr ""
+msgstr "Nombre de paquets retransmis au pair"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931
 msgid "Dup RX"
-msgstr ""
+msgstr "RX dupl."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
 msgid "The total number of duplicate packets received from the peer"
-msgstr ""
+msgstr "Nombre de paquets en double reçus du pair"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:402
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+msgid "Service"
+msgstr "Service"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:404
+msgid "WAN Common Interface Configuration"
+msgstr "Configuration de l'interface commune Internet"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:405
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:411
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:421
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:426
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:86
+msgid "Status"
+msgstr "État"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:406
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:412
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:422
+msgid "Type"
+msgstr "Type"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:407
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:413
+msgid "Upstream"
+msgstr "Montant"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:408
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:414
+msgid "Downstream"
+msgstr "Descendant"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:410
+msgid "WAN PPP Connection"
+msgstr "Connexion Internet PPP"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:415
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:423
+msgid "External IP"
+msgstr "Adresse IP externe"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:417
+msgid "Layer 3 Forwarding"
+msgstr "Transfert niveau 3"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:418
+msgid "Default Connection Service"
+msgstr "Service de connexion par défaut"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:420
+msgid "WAN IP Connection"
+msgstr "Connexion IP Internet"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:425
+msgid "WAN Ethernet Link Configuration"
+msgstr "Configuration du lien Ethernet Internet"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:438
+msgid "Found Device"
+msgstr "Appareil détecté"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:440
+msgid "Subdevice"
+msgstr "Service"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:461
+msgid "UPnP Status"
+msgstr "État d'UPnP"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:464
+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."
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:467
+msgid "UPnP has not found any UPnP-aware, compatible device on your LAN."
+msgstr "UPnP n'a pas trouvé de passerelle compatible sur votre réseau local."
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:475
+#, java-format
+msgid "The current external IP address reported by UPnP is {0}"
+msgstr "Adresse IP externe détectée par UPnP : {0}"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:477
+msgid "The current external IP address is not available."
+msgstr "L'adresse IP externe n'est pas disponible."
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:481
+#, java-format
+msgid "UPnP reports the maximum downstream bit rate is {0}bits/sec"
+msgstr "UPnP indique un débit descendant maximum de  {0}b/s"
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:483
+#, java-format
+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.
+#. If you want the digit separator in your locale, translate as {1}.
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:492
+#, java-format
+msgid "{0} port {1,number,#####} was successfully forwarded by UPnP."
+msgstr "Le port {0} {1,number,#####} est correctement transféré par UPnP."
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:494
+#, java-format
+msgid "{0} port {1,number,#####} was not forwarded by UPnP."
+msgstr "Le port {0} {1,number,#####} n'est pas transféré par UPnP."
+
+#: ../../../router/java/src/net/i2p/router/transport/UPnPManager.java:161
+msgid "UPnP is not enabled"
+msgstr "UPnP n'est pas activé"
 
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:409
 #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:627
 #, java-format
 msgid "Excessive clock skew: {0}"
-msgstr ""
+msgstr "Décalage excessif de l''horloge: {0}"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:710
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732
 msgid "NTCP connections"
 msgstr "connexions NTCP"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:711
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1884
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:733
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886
 msgid "Limit"
-msgstr ""
+msgstr "Limite"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:712
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:734
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
 msgid "Timeout"
-msgstr ""
+msgstr "Échéance"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:723
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:745
 msgid "Out Queue"
-msgstr ""
+msgstr "File de sortie"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:724
-#, fuzzy
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:746
 msgid "Backlogged?"
-msgstr "Retard accumulé"
+msgstr "Réinscrit?"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1947
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
 msgid "Inbound"
 msgstr "Entrant"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:762
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
 msgid "Outbound"
 msgstr "Sortant"
 
 #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:787
-#, fuzzy
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:809
 msgid "peers"
 msgstr "Pairs"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1883
-#, fuzzy
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885
 msgid "UDP connections"
 msgstr "connexions UDP"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892
 msgid "Sort by peer hash"
-msgstr ""
+msgstr "Tri par hachage de pair"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
 msgid "Direction/Introduction"
-msgstr ""
+msgstr "Direction/Introduction"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
 msgid "Sort by idle inbound"
-msgstr ""
+msgstr "Tri par entrant inactif"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
 msgid "Sort by idle outbound"
-msgstr ""
+msgstr "Tri par sortant inactif"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1899
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
 msgid "Sort by inbound rate"
-msgstr ""
+msgstr "Tri par taux entrant"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903
 msgid "Sort by outbound rate"
-msgstr ""
+msgstr "Tri par taux sortant"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1904
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
 msgid "Sort by connection uptime"
-msgstr ""
+msgstr "Tri par durée de connexion"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
 msgid "Sort by clock skew"
-msgstr ""
+msgstr "Tri par décalage d'horloge"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1909
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911
 msgid "Sort by congestion window"
-msgstr ""
+msgstr "Tri par fenêtre de congestion"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913
 msgid "Sort by slow start threshold"
-msgstr ""
+msgstr "Tri par seuil de démarrage lent"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1914
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916
 msgid "Sort by round trip time"
-msgstr ""
+msgstr "Tri par durée d'aller-retour"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
 msgid "Sort by round trip time deviation"
-msgstr ""
+msgstr "Tri par dérive de durée d'aller-retour"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920
 msgid "Sort by retransmission timeout"
-msgstr ""
+msgstr "Tri pas dépassement de durée de retransmission"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923
 msgid "Sort by outbound maximum transmit unit"
-msgstr ""
+msgstr "Tri par MTU sortant"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
 msgid "Sort by packets sent"
-msgstr ""
+msgstr "Tri par paquets envoyés"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
 msgid "Sort by packets received"
-msgstr ""
+msgstr "Tri par paquets reçus"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1928
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930
 msgid "Sort by packets retransmitted"
-msgstr ""
+msgstr "Tri par paquets renvoyés"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932
 msgid "Sort by packets received more than once"
-msgstr ""
+msgstr "Tri par paquet reçus multiples"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953
 msgid "We offered to introduce them"
-msgstr ""
+msgstr "Propositions de présentation à"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955
 msgid "They offered to introduce us"
-msgstr ""
+msgstr "Ont proposé leur service"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1957
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959
 msgid "Choked"
-msgstr ""
+msgstr "Choqué"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1965
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967
 msgid "1 fail"
-msgstr ""
+msgstr "1 échec"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969
 #, java-format
 msgid "{0} fails"
-msgstr ""
+msgstr "{0} échecs"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1973
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162
 msgid "Banned"
-msgstr "Prohibé"
+msgstr "Banni"
 
 #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2105
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106
 msgid "SUMMARY"
-msgstr ""
+msgstr "RÉSUMÉ"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:145
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124
 msgid "Dropping tunnel requests: Too slow"
-msgstr ""
+msgstr "Perte de demandes de tunnels: Trop lent"
 
 #. don't even bother, since we are so overloaded locally
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:352
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:270
 msgid "Dropping tunnel requests: Overloaded"
-msgstr ""
+msgstr "Perte de demandes de tunnnels: Surchargé"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:525
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:473
 msgid "Rejecting tunnels: Request overload"
-msgstr ""
+msgstr "Rejet de tunnels: Surcharge de requêtes "
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:550
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:498
 msgid "Rejecting tunnels: Connection limit"
-msgstr ""
+msgstr "Rejet de tunnels: Limite de connexions"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:744
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:698
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:719
 msgid "Dropping tunnel requests: High load"
-msgstr ""
+msgstr "Perte de tunnels: Forte charge"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:753
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:711
 msgid "Dropping tunnel requests: Queue time"
-msgstr ""
+msgstr "Demandes de fermeture de tunnel: temps en file d'attente"
 
 #. Automatically generated pseudo-java for xgettext - do not edit
 #. Translators may wish to translate a few of these, do not bother to translate all of them!!
@@ -564,19 +678,19 @@ msgstr "Andorre"
 
 #: ../java/build/Countries.java:4
 msgid "United Arab Emirates"
-msgstr ""
+msgstr "Émirats arabes unis"
 
 #: ../java/build/Countries.java:5
 msgid "Afghanistan"
-msgstr ""
+msgstr "Afghanistan"
 
 #: ../java/build/Countries.java:6
 msgid "Antigua and Barbuda"
-msgstr ""
+msgstr "Antigua-et-Barbuda"
 
 #: ../java/build/Countries.java:7
 msgid "Anguilla"
-msgstr ""
+msgstr "Anguilla"
 
 #: ../java/build/Countries.java:8
 msgid "Albania"
@@ -584,19 +698,19 @@ msgstr "Albanie"
 
 #: ../java/build/Countries.java:9
 msgid "Armenia"
-msgstr ""
+msgstr "Arménie"
 
 #: ../java/build/Countries.java:10
 msgid "Netherlands Antilles"
-msgstr ""
+msgstr "Antilles néerlandaises"
 
 #: ../java/build/Countries.java:11
 msgid "Angola"
-msgstr ""
+msgstr "Angola"
 
 #: ../java/build/Countries.java:12
 msgid "Antarctica"
-msgstr ""
+msgstr "Antarctique"
 
 #: ../java/build/Countries.java:13
 msgid "Argentina"
@@ -604,7 +718,7 @@ msgstr "Argentine"
 
 #: ../java/build/Countries.java:14
 msgid "American Samoa"
-msgstr ""
+msgstr "Samoa américanes"
 
 #: ../java/build/Countries.java:15
 msgid "Austria"
@@ -612,63 +726,63 @@ msgstr "Autriche"
 
 #: ../java/build/Countries.java:16
 msgid "Australia"
-msgstr ""
+msgstr "Australie"
 
 #: ../java/build/Countries.java:17
 msgid "Aruba"
-msgstr ""
+msgstr "Aruba"
 
 #: ../java/build/Countries.java:19
 msgid "Azerbaijan"
-msgstr ""
+msgstr "Azerbaïdjan"
 
 #: ../java/build/Countries.java:20
 msgid "Bosnia and Herzegovina"
-msgstr ""
+msgstr "Bosnie Herzégovine"
 
 #: ../java/build/Countries.java:21
 msgid "Barbados"
-msgstr ""
+msgstr "Barbades"
 
 #: ../java/build/Countries.java:22
 msgid "Bangladesh"
-msgstr ""
+msgstr "Bangladesh"
 
 #: ../java/build/Countries.java:23
 msgid "Belgium"
-msgstr ""
+msgstr "Belgique"
 
 #: ../java/build/Countries.java:24
 msgid "Burkina Faso"
-msgstr ""
+msgstr "Burkina Faso"
 
 #: ../java/build/Countries.java:25
 msgid "Bulgaria"
-msgstr ""
+msgstr "Bulgarie"
 
 #: ../java/build/Countries.java:26
 msgid "Bahrain"
-msgstr ""
+msgstr "Bahreïn"
 
 #: ../java/build/Countries.java:27
 msgid "Burundi"
-msgstr ""
+msgstr "Burundi"
 
 #: ../java/build/Countries.java:28
 msgid "Benin"
-msgstr ""
+msgstr "Benin"
 
 #: ../java/build/Countries.java:29
 msgid "Bermuda"
-msgstr ""
+msgstr "Bermudes"
 
 #: ../java/build/Countries.java:30
 msgid "Brunei Darussalam"
-msgstr ""
+msgstr "Brunei"
 
 #: ../java/build/Countries.java:31
 msgid "Bolivia"
-msgstr ""
+msgstr "Bolivie"
 
 #: ../java/build/Countries.java:32
 msgid "Brazil"
@@ -676,95 +790,95 @@ msgstr "Brésil"
 
 #: ../java/build/Countries.java:33
 msgid "Bahamas"
-msgstr ""
+msgstr "Bahamas"
 
 #: ../java/build/Countries.java:34
 msgid "Bhutan"
-msgstr ""
+msgstr "Bhoutan"
 
 #: ../java/build/Countries.java:35
 msgid "Bouvet Island"
-msgstr ""
+msgstr "ÃŽle Bouvet"
 
 #: ../java/build/Countries.java:36
 msgid "Botswana"
-msgstr ""
+msgstr "Botswana"
 
 #: ../java/build/Countries.java:37
 msgid "Belarus"
-msgstr ""
+msgstr "Biélorussie"
 
 #: ../java/build/Countries.java:38
 msgid "Belize"
-msgstr ""
+msgstr "Bélize"
 
 #: ../java/build/Countries.java:39
 msgid "Canada"
-msgstr ""
+msgstr "Canada"
 
 #: ../java/build/Countries.java:40
 msgid "The Democratic Republic of the Congo"
-msgstr ""
+msgstr "République démocratique du Congo"
 
 #: ../java/build/Countries.java:41
 msgid "Central African Republic"
-msgstr ""
+msgstr "République centre africaine"
 
 #: ../java/build/Countries.java:42
 msgid "Congo"
-msgstr ""
+msgstr "Congo"
 
 #: ../java/build/Countries.java:43
 msgid "Switzerland"
-msgstr ""
+msgstr "Suisse"
 
 #: ../java/build/Countries.java:44
 msgid "Cote D'Ivoire"
-msgstr ""
+msgstr "Côte d'ivoire"
 
 #: ../java/build/Countries.java:45
 msgid "Cook Islands"
-msgstr ""
+msgstr "ÃŽles Cook"
 
 #: ../java/build/Countries.java:46
 msgid "Chile"
-msgstr ""
+msgstr "Chili"
 
 #: ../java/build/Countries.java:47
 msgid "Cameroon"
-msgstr ""
+msgstr "Cameroun"
 
 #: ../java/build/Countries.java:48
 msgid "China"
-msgstr ""
+msgstr "Chine"
 
 #: ../java/build/Countries.java:49
 msgid "Colombia"
-msgstr ""
+msgstr "Colombie"
 
 #: ../java/build/Countries.java:50
 msgid "Costa Rica"
-msgstr ""
+msgstr "Costa Rica"
 
 #: ../java/build/Countries.java:51
 msgid "Serbia and Montenegro"
-msgstr ""
+msgstr "Serbie-et-Monténégro"
 
 #: ../java/build/Countries.java:52
 msgid "Cuba"
-msgstr ""
+msgstr "Cuba"
 
 #: ../java/build/Countries.java:53
 msgid "Cape Verde"
-msgstr ""
+msgstr "Cap-Vert"
 
 #: ../java/build/Countries.java:54
 msgid "Cyprus"
-msgstr ""
+msgstr "Chypre"
 
 #: ../java/build/Countries.java:55
 msgid "Czech Republic"
-msgstr ""
+msgstr "République Tchèque"
 
 #: ../java/build/Countries.java:56
 msgid "Germany"
@@ -772,67 +886,67 @@ msgstr "Allemagne"
 
 #: ../java/build/Countries.java:57
 msgid "Djibouti"
-msgstr ""
+msgstr "Djibouti"
 
 #: ../java/build/Countries.java:58
 msgid "Denmark"
-msgstr ""
+msgstr "Danemark"
 
 #: ../java/build/Countries.java:59
 msgid "Dominica"
-msgstr ""
+msgstr "Dominique"
 
 #: ../java/build/Countries.java:60
 msgid "Dominican Republic"
-msgstr ""
+msgstr "République Dominicaine"
 
 #: ../java/build/Countries.java:61
 msgid "Algeria"
-msgstr ""
+msgstr "Algérie"
 
 #: ../java/build/Countries.java:62
 msgid "Ecuador"
-msgstr ""
+msgstr "Équateur"
 
 #: ../java/build/Countries.java:63
 msgid "Estonia"
-msgstr ""
+msgstr "Estonie"
 
 #: ../java/build/Countries.java:64
 msgid "Egypt"
-msgstr ""
+msgstr "Égypte"
 
 #: ../java/build/Countries.java:65
 msgid "Eritrea"
-msgstr ""
+msgstr "Érythrée"
 
 #: ../java/build/Countries.java:66
 msgid "Spain"
-msgstr ""
+msgstr "Espagne"
 
 #: ../java/build/Countries.java:67
 msgid "Ethiopia"
-msgstr ""
+msgstr "Éthiopie"
 
 #: ../java/build/Countries.java:68
 msgid "Finland"
-msgstr ""
+msgstr "Finlande"
 
 #: ../java/build/Countries.java:69
 msgid "Fiji"
-msgstr ""
+msgstr "Fidji"
 
 #: ../java/build/Countries.java:70
 msgid "Falkland Islands (Malvinas)"
-msgstr ""
+msgstr "Malouines"
 
 #: ../java/build/Countries.java:71
 msgid "Federated States of Micronesia"
-msgstr ""
+msgstr "Micronésie"
 
 #: ../java/build/Countries.java:72
 msgid "Faroe Islands"
-msgstr ""
+msgstr "Féroé"
 
 #: ../java/build/Countries.java:73
 msgid "France"
@@ -840,660 +954,661 @@ msgstr "France"
 
 #: ../java/build/Countries.java:74
 msgid "Gabon"
-msgstr ""
+msgstr "Gabon"
 
 #: ../java/build/Countries.java:75
 msgid "United Kingdom"
-msgstr ""
+msgstr "Royaume uni"
 
 #: ../java/build/Countries.java:76
 msgid "Grenada"
-msgstr ""
+msgstr "Grenade"
 
 #: ../java/build/Countries.java:77
 msgid "Georgia"
-msgstr ""
+msgstr "Géorgie"
 
 #: ../java/build/Countries.java:78
 msgid "French Guiana"
-msgstr ""
+msgstr "Guyane française"
 
 #: ../java/build/Countries.java:79
 msgid "Ghana"
-msgstr ""
+msgstr "Ghana"
 
 #: ../java/build/Countries.java:80
 msgid "Gibraltar"
-msgstr ""
+msgstr "Gibraltar"
 
 #: ../java/build/Countries.java:81
 msgid "Greenland"
-msgstr ""
+msgstr "Groenland"
 
 #: ../java/build/Countries.java:82
 msgid "Gambia"
-msgstr ""
+msgstr "Gambie"
 
 #: ../java/build/Countries.java:83
 msgid "Guinea"
-msgstr ""
+msgstr "Guinée"
 
 #: ../java/build/Countries.java:84
 msgid "Guadeloupe"
-msgstr ""
+msgstr "Guadeloupe"
 
 #: ../java/build/Countries.java:85
 msgid "Equatorial Guinea"
-msgstr ""
+msgstr "Guinée équatoriale"
 
 #: ../java/build/Countries.java:86
 msgid "Greece"
-msgstr ""
+msgstr "Grèce"
 
 #: ../java/build/Countries.java:87
 msgid "South Georgia and the South Sandwich Islands"
-msgstr ""
+msgstr "Géorgie et Sandwich du sud"
 
 #: ../java/build/Countries.java:88
 msgid "Guatemala"
-msgstr ""
+msgstr "Guatémala"
 
 #: ../java/build/Countries.java:89
 msgid "Guam"
-msgstr ""
+msgstr "Guam"
 
 #: ../java/build/Countries.java:90
 msgid "Guinea-Bissau"
-msgstr ""
+msgstr "Guinée-Bissau"
 
 #: ../java/build/Countries.java:91
 msgid "Guyana"
-msgstr ""
+msgstr "Guyane"
 
 #: ../java/build/Countries.java:92
 msgid "Hong Kong"
-msgstr ""
+msgstr "Hong Kong"
 
 #: ../java/build/Countries.java:93
 msgid "Honduras"
-msgstr ""
+msgstr "Honduras"
 
 #: ../java/build/Countries.java:94
 msgid "Croatia"
-msgstr ""
+msgstr "Croatie"
 
 #: ../java/build/Countries.java:95
 msgid "Haiti"
-msgstr ""
+msgstr "Haïti"
 
 #: ../java/build/Countries.java:96
 msgid "Hungary"
-msgstr ""
+msgstr "Hongrie"
 
 #: ../java/build/Countries.java:97
 msgid "Indonesia"
-msgstr ""
+msgstr "Indonésie"
 
 #: ../java/build/Countries.java:98
 msgid "Ireland"
-msgstr ""
+msgstr "Irlande"
 
 #: ../java/build/Countries.java:99
 msgid "Israel"
-msgstr ""
+msgstr "Israël"
 
 #: ../java/build/Countries.java:101
 msgid "India"
-msgstr ""
+msgstr "Inde"
 
 #: ../java/build/Countries.java:102
 msgid "British Indian Ocean Territory"
-msgstr ""
+msgstr "Territoire britannique de l'océan Indien"
 
 #: ../java/build/Countries.java:103
 msgid "Iraq"
-msgstr ""
+msgstr "Irak"
 
 #: ../java/build/Countries.java:104
 msgid "Islamic Republic of Iran"
-msgstr ""
+msgstr "Iran"
 
 #: ../java/build/Countries.java:105
 msgid "Iceland"
-msgstr ""
+msgstr "Islande"
 
 #: ../java/build/Countries.java:106
 msgid "Italy"
-msgstr ""
+msgstr "Italie"
 
 #: ../java/build/Countries.java:108
 msgid "Jamaica"
-msgstr ""
+msgstr "Jamaïque"
 
 #: ../java/build/Countries.java:109
 msgid "Jordan"
-msgstr ""
+msgstr "Jordanie"
 
 #: ../java/build/Countries.java:110
 msgid "Japan"
-msgstr ""
+msgstr "Japon"
 
 #: ../java/build/Countries.java:111
 msgid "Kenya"
-msgstr ""
+msgstr "Kenya"
 
 #: ../java/build/Countries.java:112
 msgid "Kyrgyzstan"
-msgstr ""
+msgstr "Kirghizistan"
 
 #: ../java/build/Countries.java:113
 msgid "Cambodia"
-msgstr ""
+msgstr "Cambodge"
 
 #: ../java/build/Countries.java:114
 msgid "Kiribati"
-msgstr ""
+msgstr "Kiribati"
 
 #: ../java/build/Countries.java:115
 msgid "Comoros"
-msgstr ""
+msgstr "Comores"
 
 #: ../java/build/Countries.java:116
 msgid "Saint Kitts and Nevis"
-msgstr ""
+msgstr "Saint-Christophe-et-Niévès"
 
 #: ../java/build/Countries.java:117
 msgid "Republic of Korea"
-msgstr ""
+msgstr "Corée"
 
 #: ../java/build/Countries.java:118
 msgid "Kuwait"
-msgstr ""
+msgstr "Koweit"
 
 #: ../java/build/Countries.java:119
 msgid "Cayman Islands"
-msgstr ""
+msgstr "Caïman"
 
 #: ../java/build/Countries.java:120
 msgid "Kazakhstan"
-msgstr ""
+msgstr "Kazakhstan"
 
 #: ../java/build/Countries.java:121
 msgid "Lao People's Democratic Republic"
-msgstr ""
+msgstr "Laos"
 
 #: ../java/build/Countries.java:122
 msgid "Lebanon"
-msgstr ""
+msgstr "Liban"
 
 #: ../java/build/Countries.java:123
 msgid "Saint Lucia"
-msgstr ""
+msgstr "Sainte Lucie"
 
 #: ../java/build/Countries.java:124
 msgid "Liechtenstein"
-msgstr ""
+msgstr "Liechtenstein"
 
 #: ../java/build/Countries.java:125
 msgid "Sri Lanka"
-msgstr ""
+msgstr "Sri Lanka"
 
 #: ../java/build/Countries.java:126
 msgid "Liberia"
-msgstr ""
+msgstr "Libéria"
 
 #: ../java/build/Countries.java:127
 msgid "Lesotho"
-msgstr ""
+msgstr "Lesotho"
 
 #: ../java/build/Countries.java:128
 msgid "Lithuania"
-msgstr ""
+msgstr "Lithuanie"
 
 #: ../java/build/Countries.java:129
 msgid "Luxembourg"
-msgstr ""
+msgstr "Luxembourg"
 
 #: ../java/build/Countries.java:130
 msgid "Latvia"
-msgstr ""
+msgstr "Lettonie"
 
 #: ../java/build/Countries.java:131
 msgid "Libyan Arab Jamahiriya"
-msgstr ""
+msgstr "Libye"
 
 #: ../java/build/Countries.java:132
 msgid "Morocco"
-msgstr ""
+msgstr "Maroc"
 
 #: ../java/build/Countries.java:133
 msgid "Monaco"
-msgstr ""
+msgstr "Monaco"
 
 #: ../java/build/Countries.java:134
 msgid "Republic of Moldova"
-msgstr ""
+msgstr "Moldavie"
 
 #: ../java/build/Countries.java:137
 msgid "Madagascar"
-msgstr ""
+msgstr "Madagascar"
 
 #: ../java/build/Countries.java:138
 msgid "Marshall Islands"
-msgstr ""
+msgstr "Marshall"
 
 #: ../java/build/Countries.java:139
 msgid "The Former Yugoslav Republic of Macedonia"
-msgstr ""
+msgstr "Macédoine"
 
 #: ../java/build/Countries.java:140
 msgid "Mali"
-msgstr ""
+msgstr "Mali"
 
 #: ../java/build/Countries.java:141
 msgid "Myanmar"
-msgstr ""
+msgstr "Birmanie"
 
 #: ../java/build/Countries.java:142
 msgid "Mongolia"
-msgstr ""
+msgstr "Mongolie"
 
 #: ../java/build/Countries.java:143
 msgid "Macao"
-msgstr ""
+msgstr "Macao"
 
 #: ../java/build/Countries.java:144
 msgid "Northern Mariana Islands"
-msgstr ""
+msgstr "Mariannes"
 
 #: ../java/build/Countries.java:145
 msgid "Martinique"
-msgstr ""
+msgstr "Martinique"
 
 #: ../java/build/Countries.java:146
 msgid "Mauritania"
-msgstr ""
+msgstr "Mauritanie"
 
 #: ../java/build/Countries.java:147
 msgid "Montserrat"
-msgstr ""
+msgstr "Montserrat"
 
 #: ../java/build/Countries.java:148
 msgid "Malta"
-msgstr ""
+msgstr "Malte"
 
 #: ../java/build/Countries.java:149
 msgid "Mauritius"
-msgstr ""
+msgstr "Maurice"
 
 #: ../java/build/Countries.java:150
 msgid "Maldives"
-msgstr ""
+msgstr "Maldives"
 
 #: ../java/build/Countries.java:151
 msgid "Malawi"
-msgstr ""
+msgstr "Malawi"
 
 #: ../java/build/Countries.java:152
 msgid "Mexico"
-msgstr ""
+msgstr "Mexique"
 
 #: ../java/build/Countries.java:153
 msgid "Malaysia"
-msgstr ""
+msgstr "Malaisie"
 
 #: ../java/build/Countries.java:154
 msgid "Mozambique"
-msgstr ""
+msgstr "Mozambique"
 
 #: ../java/build/Countries.java:155
 msgid "Namibia"
-msgstr ""
+msgstr "Namibie"
 
 #: ../java/build/Countries.java:156
 msgid "New Caledonia"
-msgstr ""
+msgstr "Nouvelle Calédonie"
 
 #: ../java/build/Countries.java:157
 msgid "Niger"
-msgstr ""
+msgstr "Niger"
 
 #: ../java/build/Countries.java:158
 msgid "Norfolk Island"
-msgstr ""
+msgstr "Norfolk"
 
 #: ../java/build/Countries.java:159
 msgid "Nigeria"
-msgstr ""
+msgstr "Nigéria"
 
 #: ../java/build/Countries.java:160
 msgid "Nicaragua"
-msgstr ""
+msgstr "Nicaragua"
 
 #: ../java/build/Countries.java:161
 msgid "Netherlands"
-msgstr ""
+msgstr "Pays bas"
 
 #: ../java/build/Countries.java:162
 msgid "Norway"
-msgstr ""
+msgstr "Norvège"
 
 #: ../java/build/Countries.java:163
 msgid "Nepal"
-msgstr ""
+msgstr "Népal"
 
 #: ../java/build/Countries.java:164
 msgid "Nauru"
-msgstr ""
+msgstr "Nauru"
 
 #: ../java/build/Countries.java:165
 msgid "Niue"
-msgstr ""
+msgstr "Niue"
 
 #: ../java/build/Countries.java:166
 msgid "New Zealand"
-msgstr ""
+msgstr "Nouvelle Zélande"
 
 #: ../java/build/Countries.java:167
 msgid "Oman"
-msgstr ""
+msgstr "Oman"
 
 #: ../java/build/Countries.java:168
 msgid "Panama"
-msgstr ""
+msgstr "Panama"
 
 #: ../java/build/Countries.java:169
 msgid "Peru"
-msgstr ""
+msgstr "Pérou"
 
 #: ../java/build/Countries.java:170
 msgid "French Polynesia"
-msgstr ""
+msgstr "Polynésie française"
 
 #: ../java/build/Countries.java:171
 msgid "Papua New Guinea"
-msgstr ""
+msgstr "Papouasie-Nouvelle-Guinée"
 
 #: ../java/build/Countries.java:172
 msgid "Philippines"
-msgstr ""
+msgstr "Philippines"
 
 #: ../java/build/Countries.java:173
 msgid "Pakistan"
-msgstr ""
+msgstr "Pakistan"
 
 #: ../java/build/Countries.java:174
 msgid "Poland"
-msgstr ""
+msgstr "Pologne"
 
 #: ../java/build/Countries.java:175
 msgid "Saint Pierre and Miquelon"
-msgstr ""
+msgstr "Saint Pierre et Miquelon"
 
 #: ../java/build/Countries.java:176
 msgid "Puerto Rico"
-msgstr ""
+msgstr "Porto Rico"
 
 #: ../java/build/Countries.java:177
 msgid "Palestinian Territory"
-msgstr ""
+msgstr "Palestine"
 
 #: ../java/build/Countries.java:178
 msgid "Portugal"
-msgstr ""
+msgstr "Portugal"
 
 #: ../java/build/Countries.java:179
 msgid "Palau"
-msgstr ""
+msgstr "Palaos"
 
 #: ../java/build/Countries.java:180
 msgid "Paraguay"
-msgstr ""
+msgstr "Paraguay"
 
 #: ../java/build/Countries.java:181
 msgid "Qatar"
-msgstr ""
+msgstr "Qatar"
 
 #: ../java/build/Countries.java:182
 msgid "Reunion"
-msgstr ""
+msgstr "Réunion"
 
 #: ../java/build/Countries.java:183
 msgid "Romania"
-msgstr ""
+msgstr "Roumanie"
 
 #: ../java/build/Countries.java:184
 msgid "Serbia"
-msgstr ""
+msgstr "Serbie"
 
 #: ../java/build/Countries.java:185
 msgid "Russian Federation"
-msgstr ""
+msgstr "Russie"
 
 #: ../java/build/Countries.java:186
 msgid "Rwanda"
-msgstr ""
+msgstr "Rwanda"
 
 #: ../java/build/Countries.java:187
 msgid "Saudi Arabia"
-msgstr ""
+msgstr "Arabie Saoudite"
 
 #: ../java/build/Countries.java:188
 msgid "Solomon Islands"
-msgstr ""
+msgstr "Salomon"
 
 #: ../java/build/Countries.java:189
 msgid "Seychelles"
-msgstr ""
+msgstr "Seychelles"
 
 #: ../java/build/Countries.java:190
 msgid "Sudan"
-msgstr ""
+msgstr "Soudan"
 
 #: ../java/build/Countries.java:191
 msgid "Sweden"
-msgstr ""
+msgstr "Suède"
 
 #: ../java/build/Countries.java:192
 msgid "Singapore"
-msgstr ""
+msgstr "Singapour"
 
 #: ../java/build/Countries.java:193
 msgid "Slovenia"
-msgstr ""
+msgstr "Slovénie"
 
 #: ../java/build/Countries.java:194
 msgid "Slovakia"
-msgstr ""
+msgstr "Slovaquie"
 
 #: ../java/build/Countries.java:195
 msgid "Sierra Leone"
-msgstr ""
+msgstr "Sierra Leone"
 
 #: ../java/build/Countries.java:196
 msgid "San Marino"
-msgstr ""
+msgstr "Saint Marin"
 
 #: ../java/build/Countries.java:197
 msgid "Senegal"
-msgstr ""
+msgstr "Sénégal"
 
 #: ../java/build/Countries.java:198
 msgid "Somalia"
-msgstr ""
+msgstr "Somalie"
 
 #: ../java/build/Countries.java:199
 msgid "Suriname"
-msgstr ""
+msgstr "Surinam"
 
 #: ../java/build/Countries.java:200
 msgid "Sao Tome and Principe"
-msgstr ""
+msgstr "Sao Tome e Principe"
 
 #: ../java/build/Countries.java:201
 msgid "El Salvador"
-msgstr ""
+msgstr "Salvador"
 
 #: ../java/build/Countries.java:202
 msgid "Syrian Arab Republic"
-msgstr ""
+msgstr "Syrie"
 
 #: ../java/build/Countries.java:203
 msgid "Swaziland"
-msgstr ""
+msgstr "Swaziland"
 
 #: ../java/build/Countries.java:204
 msgid "Turks and Caicos Islands"
-msgstr ""
+msgstr "Turques-et-Caïques"
 
 #: ../java/build/Countries.java:205
 msgid "Chad"
-msgstr ""
+msgstr "Tchad"
 
 #: ../java/build/Countries.java:206
 msgid "French Southern Territories"
-msgstr ""
+msgstr "Terres australes et antarctiques françaises"
 
 #: ../java/build/Countries.java:207
 msgid "Togo"
-msgstr ""
+msgstr "Togo"
 
 #: ../java/build/Countries.java:208
 msgid "Thailand"
-msgstr ""
+msgstr "Thaïlande"
 
 #: ../java/build/Countries.java:209
 msgid "Tajikistan"
-msgstr ""
+msgstr "Tadjikistan"
 
 #: ../java/build/Countries.java:210
 msgid "Tokelau"
-msgstr ""
+msgstr "Tokelau"
 
 #: ../java/build/Countries.java:211
 msgid "Timor-Leste"
-msgstr ""
+msgstr "Timor oriental"
 
 #: ../java/build/Countries.java:212
 msgid "Turkmenistan"
-msgstr ""
+msgstr "Turkménistan"
 
 #: ../java/build/Countries.java:213
 msgid "Tunisia"
-msgstr ""
+msgstr "Tunisie"
 
 #: ../java/build/Countries.java:214
 msgid "Tonga"
-msgstr ""
+msgstr "Tonga"
 
 #: ../java/build/Countries.java:215
 msgid "Turkey"
-msgstr ""
+msgstr "Turquie"
 
 #: ../java/build/Countries.java:216
 msgid "Trinidad and Tobago"
-msgstr ""
+msgstr "Trinidad et Tobago"
 
 #: ../java/build/Countries.java:217
 msgid "Tuvalu"
-msgstr ""
+msgstr "Tuvalu"
 
 #: ../java/build/Countries.java:218
 msgid "Taiwan"
-msgstr ""
+msgstr "Taiwan"
 
 #: ../java/build/Countries.java:219
 msgid "United Republic of Tanzania"
-msgstr ""
+msgstr "Tanzanie"
 
 #: ../java/build/Countries.java:220
 msgid "Ukraine"
-msgstr ""
+msgstr "Ukraine"
 
 #: ../java/build/Countries.java:221
 msgid "Uganda"
-msgstr ""
+msgstr "Ouganda"
 
 #: ../java/build/Countries.java:222
 msgid "United States Minor Outlying Islands"
-msgstr ""
+msgstr "Îles mineures éloignées des États-Unis"
 
 #: ../java/build/Countries.java:223
 msgid "United States"
-msgstr ""
+msgstr "États unis"
 
 #: ../java/build/Countries.java:224
 msgid "Uruguay"
-msgstr ""
+msgstr "Uruguay"
 
 #: ../java/build/Countries.java:225
 msgid "Uzbekistan"
-msgstr ""
+msgstr "Ouzbékistan"
 
 #: ../java/build/Countries.java:226
 msgid "Holy See (Vatican City State)"
-msgstr ""
+msgstr "Vatican"
 
 #: ../java/build/Countries.java:227
 msgid "Saint Vincent and the Grenadines"
-msgstr ""
+msgstr "Saint-Vincent-et-les Grenadines"
 
 #: ../java/build/Countries.java:228
 msgid "Venezuela"
-msgstr ""
+msgstr "Venezuela"
 
 #: ../java/build/Countries.java:229
 #: ../java/build/Countries.java:230
 msgid "Virgin Islands"
-msgstr ""
+msgstr "Ïles Vierges"
 
 #: ../java/build/Countries.java:231
 msgid "Viet Nam"
-msgstr ""
+msgstr "Viêt Nam"
 
 #: ../java/build/Countries.java:232
 msgid "Vanuatu"
-msgstr ""
+msgstr "Vanuatu"
 
 #: ../java/build/Countries.java:233
 msgid "Wallis and Futuna"
-msgstr ""
+msgstr "Wallis et Futuna"
 
 #: ../java/build/Countries.java:234
 msgid "Samoa"
-msgstr ""
+msgstr "Samoa"
 
 #: ../java/build/Countries.java:235
 msgid "Yemen"
-msgstr ""
+msgstr "Yémen"
 
 #: ../java/build/Countries.java:236
 msgid "Mayotte"
-msgstr ""
+msgstr "Mayotte"
 
 #: ../java/build/Countries.java:237
 msgid "South Africa"
-msgstr ""
+msgstr "Afrique du sud"
 
 #: ../java/build/Countries.java:238
 msgid "Zambia"
-msgstr ""
+msgstr "Zambie"
 
 #: ../java/build/Countries.java:239
 msgid "Zimbabwe"
-msgstr ""
+msgstr "Zimbabwe"
 
-#: ../java/src/net/i2p/router/web/CSSHelper.java:57
+#: ../java/src/net/i2p/router/web/CSSHelper.java:60
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37
 #: ../java/strings/Strings.java:29
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:125
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:257
 msgid "I2P Router Console"
 msgstr "Console du routeur I2P"
 
 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:57
 msgid "Error updating the configuration - please see the error logs"
-msgstr ""
+msgstr "Erreur pendant la mise à jour de la configuration: contrôlez les historiques"
 
 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:69
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:266
@@ -1503,253 +1618,257 @@ msgstr "Configuration sauvegardé avec succès"
 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:268
 msgid "Error saving the configuration (applied but not saved) - please see the error logs"
-msgstr ""
+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:34
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:334
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:355
 msgid "Save Client Configuration"
-msgstr "Sauvegarder Configuration Client "
+msgstr "Enregistrer la configuration du client "
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:38
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:346
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427
+msgid "Save Interface Configuration"
+msgstr "Enregistrer la configuration de l'interface"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:441
 msgid "Save WebApp Configuration"
-msgstr ""
+msgstr "Enregistrer la configuration WebApp"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:42
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:356
-#, fuzzy
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:453
 msgid "Save Plugin Configuration"
-msgstr "Sauvegarder Configuration Client "
+msgstr "Enregistrer la configuration du greffon"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:46
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:362
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461
 msgid "Install Plugin"
-msgstr ""
+msgstr "Installer le greffon"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87
 #, java-format
 msgid "Deleted plugin {0}"
-msgstr ""
+msgstr "Greffon {0} supprimé"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:84
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89
 #, java-format
 msgid "Error deleting plugin {0}"
-msgstr ""
+msgstr "Erreur de suppression du greffon {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:96
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101
 #, java-format
 msgid "Stopped plugin {0}"
-msgstr ""
+msgstr "Greffon {0} arrêté"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:98
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103
 #, java-format
 msgid "Error stopping plugin {0}"
-msgstr ""
+msgstr "Erreur d''arrêt du greffon {0}"
 
 #. label (IE)
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:119
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:189
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255
 msgid "Start"
 msgstr "Démarrer"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:138
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33
 msgid "Unsupported"
 msgstr "Non supportée"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:184
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189
 msgid "New client added"
-msgstr ""
+msgstr "Nouveau client ajouté"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:188
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193
 msgid "Client configuration saved successfully - restart required to take effect."
 msgstr "La configuration du client a été sauvegardé avec succès - redémarrer pour prendre effet. "
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:202
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:213
-msgid "Bad client index."
-msgstr ""
-
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
+msgid "Bad client index."
+msgstr "Index client incorrect."
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:392
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:379
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:384
 msgid "Client"
-msgstr "Client"
+msgstr "Clients"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
 msgid "started"
 msgstr "démarré"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
 msgid "deleted"
-msgstr ""
+msgstr "effacé"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:235
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240
 msgid "WebApp configuration saved."
 msgstr "Sauvegardé configuration WebApp"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:251
-#, fuzzy
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256
 msgid "Plugin configuration saved."
-msgstr "Configuration Client"
+msgstr "Configuration du greffon enregistrée"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
 msgid "WebApp"
-msgstr ""
+msgstr "WebApp"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:268
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273
 msgid "Failed to start"
 msgstr "Echec de démarrage"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278
 msgid "Failed to find server."
 msgstr "Pas pu trouver un serveur."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:279
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284
 msgid "No plugin URL specified."
-msgstr ""
+msgstr "URL du greffon non spécifiée."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:289
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294
 #, java-format
 msgid "No update URL specified for {0}"
-msgstr ""
+msgstr "URL de mise à jour non spécifiée pour {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:297
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:315
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325
 msgid "Plugin or update download already in progress."
-msgstr ""
+msgstr "Greffon ou téléchargement de mise à jour déjà en cours d'exécution."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:306
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311
 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118
 #, java-format
 msgid "Downloading plugin from {0}"
-msgstr ""
+msgstr "Téléchargement greffon depuis {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:324
-#, fuzzy, java-format
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329
+#, java-format
 msgid "Checking plugin {0} for updates"
-msgstr "Chercher des mises à jour"
+msgstr "Cherche de mise à jour du greffon {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:334
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339
 #, java-format
 msgid "Started plugin {0}"
-msgstr ""
+msgstr "Greffon {0} démarré"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:336
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341
 #, java-format
 msgid "Error starting plugin {0}"
-msgstr ""
+msgstr "Erreur de démarrage du greffon {0}"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376
+msgid "Interface configuration saved successfully - restart required to take effect."
+msgstr "La configuration de l'interface a été sauvegardée avec succès - redémarrer pour prise en compte."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:21
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:192
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258
 msgid "Edit"
-msgstr ""
+msgstr "Modifier"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:30
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351
 msgid "Add Client"
-msgstr "Ajouter client"
+msgstr "Ajouter un client"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
 msgid "Class and arguments"
-msgstr ""
+msgstr "Classe et paramètres"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Control"
-msgstr ""
+msgstr "Actions"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Run at Startup?"
-msgstr "Lancer au démarrage ?"
+msgstr "Lancé au démarrage"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:131
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197
 msgid "Description"
-msgstr ""
+msgstr "Description"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Plugin"
-msgstr ""
+msgstr "Greffon"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:95
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:181
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185
 msgid "Version"
 msgstr "Version"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:97
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163
 msgid "Signed by"
-msgstr ""
+msgstr "Signé par"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:114
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180
 msgid "Date"
 msgstr "Date"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:120
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186
 msgid "Author"
 msgstr "Autheur"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:136
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202
 msgid "License"
-msgstr ""
+msgstr "Licence"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:141
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207
 msgid "Website"
-msgstr ""
+msgstr "Site web"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146
-#, fuzzy
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212
 msgid "Update link"
-msgstr "Méthode de mise à jour"
+msgstr "Mise à jour du lien"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:194
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260
 msgid "Stop"
-msgstr ""
+msgstr "Arrêt"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:196
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:81
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:312
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:80
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331
 msgid "Check for updates"
-msgstr "Chercher des mises à jour"
+msgstr "Vérifier les mises à jour"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:238
 msgid "Update"
-msgstr "Mettre à jour"
+msgstr "Mise à jour"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268
 #, java-format
 msgid "Are you sure you want to delete {0}?"
-msgstr ""
+msgstr "Voulez-vous vraiment supprimer {0}?"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:204
-#, fuzzy
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270
 msgid "Delete"
-msgstr "Supprimer une clé"
+msgstr "Effacer"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:324
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:343
 msgid "Add key"
-msgstr "Ajouter une clé"
+msgstr "Ajouter la clé"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:322
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:341
 msgid "Delete key"
-msgstr "Supprimer une clé"
+msgstr "Supprimer la clé"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:21
 msgid "You must enter a destination"
@@ -1767,116 +1886,110 @@ msgstr "Clé pour"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34
 msgid "added to keyring"
-msgstr "ajouté au porte-clés "
+msgstr "ajoutée au porte-clés "
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:36
 msgid "Invalid destination or key"
-msgstr "Destination ou clé pas valable"
+msgstr "Destination ou clé incorrecte"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41
 msgid "removed from keyring"
-msgstr "enlévé du porte-clés"
+msgstr "enlevée du porte-clés"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43
 msgid "not found in keyring"
-msgstr "pas trouvé sur le porte-clés"
+msgstr "pas trouvée sur le porte-clés"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:45
 msgid "Invalid destination"
-msgstr "Destination pas valable"
+msgstr "Destination incorrecte"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:82
 msgid "Log overrides updated"
-msgstr ""
+msgstr "Écrasement des historiques mis à jour"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:160
-#, fuzzy
 msgid "Log configuration saved"
-msgstr "Aide avec la configuration"
+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 ""
+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 ""
+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"
-msgstr ""
+msgstr "Les niveaux autorisés sont DEBUG, INFO, WARN, ERROR, CRIT"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 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
 msgid "ERROR"
-msgstr ""
+msgstr "ERROR"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 msgid "INFO"
-msgstr ""
+msgstr "INFO"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 msgid "WARN"
-msgstr ""
+msgstr "WARN"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88
-#, fuzzy
 msgid "Remove"
-msgstr "Supprimir"
+msgstr "Supprimer"
 
 #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:125
 msgid "Select a class to add"
-msgstr ""
+msgstr "Choisissez une classe à ajouter"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:200
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:204
 msgid "Network"
 msgstr "Réseau"
 
-#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
-msgid "Service"
-msgstr ""
-
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381
 #: ../java/strings/Strings.java:72
 msgid "Tunnels"
-msgstr ""
+msgstr "Tunnels"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
 msgid "UI"
-msgstr "IHM"
+msgstr "Apparence"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
 msgid "Clients"
 msgstr "Clients"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:292
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315
 msgid "Keyring"
 msgstr "Porte-clés"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
 msgid "Logging"
-msgstr "Enregistrements"
+msgstr "Historiques"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:256
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255
 #: ../java/strings/Strings.java:67
 msgid "Peers"
 msgstr "Pairs"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:389
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143
 msgid "Stats"
 msgstr "Statistiques"
@@ -1887,19 +2000,21 @@ msgstr "Avancé"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:35
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:343
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:397
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:362
 msgid "Save changes"
-msgstr "Sauvegarder"
+msgstr "Enregistrer"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:121
 msgid "Rechecking router reachability..."
-msgstr ""
+msgstr "Vérification de l'accessibilité du routeur..."
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:153
 msgid "Updating IP address"
@@ -1907,31 +2022,31 @@ msgstr "Mise à jour d'adresse IP en cours"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:171
 msgid "Disabling TCP completely"
-msgstr ""
+msgstr "Désactivation complète de TCP"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:175
 msgid "Updating inbound TCP address to"
-msgstr ""
+msgstr "Mise à jour adresse TCP entrante à "
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:179
 msgid "Disabling inbound TCP"
-msgstr ""
+msgstr "Désactivation TCP entrant"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:181
 msgid "Updating inbound TCP address to auto"
-msgstr ""
+msgstr "Mise à jour adresse TCP entrante à \"Auto\""
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:190
 msgid "Updating inbound TCP port to"
-msgstr ""
+msgstr "Mise à jour port TCP entrant à "
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:193
 msgid "Updating inbound TCP port to auto"
-msgstr ""
+msgstr "Mise à jour port TCP entrant à \"Auto\""
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205
 msgid "Updating UDP port from"
-msgstr ""
+msgstr "Mise à jour port UDP de  "
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205
 msgid "to"
@@ -1939,37 +2054,37 @@ msgstr "à"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:221
 msgid "Gracefully restarting into Hidden Router Mode"
-msgstr ""
+msgstr "Redémarrage respectueux en mode routeur caché"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:223
 msgid "Gracefully restarting to exit Hidden Router Mode"
-msgstr ""
+msgstr "Redémarrage respectueux pour sortie du mode routeur caché"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:232
 msgid "Enabling UPnP, restart required to take effect"
-msgstr ""
+msgstr "Activation UPnP, sera prise en compte au démarrage suivant"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:234
 msgid "Disabling UPnP, restart required to take effect"
-msgstr ""
+msgstr "Désactivation UPnP, sera prise en compte au démarrage suivant"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:242
 msgid "Enabling laptop mode"
-msgstr ""
+msgstr "Activation mode portable"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:244
 msgid "Disabling laptop mode"
-msgstr ""
+msgstr "Désactivation mode portable"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:250
 msgid "Requiring SSU introducers"
-msgstr ""
+msgstr "Nécessite des représentants SSU"
 
 #. There's a few changes that don't really require restart (e.g. enabling inbound TCP)
 #. But it would be hard to get right, so just do a restart.
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:291
 msgid "Gracefully restarting I2P to change published router address"
-msgstr ""
+msgstr "Redémarrage respectueux en cours pour modifier l'adresse routeur publiée"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:314
 msgid "Updating bandwidth share percentage"
@@ -1979,36 +2094,36 @@ msgstr "Mise à jour du pourcentage de bande passante partagée"
 msgid "Updated bandwidth limits"
 msgstr "Limitations mises à jour de la bande passante "
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:39
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:47
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:50
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:57
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:60
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62
 msgid "unknown"
 msgstr "inconnu"
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:169
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172
 msgid "bits per second"
 msgstr "bits par seconde"
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:170
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173
 #, java-format
 msgid "or {0} bytes per month maximum"
-msgstr ""
+msgstr "= {0} o/mois  maximum"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:314
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:333
 msgid "Ban peer until restart"
 msgstr "Interdire pair jusqu'au redémarrage"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:23
 #, java-format
 msgid "Manually banned via {0}"
-msgstr ""
+msgstr "Banni manuellement via {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
 msgid "banned until restart"
-msgstr "interdit jusqu'au rédémarrage"
+msgstr "banni jusqu'au redémarrage"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:27
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:38
@@ -2017,9 +2132,9 @@ msgid "Invalid peer"
 msgstr "Pair pas valable"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335
 msgid "Unban peer"
-msgstr ""
+msgstr "Banissement du pair levé"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
 msgid "unbanned"
@@ -2027,38 +2142,55 @@ msgstr "plus interdit"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
 msgid "is not currently banned"
-msgstr "n'est pas actuellement interdit"
+msgstr "n'est pas banni actuellement"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:322
-msgid "Adjust Profile Bonuses"
-msgstr ""
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:361
+msgid "Adjust peer bonuses"
+msgstr "Ajuster les boni des pairs"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47
 msgid "Bad speed value"
-msgstr ""
+msgstr "Valeur de vitesse incorrecte"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:52
 msgid "Bad capacity value"
 msgstr "Mauvaise valeur de capacité"
 
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:368
+msgid "Save changes and reseed now"
+msgstr "Sauvegarder et réamorcer"
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21
+msgid "Reseeding is already in progress"
+msgstr "Réamorçage déjà en cours"
+
+#. skip the nonce checking in ReseedHandler
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24
+msgid "Starting reseed process"
+msgstr "Processus de réamorçage en cours."
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66
+msgid "Configuration saved successfully."
+msgstr "Configuration sauvegardée"
+
 #. Normal browsers send value, IE sends button label
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:292
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:311
 msgid "Shutdown immediately"
-msgstr "Fermer immédiatement"
+msgstr "Arrêter immédiatement"
 
 #. ctx.router().shutdown(Router.EXIT_HARD); // never returns
 #. give the UI time to respond
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:36
 msgid "Cancel shutdown"
-msgstr "Annuler redémarrage"
+msgstr "Annuler l'arrêt"
 
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:37
-#, fuzzy
 msgid "Cancel restart"
-msgstr "Redémarrage gracieux"
+msgstr "Annuler le redémarrage"
 
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:39
 msgid "Restart immediately"
@@ -2068,353 +2200,332 @@ msgstr "Redémarrer immédiatement"
 #. give the UI time to respond
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:43
 msgid "Restart"
-msgstr "Redémarrer"
+msgstr "Redémarrage"
 
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:46
 msgid "Shutdown"
-msgstr "Fermer"
+msgstr "Arrêt"
 
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:59
-#, fuzzy
 msgid "Restart imminent"
-msgstr "Redémarrer immédiatement"
+msgstr "Redémarrage imminent"
 
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:61
 msgid "Shutdown imminent"
-msgstr "Fermature imminente"
+msgstr "Arrêt imminent"
 
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:65
 #, java-format
 msgid "Shutdown in {0}"
-msgstr "Fermature en {0}"
+msgstr "Arrêt dans {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:70
 #, java-format
 msgid "Restart in {0}"
-msgstr "Redémarrage en {0}"
+msgstr "Redémarrage dans {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:290
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309
 msgid "Shutdown gracefully"
-msgstr "Fermer gracieusement"
+msgstr "Arrêt respectueux"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:56
 msgid "Graceful shutdown initiated"
-msgstr "Fermature gracieuse initiée"
+msgstr "Arrêt respectueux initialisé"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:60
 msgid "Shutdown immediately!  boom bye bye bad bwoy"
-msgstr "Fermer immédiatement !"
+msgstr "Arrêt immédiat! (À la sauvage)"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:294
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:313
 msgid "Cancel graceful shutdown"
-msgstr "Annuler fermeture gracieux"
+msgstr "Annuler l'arrêt respectueux"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:63
 msgid "Graceful shutdown cancelled"
-msgstr "Fermeture gracieux annulée"
+msgstr "Arrêt respectueux annulé"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325
 msgid "Graceful restart"
-msgstr "Redémarrage gracieux"
+msgstr "Redémarrage respectueux"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:67
 msgid "Graceful restart requested"
-msgstr "Redémarrage gracieux demandé"
+msgstr "Redémarrage respectueux demandé"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327
 msgid "Hard restart"
-msgstr "Redémarrage immédiate"
+msgstr "Redémarrage immédiat"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:71
 msgid "Hard restart requested"
-msgstr "Redémarrage immédiate demandé"
+msgstr "Redémarrage immédiat demandé"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:72
 msgid "Rekey and Restart"
-msgstr ""
+msgstr "Régénération de clé et redémarrage"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:73
 msgid "Rekeying after graceful restart"
-msgstr ""
+msgstr "Régénaration clé après redémarrage respecteux"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:76
 msgid "Rekey and Shutdown"
-msgstr ""
+msgstr "Régénération clé et arrêt"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:77
 msgid "Rekeying after graceful shutdown"
-msgstr ""
+msgstr "Régénération clé après arrêt respectueux"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353
 msgid "Run I2P on startup"
 msgstr "Lancer I2P au démarrage"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:336
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355
 msgid "Don't run I2P on startup"
 msgstr "Ne pas lancer I2P au démarrage"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:354
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:373
 msgid "Dump threads"
-msgstr "Dump fils d'exécution"
+msgstr "Cliché des tâches"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:322
-msgid "Show systray icon"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
-msgid "System tray icon enabled."
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110
-msgid "System tray icon feature not supported on this platform. Sorry!"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
-msgid "Warning: unable to contact the systray manager"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:324
-msgid "Hide systray icon"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108
-msgid "System tray icon disabled."
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:362
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:381
 msgid "View console on startup"
 msgstr "Montrer la console au démarrage"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93
 msgid "Console is to be shown on startup"
-msgstr ""
+msgstr "Afficher la console au démarrage"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:364
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:383
 msgid "Do not view console on startup"
 msgstr "Ne pas montrer la console au démarrage"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
 msgid "Console is not to be shown on startup"
-msgstr ""
+msgstr "Ne pas afficher la console au démarrage"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105
 msgid "Service installed"
 msgstr "Service installé"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107
 msgid "Warning: unable to install the service"
-msgstr ""
+msgstr "Avertissement: impossible d'installer le service"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
 msgid "Service removed"
-msgstr "Service enlévé"
+msgstr "Service enlevé"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
 msgid "Warning: unable to remove the service"
-msgstr ""
+msgstr "Avertissement: impossible de désinstaller le service"
 
-#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:118
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:111
 msgid "Stat filter and location updated successfully to"
-msgstr ""
+msgstr "Filtre de statistiques et emplacement mis à jour à "
 
-#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:120
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:113
 msgid "Failed to update the stat filter and location"
-msgstr ""
+msgstr "Échec de mise à jour du filtre de statistiques et emplacement"
 
-#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:121
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:114
 msgid "Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>"
-msgstr ""
+msgstr "Liste des graphiques mise à jour. Peut nécessiter jusqu'à 60s pour être répercutée ici et la <a href=\"graphs.jsp\">page des graphiques</a>."
 
 #. 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:137
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:135
 msgid "Updated settings for all pools."
-msgstr ""
+msgstr "Mise à jour des réglages pour tous les groupes."
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:140
 msgid "Exploratory tunnel configuration saved successfully."
-msgstr "Configuration du tunnel exploratoire a été sauvegardé avec succès."
+msgstr "Configuration des tunnels exploratoires sauvegardée avec succès."
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:144
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142
 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:36
 msgid "Error saving the configuration (applied but not saved) - please see the error logs."
-msgstr ""
+msgstr "Erreur pendant l'enregistrement de la configuration (appliquée mais non sauvegardée): contrôlez les historiques"
 
 #. * dummies for translation
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14
 #, java-format
 msgid "1 hop"
 msgid_plural "{0} hops"
-msgstr[0] "1 saut"
+msgstr[0] "{0} saut"
 msgstr[1] "{0} sauts"
 
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:15
 #, java-format
 msgid "1 tunnel"
 msgid_plural "{0} tunnels"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{0} tunnel"
+msgstr[1] "{0} tunnels"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
 msgid "Exploratory tunnels"
 msgstr "Tunnels exploratoires"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61
-msgid "Client tunnels for"
-msgstr "Tunnels clients pour"
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:51
+#, java-format
+msgid "Client tunnels for {0}"
+msgstr "Tunnels clients pour {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
 msgid "ANONYMITY WARNING - Settings include 0-hop tunnels."
-msgstr ""
+msgstr "AVERTISSEMENT d'ANONYMAT: les réglages incluent des tunnels à 0 saut!"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:79
 msgid "ANONYMITY WARNING - Settings include 1-hop tunnels."
-msgstr ""
+msgstr "AVERTISSEMENT d'ANONYMAT: les réglages incluent des tunnels à 1 saut!"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
 msgid "PERFORMANCE WARNING - Settings include very long tunnels."
-msgstr ""
+msgstr "AVERTISSEMENT de PERFORMANCES: les réglages incluent des tunnels très longs!"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:85
 msgid "PERFORMANCE WARNING - Settings include high tunnel quantities."
-msgstr ""
+msgstr "AVERTISSEMENT de PERFORMANCES: les réglages incluent un grand nombre de tunnels!"
 
 #. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n");
 #. tunnel depth
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:92
 msgid "Length"
-msgstr ""
+msgstr "Longueur"
 
 #. tunnel depth variance
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:109
 msgid "Randomization"
-msgstr "Randomisation"
+msgstr "Aléas"
 
 #. tunnel quantity
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:133
 msgid "Quantity"
-msgstr "Quantité"
+msgstr "Nombre"
 
 #. tunnel backup quantity
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:150
 msgid "Backup quantity"
-msgstr "'Backup' quantité"
+msgstr "Secours"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:172
 msgid "Inbound options"
 msgstr "Options Entrants"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:185
 msgid "Outbound options"
 msgstr "Options Sortants"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:31
 msgid "Theme change saved."
-msgstr "Changement de thème sauvegardé."
+msgstr "Changement de thème enregistré."
 
 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:33
 msgid "Refresh the page to view."
-msgstr ""
+msgstr "Réactualiser la page."
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+msgid "Arabic"
+msgstr "Arabe"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "English"
 msgstr "Anglais"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "French"
 msgstr "Français"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "German"
 msgstr "Allemand"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "Spanish"
 msgstr "Espagnol"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
-msgid "Chinese"
-msgstr "Chinois"
-
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Dutch"
 msgstr "Néerlandais"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+msgid "Portuguese"
+msgstr "Portugais"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Russian"
 msgstr "Russe"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
+msgid "Chinese"
+msgstr "Chinois"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
 msgid "Swedish"
 msgstr "Suédois"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:88
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:87
 msgid "Update available, attempting to download now"
-msgstr "Mise à jour disponible, en tentant de la télécharger actuellement"
+msgstr "Mise à jour disponible, essai de téléchargement en cours"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:90
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:89
 msgid "Update available, click button on left to download"
-msgstr "Mise à jour disponible, cliquez sur le bouton sur la 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:96
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:95
 msgid "No update available"
 msgstr "Pas de mise à jour disponible"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:104
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:103
 msgid "Updating news URL to"
-msgstr ""
+msgstr "Mise à jour de l'URL de news vers "
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:111
 msgid "Updating proxy host to"
-msgstr ""
+msgstr "Mise à jour de l'hôte mandataire vers"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:120
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:119
 msgid "Updating proxy port to"
-msgstr ""
+msgstr "Mise à jour du port mandataire vers"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:133
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:132
 msgid "Updating refresh frequency to"
-msgstr ""
+msgstr "Mise à jour de la fréquence de rafraîchissement vers"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:140
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:139
 msgid "Updating update policy to"
-msgstr ""
+msgstr "Mise à jour de la stratégie de mises à jour vers"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:149
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:148
 msgid "Updating update URLs."
-msgstr ""
+msgstr "Mise à jour de l'URL de mises à jour."
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:158
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:157
 msgid "Updating trusted keys."
-msgstr ""
+msgstr "Mise à jour des clefs de confiance."
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:166
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:165
 msgid "Updating unsigned update URL to"
-msgstr ""
+msgstr "Mise à jour de l'URL de mises à jour non signées vers"
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
+#: ../java/src/net/i2p/router/web/GraphHelper.java:167
 msgid "Never"
 msgstr "Jamais"
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:90
 msgid "Every"
-msgstr "Chaque"
+msgstr "Tou(te)s les"
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:108
 msgid "Notify only"
@@ -2428,87 +2539,79 @@ msgstr "Télécharger et vérifier seulement"
 msgid "Download, verify, and restart"
 msgstr "Télécharger, vérifier et redémarrer"
 
-#: ../java/src/net/i2p/router/web/FormHandler.java:163
+#: ../java/src/net/i2p/router/web/FormHandler.java:176
 msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."
-msgstr ""
+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/GraphHelper.java:82
+#: ../java/src/net/i2p/router/web/GraphHelper.java:93
 msgid "Combined bandwidth graph"
-msgstr ""
+msgstr "Graphique combiné de bandes passantes"
 
 #. e.g. "statname for 60m"
-#: ../java/src/net/i2p/router/web/GraphHelper.java:96
+#: ../java/src/net/i2p/router/web/GraphHelper.java:107
 #, java-format
 msgid "{0} for {1}"
-msgstr ""
+msgstr "{0} pour {1}"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:130
+#: ../java/src/net/i2p/router/web/GraphHelper.java:146
 msgid "Configure Graph Display"
-msgstr "Graphe affichage configuration"
+msgstr "Paramètres d'affichage des graphiques"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:130
+#: ../java/src/net/i2p/router/web/GraphHelper.java:146
 msgid "Select Stats"
-msgstr ""
+msgstr "Choix des statistiques"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:132
+#: ../java/src/net/i2p/router/web/GraphHelper.java:150
 msgid "Periods"
-msgstr "Périodes"
+msgstr "Plage (mn)"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:133
+#: ../java/src/net/i2p/router/web/GraphHelper.java:151
 msgid "Plot averages"
 msgstr "Tracer les moyennes"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:134
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:416
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:332
+#: ../java/src/net/i2p/router/web/GraphHelper.java:152
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:351
 msgid "or"
 msgstr "ou"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:134
+#: ../java/src/net/i2p/router/web/GraphHelper.java:152
 msgid "plot events"
-msgstr "tracer les événements"
+msgstr "les événements"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:135
+#: ../java/src/net/i2p/router/web/GraphHelper.java:153
 msgid "Image sizes"
 msgstr "Taille des images"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:135
+#: ../java/src/net/i2p/router/web/GraphHelper.java:153
 msgid "width"
 msgstr "largeur"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:136
+#: ../java/src/net/i2p/router/web/GraphHelper.java:154
 msgid "height"
 msgstr "hauteur"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:136
-#: ../java/src/net/i2p/router/web/GraphHelper.java:137
+#: ../java/src/net/i2p/router/web/GraphHelper.java:154
+#: ../java/src/net/i2p/router/web/GraphHelper.java:155
 msgid "pixels"
 msgstr "pixels"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
+#: ../java/src/net/i2p/router/web/GraphHelper.java:156
 msgid "Refresh delay"
-msgstr "Delai d'actualisation"
-
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
-msgid "hour"
-msgstr "heure"
-
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
-msgid "minute"
-msgstr ""
-
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
-msgid "minutes"
-msgstr "minutes"
+msgstr "Actualiser toutes les"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:139
+#: ../java/src/net/i2p/router/web/GraphHelper.java:171
 msgid "Redraw"
-msgstr ""
+msgstr "Rafraîchir"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:203
+msgid "Graph settings saved"
+msgstr "Réglages des graphiques enregistrés"
 
 #: ../java/src/net/i2p/router/web/LogsHelper.java:13
 #: ../java/src/net/i2p/router/web/LogsHelper.java:37
 msgid "File location"
-msgstr ""
+msgstr "Emplacement du fichier"
 
 #: ../java/src/net/i2p/router/web/LogsHelper.java:34
 msgid "File not found"
@@ -2516,78 +2619,77 @@ msgstr "Fichier pas trouvé"
 
 #: ../java/src/net/i2p/router/web/LogsHelper.java:52
 msgid "No log messages"
-msgstr ""
+msgstr "Historique vide"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:80
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:79
 msgid "Network Database RouterInfo Lookup"
-msgstr ""
+msgstr "Recherche RouterInfo dans la base de données du réseau "
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94
 #: ../java/strings/Strings.java:68
 msgid "Router"
 msgstr "Routeur"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94
 msgid "not found in network database"
-msgstr ""
+msgstr "non trouvé dans la NetDb"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:106
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:215
 msgid "Network Database Contents"
-msgstr ""
+msgstr "Contenus NetDb"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107
 msgid "View RouterInfo"
-msgstr ""
+msgstr "Retour synthèse routeurs"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:109
-#, fuzzy
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108
 msgid "LeaseSets"
-msgstr "Bail"
+msgstr "Jeux de baux"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:131
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:130
 msgid "LeaseSet"
-msgstr ""
+msgstr "Jeu de baux"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:133
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:132
 msgid "Local"
-msgstr "Locale"
+msgstr "Local"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:134
 msgid "Unpublished"
 msgstr "Pas publié"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:136
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:143
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:142
 msgid "Destination"
-msgstr ""
+msgstr "Destination"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:153
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:152
 #, java-format
 msgid "Expires in {0}"
-msgstr "Expirera en {0}"
+msgstr "Expirera dans {0}"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:155
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:154
 #, java-format
 msgid "Expired {0} ago"
 msgstr "Périmé il y a {0}"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "Gateway"
-msgstr ""
+msgstr "Passerelle"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166
 msgid "Lease"
 msgstr "Bail"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:169
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:168
 msgid "Tunnel"
-msgstr ""
+msgstr "Tunnel"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:215
 msgid "View LeaseSets"
-msgstr ""
+msgstr "Afficher les jeux de baux"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:217
 msgid "Not initialized"
@@ -2595,109 +2697,106 @@ msgstr "Pas initialisé"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:226
 msgid "Routers"
-msgstr "Routeurs"
+msgstr "Synthèse routeurs"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:228
-#, fuzzy
 msgid "Show all routers"
-msgstr "Fermer le routeur"
+msgstr "Afficher tous, avec statistiques basiques"
 
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:230
 msgid "Show all routers with full stats"
-msgstr ""
+msgstr "Afficher tous, avec statistiques complètes"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265
-#, fuzzy
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266
 msgid "Network Database Router Statistics"
-msgstr "Statistiques du routeur I2P"
+msgstr "Statistiques NetDb du routeur "
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
 msgid "Count"
-msgstr ""
+msgstr "Nombre"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
 msgid "Transports"
-msgstr ""
+msgstr "Transports"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
 msgid "Country"
 msgstr "Pays"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
 msgid "Our info"
-msgstr "Notre info"
+msgstr "Ce routeur"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346
 msgid "Peer info for"
-msgstr "Mise à jour en cours"
+msgstr "Informations pair"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350
 msgid "Full entry"
-msgstr ""
+msgstr "Détails"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:110
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:600
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:115
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
 msgid "Hidden"
 msgstr "Caché"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
 msgid "Updated"
-msgstr "Mise à jour fini"
+msgstr "Mise à jour terminée"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:355
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358
-#, fuzzy, java-format
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360
+#, java-format
 msgid "{0} ago"
-msgstr "Périmé il y a {0}"
+msgstr "il y a {0}"
 
 #. shouldnt happen
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
 msgid "Published"
 msgstr "Publié il y a"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365
 msgid "Address(es)"
 msgstr "Adresse(s)"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378
 msgid "cost"
-msgstr ""
+msgstr "coût"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
-#, fuzzy
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "Hidden or starting up"
-msgstr "Lancer avec le démarrage du routeur"
+msgstr "Masqué ou en cours de démarrage"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "SSU"
-msgstr ""
+msgstr "SSU"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "SSU with introducers"
-msgstr ""
+msgstr "SSU avec représentants"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP"
-msgstr ""
+msgstr "NTCP"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP and SSU"
-msgstr ""
+msgstr "NTCP et SSU"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP and SSU with introducers"
-msgstr ""
+msgstr "NTCP et SSU avec représentants"
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:82
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:92
 #, java-format
 msgid "News last updated {0} ago."
 msgstr "Actualités mises à jour il y a {0}"
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:88
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:98
 #, java-format
 msgid "News last checked {0} ago."
 msgstr "Actualités vérifiés il y a {0}"
@@ -2705,163 +2804,162 @@ msgstr "Actualités vérifiés il y a {0}"
 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:77
 #, java-format
 msgid "Cannot check, plugin {0} is not installed"
-msgstr ""
+msgstr "Non vérifiable, le greffon {0} n''est pas installé"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:129
-#, fuzzy, java-format
+#, java-format
 msgid "Checking for update of plugin {0}"
-msgstr "Chercher des mises à jour"
+msgstr "Recherche de mise à jour du greffon {0}"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:154
 #, java-format
 msgid "New plugin version {0} is available"
-msgstr ""
+msgstr "La nouvelle version {0} du greffon est disponible"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:156
 #, java-format
 msgid "No new version is available for plugin {0}"
-msgstr ""
+msgstr "Pas de nouvelle version pour le greffon {0}"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:165
 #, java-format
 msgid "Update check failed for plugin {0}"
-msgstr ""
+msgstr "Échec de la vérification de mise à jour du greffon {0}"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:139
-#, fuzzy
 msgid "Downloading plugin"
-msgstr "Télécharger pas signé"
+msgstr "Téléchargement greffon en cours"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:185
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:245
 #, java-format
 msgid "{0}B transferred"
-msgstr ""
+msgstr "{0}o transférés"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:152
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153
 msgid "Plugin downloaded"
-msgstr ""
+msgstr "Greffon téléchargé"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:157
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:344
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356
 #, java-format
 msgid "Cannot create plugin directory {0}"
-msgstr ""
+msgstr "Impossible de créer le répertoire du greffon {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:166
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:226
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:299
 #, java-format
 msgid "from {0}"
-msgstr ""
+msgstr "depuis {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:176
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177
 #, java-format
 msgid "Plugin from {0} is corrupt"
-msgstr ""
+msgstr "Le greffon de {0} est corrompu"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:187
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188
 #, java-format
 msgid "Plugin from {0} does not contain the required configuration file"
-msgstr ""
+msgstr "Le greffon de {0} ne contient pas le fichier de configuration requis"
 
 #. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:200
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201
 #, java-format
 msgid "Plugin from {0} contains an invalid key"
-msgstr ""
+msgstr "Le greffon de {0} contient une clef incorrecte."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:219
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:228
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:237
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249
 #, java-format
 msgid "Plugin signature verification of {0} failed"
-msgstr ""
+msgstr "Échec de vérification de signature du greffon {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:252
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264
 #, java-format
 msgid "Plugin from {0} has invalid name or version"
-msgstr ""
+msgstr "La version ou le nom du greffon de  {0} est incorrect."
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:257
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269
 #, java-format
 msgid "Plugin {0} has mismatched versions"
-msgstr ""
+msgstr "Versions désapairées du greffon {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:265
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277
 #, java-format
 msgid "This plugin requires I2P version {0} or higher"
-msgstr ""
+msgstr "Ce greffon nécessite I2P version {0} ou plus récente"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:273
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285
 #, java-format
 msgid "This plugin requires Java version {0} or higher"
-msgstr ""
+msgstr "Ce greffon nécessite Java version {0} ou plus récente"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:281
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
 msgid "Downloaded plugin is for new installs only, but the plugin is already installed"
-msgstr ""
+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/web/PluginUpdateHandler.java:293
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305
 msgid "Installed plugin does not contain the required configuration file"
-msgstr ""
+msgstr "Le greffon installé ne contient pas le fichier de configuration requis"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:301
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313
 msgid "Signature of downloaded plugin does not match installed plugin"
-msgstr ""
+msgstr "La signature du greffon téléchargé ne correspond pas à celle de celui qui est installé"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:308
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320
 #, java-format
 msgid "Downloaded plugin version {0} is not newer than installed plugin"
-msgstr ""
+msgstr "La version {0} du greffon téléchargé n''est pas plus récente que celle installée"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:315
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or higher"
-msgstr ""
+msgstr "La mise à jour du greffon nécessite au moins la version {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:322
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or lower"
-msgstr ""
+msgstr "La mise à jour du greffon nécessite au plus la version {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:339
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351
 msgid "Plugin is for upgrades only, but the plugin is not installed"
-msgstr ""
+msgstr "Ce greffon est seulement une mise à jour, mais le greffon prérequis n'est pas installé"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:352
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364
 #, java-format
 msgid "Failed to install plugin in {0}"
-msgstr ""
+msgstr "Échec d''installation du greffon {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:359
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371
 #, java-format
 msgid "Plugin {0} installed, router restart required"
-msgstr ""
+msgstr "Greffon {0} installé, le routeur doit être redémarré"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:361
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373
 #, java-format
 msgid "Plugin {0} installed"
-msgstr ""
+msgstr "Greffon {0} installé"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:370
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391
 #, java-format
 msgid "Plugin {0} installed and started"
-msgstr ""
+msgstr "Greffon {0} installé et démarré"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:372
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394
 #, java-format
 msgid "Plugin {0} installed but failed to start, check logs"
-msgstr ""
+msgstr "Greffon {0} installé, mais son démarrage a échoué. Vérifiez les historiques"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:374
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396
 #, java-format
 msgid "Plugin {0} installed but failed to start"
-msgstr ""
+msgstr "Greffon {0} installé, mais son démarrage a échoué"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:384
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406
 #, java-format
 msgid "Failed to download plugin from {0}"
-msgstr ""
+msgstr "Échec de téléchargement du greffon {0}"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:72
 msgid "Peer Profiles"
@@ -2869,44 +2967,46 @@ msgstr "Profils des pairs"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73
 #, java-format
-msgid "Showing {0} recent profiles."
-msgstr "Montrant {0} profiles récents"
+msgid "Showing 1 recent profile."
+msgid_plural "Showing {0} recent profiles."
+msgstr[0] "Affichage d'un profil récent."
+msgstr[1] "Affichage de {0} profils récents."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75
 #, java-format
-msgid "Hiding {0} older profiles."
-msgstr "Cachant {0} profiles anciens"
+msgid "Hiding 1 older profile."
+msgid_plural "Hiding {0} older profiles."
+msgstr[0] "Masquage d'un très vieux profil."
+msgstr[1] "Masquage de {0} très vieux profils."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77
-#, fuzzy, java-format
-msgid "Hiding {0} standard profiles."
-msgstr "Cachant {0} profiles anciens"
+#, java-format
+msgid "Hiding 1 standard profile."
+msgid_plural "Hiding {0} standard profiles."
+msgstr[0] "Masquage d'un profil standard."
+msgstr[1] "Masquage de {0} profils standards."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82
 msgid "Groups (Caps)"
-msgstr ""
+msgstr "Groupes (capacités)"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:334
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:353
 msgid "Speed"
 msgstr "Vitesse"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:338
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:357
 msgid "Capacity"
 msgstr "Capacité"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
 msgid "Integration"
 msgstr "Intégration"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:86
-msgid "Status"
-msgstr "Statut actuel"
-
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:126
 msgid "Fast, High Capacity"
 msgstr "Rapide, haute capacité"
@@ -2917,7 +3017,7 @@ msgstr "Haute capacité"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:128
 msgid "Standard"
-msgstr ""
+msgstr "Standard"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:129
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:163
@@ -2927,7 +3027,7 @@ msgstr "Défaillant"
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282
 msgid "Integrated"
-msgstr "Intégré"
+msgstr "Bien intégrés"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:164
 msgid "Unreachable"
@@ -2936,238 +3036,228 @@ msgstr "Inaccessible"
 #. hide if < 10%
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171
 msgid "Test Fails"
-msgstr "Test échec"
+msgstr "Échec de test"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175
-#, fuzzy
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177
 msgid "profile"
-msgstr "Profiles"
+msgstr "Profil"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186
 msgid "Floodfill and Integrated Peers"
-msgstr "Floodfill et pairs intégrés"
+msgstr "Pairs diffuseurs et intégrés"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188
-#, fuzzy
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
 msgid "Caps"
-msgstr "graphes"
+msgstr "Possib."
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
-#, fuzzy
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
 msgid "Integ. Value"
-msgstr "Intégré"
+msgstr "Valeur intég."
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
 msgid "Last Heard About"
-msgstr ""
+msgstr "Signalé la dernière fois"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
 msgid "Last Heard From"
-msgstr ""
+msgstr "Entendu depuis"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
 msgid "Last Good Send"
-msgstr ""
+msgstr "Dernier envoi OK"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
 msgid "Last Bad Send"
-msgstr ""
+msgstr "Dernier envoi KO"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
 msgid "10m Resp. Time"
-msgstr ""
+msgstr "Tps de rép.(10mn)"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
 msgid "1h Resp. Time"
-msgstr ""
+msgstr "Tps de rép. (1h)"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
 msgid "1d Resp. Time"
-msgstr ""
+msgstr "Tps de rép.(1j)"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
 msgid "Last Good Lookup"
-msgstr ""
+msgstr "Dernière req. OK"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
 msgid "Last Bad Lookup"
-msgstr ""
+msgstr "Dernière req. KO"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
 msgid "Last Good Store"
-msgstr ""
+msgstr "Dernier stk.OK"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
 msgid "Last Bad Store"
-msgstr ""
+msgstr "Dernier stk.KO"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203
 msgid "1h Fail Rate"
-msgstr ""
+msgstr "Taux d'échec (1h)"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204
 msgid "1d Fail Rate"
-msgstr ""
+msgstr "Taux d'échec (1j)"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250
-#, fuzzy
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
 msgid "Thresholds"
-msgstr "Seuils :"
+msgstr "Seuils"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
-#, fuzzy
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
 msgid "fast peers"
-msgstr "Configuration des pairs"
+msgstr "pairs rapides"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
-#, fuzzy
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
 msgid "high capacity peers"
-msgstr "Haute capacité"
+msgstr "pairs à haute capacités"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
-#, fuzzy
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
 msgid " well integrated peers"
-msgstr "Floodfill et pairs intégrés"
+msgstr "pairs bien intégrés"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
 msgid "as determined by the profile organizer"
-msgstr ""
+msgstr "tels que définis par le  gestionnaire de profils"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
 msgid "groups"
-msgstr "groupes"
+msgstr "Groupes"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
 msgid "capabilities in the netDb, not used to determine profiles"
-msgstr ""
+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:259
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
 #: ../java/strings/Strings.java:81
 msgid "caps"
-msgstr ""
+msgstr "Possib."
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
 msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel"
-msgstr ""
+msgstr "débit crête (o/s) tenu sur 1mn par le pair sur un seul tunnel"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
 msgid "speed"
-msgstr "vitesse"
+msgstr "Vitesse"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
 msgid "capacity"
-msgstr "capacité"
+msgstr "Capacité"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
 msgid "how many tunnels can we ask them to join in an hour?"
-msgstr ""
+msgstr "combien de tunnels nous pouvons lui demander de rejoindre en une heure."
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
 msgid "how many new peers have they told us about lately?"
-msgstr ""
+msgstr "sur combien de nouveaux pairs il nous a renseigné récemment."
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
 msgid "integration"
-msgstr "intégration"
+msgstr "Intégration"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
 msgid "is the peer banned, or unreachable, or failing tunnel tests?"
-msgstr ""
+msgstr "Le pair banni, injoignable ou les tests de tunnels échouent."
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
 msgid "status"
-msgstr "statut"
+msgstr "État"
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:410
+msgid "none"
+msgstr "aucun"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:62
 #, java-format
 msgid "Temporary ban expiring in {0}"
-msgstr ""
+msgstr "Le bannissement temporaire expire dans {0}"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59
-#, fuzzy, java-format
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64
+#, java-format
 msgid "Banned until restart or in {0}"
-msgstr "interdit jusqu'au rédémarrage"
+msgstr "Banni jusqu''au redémarrage ou dans {0}"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71
-#, fuzzy
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:76
 msgid "unban now"
-msgstr "plus interdit"
+msgstr "lever le bannissement"
 
 #. Note to translators: all runtime zh translation disabled in this file, no font available in RRD
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:174
-#, fuzzy
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:223
 msgid "Bandwidth usage"
-msgstr "Bande passante entrante/sortante"
+msgstr "Utilisation de la bande passante"
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:181
-#, fuzzy
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:230
 msgid "Outbound bytes/sec"
-msgstr "Options Sortants"
+msgstr "o/s sortants"
 
 #. def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3);
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:183
-#, fuzzy
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:232
 msgid "Inbound bytes/sec"
-msgstr "Options Entrants"
+msgstr "o/s entrants"
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:186
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:187
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:188
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:189
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:235
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:236
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:237
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:238
 msgid "bytes/sec"
-msgstr ""
+msgstr "o/s"
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:186
-#, fuzzy
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:235
 msgid "out average"
-msgstr "Tracer les moyennes"
+msgstr "hors moyenne"
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:187
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:189
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:236
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:238
 #: ../java/src/net/i2p/router/web/SummaryRenderer.java:115
 msgid "max"
-msgstr ""
+msgstr "max"
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:188
-#, fuzzy
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:237
 msgid "in average"
-msgstr "Tracer les moyennes"
+msgstr "dans la moyenne"
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:57
 msgid "GO"
-msgstr ""
+msgstr "Lancer"
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:60
 msgid "Statistics gathered during this router's uptime"
-msgstr ""
+msgstr "Statistiques collectées pendant cette session du routeur"
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:63
 msgid "The data gathered is quantized over a 1 minute period, so should just be used as an estimate."
-msgstr ""
+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 ""
+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
-#, fuzzy
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:106
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:157
 msgid "No lifetime events"
-msgstr "tracer les événements"
+msgstr "Aucun évènement de durée de vie"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:116
-#, fuzzy
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:117
 msgid "frequency"
-msgstr "Fréquence d'actualisation"
+msgstr "fréquence"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:120
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:121
 msgid "Rolling average events per period"
-msgstr ""
+msgstr "Moyenne glissante d'évènements par période"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:124
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:125
 msgid "Highest events per period"
-msgstr ""
+msgstr "Maximum d'évènements par période"
 
 #. if (showAll && (curFreq.getMaxAverageEventsPerPeriod() > 0) && (curFreq.getAverageEventsPerPeriod() > 0) ) {
 #. buf.append("(current is ");
@@ -3176,79 +3266,87 @@ msgstr ""
 #. }
 #. 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
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:136
 msgid "Lifetime average events per period"
-msgstr ""
+msgstr "évènements de moyenne de durée de vie par période"
 
 #. Display the strict average
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:140
-#, fuzzy
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:141
 msgid "Lifetime average frequency"
-msgstr "Fréquence d'actualisation"
+msgstr "Fréquence moyenne de durée de vie"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:144
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:234
+#, java-format
+msgid "1 event"
+msgid_plural "{0} events"
+msgstr[0] "1 évènement"
+msgstr[1] "{0} évènements"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:168
-#, fuzzy
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:169
 msgid "rate"
-msgstr "Taux"
+msgstr "taux"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:170
-#, fuzzy
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:171
 msgid "Average"
-msgstr "Tracer les moyennes"
+msgstr "moyenne"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:173
-#, fuzzy
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:174
 msgid "Highest average"
-msgstr "Tracer les moyennes"
+msgstr "Plus haute moyenne"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:202
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:201
 #, java-format
-msgid "in this period which ended {0} ago."
-msgstr ""
+msgid "There was 1 event in this period."
+msgid_plural "There were {0} events in this period."
+msgstr[0] "Il y a eu 1 évènement sur cette période."
+msgstr[1] "Il y a eu {0} évènements sur cette période."
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:204
-#, fuzzy
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:203
+#, java-format
+msgid "The period ended {0} ago."
+msgstr "La période s''est terminée il y a {0}."
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:205
 msgid "No events"
-msgstr "tracer les événements"
+msgstr "Aucun évènement"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:210
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:211
 msgid "Average event count"
-msgstr ""
+msgstr "Nombre moyen d'évènements"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:212
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:213
 msgid "Events in peak period"
-msgstr ""
+msgstr "Pic d'évènements dans la période"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:220
-#, fuzzy
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:221
 msgid "Graph Data"
-msgstr "Graphe"
+msgstr "Graphique de données"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:222
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:223
 msgid "Graph Event Count"
-msgstr ""
+msgstr "Nombre d'évènements de graphiques"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:225
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:226
 msgid "Export Data as XML"
-msgstr ""
+msgstr "Exporter en XML"
 
 #. Display the strict average
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:230
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:231
 msgid "Lifetime average value"
-msgstr ""
+msgstr "Durée de vie moyenne"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:41
-#, fuzzy
 msgid "I2P Router Help &amp; FAQ"
-msgstr "Aide routeur I2P"
+msgstr "Aide routeur I2P &amp; FAQ"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:43
 msgid "Help &amp; FAQ"
-msgstr ""
+msgstr "Aide &amp; FAQ"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:55
 msgid "Configure startup of clients and webapps (services); manually start dormant services"
-msgstr ""
+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:57
 msgid "I2P Services"
@@ -3256,7 +3354,7 @@ msgstr "Services I2P"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:63
 msgid "Manage your I2P hosts file here (I2P domain name resolution)"
-msgstr "Gérer votre fichier 'I2P hosts' ici (I2P DNS)"
+msgstr "Gérer votre fichier d'hôtes I2P ici (I2P DNS)"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:65
 msgid "Addressbook"
@@ -3276,7 +3374,7 @@ msgstr "Client webmail anonyme"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:77
 msgid "Webmail"
-msgstr "messagerie Web"
+msgstr "Messagerie web"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:81
 msgid "Anonymous resident webserver"
@@ -3297,40 +3395,40 @@ msgstr "Configuration"
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379
 msgid "View existing tunnels and tunnel build status"
-msgstr "Montrer les tunnels existants et le statut de création des tunnels"
+msgstr "État des tunnels existants et de la création de tunnels"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:254
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253
 msgid "Show all current peer connections"
-msgstr "Montrer toutes les connexions actuelles aux pairs"
+msgstr "Afficher toutes les connexions actuelles aux pairs"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:111
 msgid "Show recent peer performance profiles"
-msgstr "Montrer les profils de la performance récente des pairs"
+msgstr "Afficher les profils de la performance récente des pairs"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:113
 msgid "Profiles"
-msgstr "Profiles"
+msgstr "Profils"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:117
 msgid "Show list of all known I2P routers"
-msgstr "Montrer une liste de touts le routeurs I2P connus"
+msgstr "Afficher tous les routeurs I2P connus"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:119
 msgid "NetDB"
-msgstr ""
+msgstr "NetDb"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123
 msgid "Health Report"
-msgstr "Fichier traces du routeur"
+msgstr "Bilan de santé"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:125
 msgid "Logs"
-msgstr "Fichier traces"
+msgstr "Historiques"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:135
 msgid "Graph router performance"
-msgstr "Montrer la performance du routeur avec des graphes"
+msgstr "Graphique de performances du routeur"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:137
 msgid "Graphs"
@@ -3338,82 +3436,87 @@ msgstr "Graphes"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141
 msgid "Textual router performance statistics"
-msgstr "La performance statistique du routeur en texte"
+msgstr "Statistiques textuelles de performance du routeur"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:365
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:370
 msgid "Local Destinations"
 msgstr "Destinations locales"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149
 #: ../java/strings/Strings.java:62
-#, fuzzy
 msgid "I2PTunnel"
-msgstr "tunnel sommaire I2P"
+msgstr "I2PTunnel"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:160
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164
 msgid "I2P Router Help"
-msgstr "Aide routeur I2P"
+msgstr "Aide du routeur I2P"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:162
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166
 msgid "General"
 msgstr "Général"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:167
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171
 msgid "Local Identity"
 msgstr "Identité locale"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:175
 msgid "Your unique I2P router identity is"
-msgstr "L'identité unique de votre routeur est"
+msgstr "L'identité unique de votre routeur commence par"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:175
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:179
 msgid "never reveal it to anyone"
-msgstr "ne jamais la révéler à personne"
+msgstr "NE la révélez JAMAIS à PERSONNE ! (Cliquez pour l'afficher)"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:177
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:181
 msgid "show"
-msgstr ""
+msgstr "Détails"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:188
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:192
 msgid "How long we've been running for this session"
-msgstr ""
+msgstr "Durée de cette session"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:191
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:195
 msgid "Uptime"
-msgstr "Temps de service"
+msgstr "Lancé depuis"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:198
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202
 msgid "Help with configuring your firewall and router for optimal I2P performance"
-msgstr "Aide avec la configuration du pare-feu et du routeur afin d'optimiser la performance 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:227
-msgid "Download"
-msgstr "Télécharger"
+#. Note to translators: parameter is a version, e.g. "0.8.4"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:232
+#, java-format
+msgid "Download {0} Update"
+msgstr "Télécharger la version {0}"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:236
-msgid "Download Unsigned"
-msgstr "Télécharger pas signé"
+#. Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC"
+#. <br> is optional, to help the browser make the lines even in the button
+#. If the translation is shorter than the English, you should probably not include <br>
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240
+#, java-format
+msgid "Download Unsigned<br>Update {0}"
+msgstr "Télécharger la version<br> non signée {0}"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:262
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261
 msgid "Active"
-msgstr "Actif"
+msgstr "Actifs"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270
 msgid "Fast"
-msgstr "Rapide"
+msgstr "Rapides"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276
 msgid "High capacity"
-msgstr "Haute capacité"
+msgstr "Hautes capacités"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288
 msgid "Known"
-msgstr "Connu"
+msgstr "Connus"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303
 msgid "Help with firewall configuration"
-msgstr "Aide avec la configuration du pare-feu"
+msgstr "Aide à la configuration du pare-feu"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:305
 msgid "Check NAT/firewall"
@@ -3421,7 +3524,7 @@ msgstr "Vérifier NAT/pare-feu"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:325
 msgid "Reseed"
-msgstr ""
+msgstr "Réamorçage"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:342
 msgid "Configure router bandwidth allocation"
@@ -3441,196 +3544,189 @@ msgstr "Utilisée"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386
 msgid "Exploratory"
-msgstr "Exploratoire"
+msgstr "Exploratoires"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398
 msgid "Participating"
-msgstr "Participant"
+msgstr "Participants"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404
-#, fuzzy
 msgid "Share ratio"
-msgstr "Partager"
+msgstr "Rapport de partage"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:410
 msgid "What's in the router's job queue?"
-msgstr "Montrer les tâches du routeur qui sont à traiter "
+msgstr "Afficher la file d'attente de travaux du routeur. "
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412
 msgid "Congestion"
-msgstr "Saturation réseau"
+msgstr "Charge"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417
 msgid "Job lag"
-msgstr "Tâche décalage"
+msgstr "Retard de tâches"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:423
 msgid "Message delay"
-msgstr "Message retard"
+msgstr "Retard de messages"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:429
 msgid "Tunnel lag"
-msgstr "Tunnel décalage"
+msgstr "Retard de tunnels"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435
 msgid "Backlog"
-msgstr "Retard accumulé"
+msgstr "En attente"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:101
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:106
 msgid "ERR-Client Manager I2CP Error - check logs"
-msgstr ""
+msgstr "ERR-Erreur du gestionnaire de clients I2CP - vérifier l'historique"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:108
-#, fuzzy, java-format
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:113
+#, java-format
 msgid "ERR-Clock Skew of {0}"
-msgstr "ERR - horloge décalé"
+msgstr "ERR - horloge décalée de {0}"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:117
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:576
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:122
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
 msgid "OK"
 msgstr "OK"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:118
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:123
 msgid "ERR-Private TCP Address"
 msgstr "ERR - Adresse TCP privée"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:120
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:125
 msgid "ERR-SymmetricNAT"
 msgstr "ERR - NAT symétrique"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:123
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:128
 msgid "WARN-Firewalled with Inbound TCP Enabled"
 msgstr "WARN - pare-feu avec TCP entrant activé"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:125
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:130
 msgid "WARN-Firewalled and Floodfill"
-msgstr "WARN - Pare-feu et Floodfill"
+msgstr "WARN - Pare-feu et Diffuseur"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:127
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:132
 msgid "WARN-Firewalled and Fast"
 msgstr "WARN - Pare-feu et Rapide"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:128
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:580
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:133
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
 msgid "Firewalled"
 msgstr "Bloqué par un pare-feu"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:130
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:135
 msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
-msgstr ""
+msgstr "ERR-port UDP en cours d'utilisation - Réglez i2np.udp.internalPort=xxxx dans la configuration avancée et redémarrez"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:136
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:141
 msgid "ERR-No Active Peers, Check Network Connection and Firewall"
-msgstr ""
+msgstr "ERR-Pas de pair actif, vérifiez votre connexion réseau et votre pare-feu"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:139
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:144
 msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
-msgstr ""
+msgstr "ERR-UDP désactivé, mais port/hôte entrants TCP non renseignés"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:141
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:146
 msgid "WARN-Firewalled with UDP Disabled"
 msgstr "WARN - Pare-feu avec UDP desactivé"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:143
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:596
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
 msgid "Testing"
 msgstr "Test en cours"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:365
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:370
 msgid "Add/remove/edit &amp; control your client and server tunnels"
-msgstr "Ajouter/enlever/éditer &amp; contrôler vos tunnels client et serveur"
+msgstr "Ajoutez, modifiez/supprimez &amp; contrôlez vos tunnels clients et serveurs"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:377
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:382
 msgid "Server"
 msgstr "Serveur"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:381
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:386
 msgid "Show tunnels"
 msgstr "Montrer les tunnels"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:392
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:397
 msgid "Leases expired"
 msgstr "Bails périmés"
 
 #. red or yellow light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:392
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:393
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:397
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:398
 msgid "Rebuilding"
-msgstr ""
+msgstr "Reconstruction"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:393
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:398
 msgid "ago"
 msgstr "il y a"
 
 #. green light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:396
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:401
 msgid "Ready"
 msgstr "Prêt"
 
 #. yellow light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:400
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
 msgid "Building"
-msgstr ""
+msgstr "Construction"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:400
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
 msgid "Building tunnels"
 msgstr "Création des tunnels en cours"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
-#, fuzzy
-msgid "none"
-msgstr "Connu"
-
 #. tunnel nicknames, taken from i2ptunnel.config so they will display
 #. nicely under 'local destinations' in the summary bar
 #. note that if the wording changes in i2ptunnel.config, we have to
 #. keep the old string here as well for existing installs
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:416
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:421
 #: ../java/strings/Strings.java:36
 msgid "shared clients"
 msgstr "clients partagés"
 
 #. Note to translators: all runtime zh translation disabled in this file, no font available in RRD
 #: ../java/src/net/i2p/router/web/SummaryRenderer.java:89
-#, fuzzy, java-format
+#, java-format
 msgid "events in {0}"
-msgstr "Redémarrage en {0}"
+msgstr "Évènements en {0}"
 
 #: ../java/src/net/i2p/router/web/SummaryRenderer.java:91
 #, java-format
 msgid "averaged for {0}"
-msgstr ""
+msgstr "moyenne pour {0}"
 
 #: ../java/src/net/i2p/router/web/SummaryRenderer.java:101
-#, fuzzy
 msgid "Events per period"
-msgstr "bits par seconde"
+msgstr "Fréquence"
 
 #: ../java/src/net/i2p/router/web/SummaryRenderer.java:114
-#, fuzzy
 msgid "avg"
-msgstr ":"
+msgstr "moy"
 
 #: ../java/src/net/i2p/router/web/SummaryRenderer.java:116
-#, fuzzy
 msgid "now"
-msgstr "Connu"
+msgstr "maintenant"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:63
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:280
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:309
 msgid "configure"
 msgstr "configuration"
 
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61
+msgid "Client tunnels for"
+msgstr "Tunnels clients pour"
+
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:65
-#, fuzzy
 msgid "dead"
-msgstr "Prêt"
+msgstr "Morts"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:71
 msgid "Participating tunnels"
-msgstr "tunnels participants"
+msgstr "Tunnels participants"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:72
 msgid "From"
@@ -3638,7 +3734,7 @@ msgstr "De"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:72
 msgid "Receive on"
-msgstr "Réception active"
+msgstr "Reçoit sur"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
 msgid "Expiration"
@@ -3646,11 +3742,11 @@ msgstr "Expiration"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
 msgid "Send on"
-msgstr "Envoyer activé"
+msgstr "Envoie sur"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
 msgid "To"
-msgstr "à"
+msgstr "Vers"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:74
 msgid "Rate"
@@ -3667,15 +3763,15 @@ msgstr "Utilisation"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:107
 msgid "grace period"
-msgstr ""
+msgstr "délai de grâce"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:117
 msgid "Outbound Endpoint"
-msgstr "Endpoint Sortant"
+msgstr "Point terminal sortant"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:119
 msgid "Inbound Gateway"
-msgstr "Gateway Entrant"
+msgstr "Passerelle entrante"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:121
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:162
@@ -3684,12 +3780,12 @@ msgstr "Participant"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:126
 msgid "Inactive participating tunnels"
-msgstr ""
+msgstr "Tunnels participants inactifs"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:127
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:218
 msgid "Lifetime bandwidth usage"
-msgstr ""
+msgstr "Utilisation de la bande passante depuis le démarrage"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "Expiry"
@@ -3701,12 +3797,12 @@ msgstr "Participants"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:165
 msgid "Endpoint"
-msgstr ""
+msgstr "Point terminal"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:205
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:212
 msgid "Build in progress"
-msgstr "Création d'un tunnel en cours"
+msgstr "Création en cours"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:205
 msgid "inbound"
@@ -3718,15 +3814,15 @@ msgstr "sortant"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:217
 msgid "No tunnels; waiting for the grace period to end."
-msgstr "Pas de tunnel; attendant la fin du délai de grâce"
+msgstr "Pas de tunnel; attente de la fin du délai de grâce"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:219
 msgid "in"
-msgstr "entrer"
+msgstr "entrés"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:220
 msgid "out"
-msgstr "sortir"
+msgstr "sortis"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:237
 msgid "Tunnel Counts By Peer"
@@ -3737,82 +3833,86 @@ msgid "% of total"
 msgstr "% du total"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
-#, fuzzy
 msgid "Our Tunnels"
-msgstr "Montrer les tunnels"
+msgstr "Mes tunnels"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
-#, fuzzy
 msgid "Participating Tunnels"
-msgstr "tunnels participants"
+msgstr "Tunnels participants"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:256
-#, fuzzy
 msgid "Totals"
-msgstr "Totale"
+msgstr "Totaux"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:132
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:145
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:178
-#, fuzzy
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:143
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:238
 msgid "Updating"
-msgstr "Mettre à jour"
-
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:189
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:214
-#, fuzzy
+msgstr "Mise à jour en cours"
+
+#. Process the .sud/.su2 file
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:117
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:262
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:287
 msgid "Update downloaded"
-msgstr "Méthode de mise à jour"
+msgstr "Mise à jour téléchargée"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:91
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:92
 #, java-format
 msgid "Unsigned update file from {0} is corrupt"
-msgstr ""
+msgstr "Le fichier de mise à jour non signé de {0} est corrompu"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:209
-#, fuzzy
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:282
 msgid "Restarting"
-msgstr "Redémarrer"
+msgstr "Redémarrage en cours"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:216
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:119
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:289
 msgid "Click Restart to install"
-msgstr ""
+msgstr "cliquez sur Redémarrer pour installer"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:218
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:291
 msgid "Click Shutdown and restart to install"
-msgstr ""
+msgstr "Cliquez sur \"Arrêter\" puis \"Démarrer\" pour installer"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:220
-#, fuzzy, java-format
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:122
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:293
+#, java-format
 msgid "Version {0}"
-msgstr "Version"
+msgstr "Version {0}"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:126
-#, fuzzy, java-format
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:127
+#, java-format
 msgid "Failed copy to {0}"
-msgstr "Echec de démarrage"
+msgstr "Échec de copie vers {0}"
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:185
+#, java-format
+msgid "Updating from {0}"
+msgstr "Mise à jour depuis {0}"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:209
-#, fuzzy
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:254
+#, java-format
+msgid "No new version found at {0}"
+msgstr "Pas de nouvelle trouvée sur {0}"
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:282
 msgid "Update verified"
-msgstr "Mise à jour fini"
+msgstr "Mise à jour vérifiée"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:234
-msgid "Transfer failed"
-msgstr ""
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:308
+#, java-format
+msgid "Transfer failed from {0}"
+msgstr "Échec de transfert depuis {0}"
 
 #. wars for ConfigClientsHelper
 #: ../java/strings/Strings.java:12
 msgid "addressbook"
-msgstr "carnet d'adresse"
+msgstr "carnet d'adresses"
 
 #: ../java/strings/Strings.java:13
 msgid "i2psnark"
@@ -3843,11 +3943,11 @@ msgstr "Console web"
 
 #: ../java/strings/Strings.java:23
 msgid "SAM application bridge"
-msgstr ""
+msgstr "Pont applicatif SAM"
 
 #: ../java/strings/Strings.java:24
 msgid "Application tunnels"
-msgstr "Tunnels d'application"
+msgstr "Tunnels d'applications"
 
 #: ../java/strings/Strings.java:25
 msgid "My eepsite web server"
@@ -3855,19 +3955,19 @@ msgstr "Serveur web de mon eepsite"
 
 #: ../java/strings/Strings.java:26
 msgid "I2P webserver (eepsite)"
-msgstr ""
+msgstr "Serveur web I2P (eepsite)"
 
 #: ../java/strings/Strings.java:27
 msgid "Browser launch at startup"
-msgstr ""
+msgstr "Lancer le navigateur au démarrage"
 
 #: ../java/strings/Strings.java:28
 msgid "BOB application bridge"
-msgstr ""
+msgstr "Pont applicatif BOB"
 
 #: ../java/strings/Strings.java:30
 msgid "Open Router Console in web browser at startup"
-msgstr ""
+msgstr "Ouvrir la console du routeur dans le navigateur au démarrage"
 
 #: ../java/strings/Strings.java:37
 msgid "IRC proxy"
@@ -3878,23 +3978,21 @@ msgid "eepsite"
 msgstr "eepsite"
 
 #: ../java/strings/Strings.java:39
-#, fuzzy
 msgid "I2P webserver"
-msgstr "Serveur web"
+msgstr "Serveur web I2P"
 
 #: ../java/strings/Strings.java:40
 msgid "HTTP Proxy"
-msgstr ""
+msgstr "Mandataire HTTP"
 
 #. older names for pre-0.7.4 installs
 #: ../java/strings/Strings.java:42
-#, fuzzy
 msgid "eepProxy"
-msgstr "eeProxy hôte"
+msgstr "hôte eeProxy"
 
 #: ../java/strings/Strings.java:43
 msgid "ircProxy"
-msgstr ""
+msgstr "Mandataire IRC"
 
 #. hardcoded in i2psnark
 #: ../java/strings/Strings.java:45
@@ -3904,1364 +4002,1636 @@ msgstr "I2PSnark"
 #. hardcoded in iMule?
 #: ../java/strings/Strings.java:47
 msgid "iMule"
-msgstr ""
+msgstr "iMule"
 
 #. standard themes for ConfigUIHelper
 #: ../java/strings/Strings.java:51
 msgid "classic"
-msgstr "classique"
+msgstr "Classique"
 
 #: ../java/strings/Strings.java:52
 msgid "dark"
-msgstr "foncé"
+msgstr "Sombre"
 
 #: ../java/strings/Strings.java:53
 msgid "light"
-msgstr "léger"
+msgstr "Clair"
 
 #: ../java/strings/Strings.java:54
-#, fuzzy
 msgid "midnight"
-msgstr "léger"
+msgstr "Minuit"
 
 #. stat groups for stats.jsp
 #: ../java/strings/Strings.java:57
-#, fuzzy
 msgid "Bandwidth"
-msgstr "Bande passante entrante/sortante"
+msgstr "Bande passante"
 
 #: ../java/strings/Strings.java:58
-#, fuzzy
 msgid "BandwidthLimiter"
 msgstr "Limiteur de bande passante"
 
 #: ../java/strings/Strings.java:59
-#, fuzzy
 msgid "ClientMessages"
-msgstr "Clients"
+msgstr "Messages clients"
 
 #: ../java/strings/Strings.java:60
-#, fuzzy
 msgid "Encryption"
-msgstr "Clé d'encryption"
+msgstr "Cryptage"
 
 #: ../java/strings/Strings.java:61
 msgid "i2cp"
-msgstr ""
+msgstr "i2cp"
 
 #: ../java/strings/Strings.java:63
 msgid "InNetPool"
-msgstr ""
+msgstr "InNetPool"
 
 #: ../java/strings/Strings.java:64
-#, fuzzy
 msgid "JobQueue"
-msgstr "queue des tâches"
+msgstr "File d'attente de travaux"
 
 #: ../java/strings/Strings.java:65
-#, fuzzy
 msgid "NetworkDatabase"
-msgstr "Réseau"
+msgstr "Base de données du réseau"
 
 #: ../java/strings/Strings.java:66
 msgid "ntcp"
-msgstr ""
+msgstr "ntcp"
 
 #: ../java/strings/Strings.java:69
 msgid "Stream"
-msgstr ""
+msgstr "flux"
 
 #: ../java/strings/Strings.java:70
 msgid "Throttle"
-msgstr ""
+msgstr "Régulation"
 
 #: ../java/strings/Strings.java:71
 msgid "Transport"
-msgstr ""
+msgstr "Transport"
 
 #: ../java/strings/Strings.java:73
 msgid "udp"
-msgstr ""
+msgstr "udp"
 
 #. parameters in transport addresses (netdb.jsp)
 #. may or may not be worth translating
 #: ../java/strings/Strings.java:77
 msgid "host"
-msgstr ""
+msgstr "hôte"
 
 #: ../java/strings/Strings.java:78
-#, fuzzy
 msgid "key"
-msgstr "Ajouter une clé"
+msgstr "clef"
 
 #: ../java/strings/Strings.java:79
-#, fuzzy
 msgid "port"
-msgstr "ou"
+msgstr "port"
 
 #. introducer host
 #: ../java/strings/Strings.java:83
 msgid "ihost0"
-msgstr ""
+msgstr "ihost0"
 
 #: ../java/strings/Strings.java:84
 msgid "ihost1"
-msgstr ""
+msgstr "ihost1"
 
 #: ../java/strings/Strings.java:85
 msgid "ihost2"
-msgstr ""
+msgstr "ihost2"
 
 #. introducer port
 #: ../java/strings/Strings.java:87
 msgid "iport0"
-msgstr ""
+msgstr "iport0"
 
 #: ../java/strings/Strings.java:88
 msgid "iport1"
-msgstr ""
+msgstr "iport1"
 
 #: ../java/strings/Strings.java:89
 msgid "iport2"
-msgstr ""
+msgstr "iport2"
 
 #. introducer key
 #: ../java/strings/Strings.java:91
 msgid "ikey0"
-msgstr ""
+msgstr "ikey0"
 
 #: ../java/strings/Strings.java:92
 msgid "ikey1"
-msgstr ""
+msgstr "ikey1"
 
 #: ../java/strings/Strings.java:93
 msgid "ikey2"
-msgstr ""
+msgstr "ikey2"
 
 #. introducer tag
 #: ../java/strings/Strings.java:95
 msgid "itag0"
-msgstr ""
+msgstr "itag0"
 
 #: ../java/strings/Strings.java:96
 msgid "itag1"
-msgstr ""
+msgstr "itag1"
 
 #: ../java/strings/Strings.java:97
 msgid "itag2"
-msgstr ""
+msgstr "itag2"
 
 #. Descriptions for the stats that are graphed by default
 #. There are over 500 stats currently defined, we aren't going to tag them all
 #: ../java/strings/Strings.java:101
 msgid "Low-level bandwidth receive rate"
-msgstr ""
+msgstr "Taux de bande passante de réception faible"
 
 #. bw.recvRate
 #: ../java/strings/Strings.java:102
 msgid "Low-level bandwidth send rate"
-msgstr ""
+msgstr "Taux de bande passante d'émission de bas niveau"
 
 #. bw.sendRate
 #: ../java/strings/Strings.java:103
 msgid "How many peers we are actively talking with"
-msgstr ""
+msgstr "Nombre de pairs actifs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:112
 msgid "config networking"
 msgstr "Interconnexion configuration"
 
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:222
+msgid "Summary Bar"
+msgstr "Panneau de contrôle"
+
 #. 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:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:218
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:218
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:228
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:235
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:235
 msgid "Refresh (s)"
-msgstr "Actualiser (s)"
+msgstr "Actualisation auto. (s)"
 
 #. ditto
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:222
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:235
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:222
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:232
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:227
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:238
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:239
 msgid "Enable"
 msgstr "Activer"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:262
 msgid "I2P Network Configuration"
 msgstr "Configuration I2P réseau"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:297
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:316
 msgid "Bandwidth limiter"
-msgstr "Limiteur de bande passante"
+msgstr "Gestionnaire de bande passante"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318
 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 le débit de transmission et réception pour qu'ils soient égales à ceux de votre connexion internet."
+msgstr "I2P fonctionnera mieux si vous configurez les débits de réception et d'émission pour qu'ils correspondent à ceux de votre connexion Internet."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:322
 msgid "KBps In"
-msgstr "KOps entrant"
+msgstr "ko/s entrants"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336
 msgid "KBps Out"
-msgstr "KOps sortant"
+msgstr "ko/s sortants"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:333
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:352
 msgid "Share"
-msgstr "Partager"
+msgstr "Partagés"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:340
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:326
 msgid "NOTE"
-msgstr "NOTER"
+msgstr "NOTE"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361
 #, java-format
 msgid "You have configured I2P to share only {0} KBps."
-msgstr "Vous avez configuré I2P à partager que {0} KOps."
+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:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:364
 msgid "I2P requires at least 12KBps to enable sharing. "
-msgstr "I2P a besoin de plus de 12KOps 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:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365
 msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. "
-msgstr "Veuillez activer le partage de bande passante (tunnels participants) en augmentant votre bande passante."
+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:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:366
 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."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369
 #, java-format
 msgid "You have configured I2P to share {0} KBps."
-msgstr "Vous avez configuré I2P à partager {0} KOps."
+msgstr "Vous avez configuré le partage I2P à {0}ko/s."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:353
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:372
 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."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:357
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:513
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:303
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:326
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:373
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:321
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:364
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:425
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:383
 msgid "Cancel"
 msgstr "Annuler"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:374
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:393
 msgid "IP and Transport Configuration"
-msgstr ""
+msgstr "Configuration IP et transport "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324
 msgid "The default settings will work for most people."
 msgstr "La configuration par défaut marchera pour la plupart des gens."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397
 msgid "There is help below."
 msgstr "Voir les explications ci-dessous."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:380
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
 msgid "UPnP Configuration"
 msgstr "Configuration UPnP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:384
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403
 msgid "Enable UPnP to open firewall ports"
 msgstr "Activer UPnP afin d'ouvrir les ports du pare-feu"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:386
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405
 msgid "UPnP status"
-msgstr "Statut UPnP"
+msgstr "État de UPnP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407
 msgid "IP Configuration"
 msgstr "Configuration IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:390
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
 msgid "Externally reachable hostname or IP address"
-msgstr "Adresse IP ou nom d'hôte qui est joignable depuis l'exterieur"
+msgstr "Adresse IP ou nom d'hôte joignable de l'extérieur"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:394
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413
 msgid "Use all auto-detect methods"
-msgstr "Utiliser toute méthode d'auto-détection"
+msgstr "Utiliser toutes les méthodes d'auto-détection"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:398
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
 msgid "Disable UPnP IP address detection"
-msgstr "Desactiver la détection de l'adresse IP par UPnP"
+msgstr "Désactiver la détection de l'adresse IP par UPnP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:402
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421
 msgid "Ignore local interface IP address"
 msgstr "Ignorer l'adresse IP de l'interface locale"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425
 msgid "Use SSU IP address detection only"
-msgstr "Utiliser seulement SSU pour détecter l'adresse IP"
+msgstr "N'utiliser que la détection d'adresse IP par SSU"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:410
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:478
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497
 msgid "Specify hostname or IP"
-msgstr "Saisir l'adresse IP ou le nom de l'hôte"
+msgstr "Saisir l'adresse IP ou le nom d'hôte"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
 msgid "Select Interface"
 msgstr "Choisir l'interface"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449
 msgid "Hidden mode - do not publish IP"
 msgstr "Mode caché - ne pas publier l'adresse IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:432
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451
 msgid "(prevents participating traffic)"
-msgstr ""
+msgstr "(empêche le trafic participants)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453
 msgid "Action when IP changes"
-msgstr ""
+msgstr "Action quand l'IP change"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:438
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457
 msgid "Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity"
-msgstr ""
+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/config_jsp.java:440
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
 msgid "Experimental"
-msgstr ""
+msgstr "Expérimental"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
 msgid "UDP Configuration:"
 msgstr "Configuration UDP :"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:444
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463
 msgid "UDP port:"
 msgstr "Port UDP :"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:458
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477
 msgid "TCP Configuration"
 msgstr "Configuration TCP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:464
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:483
 msgid "Use auto-detected IP address"
-msgstr "Utiliser l'adresse IP qui a été auto-détectée"
+msgstr "Utiliser l'adresse IP auto-détectée"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:466
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:498
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517
 msgid "currently"
 msgstr "actuellement"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:470
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489
 msgid "if we are not firewalled"
-msgstr "s'il n'y a pas de pare-feu"
+msgstr "si vous n'êtes pas bloqué par un pare-feu"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:474
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493
 msgid "Always use auto-detected IP address (Not firewalled)"
-msgstr "Utiliser toujours l'adresse IP qui a été auto-détectée (pas de pare-feu)"
+msgstr "Toujours utiliser l'adresse IP auto-détectée (non bloqué par pare-feu)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:484
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:503
 msgid "Disable inbound (Firewalled)"
 msgstr "Desactiver les connexions entrantes (derrière un pare-feu)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:488
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:507
 msgid "Completely disable"
 msgstr "Desactiver complètement"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:490
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509
 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)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:492
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511
 msgid "Externally reachable TCP port"
-msgstr ""
+msgstr "Port TCP joignable de l'extérieur"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:496
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515
 msgid "Use the same port configured for UDP"
 msgstr "Utiliser le même port qui a été configuré pour UDP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:504
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523
 msgid "Specify Port"
 msgstr "Saisir le port"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:508
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:338
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:329
-msgid "Note"
-msgstr "Noter"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527
+msgid "Notes"
+msgstr "Remarques"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511
-msgid "Changing these settings will restart your router."
-msgstr "Un changement de cette configuration entraînera un redémarrage du routeur"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:530
+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. "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536
 msgid "Configuration Help"
-msgstr "Aide avec la configuration"
+msgstr "Aide à la configuration"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:519
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:568
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
 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 fonctionnera derrière le plupart des pares-feu, mais votre vitesse et votre intégration avec le réseau s'améliorera s'il y a la redirection du port I2P pour UDP et TCP."
+msgstr "I2P fonctionnera derrière la plupart des pare-feux, mais votre vitesse et votre intégration avec le réseau sera améliorée par la redirection des ports UDP et TCP d'I2P."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:521
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540
 msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you."
-msgstr "Si vous pouvez, ouvrez un port dans votre pare-feu afin de permettre la réception des les paquets TCP et UDP non sollicités."
+msgstr "If vous 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/config_jsp.java:523
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542
 msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic."
-msgstr "Si vous ne pouvez pas, I2P est compatible avec UPnp (Universal Plug and Play)  et \"UDP hole punching\" avec \"SSU introductions\" afin de relayer le trafic I2P."
+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/config_jsp.java:525
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544
 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 "Le plupart des possibilités décrites ci-avant sont pour les situtations particulieres, par exemple le cas où UPnP ne fonctionne pas correctement, ou un pare-feu empeche la connexion au réseau I2P."
+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/config_jsp.java:527
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546
 msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
-msgstr "Il y a des certains types de pare-feu (tel que les NAT symétriques) qui ne fonctionnent pas bien avec I2P."
+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/config_jsp.java:536
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
 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 \"Internet Gateway Devices (IGDs)\" afin de détecter l'adresse IP extérieure et de 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/config_jsp.java:538
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
 msgid "UPnP support is beta, and may not work for any number of reasons"
-msgstr "UPnP est toujours en développement, et il peut arrêter de fonctionner correctement à cause de "
+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/config_jsp.java:540
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559
 msgid "No UPnP-compatible device present"
-msgstr "Il n'y a pas d'appareil qui est compatible avec UPnP"
+msgstr "Aucun appareil compatible UPnP détecté"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561
 msgid "UPnP disabled on the device"
-msgstr "UPnP est desactivé sur l'appareil"
+msgstr "UPnP est désactivé sur l'appareil"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
 msgid "Software firewall interference with UPnP"
-msgstr "Il y a de l'intérference entre un pare-feu en software et UPnP"
+msgstr "Interférence entre un pare-feu logiciel et UPnP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
 msgid "Bugs in the device's UPnP implementation"
-msgstr "Il y a des bogues dans l'implementation d'UPnP dans l'appareil"
+msgstr "Bogues dans l'implémentation UPnP de l'appareil"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:548
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
 msgid "Multiple firewall/routers in the internet connection path"
-msgstr "Il y a plusieurs routeurs/pare-feux entre le routeur I2P et l'internet"
+msgstr "Il y a plusieurs routeurs/pare-feux entre le routeur I2P et l'Internet"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:550
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
 msgid "UPnP device change, reset, or address change"
-msgstr "Un changement de l'appareil UPnP, une redémarrage, ou une changement d'adresse IP"
+msgstr "Changement d'appareil UPnP, redémarrage, ou changement d'adresse IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:552
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571
 msgid "Review the UPnP status here."
-msgstr "Consulter le statut de UPnP ici."
+msgstr "Vérifier l'état d'UPnP ici."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:554
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573
 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é au-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/config_jsp.java:556
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
 msgid "Hostnames entered above will be published in the network database."
-msgstr "Les noms d'hôtes qui ont été saisis au-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/config_jsp.java:558
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
 msgid "They are <b>not private</b>."
 msgstr "Ils ne sont pas <b>privés</b>."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:560
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
 msgid "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
-msgstr "En plus, <b>ne saisissez pas une adresse IP privée</b> tel que 127.0.0.1 ou 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/config_jsp.java:562
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
 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 configurer votre NAT ou pare-feu incorrectement, votre intégration avec le réseau I2P dégradera substantiellement."
+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/config_jsp.java:564
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
 msgid "When in doubt, leave the settings at the defaults."
-msgstr "Si vous n'êtes pas sûr de vous, laisser la configuration par défaut."
+msgstr "Dans le doute, laissez les réglages par défaut."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:566
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
 msgid "Reachability Help"
-msgstr ""
+msgstr "Aide sur la joignabilité"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590
 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 ""
+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/config_jsp.java:574
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
 msgid "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help diagnose the problem."
-msgstr ""
+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/config_jsp.java:578
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
 msgid "Your UDP port does not appear to be firewalled."
-msgstr ""
+msgstr "Votre port UDP ne semble pas bloqué par un pare-feu."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:582
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
 msgid "Your UDP port appears to be firewalled."
-msgstr ""
+msgstr "Votre port UDP semble bloqué par un pare-feu."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:584
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
 msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error."
-msgstr ""
+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/config_jsp.java:586
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
 msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port."
-msgstr ""
+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/config_jsp.java:588
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
 msgid "I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections."
-msgstr ""
+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/config_jsp.java:590
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609
 msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)."
-msgstr ""
+msgstr "Cependant, vous obtiendrez plus de trafic participants et aiderez plus le réseau si vous avez la possibilité d'ouvrir vos pare-feux."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:592
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
 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 "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/config_jsp.java:594
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
 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 ""
+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/config_jsp.java:598
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
 msgid "The router is currently testing whether your UDP port is firewalled."
-msgstr ""
+msgstr "Le routeur teste actuellement si votre port UDP est bloqué."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:602
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
 msgid "The router is not configured to publish its address, therefore it does not expect incoming connections."
-msgstr ""
+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/config_jsp.java:604
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
 msgid "WARN - Firewalled and Fast"
 msgstr "WARN - Pare-feu et Rapide"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:606
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
 msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled."
-msgstr ""
+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/config_jsp.java:608
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
 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 ""
+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/config_jsp.java:610
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
 msgid "WARN - Firewalled and Floodfill"
 msgstr "WARN - Pare-feu et Floodfill"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:612
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
 msgid "You have configured I2P to be a floodfill router, but you are firewalled."
-msgstr ""
+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/config_jsp.java:614
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
 msgid "For best participation as a floodfill router, you should open your firewall."
-msgstr ""
+msgstr "Pour une meilleure participation en tant que diffuseur, vous devriez ouvrir votre pare-feu."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:616
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
 msgid "WARN - Firewalled with Inbound TCP Enabled"
 msgstr "WARN - Pare-feu avec TCP entrant activé"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:618
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
 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 ""
+msgstr "Vous avez configuré le TCP entrant,  cependant votre port UDP est bloqué et en conséquence il est probable que TCP l'est aussi."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:620
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
 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 ""
+msgstr "Si votre port TCp est bloqué et les connexions entrantes TCP activées dans la console, 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/config_jsp.java:622
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
 msgid "Please open your firewall or disable inbound TCP above."
-msgstr ""
+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/config_jsp.java:624
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
 msgid "WARN - Firewalled with UDP Disabled"
-msgstr "WARN - Pare-feu avec UDP desactivé"
+msgstr "WARN - Pare-feu avec UDP désactivé"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:626
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
 msgid "You have configured inbound TCP, however you have disabled UDP."
-msgstr ""
+msgstr "Vous avez configuré le TCP entrant, mais vous avez désactivé UDP."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:628
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
 msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections."
-msgstr ""
+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/config_jsp.java:630
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
 msgid "Please open your firewall or enable UDP."
-msgstr ""
+msgstr "Merci d'ouvrir votre pare-feu ou d'activer UDP."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:632
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
 msgid "ERR - Clock Skew"
-msgstr "ERR - horloge décalé"
+msgstr "ERR - horloge décalée"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:634
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
 msgid "Your system's clock is skewed, which will make it difficult to participate in the network."
-msgstr ""
+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/config_jsp.java:636
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655
 msgid "Correct your clock setting if this error persists."
-msgstr ""
+msgstr "Corrigez votre réglage d'horloge si cette erreur persiste."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:638
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657
 msgid "ERR - Private TCP Address"
 msgstr "ERR - Adresse TCP privée"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:640
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659
 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 ""
+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/config_jsp.java:642
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661
 msgid "Correct the address or disable inbound TCP above."
-msgstr ""
+msgstr "Corrigez cette adresse ou désactivez le TCP entrant ci-dessus."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:644
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663
 msgid "ERR - SymmetricNAT"
 msgstr "ERR - NAT symétrique"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:646
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665
 msgid "I2P detected that you are firewalled by a Symmetric NAT."
-msgstr ""
+msgstr "I2P a détecté que vous êtes derrière un NAT symétrique."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:648
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667
 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 ""
+msgstr "I2P marche mal derrière ce genre de pare-feu. vous ne pourrez sûrement pas accepter de recevoir de connexions entrantes, ce qui limitera votre participation au réseau."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:650
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669
 msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
-msgstr ""
+msgstr "ERR - Port UDP en cours d'utilisation - réglez i2np.udp.internalPort=xxxx dans la configuration avancée et redémarrez"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:652
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671
 msgid "I2P was unable to bind to port 8887 or other configured port."
-msgstr ""
+msgstr "I2P n'a pas pu s'attacher au port configuré."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:654
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673
 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 "Vérifiez si un autre programme utilise le port configuré pour I2P. Si oui, arrêtez ce programme ou configurez I2P pour 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 programmes)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:656
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:675
 msgid "This may be a transient error, if the other program is no longer using the port."
-msgstr ""
+msgstr "Il s'agit peut-être d'une erreur passagère, si l'autre programme n'utilise plus le port."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:658
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:677
 msgid "However, a restart is always required after this error."
-msgstr ""
+msgstr "Cependant un redémarrage du routeur est toujours requis après cette erreur."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:660
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:679
 msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
-msgstr ""
+msgstr "ERR - UDP est désactivé et l'hôte/port entrants ne sont pas définis."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:662
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:681
 msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP."
-msgstr ""
+msgstr "vous n'avez pas configuré le TCP entrant ci-dessus avec un nom d'hôte et un port, mais vous avez désactivé UDP."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:664
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:683
 msgid "Therefore your router cannot accept inbound connections."
-msgstr ""
+msgstr "Le routeur ne peut donc pas accepter de connexions entrantes."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:666
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:685
 msgid "Please configure a TCP host and port above or enable UDP."
-msgstr ""
+msgstr "Merci de configurer ci-dessus un nom et un port TCP, ou d'activer UDP."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:668
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:687
 msgid "ERR - Client Manager I2CP Error - check logs"
-msgstr ""
+msgstr "ERR - Client Manager I2CP Error - vérifiez les historique"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:670
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:689
 msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
-msgstr ""
+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/config_jsp.java:672
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:691
 msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P."
-msgstr ""
+msgstr "Avez-vous une autre instance d'I2P en cours d'exécution? Arrêtez le programme en conflit et redémarrez I2P."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:113
 msgid "config advanced"
-msgstr "configuration avancé"
+msgstr "configuration avancée"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:263
 msgid "I2P Advanced Configuration"
-msgstr "Configuration I2P avancé"
+msgstr "Configuration I2P avancée"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:319
 msgid "Advanced I2P Configuration"
-msgstr "Configuration I2P avancé"
+msgstr "Configuration I2P avancée"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:329
 msgid "Some changes may require a restart to take effect."
-msgstr ""
+msgstr "Certains changement nécessitent un redémarrage pour prendre effet."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:112
 msgid "config clients"
-msgstr "Clients configuration"
+msgstr "configuration clients"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:265
 msgid "I2P Client Configuration"
-msgstr "Client I2P configuration"
+msgstr "Configuration clients I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330
 msgid "Client Configuration"
-msgstr "Configuration Client"
+msgstr "Préférences"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:332
 msgid "The Java clients listed below are started by the router and run in the same JVM."
-msgstr ""
+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:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338
 msgid "To change other client options, edit the file"
-msgstr ""
+msgstr "Pour changer d'autres options du client, modifiez le fichier"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:324
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439
 msgid "All changes require restart to take effect."
-msgstr ""
+msgstr "Tous les changements nécessitent un redémarrage pour prendre effet."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357
+msgid "Advanced Client Interface Configuration"
+msgstr "Configuration interface client avancée"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361
+msgid "External I2CP (I2P Client Protocol) Interface Configuration"
+msgstr "Configuration de l'interface I2CP (I2P Client Protocol) externe"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:336
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367
+msgid "Enabled without SSL"
+msgstr "Activé sans SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373
+msgid "Enabled with SSL required"
+msgstr "Activé avec SLL requis"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379
+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"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:381
+msgid "I2CP Port"
+msgstr "Port I2CP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385
+msgid "I2CP Interface"
+msgstr "Interface i2CP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401
+msgid "Authorization"
+msgstr "Autorisation"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407
+msgid "Require username and password"
+msgstr "Utilisateur+Mot de  passe requis"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409
+msgid "Username"
+msgstr "Utilisateur"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413
+msgid "Password"
+msgstr "Mot de passe"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:419
+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."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421
+msgid "Many clients do not support SSL or authorization."
+msgstr "Nombre de clients ne prennent pas en charge l'authentification ou SSL."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429
 msgid "WebApp Configuration"
 msgstr "Configuration WebApp"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431
 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 separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)."
-msgstr ""
+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 (p.e. i2pSnark), d'interfaces pour d'autres clients ou applications qui doivent être activées séparément (p.e. susidns, i2ptunnel), ou n'ayant absolument aucune interface web (p.e. le carnet d'adresses)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433
 msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method."
-msgstr ""
+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:350
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:445
 msgid "Plugin Configuration"
-msgstr "Configuration Client"
+msgstr "Configuration du greffon"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:352
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:447
 msgid "The plugins listed below are started by the webConsole client."
-msgstr ""
+msgstr "Les greffons listés ci-dessous sont démarrés par le client webConsole."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455
 msgid "Plugin Installation"
-msgstr ""
+msgstr "Installation de greffon"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:457
 msgid "To install a plugin, enter the download URL:"
-msgstr ""
+msgstr "Pour installer un greffon, entrez son URL de téléchargement:"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:112
 msgid "config keyring"
-msgstr "Configuration porte-clés"
+msgstr "Configuration du porte-clés"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:249
 msgid "I2P Keyring Configuration"
-msgstr "Configuration du Porte-clés I2P"
+msgstr "Configuration du porte-clés I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:294
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317
 msgid "The router keyring is used to decrypt encrypted leaseSets."
-msgstr ""
+msgstr "Le trousseau de clefs 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:297
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320
 msgid "The keyring may contain keys for local or remote encrypted destinations."
-msgstr ""
+msgstr "Le trousseau contient les clés des destinations cryptées locales ou distantes."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326
 msgid "Manual Keyring Addition"
-msgstr ""
+msgstr "Ajout manuel de clés"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:328
 msgid "Enter keys for encrypted remote destinations here."
-msgstr ""
+msgstr "Entrez les clés pour les destinations chiffrées distantes ici."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:331
 msgid "Keys for local destinations must be entered on the"
-msgstr ""
+msgstr "Les clés des destinations locales doivent être entrées sur la"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:314
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:333
 msgid "I2PTunnel page"
-msgstr ""
+msgstr "page I2PTunnel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335
 msgid "Dest. name, hash, or full key"
 msgstr "Nom de destination, empreinte, ou clé complète"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337
 msgid "Encryption Key"
-msgstr "Clé d'encryption"
+msgstr "Clé de cryptage"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:113
 msgid "config logging"
-msgstr "configuration enregistrements"
+msgstr "configuration des historiques"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:263
 msgid "I2P Logging Configuration"
-msgstr ""
+msgstr "Configuration des historiques I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
 msgid "Configure I2P Logging Options"
-msgstr ""
+msgstr "Configuration des options d'historiques"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321
 msgid "Logging filename"
-msgstr ""
+msgstr "Nom du fichier des historiques"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325
 msgid "(the symbol '@' will be replaced during log rotation)"
-msgstr ""
+msgstr "(le caractère \"@\" sera remplacé lors des rotations d'historiques)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327
 msgid "Log record format"
-msgstr ""
+msgstr "Format des enregistrements d'historiques"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331
 msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
-msgstr "(use 'd' = date, 'c' = classe, 't' = fil d'exécution, '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:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333
 msgid "Log date format"
-msgstr ""
+msgstr "Format de date des historiques"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337
 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:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339
 msgid "Max log file size"
-msgstr ""
+msgstr "Taille max des fichiers d'historiques"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:343
 msgid "Default log level"
-msgstr ""
+msgstr "Niveau d'historisation par défaut"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:347
 msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)"
-msgstr ""
+msgstr "(DEBUG et INFO sont déconseillés, car ils ralentissent double-plus-grâââve votre routeur)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:349
 msgid "Log level overrides"
-msgstr ""
+msgstr "Exceptions au niveau d'historisation"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:353
 msgid "New override"
-msgstr ""
+msgstr "Nouvelle exception"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:112
 msgid "config peers"
 msgstr "Configuration des pairs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:249
 msgid "I2P Peer Configuration"
 msgstr "Configuration des pairs I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323
 msgid "Manual Peer Controls"
-msgstr ""
+msgstr "Contrôle manuel des pairs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325
 msgid "Router Hash"
-msgstr "Routeur empreinte"
+msgstr "Empreinte du routeur"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:329
 msgid "Manually Ban / Unban a Peer"
-msgstr ""
+msgstr "(Dé)banissement manuel d'un pair"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:331
 msgid "Banning will prevent the participation of this peer in tunnels you create."
-msgstr ""
+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:341
+msgid "Adjust Profile Bonuses"
+msgstr "Ajuster les boni du profil"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:324
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343
 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 Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the"
-msgstr ""
+msgstr "Les boni 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 quelques tunnels exploratoires. Les boni actuels sont affichés sur la"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:326
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345
 msgid "profiles page"
-msgstr "page des profiles"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:342
-msgid "Adjust peer bonuses"
-msgstr ""
+msgstr "page des profils"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:344
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:253
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:273
 msgid "Banned Peers"
-msgstr "Pairs interdits"
+msgstr "Pairs bannis"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:384
 msgid "Banned IPs"
-msgstr "Adresses IP interdits"
+msgstr "Adresses IP bannies"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:112
+msgid "config reseeding"
+msgstr "Config réamorçage"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:262
+msgid "I2P Reseeding Configuration"
+msgstr "Configuration du réamorçage d'I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318
+msgid "Reseeding Configuration"
+msgstr "Configuration réamorçage"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:320
+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 l'installation initiale d'I2P, ou lorsqu'il reste au routeur trop peu de références à d'autre routeurs."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:322
+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."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:326
+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."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328
+#, java-format
+msgid "See {0} for instructions on reseeding manually."
+msgstr "Voir les instructions de réamorçage manuel sur {0}."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328
+msgid "the FAQ"
+msgstr "la FAQ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330
+msgid "Reseed URL Selection"
+msgstr "Sélection de l'URL de réamorçage"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336
+msgid "Try SSL first then non-SSL"
+msgstr "Préférer SSL, sinon,  repli sur non-SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:342
+msgid "Use SSL only"
+msgstr "Avec SSL seulement"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348
+msgid "Use non-SSL only"
+msgstr "Sans SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350
+msgid "Reseed URLs"
+msgstr "URLs de réamorçage"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:354
+msgid "Enable HTTP proxy (not used for SSL)"
+msgstr "Activer le mandataire HTTP (non utilisé pour SSL)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:358
+msgid "HTTP Proxy Host"
+msgstr "Hôte mandataire HTTP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:362
+msgid "HTTP Proxy Port"
+msgstr "Port mandataire HTTP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:112
 msgid "config service"
-msgstr "Service Configuration "
+msgstr "Configuration du service"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:249
 msgid "I2P Service Configuration"
-msgstr "Service I2P Configuration"
+msgstr "Configuration du service I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303
 msgid "Shutdown the router"
-msgstr "Fermer le routeur"
+msgstr "Arrêter le routeur"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:286
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305
 msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes."
-msgstr "Une fermature gracieuse permit au routeur de satisfaire ses accords en place avec d'autres routeurs avant de fermer, mais cela prendra plusieurs 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:288
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307
 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 aussi disponible."
+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:298
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317
 msgid "If you want the router to restart itself after shutting down, you can choose one of the following."
-msgstr ""
+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:300
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319
 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 "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:302
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321
 msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately."
-msgstr "Une redémarrage gracieux prendra quelques minutes (mais vos pairs apprécieront votre patience), une redémarrage immédiate 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:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323
 msgid "After tearing down the router, it will wait 1 minute before starting back up again."
-msgstr "Après la rédemmarage du routeur, il attendra 1 minute avant de se relancer."
+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:314
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333
 msgid "Systray integration"
-msgstr ""
+msgstr "Intégration dans la zone de notification"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335
 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 ""
+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:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337
 msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)."
-msgstr ""
+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:320
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339
 msgid "If you are on windows, you can either enable or disable that icon here."
-msgstr ""
+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:341
+msgid "Show systray icon"
+msgstr "Afficher l'icône de zone de notification"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343
+msgid "Hide systray icon"
+msgstr "Masquer l'icône de zone de notification"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:326
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:345
 msgid "Run on startup"
-msgstr "Lancer avec le démarrage du routeur"
+msgstr "Lancer au démarrage"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:328
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347
 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 ""
+msgstr "Vous pouvez contrôler si I2P est lancé ou pas au démarrage 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:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349
 msgid "If you prefer the command line, you can also run the "
-msgstr ""
+msgstr "Si vous préférez la ligne commande, vous pouvez aussi exécuter la"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:348
+msgid "Note"
+msgstr "Note"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359
 msgid "If you are running I2P as service right now, removing it will shut down your router immediately."
-msgstr ""
+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:342
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361
 msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat."
-msgstr ""
+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:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365
 msgid "Debugging"
 msgstr "Débogage"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:348
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:367
 msgid "View the job queue"
-msgstr "queue des tâches"
+msgstr "Afficher la file d'attente de travaux"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:352
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:371
 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 ""
+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:358
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:377
 msgid "Launch browser on router startup?"
-msgstr "Lancer explorateur internet pendant le démarrage du routeur ?"
+msgstr "Lancer le navigateur au démarrage du routeur?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:379
 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 ""
+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/configstats_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:113
 msgid "config stats"
-msgstr ""
+msgstr "config stats"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:229
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:250
 msgid "I2P Stats Configuration"
-msgstr "Configuration I2P Statistiques"
+msgstr "Configuration des statistiques d'I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:300
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:320
 msgid "Configure I2P Stat Collection"
-msgstr ""
+msgstr "Sélection des données à collecter"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:322
 msgid "Enable full stats?"
-msgstr ""
+msgstr "Activer toutes les statistiques"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329
 msgid "change requires restart to take effect"
-msgstr ""
+msgstr "la modification sera prise en compte au prochain démarrage"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331
 msgid "Stat file"
-msgstr ""
+msgstr "Fichier des statistiques"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:335
 msgid "Filter"
 msgstr "Filtre"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:326
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:348
 msgid "toggle all"
-msgstr "basculer tous"
+msgstr "basculer tout"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:350
 msgid "Log"
-msgstr "Enregistrement"
+msgstr "Histo."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:352
 msgid "Graph"
-msgstr "Graphe"
+msgstr "Graph."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:369
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:391
 msgid "Advanced filter"
 msgstr "Filtre avancé"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:112
 msgid "config tunnels"
 msgstr "Configuration des tunnels"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:262
 msgid "I2P Tunnel Configuration"
 msgstr "Configuration des tunnels I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:328
 msgid "The default settings work for most people."
-msgstr "La configuration défaut fonctionne pour le 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:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332
 msgid "There is a fundamental tradeoff between anonymity and performance."
-msgstr ""
+msgstr "Il y a une contradiction fondamentale entre anonymat et performances."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335
 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 ""
+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:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338
 msgid "High CPU and/or high outbound bandwidth usage may result."
-msgstr ""
+msgstr "Une forte charge UC et/ou utilisation de bande passante sortante peuvent en résulter. "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341
 msgid "Change these settings with care, and adjust them if you have problems."
-msgstr ""
+msgstr "Modifiez ces réglages avec prudence, et fignolez-les en cas de problèmes."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:351
 msgid "Exploratory tunnel setting changes are stored in the router.config file."
-msgstr ""
+msgstr "Les modifications des réglages de tunnels exploratoires sont enregistrés dans le fichier router.config."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:354
 msgid "Client tunnel changes are temporary and are not saved."
-msgstr ""
+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:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:356
 msgid "To make permanent client tunnel changes see the"
-msgstr ""
+msgstr "Pour faire des modifications permanentes à un tunnel client particulier, voyez la"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:358
 msgid "i2ptunnel page"
-msgstr ""
+msgstr "page i2ptunnel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:112
 msgid "config UI"
-msgstr "configuration IHM"
+msgstr "configuration de la console"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:262
 msgid "I2P UI Configuration"
-msgstr "Configuration de l'IHM I2P"
+msgstr "Préférences de la console"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314
 msgid "Router Console Theme"
-msgstr ""
+msgstr "Thème de la console"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:339
 msgid "Theme selection disabled for Internet Explorer, sorry."
-msgstr ""
+msgstr "Sélection de thème indisponible pour Internet Explorer, désolé."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:341
 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 ""
+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:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:345
 msgid "Router Console Language"
-msgstr ""
+msgstr "Langue de la console"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:349
 msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help."
-msgstr "Veuillez contribuer à la traduction du 'router console' ! Contactez les développeurs sur IRC #i2p afin de donner un coup de main."
+msgstr "Merci de contribuer à la traduction de la console du routeur ! Contactez les développeurs sur IRC #i2p afin de donner un coup de main."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353
 msgid "Apply"
 msgstr "Appliquer"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:112
 msgid "config update"
-msgstr "Mettre à jour la configuration"
+msgstr "mise à jour config"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:249
 msgid "I2P Update Configuration"
-msgstr "Configuration du mise à jour I2P"
+msgstr "Configuration des mises à jour"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321
 msgid "Check for I2P and news updates"
-msgstr ""
+msgstr "Vérification de mises à jour I2P et nouvelles"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:323
 msgid "News &amp; I2P Updates"
-msgstr "Actualités et mises à jour I2P"
+msgstr "Actualités &amp; mises à jour i2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327
 msgid "Update In Progress"
 msgstr "Mise à jour en cours"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335
 msgid "News URL"
-msgstr "Actualités URL"
+msgstr "URL des actualités"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339
 msgid "Refresh frequency"
 msgstr "Fréquence d'actualisation"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:326
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:345
 msgid "Update policy"
 msgstr "Méthode de mise à jour"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:349
 msgid "Update through the eepProxy?"
-msgstr "Mettre à jour utilisant l'eeProxy ?"
+msgstr "Mettre à jour via l'eeProxy ?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:353
 msgid "eepProxy host"
 msgstr "eeProxy hôte"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:338
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:357
 msgid "eepProxy port"
-msgstr ""
+msgstr "Port eepProxy"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
 msgid "Update URLs"
 msgstr "Mettre à jour à partir de ces URLs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365
 msgid "Trusted keys"
-msgstr "Clés auxquelles on peut faire confiance"
+msgstr "Clés de confiance"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369
 msgid "Update with unsigned development builds?"
-msgstr "Mettre à jour avec une version de développement d'i2p qui n'a pas été signée"
+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:354
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:373
 msgid "Unsigned Build URL"
-msgstr "L'URL de la version d'i2p qui n'a pas été signée"
+msgstr "L'URL de version non signée"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:379
 msgid "I2P updates are disabled because you do not have write permission for the install directory."
-msgstr ""
+msgstr "Les mises à jours d'I2P sont désactivées car vous n'avez pas le droit d'écriture sur le dossier d'installation. "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385
 msgid "Save"
-msgstr "Sauvegarder"
+msgstr "Enregistrer"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121
+msgid "Internal Error"
+msgstr "Erreur interne"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123
+msgid "Router Console"
+msgstr "Console du routeur I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:127
+msgid "Configuration"
+msgstr "Configuration"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135
+msgid "Sorry! There has been an internal error."
+msgstr "Désolé! Une erreur interne est survenue."
+
+#. note to translators - both parameters are URLs
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:254
+#, java-format
+msgid "Please report bugs on {0} or {1}."
+msgstr "Merci de signaler les bogues sur {0} ou {1}."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258
+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."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:145
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:260
+msgid "Please include this information in bug reports"
+msgstr "Veuillez inclure cette information dans les rapports des bugs"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147
+msgid "Error Details"
+msgstr "Détails de l'erreur"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:149
+#, java-format
+msgid "Error {0}"
+msgstr "Erreur {0}"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:169
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:250
+msgid "I2P Version and Running Environment"
+msgstr "Version d'I2P & environnement d'exécution"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:197
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:288
+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."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:123
 msgid "Page Not Found"
 msgstr "Page introuvable"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:264
 msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource."
-msgstr ""
+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:245
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:266
 msgid "Error 404"
 msgstr "Erreur 404"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:271
 msgid "not found"
-msgstr "pas trouvé"
+msgstr "non trouvé"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:112
 msgid "graphs"
-msgstr "graphes"
+msgstr "graphiques"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:249
 msgid "I2P Performance Graphs"
-msgstr ""
+msgstr "Graphiques de performances I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:111
 msgid "home"
-msgstr ""
+msgstr "accueil"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:331
+msgid "Welcome to I2P"
+msgstr "Bienvenue sur I2P !"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:111
 msgid "job queue"
-msgstr "queue des tâches"
+msgstr "file d'attente"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:248
 msgid "I2P Router Job Queue"
-msgstr ""
+msgstr "File d'attente de travaux du routeur"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:111
 msgid "logs"
-msgstr "fichier traces"
+msgstr "historiques"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:248
 msgid "I2P Router Logs"
 msgstr "Fichier traces du routeur I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:229
-msgid "I2P Version & Running Environment"
-msgstr ""
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:231
-msgid "Please report bugs on <a href=\"http://trac.i2p2.i2p/newticket\">trac.i2p2.i2p</a>."
-msgstr ""
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:233
-msgid "Please include this information in bug reports"
-msgstr "Veuillez inclure cette information dans les rapports des bugs"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:274
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303
 msgid "Critical Logs"
-msgstr ""
+msgstr "Historiques critiques"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:278
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:307
 msgid "Router Logs"
-msgstr "Fichier traces du routeur I2P"
+msgstr "Historiques du routeur"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:313
 msgid "Service (Wrapper) Logs"
-msgstr ""
+msgstr "Historique du service Wrapper"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:111
 msgid "network database summary"
-msgstr ""
+msgstr "Résumé base de données"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:248
 msgid "I2P Network Database Summary"
-msgstr ""
+msgstr "Résumé base de données I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:115
 msgid "WebApp Not Found"
-msgstr "Page introuvable"
+msgstr "Application web introuvable"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:231
-#, fuzzy
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:252
 msgid "Web Application Not Running"
-msgstr "Tunnels d'application"
+msgstr "Application web non lancée"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:233
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:254
 msgid "The requested web application is not running."
-msgstr ""
+msgstr "L'application web demandée n'est pas lancée."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:256
 msgid "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</a> to start it."
-msgstr ""
+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:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:111
 msgid "peer connections"
-msgstr "connexions pairs"
+msgstr "connexions de pairs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:248
 msgid "I2P Network Peers"
-msgstr ""
+msgstr "Pairs I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:111
 msgid "peer profiles"
-msgstr "profile des pairs"
+msgstr "profils de pairs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:248
 msgid "I2P Network Peer Profiles"
-msgstr ""
+msgstr "Profils de pairs I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:111
 msgid "statistics"
 msgstr "statistiques"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:265
 msgid "I2P Router Statistics"
 msgstr "Statistiques du routeur I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:255
 #, java-format
 msgid "Disable {0} Refresh"
-msgstr "Désactiver {0} actualisation"
+msgstr "Désactiver l''actualisation automatique {0}"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:111
 msgid "tunnel summary"
-msgstr "sommaire tunnel"
+msgstr "résumé des tunnels"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:248
 msgid "I2P Tunnel Summary"
-msgstr "tunnel sommaire I2P"
+msgstr "Résumé des tunnels I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:248
+msgid "Peer Profile"
+msgstr "Profils de pair"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:275
+#, java-format
+msgid "Profile for peer {0}"
+msgstr "Profil du pair {0}"
+
+#~ msgid "Last reseed failed fully (failed reading seed URL)."
+#~ msgstr ""
+#~ "Échec complet du dernier réamorçage (échec de lecture de l\\''URL source)"
+
+#~ msgid "Last reseed failed fully (no routerInfo URLs at seed URL)."
+#~ msgstr ""
+#~ "Échec complet du dernier réamorçage (pas de routerInfo à l\\''URL source)"
+
+#~ msgid "Last reseed failed partly ({0}% of {1})."
+#~ msgstr "Échec partiel du dernier réamorçage ({0}% de {1})."
+
+#~ msgid "Last reseed failed ({0}% of {1})."
+#~ msgstr "Échec du dernier réamorçage ({0}% de {1})."
+
+#~ msgid "Last reseed failed fully (exception caught)."
+#~ msgstr "Échec complet du dernier réamorçage (exception interceptée)."
+
+#~ msgid "System tray icon enabled."
+#~ msgstr "Icône de zone de notification système activée."
+
+#~ msgid "System tray icon feature not supported on this platform. Sorry!"
+#~ msgstr ""
+#~ "Fonctionnalité \"Icône de zone de notification système\" non disponible "
+#~ "sur cette plateforme. Désolé!"
+
+#~ msgid "Warning: unable to contact the systray manager"
+#~ msgstr ""
+#~ "Avertissement: impossible de contacter le gestionnaire de zone de "
+#~ "notification."
+
+#~ msgid "System tray icon disabled."
+#~ msgstr "Icône de zone de notification système désactivée."
+
+#~ msgid "hour"
+#~ msgstr "heure"
+
+#~ msgid "minute"
+#~ msgstr "mn"
+
+#~ msgid "minutes"
+#~ msgstr "minutes"
+
+#~ msgid "Download"
+#~ msgstr "Télécharger"
+
+#~ msgid ""
+#~ "Please report bugs on <a href=\"http://trac.i2p2.i2p/newticket\">trac."
+#~ "i2p2.i2p</a>."
+#~ msgstr ""
+#~ "Merci de signaler les bogues sur <a href=\"http://trac.i2p2.i2p/newticket"
+#~ "\">trac.i2p2.i2p</a>."
 
 #~ msgid "This is useful in some situations"
 #~ msgstr "C'est utile dans certains cas"
+
 #~ msgid "Start Now"
 #~ msgstr "Démarrer tout de suite"
+
 #~ msgid "Depth"
 #~ msgstr "Profondeur"
+
 #~ msgid "view without"
 #~ msgstr "montrer sans"
+
 #~ msgid "view with"
 #~ msgstr "montrer avec"
+
 #~ msgid "Show the router's workload, and how it's performing"
 #~ msgstr "Montrer les tâches en cours"
+
 #~ msgid "Jobs"
 #~ msgstr "Tâches"
+
 #~ msgid "Tunnels in/out"
 #~ msgstr "Tunnels entrants/sortants"
-
diff --git a/apps/routerconsole/locale/messages_nl.po b/apps/routerconsole/locale/messages_nl.po
index 53ab8ee9d29477d8888bb1f9de2174d31ca07835..667d5901bac27ef6e3f07a05acf0710fb31e6cc4 100644
--- a/apps/routerconsole/locale/messages_nl.po
+++ b/apps/routerconsole/locale/messages_nl.po
@@ -6,17 +6,17 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: I2P routerconsole\n"
+"Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-17 15:03+0000\n"
-"PO-Revision-Date: 2010-07-04 15:04+0100\n"
-"Last-Translator: duck <duck@mail.i2p>\n"
-"Language-Team: duck <duck@mail.i2p>, monkeybrains <monkeybrains@mail.i2p>\n"
+"POT-Creation-Date: 2011-03-21 18:30+0000\n"
+"PO-Revision-Date: 2011-03-21 18:26+0000\n"
+"Last-Translator: ducki2p <ducki2p@gmail.com>\n"
+"Language-Team: Dutch <>\n"
+"Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
-"X-Poedit-Language: Dutch\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
@@ -26,7 +26,7 @@ msgstr ""
 #. {0,number,####} prevents 1234 from being output as 1,234 in the English locale.
 #. If you want the digit separator in your locale, translate as {0}.
 #. alternates: msec, msecs
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1092
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1141
 #, java-format
 msgid "1 ms"
 msgid_plural "{0,number,####} ms"
@@ -36,8 +36,7 @@ msgstr[1] "{0,number,####} ms"
 #. seconds
 #. Note to translators: quantity will always be greater than one.
 #. alternates: secs, sec. 'seconds' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1097
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:354
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1146
 #, java-format
 msgid "1 sec"
 msgid_plural "{0} sec"
@@ -47,7 +46,7 @@ msgstr[1] "{0} s"
 #. minutes
 #. Note to translators: quantity will always be greater than one.
 #. alternates: mins, min. 'minutes' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1102
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1151
 #, java-format
 msgid "1 min"
 msgid_plural "{0} min"
@@ -57,42 +56,42 @@ msgstr[1] "{0} min"
 #. hours
 #. Note to translators: quantity will always be greater than one.
 #. alternates: hrs, hr., hrs.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1107
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1156
 #, java-format
 msgid "1 hour"
 msgid_plural "{0} hours"
 msgstr[0] "1 uur"
 msgstr[1] "{0} uren"
 
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1109
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1158
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:314
 msgid "n/a"
 msgstr "nvt"
 
 #. days
 #. Note to translators: quantity will always be greater than one.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1113
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1162
 #, java-format
 msgid "1 day"
 msgid_plural "{0} days"
 msgstr[0] "1 dag"
 msgstr[1] "{0} dagen"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:126
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:122
 #, java-format
 msgid "Banned by router hash: {0}"
 msgstr "Verbannen wegens router hash: {0}"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:128
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:124
 msgid "Banned by router hash"
 msgstr "Verbannen wegens router hash"
 
 #. Temporary reason, until the job finishes
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:673
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:669
 msgid "IP banned"
 msgstr "IP verbannen"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:743
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:739
 #, java-format
 msgid "IP banned by blocklist.txt entry {0}"
 msgstr "IP verbannen wegens blocklist.txt item {0}"
@@ -146,44 +145,43 @@ msgstr "Tunnels geaccepteerd"
 msgid "Rejecting tunnels"
 msgstr "Tunnels geweigerd"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:68
-msgid ""
-"Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href="
-"\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" href="
-"\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually."
-msgstr ""
-"Controlleer of uitgaand HTTP verkeer niet geblokkeerd wordt, kijk in de <a "
-"target=\"_top\" href=\"logs.jsp\">logs</a> en wanneer niets anders helpt, "
-"zie de <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> over "
-"handmatig reseeden."
-
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:101
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:125
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
 msgid "Reseeding"
 msgstr "Reseeden"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:124
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:141
 #, java-format
 msgid "Reseed fetched only 1 router."
 msgid_plural "Reseed fetched only {0} routers."
 msgstr[0] "Reseed heeft slechts 1 router opgehaald."
 msgstr[1] "Reseed heeft slechts {0} routers opgehaald."
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:131
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:148
 msgid "Reseed failed."
 msgstr "Reseed gefaald"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:232
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:149
+#, java-format
+msgid "See {0} for help."
+msgstr "Zie {0} voor hulp."
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150
+msgid "reseed configuration page"
+msgstr "reseed configuratie pagina"
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:293
 msgid "Reseeding: fetching seed URL."
 msgstr "Reseed: opvragen seed URL."
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:273
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:335
 #, java-format
 msgid ""
 "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
 msgstr ""
 "Reseeden: opvragen router info van seed URL ({0} succesvol, {1} fouten)."
 
-#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:510
+#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512
 msgid "NetDb entry"
 msgstr "NetDd item"
 
@@ -192,24 +190,25 @@ msgstr "NetDd item"
 msgid "No transports (hidden or starting up?)"
 msgstr "Geen transport (verborgen of aan het opstarten?)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:451
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450
 msgid "Unreachable on any transport"
 msgstr "Onbereikbaar op alle transports"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:500
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499
 msgid "Router Transport Addresses"
 msgstr "Router Transport Adressen"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:505
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504
 #, java-format
 msgid "{0} is used for outbound connections only"
 msgstr "{0} is alleen gebruikt voor uitgaande connecties"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129
 msgid "Help"
 msgstr "Help"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519
 msgid ""
 "Your transport connection limits are automatically set based on your "
 "configured bandwidth."
@@ -217,105 +216,105 @@ msgstr ""
 "De limieten van je transport verbinding zijn automatisch ingesteld gebaseerd "
 "op de geconfigureerde bandbreedte."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:522
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521
 msgid ""
 "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and "
 "i2np.udp.maxConnections=nnn on the advanced configuration page."
 msgstr ""
-"Om deze limieten te overschrijven, voeg dan de instelling "
-"i2np.ntcp.maxConnections=nnn en i2np.udp.maxConnections=nnn toe aan de "
-"geavanceerde configuratie pagina."
+"Om deze limieten te overschrijven, voeg dan de instelling i2np.ntcp."
+"maxConnections=nnn en i2np.udp.maxConnections=nnn toe aan de geavanceerde "
+"configuratie pagina."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
 msgid "Definitions"
 msgstr "Definities"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:715
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:735
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
 msgid "Peer"
 msgstr "Peer"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
 msgid "The remote peer, identified by router hash"
 msgstr "De remote peer, geïdentificeerd door de router hash"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:716
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:736
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
 msgid "Dir"
 msgstr "Richting"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
 msgid "Inbound connection"
 msgstr "Inkomende connectie"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
 msgid "Outbound connection"
 msgstr "Uitgaande connectie"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
 msgid "They offered to introduce us (help other peers traverse our firewall)"
 msgstr ""
 "Ze hebben aangeboden ons te introduceren (helpt andere peers om door onze "
 "firewall te komen)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532
 msgid "We offered to introduce them (help other peers traverse their firewall)"
 msgstr ""
 "We hebben aangeboden ze te introduceren (helpt andere peers om door hun "
 "firewall te komen)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
 msgid "How long since a packet has been received / sent"
 msgstr "Hoe lang sinds een pakket ontvangen / verstuurd is"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:717
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
 msgid "Idle"
 msgstr "Idle"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:718
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1897
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "In/Out"
 msgstr "In/Uit"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)"
 msgstr ""
 "De afgevlakte inkomende / uitgaande overdrachtsnelheid (KBytes per seconde)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
 msgid "How long ago this connection was established"
 msgstr "Hoe lang sinds deze connectie is gemaakt"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:719
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1902
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905
 msgid "Up"
 msgstr "Up"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:720
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1904
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907
 msgid "Skew"
 msgstr "Afwijking"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
 msgid "The difference between the peer's clock and your own"
 msgstr "Het verschil tussen de klok van de peer en je eigen"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
 msgid ""
 "The congestion window, which is how many bytes can be sent without an "
 "acknowledgement"
@@ -323,42 +322,42 @@ msgstr ""
 "Het congestion window, hoeveel bytes verzonden kunnen worden zonder een "
 "bevestiging"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
 msgid "The number of sent messages awaiting acknowledgement"
 msgstr "Het aantal verzonden berichten, wachtend op bevestiging"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
 msgid "The maximum number of concurrent messages to send"
 msgstr "Het maximum aantal berichten om gelijktijdig te verzenden"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
 msgid "The number of pending sends which exceed congestion window"
 msgstr ""
 "Het aantal wachtende uitgaande berichten dat het congestion window "
 "overschrijdt"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
 msgid "The slow start threshold"
 msgstr "De vertraagde-start drempel"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
 msgid "The round trip time in milliseconds"
 msgstr "De rondgangstijd in milliseconden"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1914
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917
 msgid "Dev"
 msgstr "SD"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
 msgid "The standard deviation of the round trip time in milliseconds"
 msgstr "De standaarddeviatie van de rondgangstijd in milliseconden"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
 msgid "The retransmit timeout in milliseconds"
 msgstr "De herzend time-out in milliseconden"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
 msgid ""
 "Current maximum send packet size / estimated maximum receive packet size "
 "(bytes)"
@@ -366,41 +365,41 @@ msgstr ""
 "Huidige maximum verzonden pakket grootte / verwachte maximimum ontvangen "
 "pakket grootte (bytes)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:721
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
 msgid "TX"
 msgstr "TX"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
 msgid "The total number of packets sent to the peer"
 msgstr "Het totaal aantal pakketten verzonden aan de peer"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:722
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
 msgid "RX"
 msgstr "RX"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
 msgid "The total number of packets received from the peer"
 msgstr "Het totaal aantal ontvangen pakketten van de peer"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929
 msgid "Dup TX"
 msgstr "Dup TX"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
 msgid "The total number of packets retransmitted to the peer"
 msgstr "Het totaal aantal pakketten dat opnieuw is verzonden aan de peer"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1928
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931
 msgid "Dup RX"
 msgstr "Dup RX"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
 msgid "The total number of duplicate packets received from the peer"
 msgstr "Het totaal aantal pakketten dat dubbel is ontvangen van de peer"
 
@@ -410,174 +409,175 @@ msgstr "Het totaal aantal pakketten dat dubbel is ontvangen van de peer"
 msgid "Excessive clock skew: {0}"
 msgstr "Te grote klok afwijking: {0}"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:710
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:730
 msgid "NTCP connections"
 msgstr "NTCP connecties"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:711
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1883
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:731
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886
 msgid "Limit"
 msgstr "Limiet"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:712
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1884
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
 msgid "Timeout"
 msgstr "Time-out"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:723
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743
 msgid "Out Queue"
 msgstr "Uitgaande wachtrij"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:724
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744
 msgid "Backlogged?"
 msgstr "In achterstand?"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1946
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
 msgid "Inbound"
 msgstr "Inkomend"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1948
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
 msgid "Outbound"
 msgstr "Uitgaand"
 
 #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:787
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:807
 msgid "peers"
 msgstr "peers"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1882
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885
 msgid "UDP connections"
 msgstr "UDP connecties"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1889
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892
 msgid "Sort by peer hash"
 msgstr "Gesorteerd op peer hash"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
 msgid "Direction/Introduction"
 msgstr "Richting/Introductie"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
 msgid "Sort by idle inbound"
 msgstr "Gesorteerd op idle inkomend"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
 msgid "Sort by idle outbound"
 msgstr "Gesorteerd op idle uitgaand"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
 msgid "Sort by inbound rate"
 msgstr "Gesorteerd op inkomende snelheid"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903
 msgid "Sort by outbound rate"
 msgstr "Gesorteerd op uitgaande snelheid"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
 msgid "Sort by connection uptime"
 msgstr "Gesorteerd op uptime van de connectie"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
 msgid "Sort by clock skew"
 msgstr "Gesorteerd op klok afwijking"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911
 msgid "Sort by congestion window"
 msgstr "Gesorteerd op congestion window"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1910
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913
 msgid "Sort by slow start threshold"
 msgstr "Gesorteerd op vertraagde-start drempel"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916
 msgid "Sort by round trip time"
 msgstr "Gesorteerd op rondgangstijd"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1915
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
 msgid "Sort by round trip time deviation"
 msgstr "Gesorteerd op rondgangstijd afwijking"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920
 msgid "Sort by retransmission timeout"
 msgstr "Gesorteerd op herzendings time-out"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923
 msgid "Sort by outbound maximum transmit unit"
 msgstr "Gesorteerd op uitgaande maximum verzend unit"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1922
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
 msgid "Sort by packets sent"
 msgstr "Gesorteerd op verzonden pakketten"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
 msgid "Sort by packets received"
 msgstr "Gesorteerd op ontvangen pakketten"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930
 msgid "Sort by packets retransmitted"
 msgstr "Gesorteerd op herzonden pakketten"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932
 msgid "Sort by packets received more than once"
 msgstr "Gesorteerd op meerdere keren ontvangen pakketten"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1950
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953
 msgid "We offered to introduce them"
 msgstr "We hebben aangeboden ze te introduceren"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1952
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955
 msgid "They offered to introduce us"
 msgstr "Zij hebben aangeboden ons te introduceren"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1956
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959
 msgid "Choked"
 msgstr "Verstikt"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1964
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967
 msgid "1 fail"
 msgstr "1 gefaald"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1966
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969
 #, java-format
 msgid "{0} fails"
 msgstr "{0} gefaald"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1972
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162
 msgid "Banned"
 msgstr "Verbannen"
 
 #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2103
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106
 msgid "SUMMARY"
 msgstr "SAMENVATTING"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:145
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124
 msgid "Dropping tunnel requests: Too slow"
 msgstr "Negeer tunnel aanvragen: Te traag"
 
 #. don't even bother, since we are so overloaded locally
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:352
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267
 msgid "Dropping tunnel requests: Overloaded"
 msgstr "Negeer tunnel aanvragen: Overladen"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:525
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:470
 msgid "Rejecting tunnels: Request overload"
 msgstr "Weiger tunnels: Overladen met aanvragen"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:550
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:495
 msgid "Rejecting tunnels: Connection limit"
 msgstr "Weiger tunnels: Connectie limiet"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:744
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:695
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:716
 msgid "Dropping tunnel requests: High load"
 msgstr "Negeer tunnel aanvragen: Hoge load"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:753
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:708
 msgid "Dropping tunnel requests: Queue time"
 msgstr "Negeer tunnel aanvragen: Wachttijd"
 
@@ -1507,11 +1507,12 @@ msgstr "Zambia"
 msgid "Zimbabwe"
 msgstr "Zimbabwe"
 
-#: ../java/src/net/i2p/router/web/CSSHelper.java:57
+#: ../java/src/net/i2p/router/web/CSSHelper.java:60
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37
 #: ../java/strings/Strings.java:29
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:233
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:125
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:257
 msgid "I2P Router Console"
 msgstr "I2P Router Console"
 
@@ -1533,246 +1534,255 @@ msgstr ""
 "Fout bij opslaan van de configuratie (toegepast, maar niet opgeslagen) - "
 "kijk in de fout logs"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:34
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:335
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:355
 msgid "Save Client Configuration"
 msgstr "Client Configuratie Opslaan"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:38
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427
+msgid "Save Interface Configuration"
+msgstr "Interface Configuratie Opslaan"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:441
 msgid "Save WebApp Configuration"
 msgstr "WebApp Configuratie Opslaan"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:42
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:453
 msgid "Save Plugin Configuration"
 msgstr "Plugin Configuratie Opslaan"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:46
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461
 msgid "Install Plugin"
 msgstr "Installeer Plugin"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87
 #, java-format
 msgid "Deleted plugin {0}"
 msgstr "Plugin {0} verwijderd"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:84
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89
 #, java-format
 msgid "Error deleting plugin {0}"
 msgstr "Fout bij verwijderen plugin {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:96
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101
 #, java-format
 msgid "Stopped plugin {0}"
 msgstr "Plugin {0} gestopt"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:98
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103
 #, java-format
 msgid "Error stopping plugin {0}"
 msgstr "Fout bij stoppen plugin {0}"
 
 #. label (IE)
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:119
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:189
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255
 msgid "Start"
 msgstr "Start"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:138
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33
 msgid "Unsupported"
 msgstr "Niet ondersteund"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:184
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189
 msgid "New client added"
 msgstr "Nieuwe client toegevoegd"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:188
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193
 msgid ""
 "Client configuration saved successfully - restart required to take effect."
-msgstr "Client configuratie succesvol opgeslagen - herstart nodig"
+msgstr "Client configuratie succesvol opgeslagen - herstart nodig."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:202
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:213
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
 msgid "Bad client index."
 msgstr "Foute client index."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:379
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:392
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:384
 msgid "Client"
 msgstr "Client"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
 msgid "started"
 msgstr "gestart"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
 msgid "deleted"
 msgstr "verwijderd"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:235
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240
 msgid "WebApp configuration saved."
 msgstr "WebApp configuratie opgeslagen."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:251
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256
 msgid "Plugin configuration saved."
 msgstr "Plugin configuratie opgeslagen."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
 msgid "WebApp"
 msgstr "WebApp"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:268
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273
 msgid "Failed to start"
 msgstr "Gefaald te starten"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278
 msgid "Failed to find server."
 msgstr "Gefaald om server te vinden."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:279
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284
 msgid "No plugin URL specified."
 msgstr "Geen plugin URL gespecificeerd."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:289
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294
 #, java-format
 msgid "No update URL specified for {0}"
 msgstr "Geen update URL gespecificeerd voor {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:297
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:315
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325
 msgid "Plugin or update download already in progress."
 msgstr "Plugin of update download is reeds bezig."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:306
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311
 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118
 #, java-format
 msgid "Downloading plugin from {0}"
 msgstr "Downloaden plugin van {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:324
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329
 #, java-format
 msgid "Checking plugin {0} for updates"
 msgstr "Controlleer plugin {0} voor updates"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:334
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339
 #, java-format
 msgid "Started plugin {0}"
 msgstr "Plugin {0} gestart"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:336
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341
 #, java-format
 msgid "Error starting plugin {0}"
 msgstr "Fout bij starten plugin {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:21
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:192
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376
+msgid ""
+"Interface configuration saved successfully - restart required to take effect."
+msgstr "Interface configuratie succesvol opgeslagen - herstart nodig."
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258
 msgid "Edit"
 msgstr "Bewerk"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:30
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351
 msgid "Add Client"
 msgstr "Client Toevoegen"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
 msgid "Class and arguments"
 msgstr "Class en argumenten"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Control"
 msgstr "Controlle"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Run at Startup?"
 msgstr "Start bij opstarten?"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:131
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197
 msgid "Description"
 msgstr "Omschrijving"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Plugin"
 msgstr "Plugin"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:95
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185
 msgid "Version"
 msgstr "Versie"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:97
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163
 msgid "Signed by"
 msgstr "Ondertekend door"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:114
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180
 msgid "Date"
 msgstr "Datum"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:120
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186
 msgid "Author"
 msgstr "Auteur"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:136
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202
 msgid "License"
 msgstr "Licentie"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:141
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207
 msgid "Website"
 msgstr "Website"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212
 msgid "Update link"
 msgstr "Update link"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:194
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260
 msgid "Stop"
 msgstr "Stop"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:196
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:81
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:313
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331
 msgid "Check for updates"
 msgstr "Controlleer op updates"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:242
 msgid "Update"
 msgstr "Update"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268
 #, java-format
 msgid "Are you sure you want to delete {0}?"
 msgstr "Weet je zeker dat je {0} wilt verwijderen?"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:204
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270
 msgid "Delete"
 msgstr "Verwijder"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:343
 msgid "Add key"
 msgstr "Sleutel toevoegen"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:341
 msgid "Delete key"
 msgstr "Steutel verwijderen"
 
@@ -1876,7 +1886,7 @@ msgstr "Service"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381
 #: ../java/strings/Strings.java:72
 msgid "Tunnels"
 msgstr "Tunnels"
@@ -1890,7 +1900,7 @@ msgid "Clients"
 msgstr "Clients"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:293
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315
 msgid "Keyring"
 msgstr "Sleutelbos"
 
@@ -1900,13 +1910,13 @@ msgstr "Logging"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255
 #: ../java/strings/Strings.java:67
 msgid "Peers"
 msgstr "Peers"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:389
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143
 msgid "Stats"
 msgstr "Statistieken"
@@ -1917,13 +1927,15 @@ msgstr "Geavanceerd"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:360
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:341
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:377
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:397
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:362
 msgid "Save changes"
 msgstr "Opslaan"
 
@@ -2009,25 +2021,25 @@ msgstr "Updaten van bandbreedte share percentage"
 msgid "Updated bandwidth limits"
 msgstr "Updaten van bandbreedte limieten"
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:39
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:47
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:50
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:57
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:60
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62
 msgid "unknown"
 msgstr "ombekend"
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:169
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172
 msgid "bits per second"
 msgstr "bits per seconde"
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:170
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173
 #, java-format
 msgid "or {0} bytes per month maximum"
 msgstr "of {0} bytes per maand maximaal"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:333
 msgid "Ban peer until restart"
 msgstr "Verban peer tot aan herstart"
 
@@ -2047,7 +2059,7 @@ msgid "Invalid peer"
 msgstr "Ongeldige peer"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335
 msgid "Unban peer"
 msgstr "Hef verbanning van peer op"
 
@@ -2060,7 +2072,7 @@ msgid "is not currently banned"
 msgstr "is op dit moment niet verbannen"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:361
 msgid "Adjust peer bonuses"
 msgstr "Peer bonussen aanpassen"
 
@@ -2072,10 +2084,28 @@ msgstr "Foutieve snelheids waarde"
 msgid "Bad capacity value"
 msgstr "Foutieve capaciteits waarde"
 
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:368
+msgid "Save changes and reseed now"
+msgstr "Sla wijzigingen op en reseed nu"
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21
+msgid "Reseeding is already in progress"
+msgstr "Reseeden is reeds bezig"
+
+#. skip the nonce checking in ReseedHandler
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24
+msgid "Starting reseed process"
+msgstr "Reseed proces aan het starten"
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66
+msgid "Configuration saved successfully."
+msgstr "Configuratie succesvol opgeslagen."
+
 #. Normal browsers send value, IE sends button label
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:293
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:311
 msgid "Shutdown immediately"
 msgstr "Onmiddelijk afsluiten"
 
@@ -2122,7 +2152,7 @@ msgid "Restart in {0}"
 msgstr "Herstart in {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309
 msgid "Shutdown gracefully"
 msgstr "Gecontrolleerd afsluiten"
 
@@ -2135,7 +2165,7 @@ msgid "Shutdown immediately!  boom bye bye bad bwoy"
 msgstr "Onmiddelijk afsluiten! doei"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:313
 msgid "Cancel graceful shutdown"
 msgstr "Annuleer gecontrolleerde stop"
 
@@ -2144,7 +2174,7 @@ msgid "Graceful shutdown cancelled"
 msgstr "Gecontrolleerd afsluiten afgebroken"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325
 msgid "Graceful restart"
 msgstr "Gecontrolleerde herstart"
 
@@ -2153,7 +2183,7 @@ msgid "Graceful restart requested"
 msgstr "Gecontrolleerde herstart aangevraagd"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327
 msgid "Hard restart"
 msgstr "Harde herstart"
 
@@ -2178,79 +2208,51 @@ msgid "Rekeying after graceful shutdown"
 msgstr "Hersleuteling na gecontrolleerde stop"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353
 msgid "Run I2P on startup"
 msgstr "Start I2P bij opstarten"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355
 msgid "Don't run I2P on startup"
 msgstr "Start I2P niet bij opstarten"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:373
 msgid "Dump threads"
 msgstr "Dump threads"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323
-msgid "Show systray icon"
-msgstr "Toon systray icon"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
-msgid "System tray icon enabled."
-msgstr "System tray icon ingeschakeld."
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110
-msgid "System tray icon feature not supported on this platform. Sorry!"
-msgstr "System tray icon feature not ondersteund op dit platform. Sorry!"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
-msgid "Warning: unable to contact the systray manager"
-msgstr "Waarschuwing: kan geen verbinding maken met de systray manager"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325
-msgid "Hide systray icon"
-msgstr "Verberg systray icon"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108
-msgid "System tray icon disabled."
-msgstr "System tray icon uitgeschakeld."
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:381
 msgid "View console on startup"
 msgstr "Toon console na opstarten"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93
 msgid "Console is to be shown on startup"
 msgstr "Console wordt getoond na opstarten"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:383
 msgid "Do not view console on startup"
 msgstr "Toon console niet na opstarten"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
 msgid "Console is not to be shown on startup"
 msgstr "De console wordt niet getoond na opstarten"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105
 msgid "Service installed"
 msgstr "Service geinstalleerd"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107
 msgid "Warning: unable to install the service"
 msgstr "Waarschuwing: kan de service niet installeren"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
 msgid "Service removed"
 msgstr "Service verwijderd"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
 msgid "Warning: unable to remove the service"
 msgstr "Waarschuwing: kan de service niet verwijderen"
 
@@ -2304,58 +2306,58 @@ msgid_plural "{0} tunnels"
 msgstr[0] "1 tunnel"
 msgstr[1] "{0} tunnels"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
 msgid "Exploratory tunnels"
 msgstr "Exploratory tunnels"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61
-msgid "Client tunnels for"
-msgstr "Client tunnels voor"
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:51
+#, java-format
+msgid "Client tunnels for {0}"
+msgstr "Client tunnels voor {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
 msgid "ANONYMITY WARNING - Settings include 0-hop tunnels."
 msgstr "ANONIMITEITS WAARSCHUWING - Instellingen bevatten 0-hop tunnels."
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:79
 msgid "ANONYMITY WARNING - Settings include 1-hop tunnels."
 msgstr "ANONIMITEITS WAARSCHUWING - Instellingen bevatten 1-hop tunnels."
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
 msgid "PERFORMANCE WARNING - Settings include very long tunnels."
 msgstr "PRESTATIE WAARSCHUWING - Instellingen bevatten erg lange tunnels."
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:85
 msgid "PERFORMANCE WARNING - Settings include high tunnel quantities."
 msgstr "PRESTATIE WAARSCHUWING - Instellingen bevatten hoge tunnel aantallen."
 
 #. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n");
 #. tunnel depth
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:92
 msgid "Length"
 msgstr "Lengte"
 
 #. tunnel depth variance
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:109
 msgid "Randomization"
 msgstr "Randomisatie"
 
 #. tunnel quantity
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:133
 msgid "Quantity"
 msgstr "Hoeveelheid"
 
 #. tunnel backup quantity
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:150
 msgid "Backup quantity"
 msgstr "Backup hoeveelheid"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:172
 msgid "Inbound options"
 msgstr "Inkomende opties"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:185
 msgid "Outbound options"
 msgstr "Uitgaande opties"
 
@@ -2368,87 +2370,91 @@ msgid "Refresh the page to view."
 msgstr "Ververs de te bekijken pagina."
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+msgid "Arabic"
+msgstr "Arabisch"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "English"
 msgstr "Engels"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "French"
 msgstr "Frans"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "German"
 msgstr "Duits"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "Spanish"
 msgstr "Spaans"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Dutch"
 msgstr "Nederlands"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Portuguese"
 msgstr "Portugees"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Russian"
 msgstr "Russies"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
 msgid "Chinese"
 msgstr "Chinees"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
 msgid "Swedish"
 msgstr "Zweeds"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:88
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:85
 msgid "Update available, attempting to download now"
 msgstr "Update beschikbaar, probeer nu te downloaden"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:90
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:87
 msgid "Update available, click button on left to download"
 msgstr "Update beschikbaar, klik op de linker knop om te downloaden"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:96
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:93
 msgid "No update available"
 msgstr "Geen update beschikbaar"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:104
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:101
 msgid "Updating news URL to"
 msgstr "Updaten nieuws URL in"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:109
 msgid "Updating proxy host to"
 msgstr "Updaten proxy host in"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:120
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:117
 msgid "Updating proxy port to"
 msgstr "Updaten proxy poort in"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:133
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:130
 msgid "Updating refresh frequency to"
 msgstr "Updaten vernieuw frequentie in"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:140
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:137
 msgid "Updating update policy to"
 msgstr "Updaten update regels in"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:149
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:146
 msgid "Updating update URLs."
 msgstr "Updaten update URLs."
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:158
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:155
 msgid "Updating trusted keys."
 msgstr "Updaten vertrouwde sleutels."
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:166
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:163
 msgid "Updating unsigned update URL to"
 msgstr "Updaten niet-ondertekende update URL in"
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88
-#: ../java/src/net/i2p/router/web/GraphHelper.java:148
+#: ../java/src/net/i2p/router/web/GraphHelper.java:167
 msgid "Never"
 msgstr "Nooit"
 
@@ -2468,7 +2474,7 @@ msgstr "Download en alleen controlleren"
 msgid "Download, verify, and restart"
 msgstr "Download, controlleer en herstart"
 
-#: ../java/src/net/i2p/router/web/FormHandler.java:174
+#: ../java/src/net/i2p/router/web/FormHandler.java:176
 msgid ""
 "Invalid form submission, probably because you used the 'back' or 'reload' "
 "button on your browser. Please resubmit."
@@ -2476,80 +2482,68 @@ msgstr ""
 "Ongeldig formulier verzonden, mogelijk omdat je de 'terug' of 'vernieuw' "
 "knop in je browser hebt gebruikt. Probeer opnieuw te verzenden."
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:87
+#: ../java/src/net/i2p/router/web/GraphHelper.java:93
 msgid "Combined bandwidth graph"
 msgstr "Gecombineerde bandbreedte grafiek"
 
 #. e.g. "statname for 60m"
-#: ../java/src/net/i2p/router/web/GraphHelper.java:101
+#: ../java/src/net/i2p/router/web/GraphHelper.java:107
 #, java-format
 msgid "{0} for {1}"
 msgstr "{0} voor {1}"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
+#: ../java/src/net/i2p/router/web/GraphHelper.java:146
 msgid "Configure Graph Display"
 msgstr "Configureer Grafiek Weergave"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
+#: ../java/src/net/i2p/router/web/GraphHelper.java:146
 msgid "Select Stats"
 msgstr "Selecteer Statistieken"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:142
+#: ../java/src/net/i2p/router/web/GraphHelper.java:150
 msgid "Periods"
 msgstr "Perioden"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:143
+#: ../java/src/net/i2p/router/web/GraphHelper.java:151
 msgid "Plot averages"
 msgstr "Teken gemiddelden"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:144
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333
+#: ../java/src/net/i2p/router/web/GraphHelper.java:152
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:351
 msgid "or"
 msgstr "of"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:144
+#: ../java/src/net/i2p/router/web/GraphHelper.java:152
 msgid "plot events"
 msgstr "teken gebeurtenissen"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:145
+#: ../java/src/net/i2p/router/web/GraphHelper.java:153
 msgid "Image sizes"
 msgstr "Afbeelding grootte"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:145
+#: ../java/src/net/i2p/router/web/GraphHelper.java:153
 msgid "width"
 msgstr "breedte"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:146
+#: ../java/src/net/i2p/router/web/GraphHelper.java:154
 msgid "height"
 msgstr "hoogte"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:146
-#: ../java/src/net/i2p/router/web/GraphHelper.java:147
+#: ../java/src/net/i2p/router/web/GraphHelper.java:154
+#: ../java/src/net/i2p/router/web/GraphHelper.java:155
 msgid "pixels"
 msgstr "pixels"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:148
+#: ../java/src/net/i2p/router/web/GraphHelper.java:156
 msgid "Refresh delay"
 msgstr "Ververs vertraging"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:148
-msgid "hour"
-msgstr "uur"
-
-#: ../java/src/net/i2p/router/web/GraphHelper.java:148
-msgid "minute"
-msgstr "minuut"
-
-#: ../java/src/net/i2p/router/web/GraphHelper.java:148
-msgid "minutes"
-msgstr "minuten"
-
-#: ../java/src/net/i2p/router/web/GraphHelper.java:149
+#: ../java/src/net/i2p/router/web/GraphHelper.java:171
 msgid "Redraw"
 msgstr "Vernieuw"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:181
+#: ../java/src/net/i2p/router/web/GraphHelper.java:203
 msgid "Graph settings saved"
 msgstr "Grafiek instellingen opgeslagen"
 
@@ -2652,96 +2646,96 @@ msgstr "Bekijk alle routers"
 msgid "Show all routers with full stats"
 msgstr "Bekijk alle routers met volledige statistieken"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266
 msgid "Network Database Router Statistics"
 msgstr "Netwerk Database Router Statistieken"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
 msgid "Count"
 msgstr "Aantal"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
 msgid "Transports"
 msgstr "Transports"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
 msgid "Country"
 msgstr "Land"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
 msgid "Our info"
 msgstr "Onze info"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346
 msgid "Peer info for"
 msgstr "Peer info voor"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350
 msgid "Full entry"
 msgstr "Volledige item"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:110
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:115
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
 msgid "Hidden"
 msgstr "Verborgen"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
 msgid "Updated"
 msgstr "Geupdate"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:355
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360
 #, java-format
 msgid "{0} ago"
 msgstr "{0} geleden"
 
 #. shouldnt happen
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
 msgid "Published"
 msgstr "Gepubliceerd"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365
 msgid "Address(es)"
 msgstr "Adres(sen)"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378
 msgid "cost"
 msgstr "kosten"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "Hidden or starting up"
 msgstr "Verborgen of aan het opstarten"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "SSU"
 msgstr "SSU"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "SSU with introducers"
 msgstr "SSU met introducers"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP"
 msgstr "NTCP"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP and SSU"
 msgstr "NTCP en SSU"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP and SSU with introducers"
 msgstr "NTCP en SSU met introducers"
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:93
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:92
 #, java-format
 msgid "News last updated {0} ago."
 msgstr "Nieuws {0} geleden voor het laatste geupdate."
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:99
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:98
 #, java-format
 msgid "News last checked {0} ago."
 msgstr "Nieuws {0} geleden voor het laatste gecontrolleerd."
@@ -2776,71 +2770,71 @@ msgid "Downloading plugin"
 msgstr "Downloaden van plugin"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:185
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:245
 #, java-format
 msgid "{0}B transferred"
 msgstr "{0}B ontvangen"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:152
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153
 msgid "Plugin downloaded"
 msgstr "Plugin gedownload"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:157
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:344
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356
 #, java-format
 msgid "Cannot create plugin directory {0}"
 msgstr "Kan plugin directory {0} niet maken"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:166
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:226
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:299
 #, java-format
 msgid "from {0}"
 msgstr "van {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:176
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177
 #, java-format
 msgid "Plugin from {0} is corrupt"
 msgstr "Plugin van {0} is corrupt"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:187
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188
 #, java-format
 msgid "Plugin from {0} does not contain the required configuration file"
 msgstr "Plugin van {0} bevat niet het vereiste configuratie bestand"
 
 #. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:200
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201
 #, java-format
 msgid "Plugin from {0} contains an invalid key"
 msgstr "Plugin van {0} bevat een ongeldige sleutel"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:219
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:228
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:237
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249
 #, java-format
 msgid "Plugin signature verification of {0} failed"
 msgstr "Plugin handtekening verificatie van {0} gefaald"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:252
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264
 #, java-format
 msgid "Plugin from {0} has invalid name or version"
 msgstr "Plugin van {0} heeft ingeldige naam of versie"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:257
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269
 #, java-format
 msgid "Plugin {0} has mismatched versions"
 msgstr "Plugin {0} heeft een verkeerde combinatie van versies"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:265
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277
 #, java-format
 msgid "This plugin requires I2P version {0} or higher"
 msgstr "Deze plugin heeft I2P versie {0} of hoger nodig"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:273
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285
 #, java-format
 msgid "This plugin requires Java version {0} or higher"
 msgstr "Deze plugin heeft Java versie {0} of hoger nodig"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:281
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
 msgid ""
 "Downloaded plugin is for new installs only, but the plugin is already "
 "installed"
@@ -2848,68 +2842,68 @@ msgstr ""
 "De gedownloaded plugin is alleen voor nieuwe installaties, maar de plugin is "
 "al geïnstalleerd"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305
 msgid "Installed plugin does not contain the required configuration file"
 msgstr "De geïnstalleerde plugin bevat het vereiste configuratie bestand niet"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:301
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313
 msgid "Signature of downloaded plugin does not match installed plugin"
 msgstr ""
 "De handtekening van de gedownloade plugin komt niet overeen met de "
 "geïnstalleerde plugin"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:308
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320
 #, java-format
 msgid "Downloaded plugin version {0} is not newer than installed plugin"
 msgstr ""
 "De gedownloade plugin versie {0} is niet nieuwer dan de geïnstalleerde plugin"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:315
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or higher"
 msgstr "Plugin update vereist de installatie van plugin versie {0} of hoger"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:322
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or lower"
 msgstr "Plugin update vereist de installatie van plugin versie {0} of lager"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:339
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351
 msgid "Plugin is for upgrades only, but the plugin is not installed"
 msgstr ""
 "De plugin is alleen voor upgrades, maar de plugin is niet geïnstalleerd"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:352
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364
 #, java-format
 msgid "Failed to install plugin in {0}"
 msgstr "Installatie van plugin in {0} gefaald"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:359
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371
 #, java-format
 msgid "Plugin {0} installed, router restart required"
 msgstr "Plugin {0} geïnstalleerd, router herstart nodig"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:361
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373
 #, java-format
 msgid "Plugin {0} installed"
 msgstr "Plugin {0} geïnstalleerd"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:379
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391
 #, java-format
 msgid "Plugin {0} installed and started"
 msgstr "Plugin {0} geïnstalleerd en gestart"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:382
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394
 #, java-format
 msgid "Plugin {0} installed but failed to start, check logs"
 msgstr "Plugin {0} geïnstalleerd maar gefaald om te starten, kijk in de logs"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:384
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396
 #, java-format
 msgid "Plugin {0} installed but failed to start"
 msgstr "Plugin {0} geïnstalleerd maar gefaald om te starten"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406
 #, java-format
 msgid "Failed to download plugin from {0}"
 msgstr "Kan de plugin niet downloaden van {0}"
@@ -2920,37 +2914,43 @@ msgstr "Peer Profielen"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73
 #, java-format
-msgid "Showing {0} recent profiles."
-msgstr "Toon {0} recente profielen."
+msgid "Showing 1 recent profile."
+msgid_plural "Showing {0} recent profiles."
+msgstr[0] "1 recent profiel getoond."
+msgstr[1] "{0} recente profielen getoond."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75
 #, java-format
-msgid "Hiding {0} older profiles."
-msgstr "Verberg {0} oudere profielen."
+msgid "Hiding 1 older profile."
+msgid_plural "Hiding {0} older profiles."
+msgstr[0] "1 ouder profiel verborgen."
+msgstr[1] "{0} oudere profielen verborgen."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77
 #, java-format
-msgid "Hiding {0} standard profiles."
-msgstr "Verberg {0} standaard profielen."
+msgid "Hiding 1 standard profile."
+msgid_plural "Hiding {0} standard profiles."
+msgstr[0] "1 standaard profiel verborgen."
+msgstr[1] "{0} standaard profielen verborgen."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82
 msgid "Groups (Caps)"
 msgstr "Groupen (Caps)"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:353
 msgid "Speed"
 msgstr "Snelheid"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:339
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:357
 msgid "Capacity"
 msgstr "Capaciteit"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
 msgid "Integration"
 msgstr "Integratie"
 
@@ -2976,7 +2976,7 @@ msgid "Failing"
 msgstr "Gefaald"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282
 msgid "Integrated"
 msgstr "Geïntegreerd"
 
@@ -2989,109 +2989,109 @@ msgstr "Onbereikbaar"
 msgid "Test Fails"
 msgstr "Test Faalt"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177
 msgid "profile"
 msgstr "profiel"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186
 msgid "Floodfill and Integrated Peers"
 msgstr "Floodfill en Geïntegreerde Peers"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
 msgid "Caps"
 msgstr "Caps"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
 msgid "Integ. Value"
 msgstr "Integ. Waarde"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
 msgid "Last Heard About"
 msgstr "Laatst Vernomen Over"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
 msgid "Last Heard From"
 msgstr "Laatst Vernomen Van"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
 msgid "Last Good Send"
 msgstr "Laatste Goede Verzending"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
 msgid "Last Bad Send"
 msgstr "Laatste Foute Verzending"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
 msgid "10m Resp. Time"
 msgstr "10m Resp. Tijd"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
 msgid "1h Resp. Time"
 msgstr "1u Resp. Tijd"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
 msgid "1d Resp. Time"
 msgstr "1d Resp. Tijd"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
 msgid "Last Good Lookup"
 msgstr "Laatste Goede Lookup"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
 msgid "Last Bad Lookup"
 msgstr "Laatste Foute Lookup"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
 msgid "Last Good Store"
 msgstr "Laatste Goede Opslag"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
 msgid "Last Bad Store"
 msgstr "Laatste Foute Opslag"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203
 msgid "1h Fail Rate"
 msgstr "1u Fout Rato"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204
 msgid "1d Fail Rate"
 msgstr "1d Four Rato"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
 msgid "Thresholds"
 msgstr "Drempelwaarden"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
 msgid "fast peers"
 msgstr "snelle peers"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
 msgid "high capacity peers"
 msgstr "hoge capaciteits peers"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
 msgid " well integrated peers"
 msgstr " goed geïntegreerde peers"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
 msgid "as determined by the profile organizer"
 msgstr "zoals bepaald door de profiel organisator"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
 msgid "groups"
 msgstr "groepen"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
 msgid "capabilities in the netDb, not used to determine profiles"
 msgstr "capaciteiten in de netDb, niet gebruikt om profielen te bepalen"
 
 #. capabilities
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
 #: ../java/strings/Strings.java:81
 msgid "caps"
 msgstr "caps"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
 msgid ""
 "peak throughput (bytes per second) over a 1 minute period that the peer has "
 "sustained in a single tunnel"
@@ -3099,46 +3099,51 @@ msgstr ""
 "piek doorvoer (bytes per seconde) over een 1 minuut periode zoals de peer "
 "heeft ondervonden in een enkele tunnel"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
 msgid "speed"
 msgstr "snelheid"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
 msgid "capacity"
 msgstr "capaciteit"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
 msgid "how many tunnels can we ask them to join in an hour?"
 msgstr ""
 "hoeveel tunnels kunnen we ze vragen om zich in een uur bij aan te sluiten?"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
 msgid "how many new peers have they told us about lately?"
 msgstr "hoeveel nieuwe peers hebben ze ons recentelijk over verteld?"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
 msgid "integration"
 msgstr "integratie"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
 msgid "is the peer banned, or unreachable, or failing tunnel tests?"
 msgstr "is de peer verbannen, of onbereikbaar, of faalt het tunnel tests?"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
 msgid "status"
 msgstr "status"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:410
+msgid "none"
+msgstr "geen"
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:62
 #, java-format
 msgid "Temporary ban expiring in {0}"
 msgstr "Tijdelijke verbanning verloopt in {0}"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64
 #, java-format
 msgid "Banned until restart or in {0}"
 msgstr "Verbanning tot volgende herstart of in {0}"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:76
 msgid "unban now"
 msgstr "Hef verbanning nu op"
 
@@ -3195,22 +3200,23 @@ msgstr ""
 
 #: ../java/src/net/i2p/router/web/StatsGenerator.java:64
 msgid "These statistics are primarily used for development and debugging."
-msgstr "Deze statistieken worden primair gebruikt voor ontwikkeling en debugging."
+msgstr ""
+"Deze statistieken worden primair gebruikt voor ontwikkeling en debugging."
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:105
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:156
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:106
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:157
 msgid "No lifetime events"
 msgstr "Geen levenslange gebeurtenissen"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:116
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:117
 msgid "frequency"
 msgstr "frequentie"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:120
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:121
 msgid "Rolling average events per period"
 msgstr "Voortschrijdend gemiddelde gebeurtenissen per periode"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:124
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:125
 msgid "Highest events per period"
 msgstr "Hoogste gebeurtenissen per periode"
 
@@ -3221,58 +3227,73 @@ msgstr "Hoogste gebeurtenissen per periode"
 #. }
 #. 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
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:136
 msgid "Lifetime average events per period"
 msgstr "Levenslange gemiddelde gebeurtenissen per periode"
 
 #. Display the strict average
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:140
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:141
 msgid "Lifetime average frequency"
 msgstr "Levenslange gemiddelde frequentie"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:168
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:144
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:234
+#, java-format
+msgid "1 event"
+msgid_plural "{0} events"
+msgstr[0] "1 gebeurtenis"
+msgstr[1] "{0} gebeurtenissen"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:169
 msgid "rate"
 msgstr "rato"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:170
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:171
 msgid "Average"
 msgstr "Gemiddelde"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:173
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:174
 msgid "Highest average"
 msgstr "Hoogste gemiddelde"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:202
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:201
+#, java-format
+msgid "There was 1 event in this period."
+msgid_plural "There were {0} events in this period."
+msgstr[0] "Er was 1 gebeurtenis in deze periode."
+msgstr[1] "Er waren {0} gebeurtenissen in deze periode."
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:203
 #, java-format
-msgid "in this period which ended {0} ago."
-msgstr "in deze periode welke {0} geleden eindigde."
+msgid "The period ended {0} ago."
+msgstr "De periode eindigde {0} geleden."
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:204
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:205
 msgid "No events"
 msgstr "Geen gebeurtenissen"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:210
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:211
 msgid "Average event count"
 msgstr "Gemiddeld aantal gebeurtenissen"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:212
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:213
 msgid "Events in peak period"
 msgstr "Gebeurtenissen in piek periode"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:220
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:221
 msgid "Graph Data"
 msgstr "Grafiek Data"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:222
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:223
 msgid "Graph Event Count"
 msgstr "Grafiek Aantal Gebeurtenissen"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:225
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:226
 msgid "Export Data as XML"
 msgstr "Exporteer Data als XML"
 
 #. Display the strict average
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:230
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:231
 msgid "Lifetime average value"
 msgstr "Levenslange gemiddelde waarde"
 
@@ -3337,12 +3358,12 @@ msgid "I2P Internals"
 msgstr "I2P Intern"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379
 msgid "View existing tunnels and tunnel build status"
 msgstr "Bekijk bestaande tunnels en tunnel opbouw status"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253
 msgid "Show all current peer connections"
 msgstr "Toon alle huidige peer connecties"
 
@@ -3383,7 +3404,7 @@ msgid "Textual router performance statistics"
 msgstr "Tekstuele router prestatie statistieken"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:365
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:370
 msgid "Local Destinations"
 msgstr "Lokale Bestemmingen"
 
@@ -3431,206 +3452,208 @@ msgstr ""
 "Hulp bij het configureren van je firewall en router voor optimale I2P "
 "prestatie"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231
-msgid "Download"
-msgstr "Download"
+#. Note to translators: parameter is a version, e.g. "0.8.4"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:232
+#, java-format
+msgid "Download {0} Update"
+msgstr "Download {0} Update"
 
+#. Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC"
+#. <br> is optional, to help the browser make the lines even in the button
+#. If the translation is shorter than the English, you should probably not include <br>
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240
-msgid "Download Unsigned"
-msgstr "Download Niet-ondertekend"
+#, java-format
+msgid "Download Unsigned<br>Update {0}"
+msgstr "Download Niet-ondertekende <br> Update {0}"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261
 msgid "Active"
 msgstr "Actief"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270
 msgid "Fast"
 msgstr "Snel"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276
 msgid "High capacity"
 msgstr "Grote capaciteit"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288
 msgid "Known"
 msgstr "Bekend"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:308
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303
 msgid "Help with firewall configuration"
 msgstr "Hulp met firewall configuratie"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:310
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:305
 msgid "Check NAT/firewall"
 msgstr "Controlleer NAT/firewall"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:330
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:325
 msgid "Reseed"
 msgstr "Reseed"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:347
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:342
 msgid "Configure router bandwidth allocation"
 msgstr "Configureer router bandbreedte toewijzing"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:344
 msgid "Bandwidth in/out"
 msgstr "Bandbreedte in/uit"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:369
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:364
 msgid "Total"
 msgstr "Totaal"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:371
 msgid "Used"
 msgstr "Gebruikt"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:391
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386
 msgid "Exploratory"
 msgstr "Onderzoekend"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398
 msgid "Participating"
 msgstr "Deelnemend"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:409
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404
 msgid "Share ratio"
 msgstr "Share rato"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:410
 msgid "What's in the router's job queue?"
 msgstr "Wat is er in de taken wachtrij van de router?"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412
 msgid "Congestion"
 msgstr "Verstopping"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417
 msgid "Job lag"
 msgstr "Taak vertraging"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:428
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:423
 msgid "Message delay"
 msgstr "Bericht vertraging"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:434
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:429
 msgid "Tunnel lag"
 msgstr "Tunnel vertraging"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435
 msgid "Backlog"
 msgstr "Achterstand"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:101
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:106
 msgid "ERR-Client Manager I2CP Error - check logs"
 msgstr "ERR-Client Manager I2CP Fout - controlleer logs"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:108
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:113
 #, java-format
 msgid "ERR-Clock Skew of {0}"
 msgstr "ERR-Klok Afwijking van {0}"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:117
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:122
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
 msgid "OK"
 msgstr "OK"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:118
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:123
 msgid "ERR-Private TCP Address"
 msgstr "ERR-Privaat TCP Adres"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:120
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:125
 msgid "ERR-SymmetricNAT"
 msgstr "ERR-SymmetricNAT"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:123
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:128
 msgid "WARN-Firewalled with Inbound TCP Enabled"
 msgstr "WARN-Firewall met Inkomende TCP Ingeschakeld"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:125
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:130
 msgid "WARN-Firewalled and Floodfill"
 msgstr "WARN-Firewall en Floodfill"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:127
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:132
 msgid "WARN-Firewalled and Fast"
 msgstr "WARN-Firewall en Snel"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:128
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:133
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
 msgid "Firewalled"
 msgstr "Firewall"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:130
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:135
 msgid ""
 "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and "
 "restart"
 msgstr "ERR-UDP Poort in Gebruik"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:136
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:141
 msgid "ERR-No Active Peers, Check Network Connection and Firewall"
 msgstr "ERR-Geen Actieve Peers, Controlleer Network Connectie en Firewall"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:139
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:144
 msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
 msgstr "ERR-UDP Uitgeschakeld en Inkomende TCP host/poort niet gezet"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:141
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:146
 msgid "WARN-Firewalled with UDP Disabled"
 msgstr "WARN-Firewall met UDP Uitgeschakeld"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:143
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
 msgid "Testing"
 msgstr "Testen"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:365
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:370
 msgid "Add/remove/edit &amp; control your client and server tunnels"
 msgstr ""
 "Toevoegen/verwijderen/wijzigen &amp; beheer je client en server tunnels"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:377
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:382
 msgid "Server"
 msgstr "Server"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:381
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:386
 msgid "Show tunnels"
 msgstr "Toon tunnels"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:392
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:397
 msgid "Leases expired"
 msgstr "Leases verlopen"
 
 #. red or yellow light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:392
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:393
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:397
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:398
 msgid "Rebuilding"
 msgstr "Herbouwen"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:393
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:398
 msgid "ago"
 msgstr "geleden"
 
 #. green light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:396
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:401
 msgid "Ready"
 msgstr "Gereed"
 
 #. yellow light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:400
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
 msgid "Building"
 msgstr "Bouwen"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:400
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
 msgid "Building tunnels"
 msgstr "Tunnels aan het bouwen"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
-msgid "none"
-msgstr "geen"
-
 #. tunnel nicknames, taken from i2ptunnel.config so they will display
 #. nicely under 'local destinations' in the summary bar
 #. note that if the wording changes in i2ptunnel.config, we have to
 #. keep the old string here as well for existing installs
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:416
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:421
 #: ../java/strings/Strings.java:36
 msgid "shared clients"
 msgstr "gedeelde clients"
@@ -3660,10 +3683,14 @@ msgstr "nu"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:63
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:287
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:309
 msgid "configure"
 msgstr "configureer"
 
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61
+msgid "Client tunnels for"
+msgstr "Client tunnels voor"
+
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:65
 msgid "dead"
 msgstr "dood"
@@ -3788,59 +3815,70 @@ msgstr "Deelnemende Tunnels"
 msgid "Totals"
 msgstr "Totalen"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:132
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:145
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:178
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:143
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:238
 msgid "Updating"
 msgstr "Aan het updaten"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:189
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:214
+#. Process the .sud/.su2 file
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:117
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:262
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:287
 msgid "Update downloaded"
 msgstr "Update gedownload"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:91
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:92
 #, java-format
 msgid "Unsigned update file from {0} is corrupt"
 msgstr "Niet-ondertekende update bestand van {0} is corrupt"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:209
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:282
 msgid "Restarting"
 msgstr "Herstarten"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:216
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:119
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:289
 msgid "Click Restart to install"
 msgstr "Klik Herstart om te installeren"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:218
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:291
 msgid "Click Shutdown and restart to install"
 msgstr "Klik Afsluiten and herstart om te installeren"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:220
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:122
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:293
 #, java-format
 msgid "Version {0}"
 msgstr "Versie {0}"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:126
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:127
 #, java-format
 msgid "Failed copy to {0}"
 msgstr "Kopie naar {0} gefaald"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:209
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:185
+#, java-format
+msgid "Updating from {0}"
+msgstr "Updaten van {0}"
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:254
+#, java-format
+msgid "No new version found at {0}"
+msgstr "Geen nieuwe versie gevonden op {0}"
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:282
 msgid "Update verified"
 msgstr "Update geverifieerd"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:234
-msgid "Transfer failed"
-msgstr "Overdracht gefaald"
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:308
+#, java-format
+msgid "Transfer failed from {0}"
+msgstr "Overdracht gefaald van {0}"
 
 #. wars for ConfigClientsHelper
 #: ../java/strings/Strings.java:12
@@ -4089,83 +4127,122 @@ msgstr "Low-level bandbreedte verzend rato"
 msgid "How many peers we are actively talking with"
 msgstr "Met hoeveel peers communiceren we actief"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:112
 msgid "config networking"
 msgstr "configureer netwerk"
 
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:222
+msgid "Summary Bar"
+msgstr "Samenvatting Balk"
+
 #. 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:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:230
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:227
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:222
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:235
 msgid "Refresh (s)"
 msgstr "Ververs (s)"
 
 #. ditto
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:226
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:237
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:239
 msgid "Enable"
 msgstr "Inschakelen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:262
 msgid "I2P Network Configuration"
 msgstr "I2P Netwerk Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:298
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:316
 msgid "Bandwidth limiter"
 msgstr "Bandbreedte beperker"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:300
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318
 msgid ""
 "I2P will work best if you configure your rates to match the speed of your "
 "internet connection."
@@ -4173,34 +4250,34 @@ msgstr ""
 "I2P zal beter werken wanneer je de configuratie van de bandbreedte afstemt "
 "met de snelheid van je internet verbinding."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:322
 msgid "KBps In"
 msgstr "KBps In"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336
 msgid "KBps Out"
 msgstr "KBps Uit"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:352
 msgid "Share"
 msgstr "Share"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:341
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:326
 msgid "NOTE"
 msgstr "OPMERKING"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361
 #, java-format
 msgid "You have configured I2P to share only {0} KBps."
 msgstr "Je hebt I2P geconfigureerd om slechts {0} KBps te delen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:364
 msgid "I2P requires at least 12KBps to enable sharing. "
 msgstr "I2P vereist tenminste 12KBps om sharing in te schakelen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365
 msgid ""
 "Please enable sharing (participating in tunnels) by configuring more "
 "bandwidth. "
@@ -4208,19 +4285,19 @@ msgstr ""
 "Schakel sharing in (deelname aan tunnels) door meer bandbreedte toe te "
 "kennen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:366
 msgid ""
 "It improves your anonymity by creating cover traffic, and helps the network."
 msgstr ""
 "Het verbeterd je anonimiteit door camouflage verkeer te genereren en help "
 "het netwerk."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369
 #, java-format
 msgid "You have configured I2P to share {0} KBps."
 msgstr "Je hebt I2P geconfigureerd om {0} KBps te delen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:354
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:372
 msgid ""
 "The higher the share bandwidth the more you improve your anonymity and help "
 "the network."
@@ -4228,90 +4305,94 @@ msgstr ""
 "Hoe meer bandbreedte je deelt, des te meer je anonimiteit verbeterd en je "
 "het netwerk helpt."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:358
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:342
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:322
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:425
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:383
 msgid "Cancel"
 msgstr "Annuleer"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:393
 msgid "IP and Transport Configuration"
 msgstr "IP en Transport Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324
 msgid "The default settings will work for most people."
 msgstr "De standaard instellingen zullen voor de meeste mensen werken."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397
 msgid "There is help below."
 msgstr "Help is hieronder."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
 msgid "UPnP Configuration"
 msgstr "UPnP Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403
 msgid "Enable UPnP to open firewall ports"
 msgstr "Schakel UPnP in om firewall poorten te openen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405
 msgid "UPnP status"
 msgstr "UPnP status"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407
 msgid "IP Configuration"
 msgstr "IP Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
 msgid "Externally reachable hostname or IP address"
 msgstr "Extern bereikbare hostname of IP adres"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413
 msgid "Use all auto-detect methods"
 msgstr "Gebruik alle auto-detect methoden"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
 msgid "Disable UPnP IP address detection"
 msgstr "Schakel UPnP IP adres detectie uit"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421
 msgid "Ignore local interface IP address"
 msgstr "Negeer IP adres van lokale interface"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425
 msgid "Use SSU IP address detection only"
 msgstr "Gebruikt alleen SSU IP adres detectie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497
 msgid "Specify hostname or IP"
 msgstr "Specificeer hostname of IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
 msgid "Select Interface"
 msgstr "Selecteer Interface"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449
 msgid "Hidden mode - do not publish IP"
 msgstr "Verborgen modus - publiceer IP niet"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:433
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451
 msgid "(prevents participating traffic)"
 msgstr "(voorkomt deelnemend verkeer)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453
 msgid "Action when IP changes"
 msgstr "Actie wanneer IP wijzigd"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457
 msgid ""
 "Laptop mode - Change router identity and UDP port when IP changes for "
 "enhanced anonymity"
@@ -4319,82 +4400,82 @@ msgstr ""
 "Laptop modus - Wijzig router identiteit en UDP poort wanneeer IP wijzigd for "
 "meer anonimiteit"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:441
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
 msgid "Experimental"
 msgstr "Experimenteel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
 msgid "UDP Configuration:"
 msgstr "UDP Configuratie:"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:445
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463
 msgid "UDP port:"
 msgstr "UDP poort:"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477
 msgid "TCP Configuration"
 msgstr "TCP Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:465
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:483
 msgid "Use auto-detected IP address"
 msgstr "Gebruik auto-detected IP adres"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:467
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517
 msgid "currently"
 msgstr "om dit moment"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:471
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489
 msgid "if we are not firewalled"
 msgstr "wanneer we niet gefirewalled zijn"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:475
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493
 msgid "Always use auto-detected IP address (Not firewalled)"
 msgstr "Gebruik altijd auto-detected IP adres (Geen firewall)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:503
 msgid "Disable inbound (Firewalled)"
 msgstr "Schakel inkomend uit (Firewall)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:507
 msgid "Completely disable"
 msgstr "Schakel volledig uit"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:491
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509
 msgid ""
 "(select only if behind a firewall that throttles or blocks outbound TCP)"
 msgstr ""
 "(selecteer alleen wanneer je achter een firewall zit dat uitgaand TCP "
 "beperkt of blokkeert)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511
 msgid "Externally reachable TCP port"
 msgstr "Extern bereikbare TCP poort"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515
 msgid "Use the same port configured for UDP"
 msgstr "Gebruik dezelfde poort als geconfigureerd voor UDP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:505
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523
 msgid "Specify Port"
 msgstr "Specificeer Poort"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:348
 msgid "Note"
 msgstr "Opmerking"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:530
 msgid "Changing these settings will restart your router."
 msgstr "Wijziging van deze instellingen herstart je router"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536
 msgid "Configuration Help"
 msgstr "Configuratie Help"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
 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 "
@@ -4404,7 +4485,7 @@ msgstr ""
 "netwerk integratie doorgaans verbeteren wanneer de I2P poort is geforward "
 "voor zowel UDP als TCP."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540
 msgid ""
 "If you can, please poke a hole in your firewall to allow unsolicited UDP and "
 "TCP packets to reach you."
@@ -4412,7 +4493,7 @@ msgstr ""
 "Indien mogelijk, probeer een opening in je firewall te maken om nieuwe UDP "
 "en TCP pakketten binnen te laten."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542
 msgid ""
 "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole "
 "punching with \"SSU introductions\" to relay traffic."
@@ -4420,7 +4501,7 @@ msgstr ""
 "Indien dit niet mogelijk is, I2P ondersteunt UPnP (Universal Plug en Play) "
 "en UDP perforatie met \"SSU introducties\" om verkeer te herleiden."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544
 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."
@@ -4429,12 +4510,12 @@ msgstr ""
 "wanneer UPnP niet correct werkt, of wanneer firewall buiten je beheer in de "
 "weg zit."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:528
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546
 msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
 msgstr ""
 "Bepaalde firewalls zoals symmetrische NATs werken mogelijk niet goed met I2P."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
 msgid ""
 "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect "
 "the external IP address and forward ports."
@@ -4442,39 +4523,39 @@ msgstr ""
 "UPnP is gebruikt om te communiceren met Internet Gateway Devices (IGDs) om "
 "het externe IP adres te detecteren en poorten door te sturen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
 msgid "UPnP support is beta, and may not work for any number of reasons"
 msgstr "UPnP support is beta, en kan om verscheidene redenen niet goed werken"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559
 msgid "No UPnP-compatible device present"
 msgstr "Geen UPnP-compatible device aanwezig"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561
 msgid "UPnP disabled on the device"
 msgstr "UPnP uitgeschakeld op het device"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
 msgid "Software firewall interference with UPnP"
 msgstr "Software firewall zit UPnP in de weg"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
 msgid "Bugs in the device's UPnP implementation"
 msgstr "Bugs in de device's UPnP implementatie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
 msgid "Multiple firewall/routers in the internet connection path"
 msgstr "Meerdere firewall/routers in het pad van de internet verbinding"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:551
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
 msgid "UPnP device change, reset, or address change"
 msgstr "UPnP device wijziging, reset, of adres wijziging"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:553
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571
 msgid "Review the UPnP status here."
 msgstr "Bekijk de UPnP status hier."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573
 msgid ""
 "UPnP may be enabled or disabled above, but a change requires a router "
 "restart to take effect."
@@ -4482,23 +4563,23 @@ msgstr ""
 "UPnP kan hierboven in- en uitgeschakeld worden, maar na een wijziging is een "
 "router herstart nodig."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
 msgid "Hostnames entered above will be published in the network database."
 msgstr ""
 "Hierboven ingevulde hostnames zullen worden gepubliceerd in de netwerk "
 "database."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
 msgid "They are <b>not private</b>."
 msgstr "Deze zijn <b>niet privé</b>."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
 msgid ""
 "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
 msgstr ""
 "Tevens, <b>vul geen privé IP addres in</b> zoals 127.0.0.1 of 192.168.1.1."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
 msgid ""
 "If you specify the wrong IP address or hostname, or do not properly "
 "configure your NAT or firewall, your network performance will degrade "
@@ -4507,15 +4588,15 @@ msgstr ""
 "Als je het verkeerde IP adres of hostnaam invult, of je NAT of firewall niet "
 "goed te configureert, zal je netwerk prestaties aanzienlijk verslechteren."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
 msgid "When in doubt, leave the settings at the defaults."
 msgstr "In geval van twijfel, laat de instellingen op de standaard waarden."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
 msgid "Reachability Help"
 msgstr "Bereikbaarheids Help"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590
 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 "
@@ -4526,7 +4607,7 @@ msgstr ""
 "firewalls hebt, bijvoorbeeld zowel als software pakket en een externe "
 "hardware router."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
 msgid ""
 "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help "
 "diagnose the problem."
@@ -4534,15 +4615,15 @@ msgstr ""
 "Indien er een fout is zijn de <a href=\"logs.jsp\">logs</a> mogelijk hulpvol "
 "om het probleem te onderzoeken."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
 msgid "Your UDP port does not appear to be firewalled."
 msgstr "Je UDP poort lijkt niet achter een firewall te zitten."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
 msgid "Your UDP port appears to be firewalled."
 msgstr "Je UDP poort lijkt achter een firewall te zitten."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
 msgid ""
 "As the firewall detection methods are not 100% reliable, this may "
 "occasionally be displayed in error."
@@ -4550,7 +4631,7 @@ msgstr ""
 "Omdat de firewall detectie methode niet 100% betrouwbaar is, kan dit soms "
 "foutief getoond worden."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
 msgid ""
 "However, if it appears consistently, you should check whether both your "
 "external and internal firewalls are open for your port."
@@ -4558,7 +4639,7 @@ msgstr ""
 "Indien dit echter consistent optreedt, controlleer in zowel externe als "
 "interne firewalls of de poort wel geopend is."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
 msgid ""
 "I2P will work fine when firewalled, there is no reason for concern. When "
 "firewalled, the router uses \"introducers\" to relay inbound connections."
@@ -4567,7 +4648,7 @@ msgstr ""
 "maakt de router gebruik van \"introducers\" om inkomende connecties door te "
 "sturen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609
 msgid ""
 "However, you will get more participating traffic and help the network more "
 "if you can open your firewall(s)."
@@ -4575,7 +4656,7 @@ msgstr ""
 "Je krijgt meer deelnemend verkeer en helpt het netwerk meer door de firewall"
 "(s) te openen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
 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 "
@@ -4585,7 +4666,7 @@ msgstr ""
 "hardware als software firewall kan zijn, of dat er een additionele firewall "
 "(universiteit, provider, etc) kan zijn waar je geen invloed op hebt."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
 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 "
@@ -4595,11 +4676,11 @@ msgstr ""
 "correct door te laten, of hebben andere beperkingen of bugs die voorkomen "
 "dat I2P verkeer goed doorkomt."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
 msgid "The router is currently testing whether your UDP port is firewalled."
 msgstr "De router test op dit moment of je UDP poort achter een firewall is."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
 msgid ""
 "The router is not configured to publish its address, therefore it does not "
 "expect incoming connections."
@@ -4607,11 +4688,11 @@ msgstr ""
 "De router is niet geconfigureerd om zijn adres te publiceren, daarom "
 "verwacht het geen inkomende verbindingen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
 msgid "WARN - Firewalled and Fast"
 msgstr "WARN - Firewall en Snel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
 msgid ""
 "You have configured I2P to share more than 128KBps of bandwidth, but you are "
 "firewalled."
@@ -4619,7 +4700,7 @@ msgstr ""
 "Je hebt I2P geconfigureerd om meer dan 128KBps aan bandbreedte te delen, "
 "maar je zit achter een firewall."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
 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 "
@@ -4628,28 +4709,28 @@ msgstr ""
 "Alhoewel I2P met deze configuratie prima werkt, zal je 128KBps of meer aan "
 "bandbreedte het netwerk beter helpen wanneer je je firewall open zet."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
 msgid "WARN - Firewalled and Floodfill"
 msgstr "WARN - Firewall en Floodfill"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
 msgid ""
 "You have configured I2P to be a floodfill router, but you are firewalled."
 msgstr ""
 "Je hebt I2P geconfigureerd als floodfill router, maar je zit achter een "
 "firewall."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
 msgid ""
 "For best participation as a floodfill router, you should open your firewall."
 msgstr ""
 "Voor een betere deelname als floodfill router, moet je je firewall openen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
 msgid "WARN - Firewalled with Inbound TCP Enabled"
 msgstr "WARN - Firewall en Inkomende TCP Ingeschakeld"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
 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."
@@ -4658,7 +4739,7 @@ msgstr ""
 "een firewall zit, is het waarschijnlijk dat dit ook voor je TCP poort het "
 "geval is."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
 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."
@@ -4667,19 +4748,19 @@ msgstr ""
 "kunnen routers geen verbinding met je maken via TCP, dit is niet goed voor "
 "het netwerk."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
 msgid "Please open your firewall or disable inbound TCP above."
 msgstr "Open je firewall of schakel inkomend TCP hierboven uit."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
 msgid "WARN - Firewalled with UDP Disabled"
 msgstr "WARN - Firewall met UDP Uitgeschakeld"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
 msgid "You have configured inbound TCP, however you have disabled UDP."
 msgstr "Je hebt inkomende TCP geconfigureerd, echter UDP is uitgeschakeld."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
 msgid ""
 "You appear to be firewalled on TCP, therefore your router cannot accept "
 "inbound connections."
@@ -4687,15 +4768,15 @@ msgstr ""
 "Het lijkt erop dat je voor TCP achter een firewall zit, daarom kan je router "
 "geen inkomende connecties accepteren."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
 msgid "Please open your firewall or enable UDP."
 msgstr "Open je firewall of schakel UDP in."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
 msgid "ERR - Clock Skew"
 msgstr "ERR - Klok Afwijking"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
 msgid ""
 "Your system's clock is skewed, which will make it difficult to participate "
 "in the network."
@@ -4703,15 +4784,15 @@ msgstr ""
 "Je systeemklok heeft een afwijking, dit zal het moeilijk maken om aan het "
 "netwerk deel te nemen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655
 msgid "Correct your clock setting if this error persists."
 msgstr "Corrigeer je klok instelling indien deze fout blijft optreden."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657
 msgid "ERR - Private TCP Address"
 msgstr "ERR - Privaat TCP Adres"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659
 msgid ""
 "You must never advertise an unroutable IP address such as 127.0.0.1 or "
 "192.168.1.1 as your external address."
@@ -4719,20 +4800,20 @@ msgstr ""
 "Je moet nooit een niet-routeerbaar IP adres zoals 127.0.0.1 of 192.168.1.1 "
 "adverteren als je externe adres."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661
 msgid "Correct the address or disable inbound TCP above."
 msgstr "Corrigeer het adres of schakel inkomend TCP hierboven uit."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663
 msgid "ERR - SymmetricNAT"
 msgstr "ERR - SymmetricNAT"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665
 msgid "I2P detected that you are firewalled by a Symmetric NAT."
 msgstr ""
 "I2P heeft gedetecteerd dat je achter een firewall zit door een Symmetric NAT."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667
 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 "
@@ -4741,7 +4822,7 @@ msgstr ""
 "I2P werkt niet goed achter dit type firewall. Waarschijnlijk kan je geen "
 "inkomende verbindingen accepteren, "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669
 msgid ""
 "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config "
 "and restart"
@@ -4749,12 +4830,12 @@ msgstr ""
 "ERR - UDP Poort In Gebruik - Zet i2np.udp.internalPort=xxxx in geavanceerde "
 "configuratie en herstart"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671
 msgid "I2P was unable to bind to port 8887 or other configured port."
 msgstr ""
 "I2P kon niet binden met poort 8887 of een andere geconfigureerde poort."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673
 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."
@@ -4762,7 +4843,7 @@ msgstr ""
 "Controlleer of een ander programma de geconfigureerde poort gebruikt. Als "
 "dit zo is, stop dit programma of configureer I2P op een andere poort."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:675
 msgid ""
 "This may be a transient error, if the other program is no longer using the "
 "port."
@@ -4770,15 +4851,15 @@ msgstr ""
 "Dit kan een voorbijgaande fout zijn, als het andere programma de poort niet "
 "meer gebruikt."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:677
 msgid "However, a restart is always required after this error."
 msgstr "Echter, een herstart is altijd nodig na deze fout."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:679
 msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
 msgstr "ERR - UDP Uitgeschakeld en Inkomende TCP host/poort niet gezet"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:681
 msgid ""
 "You have not configured inbound TCP with a hostname and port above, however "
 "you have disabled UDP."
@@ -4786,25 +4867,25 @@ msgstr ""
 "Je hebt inkomende TCP hierboven niet geconfigureerd met een hostname en "
 "poort, echter heb je je UDP uitgeschakeld."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:683
 msgid "Therefore your router cannot accept inbound connections."
 msgstr "Daarom kan je router geen inkomende connecties accepteren."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:685
 msgid "Please configure a TCP host and port above or enable UDP."
 msgstr "Configureer een TCP host en poort hierboven of schakel UDP in."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:687
 msgid "ERR - Client Manager I2CP Error - check logs"
 msgstr "ERR - Client Manager I2CP Fout - controlleer logs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:689
 msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
 msgstr ""
 "Dit komt doorgaans door een conflict met poort 7654. Kijk in de logs om dit "
 "te bevestigen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:691
 msgid ""
 "Do you have another I2P instance running? Stop the conflicting program and "
 "restart I2P."
@@ -4812,35 +4893,35 @@ msgstr ""
 "Heb je een andere I2P instantie draaien? Stop het conflicerende programma en "
 "herstart I2P."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:113
 msgid "config advanced"
 msgstr "geavanceerde configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:263
 msgid "I2P Advanced Configuration"
 msgstr "I2P Geavanceerde Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:319
 msgid "Advanced I2P Configuration"
 msgstr "Geavanceerde I2P Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:329
 msgid "Some changes may require a restart to take effect."
 msgstr "Voor de toepassing van sommige wijzigingen is een herstart nodig."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:112
 msgid "config clients"
 msgstr "client configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:265
 msgid "I2P Client Configuration"
 msgstr "I2P Client Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330
 msgid "Client Configuration"
 msgstr "Client Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:314
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:332
 msgid ""
 "The Java clients listed below are started by the router and run in the same "
 "JVM."
@@ -4848,20 +4929,76 @@ msgstr ""
 "De Java clients in onderstaande lijst zijn gestart door de router en draaien "
 "in dezelfde JVM."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338
 msgid "To change other client options, edit the file"
 msgstr "Om andere client opties te wijzigen, bewerk het bestand"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439
 msgid "All changes require restart to take effect."
 msgstr "Voor alle wijzigingen is een herstart nodig."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357
+msgid "Advanced Client Interface Configuration"
+msgstr "Geavanceerde Client Interface Configuratie"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361
+msgid "External I2CP (I2P Client Protocol) Interface Configuration"
+msgstr "Externe I2CP (I2P Client Protocol) Interface Configuratie"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367
+msgid "Enabled without SSL"
+msgstr "Ingeschakeld zonder SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373
+msgid "Enabled with SSL required"
+msgstr "Ingeschakeld met SSL vereist"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379
+msgid "Disabled - Clients outside this Java process may not connect"
+msgstr ""
+"Uitgeschakeld - Clients buiten dit Java process mogen geen verbinding maken"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:381
+msgid "I2CP Port"
+msgstr "I2CP Poort"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385
+msgid "I2CP Interface"
+msgstr "I2CP Interface"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401
+msgid "Authorization"
+msgstr "Authorisatie"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407
+msgid "Require username and password"
+msgstr "Gebruikersnaam en wachtwoord verplicht"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409
+msgid "Username"
+msgstr "Gebruikersnaam"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:419
+msgid "Any changes made here must also be configured in the external client."
+msgstr ""
+"Alle wijzigingen die hier worden gemaakt moeten ook in de externe client "
+"worden geconfigureerd."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421
+msgid "Many clients do not support SSL or authorization."
+msgstr "Veel clients understeunen geen SSL of authorisatie."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429
 msgid "WebApp Configuration"
 msgstr "WebApp Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431
 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 "
@@ -4877,7 +5014,7 @@ msgstr ""
 "dat los hiervan ingeschakeld moet worden (zoals susidns, i2ptunnel), of "
 "zonder web interface (zoals addressbook)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433
 msgid ""
 "A web app may also be disabled by removing the .war file from the webapps "
 "directory; however the .war file and web app will reappear when you update "
@@ -4890,103 +5027,103 @@ msgstr ""
 "nieuwere versie. Daarom is het aanbevolen om de web app hier uit te "
 "schakelen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:445
 msgid "Plugin Configuration"
 msgstr "Plugin Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:353
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:447
 msgid "The plugins listed below are started by the webConsole client."
 msgstr "De plugins hier beneden zijn gestart door de webConsole client."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455
 msgid "Plugin Installation"
 msgstr "Plugin Installatie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:457
 msgid "To install a plugin, enter the download URL:"
 msgstr "Om een plugin te installeren, voer de download URL in:"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:112
 msgid "config keyring"
 msgstr "configureer sleutelbos"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:249
 msgid "I2P Keyring Configuration"
 msgstr "I2P Sleutelbos Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317
 msgid "The router keyring is used to decrypt encrypted leaseSets."
 msgstr ""
 "De sleutelbos van de router is gebruikt om versleutelde leaseSets te "
 "ontsleutelen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:298
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320
 msgid ""
 "The keyring may contain keys for local or remote encrypted destinations."
 msgstr ""
 "De sleutelbos kan sleutels bevatten voor lokale en remote versleutelde "
 "destinations."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326
 msgid "Manual Keyring Addition"
 msgstr "Handmatige Sleutelbos Toevoeging"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:328
 msgid "Enter keys for encrypted remote destinations here."
 msgstr "Voer sleutels in om remote destinations te versleutelen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:331
 msgid "Keys for local destinations must be entered on the"
 msgstr "Sleutels voor lokale destinations moeten worden ingevoerd op de"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:333
 msgid "I2PTunnel page"
 msgstr "I2PTunnel pagina"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335
 msgid "Dest. name, hash, or full key"
 msgstr "Dest. naam, hash, of volledige sleutel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337
 msgid "Encryption Key"
 msgstr "Encryptie Sleutel"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:113
 msgid "config logging"
 msgstr "configureer logging"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:263
 msgid "I2P Logging Configuration"
 msgstr "I2P Logging Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
 msgid "Configure I2P Logging Options"
 msgstr "Configureer I2P Logging Opties"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321
 msgid "Logging filename"
 msgstr "Logging bestandsnaam"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325
 msgid "(the symbol '@' will be replaced during log rotation)"
 msgstr "(het symbool '@' zal worden vervangen bij het doordraaien van de log)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327
 msgid "Log record format"
 msgstr "Log regel formaat"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331
 msgid ""
 "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
 msgstr ""
 "(gebruik 'd' = datum, 'c' = class, 't' = thread, 'p' = prioriteit, 'm' = "
 "bericht)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333
 msgid "Log date format"
 msgstr "Log datum formaat"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337
 msgid ""
 "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' "
 "= millisecond)"
@@ -4994,15 +5131,15 @@ msgstr ""
 "('MM' = maand, 'dd' = dag, 'HH' = uur, 'mm' = minuut, 'ss' = seconde, 'SSS' "
 "= milliseconde)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339
 msgid "Max log file size"
 msgstr "Max log bestand grootte"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:343
 msgid "Default log level"
 msgstr "Standaard log niveau"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:347
 msgid ""
 "(DEBUG and INFO are not recommended defaults, as they will drastically slow "
 "down your router)"
@@ -5010,44 +5147,44 @@ msgstr ""
 "(DEBUG en INFO zijn geen aanbevolen standaardwaarden, ze zullen je router "
 "drastisch vertragen)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:349
 msgid "Log level overrides"
 msgstr "Log niveau overschrijving"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:353
 msgid "New override"
 msgstr "Nieuwe overschrijving"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:112
 msgid "config peers"
 msgstr "configureer peers"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:249
 msgid "I2P Peer Configuration"
 msgstr "I2P Peer Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323
 msgid "Manual Peer Controls"
 msgstr "Handmatige Peer Beheer"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325
 msgid "Router Hash"
 msgstr "Router Hash"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:329
 msgid "Manually Ban / Unban a Peer"
 msgstr "Handmatig een Peer Verbannen / Verbanning Opheffen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:331
 msgid ""
 "Banning will prevent the participation of this peer in tunnels you create."
 msgstr "Verbanning zorgt ervoor dat deze peer niet deelneemt aan je tunnels."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:341
 msgid "Adjust Profile Bonuses"
 msgstr "Aanpassing van Profiel Bonussen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343
 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 "
@@ -5060,32 +5197,110 @@ msgstr ""
 "gebruikt voor sommige exploratory tunnels. De huidige bonussen worden "
 "getoond op de"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345
 msgid "profiles page"
 msgstr "profielen pagina"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:273
 msgid "Banned Peers"
 msgstr "Verbannen Peers"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:384
 msgid "Banned IPs"
 msgstr "Verbannen IPs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:112
+msgid "config reseeding"
+msgstr "configureer reseeden"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:262
+msgid "I2P Reseeding Configuration"
+msgstr "I2P Reseeden Configuratie"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318
+msgid "Reseeding Configuration"
+msgstr "Reseeden Configuratie"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:320
+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 ""
+"Reseeden is het opstart proces dat gebruikt wordt om andere routers te "
+"vinden wanneer je I2P voor het eerst installeert, of wanneer je router te "
+"weinig router referenties heeft."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:322
+msgid ""
+"If reseeding has failed, you should first check your network connection."
+msgstr ""
+"Wanneer reseeden heeft gefaald moet je eerst je netwerkverbinding "
+"controlleren."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:326
+msgid ""
+"Change these only if HTTP is blocked by a restrictive firewall, reseed has "
+"failed, and you have access to an HTTP proxy."
+msgstr ""
+"Wijzig deze alleen wanneer HTTP geblokkeerd is door een beperkende firewall, "
+"reseeden heeft gefaald en je toegang hebt tot een HTTP proxy."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328
+#, java-format
+msgid "See {0} for instructions on reseeding manually."
+msgstr "Zie {0} voor instructies om handmatig te reseeden."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328
+msgid "the FAQ"
+msgstr "de FAQ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330
+msgid "Reseed URL Selection"
+msgstr "Reseed URL Selectie"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336
+msgid "Try SSL first then non-SSL"
+msgstr "Probeer eerst met SSL, daarna zonder SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:342
+msgid "Use SSL only"
+msgstr "Gebruik alleen SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348
+msgid "Use non-SSL only"
+msgstr "Gebruik geen SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350
+msgid "Reseed URLs"
+msgstr "Reseed URLs"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:354
+msgid "Enable HTTP proxy (not used for SSL)"
+msgstr "HTTP proxy inschakelen (niet gebruikt voor SSL)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:358
+msgid "HTTP Proxy Host"
+msgstr "HTTP Proxy Host"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:362
+msgid "HTTP Proxy Port"
+msgstr "HTTP Proxy Poort"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:112
 msgid "config service"
 msgstr "configureer service"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:249
 msgid "I2P Service Configuration"
 msgstr "I2P Service Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:285
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303
 msgid "Shutdown the router"
 msgstr "Stop de router"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:287
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305
 msgid ""
 "Graceful shutdown lets the router satisfy the agreements it has already made "
 "before shutting down, but may take a few minutes."
@@ -5094,12 +5309,12 @@ msgstr ""
 "overeenkomsten vervullen alvorens te stoppen, maar dit kan een aantal "
 "minuten duren."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:289
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307
 msgid ""
 "If you need to kill the router immediately, that option is available as well."
 msgstr "Indien je de router onmiddelijk wilt stoppen, dan is dit ook mogelijk."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317
 msgid ""
 "If you want the router to restart itself after shutting down, you can choose "
 "one of the following."
@@ -5107,7 +5322,7 @@ msgstr ""
 "Indien je de router wilt herstarten na het afsluiten, kies dan één van de "
 "volgende opties."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319
 msgid ""
 "This is useful in some situations - for example, if you changed some "
 "settings that client applications only read at startup, such as the "
@@ -5118,7 +5333,7 @@ msgstr ""
 "opstarten, zoals het routerconsole wachtwoord of de interface waar het op "
 "luistert."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321
 msgid ""
 "A graceful restart will take a few minutes (but your peers will appreciate "
 "your patience), while a hard restart does so immediately."
@@ -5126,7 +5341,7 @@ msgstr ""
 "Een gecontrolleerde herstart zal een aantal minuten duren (maar je peers "
 "stellen je gedult zeer op prijs), terwijl een harde herstart onmiddelijk is."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323
 msgid ""
 "After tearing down the router, it will wait 1 minute before starting back up "
 "again."
@@ -5134,35 +5349,43 @@ msgstr ""
 "Na het stoppen van de router, zal het 1 minuut wachten alvorens opnieuw te "
 "starten."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333
 msgid "Systray integration"
-msgstr "Systray integratie"
+msgstr "Systeemvak integratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335
 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 ""
-"Op het windows platform is er een kleine applicatie die in je system tray "
-"zit, waarmee de router status te bekijken is"
+"Op het Windows platform is er een kleine applicatie in je systeemvak waarmee "
+"je de status van de router kan zien"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337
 msgid ""
 "(later on, I2P client applications will be able to integrate their own "
 "functionality into the system tray as well)."
 msgstr ""
-"(in de toekomst zullen I2P client applicaties hun functionaliteit ook in de "
-"system tray kunnen integreren)."
+"(in de toekomst zullen I2P client applicaties ook hun eigen functionaliteit "
+"in het systeemvak kunnen integreren)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339
 msgid "If you are on windows, you can either enable or disable that icon here."
-msgstr "Indien je windows gebruikt kun je het icon hier in- of uitschakelen."
+msgstr "Indien je Windows gebruikt kan je het icoon hier in- of uitschakelen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341
+msgid "Show systray icon"
+msgstr "Toon systeemvak icoon"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343
+msgid "Hide systray icon"
+msgstr "Verberg systray icoon"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:345
 msgid "Run on startup"
 msgstr "Aan bij opstarten"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347
 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."
@@ -5170,12 +5393,12 @@ msgstr ""
 "Je kan bepalen of I2P al dan niet bij het opstarten moet starten met behulp "
 "van de volgende opties - I2P zal dan de service toevoegen (of verwijderen)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349
 msgid "If you prefer the command line, you can also run the "
 msgstr ""
 "Indien je de voorkeur geeft aan de command line, kan je het ook starten met "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359
 msgid ""
 "If you are running I2P as service right now, removing it will shut down your "
 "router immediately."
@@ -5183,7 +5406,7 @@ msgstr ""
 "Indien je op dit moment I2P als service draait zal het verwijderen je router "
 "onmiddelijk stoppen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361
 msgid ""
 "You may want to consider shutting down gracefully, as above, then running "
 "uninstall_i2p_service_winnt.bat."
@@ -5191,15 +5414,15 @@ msgstr ""
 "Overweeg om hierboven je router gecontrolleerd te stoppen, en daarna "
 "uninstall_i2p_service_winnt.bat te draaien."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365
 msgid "Debugging"
 msgstr "Debugging"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:367
 msgid "View the job queue"
 msgstr "Bekijk de taak wachtrij"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:371
 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="
@@ -5209,11 +5432,11 @@ msgstr ""
 "doen, selecteer de volgende optie en bekijk de thread dump in de <a href="
 "\"logs.jsp#servicelogs\">wrapper.log</a>."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:377
 msgid "Launch browser on router startup?"
 msgstr "Start browser bij opstarten router?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:379
 msgid ""
 "I2P's main configuration interface is this web console, so for your "
 "convenience I2P can launch a web browser on startup pointing at"
@@ -5221,68 +5444,68 @@ msgstr ""
 "De hoofd configuratie interface van I2P is deze web console, indien gewenst "
 "kan I2P na het opstarten een web browser starten die verwijst naar"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:113
 msgid "config stats"
 msgstr "configureer statistieken"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:250
 msgid "I2P Stats Configuration"
 msgstr "I2P Statistieken Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:320
 msgid "Configure I2P Stat Collection"
 msgstr "Configureer I2P Statistiek Vergaring"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:322
 msgid "Enable full stats?"
 msgstr "Volledige statistieken inschakelen?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329
 msgid "change requires restart to take effect"
 msgstr "na wijziging is een herstart nodig"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331
 msgid "Stat file"
 msgstr "Statistiek bestand"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:335
 msgid "Filter"
 msgstr "Filter"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:319
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:348
 msgid "toggle all"
 msgstr "alles aan/uit"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:350
 msgid "Log"
 msgstr "Log"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:332
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:352
 msgid "Graph"
 msgstr "Grafiek"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:371
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:391
 msgid "Advanced filter"
 msgstr "Geavanceerd filter"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:112
 msgid "config tunnels"
 msgstr "configureer tunnels"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:262
 msgid "I2P Tunnel Configuration"
 msgstr "I2P Tunnel Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:328
 msgid "The default settings work for most people."
 msgstr "De standaard settings werken voor de meeste mensen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332
 msgid "There is a fundamental tradeoff between anonymity and performance."
 msgstr "Er is een fundamentele afweging tussen anonimiteit en prestatie."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335
 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 "
@@ -5292,51 +5515,51 @@ msgstr ""
 "hops, 3 hops + 0-2 hops), of een hoge hoeveelheid + backup hoeveelheid, "
 "kunnen leiden tot een vermindering van prestatie of bereikbaarheid."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338
 msgid "High CPU and/or high outbound bandwidth usage may result."
 msgstr "CPU gebruik en/of uitgaand bandbreedte kan toenemen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341
 msgid "Change these settings with care, and adjust them if you have problems."
 msgstr ""
 "Wijzig deze instellingen met zorg, en pas ze aan indien problemen optreden."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:333
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:351
 msgid ""
 "Exploratory tunnel setting changes are stored in the router.config file."
 msgstr ""
 "Exploratory tunnel configuratie wijzigingen zijn opgeslagen in het router."
 "config bestand."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:336
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:354
 msgid "Client tunnel changes are temporary and are not saved."
 msgstr "Client tunnel wijzigingen zijn tijdelijk en worden niet opgeslagen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:356
 msgid "To make permanent client tunnel changes see the"
 msgstr "Om permanente client tunnel wijzigingen te maken zie de"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:358
 msgid "i2ptunnel page"
 msgstr "i2ptunnel pagina"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:112
 msgid "config UI"
 msgstr "configureer UI"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:262
 msgid "I2P UI Configuration"
 msgstr "I2P UI Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:292
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314
 msgid "Router Console Theme"
 msgstr "Router Console Thema"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:339
 msgid "Theme selection disabled for Internet Explorer, sorry."
 msgstr "Thema selectie is uitgeschakeld voor Internet Explorer, sorry."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:341
 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 "
@@ -5346,11 +5569,11 @@ msgstr ""
 "IE; configureer je browser (of proxy) om een andere User Agent tekst te "
 "gebruiken indien je de console thema's wilt wijzigen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:345
 msgid "Router Console Language"
 msgstr "Router Console Taal"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:349
 msgid ""
 "Please contribute to the router console translation project! Contact the "
 "developers on IRC #i2p to help."
@@ -5358,71 +5581,71 @@ msgstr ""
 "Lever een bijdrage aan het router console vertaal project! Neem contact op "
 "met de ontwikkelaars op IRC #i2p om te helpen."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:324
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353
 msgid "Apply"
 msgstr "Toepassen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:112
 msgid "config update"
 msgstr "configureer update"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:249
 msgid "I2P Update Configuration"
 msgstr "I2P Update Configuratie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321
 msgid "Check for I2P and news updates"
 msgstr "Controlleer op I2P en nieuws updates"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:323
 msgid "News &amp; I2P Updates"
 msgstr "Nieuws &amp; I2P Updates"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327
 msgid "Update In Progress"
 msgstr "Bezig Met Upgrade"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335
 msgid "News URL"
 msgstr "Nieuws URL"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339
 msgid "Refresh frequency"
 msgstr "Ververs frequentie"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:345
 msgid "Update policy"
 msgstr "Update regels"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:349
 msgid "Update through the eepProxy?"
 msgstr "Update door de eepProxy?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:353
 msgid "eepProxy host"
 msgstr "eepProxy host"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:357
 msgid "eepProxy port"
 msgstr "eepProxy poort"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
 msgid "Update URLs"
 msgstr "Update URLs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365
 msgid "Trusted keys"
 msgstr "Vertrouwde sleutels"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369
 msgid "Update with unsigned development builds?"
 msgstr "Update met niet ondertekende ontwikkel builds?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:355
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:373
 msgid "Unsigned Build URL"
 msgstr "Niet-ondertekende Build URL"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:379
 msgid ""
 "I2P updates are disabled because you do not have write permission for the "
 "install directory."
@@ -5430,120 +5653,154 @@ msgstr ""
 "I2P updates zijn uitgeschakeld omdat je geen schrijf rechten hebt op de "
 "installatie directory."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385
 msgid "Save"
 msgstr "Opslaan"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121
+msgid "Internal Error"
+msgstr "Interne Fout"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123
+msgid "Router Console"
+msgstr "Router Console"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:127
+msgid "Configuration"
+msgstr "Configuratie"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135
+msgid "Sorry! There has been an internal error."
+msgstr "Sorry! Er is een interne fout opgetreden."
+
+#. note to translators - both parameters are URLs
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:254
+#, java-format
+msgid "Please report bugs on {0} or {1}."
+msgstr "Rapporteer bugs op {0} of {1}."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258
+msgid ""
+"You may use the username \"guest\" and password \"guest\" if you do not wish "
+"to register."
+msgstr ""
+"Indien je niet wilt registreren kan je de username \"guest\" en wachtwoord "
+"\"guest\" gebruiken."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:145
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:260
+msgid "Please include this information in bug reports"
+msgstr "Graag deze informatie in bug reports vermelden"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147
+msgid "Error Details"
+msgstr "Fout Details"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:149
+#, java-format
+msgid "Error {0}"
+msgstr "Fout {0}"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:169
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:250
+msgid "I2P Version and Running Environment"
+msgstr "I2P Versie en Omgevingsinformatie"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:197
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:288
+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 ""
+"Merk op dat systeem informatie, log timestamps en log berichten mogelijk "
+"aanwijzingen kunnen geven over je lokatie; controlleer daarom alles dat je "
+"in een bug report opneemt."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:123
 msgid "Page Not Found"
 msgstr "Pagina Niet Gevonden"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:264
 msgid ""
 "Sorry! You appear to be requesting a non-existent Router Console page or "
 "resource."
 msgstr "Sorry! Je benadert een niet bestaande Router Console pagina of bron."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:266
 msgid "Error 404"
 msgstr "Fout 404"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:249
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:271
 msgid "not found"
 msgstr "niet gevonden"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:112
 msgid "graphs"
 msgstr "grafieken"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:249
 msgid "I2P Performance Graphs"
 msgstr "I2P Prestatie Grafieken"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:111
 msgid "home"
 msgstr "start"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:331
+msgid "Welcome to I2P"
+msgstr "Welkom bij I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:111
 msgid "job queue"
 msgstr "taak wachtrij"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:248
 msgid "I2P Router Job Queue"
 msgstr "I2P Router Taak wachtrij"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:111
 msgid "logs"
 msgstr "logs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:248
 msgid "I2P Router Logs"
 msgstr "I2P Router Logs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:228
-msgid "I2P Version & Running Environment"
-msgstr "I2P Versie & Omgevingsinformatie"
-
-#. note to translators - both parameters are URLs
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:232
-#, java-format
-msgid "Please report bugs on {0} or {1}."
-msgstr "Rapporteer bugs op {0} of {1}."
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:236
-msgid ""
-"You may use the username \"guest\" and password \"guest\" if you do not wish "
-"to register."
-msgstr ""
-"Indien je niet wilt registreren kan je de username \"guest\" en wachtwoord "
-"\"guest\" gebruiken."
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:238
-msgid "Please include this information in bug reports"
-msgstr "Graag deze informatie in bug reports vermelden"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266
-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 ""
-"Merk op dat systeem informatie, log timestamps en log berichten mogelijk "
-"aanwijzingen kunnen geven over je lokatie; controlleer daarom alles dat je in "
-"een bug report opneemt."
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:281
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303
 msgid "Critical Logs"
 msgstr "Kritieke Logs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:285
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:307
 msgid "Router Logs"
 msgstr "Router Logs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:313
 msgid "Service (Wrapper) Logs"
 msgstr "Service (Wrapper) Logs"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:111
 msgid "network database summary"
 msgstr "samenvatting netwerk database"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:248
 msgid "I2P Network Database Summary"
 msgstr "Samenvatting I2P Netwerk Database "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:115
 msgid "WebApp Not Found"
 msgstr "WebApp Niet Gevonden"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:230
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:252
 msgid "Web Application Not Running"
 msgstr "Web Applicatie Draai Niet"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:232
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:254
 msgid "The requested web application is not running."
 msgstr "De gevraagde web applicatie draait niet."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:256
 msgid ""
 "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</"
 "a> to start it."
@@ -5551,39 +5808,49 @@ msgstr ""
 "Bezoek de <a href=\"/configclients.jsp#webapp\">config clients pagina</a> om "
 "het te starten."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:111
 msgid "peer connections"
 msgstr "peer connecties"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:248
 msgid "I2P Network Peers"
 msgstr "I2P Netwerk Peers"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:111
 msgid "peer profiles"
 msgstr "peer profielen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:248
 msgid "I2P Network Peer Profiles"
 msgstr "I2P Netwerk Peer Profielen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:111
 msgid "statistics"
 msgstr "statistieken"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:265
 msgid "I2P Router Statistics"
 msgstr "I2P Router Statistieken"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:255
 #, java-format
 msgid "Disable {0} Refresh"
 msgstr "{0} Verversing Uitschakelen"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:111
 msgid "tunnel summary"
 msgstr "tunnel samenvatting"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:248
 msgid "I2P Tunnel Summary"
 msgstr "I2P Tunnel Samenvatting"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:248
+msgid "Peer Profile"
+msgstr "Peer Profiel"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:275
+#, java-format
+msgid "Profile for peer {0}"
+msgstr "Profiel voor peer {0}"
diff --git a/apps/routerconsole/locale/messages_ru.po b/apps/routerconsole/locale/messages_ru.po
index 41f73635c55406ae0e18f1ba8d0df7582076b182..5a7538fba73e832f92d765496991eaf8d054265a 100644
--- a/apps/routerconsole/locale/messages_ru.po
+++ b/apps/routerconsole/locale/messages_ru.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P routerconsole\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-13 19:43+0000\n"
-"PO-Revision-Date: 2010-12-24 00:11+0500\n"
+"POT-Creation-Date: 2011-04-13 16:25+0000\n"
+"PO-Revision-Date: 2011-04-13 23:31+0500\n"
 "Last-Translator: Hidden Z <hiddenz@mail.i2p>\n"
 "Language-Team: \n"
 "Language: \n"
@@ -28,7 +28,7 @@ msgstr ""
 #. {0,number,####} prevents 1234 from being output as 1,234 in the English locale.
 #. If you want the digit separator in your locale, translate as {0}.
 #. alternates: msec, msecs
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1092
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1140
 #, java-format
 msgid "1 ms"
 msgid_plural "{0,number,####} ms"
@@ -39,8 +39,7 @@ msgstr[2] "{0,number,####} мс"
 #. seconds
 #. Note to translators: quantity will always be greater than one.
 #. alternates: secs, sec. 'seconds' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1097
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:354
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1145
 #, java-format
 msgid "1 sec"
 msgid_plural "{0} sec"
@@ -51,7 +50,7 @@ msgstr[2] "{0} с."
 #. minutes
 #. Note to translators: quantity will always be greater than one.
 #. alternates: mins, min. 'minutes' is probably too long.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1102
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1150
 #, java-format
 msgid "1 min"
 msgid_plural "{0} min"
@@ -62,7 +61,7 @@ msgstr[2] "{0} мин."
 #. hours
 #. Note to translators: quantity will always be greater than one.
 #. alternates: hrs, hr., hrs.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1107
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1155
 #, java-format
 msgid "1 hour"
 msgid_plural "{0} hours"
@@ -70,14 +69,14 @@ msgstr[0] "{0} час"
 msgstr[1] "{0} часа"
 msgstr[2] "{0} часов"
 
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1109
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1157
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:314
 msgid "n/a"
 msgstr "нет данных"
 
 #. days
 #. Note to translators: quantity will always be greater than one.
-#: ../../../core/java/src/net/i2p/data/DataHelper.java:1113
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1161
 #, java-format
 msgid "1 day"
 msgid_plural "{0} days"
@@ -85,21 +84,21 @@ msgstr[0] "{0} день"
 msgstr[1] "{0} дней"
 msgstr[2] "{0} дней"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:126
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:122
 #, java-format
 msgid "Banned by router hash: {0}"
 msgstr "Забанен по хэшу маршрутизатора: {0}"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:128
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:124
 msgid "Banned by router hash"
 msgstr "Забанен по хэшу маршрутизатора"
 
 #. Temporary reason, until the job finishes
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:673
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:669
 msgid "IP banned"
 msgstr "IP заблокирован"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:743
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:739
 #, java-format
 msgid "IP banned by blocklist.txt entry {0}"
 msgstr "IP заблокирован по записи в blocklist.txt: {0}"
@@ -153,15 +152,12 @@ msgstr "Принимаем туннели"
 msgid "Rejecting tunnels"
 msgstr "Не принимаем туннели"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:67
-msgid "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually."
-msgstr "Убедитесь, что исходящие HTTP-запросы ничем не блокируются, загляните в <a href=logs.jsp>логи</a> и если ничто не помогло, прочтите в <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> инструкцию по начальной загрузке вручную."
-
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:100
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:125
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
 msgid "Reseeding"
-msgstr "Производится начальная загрузка"
+msgstr "Начальная загрузка"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:123
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:141
 #, java-format
 msgid "Reseed fetched only 1 router."
 msgid_plural "Reseed fetched only {0} routers."
@@ -169,20 +165,29 @@ msgstr[0] "При начальной загрузке получены данн
 msgstr[1] "При начальной загрузке получены данные только о {0} роутерах."
 msgstr[2] "При начальной загрузке получены данные только о {0} роутерах."
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:130
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:148
 msgid "Reseed failed."
 msgstr "Попытка начальной загрузки провалилась."
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:231
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:149
+#, java-format
+msgid "See {0} for help."
+msgstr "Смотрите {0} для помощи."
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150
+msgid "reseed configuration page"
+msgstr "страница настройки начальной загрузки"
+
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:293
 msgid "Reseeding: fetching seed URL."
 msgstr "Производится начальная загрузка: загружается URL каталога маршрутизаторов."
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:272
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:335
 #, java-format
 msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
 msgstr "Производится начальная загрузка: получение информации о маршрутизаторах ({0} удачно, {1} ошибок)."
 
-#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:510
+#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512
 msgid "NetDb entry"
 msgstr "показать описание в NetDb"
 
@@ -191,191 +196,192 @@ msgstr "показать описание в NetDb"
 msgid "No transports (hidden or starting up?)"
 msgstr "Нет транспортных протоколов (в скрытом режиме или запущен недавно?)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:451
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450
 msgid "Unreachable on any transport"
 msgstr "Недоступен по всем транспортным протоколам"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:500
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499
 msgid "Router Transport Addresses"
 msgstr "Адреса транспортов маршрутизатора"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:505
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504
 #, java-format
 msgid "{0} is used for outbound connections only"
 msgstr "{0} используется только для исходящих соединений"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129
 msgid "Help"
 msgstr "Справка"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519
 msgid "Your transport connection limits are automatically set based on your configured bandwidth."
 msgstr "Лимиты транспортных соединений назначены автоматически на основе заданной вами пропускной способности."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:522
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521
 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 на странице расширенных настроек."
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
 msgid "Definitions"
 msgstr "Условные обозначения"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:715
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238
 msgid "Peer"
 msgstr "Пир"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
 msgid "The remote peer, identified by router hash"
 msgstr "Уникальный идентификатор пира (несколько начальных символов из хеша его маршрутизатора)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:716
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
 msgid "Dir"
 msgstr "Направление"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
 msgid "Inbound connection"
 msgstr "Входящее соединение"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
 msgid "Outbound connection"
 msgstr "Исходящее соединение"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
 msgid "They offered to introduce us (help other peers traverse our firewall)"
 msgstr "Этот пир предлагает себя в качестве нашего посредника (для того, чтобы другие пиры могли соединяться с нами в обход нашего брандмауэра)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532
 msgid "We offered to introduce them (help other peers traverse their firewall)"
 msgstr "Мы предлагаем себя в качестве посредника для этого пира (для того, чтобы другие пиры могли соединяться с ним в обход его брандмауэра)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
 msgid "How long since a packet has been received / sent"
 msgstr "Сколько прошло времени после приёма/передачи последнего пакета"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:717
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
 msgid "Idle"
 msgstr "Неактивен"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:718
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1897
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "In/Out"
 msgstr "Приём/Передача"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)"
 msgstr "Усреднённые скорости приёма / передачи (КБайт/сек) "
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
 msgid "How long ago this connection was established"
 msgstr "Время жизни соединения"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:719
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1902
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905
 msgid "Up"
 msgstr "Подключен"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:720
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1904
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907
 msgid "Skew"
 msgstr "Сдвиг"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
 msgid "The difference between the peer's clock and your own"
 msgstr "Разница хода часов между пиром и нами"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
 msgid "The congestion window, which is how many bytes can be sent without an acknowledgement"
 msgstr "<i>Congestion Window.</i> Окно насыщения — количество байт, которое мы можем послать до ожидания подтверждения"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
 msgid "The number of sent messages awaiting acknowledgement"
 msgstr "Количество отправленных сообщений ожидающих подтверждения"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
 msgid "The maximum number of concurrent messages to send"
 msgstr "Максимальное количество параллельно отправляемых сообщений"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
 msgid "The number of pending sends which exceed congestion window"
 msgstr "Количество ожидающих посылок превосходящих размер окна насыщения"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
 msgid "The slow start threshold"
 msgstr "<i>Slow Start Threshold.</i> Величина порога медленного старта"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
 msgid "The round trip time in milliseconds"
 msgstr "<i>Round-Trip Time.</i> Время между отправкой запроса и получением ответа (миллисекунды)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1914
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917
 msgid "Dev"
 msgstr "Отклонение"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
 msgid "The standard deviation of the round trip time in milliseconds"
 msgstr "Среднеквадратическое отклонение RTT (миллисекунды)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
 msgid "The retransmit timeout in milliseconds"
 msgstr "<i>Retransmit Time-Out.</i> Время ожидания подтверждения перед повторной посылкой пакета (миллисекунды)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
 msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)"
 msgstr "<i>Maximum Transfer Unit.</i> Текущий максимальный размер исходящего пакета / максимальный размер принятого пакета (байт) "
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:721
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
 msgid "TX"
 msgstr "Передано"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
 msgid "The total number of packets sent to the peer"
 msgstr "Общее количество посланных пиру пакетов"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:722
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
 msgid "RX"
 msgstr "Принято"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
 msgid "The total number of packets received from the peer"
 msgstr "Общее количество принятых от пира пакетов"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929
 msgid "Dup TX"
 msgstr "Повт. принято"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
 msgid "The total number of packets retransmitted to the peer"
 msgstr "Общее количество повторно посланных пиру пакетов"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1928
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931
 msgid "Dup RX"
 msgstr "Повт. передано"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
 msgid "The total number of duplicate packets received from the peer"
 msgstr "Общее количество повторно принятых от пира пакетов"
 
@@ -385,174 +391,175 @@ msgstr "Общее количество повторно принятых от 
 msgid "Excessive clock skew: {0}"
 msgstr "Чрезмерное расхождение времени: {0}"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:710
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732
 msgid "NTCP connections"
 msgstr "NTCP соединения"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:711
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1883
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:733
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886
 msgid "Limit"
 msgstr "Ограничение"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:712
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1884
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:734
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
 msgid "Timeout"
 msgstr "Таймаут"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:723
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:745
 msgid "Out Queue"
 msgstr "Исходящая очередь"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:724
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:746
 msgid "Backlogged?"
 msgstr "В очереди?"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1946
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
 msgid "Inbound"
 msgstr "Входящие"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1948
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:762
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
 msgid "Outbound"
 msgstr "Исходящие"
 
 #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:787
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:809
 msgid "peers"
 msgstr "пиров"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1882
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885
 msgid "UDP connections"
 msgstr "UDP соединения"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1889
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892
 msgid "Sort by peer hash"
 msgstr "Сортировать по идентификатору пира"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
 msgid "Direction/Introduction"
 msgstr "Направление / Посредничество"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
 msgid "Sort by idle inbound"
 msgstr "Сортировать по неактивности приёма"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
 msgid "Sort by idle outbound"
 msgstr "Сортировать по неактивности передачи"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
 msgid "Sort by inbound rate"
 msgstr "Сортировать по скорости приёма"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903
 msgid "Sort by outbound rate"
 msgstr "Сортировать по скорости передачи"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
 msgid "Sort by connection uptime"
 msgstr "Сортировать по времени жизни соединения"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
 msgid "Sort by clock skew"
 msgstr "Сортировать по расхождению часов"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911
 msgid "Sort by congestion window"
 msgstr "Сортировать по размеру окна насыщения"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1910
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913
 msgid "Sort by slow start threshold"
 msgstr "Сортировать по размеру порога медленного старта"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916
 msgid "Sort by round trip time"
 msgstr "Сортировать по времени прохождения сигнала"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1915
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
 msgid "Sort by round trip time deviation"
 msgstr "Сортировать по отклонению времени прохождения сигнала"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920
 msgid "Sort by retransmission timeout"
 msgstr "Сортировать по таймауту передачи"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923
 msgid "Sort by outbound maximum transmit unit"
 msgstr "Сортировать по размеру исходящего MTU"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1922
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
 msgid "Sort by packets sent"
 msgstr "Сортировать по количеству посланных пакетов"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
 msgid "Sort by packets received"
 msgstr "Сортировать по количеству принятых пакетов"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930
 msgid "Sort by packets retransmitted"
 msgstr "Сортировать по количеству повторно посланных пакетов"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932
 msgid "Sort by packets received more than once"
 msgstr "Сортировать по количеству повторно принятых пакетов"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1950
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953
 msgid "We offered to introduce them"
 msgstr "Мы предлагаем себя в качестве посредника для этого пира"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1952
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955
 msgid "They offered to introduce us"
 msgstr "Этот пир предлагает себя в качестве нашего посредника"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1956
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959
 msgid "Choked"
 msgstr "Дросселирован"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1964
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967
 msgid "1 fail"
 msgstr "1 сбой"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1966
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969
 #, java-format
 msgid "{0} fails"
 msgstr "{0} сбоя(-ев)"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1972
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162
 msgid "Banned"
 msgstr "Забанен"
 
 #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2103
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106
 msgid "SUMMARY"
 msgstr "ИТОГО"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:145
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124
 msgid "Dropping tunnel requests: Too slow"
 msgstr "Игнорируем запросы туннелей: Время выполнения превысило ожидаемое"
 
 #. don't even bother, since we are so overloaded locally
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:352
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267
 msgid "Dropping tunnel requests: Overloaded"
 msgstr "Игнорируем запросы туннелей: Слишком высокая нагрузка"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:525
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:470
 msgid "Rejecting tunnels: Request overload"
 msgstr "Не принимаем туннели: Слишком много запросов"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:550
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:495
 msgid "Rejecting tunnels: Connection limit"
 msgstr "Не принимаем туннели: Достигнут предел количества соединений"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:744
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:695
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:716
 msgid "Dropping tunnel requests: High load"
 msgstr "Игнорируем запросы туннелей: Высокая нагрузка"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:753
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:708
 msgid "Dropping tunnel requests: Queue time"
 msgstr "Игнорируем запросы туннелей: Слишком большое время пребывания в очереди"
 
@@ -1483,11 +1490,12 @@ msgstr "Замбия"
 msgid "Zimbabwe"
 msgstr "Зимбабве"
 
-#: ../java/src/net/i2p/router/web/CSSHelper.java:57
+#: ../java/src/net/i2p/router/web/CSSHelper.java:60
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37
 #: ../java/strings/Strings.java:29
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:233
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:125
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:257
 msgid "I2P Router Console"
 msgstr "Консоль маршрутизатора I2P"
 
@@ -1505,245 +1513,253 @@ msgstr "Настройки сохранены"
 msgid "Error saving the configuration (applied but not saved) - please see the error logs"
 msgstr "Не удалось сохранить настройки (применены, но не сохранены) — загляните в логи ошибок"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:34
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:335
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:355
 msgid "Save Client Configuration"
 msgstr "Сохранить настройки клиентов"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:38
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427
+msgid "Save Interface Configuration"
+msgstr "Сохранить настройки интерфейса"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:441
 msgid "Save WebApp Configuration"
 msgstr "Сохранить настройки веб-апплетов"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:42
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:453
 msgid "Save Plugin Configuration"
 msgstr "Сохранить настройки плагинов"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:46
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461
 msgid "Install Plugin"
 msgstr "Установить плагин"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87
 #, java-format
 msgid "Deleted plugin {0}"
 msgstr "Удален плагин {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:84
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89
 #, java-format
 msgid "Error deleting plugin {0}"
 msgstr "Ошибка при удалении плагина {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:96
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101
 #, java-format
 msgid "Stopped plugin {0}"
 msgstr "Остановлен плагин {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:98
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103
 #, java-format
 msgid "Error stopping plugin {0}"
 msgstr "Ошибка при остановке плагина {0}"
 
 #. label (IE)
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:119
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:189
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255
 msgid "Start"
 msgstr "Запустить"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:138
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33
 msgid "Unsupported"
 msgstr "Не поддерживается"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:184
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189
 msgid "New client added"
 msgstr "Добавлен новый клиент"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:188
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193
 msgid "Client configuration saved successfully - restart required to take effect."
 msgstr "Настройки клиентов сохранены, требуется перезапуск маршрутизатора для вступления в силу."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:202
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:213
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
 msgid "Bad client index."
 msgstr "Индекс клиента не найден в списке."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:379
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:392
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:384
 msgid "Client"
 msgstr "Клиентские"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
 msgid "started"
 msgstr "запущен"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
 msgid "deleted"
 msgstr "удален"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:235
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240
 msgid "WebApp configuration saved."
 msgstr "Настройки веб-апплета сохранены."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:251
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256
 msgid "Plugin configuration saved."
 msgstr "Настройки плагина сохранены."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
 msgid "WebApp"
 msgstr "Веб-апплет"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:268
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273
 msgid "Failed to start"
 msgstr "Не удалось запустить"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278
 msgid "Failed to find server."
 msgstr "Не удалось найти сервер."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:279
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284
 msgid "No plugin URL specified."
 msgstr "Не указан URL загрузки плагина"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:289
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294
 #, java-format
 msgid "No update URL specified for {0}"
 msgstr "Не указан URL загрузки плагина {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:297
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:315
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325
 msgid "Plugin or update download already in progress."
 msgstr "Загрузка плагина или обновления уже запущена."
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:306
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311
 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118
 #, java-format
 msgid "Downloading plugin from {0}"
 msgstr "Производится загрузка плагина с {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:324
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329
 #, java-format
 msgid "Checking plugin {0} for updates"
 msgstr "Проверяется наличие обновления для плагина {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:334
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339
 #, java-format
 msgid "Started plugin {0}"
 msgstr "Запущен плагин {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:336
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341
 #, java-format
 msgid "Error starting plugin {0}"
 msgstr "Ошибка при запуске плагина {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:21
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:192
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376
+msgid "Interface configuration saved successfully - restart required to take effect."
+msgstr "Настройки интерфейса успешно сохранены, требуется перезапуск маршрутизатора для вступления в силу."
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258
 msgid "Edit"
 msgstr "Редактировать"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:30
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351
 msgid "Add Client"
 msgstr "Добавить клиент"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
 msgid "Class and arguments"
 msgstr "Название класса и параметры"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Control"
 msgstr "Управление"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Run at Startup?"
 msgstr "Запускать автоматически?"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:131
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197
 msgid "Description"
 msgstr "Описание"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Plugin"
 msgstr "Плагин"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:95
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185
 msgid "Version"
 msgstr "Версия"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:97
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163
 msgid "Signed by"
 msgstr "Подписано"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:114
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180
 msgid "Date"
 msgstr "Дата"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:120
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186
 msgid "Author"
 msgstr "Автор"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:136
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202
 msgid "License"
 msgstr "Лицензия"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:141
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207
 msgid "Website"
 msgstr "Веб-сайт"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212
 msgid "Update link"
 msgstr "Адрес обновления"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:194
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260
 msgid "Stop"
 msgstr "Остановить"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:196
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:81
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:313
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331
 msgid "Check for updates"
 msgstr "Проверить обновления"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:242
 msgid "Update"
 msgstr "Обновление"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268
 #, java-format
 msgid "Are you sure you want to delete {0}?"
 msgstr "Вы действительно хотите удалить {0}?"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:204
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270
 msgid "Delete"
 msgstr "Удалить"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:343
 msgid "Add key"
 msgstr "Добавить ключ"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:341
 msgid "Delete key"
 msgstr "Удалить ключ"
 
@@ -1845,7 +1861,7 @@ msgstr "Служба"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381
 #: ../java/strings/Strings.java:72
 msgid "Tunnels"
 msgstr "Туннели"
@@ -1859,7 +1875,7 @@ msgid "Clients"
 msgstr "Апплеты"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:293
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315
 msgid "Keyring"
 msgstr "Ключи"
 
@@ -1869,13 +1885,13 @@ msgstr "Логи"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255
 #: ../java/strings/Strings.java:67
 msgid "Peers"
 msgstr "Пиры"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:389
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143
 msgid "Stats"
 msgstr "Статистика"
@@ -1886,13 +1902,15 @@ msgstr "Расширенные"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:360
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:341
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:377
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:397
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:362
 msgid "Save changes"
 msgstr "Сохранить настройки"
 
@@ -1978,25 +1996,25 @@ msgstr "Обновление доли транзитного трафика"
 msgid "Updated bandwidth limits"
 msgstr "Настройки ограничений скорости сохранены"
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:39
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:47
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:50
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:57
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:60
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62
 msgid "unknown"
 msgstr "неизвестен"
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:169
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172
 msgid "bits per second"
 msgstr "бит/секунду"
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:170
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173
 #, java-format
 msgid "or {0} bytes per month maximum"
 msgstr "или {0} байт/месяц максимум"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:333
 msgid "Ban peer until restart"
 msgstr "Забанить пира до перезапуска маршрутизатора"
 
@@ -2016,7 +2034,7 @@ msgid "Invalid peer"
 msgstr "Некорректное описание пира"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335
 msgid "Unban peer"
 msgstr "Разбанить пира"
 
@@ -2029,7 +2047,7 @@ msgid "is not currently banned"
 msgstr "на данный момент не забанен"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:361
 msgid "Adjust peer bonuses"
 msgstr "Изменить бонусы"
 
@@ -2041,10 +2059,28 @@ msgstr "Некорректное значение скорости"
 msgid "Bad capacity value"
 msgstr "Некорректное значение ёмкости"
 
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:368
+msgid "Save changes and reseed now"
+msgstr "Сохранить настройки и выполнить начальную загрузку"
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21
+msgid "Reseeding is already in progress"
+msgstr "Загрузка начального списка узлов (reseeding) уже в процессе"
+
+#. skip the nonce checking in ReseedHandler
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24
+msgid "Starting reseed process"
+msgstr "Запускается процесс загрузки начального списка узлов (reseed)"
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66
+msgid "Configuration saved successfully."
+msgstr "Настройки успешно сохранены."
+
 #. Normal browsers send value, IE sends button label
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:293
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:311
 msgid "Shutdown immediately"
 msgstr "Выключить немедленно"
 
@@ -2091,7 +2127,7 @@ msgid "Restart in {0}"
 msgstr "Перезапуск через {0}"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309
 msgid "Shutdown gracefully"
 msgstr "Выключить плавно"
 
@@ -2104,7 +2140,7 @@ msgid "Shutdown immediately!  boom bye bye bad bwoy"
 msgstr "Выключаем немедленно!"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:313
 msgid "Cancel graceful shutdown"
 msgstr "Отменить плавное выключение"
 
@@ -2113,7 +2149,7 @@ msgid "Graceful shutdown cancelled"
 msgstr "Плавное отключение отменено"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325
 msgid "Graceful restart"
 msgstr "Перезапустить плавно"
 
@@ -2122,7 +2158,7 @@ msgid "Graceful restart requested"
 msgstr "Запущен плавный перезапуск"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327
 msgid "Hard restart"
 msgstr "Перезапустить немедленно"
 
@@ -2147,79 +2183,51 @@ msgid "Rekeying after graceful shutdown"
 msgstr "Смена ключа после плавного выключения"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353
 msgid "Run I2P on startup"
 msgstr "Запускать I2P при старте"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355
 msgid "Don't run I2P on startup"
 msgstr "Не запускать I2P при старте"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:373
 msgid "Dump threads"
 msgstr "Вывести список потоков"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323
-msgid "Show systray icon"
-msgstr "Показать значок статуса"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
-msgid "System tray icon enabled."
-msgstr "Включен значок-индикатор статуса в области уведомлений."
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110
-msgid "System tray icon feature not supported on this platform. Sorry!"
-msgstr "Вывод индикаторов в области уведомлений на этой платформе не поддерживается. Извините!"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
-msgid "Warning: unable to contact the systray manager"
-msgstr "Предупреждение: Не удалось соединиться с менеджером области уведомлений"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325
-msgid "Hide systray icon"
-msgstr "Спрятать значок статуса"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108
-msgid "System tray icon disabled."
-msgstr "Выключен значок-индикатор статуса в области уведомлений."
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:381
 msgid "View console on startup"
 msgstr "Открывать веб-консоль при запуске I2P"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93
 msgid "Console is to be shown on startup"
 msgstr "Веб-консоль будет открываться при запуске I2P"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:383
 msgid "Do not view console on startup"
 msgstr "Не открывать веб-консоль при запуске I2P"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
 msgid "Console is not to be shown on startup"
 msgstr "Веб-консоль не будет открываться при запуске I2P"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105
 msgid "Service installed"
 msgstr "Служба установлена"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107
 msgid "Warning: unable to install the service"
 msgstr "Предупреждение: не удалось установить службу"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
 msgid "Service removed"
 msgstr "Служба удалена"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
 msgid "Warning: unable to remove the service"
 msgstr "Предупреждение: не удалось удалить службу"
 
@@ -2267,58 +2275,58 @@ msgstr[0] "{0} туннель"
 msgstr[1] "{0} туннеля"
 msgstr[2] "{0} туннелей"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
 msgid "Exploratory tunnels"
 msgstr "Зондирующие туннели"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46
-#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61
-msgid "Client tunnels for"
-msgstr "Клиентские туннели для:"
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:51
+#, java-format
+msgid "Client tunnels for {0}"
+msgstr "Клиентские туннели для {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
 msgid "ANONYMITY WARNING - Settings include 0-hop tunnels."
 msgstr "ОПАСНО ДЛЯ АНОНИМНОСТИ — Настройки задают 0-хоповые туннели."
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:79
 msgid "ANONYMITY WARNING - Settings include 1-hop tunnels."
 msgstr "ОПАСНО ДЛЯ АНОНИМНОСТИ — Настройки задают 1-хоповые туннели."
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
 msgid "PERFORMANCE WARNING - Settings include very long tunnels."
 msgstr "ОПАСНО ДЛЯ ПРОИЗВОДИТЕЛЬНОСТИ — Настройки задают слишком длинные туннели."
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:85
 msgid "PERFORMANCE WARNING - Settings include high tunnel quantities."
 msgstr "ОПАСНО ДЛЯ ПРОИЗВОДИТЕЛЬНОСТИ — Настройки задают слишком большие количества туннелей."
 
 #. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n");
 #. tunnel depth
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:92
 msgid "Length"
 msgstr "Длина"
 
 #. tunnel depth variance
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:109
 msgid "Randomization"
 msgstr "Разброс"
 
 #. tunnel quantity
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:133
 msgid "Quantity"
 msgstr "Количество"
 
 #. tunnel backup quantity
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:150
 msgid "Backup quantity"
 msgstr "Резервное количество"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:172
 msgid "Inbound options"
 msgstr "Дополнительные параметры для входящих"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:185
 msgid "Outbound options"
 msgstr "Дополнительные параметры для исходящих"
 
@@ -2331,87 +2339,91 @@ msgid "Refresh the page to view."
 msgstr "Обновите страницу для просмотра."
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+msgid "Arabic"
+msgstr "Арабский"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "English"
 msgstr "English"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "French"
 msgstr "Français"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "German"
 msgstr "Deutsch"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "Spanish"
 msgstr "Испанский"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Dutch"
 msgstr "Nederlands"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Portuguese"
 msgstr "Португальский"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Russian"
 msgstr "Русский"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
 msgid "Chinese"
 msgstr "中文"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
 msgid "Swedish"
 msgstr "Svenska"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:88
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:85
 msgid "Update available, attempting to download now"
 msgstr "Доступно обновление, пытаемся загрузить"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:90
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:87
 msgid "Update available, click button on left to download"
 msgstr "Доступно обновление, нажмите кнопку слева для загрузки"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:96
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:93
 msgid "No update available"
 msgstr "Нет доступных обновлений"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:104
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:101
 msgid "Updating news URL to"
 msgstr "Новый URL новостей"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:109
 msgid "Updating proxy host to"
 msgstr "Новый адрес I2P-прокси"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:120
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:117
 msgid "Updating proxy port to"
 msgstr "Новый порт I2P-прокси"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:133
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:130
 msgid "Updating refresh frequency to"
 msgstr "Новый интервал проверки обновлений"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:140
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:137
 msgid "Updating update policy to"
 msgstr "Новый режим обновлений"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:149
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:146
 msgid "Updating update URLs."
 msgstr "Новые URL обновлений"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:158
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:155
 msgid "Updating trusted keys."
 msgstr "Обновление списка доверенных ключей."
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:166
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:163
 msgid "Updating unsigned update URL to"
 msgstr "Новый URL неподписанной тестовой сборки"
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88
-#: ../java/src/net/i2p/router/web/GraphHelper.java:148
+#: ../java/src/net/i2p/router/web/GraphHelper.java:167
 msgid "Never"
 msgstr "Никогда"
 
@@ -2431,84 +2443,72 @@ msgstr "Только скачать и проверить целостность
 msgid "Download, verify, and restart"
 msgstr "Скачать, проверить и обновить I2P"
 
-#: ../java/src/net/i2p/router/web/FormHandler.java:174
+#: ../java/src/net/i2p/router/web/FormHandler.java:176
 msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."
 msgstr "Форма не принята, скорее всего это произошло из-за того, что Вы нажимали кнопку \"Назад\" или \"Обновить\" в браузере. Пожалуйста, заполните форму заново."
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:87
+#: ../java/src/net/i2p/router/web/GraphHelper.java:93
 msgid "Combined bandwidth graph"
 msgstr "График загрузки канала"
 
 #. e.g. "statname for 60m"
-#: ../java/src/net/i2p/router/web/GraphHelper.java:101
+#: ../java/src/net/i2p/router/web/GraphHelper.java:107
 #, java-format
 msgid "{0} for {1}"
 msgstr "{0} за {1}"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
+#: ../java/src/net/i2p/router/web/GraphHelper.java:146
 msgid "Configure Graph Display"
 msgstr "Настройка показа графиков"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
+#: ../java/src/net/i2p/router/web/GraphHelper.java:146
 msgid "Select Stats"
 msgstr "Выбрать параметры"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:142
+#: ../java/src/net/i2p/router/web/GraphHelper.java:150
 msgid "Periods"
 msgstr "Количество интервалов"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:143
+#: ../java/src/net/i2p/router/web/GraphHelper.java:151
 msgid "Plot averages"
 msgstr "Строить график средних значений"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:144
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333
+#: ../java/src/net/i2p/router/web/GraphHelper.java:152
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:351
 msgid "or"
 msgstr "или"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:144
+#: ../java/src/net/i2p/router/web/GraphHelper.java:152
 msgid "plot events"
 msgstr "строить график количества событий"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:145
+#: ../java/src/net/i2p/router/web/GraphHelper.java:153
 msgid "Image sizes"
 msgstr "Размеры графиков"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:145
+#: ../java/src/net/i2p/router/web/GraphHelper.java:153
 msgid "width"
 msgstr "ширина"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:146
+#: ../java/src/net/i2p/router/web/GraphHelper.java:154
 msgid "height"
 msgstr "высота"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:146
-#: ../java/src/net/i2p/router/web/GraphHelper.java:147
+#: ../java/src/net/i2p/router/web/GraphHelper.java:154
+#: ../java/src/net/i2p/router/web/GraphHelper.java:155
 msgid "pixels"
 msgstr "пикселей"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:148
+#: ../java/src/net/i2p/router/web/GraphHelper.java:156
 msgid "Refresh delay"
 msgstr "Интервал обновления"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:148
-msgid "hour"
-msgstr "час"
-
-#: ../java/src/net/i2p/router/web/GraphHelper.java:148
-msgid "minute"
-msgstr "минута"
-
-#: ../java/src/net/i2p/router/web/GraphHelper.java:148
-msgid "minutes"
-msgstr "минут(ы)"
-
-#: ../java/src/net/i2p/router/web/GraphHelper.java:149
+#: ../java/src/net/i2p/router/web/GraphHelper.java:171
 msgid "Redraw"
 msgstr "Перерисовать"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:181
+#: ../java/src/net/i2p/router/web/GraphHelper.java:203
 msgid "Graph settings saved"
 msgstr "Настройки графиков сохранены"
 
@@ -2525,71 +2525,71 @@ msgstr "Файл не найден"
 msgid "No log messages"
 msgstr "Нет сообщений"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:80
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:79
 msgid "Network Database RouterInfo Lookup"
 msgstr "Просмотр RouterInfo"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94
 #: ../java/strings/Strings.java:68
 msgid "Router"
 msgstr "Маршрутизатор"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94
 msgid "not found in network database"
 msgstr "не найден в сетевой базе данных"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:106
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:215
 msgid "Network Database Contents"
 msgstr "Просмотр сетевой базы данных"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107
 msgid "View RouterInfo"
 msgstr "Показать список RouterInfo"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:109
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108
 msgid "LeaseSets"
 msgstr "Список LeaseSet"
 
 # This term intentionally left in English
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:131
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:130
 msgid "LeaseSet"
 msgstr "LeaseSet"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:133
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:132
 msgid "Local"
 msgstr "Локальный"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:134
 msgid "Unpublished"
 msgstr "Неопубликованный"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:136
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:143
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:142
 msgid "Destination"
 msgstr "Адрес назначения"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:153
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:152
 #, java-format
 msgid "Expires in {0}"
 msgstr "Истекает через {0}"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:155
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:154
 #, java-format
 msgid "Expired {0} ago"
 msgstr "Истек {0} назад"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "Gateway"
 msgstr "Шлюз"
 
 # This term intentionally left in English
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166
 msgid "Lease"
 msgstr "Lease"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:169
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:168
 msgid "Tunnel"
 msgstr "Туннель"
 
@@ -2613,97 +2613,97 @@ msgstr "Показать полный список"
 msgid "Show all routers with full stats"
 msgstr "Показать полный список с полной статистикой"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266
 msgid "Network Database Router Statistics"
 msgstr "Статистика маршрутизаторов"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
 msgid "Count"
 msgstr "Количество"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287
 msgid "Transports"
 msgstr "Транспортный протокол"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305
 msgid "Country"
 msgstr "Страна"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
 msgid "Our info"
 msgstr "Информация о нас"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346
 msgid "Peer info for"
 msgstr "Информация о пире"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350
 msgid "Full entry"
 msgstr "Показать полную запись"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:110
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:115
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
 msgid "Hidden"
 msgstr "Скрытый"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356
 msgid "Updated"
 msgstr "Обновленный"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:355
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360
 #, java-format
 msgid "{0} ago"
 msgstr "{0} назад"
 
 #. shouldnt happen
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
 msgid "Published"
 msgstr "Опубликовано"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365
 msgid "Address(es)"
 msgstr "Адрес(а)"
 
 # This term intentionally left in English
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378
 msgid "cost"
 msgstr "cost"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "Hidden or starting up"
 msgstr "В скрытом режиме или недавно запущен"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "SSU"
 msgstr "SSU"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "SSU with introducers"
 msgstr "SSU через посредников"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP"
 msgstr "NTCP"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP and SSU"
 msgstr "NTCP и SSU"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404
 msgid "NTCP and SSU with introducers"
 msgstr "NTCP и SSU через посредников"
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:93
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:92
 #, java-format
 msgid "News last updated {0} ago."
 msgstr "Новости последний раз обновлялись {0} назад."
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:99
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:98
 #, java-format
 msgid "News last checked {0} ago."
 msgstr "Новости последний раз проверялись {0} назад."
@@ -2738,132 +2738,132 @@ msgid "Downloading plugin"
 msgstr "Загружается плагин"
 
 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:185
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:245
 #, java-format
 msgid "{0}B transferred"
 msgstr "{0} байт скачано"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:152
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153
 msgid "Plugin downloaded"
 msgstr "Плагин загружен"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:157
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:344
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356
 #, java-format
 msgid "Cannot create plugin directory {0}"
 msgstr "Не удалось создать директорию плагина {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:166
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:226
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:299
 #, java-format
 msgid "from {0}"
 msgstr "из {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:176
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177
 #, java-format
 msgid "Plugin from {0} is corrupt"
 msgstr "Загруженный из {0} плагин поврежден"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:187
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188
 #, java-format
 msgid "Plugin from {0} does not contain the required configuration file"
 msgstr "Загруженный из {0} плагин не содержит необходимого файла настроек"
 
 #. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:200
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201
 #, java-format
 msgid "Plugin from {0} contains an invalid key"
 msgstr "Загруженный из {0} плагин содержит некорректный ключ"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:219
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:228
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:237
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249
 #, java-format
 msgid "Plugin signature verification of {0} failed"
 msgstr "Плагин {0} содержит недействительную подпись"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:252
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264
 #, java-format
 msgid "Plugin from {0} has invalid name or version"
 msgstr "Загруженный из {0} плагин имеет некорректное название или версию"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:257
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269
 #, java-format
 msgid "Plugin {0} has mismatched versions"
 msgstr "Плагин {0} содержит несовпадающие версии"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:265
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277
 #, java-format
 msgid "This plugin requires I2P version {0} or higher"
 msgstr "Для этого плагина требуется версия I2P {0} и выше"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:273
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285
 #, java-format
 msgid "This plugin requires Java version {0} or higher"
 msgstr "Для этого плагина требуется версия Java {0} и выше"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:281
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
 msgid "Downloaded plugin is for new installs only, but the plugin is already installed"
 msgstr "Загруженный инсталлятор плагина предназначен только для первоначальной установки, но такой плагин уже установлен"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305
 msgid "Installed plugin does not contain the required configuration file"
 msgstr "Установленный плагин не содержит необходимого файла настроек"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:301
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313
 msgid "Signature of downloaded plugin does not match installed plugin"
 msgstr "Подпись загруженного плагина не совпадает с установленным плагином"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:308
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320
 #, java-format
 msgid "Downloaded plugin version {0} is not newer than installed plugin"
 msgstr "Версия скачанного плагина {0} не новее версии уже установленного плагина"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:315
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or higher"
 msgstr "Для обновления плагина требуется установленная версия плагина {0} и выше"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:322
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or lower"
 msgstr "Для обновления плагина требуется установленная версия плагина {0} и ниже"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:339
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351
 msgid "Plugin is for upgrades only, but the plugin is not installed"
 msgstr "Загруженный инсталлятор плагина предназначен только для обновления, но такой плагин ещё не был установлен"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:352
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364
 #, java-format
 msgid "Failed to install plugin in {0}"
 msgstr "Не удалось установить плагин в {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:359
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371
 #, java-format
 msgid "Plugin {0} installed, router restart required"
 msgstr "Плагин {0} установлен, требуется перезапуск маршрутизатора"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:361
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373
 #, java-format
 msgid "Plugin {0} installed"
 msgstr "Плагин {0} установлен"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:379
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391
 #, java-format
 msgid "Plugin {0} installed and started"
 msgstr "Плагин {0} установлен и запущен"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:382
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394
 #, java-format
 msgid "Plugin {0} installed but failed to start, check logs"
 msgstr "Плагин {0} установлен, но при его запуске произошел сбой, загляните в логи"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:384
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396
 #, java-format
 msgid "Plugin {0} installed but failed to start"
 msgstr "Плагин {0} установлен, но при его запуске произошел сбой"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406
 #, java-format
 msgid "Failed to download plugin from {0}"
 msgstr "Не удалось скачать плагин из {0}"
@@ -2874,37 +2874,46 @@ msgstr "Профили пиров"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73
 #, java-format
-msgid "Showing {0} recent profiles."
-msgstr "Показано {0} недавно обновленных профилей"
+msgid "Showing 1 recent profile."
+msgid_plural "Showing {0} recent profiles."
+msgstr[0] "Показан {0} недавно обновленный профиль."
+msgstr[1] "Показано {0} недавно обновленных профиля."
+msgstr[2] "Показано {0} недавно обновленных профилей."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75
 #, java-format
-msgid "Hiding {0} older profiles."
-msgstr "Скрыто {0} устаревших профилей."
+msgid "Hiding 1 older profile."
+msgid_plural "Hiding {0} older profiles."
+msgstr[0] "Скрыт {0} устаревший профиль."
+msgstr[1] "Скрыто {0} более старых профиля."
+msgstr[2] "Скрыто {0} более старых профилей."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77
 #, java-format
-msgid "Hiding {0} standard profiles."
-msgstr "Также скрыто {0} стандартных профилей (кликните для показа)."
+msgid "Hiding 1 standard profile."
+msgid_plural "Hiding {0} standard profiles."
+msgstr[0] "Скрыт {0} стандартный профиль."
+msgstr[1] "Скрыто {0} стандартный профиля."
+msgstr[2] "Скрыто {0} стандартных профилей."
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82
 msgid "Groups (Caps)"
 msgstr "Входит в группы (Caps)"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:353
 msgid "Speed"
 msgstr "Скорость"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:339
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:357
 msgid "Capacity"
 msgstr "Ёмкость"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
 msgid "Integration"
 msgstr "Интеграция"
 
@@ -2930,7 +2939,7 @@ msgid "Failing"
 msgstr "Сбоит"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282
 msgid "Integrated"
 msgstr "Интегрированные"
 
@@ -2943,153 +2952,158 @@ msgstr "Недоступен"
 msgid "Test Fails"
 msgstr "Неудачных тестов"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177
 msgid "profile"
 msgstr "профиль"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186
 msgid "Floodfill and Integrated Peers"
 msgstr "Floodfill и хорошо интегрированные пиры"
 
 # This term intentionally left in English
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
 msgid "Caps"
 msgstr "Caps"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
 msgid "Integ. Value"
 msgstr "Интег. Значение"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
 msgid "Last Heard About"
 msgstr "Последний раз слышали о"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
 msgid "Last Heard From"
 msgstr "Последний приём"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
 msgid "Last Good Send"
 msgstr "Последняя удачная передача"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
 msgid "Last Bad Send"
 msgstr "Последняя неудачная передача"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
 msgid "10m Resp. Time"
 msgstr "Время отклика (последние 10 мин)"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
 msgid "1h Resp. Time"
 msgstr "Время отклика (последний 1 час)"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
 msgid "1d Resp. Time"
 msgstr "Время отклика (последний 1 день)"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
 msgid "Last Good Lookup"
 msgstr "Последний удачный поиск"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
 msgid "Last Bad Lookup"
 msgstr "Последний неудачный поиск"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
 msgid "Last Good Store"
 msgstr "Последнее удачное размещение"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
 msgid "Last Bad Store"
 msgstr "Последнее неудачное размещение"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203
 msgid "1h Fail Rate"
 msgstr "Уровень отказов за 1 час"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204
 msgid "1d Fail Rate"
 msgstr "Уровень отказов за 1 день"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
 msgid "Thresholds"
 msgstr "Пороговые значения"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
 msgid "fast peers"
 msgstr "быстрые пиры"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
 msgid "high capacity peers"
 msgstr "высокоёмкие пиры"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
 msgid " well integrated peers"
 msgstr "хорошо интегрированные пиры"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
 msgid "as determined by the profile organizer"
 msgstr "определяется автоматически модулем ProfileOrganizer на основании собранной информации о производительности пира"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
 msgid "groups"
 msgstr "группы"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
 msgid "capabilities in the netDb, not used to determine profiles"
 msgstr "информация о пире, предоставленная сетевой базой данных; для профилирования не используется"
 
 # This term intentionally left in English
 #. capabilities
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
 #: ../java/strings/Strings.java:81
 msgid "caps"
 msgstr "caps"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
 msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel"
 msgstr "пиковая скорость (байты/секунду) выданная пиром на одном туннеле за 1-минутый период"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
 msgid "speed"
 msgstr "скорость"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
 msgid "capacity"
 msgstr "ёмкость"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
 msgid "how many tunnels can we ask them to join in an hour?"
 msgstr "к скольким туннелям мы можем попросить этого пира подсоединиться за час?"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
 msgid "how many new peers have they told us about lately?"
 msgstr "о скольких новых пирах этот пир нам сообщил в последнее время?"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
 msgid "integration"
 msgstr "интеграция"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
 msgid "is the peer banned, or unreachable, or failing tunnel tests?"
 msgstr "забанен ли этот пир, недоступен, дает ошибки на тестах?"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264
 msgid "status"
 msgstr "статус"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:410
+msgid "none"
+msgstr "нет"
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:62
 #, java-format
 msgid "Temporary ban expiring in {0}"
 msgstr "Временный бан истекает через {0}"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64
 #, java-format
 msgid "Banned until restart or in {0}"
 msgstr "Забанен до перезапуска или истечения {0}"
 
-#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:76
 msgid "unban now"
 msgstr "разбанить"
 
@@ -3144,20 +3158,20 @@ msgstr "Собираемые данные округляются за 1-мину
 msgid "These statistics are primarily used for development and debugging."
 msgstr "Эта статистика в основном используется для разработки и отладки."
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:105
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:156
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:106
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:157
 msgid "No lifetime events"
 msgstr "Нет событий за время работы"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:116
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:117
 msgid "frequency"
 msgstr "частота"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:120
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:121
 msgid "Rolling average events per period"
 msgstr "Скользящее среднее количество событий за период"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:124
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:125
 msgid "Highest events per period"
 msgstr "Максимально количество событий за период"
 
@@ -3168,58 +3182,75 @@ msgstr "Максимально количество событий за пери
 #. }
 #. 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
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:136
 msgid "Lifetime average events per period"
 msgstr "Среднее количество событий за период"
 
 #. Display the strict average
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:140
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:141
 msgid "Lifetime average frequency"
 msgstr "Средняя частота за время работы"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:168
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:144
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:234
+#, java-format
+msgid "1 event"
+msgid_plural "{0} events"
+msgstr[0] "{0} событие"
+msgstr[1] "{0} события"
+msgstr[2] "{0} событий"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:169
 msgid "rate"
 msgstr "интервал"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:170
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:171
 msgid "Average"
 msgstr "Среднее"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:173
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:174
 msgid "Highest average"
 msgstr "Максимальное среднее"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:202
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:201
+#, java-format
+msgid "There was 1 event in this period."
+msgid_plural "There were {0} events in this period."
+msgstr[0] "Было {0} событие в этом периоде."
+msgstr[1] "Было {0} события в этом периоде."
+msgstr[2] "Было {0} событий в этом периоде."
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:203
 #, java-format
-msgid "in this period which ended {0} ago."
-msgstr "в этом периоде который закончился {0} назад."
+msgid "The period ended {0} ago."
+msgstr "Период закончился {0} назад."
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:204
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:205
 msgid "No events"
 msgstr "Нет событий"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:210
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:211
 msgid "Average event count"
 msgstr "Среднее число событий"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:212
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:213
 msgid "Events in peak period"
 msgstr "Событий за период пика"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:220
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:221
 msgid "Graph Data"
 msgstr "График данных"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:222
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:223
 msgid "Graph Event Count"
 msgstr "График количества событий"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:225
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:226
 msgid "Export Data as XML"
 msgstr "Экспорт данных в XML"
 
 #. Display the strict average
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:230
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:231
 msgid "Lifetime average value"
 msgstr "Среднее значение за время работы"
 
@@ -3280,12 +3311,12 @@ msgid "I2P Internals"
 msgstr "Настройки I2P"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379
 msgid "View existing tunnels and tunnel build status"
 msgstr "Обзор списка существующих туннелей и статуса строящихся"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253
 msgid "Show all current peer connections"
 msgstr "Просмотр списка текущих соединения с пирами"
 
@@ -3327,7 +3358,7 @@ msgid "Textual router performance statistics"
 msgstr "Статистика производительности маршрутизатора в текстовом виде"
 
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:365
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:370
 msgid "Local Destinations"
 msgstr "Локальные туннели"
 
@@ -3372,203 +3403,205 @@ msgstr "Время работы"
 msgid "Help with configuring your firewall and router for optimal I2P performance"
 msgstr "Помощь в настройке брандмауэра и маршрутизатора для обеспечения оптимальной производительности I2P"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231
-msgid "Download"
-msgstr "Скачать"
+#. Note to translators: parameter is a version, e.g. "0.8.4"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:232
+#, java-format
+msgid "Download {0} Update"
+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>
 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240
-msgid "Download Unsigned"
-msgstr "Скачать неподписанное"
+#, java-format
+msgid "Download Unsigned<br>Update {0}"
+msgstr "Скачать неподписанное<br>обновление {0}"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261
 msgid "Active"
 msgstr "Активные"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270
 msgid "Fast"
 msgstr "Быстрые"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276
 msgid "High capacity"
 msgstr "Высокоёмкие"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288
 msgid "Known"
 msgstr "Известные"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:308
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303
 msgid "Help with firewall configuration"
 msgstr "Помощь в настройке брандмауэра"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:310
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:305
 msgid "Check NAT/firewall"
 msgstr "Проверьте настройки NAT/брандмауэров."
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:330
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:325
 msgid "Reseed"
 msgstr "Повторить начальную загрузку"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:347
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:342
 msgid "Configure router bandwidth allocation"
 msgstr "Настройка ограничений скорости"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:344
 msgid "Bandwidth in/out"
 msgstr "Трафик (вх./исх.)"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:369
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:364
 msgid "Total"
 msgstr "Всего"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:371
 msgid "Used"
 msgstr "Объём"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:391
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386
 msgid "Exploratory"
 msgstr "Зондирующие"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398
 msgid "Participating"
 msgstr "Транзитные"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:409
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404
 msgid "Share ratio"
 msgstr "Доля транзита"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:410
 msgid "What's in the router's job queue?"
 msgstr "Просмотр очереди заданий маршрутизатора."
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412
 msgid "Congestion"
 msgstr "Занятость"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417
 msgid "Job lag"
 msgstr "Задержка задач"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:428
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:423
 msgid "Message delay"
 msgstr "Задежка сообщений"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:434
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:429
 msgid "Tunnel lag"
 msgstr "Задержка туннелей"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435
 msgid "Backlog"
 msgstr "Очередь"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:101
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:106
 msgid "ERR-Client Manager I2CP Error - check logs"
 msgstr "ОШИБКА - ошибка менеджера I2CP - загляните в логи"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:108
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:113
 #, java-format
 msgid "ERR-Clock Skew of {0}"
 msgstr "ОШИБКА - Часы сбиты (расхождение {0})"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:117
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:122
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
 msgid "OK"
 msgstr "OK"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:118
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:123
 msgid "ERR-Private TCP Address"
 msgstr "ОШИБКА - Частный TCP Адрес"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:120
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:125
 msgid "ERR-SymmetricNAT"
 msgstr "ОШИБКА - Симмметричный NAT"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:123
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:128
 msgid "WARN-Firewalled with Inbound TCP Enabled"
 msgstr "ПРЕДУПРЕЖДЕНИЕ - Заблокирован извне при включенном на вход TCP"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:125
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:130
 msgid "WARN-Firewalled and Floodfill"
 msgstr "ПРЕДУПРЕЖДЕНИЕ - Заблокирован извне и Floodfill"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:127
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:132
 msgid "WARN-Firewalled and Fast"
 msgstr "ПРЕДУПРЕЖДЕНИЕ - Заблокирован извне и Быстрый"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:128
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:133
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
 msgid "Firewalled"
 msgstr "Заблокирован извне"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:130
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:135
 msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
 msgstr "ОШИБКА - UDP-порт уже занят - перенастройте i2np.udp.internalPort=xxxx в дополнительных настройках и перезапустите маршрутизатор"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:136
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:141
 msgid "ERR-No Active Peers, Check Network Connection and Firewall"
 msgstr "ОШИБКА - Нет активных пиров, проверьте подключение к сети и брандмауэр"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:139
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:144
 msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
 msgstr "ОШИБКА - UDP отключено и не заданы адрес/порт для входящих TCP-соединений"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:141
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:146
 msgid "WARN-Firewalled with UDP Disabled"
 msgstr "ПРЕДУПРЕЖДЕНИЕ - Заблокирован  извне при отключенном UDP"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:143
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
 msgid "Testing"
 msgstr "Проверка"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:365
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:370
 msgid "Add/remove/edit &amp; control your client and server tunnels"
 msgstr "Управление клиентскими и серверными туннелями"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:377
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:382
 msgid "Server"
 msgstr "Сервер"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:381
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:386
 msgid "Show tunnels"
 msgstr "Перейти к списку туннелей"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:392
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:397
 msgid "Leases expired"
 msgstr "Срок аренды истек"
 
 #. red or yellow light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:392
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:393
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:397
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:398
 msgid "Rebuilding"
 msgstr "Построение заново"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:393
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:398
 msgid "ago"
 msgstr "назад"
 
 #. green light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:396
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:401
 msgid "Ready"
 msgstr "Готов к работе"
 
 #. yellow light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:400
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
 msgid "Building"
 msgstr "Построение"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:400
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
 msgid "Building tunnels"
 msgstr "Построение туннелей"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
-msgid "none"
-msgstr "нет"
-
 #. tunnel nicknames, taken from i2ptunnel.config so they will display
 #. nicely under 'local destinations' in the summary bar
 #. note that if the wording changes in i2ptunnel.config, we have to
 #. keep the old string here as well for existing installs
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:416
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:421
 #: ../java/strings/Strings.java:36
 msgid "shared clients"
 msgstr "коллективные клиенты"
@@ -3598,10 +3631,14 @@ msgstr "текущ."
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:63
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:287
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:309
 msgid "configure"
 msgstr "настроить"
 
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61
+msgid "Client tunnels for"
+msgstr "Клиентские туннели для:"
+
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:65
 msgid "dead"
 msgstr "мертв"
@@ -3726,59 +3763,70 @@ msgstr "Транзитных туннелей"
 msgid "Totals"
 msgstr "Всего"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:132
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:145
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:178
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:143
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:238
 msgid "Updating"
 msgstr "Загружается обновление"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:189
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:214
+#. Process the .sud/.su2 file
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:117
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:262
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:287
 msgid "Update downloaded"
 msgstr "Обновление загружено"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:91
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:92
 #, java-format
 msgid "Unsigned update file from {0} is corrupt"
 msgstr "Обнаружено повреждение в неподписанном обновлении загруженном из {0}"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:209
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:282
 msgid "Restarting"
 msgstr "Производится перезапуск"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:216
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:119
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:289
 msgid "Click Restart to install"
 msgstr "Перезапустите I2P-маршрутизатор для установки"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:218
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:291
 msgid "Click Shutdown and restart to install"
 msgstr "Остановите и снова запустите I2P-маршрутизатор для установки"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:220
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:122
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:293
 #, java-format
 msgid "Version {0}"
 msgstr "Версия {0}"
 
-#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:126
+#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:127
 #, java-format
 msgid "Failed copy to {0}"
 msgstr "Не удалось скопировать в {0}"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:209
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:185
+#, java-format
+msgid "Updating from {0}"
+msgstr "Обновление из {0}"
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:254
+#, java-format
+msgid "No new version found at {0}"
+msgstr "Новая версия не обнаружена на {0}"
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:282
 msgid "Update verified"
 msgstr "Подлинность обновления проверена"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:234
-msgid "Transfer failed"
-msgstr "Не удалось загрузить"
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:308
+#, java-format
+msgid "Transfer failed from {0}"
+msgstr "Не удалось произвести передачу файлов от {0}"
 
 #. wars for ConfigClientsHelper
 #: ../java/strings/Strings.java:12
@@ -4052,1198 +4100,1451 @@ msgstr "Низкоуровневая скорость передачи"
 msgid "How many peers we are actively talking with"
 msgstr "Количество пиров, с которыми мы активно общаемся"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:112
 msgid "config networking"
 msgstr "настройки сети"
 
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:222
+msgid "Summary Bar"
+msgstr "Панель состояния"
+
 #. We have intl defined when this is included, but not when compiled standalone.
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:230
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:227
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:222
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:215
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:235
 msgid "Refresh (s)"
 msgstr "Интервал автообновления<br> панели (сек.)"
 
 #. ditto
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:234
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:226
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:219
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:237
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:254
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:239
 msgid "Enable"
 msgstr "Включить"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:262
 msgid "I2P Network Configuration"
 msgstr "Настройки сетевых свойств I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:298
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:316
 msgid "Bandwidth limiter"
 msgstr "Ограничение скорости"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:300
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318
 msgid "I2P will work best if you configure your rates to match the speed of your internet connection."
 msgstr "I2P будет работать лучше, если Вы настроите ограничение скорости в соответствии со скоростью Вашего подключения к Интернету."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:322
 msgid "KBps In"
 msgstr "Килобайт/секунду (на приём)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336
 msgid "KBps Out"
 msgstr "Килобайт/секунду (на отдачу)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:352
 msgid "Share"
 msgstr "Доля транзитного трафика"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:341
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:326
 msgid "NOTE"
 msgstr "ПРИМЕЧАНИЕ"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361
 #, java-format
 msgid "You have configured I2P to share only {0} KBps."
 msgstr "Вы настроили очень низкий лимит для транзитного трафика (всего {0} килобайт/секунду)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:364
 msgid "I2P requires at least 12KBps to enable sharing. "
 msgstr "I2P нужно как минимум 12 килобайт/секунду для включения этой функции. "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365
 msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. "
 msgstr "Пожалуйста, повысьте долю транзитного трафика. "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:366
 msgid "It improves your anonymity by creating cover traffic, and helps the network."
 msgstr "Это одновременно повысит Вашу анонимность (благодаря маскирующему транзитному трафику) и поможет сети."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369
 #, java-format
 msgid "You have configured I2P to share {0} KBps."
 msgstr "Вы задали долю транзитного трафика {0} килобайт/секунду."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:354
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:372
 msgid "The higher the share bandwidth the more you improve your anonymity and help the network."
 msgstr "Чем выше доля транзитного трафика, тем выше Ваша анонимность и больше Ваша помощь сети."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:358
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:342
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:322
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:425
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:383
 msgid "Cancel"
 msgstr "Отменить"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:393
 msgid "IP and Transport Configuration"
 msgstr "Настройки IP и транспортных протоколов"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324
 msgid "The default settings will work for most people."
 msgstr "Большинству пользователей подойдут настройки по умолчанию."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397
 msgid "There is help below."
 msgstr "В конце страницы приведена справка по настройкам."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
 msgid "UPnP Configuration"
 msgstr "Настройки UPnP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403
 msgid "Enable UPnP to open firewall ports"
 msgstr "Использовать UPnP для автоматического открытия портов на брандмауэре/роутере"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405
 msgid "UPnP status"
 msgstr "статус UPnP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407
 msgid "IP Configuration"
 msgstr "Настройки IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
 msgid "Externally reachable hostname or IP address"
 msgstr " Имя хоста или IP-адрес доступные из интернета"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413
 msgid "Use all auto-detect methods"
 msgstr "Определять автоматически всеми доступными способами"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
 msgid "Disable UPnP IP address detection"
 msgstr "Определять автоматически (без использования UPnP)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421
 msgid "Ignore local interface IP address"
 msgstr "Определять автоматически (без использования IP-адресов локальных сетевых интерфейсов)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425
 msgid "Use SSU IP address detection only"
 msgstr "Определять автоматически (только через SSU)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497
 msgid "Specify hostname or IP"
 msgstr "Задать хост или IP вручную"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
 msgid "Select Interface"
 msgstr "Выбрать сетевой интерфейс"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449
 msgid "Hidden mode - do not publish IP"
 msgstr "Скрытый режим, не публиковать IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:433
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451
 msgid "(prevents participating traffic)"
 msgstr "(такой режим предотвращает транзит трафика)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453
 msgid "Action when IP changes"
 msgstr "Действие при смене IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457
 msgid "Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity"
 msgstr "Режим мобильного компьютера:  автоматически менять идентификатор маршрутизатора и UDP-порт после смены IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:441
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
 msgid "Experimental"
 msgstr "экспериментальный режим, повышает анонимность"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
 msgid "UDP Configuration:"
 msgstr "Настройки UDP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:445
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463
 msgid "UDP port:"
 msgstr "UDP-порт:"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477
 msgid "TCP Configuration"
 msgstr "Настройки TCP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:465
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:483
 msgid "Use auto-detected IP address"
 msgstr "Использовать автоматически определенный IP-адрес"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:467
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517
 msgid "currently"
 msgstr "сейчас"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:471
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489
 msgid "if we are not firewalled"
 msgstr "если входящий порт не заблокирован"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:475
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493
 msgid "Always use auto-detected IP address (Not firewalled)"
 msgstr "Всегда использовать автоматически определенный IP-адрес"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:503
 msgid "Disable inbound (Firewalled)"
 msgstr "Отключить поддержку входящих соединений"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:507
 msgid "Completely disable"
 msgstr "Полностью отключить поддержку TCP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:491
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509
 msgid "(select only if behind a firewall that throttles or blocks outbound TCP)"
 msgstr "(используйте этот режим только при наличии в системе брандмауэра, который замедляет или блокирует исходящие TCP-соединения)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511
 msgid "Externally reachable TCP port"
 msgstr "Доступный из интернета TCP-порт"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515
 msgid "Use the same port configured for UDP"
 msgstr "Использовать настройки UDP-порта"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:505
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523
 msgid "Specify Port"
 msgstr "Задать порт вручную"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:348
 msgid "Note"
 msgstr "ВНИМАНИЕ"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:530
 msgid "Changing these settings will restart your router."
 msgstr "Изменение этих настроек повлечет перезапуск I2P маршрутизатора."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536
 msgid "Configuration Help"
 msgstr "Справка по настройкам сети"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
 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 соединений из интернета."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540
 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."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542
 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-посредников."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544
 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."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:528
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546
 msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
 msgstr "Некоторые виды брандмауэров могут быть частично несовместимы с I2P (например, симметричные NAT)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
 msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports."
 msgstr "UPnP используется для взаимодействия с IGD (Internet Gateway Devices) при определении внешнего IP-адреса и переадресации портов."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
 msgid "UPnP support is beta, and may not work for any number of reasons"
 msgstr "Поддержка UPnP находится в разработке (бета-версия). В следующих случаях UPnP возможно не будет работать"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559
 msgid "No UPnP-compatible device present"
 msgstr "Не обнаружено UPnP-совместимых устройств"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561
 msgid "UPnP disabled on the device"
 msgstr "UPnP отключено на устройстве"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
 msgid "Software firewall interference with UPnP"
 msgstr "Программный брандмауэр мешает корректной работе UPnP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
 msgid "Bugs in the device's UPnP implementation"
 msgstr "UPnP в устройстве реализовано с ошибками "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
 msgid "Multiple firewall/routers in the internet connection path"
 msgstr "Несколько маршрутизаторов/брандмауэров на пути к интернету"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:551
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
 msgid "UPnP device change, reset, or address change"
 msgstr "Смена/сброс UPnP-устройства или изменение адреса "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:553
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571
 msgid "Review the UPnP status here."
 msgstr "Посмотреть статус UPnP можно тут."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573
 msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect."
 msgstr "UPnP можно включить/выключить в настройках выше. Настройка вступит в силу только после перезапуска I2P-маршрутизатора."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
 msgid "Hostnames entered above will be published in the network database."
 msgstr "Если Вы задали вручную имена хостов, они будут опубликованы в сетевой базе."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
 msgid "They are <b>not private</b>."
 msgstr "<b>Не вводите локальные внутрисетевые имена.</b>"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
 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 или 192.168.1.1."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
 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/брандмауэр."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
 msgid "When in doubt, leave the settings at the defaults."
 msgstr "Если сомневаетесь — оставьте настройки по умолчанию."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
 msgid "Reachability Help"
 msgstr "Справка по статусу сетевой доступности"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590
 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 все еще показывает, что порт закрыт. Имейте в виду, что брандмауэров может быть несколько, например, локальный программный и внешний аппаратный."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
 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> могут помочь диагностировать проблему."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
 msgid "Your UDP port does not appear to be firewalled."
 msgstr "Ваш UDP-порт доступен извне."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
 msgid "Your UDP port appears to be firewalled."
 msgstr "Ваш UDP-порт заблокирован брандмауэром и не может принимать входящие соединения."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
 msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error."
 msgstr "Иногда это сообщение не соответствует действительности (методы обнаружения брандмауэров пока не идеальны)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
 msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port."
 msgstr "Но если оно появляется постоянно, Вам следует проверить, что на всех брандмауэрах порт для I2P открыт."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
 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 сможет работать даже с заблокированным портом при помощи заранее выбранных «посредников» для ретрансляции входящих соединений."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609
 msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)."
 msgstr "С другой стороны, при работе с открытым портом Вы получите гораздо больше транзитного трафика и сможете помочь сети."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
 msgid "If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control."
 msgstr "Возможно Вы собственноручно открыли порт на Вашем брандмауэре, но ошибка всё равно появляется. Имейте в виду, что Вы можете быть одновременно за программным и аппаратным брандмауэрами или за дополнительным корпоративным брандмауэром (который Вы не можете контролировать)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
 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."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
 msgid "The router is currently testing whether your UDP port is firewalled."
 msgstr "Маршрутизатор проверяет возможность принятия входящих соединений на UDP-порт."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
 msgid "The router is not configured to publish its address, therefore it does not expect incoming connections."
 msgstr "В настройках I2P-маршрутизатора запрещена публикация его адреса, как результат, маршрутизатор не ожидает входящих соединений."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
 msgid "WARN - Firewalled and Fast"
 msgstr "ПРЕДУПРЕЖДЕНИЕ - Заблокирован извне и Быстрый"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
 msgid "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/config_jsp.java:609
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
 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 будет работать нормально в такой конфигурации, но Вы можете помочь сети разблокировав входящий порт, если у Вас действительно быстрый интернет."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
 msgid "WARN - Firewalled and Floodfill"
 msgstr "ПРЕДУПРЕЖДЕНИЕ - Заблокирован извне и Floodfill"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
 msgid "You have configured I2P to be a floodfill router, but you are firewalled."
 msgstr "Вы настроили I2P работать в режиме floodfill-маршрутизатора, при этом у Вас заблокирован входящий порт."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
 msgid "For best participation as a floodfill router, you should open your firewall."
 msgstr "Для оптимальной работы в качестве floodfill-маршрутизатора Вам нужно разблокировать входящий порт."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
 msgid "WARN - Firewalled with Inbound TCP Enabled"
 msgstr "ПРЕДУПРЕЖДЕНИЕ - Заблокирован извне при включенном на вход TCP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
 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-порт тоже заблокирован."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
 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. Это повредит производительности сети. "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
 msgid "Please open your firewall or disable inbound TCP above."
 msgstr "Пожалуйста, проверьте состояние TCP-порта и разблокируйте его или отключите поддержку входящих TCP-соединений."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
 msgid "WARN - Firewalled with UDP Disabled"
 msgstr "ПРЕДУПРЕЖДЕНИЕ - Заблокирован извне при отключенном UDP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
 msgid "You have configured inbound TCP, however you have disabled UDP."
 msgstr "Вы отключили поддержку UDP, однако Ваш TCP-порт заблокирован и в результате Ваш маршрутизатор не может принимать входящие соединения."
 
 # This string intentionally left blank
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
 msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections."
 msgstr " "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
 msgid "Please open your firewall or enable UDP."
 msgstr "Пожалуйста, разблокируйте порт или включите поддержку UDP."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
 msgid "ERR - Clock Skew"
 msgstr "ОШИБКА - Часы сбиты"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
 msgid "Your system's clock is skewed, which will make it difficult to participate in the network."
 msgstr "Ваши системные часы сильно отстают/спешат. Это помешает Вашему участию в сети."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655
 msgid "Correct your clock setting if this error persists."
 msgstr "Поправьте настройки времени, если Вы постоянно видите это сообщение об ошибке."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657
 msgid "ERR - Private TCP Address"
 msgstr "ОШИБКА - Частный TCP Адрес"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659
 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-адреса."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661
 msgid "Correct the address or disable inbound TCP above."
 msgstr "Исправьте адрес или отключите поддержку входящих TCP-соединений."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663
 msgid "ERR - SymmetricNAT"
 msgstr "ОШИБКА - Симметричный NAT"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665
 msgid "I2P detected that you are firewalled by a Symmetric NAT."
 msgstr "I2P обнаружил, что Вы за симметричным NAT."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667
 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 не очень хорошо работает за таким типом брандмауэров. Скорее всего Вы не сможете принимать входящие соединения и это снизит эффективность Вашего участия в сети."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669
 msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
 msgstr "ОШИБКА - UDP-порт уже занят - перенастройте i2np.udp.internalPort=xxxx в дополнительных настройках и перезапустите маршрутизатор"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671
 msgid "I2P was unable to bind to port 8887 or other configured port."
 msgstr "I2P не удалось связать порт 8887 (или тот, что у Вас настроен)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673
 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."
 
 # This string intentionally left blank
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:675
 msgid "This may be a transient error, if the other program is no longer using the port."
 msgstr " "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:677
 msgid "However, a restart is always required after this error."
 msgstr "После возникновения этой ошибки необходим перезапуск I2P."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:679
 msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
 msgstr "ОШИБКА - UDP отключено и не заданы адрес/порт для входящих TCP-соединений"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:681
 msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP."
 msgstr "Вы не задали адрес/порт для входящих TCP-соединений и одновременно отключили поддержку UDP, в результате Ваш маршрутизатор не может принимать входящие соединения."
 
 # This string intentionally left blank
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:683
 msgid "Therefore your router cannot accept inbound connections."
 msgstr " "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:685
 msgid "Please configure a TCP host and port above or enable UDP."
 msgstr "Пожалуйста, настройте адрес/порт для TCP или включите поддержку UDP."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:687
 msgid "ERR - Client Manager I2CP Error - check logs"
 msgstr "ОШИБКА - ошибка менеджера I2CP - загляните в логи"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:689
 msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
 msgstr "Эта ошибка обычно возникает из-за конфликта порта 7654. Загляните в логи чтобы убедиться."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:691
 msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P."
 msgstr "Не запущена ли у вас ещё одна копия I2P? Остановите вызвавшую конфликт программу и перезапустите I2P."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:113
 msgid "config advanced"
 msgstr "дополнительные настройки"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:263
 msgid "I2P Advanced Configuration"
 msgstr "Дополнительные настройки I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:319
 msgid "Advanced I2P Configuration"
 msgstr "Дополнительные настройки I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:329
 msgid "Some changes may require a restart to take effect."
 msgstr "Для вступления некоторых изменений в силу может потребоваться перезапуск I2P-маршрутизатора."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:112
 msgid "config clients"
 msgstr "настройки клиентов"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:265
 msgid "I2P Client Configuration"
 msgstr "Настройки клиентов I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330
 msgid "Client Configuration"
 msgstr "Настройки клиентов"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:314
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:332
 msgid "The Java clients listed below are started by the router and run in the same JVM."
 msgstr "Перечисленные ниже Java-клиенты запускаются маршрутизатором внутри своей JVM."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338
 msgid "To change other client options, edit the file"
 msgstr "Для изменения других клиентских настроек отредактируйте файл"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439
 msgid "All changes require restart to take effect."
 msgstr "Для вступления изменённых настроек в силу потребуется перезапуск маршрутизатора."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357
+msgid "Advanced Client Interface Configuration"
+msgstr "Дополнительные настройки клиентского интерфейса"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361
+msgid "External I2CP (I2P Client Protocol) Interface Configuration"
+msgstr "Настройки внешнего интерфейса I2CP (I2P Client Protocol)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367
+msgid "Enabled without SSL"
+msgstr "Включен без требования SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373
+msgid "Enabled with SSL required"
+msgstr "Включен с требованием SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379
+msgid "Disabled - Clients outside this Java process may not connect"
+msgstr "Выключен - клиенты снаружи данного Java-процесса могут не соединяться"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:381
+msgid "I2CP Port"
+msgstr "Порт I2CP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385
+msgid "I2CP Interface"
+msgstr "I2CP-интерфейс"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401
+msgid "Authorization"
+msgstr "Авторизация "
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407
+msgid "Require username and password"
+msgstr "Требовать имя пользователя и пароль"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409
+msgid "Username"
+msgstr "Имя пользователя"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413
+msgid "Password"
+msgstr "Пароль"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:419
+msgid "Any changes made here must also be configured in the external client."
+msgstr "Любые изменения, сделанные здесь, так же должны быть выполнены во внешнем клиенте."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421
+msgid "Many clients do not support SSL or authorization."
+msgstr "Многие клиенты не поддерживают SSL или авторизацию."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429
 msgid "WebApp Configuration"
 msgstr "Настройки веб-апплетов"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431
 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 separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)."
 msgstr "Перечисленные ниже Java веб-апплеты запускаются консолью маршрутизатора внутри JVM маршрутизатора. Обычно эти приложения доступны через консоль маршрутизатора. Это могут быть как самостоятельные приложения (например, i2psnark), так и интерфейсы к другим приложениям или клиентам, которые надо включать отдельно (например, susidns, i2ptunnel), либо могут вообще не иметь веб-интерфейса (например, addressbook)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433
 msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method."
 msgstr "Веб-апплет также можно отключить, просто удалив .war-файл из директории webapps. Однако при  обновлении маршрутизатора и .war-файл и соответствующее приложение будут возвращены на свои места, поэтому отключение веб-апплетов через эту страницу это более корректный способ."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:445
 msgid "Plugin Configuration"
 msgstr "Настройки плагинов"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:353
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:447
 msgid "The plugins listed below are started by the webConsole client."
 msgstr "Перечисленные ниже плагины запускаются клиентом webConsole."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455
 msgid "Plugin Installation"
 msgstr "Установка плагина"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:457
 msgid "To install a plugin, enter the download URL:"
 msgstr "Для установки нового плагина введите URL:"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:112
 msgid "config keyring"
 msgstr "настройки ключей"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:249
 msgid "I2P Keyring Configuration"
 msgstr "Настройки связки ключей I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:295
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317
 msgid "The router keyring is used to decrypt encrypted leaseSets."
 msgstr "Маршрутизатор использует связку ключей для дешифровки зашифрованных LeaseSet."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:298
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320
 msgid "The keyring may contain keys for local or remote encrypted destinations."
 msgstr "Связка ключей может хранить ключи как для локальных, так и для удаленных зашифрованных адресов назначения."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326
 msgid "Manual Keyring Addition"
 msgstr "Добавление ключей"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:328
 msgid "Enter keys for encrypted remote destinations here."
 msgstr "Здесь добавляются ключи для удаленных адресов назначения."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:331
 msgid "Keys for local destinations must be entered on the"
 msgstr "Ключи для локальных адресов назначения настраиваются в"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:333
 msgid "I2PTunnel page"
 msgstr "Менеджере Туннелей"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335
 msgid "Dest. name, hash, or full key"
 msgstr "Имя адреса назначения, хэш или полный ключ"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337
 msgid "Encryption Key"
 msgstr "Ключ шифрования"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:113
 msgid "config logging"
 msgstr "настройки логирования"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:263
 msgid "I2P Logging Configuration"
 msgstr "Настройки логирования I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
 msgid "Configure I2P Logging Options"
 msgstr "Настройка опций логирования I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321
 msgid "Logging filename"
 msgstr "Лог-файл"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325
 msgid "(the symbol '@' will be replaced during log rotation)"
 msgstr "(во время ротации лога символ @  будет заменен на номер)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327
 msgid "Log record format"
 msgstr "Формат записи"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331
 msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
 msgstr "(d = дата, c = класс, t = поток, p = приоритет, m = сообщение)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333
 msgid "Log date format"
 msgstr "Формат даты"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337
 msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)"
 msgstr "(MM = месяц, dd = день, HH = часы, mm = минуты, ss = секунды, SSS = миллисекунды)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339
 msgid "Max log file size"
 msgstr "Максимальный размер лог-файла"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:343
 msgid "Default log level"
 msgstr "Уровень детализации по умолчанию"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:347
 msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)"
 msgstr "(не рекомендуется использовать уровни DEBUG и INFO для постоянного использования, так как они сильно замедлят работу Вашего маршрутизатора)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:349
 msgid "Log level overrides"
 msgstr "Переопределения уровня логирования"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:353
 msgid "New override"
 msgstr "Новое переопределение"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:112
 msgid "config peers"
 msgstr "настройки пиров"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:249
 msgid "I2P Peer Configuration"
 msgstr "Настройки пиров I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323
 msgid "Manual Peer Controls"
 msgstr "Ручное управление пирами"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325
 msgid "Router Hash"
 msgstr "Хеш маршрутизатора"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:329
 msgid "Manually Ban / Unban a Peer"
 msgstr "Вручную забанить/разбанить этого пира"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:331
 msgid "Banning will prevent the participation of this peer in tunnels you create."
 msgstr "Бан запретит участие указанного пира в создаваемых Вами туннелях."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:341
 msgid "Adjust Profile Bonuses"
 msgstr "Настроить бонусы для этого пира"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343
 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 Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the"
 msgstr "Бонусы могут быть положительными и отрицательными и вводятся для управления включением пира в группы «Быстрые» и «Высокоёмкие»  (Быстрые пиры используются для построения клиентских туннелей, Высокоёмкие пиры используются для некоторых зондирующих туннелей). Текущие бонусы можно посмотреть на"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345
 msgid "profiles page"
 msgstr "странице профилей пиров"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:363
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:273
 msgid "Banned Peers"
 msgstr "Забаненные пиры"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:384
 msgid "Banned IPs"
 msgstr "Забаненные IP-адреса"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:112
+msgid "config reseeding"
+msgstr "настройка reseeding"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:262
+msgid "I2P Reseeding Configuration"
+msgstr "Настройки начального обнаружения узлов I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318
+msgid "Reseeding Configuration"
+msgstr "Настройки начального обнаружения узлов (reseeding)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:320
+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, или когда ваш роутер имеет слишком мало данных о других роутерах."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:322
+msgid "If reseeding has failed, you should first check your network connection."
+msgstr "Если начальная загрузка не удалась, первым делом вы должны проверить соединение с сетью."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:326
+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-прокси."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328
+#, java-format
+msgid "See {0} for instructions on reseeding manually."
+msgstr "Смотрите {0} на предмет инструкций как выполнить начальную загрузку вручную."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328
+msgid "the FAQ"
+msgstr "FAQ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330
+msgid "Reseed URL Selection"
+msgstr "Выбор URL для начальной загрузки"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336
+msgid "Try SSL first then non-SSL"
+msgstr "Сперва пробовать SSL, потом не-SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:342
+msgid "Use SSL only"
+msgstr "Использовать только SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348
+msgid "Use non-SSL only"
+msgstr "Использовать только не-SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350
+msgid "Reseed URLs"
+msgstr "Адреса reseed-узлов"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:354
+msgid "Enable HTTP proxy (not used for SSL)"
+msgstr "Использовать HTTP-прокси (не используется для SSL)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:358
+msgid "HTTP Proxy Host"
+msgstr "Хост HTTP-прокси"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:362
+msgid "HTTP Proxy Port"
+msgstr "Порт HTTP-прокси"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:112
 msgid "config service"
 msgstr "настройки службы"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:249
 msgid "I2P Service Configuration"
 msgstr "Настройки службы I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:285
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303
 msgid "Shutdown the router"
 msgstr "Выключить маршрутизатор"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:287
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305
 msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes."
 msgstr "Плавное выключение позволяет маршрутизатору перед остановкой отработать все поставленные задачи, но при этом на процесс выключения потребуется дополнительное время."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:289
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307
 msgid "If you need to kill the router immediately, that option is available as well."
 msgstr "Если маршрутизатор должен быть выключен немедленно, Вы можете выбрать соответствующую команду."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317
 msgid "If you want the router to restart itself after shutting down, you can choose one of the following."
 msgstr "Иногда, Вам нужно перегрузить маршрутизатор (например, после изменения базовых настроек, которые считываются приложением только во время запуска). В этом случае, Вам доступны два варианта. Плавный перезапуск займет несколько минут (но зато пиры, использующие Ваш маршрутизатор, будут Вам благодарны за терпение). Если Вы не можете ждать, выбирайте немедленный перезапуск. В случае немедленного перезапуска маршрутизатор запустится через одну минуту."
 
 # This string intentionally left blank
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319
 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 " "
 
 # This string intentionally left blank
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321
 msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately."
 msgstr " "
 
 # This string intentionally left blank
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323
 msgid "After tearing down the router, it will wait 1 minute before starting back up again."
 msgstr " "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333
 msgid "Systray integration"
 msgstr "Интеграция в область уведомлений"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335
 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, у Вас есть возможность отслеживать статус маршрутизатора через значок в области уведомлений"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337
 msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)."
 msgstr "(когда-нибудь и клиентские приложения для I2P будут там доступны)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339
 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:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341
+msgid "Show systray icon"
+msgstr "Показать значок статуса"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343
+msgid "Hide systray icon"
+msgstr "Спрятать значок статуса"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:345
 msgid "Run on startup"
 msgstr "Автоматический запуск I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347
 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 "Вы можете настроить автоматическую загрузку маршрутизатора при каждом запуске Windows. В зависимости от выбранной кнопки I2P немедленно установит или удалит свою службу из списка служб Windows."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349
 msgid "If you prefer the command line, you can also run the "
 msgstr "Если Вам удобно работать через командную строку, попробуйте использовать "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359
 msgid "If you are running I2P as service right now, removing it will shut down your router immediately."
 msgstr "Если служба I2P уже была запущена, при выборе варианта <b>\"Не запускать I2P при старте\"</b> маршрутизатор будет моментально остановлен."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361
 msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat."
 msgstr "Возможно лучше плавно остановить маршрутизатор и после этого запустить файл C:\\Program Files\\I2P\\uninstall_i2p_service_winnt.bat."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365
 msgid "Debugging"
 msgstr "Отладка"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:367
 msgid "View the job queue"
 msgstr "Просмотр очереди заданий"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:371
 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>."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:377
 msgid "Launch browser on router startup?"
 msgstr "Запускать браузер при старте I2P?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:379
 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 это веб-консоль. Здесь можно выбрать автоматическое открытие при запуске маршрутизатора страницы"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:113
 msgid "config stats"
 msgstr "настройки статистики"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:250
 msgid "I2P Stats Configuration"
 msgstr "Настройки статистики I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:320
 msgid "Configure I2P Stat Collection"
 msgstr "Настройки сбора статистики I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:322
 msgid "Enable full stats?"
 msgstr "Включить полную статистику?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329
 msgid "change requires restart to take effect"
 msgstr "изменения вступят в силу только после перезапуска маршрутизатора"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331
 msgid "Stat file"
 msgstr "Файл статистики"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:335
 msgid "Filter"
 msgstr "Фильтр"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:319
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:348
 msgid "toggle all"
 msgstr "переключить все"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:350
 msgid "Log"
 msgstr "Лог"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:332
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:352
 msgid "Graph"
 msgstr "График"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:371
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:391
 msgid "Advanced filter"
 msgstr "Дополнительный фильтр"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:112
 msgid "config tunnels"
 msgstr "настройки туннелей"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:262
 msgid "I2P Tunnel Configuration"
 msgstr "Настройки туннелей I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:328
 msgid "The default settings work for most people."
 msgstr "Большинству пользователей подойдут настройки по умолчанию. "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332
 msgid "There is a fundamental tradeoff between anonymity and performance."
 msgstr "Примите во внимание, что между анонимностью и эффективностью есть обратная связь — длинные туннели более анонимны, но хуже работают."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335
 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 хопов, а также большое количество туннелей (как обычных, так и резервных) могут привести к снижению производительности/надежности работы маршрутизатора."
 
 # This string intentionally left blank
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338
 msgid "High CPU and/or high outbound bandwidth usage may result."
 msgstr " "
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341
 msgid "Change these settings with care, and adjust them if you have problems."
 msgstr "Осторожно вносите изменения в существующие настройки и возвращайте в положение по умолчанию, если у Вас возникли проблемы."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:333
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:351
 msgid "Exploratory tunnel setting changes are stored in the router.config file."
 msgstr "Настройки зондирующих туннелей сохраняются в файле router.config."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:336
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:354
 msgid "Client tunnel changes are temporary and are not saved."
 msgstr "Настройки клиентских туннелей нигде не сохраняются и действуют только до перезапуска."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:356
 msgid "To make permanent client tunnel changes see the"
 msgstr "Для задания перманентных изменений в настройках клиентских туннелей воспользуйтесь"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:358
 msgid "i2ptunnel page"
 msgstr "менеджером туннелей"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:112
 msgid "config UI"
 msgstr "настройки интерфейса"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:262
 msgid "I2P UI Configuration"
 msgstr "Настройки пользовательского интерфейса I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:292
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314
 msgid "Router Console Theme"
 msgstr "Тема оформления консоли маршрутизатора"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:339
 msgid "Theme selection disabled for Internet Explorer, sorry."
 msgstr "Переключатель тем отключен для Internet Explorer, извините"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:341
 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 в настройках Вашего браузера (или прокси-сервера), если хотите использовать темы оформления"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:345
 msgid "Router Console Language"
 msgstr "Язык консоли маршрутизатора"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:349
 msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help."
 msgstr "Пожалуйста, помогите проекту перевода консоли маршрутизатора! Разработчики доступны для связи на IRC-канале #i2p"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:324
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353
 msgid "Apply"
 msgstr "Применить"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:112
 msgid "config update"
 msgstr "настройки обновления"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:249
 msgid "I2P Update Configuration"
 msgstr "Настройки обновлений I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321
 msgid "Check for I2P and news updates"
 msgstr "Настройки проверки обновлений и новостей I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:323
 msgid "News &amp; I2P Updates"
 msgstr "Новости и обновления I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327
 msgid "Update In Progress"
 msgstr "Выполняется обновление"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335
 msgid "News URL"
 msgstr "URL новостей"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339
 msgid "Refresh frequency"
 msgstr "Интервал проверки"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:345
 msgid "Update policy"
 msgstr "Режим обновления"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:349
 msgid "Update through the eepProxy?"
 msgstr "Обновлять через I2P-прокси?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:353
 msgid "eepProxy host"
 msgstr "Адрес I2P-прокси"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:357
 msgid "eepProxy port"
 msgstr "Порт I2P-прокси"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
 msgid "Update URLs"
 msgstr "URL обновлений"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365
 msgid "Trusted keys"
 msgstr "Доверенные ключи"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:351
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369
 msgid "Update with unsigned development builds?"
 msgstr "Обновлять до неподписанной тестовой сборки?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:355
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:373
 msgid "Unsigned Build URL"
 msgstr "URL неподписанной тестовой сборки"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:379
 msgid "I2P updates are disabled because you do not have write permission for the install directory."
 msgstr "Функция автообновления I2P недоступна: у Вас нет прав на запись в директорию I2P."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385
 msgid "Save"
 msgstr "Сохранить"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121
+msgid "Internal Error"
+msgstr "Внутренняя ошибка"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123
+msgid "Router Console"
+msgstr "Консоль маршрутизатора I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:127
+msgid "Configuration"
+msgstr "Настройки"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135
+msgid "Sorry! There has been an internal error."
+msgstr "К сожалению, была обнаружена внутренняя ошибка."
+
+#. note to translators - both parameters are URLs
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:254
+#, java-format
+msgid "Please report bugs on {0} or {1}."
+msgstr "Пожалуйста сообщайте об ошибках в багтрекер по адресу {0} или {1}."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258
+msgid "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:145
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:260
+msgid "Please include this information in bug reports"
+msgstr "Пожалуйста, добавляйте эту информацию в Ваши сообщения об ошибках"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147
+msgid "Error Details"
+msgstr "Подробности ошибки"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:149
+#, java-format
+msgid "Error {0}"
+msgstr "Ошибка {0}"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:169
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:250
+msgid "I2P Version and Running Environment"
+msgstr "Версия I2P и информация о среде выполнения"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:197
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:288
+msgid "Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report."
+msgstr "Имейте в виду, что информация о системе, временные метки в логах, и сами логи могут помочь выявить ваше местоположение; пожалуйста проверьте всё, что вы включаете в сообщение об ошибке."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:123
 msgid "Page Not Found"
 msgstr "Страница не найдена"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:264
 msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource."
 msgstr "Страница консоли маршрутизатора, которую вы запросили, не существует."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:266
 msgid "Error 404"
 msgstr "Ошибка 404"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:249
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:271
 msgid "not found"
 msgstr "не найдено"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:112
 msgid "graphs"
 msgstr "графики"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:249
 msgid "I2P Performance Graphs"
 msgstr "Графики производительности I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:111
 msgid "home"
 msgstr "Домашняя страница"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:331
+msgid "Welcome to I2P"
+msgstr "Добро пожаловать в I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:111
 msgid "job queue"
 msgstr "очередь заданий"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:248
 msgid "I2P Router Job Queue"
 msgstr "Очередь заданий маршрутизатора I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:111
 msgid "logs"
 msgstr "логи"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:248
 msgid "I2P Router Logs"
 msgstr "Логи маршрутизатора I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:228
-msgid "I2P Version & Running Environment"
-msgstr "Версия I2P & Информация о среде выполнения"
-
-#. note to translators - both parameters are URLs
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:232
-#, java-format
-msgid "Please report bugs on {0} or {1}."
-msgstr "Пожалуйста сообщайте об ошибках в багтрекер по адресу {0} или {1}."
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:236
-msgid "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/logs_jsp.java:238
-msgid "Please include this information in bug reports"
-msgstr "Пожалуйста, добавляйте эту информацию в Ваши сообщения об ошибках"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266
-msgid "Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report."
-msgstr "Имейте в виду, что информация о системе, временные метки в логах, и сами логи могут помочь выявить ваше местоположение; пожалуйста проверьте всё, что вы включаете в сообщение об ошибке."
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:281
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303
 msgid "Critical Logs"
 msgstr "Логи критических ошибок"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:285
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:307
 msgid "Router Logs"
 msgstr "Логи маршрутизатора"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:313
 msgid "Service (Wrapper) Logs"
 msgstr "Логи службы (wrapper)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:111
 msgid "network database summary"
 msgstr "сетевая база данных"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:248
 msgid "I2P Network Database Summary"
 msgstr "Обзор сетевой базы данных I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:115
 msgid "WebApp Not Found"
 msgstr "Веб-апплет не найден"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:230
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:252
 msgid "Web Application Not Running"
 msgstr "Веб-приложение не запущено"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:232
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:254
 msgid "The requested web application is not running."
 msgstr "Запрошенное веб-приложение не запущено."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:256
 msgid "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:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:111
 msgid "peer connections"
 msgstr "обзор пиров"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:248
 msgid "I2P Network Peers"
 msgstr "Соединения с пирами I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:111
 msgid "peer profiles"
 msgstr "профили пиров"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:248
 msgid "I2P Network Peer Profiles"
 msgstr "Профили пиров сети I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:111
 msgid "statistics"
 msgstr "статистика"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:265
 msgid "I2P Router Statistics"
 msgstr "Статистика маршрутизатора I2P"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:255
 #, java-format
 msgid "Disable {0} Refresh"
 msgstr "Отключить {0} автообновление"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:111
 msgid "tunnel summary"
 msgstr "обзор туннелей"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:248
 msgid "I2P Tunnel Summary"
 msgstr "Обзор туннелей I2P"
 
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:248
+msgid "Peer Profile"
+msgstr "Профиль пира"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:275
+#, java-format
+msgid "Profile for peer {0}"
+msgstr "Профиль пира {0}"
+
+#~ msgid "Download"
+#~ msgstr "Скачать"
+
+#~ msgid "System tray icon enabled."
+#~ msgstr "Включен значок-индикатор статуса в области уведомлений."
+
+#~ msgid "System tray icon feature not supported on this platform. Sorry!"
+#~ msgstr ""
+#~ "Вывод индикаторов в области уведомлений на этой платформе не "
+#~ "поддерживается. Извините!"
+
+#~ msgid "Warning: unable to contact the systray manager"
+#~ msgstr ""
+#~ "Предупреждение: Не удалось соединиться с менеджером области уведомлений"
+
+#~ msgid "System tray icon disabled."
+#~ msgstr "Выключен значок-индикатор статуса в области уведомлений."
+
+#~ msgid ""
+#~ "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href="
+#~ "\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" "
+#~ "href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually."
+#~ msgstr ""
+#~ "Убедитесь, что исходящие HTTP-запросы ничем не блокируются, загляните в "
+#~ "<a href=logs.jsp>логи</a> и если ничто не помогло, прочтите в <a target="
+#~ "\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> инструкцию по "
+#~ "начальной загрузке вручную."
+
+#~ msgid "hour"
+#~ msgstr "час"
+
+#~ msgid "minute"
+#~ msgstr "минута"
+
+#~ msgid "minutes"
+#~ msgstr "минут(ы)"
+
 #~ msgid "Last reseed failed fully (failed reading seed URL)."
 #~ msgstr ""
 #~ "Предыдущая попытка начальной загрузки полностью провалилась (не удалось "
@@ -5271,9 +5572,6 @@ msgstr "Обзор туннелей I2P"
 #~ msgid "avg value"
 #~ msgstr "среднее значение"
 
-#~ msgid "events"
-#~ msgstr "событий"
-
 #~ msgid "lifetime average"
 #~ msgstr "среднее за время работы"
 
diff --git a/apps/routerconsole/locale/messages_zh.po b/apps/routerconsole/locale/messages_zh.po
index 4e7419ac05cb9f6a3bcf389afdac56f21bd4413a..8a75c5a3fbc02bec9c6e816b1867151dab0d1485 100644
--- a/apps/routerconsole/locale/messages_zh.po
+++ b/apps/routerconsole/locale/messages_zh.po
@@ -8,10 +8,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P routerconsole\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-10-04 02:45+0000\n"
+"POT-Creation-Date: 2011-03-03 18:28+0000\n"
 "PO-Revision-Date: \n"
-"Last-Translator: walking <walking@mail.i2p>\n"
+"Last-Translator: \n"
 "Language-Team: \n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -19,21 +20,75 @@ msgstr ""
 "X-Poedit-Country: CHINA\n"
 "Plural-Forms: nplurals=1; plural=0\n"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:126
+#. 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.
+#. If you want the digit separator in your locale, translate as {0}.
+#. alternates: msec, msecs
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1141
+#, java-format
+msgid "1 ms"
+msgid_plural "{0,number,####} ms"
+msgstr[0] "{0,number,####} ms"
+
+#. seconds
+#. Note to translators: quantity will always be greater than one.
+#. alternates: secs, sec. 'seconds' is probably too long.
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1146
+#, java-format
+msgid "1 sec"
+msgid_plural "{0} sec"
+msgstr[0] "{0} sec"
+
+#. minutes
+#. Note to translators: quantity will always be greater than one.
+#. alternates: mins, min. 'minutes' is probably too long.
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1151
+#, java-format
+msgid "1 min"
+msgid_plural "{0} min"
+msgstr[0] "{0} min"
+
+#. hours
+#. Note to translators: quantity will always be greater than one.
+#. alternates: hrs, hr., hrs.
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1156
+#, java-format
+msgid "1 hour"
+msgid_plural "{0} hours"
+msgstr[0] "{0} hr"
+
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1158
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313
+msgid "n/a"
+msgstr "N/A"
+
+#. days
+#. Note to translators: quantity will always be greater than one.
+#: ../../../core/java/src/net/i2p/data/DataHelper.java:1162
+#, java-format
+msgid "1 day"
+msgid_plural "{0} days"
+msgstr[0] "{0} 天"
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:122
 #, java-format
 msgid "Banned by router hash: {0}"
 msgstr "按路由器 HASH 封杀: {0}"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:128
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:124
 msgid "Banned by router hash"
 msgstr "已按路由 HASH 封杀"
 
 #. Temporary reason, until the job finishes
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:673
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:669
 msgid "IP banned"
 msgstr "IP封锁"
 
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:743
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:739
 #, java-format
 msgid "IP banned by blocklist.txt entry {0}"
 msgstr "按IP黑名单blocklist.txt封杀的节点{0}"
@@ -83,50 +138,45 @@ msgstr "接收共享隧道"
 #. if (_context.router().getRouterInfo().getBandwidthTier().equals("K"))
 #. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low");
 #. else
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:487
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:488
 msgid "Rejecting tunnels"
 msgstr "拒绝参与共享隧道"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:48
-msgid "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually."
-msgstr "请保证HTTP通信没有受阻,检查 <a target=\"_top\" href=\"logs.jsp\">日志</a> ,如果问题仍无法解决,请参照 <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> 进行手动补种。"
-
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:80
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:105
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
 msgid "Reseeding"
-msgstr "正在补种(引导网络启动)..."
+msgstr "网络引导"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:144
-msgid "Reseeding: fetching seed URL."
-msgstr "正在补种:获取补种连接..."
-
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150
-msgid "Last reseed failed fully (failed reading seed URL)."
-msgstr "上次补种尝试失败(读取补种URL失败)。"
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:128
+#, java-format
+msgid "Reseed fetched only 1 router."
+msgid_plural "Reseed fetched only {0} routers."
+msgstr[0] "网络引导只发现了 {0} 个I2P用户。"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:176
-msgid "Last reseed failed fully (no routerInfo URLs at seed URL)."
-msgstr "上次补种尝试失败(补种服务器未返回任何路由信息URL)。"
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:135
+msgid "Reseed failed."
+msgstr "网络引导失败"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:189
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:136
 #, java-format
-msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
-msgstr "正在补种:从补种服务器获取路由信息({0}成功,{1}失败)。"
+msgid "See {0} for help."
+msgstr "帮助参见 {0}。"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:210
-#, java-format
-msgid "Last reseed failed partly ({0}% of {1})."
-msgstr "上次补种部分失败({0}%失败,共{1})"
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:137
+msgid "reseed configuration page"
+msgstr "网络引导设置页面"
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:215
-#, java-format
-msgid "Last reseed failed ({0}% of {1})."
-msgstr "上次补种失败({0}%失败,共{1})"
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:239
+msgid "Reseeding: fetching seed URL."
+msgstr "正在补种:获取补种连接..."
 
-#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:225
-msgid "Last reseed failed fully (exception caught)."
-msgstr "上次补种失败(exception caught)."
+#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:281
+#, java-format
+msgid ""
+"Reseeding: fetching router info from seed URL ({0} successful, {1} errors)."
+msgstr "正在补种:从补种服务器获取路由信息({0}成功,{1}失败)。"
 
-#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:510
+#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512
 msgid "NetDb entry"
 msgstr "NetDb 项目"
 
@@ -135,27 +185,46 @@ msgstr "NetDb 项目"
 msgid "No transports (hidden or starting up?)"
 msgstr "无数据传输(隐身或正在启动)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:457
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450
 msgid "Unreachable on any transport"
 msgstr "各传输方式均不可达"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:508
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499
 msgid "Router Transport Addresses"
 msgstr "路由传输地址"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:514
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504
 #, java-format
 msgid "{0} is used for outbound connections only"
 msgstr "{0} 仅被用作出站连接"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123
+msgid "Help"
+msgstr "帮助"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519
+msgid ""
+"Your transport connection limits are automatically set based on your "
+"configured bandwidth."
+msgstr "最大传输连接数会根据您的带宽设置自动调整。"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521
+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 。"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
 msgid "Definitions"
 msgstr "定义"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:715
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:735
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
@@ -165,149 +234,153 @@ msgstr "定义"
 msgid "Peer"
 msgstr "节点"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524
 msgid "The remote peer, identified by router hash"
 msgstr "以路由Hash区分的远程节点"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:716
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1889
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:736
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
 msgid "Dir"
 msgstr "类别"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526
 msgid "Inbound connection"
 msgstr "进站连接"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528
 msgid "Outbound connection"
 msgstr "出站连接"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530
 msgid "They offered to introduce us (help other peers traverse our firewall)"
 msgstr "对方节点为中继帮助我方穿越防火墙"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532
 msgid "We offered to introduce them (help other peers traverse their firewall)"
 msgstr "我方为中继帮助其他节点穿越防火墙"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
 msgid "How long since a packet has been received / sent"
 msgstr "最近一次数据传输距现在的时间"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:717
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
 msgid "Idle"
 msgstr "空闲"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:718
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "In/Out"
 msgstr "入/出"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534
 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)"
 msgstr "进/出站平滑传输率(Kbyte/s)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
 msgid "How long ago this connection was established"
 msgstr "连接建立时间"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:719
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905
 msgid "Up"
 msgstr "寿命"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:720
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1902
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907
 msgid "Skew"
 msgstr "时滞"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536
 msgid "The difference between the peer's clock and your own"
 msgstr "节点与本地时钟间的时滞"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
-msgid "The congestion window, which is how many bytes can be sent without an acknowledgement"
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537
+msgid ""
+"The congestion window, which is how many bytes can be sent without an "
+"acknowledgement"
 msgstr "拥塞窗口,即每次确认前可发送的字节量"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538
 msgid "The number of sent messages awaiting acknowledgement"
 msgstr "等待确认的已发送数据包数量"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539
 msgid "The maximum number of concurrent messages to send"
 msgstr "并发消息的最大发送量"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540
 msgid "The number of pending sends which exceed congestion window"
 msgstr "超过拥塞窗口的待发送数量"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541
 msgid "The slow start threshold"
 msgstr "慢启动门槛"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542
 msgid "The round trip time in milliseconds"
 msgstr "往返时间单位毫秒"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1912
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917
 msgid "Dev"
 msgstr "偏差"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543
 msgid "The standard deviation of the round trip time in milliseconds"
 msgstr "环行时间的标准差单位毫秒"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544
 msgid "The retransmit timeout in milliseconds"
 msgstr "重传输超时时间单位毫秒"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550
-msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)"
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545
+msgid ""
+"Current maximum send packet size / estimated maximum receive packet size "
+"(bytes)"
 msgstr "当前发送数据包的最大大小/预计接收数据包的最大大小(字节)"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:721
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1919
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
 msgid "TX"
 msgstr "发包"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546
 msgid "The total number of packets sent to the peer"
 msgstr "向节点发送的数据包总量"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:552
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:722
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
 msgid "RX"
 msgstr "接包"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:552
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547
 msgid "The total number of packets received from the peer"
 msgstr "从节点接收到数据包总量"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:553
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929
 msgid "Dup TX"
 msgstr "重发包"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:553
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548
 msgid "The total number of packets retransmitted to the peer"
 msgstr "向节点发送的重复数据包总量"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:554
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931
 msgid "Dup RX"
 msgstr "重接包"
 
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:554
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549
 msgid "The total number of duplicate packets received from the peer"
 msgstr "从节点接收到的重复数据包总量"
 
@@ -317,174 +390,175 @@ msgstr "从节点接收到的重复数据包总量"
 msgid "Excessive clock skew: {0}"
 msgstr "严重时滞:{0}"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:710
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:730
 msgid "NTCP connections"
 msgstr "NTCP连接"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:711
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1881
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:731
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886
 msgid "Limit"
 msgstr "限制"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:712
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1882
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
 msgid "Timeout"
 msgstr "超时"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:723
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743
 msgid "Out Queue"
 msgstr "出队"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:724
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744
 msgid "Backlogged?"
 msgstr "积压?"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1944
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
 msgid "Inbound"
 msgstr "入站"
 
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1946
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951
 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
 msgid "Outbound"
 msgstr "出站"
 
 #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:787
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:807
 msgid "peers"
 msgstr "节点"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1880
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885
 msgid "UDP connections"
 msgstr "UDP连接"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892
 msgid "Sort by peer hash"
 msgstr "按节点Hash"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1889
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894
 msgid "Direction/Introduction"
 msgstr "方向"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
 msgid "Sort by idle inbound"
 msgstr "出站空闲"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
 msgid "Sort by idle outbound"
 msgstr "入站空闲"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
 msgid "Sort by inbound rate"
 msgstr "按入站速度"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903
 msgid "Sort by outbound rate"
 msgstr "按出站速度"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
 msgid "Sort by connection uptime"
 msgstr "按连接时间"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
 msgid "Sort by clock skew"
 msgstr "按时滞"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911
 msgid "Sort by congestion window"
 msgstr "按拥塞窗口"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913
 msgid "Sort by slow start threshold"
 msgstr "按启动门槛"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916
 msgid "Sort by round trip time"
 msgstr "按往返时间"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
 msgid "Sort by round trip time deviation"
 msgstr "按RTT偏差"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1915
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920
 msgid "Sort by retransmission timeout"
 msgstr "按重传输超时时间"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923
 msgid "Sort by outbound maximum transmit unit"
 msgstr "按出站最大传输单元"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
 msgid "Sort by packets sent"
 msgstr "按已发送数据包"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1922
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
 msgid "Sort by packets received"
 msgstr "按已接收数据包"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930
 msgid "Sort by packets retransmitted"
 msgstr "按重传数据包"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932
 msgid "Sort by packets received more than once"
 msgstr "按重复数据包"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1948
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953
 msgid "We offered to introduce them"
 msgstr "中继客户"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1950
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955
 msgid "They offered to introduce us"
 msgstr "中继"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1954
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959
 msgid "Choked"
-msgstr ""
+msgstr "阻塞"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1962
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967
 msgid "1 fail"
 msgstr "失败 1 次"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1964
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969
 #, java-format
 msgid "{0} fails"
 msgstr "失败 {0} 次"
 
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1970
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162
 msgid "Banned"
 msgstr "已封锁"
 
 #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n");
-#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2102
+#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106
 msgid "SUMMARY"
 msgstr "总结"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:145
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124
 msgid "Dropping tunnel requests: Too slow"
 msgstr "忽略共享请求:速度太慢"
 
 #. don't even bother, since we are so overloaded locally
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:352
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267
 msgid "Dropping tunnel requests: Overloaded"
 msgstr "忽略共享请求:路由过载"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:525
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:460
 msgid "Rejecting tunnels: Request overload"
 msgstr "拒绝共享:请求过多"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:550
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:485
 msgid "Rejecting tunnels: Connection limit"
 msgstr "拒绝共享:连接受限"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:744
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:685
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:706
 msgid "Dropping tunnel requests: High load"
 msgstr "忽略共享请求:高负载"
 
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:753
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:698
 msgid "Dropping tunnel requests: Queue time"
 msgstr "忽略共享请求:队列积压"
 
@@ -550,876 +624,876 @@ msgstr "澳大利亚"
 msgid "Aruba"
 msgstr "阿鲁巴"
 
-#: ../java/build/Countries.java:18
+#: ../java/build/Countries.java:19
 msgid "Azerbaijan"
 msgstr "阿塞拜疆"
 
-#: ../java/build/Countries.java:19
+#: ../java/build/Countries.java:20
 msgid "Bosnia and Herzegovina"
 msgstr "波黑"
 
-#: ../java/build/Countries.java:20
+#: ../java/build/Countries.java:21
 msgid "Barbados"
 msgstr "巴巴多斯"
 
-#: ../java/build/Countries.java:21
+#: ../java/build/Countries.java:22
 msgid "Bangladesh"
 msgstr "孟加拉"
 
-#: ../java/build/Countries.java:22
+#: ../java/build/Countries.java:23
 msgid "Belgium"
 msgstr "比利时"
 
-#: ../java/build/Countries.java:23
+#: ../java/build/Countries.java:24
 msgid "Burkina Faso"
 msgstr "布基纳法索"
 
-#: ../java/build/Countries.java:24
+#: ../java/build/Countries.java:25
 msgid "Bulgaria"
 msgstr "保加利亚"
 
-#: ../java/build/Countries.java:25
+#: ../java/build/Countries.java:26
 msgid "Bahrain"
 msgstr "å·´æž—"
 
-#: ../java/build/Countries.java:26
+#: ../java/build/Countries.java:27
 msgid "Burundi"
 msgstr "不丹"
 
-#: ../java/build/Countries.java:27
+#: ../java/build/Countries.java:28
 msgid "Benin"
 msgstr "贝宁"
 
-#: ../java/build/Countries.java:28
+#: ../java/build/Countries.java:29
 msgid "Bermuda"
 msgstr "百慕大"
 
-#: ../java/build/Countries.java:29
+#: ../java/build/Countries.java:30
 msgid "Brunei Darussalam"
 msgstr "文莱达鲁萨兰"
 
-#: ../java/build/Countries.java:30
+#: ../java/build/Countries.java:31
 msgid "Bolivia"
 msgstr "玻利维亚"
 
-#: ../java/build/Countries.java:31
+#: ../java/build/Countries.java:32
 msgid "Brazil"
 msgstr "巴西"
 
-#: ../java/build/Countries.java:32
+#: ../java/build/Countries.java:33
 msgid "Bahamas"
 msgstr "巴哈马"
 
-#: ../java/build/Countries.java:33
+#: ../java/build/Countries.java:34
 msgid "Bhutan"
 msgstr "不丹"
 
-#: ../java/build/Countries.java:34
+#: ../java/build/Countries.java:35
 msgid "Bouvet Island"
 msgstr "布韦群岛"
 
-#: ../java/build/Countries.java:35
+#: ../java/build/Countries.java:36
 msgid "Botswana"
 msgstr "伯兹瓦纳"
 
-#: ../java/build/Countries.java:36
+#: ../java/build/Countries.java:37
 msgid "Belarus"
 msgstr "白俄罗斯"
 
-#: ../java/build/Countries.java:37
+#: ../java/build/Countries.java:38
 msgid "Belize"
 msgstr "伯利兹"
 
-#: ../java/build/Countries.java:38
+#: ../java/build/Countries.java:39
 msgid "Canada"
 msgstr "加拿大"
 
-#: ../java/build/Countries.java:39
+#: ../java/build/Countries.java:40
 msgid "The Democratic Republic of the Congo"
 msgstr "刚果"
 
-#: ../java/build/Countries.java:40
+#: ../java/build/Countries.java:41
 msgid "Central African Republic"
 msgstr "中非"
 
-#: ../java/build/Countries.java:41
+#: ../java/build/Countries.java:42
 msgid "Congo"
 msgstr "Congo"
 
-#: ../java/build/Countries.java:42
+#: ../java/build/Countries.java:43
 msgid "Switzerland"
 msgstr "瑞士"
 
-#: ../java/build/Countries.java:43
+#: ../java/build/Countries.java:44
 msgid "Cote D'Ivoire"
 msgstr "象牙海岸"
 
-#: ../java/build/Countries.java:44
+#: ../java/build/Countries.java:45
 msgid "Cook Islands"
 msgstr "库克群岛"
 
-#: ../java/build/Countries.java:45
+#: ../java/build/Countries.java:46
 msgid "Chile"
 msgstr "智利"
 
-#: ../java/build/Countries.java:46
+#: ../java/build/Countries.java:47
 msgid "Cameroon"
 msgstr "喀麦隆"
 
-#: ../java/build/Countries.java:47
+#: ../java/build/Countries.java:48
 msgid "China"
 msgstr "中国"
 
-#: ../java/build/Countries.java:48
+#: ../java/build/Countries.java:49
 msgid "Colombia"
 msgstr "哥伦比亚"
 
-#: ../java/build/Countries.java:49
+#: ../java/build/Countries.java:50
 msgid "Costa Rica"
 msgstr "哥斯达黎加"
 
-#: ../java/build/Countries.java:50
+#: ../java/build/Countries.java:51
 msgid "Serbia and Montenegro"
 msgstr "塞尔维亚与黑山"
 
-#: ../java/build/Countries.java:51
+#: ../java/build/Countries.java:52
 msgid "Cuba"
 msgstr "古巴"
 
-#: ../java/build/Countries.java:52
+#: ../java/build/Countries.java:53
 msgid "Cape Verde"
 msgstr "佛得角"
 
-#: ../java/build/Countries.java:53
+#: ../java/build/Countries.java:54
 msgid "Cyprus"
 msgstr "塞浦路斯"
 
-#: ../java/build/Countries.java:54
+#: ../java/build/Countries.java:55
 msgid "Czech Republic"
 msgstr "捷克"
 
-#: ../java/build/Countries.java:55
+#: ../java/build/Countries.java:56
 msgid "Germany"
 msgstr "德国"
 
-#: ../java/build/Countries.java:56
+#: ../java/build/Countries.java:57
 msgid "Djibouti"
 msgstr "吉布提"
 
-#: ../java/build/Countries.java:57
+#: ../java/build/Countries.java:58
 msgid "Denmark"
 msgstr "丹麦"
 
-#: ../java/build/Countries.java:58
+#: ../java/build/Countries.java:59
 msgid "Dominica"
 msgstr "多米尼"
 
-#: ../java/build/Countries.java:59
+#: ../java/build/Countries.java:60
 msgid "Dominican Republic"
 msgstr "多米尼加联邦"
 
-#: ../java/build/Countries.java:60
+#: ../java/build/Countries.java:61
 msgid "Algeria"
 msgstr "阿尔及利亚"
 
-#: ../java/build/Countries.java:61
+#: ../java/build/Countries.java:62
 msgid "Ecuador"
 msgstr "厄瓜多尔"
 
-#: ../java/build/Countries.java:62
+#: ../java/build/Countries.java:63
 msgid "Estonia"
 msgstr "爱沙尼亚"
 
-#: ../java/build/Countries.java:63
+#: ../java/build/Countries.java:64
 msgid "Egypt"
 msgstr "埃及"
 
-#: ../java/build/Countries.java:64
+#: ../java/build/Countries.java:65
 msgid "Eritrea"
 msgstr "厄立特里亚"
 
-#: ../java/build/Countries.java:65
+#: ../java/build/Countries.java:66
 msgid "Spain"
 msgstr "西班牙"
 
-#: ../java/build/Countries.java:66
+#: ../java/build/Countries.java:67
 msgid "Ethiopia"
 msgstr "埃塞俄比亚"
 
-#: ../java/build/Countries.java:67
+#: ../java/build/Countries.java:68
 msgid "Finland"
 msgstr "芬兰"
 
-#: ../java/build/Countries.java:68
+#: ../java/build/Countries.java:69
 msgid "Fiji"
 msgstr "斐济"
 
-#: ../java/build/Countries.java:69
+#: ../java/build/Countries.java:70
 msgid "Falkland Islands (Malvinas)"
 msgstr "福克兰群岛"
 
-#: ../java/build/Countries.java:70
+#: ../java/build/Countries.java:71
 msgid "Federated States of Micronesia"
 msgstr "密克罗尼西亚"
 
-#: ../java/build/Countries.java:71
+#: ../java/build/Countries.java:72
 msgid "Faroe Islands"
 msgstr "法罗群岛"
 
-#: ../java/build/Countries.java:72
+#: ../java/build/Countries.java:73
 msgid "France"
 msgstr "法国"
 
-#: ../java/build/Countries.java:73
+#: ../java/build/Countries.java:74
 msgid "Gabon"
 msgstr "加蓬"
 
-#: ../java/build/Countries.java:74
+#: ../java/build/Countries.java:75
 msgid "United Kingdom"
 msgstr "英国"
 
-#: ../java/build/Countries.java:75
+#: ../java/build/Countries.java:76
 msgid "Grenada"
 msgstr "格林纳达"
 
-#: ../java/build/Countries.java:76
+#: ../java/build/Countries.java:77
 msgid "Georgia"
 msgstr "格鲁吉亚"
 
-#: ../java/build/Countries.java:77
+#: ../java/build/Countries.java:78
 msgid "French Guiana"
 msgstr "圭亚那"
 
-#: ../java/build/Countries.java:78
+#: ../java/build/Countries.java:79
 msgid "Ghana"
 msgstr "加纳"
 
-#: ../java/build/Countries.java:79
+#: ../java/build/Countries.java:80
 msgid "Gibraltar"
 msgstr "直布罗陀"
 
-#: ../java/build/Countries.java:80
+#: ../java/build/Countries.java:81
 msgid "Greenland"
 msgstr "格陵兰群岛"
 
-#: ../java/build/Countries.java:81
+#: ../java/build/Countries.java:82
 msgid "Gambia"
 msgstr "冈比亚"
 
-#: ../java/build/Countries.java:82
+#: ../java/build/Countries.java:83
 msgid "Guinea"
 msgstr "几内亚"
 
-#: ../java/build/Countries.java:83
+#: ../java/build/Countries.java:84
 msgid "Guadeloupe"
 msgstr "瓜德罗普岛"
 
-#: ../java/build/Countries.java:84
+#: ../java/build/Countries.java:85
 msgid "Equatorial Guinea"
 msgstr "赤道几内亚"
 
-#: ../java/build/Countries.java:85
+#: ../java/build/Countries.java:86
 msgid "Greece"
 msgstr "希腊"
 
-#: ../java/build/Countries.java:86
+#: ../java/build/Countries.java:87
 msgid "South Georgia and the South Sandwich Islands"
 msgstr "南乔治亚岛和南桑德韦奇岛"
 
-#: ../java/build/Countries.java:87
+#: ../java/build/Countries.java:88
 msgid "Guatemala"
 msgstr "危地马拉"
 
-#: ../java/build/Countries.java:88
+#: ../java/build/Countries.java:89
 msgid "Guam"
 msgstr "关岛"
 
-#: ../java/build/Countries.java:89
+#: ../java/build/Countries.java:90
 msgid "Guinea-Bissau"
 msgstr "几内亚比绍"
 
-#: ../java/build/Countries.java:90
+#: ../java/build/Countries.java:91
 msgid "Guyana"
 msgstr "圭亚那"
 
-#: ../java/build/Countries.java:91
+#: ../java/build/Countries.java:92
 msgid "Hong Kong"
 msgstr "香港"
 
-#: ../java/build/Countries.java:92
+#: ../java/build/Countries.java:93
 msgid "Honduras"
 msgstr "洪都拉斯"
 
-#: ../java/build/Countries.java:93
+#: ../java/build/Countries.java:94
 msgid "Croatia"
 msgstr "克罗蒂亚"
 
-#: ../java/build/Countries.java:94
+#: ../java/build/Countries.java:95
 msgid "Haiti"
 msgstr "海地"
 
-#: ../java/build/Countries.java:95
+#: ../java/build/Countries.java:96
 msgid "Hungary"
 msgstr "匈牙利"
 
-#: ../java/build/Countries.java:96
+#: ../java/build/Countries.java:97
 msgid "Indonesia"
 msgstr "印尼"
 
-#: ../java/build/Countries.java:97
+#: ../java/build/Countries.java:98
 msgid "Ireland"
 msgstr "爱尔兰"
 
-#: ../java/build/Countries.java:98
+#: ../java/build/Countries.java:99
 msgid "Israel"
 msgstr "以色列"
 
-#: ../java/build/Countries.java:99
+#: ../java/build/Countries.java:101
 msgid "India"
 msgstr "印度"
 
-#: ../java/build/Countries.java:100
+#: ../java/build/Countries.java:102
 msgid "British Indian Ocean Territory"
 msgstr "英属印度洋地区"
 
-#: ../java/build/Countries.java:101
+#: ../java/build/Countries.java:103
 msgid "Iraq"
 msgstr "伊拉克"
 
-#: ../java/build/Countries.java:102
+#: ../java/build/Countries.java:104
 msgid "Islamic Republic of Iran"
 msgstr "伊朗"
 
-#: ../java/build/Countries.java:103
+#: ../java/build/Countries.java:105
 msgid "Iceland"
 msgstr "冰岛"
 
-#: ../java/build/Countries.java:104
+#: ../java/build/Countries.java:106
 msgid "Italy"
 msgstr "意大利"
 
-#: ../java/build/Countries.java:105
+#: ../java/build/Countries.java:108
 msgid "Jamaica"
 msgstr "牙买加"
 
-#: ../java/build/Countries.java:106
+#: ../java/build/Countries.java:109
 msgid "Jordan"
 msgstr "约旦"
 
-#: ../java/build/Countries.java:107
+#: ../java/build/Countries.java:110
 msgid "Japan"
 msgstr "日本"
 
-#: ../java/build/Countries.java:108
+#: ../java/build/Countries.java:111
 msgid "Kenya"
 msgstr "肯尼亚"
 
-#: ../java/build/Countries.java:109
+#: ../java/build/Countries.java:112
 msgid "Kyrgyzstan"
 msgstr "吉尔吉斯斯坦"
 
-#: ../java/build/Countries.java:110
+#: ../java/build/Countries.java:113
 msgid "Cambodia"
 msgstr "柬埔塞"
 
-#: ../java/build/Countries.java:111
+#: ../java/build/Countries.java:114
 msgid "Kiribati"
 msgstr "基里巴斯"
 
-#: ../java/build/Countries.java:112
+#: ../java/build/Countries.java:115
 msgid "Comoros"
 msgstr "科摩罗"
 
-#: ../java/build/Countries.java:113
+#: ../java/build/Countries.java:116
 msgid "Saint Kitts and Nevis"
 msgstr "圣克里斯多福与尼维斯"
 
-#: ../java/build/Countries.java:114
+#: ../java/build/Countries.java:117
 msgid "Republic of Korea"
 msgstr "韩国"
 
-#: ../java/build/Countries.java:115
+#: ../java/build/Countries.java:118
 msgid "Kuwait"
 msgstr "科威特"
 
-#: ../java/build/Countries.java:116
+#: ../java/build/Countries.java:119
 msgid "Cayman Islands"
 msgstr "开曼群岛"
 
-#: ../java/build/Countries.java:117
+#: ../java/build/Countries.java:120
 msgid "Kazakhstan"
 msgstr "哈萨克斯坦"
 
-#: ../java/build/Countries.java:118
+#: ../java/build/Countries.java:121
 msgid "Lao People's Democratic Republic"
 msgstr "老挝"
 
-#: ../java/build/Countries.java:119
+#: ../java/build/Countries.java:122
 msgid "Lebanon"
 msgstr "黎巴嫩"
 
-#: ../java/build/Countries.java:120
+#: ../java/build/Countries.java:123
 msgid "Saint Lucia"
 msgstr "圣露西亚岛"
 
-#: ../java/build/Countries.java:121
+#: ../java/build/Countries.java:124
 msgid "Liechtenstein"
 msgstr "列支敦士登"
 
-#: ../java/build/Countries.java:122
+#: ../java/build/Countries.java:125
 msgid "Sri Lanka"
 msgstr "斯里兰卡"
 
-#: ../java/build/Countries.java:123
+#: ../java/build/Countries.java:126
 msgid "Liberia"
 msgstr "利比里亚"
 
-#: ../java/build/Countries.java:124
+#: ../java/build/Countries.java:127
 msgid "Lesotho"
 msgstr "莱索托"
 
-#: ../java/build/Countries.java:125
+#: ../java/build/Countries.java:128
 msgid "Lithuania"
 msgstr "立陶宛"
 
-#: ../java/build/Countries.java:126
+#: ../java/build/Countries.java:129
 msgid "Luxembourg"
 msgstr "卢森堡"
 
-#: ../java/build/Countries.java:127
+#: ../java/build/Countries.java:130
 msgid "Latvia"
 msgstr "拉脱维亚"
 
-#: ../java/build/Countries.java:128
+#: ../java/build/Countries.java:131
 msgid "Libyan Arab Jamahiriya"
 msgstr "利比亚"
 
-#: ../java/build/Countries.java:129
+#: ../java/build/Countries.java:132
 msgid "Morocco"
 msgstr "摩洛哥"
 
-#: ../java/build/Countries.java:130
+#: ../java/build/Countries.java:133
 msgid "Monaco"
 msgstr "摩纳哥"
 
-#: ../java/build/Countries.java:131
+#: ../java/build/Countries.java:134
 msgid "Republic of Moldova"
 msgstr "摩尔多瓦"
 
-#: ../java/build/Countries.java:132
+#: ../java/build/Countries.java:137
 msgid "Madagascar"
 msgstr "马达加斯加"
 
-#: ../java/build/Countries.java:133
+#: ../java/build/Countries.java:138
 msgid "Marshall Islands"
 msgstr "马绍尔群岛"
 
-#: ../java/build/Countries.java:134
+#: ../java/build/Countries.java:139
 msgid "The Former Yugoslav Republic of Macedonia"
 msgstr "前南斯拉夫之马其顿共和国"
 
-#: ../java/build/Countries.java:135
+#: ../java/build/Countries.java:140
 msgid "Mali"
 msgstr "马里"
 
-#: ../java/build/Countries.java:136
+#: ../java/build/Countries.java:141
 msgid "Myanmar"
 msgstr "缅甸"
 
-#: ../java/build/Countries.java:137
+#: ../java/build/Countries.java:142
 msgid "Mongolia"
 msgstr "蒙古"
 
-#: ../java/build/Countries.java:138
+#: ../java/build/Countries.java:143
 msgid "Macao"
 msgstr "澳门"
 
-#: ../java/build/Countries.java:139
+#: ../java/build/Countries.java:144
 msgid "Northern Mariana Islands"
 msgstr "北马里亚纳群岛"
 
-#: ../java/build/Countries.java:140
+#: ../java/build/Countries.java:145
 msgid "Martinique"
 msgstr "马提尼克岛"
 
-#: ../java/build/Countries.java:141
+#: ../java/build/Countries.java:146
 msgid "Mauritania"
 msgstr "毛里塔尼亚"
 
-#: ../java/build/Countries.java:142
+#: ../java/build/Countries.java:147
 msgid "Montserrat"
 msgstr "蒙特塞拉特"
 
-#: ../java/build/Countries.java:143
+#: ../java/build/Countries.java:148
 msgid "Malta"
 msgstr "马尔他"
 
-#: ../java/build/Countries.java:144
+#: ../java/build/Countries.java:149
 msgid "Mauritius"
 msgstr "毛里求斯"
 
-#: ../java/build/Countries.java:145
+#: ../java/build/Countries.java:150
 msgid "Maldives"
 msgstr "马尔代夫"
 
-#: ../java/build/Countries.java:146
+#: ../java/build/Countries.java:151
 msgid "Malawi"
 msgstr "马拉维"
 
-#: ../java/build/Countries.java:147
+#: ../java/build/Countries.java:152
 msgid "Mexico"
 msgstr "墨西哥"
 
-#: ../java/build/Countries.java:148
+#: ../java/build/Countries.java:153
 msgid "Malaysia"
 msgstr "马来西亚"
 
-#: ../java/build/Countries.java:149
+#: ../java/build/Countries.java:154
 msgid "Mozambique"
 msgstr "莫桑比克"
 
-#: ../java/build/Countries.java:150
+#: ../java/build/Countries.java:155
 msgid "Namibia"
 msgstr "纳米比亚"
 
-#: ../java/build/Countries.java:151
+#: ../java/build/Countries.java:156
 msgid "New Caledonia"
 msgstr "新喀里多尼亚"
 
-#: ../java/build/Countries.java:152
+#: ../java/build/Countries.java:157
 msgid "Niger"
 msgstr "尼日尔"
 
-#: ../java/build/Countries.java:153
+#: ../java/build/Countries.java:158
 msgid "Norfolk Island"
 msgstr "尼加拉瓜"
 
-#: ../java/build/Countries.java:154
+#: ../java/build/Countries.java:159
 msgid "Nigeria"
 msgstr "尼日利亚"
 
-#: ../java/build/Countries.java:155
+#: ../java/build/Countries.java:160
 msgid "Nicaragua"
 msgstr "尼加拉瓜"
 
-#: ../java/build/Countries.java:156
+#: ../java/build/Countries.java:161
 msgid "Netherlands"
 msgstr "荷兰"
 
-#: ../java/build/Countries.java:157
+#: ../java/build/Countries.java:162
 msgid "Norway"
 msgstr "挪威"
 
-#: ../java/build/Countries.java:158
+#: ../java/build/Countries.java:163
 msgid "Nepal"
 msgstr "尼泊尔"
 
-#: ../java/build/Countries.java:159
+#: ../java/build/Countries.java:164
 msgid "Nauru"
 msgstr "瑙鲁"
 
-#: ../java/build/Countries.java:160
+#: ../java/build/Countries.java:165
 msgid "Niue"
 msgstr "纽埃岛"
 
-#: ../java/build/Countries.java:161
+#: ../java/build/Countries.java:166
 msgid "New Zealand"
 msgstr "新西兰"
 
-#: ../java/build/Countries.java:162
+#: ../java/build/Countries.java:167
 msgid "Oman"
 msgstr "阿曼"
 
-#: ../java/build/Countries.java:163
+#: ../java/build/Countries.java:168
 msgid "Panama"
 msgstr "巴拿马"
 
-#: ../java/build/Countries.java:164
+#: ../java/build/Countries.java:169
 msgid "Peru"
 msgstr "秘鲁"
 
-#: ../java/build/Countries.java:165
+#: ../java/build/Countries.java:170
 msgid "French Polynesia"
 msgstr "玻利尼西亚"
 
-#: ../java/build/Countries.java:166
+#: ../java/build/Countries.java:171
 msgid "Papua New Guinea"
 msgstr "巴布亚新几内亚"
 
-#: ../java/build/Countries.java:167
+#: ../java/build/Countries.java:172
 msgid "Philippines"
 msgstr "菲律宾"
 
-#: ../java/build/Countries.java:168
+#: ../java/build/Countries.java:173
 msgid "Pakistan"
 msgstr "巴基斯坦"
 
-#: ../java/build/Countries.java:169
+#: ../java/build/Countries.java:174
 msgid "Poland"
 msgstr "波兰"
 
-#: ../java/build/Countries.java:170
+#: ../java/build/Countries.java:175
 msgid "Saint Pierre and Miquelon"
 msgstr "圣皮埃尔岛和密克隆"
 
-#: ../java/build/Countries.java:171
+#: ../java/build/Countries.java:176
 msgid "Puerto Rico"
 msgstr "波多黎各"
 
-#: ../java/build/Countries.java:172
+#: ../java/build/Countries.java:177
 msgid "Palestinian Territory"
 msgstr "巴勒斯坦地区"
 
-#: ../java/build/Countries.java:173
+#: ../java/build/Countries.java:178
 msgid "Portugal"
 msgstr "葡萄牙"
 
-#: ../java/build/Countries.java:174
+#: ../java/build/Countries.java:179
 msgid "Palau"
 msgstr "帕劳"
 
-#: ../java/build/Countries.java:175
+#: ../java/build/Countries.java:180
 msgid "Paraguay"
 msgstr "巴拉圭"
 
-#: ../java/build/Countries.java:176
+#: ../java/build/Countries.java:181
 msgid "Qatar"
 msgstr "卡塔尔"
 
-#: ../java/build/Countries.java:177
+#: ../java/build/Countries.java:182
 msgid "Reunion"
 msgstr "留尼汪岛"
 
-#: ../java/build/Countries.java:178
+#: ../java/build/Countries.java:183
 msgid "Romania"
 msgstr "罗马尼亚"
 
-#: ../java/build/Countries.java:179
+#: ../java/build/Countries.java:184
 msgid "Serbia"
 msgstr "塞尔维亚"
 
-#: ../java/build/Countries.java:180
+#: ../java/build/Countries.java:185
 msgid "Russian Federation"
 msgstr "俄联邦"
 
-#: ../java/build/Countries.java:181
+#: ../java/build/Countries.java:186
 msgid "Rwanda"
 msgstr "卢旺达"
 
-#: ../java/build/Countries.java:182
+#: ../java/build/Countries.java:187
 msgid "Saudi Arabia"
 msgstr "沙特阿拉伯"
 
-#: ../java/build/Countries.java:183
+#: ../java/build/Countries.java:188
 msgid "Solomon Islands"
 msgstr "所罗门群岛"
 
-#: ../java/build/Countries.java:184
+#: ../java/build/Countries.java:189
 msgid "Seychelles"
 msgstr "塞舌尔"
 
-#: ../java/build/Countries.java:185
+#: ../java/build/Countries.java:190
 msgid "Sudan"
 msgstr "苏丹"
 
-#: ../java/build/Countries.java:186
+#: ../java/build/Countries.java:191
 msgid "Sweden"
 msgstr "ç‘žå…¸"
 
-#: ../java/build/Countries.java:187
+#: ../java/build/Countries.java:192
 msgid "Singapore"
 msgstr "新加坡"
 
-#: ../java/build/Countries.java:188
+#: ../java/build/Countries.java:193
 msgid "Slovenia"
 msgstr "斯洛文尼亚"
 
-#: ../java/build/Countries.java:189
+#: ../java/build/Countries.java:194
 msgid "Slovakia"
 msgstr "斯洛伐克"
 
-#: ../java/build/Countries.java:190
+#: ../java/build/Countries.java:195
 msgid "Sierra Leone"
 msgstr "塞拉利昂"
 
-#: ../java/build/Countries.java:191
+#: ../java/build/Countries.java:196
 msgid "San Marino"
 msgstr "圣马力诺"
 
-#: ../java/build/Countries.java:192
+#: ../java/build/Countries.java:197
 msgid "Senegal"
 msgstr "塞内加尔"
 
-#: ../java/build/Countries.java:193
+#: ../java/build/Countries.java:198
 msgid "Somalia"
 msgstr "索马里"
 
-#: ../java/build/Countries.java:194
+#: ../java/build/Countries.java:199
 msgid "Suriname"
 msgstr "苏里南"
 
-#: ../java/build/Countries.java:195
+#: ../java/build/Countries.java:200
 msgid "Sao Tome and Principe"
 msgstr "圣多美与普林西比共和国"
 
-#: ../java/build/Countries.java:196
+#: ../java/build/Countries.java:201
 msgid "El Salvador"
 msgstr "萨尔瓦多"
 
-#: ../java/build/Countries.java:197
+#: ../java/build/Countries.java:202
 msgid "Syrian Arab Republic"
 msgstr "叙利亚"
 
-#: ../java/build/Countries.java:198
+#: ../java/build/Countries.java:203
 msgid "Swaziland"
 msgstr "斯威士兰"
 
-#: ../java/build/Countries.java:199
+#: ../java/build/Countries.java:204
 msgid "Turks and Caicos Islands"
 msgstr "特克斯和凯科斯群岛"
 
-#: ../java/build/Countries.java:200
+#: ../java/build/Countries.java:205
 msgid "Chad"
 msgstr "乍得"
 
-#: ../java/build/Countries.java:201
+#: ../java/build/Countries.java:206
 msgid "French Southern Territories"
 msgstr "法属南半球领地"
 
-#: ../java/build/Countries.java:202
+#: ../java/build/Countries.java:207
 msgid "Togo"
 msgstr "多哥"
 
-#: ../java/build/Countries.java:203
+#: ../java/build/Countries.java:208
 msgid "Thailand"
 msgstr "泰国"
 
-#: ../java/build/Countries.java:204
+#: ../java/build/Countries.java:209
 msgid "Tajikistan"
 msgstr "塔吉克斯坦"
 
-#: ../java/build/Countries.java:205
+#: ../java/build/Countries.java:210
 msgid "Tokelau"
 msgstr "托克劳群岛"
 
-#: ../java/build/Countries.java:206
+#: ../java/build/Countries.java:211
 msgid "Timor-Leste"
 msgstr "东帝汶"
 
-#: ../java/build/Countries.java:207
+#: ../java/build/Countries.java:212
 msgid "Turkmenistan"
 msgstr "土库曼斯坦"
 
-#: ../java/build/Countries.java:208
+#: ../java/build/Countries.java:213
 msgid "Tunisia"
 msgstr "突尼斯"
 
-#: ../java/build/Countries.java:209
+#: ../java/build/Countries.java:214
 msgid "Tonga"
 msgstr "汤加"
 
-#: ../java/build/Countries.java:210
+#: ../java/build/Countries.java:215
 msgid "Turkey"
 msgstr "土耳其"
 
-#: ../java/build/Countries.java:211
+#: ../java/build/Countries.java:216
 msgid "Trinidad and Tobago"
 msgstr "特立尼达和多巴哥"
 
-#: ../java/build/Countries.java:212
+#: ../java/build/Countries.java:217
 msgid "Tuvalu"
 msgstr "图瓦鲁"
 
-#: ../java/build/Countries.java:213
+#: ../java/build/Countries.java:218
 msgid "Taiwan"
 msgstr "台湾"
 
-#: ../java/build/Countries.java:214
+#: ../java/build/Countries.java:219
 msgid "United Republic of Tanzania"
 msgstr "坦桑尼亚"
 
-#: ../java/build/Countries.java:215
+#: ../java/build/Countries.java:220
 msgid "Ukraine"
 msgstr "乌克兰"
 
-#: ../java/build/Countries.java:216
+#: ../java/build/Countries.java:221
 msgid "Uganda"
 msgstr "乌干达"
 
-#: ../java/build/Countries.java:217
+#: ../java/build/Countries.java:222
 msgid "United States Minor Outlying Islands"
 msgstr "美国本土外小岛屿"
 
-#: ../java/build/Countries.java:218
+#: ../java/build/Countries.java:223
 msgid "United States"
 msgstr "美国"
 
-#: ../java/build/Countries.java:219
+#: ../java/build/Countries.java:224
 msgid "Uruguay"
 msgstr "乌拉圭"
 
-#: ../java/build/Countries.java:220
+#: ../java/build/Countries.java:225
 msgid "Uzbekistan"
 msgstr "乌兹别克斯坦"
 
-#: ../java/build/Countries.java:221
+#: ../java/build/Countries.java:226
 msgid "Holy See (Vatican City State)"
 msgstr "梵地冈"
 
-#: ../java/build/Countries.java:222
+#: ../java/build/Countries.java:227
 msgid "Saint Vincent and the Grenadines"
 msgstr "圣文森特和格林纳丁斯"
 
-#: ../java/build/Countries.java:223
+#: ../java/build/Countries.java:228
 msgid "Venezuela"
 msgstr "委内瑞拉"
 
-#: ../java/build/Countries.java:224
-#: ../java/build/Countries.java:225
+#: ../java/build/Countries.java:229 ../java/build/Countries.java:230
 msgid "Virgin Islands"
 msgstr "维京群岛"
 
-#: ../java/build/Countries.java:226
+#: ../java/build/Countries.java:231
 msgid "Viet Nam"
 msgstr "越南"
 
-#: ../java/build/Countries.java:227
+#: ../java/build/Countries.java:232
 msgid "Vanuatu"
 msgstr "瓦努阿图"
 
-#: ../java/build/Countries.java:228
+#: ../java/build/Countries.java:233
 msgid "Wallis and Futuna"
 msgstr "瓦利斯群岛和富图纳群岛"
 
-#: ../java/build/Countries.java:229
+#: ../java/build/Countries.java:234
 msgid "Samoa"
 msgstr "东萨摩亚"
 
-#: ../java/build/Countries.java:230
+#: ../java/build/Countries.java:235
 msgid "Yemen"
 msgstr "也门"
 
-#: ../java/build/Countries.java:231
+#: ../java/build/Countries.java:236
 msgid "Mayotte"
 msgstr "马约特"
 
-#: ../java/build/Countries.java:232
+#: ../java/build/Countries.java:237
 msgid "South Africa"
 msgstr "南非"
 
-#: ../java/build/Countries.java:233
+#: ../java/build/Countries.java:238
 msgid "Zambia"
 msgstr "赞比亚"
 
-#: ../java/build/Countries.java:234
+#: ../java/build/Countries.java:239
 msgid "Zimbabwe"
 msgstr "津巴布韦"
 
-#: ../java/src/net/i2p/router/web/CSSHelper.java:57
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:34
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:36
+#: ../java/src/net/i2p/router/web/CSSHelper.java:58
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37
 #: ../java/strings/Strings.java:29
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:119
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:233
 msgid "I2P Router Console"
 msgstr "I2P 路由控制台"
 
@@ -1434,248 +1508,262 @@ msgstr "设置保存成功"
 
 #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:268
-msgid "Error saving the configuration (applied but not saved) - please see the error logs"
+msgid ""
+"Error saving the configuration (applied but not saved) - please see the "
+"error logs"
 msgstr "配置保存出错(已应用但未保存) - 参见错误日志"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:34
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:334
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:335
 msgid "Save Client Configuration"
 msgstr "保存客户程序设置"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:38
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:346
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:405
+msgid "Save Interface Configuration"
+msgstr "保存接口配置"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417
 msgid "Save WebApp Configuration"
 msgstr "保存 WebApp 设置"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:42
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:356
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427
 msgid "Save Plugin Configuration"
 msgstr "保存插件配置"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:46
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:362
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433
 msgid "Install Plugin"
 msgstr "安装插件"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87
 #, java-format
 msgid "Deleted plugin {0}"
 msgstr "删除插件 {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:84
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89
 #, java-format
 msgid "Error deleting plugin {0}"
 msgstr "删除插件 {0} 时发生错误"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:96
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101
 #, java-format
 msgid "Stopped plugin {0}"
 msgstr "插件 {0} 已停用"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:98
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103
 #, java-format
 msgid "Error stopping plugin {0}"
 msgstr "停用插件 {0} 时发生错误"
 
 #. label (IE)
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:119
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:189
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255
 msgid "Start"
 msgstr "启动"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:138
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33
 msgid "Unsupported"
 msgstr "未支持的"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:184
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189
 msgid "New client added"
 msgstr "新客户端添加完毕"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:188
-msgid "Client configuration saved successfully - restart required to take effect."
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193
+msgid ""
+"Client configuration saved successfully - restart required to take effect."
 msgstr "客户程序设置保存成功 - 程序重启后生效"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:202
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:213
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
 msgid "Bad client index."
 msgstr "客户程序索引无效"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:387
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:379
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:384
 msgid "Client"
 msgstr "客户"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
 msgid "started"
 msgstr "已启动"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223
 msgid "deleted"
 msgstr "已删除"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:235
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240
 msgid "WebApp configuration saved."
 msgstr "WebApp 设置已保存"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:251
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256
 msgid "Plugin configuration saved."
 msgstr "插件配置已保存"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
 msgid "WebApp"
 msgstr "Web程序"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:268
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273
 msgid "Failed to start"
 msgstr "启动失败"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278
 msgid "Failed to find server."
 msgstr "服务器或服务程序查找失败。"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:279
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284
 msgid "No plugin URL specified."
 msgstr "未指定插件链接"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:289
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294
 #, java-format
 msgid "No update URL specified for {0}"
 msgstr "{0} 未指定更新链接"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:297
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:315
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307
 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325
 msgid "Plugin or update download already in progress."
 msgstr "插件/更新包的下载正在进行"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:306
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:117
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118
 #, java-format
 msgid "Downloading plugin from {0}"
 msgstr "正在从 {0} 下载插件"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:324
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329
 #, java-format
 msgid "Checking plugin {0} for updates"
 msgstr "正在检查插件 {0} 是否存在更新"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:334
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339
 #, java-format
 msgid "Started plugin {0}"
 msgstr "插件 {0} 已运行"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:336
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341
 #, java-format
 msgid "Error starting plugin {0}"
 msgstr "插件启动错误 {0}"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:21
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:192
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376
+msgid ""
+"Interface configuration saved successfully - restart required to take effect."
+msgstr "接口配置保存成功 - I2P重启后生效"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258
 msgid "Edit"
 msgstr "编辑"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:30
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331
 msgid "Add Client"
 msgstr "添加客户端"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
 msgid "Class and arguments"
 msgstr "类与参数"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Control"
 msgstr "控制项"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Run at Startup?"
 msgstr "启动时运行?"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:131
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197
 msgid "Description"
 msgstr "描述"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148
 msgid "Plugin"
 msgstr "插件"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:95
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:268
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:180
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185
 msgid "Version"
 msgstr "版本"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:97
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163
 msgid "Signed by"
 msgstr "数字签名者:"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:114
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180
 msgid "Date"
 msgstr "日期"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:120
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186
 msgid "Author"
 msgstr "作者"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:136
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202
 msgid "License"
 msgstr "许可证"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:141
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207
 msgid "Website"
 msgstr "网站"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212
 msgid "Update link"
 msgstr "更新链接"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:194
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260
 msgid "Stop"
 msgstr "停止"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:196
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:81
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:312
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:313
 msgid "Check for updates"
 msgstr "检查更新"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:230
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:237
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:242
 msgid "Update"
 msgstr "æ›´æ–°"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268
 #, java-format
 msgid "Are you sure you want to delete {0}?"
 msgstr "您确定要删除 {0} ?"
 
-#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:204
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270
 msgid "Delete"
 msgstr "删除"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:324
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:325
 msgid "Add key"
 msgstr "添加密钥"
 
 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:322
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:323
 msgid "Delete key"
 msgstr "删除密钥"
 
@@ -1713,40 +1801,61 @@ msgstr "在钥匙环未找到"
 msgid "Invalid destination"
 msgstr "目标无效"
 
-#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:46
-msgid "Add additional logging statements above. Example: net.i2p.router.tunnel=WARN"
+#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:82
+msgid "Log overrides updated"
+msgstr "日志参数已更新"
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:160
+msgid "Log configuration saved"
+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"
 
-#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:47
-msgid "Or put entries in the logger.config file. Example: logger.record.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"
 
-#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:48
+#: ../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"
 
-#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 msgid "CRIT"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 msgid "DEBUG"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 msgid "ERROR"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 msgid "INFO"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68
 msgid "WARN"
 msgstr ""
 
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88
+msgid "Remove"
+msgstr "删除"
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:125
+msgid "Select a class to add"
+msgstr "选择要添加的类"
+
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:199
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:204
 msgid "Network"
 msgstr "网络"
 
@@ -1755,8 +1864,8 @@ msgid "Service"
 msgstr "服务"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:100
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386
 #: ../java/strings/Strings.java:72
 msgid "Tunnels"
 msgstr "隧道"
@@ -1770,7 +1879,7 @@ msgid "Clients"
 msgstr "客户端"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:292
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:293
 msgid "Keyring"
 msgstr "钥匙环"
 
@@ -1779,15 +1888,15 @@ msgid "Logging"
 msgstr "日志"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:106
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260
 #: ../java/strings/Strings.java:67
 msgid "Peers"
 msgstr "节点"
 
 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:382
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:142
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143
 msgid "Stats"
 msgstr "统计"
 
@@ -1797,13 +1906,15 @@ msgstr "高级"
 
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48
 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:35
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:343
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:352
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:377
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344
 msgid "Save changes"
 msgstr "保存修改"
 
@@ -1889,25 +2000,25 @@ msgstr "正在更新共享带宽比例"
 msgid "Updated bandwidth limits"
 msgstr "带宽限制更新完毕"
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:39
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:47
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:50
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:57
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:60
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62
 msgid "unknown"
 msgstr "未知"
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:169
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172
 msgid "bits per second"
 msgstr "Bit/s"
 
-#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:170
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173
 #, java-format
 msgid "or {0} bytes per month maximum"
 msgstr "或最多 {0} Byte/月(假设始终 7 天 x 24小时开机)"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:314
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:315
 msgid "Ban peer until restart"
 msgstr "封杀节点直到重启"
 
@@ -1927,7 +2038,7 @@ msgid "Invalid peer"
 msgstr "无效节点"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317
 msgid "Unban peer"
 msgstr "节点解封"
 
@@ -1940,8 +2051,8 @@ msgid "is not currently banned"
 msgstr "目前未封锁"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:322
-msgid "Adjust Profile Bonuses"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343
+msgid "Adjust peer bonuses"
 msgstr "调整节点评分"
 
 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47
@@ -1952,10 +2063,28 @@ msgstr "速度值无效"
 msgid "Bad capacity value"
 msgstr "容量值无效"
 
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350
+msgid "Save changes and reseed now"
+msgstr "保存修改+立刻开始网络引导"
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21
+msgid "Reseeding is already in progress"
+msgstr "网络引导中"
+
+#. skip the nonce checking in ReseedHandler
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24
+msgid "Starting reseed process"
+msgstr "正在开始引导过程"
+
+#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66
+msgid "Configuration saved successfully."
+msgstr "设置保存成功"
+
 #. Normal browsers send value, IE sends button label
 #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:292
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:293
 msgid "Shutdown immediately"
 msgstr "立刻关闭"
 
@@ -2002,7 +2131,7 @@ msgid "Restart in {0}"
 msgstr "{0} 后重启"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:290
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:291
 msgid "Shutdown gracefully"
 msgstr "平滑关闭"
 
@@ -2015,7 +2144,7 @@ msgid "Shutdown immediately!  boom bye bye bad bwoy"
 msgstr "立即关闭!不推荐"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:294
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:295
 msgid "Cancel graceful shutdown"
 msgstr "取消平滑关闭"
 
@@ -2024,7 +2153,7 @@ msgid "Graceful shutdown cancelled"
 msgstr "平滑关闭已取消"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307
 msgid "Graceful restart"
 msgstr "平滑重启"
 
@@ -2033,7 +2162,7 @@ msgid "Graceful restart requested"
 msgstr "平滑重启已请求"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309
 msgid "Hard restart"
 msgstr "硬重启"
 
@@ -2058,107 +2187,85 @@ msgid "Rekeying after graceful shutdown"
 msgstr "平滑关闭后更换密钥"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335
 msgid "Run I2P on startup"
 msgstr "系统启动时运行I2P"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:336
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337
 msgid "Don't run I2P on startup"
 msgstr "系统启动时不运行I2P"
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:354
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355
 msgid "Dump threads"
 msgstr ""
 
 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:322
-msgid "Show systray icon"
-msgstr "显示托盘图标"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
-msgid "System tray icon enabled."
-msgstr "系统托盘图标已启用"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110
-msgid "System tray icon feature not supported on this platform. Sorry!"
-msgstr "您的平台不支持系统托盘图标功能"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
-msgid "Warning: unable to contact the systray manager"
-msgstr "警告:与托盘管理器通讯失败"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:324
-msgid "Hide systray icon"
-msgstr "隐藏系统图标"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108
-msgid "System tray icon disabled."
-msgstr "系统托盘已禁用"
-
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:362
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:363
 msgid "View console on startup"
 msgstr "程序启动时显示控制台"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93
 msgid "Console is to be shown on startup"
 msgstr "启动后显示控制台"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:364
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365
 msgid "Do not view console on startup"
 msgstr "启动后不打开控制台"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
 msgid "Console is not to be shown on startup"
 msgstr "启动后不显示控制台"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105
 msgid "Service installed"
 msgstr "服务已安装"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107
 msgid "Warning: unable to install the service"
 msgstr "警告:无法安装服务"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
 msgid "Service removed"
 msgstr "服务已卸载"
 
-#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
 msgid "Warning: unable to remove the service"
 msgstr "警告:无法卸载服务"
 
-#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:118
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:111
 msgid "Stat filter and location updated successfully to"
 msgstr "统计数据过滤器及位置成功更新至"
 
-#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:120
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:113
 msgid "Failed to update the stat filter and location"
 msgstr "统计数据过滤器及地址更新失败"
 
-#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:121
-msgid "Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>"
-msgstr "曲线图列表已更新,更新后的内容可能需要最多 60s 的时间才能在这里及 <a href=\"graphs.jsp\">统计图表</a>页面中反映出来。"
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:114
+msgid ""
+"Graph list updated, may take up to 60s to be reflected here and on the <a "
+"href=\"graphs.jsp\">Graphs Page</a>"
+msgstr ""
+"曲线图列表已更新,更新后的内容可能需要最多 60s 的时间才能在这里及 <a href="
+"\"graphs.jsp\">统计图表</a>页面中反映出来。"
 
 #. 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:137
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:135
 msgid "Updated settings for all pools."
 msgstr "隧道池更新完毕"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:140
 msgid "Exploratory tunnel configuration saved successfully."
 msgstr "探索隧道设置保存成功。"
 
-#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:144
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142
 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:36
-msgid "Error saving the configuration (applied but not saved) - please see the error logs."
+msgid ""
+"Error saving the configuration (applied but not saved) - please see the "
+"error logs."
 msgstr "配置保存出错(已应用但未保存) - 参见错误日志"
 
 #. * dummies for translation
@@ -2238,79 +2345,91 @@ msgid "Refresh the page to view."
 msgstr "刷新页面后查看。"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+msgid "Arabic"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "English"
 msgstr "英语"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "French"
 msgstr "法语"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
 msgid "German"
 msgstr "德语"
 
 #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
-msgid "Chinese"
-msgstr "中文"
+msgid "Spanish"
+msgstr "西班牙语"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Dutch"
 msgstr "荷兰语"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
+msgid "Portuguese"
+msgstr "葡萄牙语"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53
 msgid "Russian"
 msgstr "俄语"
 
-#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
+msgid "Chinese"
+msgstr "中文"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54
 msgid "Swedish"
 msgstr "瑞士语"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:88
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:85
 msgid "Update available, attempting to download now"
 msgstr "有更新可用,正在尝试下载"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:90
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:87
 msgid "Update available, click button on left to download"
 msgstr "有更新可用,点左侧按钮下载"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:96
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:93
 msgid "No update available"
 msgstr "æ— æ›´æ–°"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:104
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:101
 msgid "Updating news URL to"
 msgstr "正在更新新闻链接至"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:112
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:109
 msgid "Updating proxy host to"
 msgstr "正在更新代理主机至"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:120
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:117
 msgid "Updating proxy port to"
 msgstr "正在更新代理端口至"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:133
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:130
 msgid "Updating refresh frequency to"
 msgstr "正在更新更新频率为"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:140
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:137
 msgid "Updating update policy to"
 msgstr "正在更新更新策略为"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:149
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:146
 msgid "Updating update URLs."
 msgstr "正在更新更新链接至"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:158
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:155
 msgid "Updating trusted keys."
 msgstr "正在更新可信公钥为"
 
-#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:166
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:163
 msgid "Updating unsigned update URL to"
 msgstr "正在更新未签名软件链接至"
 
 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
+#: ../java/src/net/i2p/router/web/GraphHelper.java:167
 msgid "Never"
 msgstr "从不"
 
@@ -2330,264 +2449,266 @@ msgstr "仅下载并验证"
 msgid "Download, verify, and restart"
 msgstr "仅下载、验证并重启"
 
-#: ../java/src/net/i2p/router/web/FormHandler.java:163
-msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."
+#: ../java/src/net/i2p/router/web/FormHandler.java:174
+msgid ""
+"Invalid form submission, probably because you used the 'back' or 'reload' "
+"button on your browser. Please resubmit."
 msgstr "表单提交无效,可能的原因是您使用了“后退”或“刷新”按钮。请重新提交。"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:82
+#: ../java/src/net/i2p/router/web/GraphHelper.java:93
 msgid "Combined bandwidth graph"
 msgstr "复合带宽图"
 
 #. e.g. "statname for 60m"
-#: ../java/src/net/i2p/router/web/GraphHelper.java:96
+#: ../java/src/net/i2p/router/web/GraphHelper.java:107
 #, java-format
 msgid "{0} for {1}"
 msgstr "过去 {1} 统计 {0}"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:130
+#: ../java/src/net/i2p/router/web/GraphHelper.java:146
 msgid "Configure Graph Display"
 msgstr "图表显示设置"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:130
+#: ../java/src/net/i2p/router/web/GraphHelper.java:146
 msgid "Select Stats"
 msgstr "选择统计项"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:132
+#: ../java/src/net/i2p/router/web/GraphHelper.java:150
 msgid "Periods"
 msgstr "周期"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:133
+#: ../java/src/net/i2p/router/web/GraphHelper.java:151
 msgid "Plot averages"
 msgstr "事件均值"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:134
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:416
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:332
+#: ../java/src/net/i2p/router/web/GraphHelper.java:152
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333
 msgid "or"
 msgstr "或"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:134
+#: ../java/src/net/i2p/router/web/GraphHelper.java:152
 msgid "plot events"
 msgstr "事件数量"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:135
+#: ../java/src/net/i2p/router/web/GraphHelper.java:153
 msgid "Image sizes"
 msgstr "图像尺寸"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:135
+#: ../java/src/net/i2p/router/web/GraphHelper.java:153
 msgid "width"
 msgstr "宽度"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:136
+#: ../java/src/net/i2p/router/web/GraphHelper.java:154
 msgid "height"
 msgstr "高度"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:136
-#: ../java/src/net/i2p/router/web/GraphHelper.java:137
+#: ../java/src/net/i2p/router/web/GraphHelper.java:154
+#: ../java/src/net/i2p/router/web/GraphHelper.java:155
 msgid "pixels"
 msgstr "像素"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
+#: ../java/src/net/i2p/router/web/GraphHelper.java:156
 msgid "Refresh delay"
 msgstr "刷新延迟"
 
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
-msgid "hour"
-msgstr "小时"
-
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
-msgid "minute"
-msgstr "分钟"
-
-#: ../java/src/net/i2p/router/web/GraphHelper.java:138
-msgid "minutes"
-msgstr "分钟"
-
-#: ../java/src/net/i2p/router/web/GraphHelper.java:139
+#: ../java/src/net/i2p/router/web/GraphHelper.java:171
 msgid "Redraw"
 msgstr "重绘"
 
+#: ../java/src/net/i2p/router/web/GraphHelper.java:203
+msgid "Graph settings saved"
+msgstr "图表设置已保存"
+
 #: ../java/src/net/i2p/router/web/LogsHelper.java:13
 #: ../java/src/net/i2p/router/web/LogsHelper.java:37
 msgid "File location"
 msgstr "文件位置"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:77
+#: ../java/src/net/i2p/router/web/LogsHelper.java:34
+msgid "File not found"
+msgstr "文件未找到"
+
+#: ../java/src/net/i2p/router/web/LogsHelper.java:52
+msgid "No log messages"
+msgstr "日志中无消息"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:80
 msgid "Network Database RouterInfo Lookup"
 msgstr "网络数据库 RouterInfo 检索"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:92
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95
 #: ../java/strings/Strings.java:68
 msgid "Router"
 msgstr "路由器"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:92
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95
 msgid "not found in network database"
 msgstr "在网络数据库概况未找到"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:104
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:212
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215
 msgid "Network Database Contents"
 msgstr "网络数据库内容"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:105
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108
 msgid "View RouterInfo"
 msgstr "浏览 RouterInfo"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:106
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:109
 msgid "LeaseSets"
 msgstr "赁集"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:128
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:131
 msgid "LeaseSet"
 msgstr "赁集"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:130
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:133
 msgid "Local"
 msgstr "本地"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:132
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135
 msgid "Unpublished"
 msgstr "未发布"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:133
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:140
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:136
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:143
 msgid "Destination"
 msgstr "目标"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:150
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:153
 #, java-format
 msgid "Expires in {0}"
 msgstr "{0} 后过期"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:152
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:155
 #, java-format
 msgid "Expired {0} ago"
 msgstr "{0}前过期"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:164
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
 msgid "Gateway"
 msgstr "网关"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:164
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167
 msgid "Lease"
 msgstr "租赁"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:169
 msgid "Tunnel"
 msgstr "隧道"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:212
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215
 msgid "View LeaseSets"
 msgstr "查看赁集"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:214
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:217
 msgid "Not initialized"
 msgstr "未初始化"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:223
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:226
 msgid "Routers"
 msgstr "路由器"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:225
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:228
 msgid "Show all routers"
 msgstr "显示所有路由器"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:227
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:230
 msgid "Show all routers with full stats"
 msgstr "显示所有路由及统计"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:262
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265
 msgid "Network Database Router Statistics"
 msgstr "NetDb路由器统计"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:268
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:282
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:300
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
 msgid "Count"
 msgstr "计数"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:282
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285
 msgid "Transports"
 msgstr "传输"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:300
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303
 msgid "Country"
 msgstr "国家"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:339
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342
 msgid "Our info"
 msgstr "我方信息"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:341
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344
 msgid "Peer info for"
 msgstr "节点信息"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:345
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348
 msgid "Full entry"
 msgstr "完整项"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:351
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:110
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:600
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:115
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
 msgid "Hidden"
 msgstr "隐身"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:351
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
 msgid "Updated"
 msgstr "已更新"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:352
 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:355
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358
 #, java-format
 msgid "{0} ago"
 msgstr "{0}前"
 
 #. shouldnt happen
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361
 msgid "Published"
 msgstr "发布"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363
 msgid "Address(es)"
 msgstr "地址"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:373
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376
 msgid "cost"
 msgstr "开销"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:397
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
 msgid "Hidden or starting up"
 msgstr "隐身或正在启动"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:397
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
 msgid "SSU"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:397
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402
 msgid "SSU with introducers"
 msgstr "使用中介的SSU连接"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:398
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "NTCP"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:398
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "NTCP and SSU"
 msgstr "NTCP 与 SSU"
 
-#: ../java/src/net/i2p/router/web/NetDbRenderer.java:398
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403
 msgid "NTCP and SSU with introducers"
 msgstr "使用中介的NTCP与SSU连接"
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:82
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:93
 #, java-format
 msgid "News last updated {0} ago."
 msgstr "新闻更新于{0}前"
 
-#: ../java/src/net/i2p/router/web/NewsFetcher.java:88
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:99
 #, java-format
 msgid "News last checked {0} ago."
 msgstr "最近一次查收新闻在{0}前"
@@ -2617,137 +2738,139 @@ msgstr "插件 {0} 有更新"
 msgid "Update check failed for plugin {0}"
 msgstr "插件 {0} 更新检测失败"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:138
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:139
 msgid "Downloading plugin"
 msgstr "正在下载插件"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:145
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:179
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:244
 #, java-format
 msgid "{0}B transferred"
 msgstr "已传输 {0}B"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:151
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153
 msgid "Plugin downloaded"
 msgstr "插件下载完成"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:156
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:343
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356
 #, java-format
 msgid "Cannot create plugin directory {0}"
 msgstr "无法创建插件目录 {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:165
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:220
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:298
 #, java-format
 msgid "from {0}"
 msgstr "自 {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:175
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177
 #, java-format
 msgid "Plugin from {0} is corrupt"
 msgstr "由 {0} 获取的插件已损坏。"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:186
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188
 #, java-format
 msgid "Plugin from {0} does not contain the required configuration file"
 msgstr "由 {0} 获取的插件缺少必要的配置文件"
 
 #. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:199
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201
 #, java-format
 msgid "Plugin from {0} contains an invalid key"
 msgstr "由 {0} 获取的插件签名密钥无效"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:218
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:227
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:236
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249
 #, java-format
 msgid "Plugin signature verification of {0} failed"
 msgstr "插件 {0} 的签名验证失败。"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:251
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264
 #, java-format
 msgid "Plugin from {0} has invalid name or version"
 msgstr "从 {0} 获取的插件缺少有效的名称或版本"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:256
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269
 #, java-format
 msgid "Plugin {0} has mismatched versions"
 msgstr "插件 {0} 的内部版本不符。"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277
 #, java-format
 msgid "This plugin requires I2P version {0} or higher"
 msgstr "插件需要I2P版本 {0} 或更高"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:272
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285
 #, java-format
 msgid "This plugin requires Java version {0} or higher"
 msgstr "插件需要 Java 版本 {0} 或更高"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:280
-msgid "Downloaded plugin is for new installs only, but the plugin is already installed"
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293
+msgid ""
+"Downloaded plugin is for new installs only, but the plugin is already "
+"installed"
 msgstr "所下插件包仅用于全新安装,但您已经安装过该插件"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:292
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305
 msgid "Installed plugin does not contain the required configuration file"
 msgstr "已安装插件缺少所需的配置文件"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:300
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313
 msgid "Signature of downloaded plugin does not match installed plugin"
 msgstr "所下插件的签名(人)与所安装插件的签名不符"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:307
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320
 #, java-format
 msgid "Downloaded plugin version {0} is not newer than installed plugin"
 msgstr "所下插件版本 {0} 没有已安装插件的版本新"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:314
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or higher"
 msgstr "插件更新包需要安装插件的版本为 {0} 或更高"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:321
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334
 #, java-format
 msgid "Plugin update requires installed plugin version {0} or lower"
 msgstr "插件更新包需要安装插件的版本不高于 {0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:338
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351
 msgid "Plugin is for upgrades only, but the plugin is not installed"
 msgstr "插件更新包包找不到对应的原版插件"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364
 #, java-format
 msgid "Failed to install plugin in {0}"
 msgstr "无法将插件安装至目录{0}"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:358
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371
 #, java-format
 msgid "Plugin {0} installed, router restart required"
 msgstr "插件 {0} 已安装,重启I2P后生效"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:360
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373
 #, java-format
 msgid "Plugin {0} installed"
 msgstr "插件 {0} 已安装"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:369
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391
 #, java-format
 msgid "Plugin {0} installed and started"
 msgstr "插件 {0} 已安装并启动"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394
 #, java-format
 msgid "Plugin {0} installed but failed to start, check logs"
 msgstr "插件 {0} 已安装但启动失败,请检查日志。"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396
 #, java-format
 msgid "Plugin {0} installed but failed to start"
 msgstr "插件 {0} 已安装但启动失败"
 
-#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:383
+#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406
 #, java-format
 msgid "Failed to download plugin from {0}"
 msgstr "重 {0} 下载插件失败"
@@ -2777,13 +2900,13 @@ msgstr "分组(容量)"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335
 msgid "Speed"
 msgstr "速度"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:338
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:339
 msgid "Capacity"
 msgstr "容量"
 
@@ -2814,7 +2937,7 @@ msgid "Failing"
 msgstr "失败"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287
 msgid "Integrated"
 msgstr "已整合节点"
 
@@ -2930,7 +3053,9 @@ msgid "caps"
 msgstr "容量"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
-msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel"
+msgid ""
+"peak throughput (bytes per second) over a 1 minute period that the peer has "
+"sustained in a single tunnel"
 msgstr "该节点一分钟由单一隧道通过的数据峰值(byte/s)。"
 
 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
@@ -2961,10 +3086,6 @@ msgstr "是否节点被封禁,不可达,或在隧道测试中失败?"
 msgid "status"
 msgstr "状态"
 
-#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313
-msgid "n/a"
-msgstr ""
-
 #: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57
 #, java-format
 msgid "Temporary ban expiring in {0}"
@@ -2980,427 +3101,488 @@ msgid "unban now"
 msgstr "立即解封"
 
 #. Note to translators: all runtime zh translation disabled in this file, no font available in RRD
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:174
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:223
 msgid "Bandwidth usage"
 msgstr "带宽占用"
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:181
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:230
 msgid "Outbound bytes/sec"
 msgstr "出站(byte/s)"
 
 #. def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3);
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:183
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:232
 msgid "Inbound bytes/sec"
 msgstr "入站(byte/s)"
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:186
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:187
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:188
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:189
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:235
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:236
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:237
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:238
 msgid "bytes/sec"
-msgstr ""
+msgstr "byte/s"
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:186
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:235
 msgid "out average"
 msgstr "出站平均值"
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:187
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:189
-#: ../java/src/net/i2p/router/web/SummaryRenderer.java:110
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:236
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:238
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:115
 msgid "max"
 msgstr "最大"
 
-#: ../java/src/net/i2p/router/web/StatSummarizer.java:188
+#: ../java/src/net/i2p/router/web/StatSummarizer.java:237
 msgid "in average"
 msgstr "入站平均值"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:56
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:57
 msgid "GO"
-msgstr ""
+msgstr "执行"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:59
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:60
 msgid "Statistics gathered during this router's uptime"
 msgstr "路由运行时收集的统计数据"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:62
-msgid "The data gathered is quantized over a 1 minute period, so should just be used as an estimate."
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:63
+msgid ""
+"The data gathered is quantized over a 1 minute period, so should just be "
+"used as an estimate."
 msgstr "所采集数据量化周期为1分钟,仅供参考。"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:108
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:64
+msgid "These statistics are primarily used for development and debugging."
+msgstr "统计主要用于I2P的开发和调试。"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:105
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:156
+msgid "No lifetime events"
+msgstr "全程无事件"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:116
 msgid "frequency"
 msgstr "更新频率"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:142
-msgid "No lifetime events"
-msgstr "自运行起无事件"
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:120
+msgid "Rolling average events per period"
+msgstr "每周期事件滚动均值"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:124
+msgid "Highest events per period"
+msgstr "每周期事件峰值"
+
+#. 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(num(curFreq.getMinAverageInterval())).append("ms)");
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:135
+msgid "Lifetime average events per period"
+msgstr "全程每周期事件均值"
+
+#. Display the strict average
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:140
+msgid "Lifetime average frequency"
+msgstr "全程平均频率"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:154
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:168
 msgid "rate"
 msgstr "速度"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:156
-msgid "avg value"
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:170
+msgid "Average"
 msgstr "均值"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:185
-msgid "events"
-msgstr "事件"
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:173
+msgid "Highest average"
+msgstr "最高均值"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:191
+#. breaking the sentence like before makes translation in my language impossible.
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:201
+#, java-format
+msgid "There were {0} event(s) in this period"
+msgstr "本周期共有{0}个事件,"
+
+#. buf.append(' ');
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:203
+#, java-format
+msgid " which ended {0} ago."
+msgstr "于{0}前结束。"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:205
 msgid "No events"
 msgstr "无事件"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:197
-msgid "lifetime average"
-msgstr "总平均值"
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:211
+msgid "Average event count"
+msgstr "平均事件计数"
 
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:199
-msgid "peak average"
-msgstr "峰值平均值"
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:213
+msgid "Events in peak period"
+msgstr "事件峰值"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:221
+msgid "Graph Data"
+msgstr "图表数据"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:223
+msgid "Graph Event Count"
+msgstr "图表事件计数"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:226
+msgid "Export Data as XML"
+msgstr "导出数据为XML"
 
 #. Display the strict average
-#: ../java/src/net/i2p/router/web/StatsGenerator.java:217
-msgid "lifetime average value"
-msgstr "总平均值"
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:231
+msgid "Lifetime average value"
+msgstr "全程均值"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:40
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:41
 msgid "I2P Router Help &amp; FAQ"
 msgstr "I2P 使用帮助与常见问答"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:42
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:43
 msgid "Help &amp; FAQ"
 msgstr ""
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:54
-msgid "Configure startup of clients and webapps (services); manually start dormant services"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:55
+msgid ""
+"Configure startup of clients and webapps (services); manually start dormant "
+"services"
 msgstr "设置客户程序及Web程序(服务)的启动;手动启动重要服务"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:56
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:57
 msgid "I2P Services"
 msgstr "I2P 服务"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:62
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:63
 msgid "Manage your I2P hosts file here (I2P domain name resolution)"
 msgstr "管理您的 I2P HOST表(I2P域名解析表)"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:64
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:65
 msgid "Addressbook"
 msgstr "地址簿"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:68
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:69
 msgid "Built-in anonymous BitTorrent Client"
 msgstr "内建的匿名 BitTorrent 客户端"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:70
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:71
 msgid "Torrents"
 msgstr "匿名BT"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:74
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:75
 msgid "Anonymous webmail client"
 msgstr "匿名Web邮件客户端"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:76
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:77
 msgid "Webmail"
 msgstr "匿名邮箱"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:80
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:81
 msgid "Anonymous resident webserver"
 msgstr "内置的匿名Web服务器"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:82
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:83
 msgid "Webserver"
 msgstr "匿名主页服务器"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:90
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:91
 msgid "Configure I2P Router"
 msgstr "设置 I2P 路由器"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:92
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:93
 msgid "I2P Internals"
 msgstr "I2P内部设置"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:98
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:374
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384
 msgid "View existing tunnels and tunnel build status"
 msgstr "查看现存隧道及隧道的建立状态"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:104
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258
 msgid "Show all current peer connections"
 msgstr "显示当前所有的节点连接"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:110
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:111
 msgid "Show recent peer performance profiles"
 msgstr "显示当前节点的性能记录"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:112
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:113
 msgid "Profiles"
 msgstr "节点信息"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:116
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:117
 msgid "Show list of all known I2P routers"
 msgstr "包含所有已知I2P路由器的列表"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:118
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:119
 msgid "NetDB"
 msgstr "NetDB"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:122
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123
 msgid "Health Report"
 msgstr "路由器健康状况报告"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:124
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:125
 msgid "Logs"
 msgstr "日志"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:134
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:135
 msgid "Graph router performance"
 msgstr "路由性能统计图"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:136
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:137
 msgid "Graphs"
 msgstr "图表"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:140
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141
 msgid "Textual router performance statistics"
 msgstr "路由性能文字统计"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:146
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:365
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:370
 msgid "Local Destinations"
 msgstr "本地服务"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:148
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149
 #: ../java/strings/Strings.java:62
 msgid "I2PTunnel"
 msgstr "I2P隧道"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:159
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164
 msgid "I2P Router Help"
 msgstr "I2P路由帮助"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:161
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166
 msgid "General"
 msgstr "功能概况"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171
 msgid "Local Identity"
 msgstr "本地身份"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:170
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:175
 msgid "Your unique I2P router identity is"
 msgstr "您I2P路由的唯一身份为"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:174
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:179
 msgid "never reveal it to anyone"
 msgstr "切勿将其告诉任何人"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:176
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:181
 msgid "show"
 msgstr "显示"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:187
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:192
 msgid "How long we've been running for this session"
 msgstr "本次路由运行时间"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:190
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:195
 msgid "Uptime"
 msgstr "运行时间"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:197
-msgid "Help with configuring your firewall and router for optimal I2P performance"
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202
+msgid ""
+"Help with configuring your firewall and router for optimal I2P performance"
 msgstr "如何正确配置防火墙和(物理)路由器优化I2P性能"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:226
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231
 msgid "Download"
 msgstr "下载"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240
 msgid "Download Unsigned"
 msgstr "下载未签名更新"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266
 msgid "Active"
 msgstr "活动节点"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:269
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275
 msgid "Fast"
 msgstr "快速节点"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281
 msgid "High capacity"
 msgstr "高容量节点"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293
 msgid "Known"
 msgstr "已知节点"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:302
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:308
 msgid "Help with firewall configuration"
 msgstr "如何配置防火墙"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:304
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:310
 msgid "Check NAT/firewall"
 msgstr "检查NAT/防火墙"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:324
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:330
 msgid "Reseed"
 msgstr "补种(搜索节点启动网络)"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:341
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:347
 msgid "Configure router bandwidth allocation"
 msgstr "设置路由的带宽分配"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:343
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349
 msgid "Bandwidth in/out"
 msgstr "带宽(进/出站)"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:359
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:369
 msgid "Total"
 msgstr "总计"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:366
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376
 msgid "Used"
 msgstr "已用"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:391
 msgid "Exploratory"
 msgstr "探测"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:393
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403
 msgid "Participating"
 msgstr "共享"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:399
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:409
 msgid "Share ratio"
 msgstr "共享/占用"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:405
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415
 msgid "What's in the router's job queue?"
 msgstr "查看路由的作业队列"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:407
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417
 msgid "Congestion"
 msgstr "拥堵"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422
 msgid "Job lag"
 msgstr "作业延迟"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:418
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:428
 msgid "Message delay"
 msgstr "消息延迟"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:424
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:434
 msgid "Tunnel lag"
 msgstr "隧道延迟"
 
-#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:430
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440
 msgid "Backlog"
 msgstr "积压"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:101
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:106
 msgid "ERR-Client Manager I2CP Error - check logs"
 msgstr "错误-客户程序管理器I2CP错误 - 请看日志"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:108
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:113
 #, java-format
 msgid "ERR-Clock Skew of {0}"
 msgstr "错误-系统时滞 {0}"
 
 # 暂不翻译,确定/良好 可能影响按钮的翻译
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:117
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:576
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:122
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
 msgid "OK"
 msgstr "正常"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:118
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:123
 msgid "ERR-Private TCP Address"
 msgstr "错误-TCP私有地址"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:120
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:125
 msgid "ERR-SymmetricNAT"
 msgstr "错误-SymmeticNAT"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:123
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:128
 msgid "WARN-Firewalled with Inbound TCP Enabled"
 msgstr "警告-入站TCP开启但因防火墙受限"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:125
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:130
 msgid "WARN-Firewalled and Floodfill"
 msgstr "警告-种子节点因防火墙受限"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:127
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:132
 msgid "WARN-Firewalled and Fast"
 msgstr "警告-快速节点因防火墙受限"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:128
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:580
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:133
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
 msgid "Firewalled"
 msgstr "防火墙限制"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:130
-msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
-msgstr "错误-UDP端口已占用 - 在高级设置中设置 i2np.udp.internalPort=新端口并重启程序"
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:135
+msgid ""
+"ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and "
+"restart"
+msgstr ""
+"错误-UDP端口已占用 - 在高级设置中设置 i2np.udp.internalPort=新端口并重启程序"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:136
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:141
 msgid "ERR-No Active Peers, Check Network Connection and Firewall"
 msgstr "错误-无活动节点,请检查网络连接及防火墙"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:139
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:144
 msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
 msgstr "错误-UDP已禁用且TCP入站主机与端口未设置"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:141
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:146
 msgid "WARN-Firewalled with UDP Disabled"
 msgstr "警告-因防火墙受限且UDP被禁用"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:143
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:596
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:148
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
 msgid "Testing"
 msgstr "测试中"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:365
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:370
 msgid "Add/remove/edit &amp; control your client and server tunnels"
 msgstr "添加、删除、编辑或控制客户程序隧道和服务隧道"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:377
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:382
 msgid "Server"
 msgstr "服务"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:381
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:386
 msgid "Show tunnels"
 msgstr "显示隧道"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:392
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:397
 msgid "Leases expired"
 msgstr "Lease已过期"
 
 #. red or yellow light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:392
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:393
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:397
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:398
 msgid "Rebuilding"
 msgstr "正在重建"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:393
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:398
 msgid "ago"
 msgstr "前"
 
 #. green light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:396
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:401
 msgid "Ready"
 msgstr "就绪"
 
 #. yellow light
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:400
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
 msgid "Building"
 msgstr "创建中"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:400
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
 msgid "Building tunnels"
 msgstr "正在隧道创建"
 
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:405
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:410
 msgid "none"
 msgstr "æ— "
 
@@ -3408,37 +3590,37 @@ msgstr "æ— "
 #. nicely under 'local destinations' in the summary bar
 #. note that if the wording changes in i2ptunnel.config, we have to
 #. keep the old string here as well for existing installs
-#: ../java/src/net/i2p/router/web/SummaryHelper.java:416
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:421
 #: ../java/strings/Strings.java:36
 msgid "shared clients"
 msgstr "共享客户端"
 
 #. Note to translators: all runtime zh translation disabled in this file, no font available in RRD
-#: ../java/src/net/i2p/router/web/SummaryRenderer.java:84
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:89
 #, java-format
 msgid "events in {0}"
 msgstr "事件/{0}"
 
-#: ../java/src/net/i2p/router/web/SummaryRenderer.java:86
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:91
 #, java-format
 msgid "averaged for {0}"
 msgstr "{0} 平均值"
 
-#: ../java/src/net/i2p/router/web/SummaryRenderer.java:96
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:101
 msgid "Events per period"
 msgstr "事件/周期"
 
-#: ../java/src/net/i2p/router/web/SummaryRenderer.java:109
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:114
 msgid "avg"
 msgstr "平均"
 
-#: ../java/src/net/i2p/router/web/SummaryRenderer.java:111
+#: ../java/src/net/i2p/router/web/SummaryRenderer.java:116
 msgid "now"
 msgstr "当前"
 
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:63
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:280
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:287
 msgid "configure"
 msgstr "设置"
 
@@ -3567,17 +3749,17 @@ msgid "Totals"
 msgstr "总计"
 
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:132
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:145
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:172
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:142
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:237
 msgid "Updating"
 msgstr "正在更新"
 
+#. Process the .sud/.su2 file
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:183
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:208
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:261
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:286
 msgid "Update downloaded"
 msgstr "升更新已下载"
 
@@ -3587,22 +3769,22 @@ msgid "Unsigned update file from {0} is corrupt"
 msgstr "来自 {0} 的未签名更新包已损坏"
 
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:203
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:281
 msgid "Restarting"
 msgstr "正在重启"
 
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:210
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:288
 msgid "Click Restart to install"
 msgstr "点击【重启】完成安装"
 
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:212
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:290
 msgid "Click Shutdown and restart to install"
 msgstr "点击【关闭】并重新启动I2P即可完成安装。"
 
 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:214
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:292
 #, java-format
 msgid "Version {0}"
 msgstr "版本 {0}"
@@ -3612,13 +3794,24 @@ msgstr "版本 {0}"
 msgid "Failed copy to {0}"
 msgstr "无法复制到{0}"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:203
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:184
+#, java-format
+msgid "Updating from {0}"
+msgstr "正在从 {0} 获取更新"
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:253
+#, java-format
+msgid "No new version found at {0}"
+msgstr " {0} 上非有发现新版"
+
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:281
 msgid "Update verified"
 msgstr "更新已验证"
 
-#: ../java/src/net/i2p/router/web/UpdateHandler.java:228
-msgid "Transfer failed"
-msgstr "数据传输失败"
+#: ../java/src/net/i2p/router/web/UpdateHandler.java:307
+#, java-format
+msgid "Transfer failed from {0}"
+msgstr "来在{0}的数据传输失败"
 
 #. wars for ConfigClientsHelper
 #: ../java/strings/Strings.java:12
@@ -3872,577 +4065,693 @@ msgid "config networking"
 msgstr "连网设置"
 
 #. We have intl defined when this is included, but not when compiled standalone.
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:218
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:218
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:228
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:235
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:230
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:215
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:215
 msgid "Refresh (s)"
 msgstr "刷新(秒)"
 
 #. ditto
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:222
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:235
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:222
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:232
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:227
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:238
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:234
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:237
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:219
 msgid "Enable"
 msgstr "启用"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240
 msgid "I2P Network Configuration"
 msgstr "I2P 连网设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:297
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:298
 msgid "Bandwidth limiter"
 msgstr "带宽限制"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:299
-msgid "I2P will work best if you configure your rates to match the speed of your internet connection."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:300
+msgid ""
+"I2P will work best if you configure your rates to match the speed of your "
+"internet connection."
 msgstr "与联网环境相符的速度能使I2P以最佳的状态工作。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:304
 msgid "KBps In"
 msgstr "KBps 入站"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318
 msgid "KBps Out"
 msgstr "KBps 出站"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:333
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:334
 msgid "Share"
 msgstr "共享"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:340
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:341
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304
 msgid "NOTE"
 msgstr "注意"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343
 #, java-format
 msgid "You have configured I2P to share only {0} KBps."
 msgstr "您设置I2P仅共享 {0} KBps"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346
 msgid "I2P requires at least 12KBps to enable sharing. "
 msgstr "I2P 需要至少 12KBps 才能进行共享。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346
-msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. "
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347
+msgid ""
+"Please enable sharing (participating in tunnels) by configuring more "
+"bandwidth. "
 msgstr "请设置更多的带宽以便启用共享功能(加入到其他节点的隧道创建中)。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347
-msgid "It improves your anonymity by creating cover traffic, and helps the network."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:348
+msgid ""
+"It improves your anonymity by creating cover traffic, and helps the network."
 msgstr "通过制造混淆流量共享能增强您的匿名性,帮助网络成长。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:351
 #, java-format
 msgid "You have configured I2P to share {0} KBps."
 msgstr "您设置I2P共享 {0} KBps"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:353
-msgid "The higher the share bandwidth the more you improve your anonymity and help the network."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:354
+msgid ""
+"The higher the share bandwidth the more you improve your anonymity and help "
+"the network."
 msgstr "共享的带宽越多,您的匿名性越强同时能帮助网络成长。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:357
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:513
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:303
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:326
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:373
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:321
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:364
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:403
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:322
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365
 msgid "Cancel"
 msgstr "取消"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:374
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375
 msgid "IP and Transport Configuration"
 msgstr "IP 与传输设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:395
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:306
 msgid "The default settings will work for most people."
 msgstr "默认设置适于大多数人。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379
 msgid "There is help below."
 msgstr "页面下方有帮助信息"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:380
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381
 msgid "UPnP Configuration"
 msgstr "UPnP 设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:384
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385
 msgid "Enable UPnP to open firewall ports"
 msgstr "启用UPnP以打开防火墙端口"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:386
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387
 msgid "UPnP status"
 msgstr "UPnP 统计"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389
 msgid "IP Configuration"
 msgstr "IP 设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:390
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
 msgid "Externally reachable hostname or IP address"
 msgstr "公网可访问的本机域名或IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:394
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
 msgid "Use all auto-detect methods"
 msgstr "使用全部自动探测方法"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:398
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
 msgid "Disable UPnP IP address detection"
 msgstr "禁用UPnP IP 地址探测"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:402
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403
 msgid "Ignore local interface IP address"
 msgstr "忽略本地接口的 IP 地址"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407
 msgid "Use SSU IP address detection only"
 msgstr "仅使用SSU IP 地址探测"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:410
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:478
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
 msgid "Specify hostname or IP"
 msgstr "指定主机名或IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417
 msgid "Select Interface"
 msgstr "选择网络接口"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431
 msgid "Hidden mode - do not publish IP"
 msgstr "隐身模式 - 不发布IP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:432
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:433
 msgid "(prevents participating traffic)"
 msgstr "(阻止共享流量)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:434
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
 msgid "Action when IP changes"
 msgstr "IP改变后应"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:438
-msgid "Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439
+msgid ""
+"Laptop mode - Change router identity and UDP port when IP changes for "
+"enhanced anonymity"
 msgstr "笔记本模式 - IP变化后改变路由身份及UDP端口(拨号用户慎用)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:440
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:441
 msgid "Experimental"
 msgstr "试验性"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443
 msgid "UDP Configuration:"
 msgstr "UDP 设置:"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:444
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:445
 msgid "UDP port:"
 msgstr "UDP端口"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:458
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
 msgid "TCP Configuration"
 msgstr "TCP 连接设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:464
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:465
 msgid "Use auto-detected IP address"
 msgstr "使用自动检测得到的 IP 地址"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:466
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:498
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:467
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499
 msgid "currently"
 msgstr "目前"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:470
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:471
 msgid "if we are not firewalled"
 msgstr "如果没有受到防火墙阻挡"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:474
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:475
 msgid "Always use auto-detected IP address (Not firewalled)"
 msgstr "总是使用自动探测到的IP地址(没有防火墙限制)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:484
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
 msgid "Disable inbound (Firewalled)"
 msgstr "禁止入站连接(受防火墙限制)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:488
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489
 msgid "Completely disable"
 msgstr "完全禁用"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:490
-msgid "(select only if behind a firewall that throttles or blocks outbound TCP)"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:491
+msgid ""
+"(select only if behind a firewall that throttles or blocks outbound TCP)"
 msgstr "仅在受到防火墙的流量限制或入站连接限制时使用"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:492
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493
 msgid "Externally reachable TCP port"
 msgstr "公网可访问的TCP端口"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:496
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497
 msgid "Use the same port configured for UDP"
 msgstr "使用与UDP相同的端口"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:504
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:505
 msgid "Specify Port"
 msgstr "指定端口"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:508
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:338
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:330
 msgid "Note"
 msgstr "注意"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512
 msgid "Changing these settings will restart your router."
 msgstr "修改这些设置将必须重启路由器。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518
 msgid "Configuration Help"
 msgstr "设置帮助"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:519
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:568
-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映射,您的速度和网络整合度会逐渐提升。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
+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映"
+"射,您的速度和网络整合度会逐渐提升。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:521
-msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522
+msgid ""
+"If you can, please poke a hole in your firewall to allow unsolicited UDP and "
+"TCP packets to reach you."
 msgstr "如果可能,请在防火墙中添加端口并允许入站UDP/TCP数据包通过。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523
-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)或借助“SSU中介”进行UDP端口穿透,通过它们也可以中继数据。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524
+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)或借助“SSU中介”进行UDP端口穿"
+"透,通过它们也可以中继数据。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:525
-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不能正常工作,或外部防火墙封锁网络。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526
+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不能正常工作,或外部防火墙封锁网络。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:528
 msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
 msgstr "在某些防火墙下例如Symmetric,I2P可能无法有效利用NAT工作。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536
-msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537
+msgid ""
+"UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect "
+"the external IP address and forward ports."
 msgstr "UPnP与公网网关设备(IGD)通讯可以检测外部IP和映射端口。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539
 msgid "UPnP support is beta, and may not work for any number of reasons"
 msgstr "UPnP支持仍在测试阶段,可能由于一些原因无法正常工作。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541
 msgid "No UPnP-compatible device present"
 msgstr "没有发现UPnP兼容设备"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543
 msgid "UPnP disabled on the device"
 msgstr "设备上的UPnP支持已禁用"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545
 msgid "Software firewall interference with UPnP"
 msgstr "软件防火墙阻止UPnP"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547
 msgid "Bugs in the device's UPnP implementation"
 msgstr "设备的UPnP支持有Bug"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:548
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549
 msgid "Multiple firewall/routers in the internet connection path"
 msgstr "公网连接中存在多个防火墙/路由器"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:550
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:551
 msgid "UPnP device change, reset, or address change"
 msgstr "UPnP设备改变、重置或地址迁移"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:552
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:553
 msgid "Review the UPnP status here."
 msgstr "在这里检查UPnP状态。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:554
-msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
+msgid ""
+"UPnP may be enabled or disabled above, but a change requires a router "
+"restart to take effect."
 msgstr "UPnP 的关闭或开启均需要程序重启后生效。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:556
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
 msgid "Hostnames entered above will be published in the network database."
 msgstr "上面输入的主机名称将在网络数据库(NetDB)中发布。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:558
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559
 msgid "They are <b>not private</b>."
 msgstr "他们并<b>非私有地址</b>。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:560
-msgid "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561
+msgid ""
+"Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
 msgstr "此外,<b>请勿输入如127.0.0.1或192.168.1.1等私有地址</b>"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:562
-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 "如果您设置了错误的IP地址或主机名称,或NAT/防火墙配置不当,您的网络性能将受到明显影响。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
+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 ""
+"如果您设置了错误的IP地址或主机名称,或NAT/防火墙配置不当,您的网络性能将受到"
+"明显影响。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:564
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
 msgid "When in doubt, leave the settings at the defaults."
 msgstr "如果对设置有疑问,请保留默认设置。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:566
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
 msgid "Reachability Help"
 msgstr "连通性帮助"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571
-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仍然报告您受到防火墙阻隔,请想想您是否可能有多层防火墙,例如软件防护墙和外部的硬件路由器。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572
+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仍然报告您受到防火墙阻隔,请想想您是否可能有"
+"多层防火墙,例如软件防护墙和外部的硬件路由器。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:574
-msgid "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help diagnose the problem."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
+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>可以帮助您诊断问题。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:578
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
 msgid "Your UDP port does not appear to be firewalled."
 msgstr "您的UDP端口似乎一切正常。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:582
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
 msgid "Your UDP port appears to be firewalled."
 msgstr "您的UDP端口似乎因防火墙而连接受限。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:584
-msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
+msgid ""
+"As the firewall detection methods are not 100% reliable, this may "
+"occasionally be displayed in error."
 msgstr "由于防火墙检测方法并非100%可靠,有时也可能错误地显示此此提示。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:586
-msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
+msgid ""
+"However, if it appears consistently, you should check whether both your "
+"external and internal firewalls are open for your port."
 msgstr "然而,如果总是出现此提示,您应检查外部或内部防火墙是否打开了I2P端口。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:588
-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也能够正常工作,无需担心。受到防火墙阻隔时,路由器将通过“中介(Introducers)”中继入站连接。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589
+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也能够正常工作,无需担心。受到防火墙阻隔时,路由器将通"
+"过“中介(Introducers)”中继入站连接。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590
-msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)."
-msgstr "然而,如果您能打开防火墙端口,您才能得到的共享流量,更好的帮助I2P网络。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591
+msgid ""
+"However, you will get more participating traffic and help the network more "
+"if you can open your firewall(s)."
+msgstr ""
+"然而,如果您能打开防火墙端口,您才能得到的共享流量,更好的帮助I2P网络。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:592
-msgid "If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control."
-msgstr "如果您确信已经打开了防火墙,请想想是不是同时存在硬件和软件防火墙,或存在您无法控制的额外的机构性的防火墙。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
+msgid ""
+"If you think you have already done so, remember that you may have both a "
+"hardware and a software firewall, or be behind an additional, institutional "
+"firewall you cannot control."
+msgstr ""
+"如果您确信已经打开了防火墙,请想想是不是同时存在硬件和软件防火墙,或存在您无"
+"法控制的额外的机构性的防火墙。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:594
-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网络。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
+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网络。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:598
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
 msgid "The router is currently testing whether your UDP port is firewalled."
 msgstr "路由器正在测试您的UDP端口是否被防火墙阻挡。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:602
-msgid "The router is not configured to publish its address, therefore it does not expect incoming connections."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
+msgid ""
+"The router is not configured to publish its address, therefore it does not "
+"expect incoming connections."
 msgstr "路由器被设置为禁止发布IP地址,因此并不需要入站连接。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:604
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
 msgid "WARN - Firewalled and Fast"
 msgstr "警告 - 快速节点,因防火墙受限"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:606
-msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
+msgid ""
+"You have configured I2P to share more than 128KBps of bandwidth, but you are "
+"firewalled."
 msgstr "您设置I2P共享超过128KBps的带宽,但您的连接因防火墙受阻。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:608
-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可以正常工作,但如果您的确能够分享超过128kps的带宽,打开防火墙端口它能工作的更好帮助网络中其他的人。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609
+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可以正常工作,但如果您的确能够分享超过128kps的带宽,打"
+"开防火墙端口它能工作的更好帮助网络中其他的人。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:610
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
 msgid "WARN - Firewalled and Floodfill"
 msgstr "警告 - 种子节点,因防火墙受限"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:612
-msgid "You have configured I2P to be a floodfill router, but you are firewalled."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
+msgid ""
+"You have configured I2P to be a floodfill router, but you are firewalled."
 msgstr "您已将I2P设置为种子路由,但您的连接已因防火墙受阻。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:614
-msgid "For best participation as a floodfill router, you should open your firewall."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
+msgid ""
+"For best participation as a floodfill router, you should open your firewall."
 msgstr "为了种子路由能够更好的参与到I2P网络中,请您的防火墙中打开端口。"
 
 # 暂不翻译方便反馈
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:616
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
 msgid "WARN - Firewalled with Inbound TCP Enabled"
 msgstr "警告 - 入站TCP开启,但因防火墙受限"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:618
-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端口也被防火墙阻挡。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
+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端口也被"
+"防火墙阻挡。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:620
-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连接,其他路由器节点将无法与您建立连接,造成网络受阻。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
+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连接,其他路由器节点将无法与您"
+"建立连接,造成网络受阻。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:622
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
 msgid "Please open your firewall or disable inbound TCP above."
 msgstr "请打开您的防火墙端口或禁用上面的入站TCP连接。"
 
 # 暂不翻译
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:624
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
 msgid "WARN - Firewalled with UDP Disabled"
 msgstr "警告 - 因防火墙受限,且UDP被禁用"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:626
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
 msgid "You have configured inbound TCP, however you have disabled UDP."
 msgstr "您设置了使用TCP连接,然而禁用了UDP连接。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:628
-msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
+msgid ""
+"You appear to be firewalled on TCP, therefore your router cannot accept "
+"inbound connections."
 msgstr "您的TCP连接似乎因防火墙受阻,导致您的路由器无法接收入站连接。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:630
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
 msgid "Please open your firewall or enable UDP."
 msgstr "请打开防火墙端口或启用UDP。"
 
 # 暂不翻译,方便错误反馈
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:632
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
 msgid "ERR - Clock Skew"
 msgstr "错误 - 系统时滞"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:634
-msgid "Your system's clock is skewed, which will make it difficult to participate in the network."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
+msgid ""
+"Your system's clock is skewed, which will make it difficult to participate "
+"in the network."
 msgstr "如果您的系统时钟太快或太慢,将影响计算机接入网络。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:636
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
 msgid "Correct your clock setting if this error persists."
 msgstr "如果错误持续,请校对您的系统时间。"
 
 # 暂不翻译,方便错误反馈
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:638
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
 msgid "ERR - Private TCP Address"
 msgstr "错误 - 私有TCP地址"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:640
-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一类的内网地址。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
+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一类的内网地"
+"址。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:642
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
 msgid "Correct the address or disable inbound TCP above."
 msgstr "正确设置IP地址或禁用上面的入站TCP连接。"
 
 # 暂不翻译,方便错误反馈
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:644
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
 msgid "ERR - SymmetricNAT"
 msgstr "错误 - SymmetricNAT"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:646
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
 msgid "I2P detected that you are firewalled by a Symmetric NAT."
 msgstr "I2P检测到您受到Symmetic NAT的阻挡。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:648
-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无法与此类防火墙很好的并存。您可能无法接收入站连接,这会障碍您连入I2P网络。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
+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无法与此类防火墙很好的并存。您可能无法接收入站连接,这会障碍您连入I2P网"
+"络。"
 
 # 暂不翻译,方便问题反馈
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:650
-msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
-msgstr "错误 - UDP端口已占用 - 在高级设置中设置 i2np.udp.internalPort=新端口 并重启程序"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
+msgid ""
+"ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config "
+"and restart"
+msgstr ""
+"错误 - UDP端口已占用 - 在高级设置中设置 i2np.udp.internalPort=新端口 并重启程"
+"序"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:652
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
 msgid "I2P was unable to bind to port 8887 or other configured port."
 msgstr "I2P无法绑定到端口8887或其他指定的端口上。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:654
-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的端口,如果是,关闭此程序或设置I2P使用不同的端口。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655
+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的端口,如果是,关闭此程序或设置I2P使用不同的"
+"端口。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:656
-msgid "This may be a transient error, if the other program is no longer using the port."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657
+msgid ""
+"This may be a transient error, if the other program is no longer using the "
+"port."
 msgstr "如果其他程序不再使用此端口,这可能是临时性的错误。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:658
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659
 msgid "However, a restart is always required after this error."
 msgstr "然而,发生此错误后一般需要重启程序才能解决。"
 
 # 暂不翻译,方便错误反馈
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:660
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661
 msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
 msgstr "错误 - UDP已禁用,且TCP入站主机与端口未设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:662
-msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663
+msgid ""
+"You have not configured inbound TCP with a hostname and port above, however "
+"you have disabled UDP."
 msgstr "您没有设置入站TCP的主机名称和端口,同时又关闭了UDP。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:664
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665
 msgid "Therefore your router cannot accept inbound connections."
 msgstr "因此您的路由器无法接收入站连接。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:666
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667
 msgid "Please configure a TCP host and port above or enable UDP."
 msgstr "请在前面设置TCP主机和端口或启用UDP"
 
 # 错误提示暂不翻译,以便错误反馈。
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:668
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669
 msgid "ERR - Client Manager I2CP Error - check logs"
 msgstr "错误 - 客户程序管理器 I2CP 错误 - 请看日志"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:670
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671
 msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
 msgstr "这通常为7654端口冲突所致,请查看日志确认原因。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:672
-msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673
+msgid ""
+"Do you have another I2P instance running? Stop the conflicting program and "
+"restart I2P."
 msgstr "您是否已经运行了另一个I2P实例?请关掉冲突的程序并重启I2P。"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107
 msgid "config advanced"
 msgstr "高级设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241
 msgid "I2P Advanced Configuration"
 msgstr "I2P 高级设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:301
 msgid "Advanced I2P Configuration"
 msgstr "I2P 高级设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:311
 msgid "Some changes may require a restart to take effect."
 msgstr "某些设置需要程序重启后生效。"
 
@@ -4450,52 +4759,123 @@ msgstr "某些设置需要程序重启后生效。"
 msgid "config clients"
 msgstr "客户程序设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:243
 msgid "I2P Client Configuration"
 msgstr "I2P 客户程序设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312
 msgid "Client Configuration"
 msgstr "客户程序设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:313
-msgid "The Java clients listed below are started by the router and run in the same JVM."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:314
+msgid ""
+"The Java clients listed below are started by the router and run in the same "
+"JVM."
 msgstr "下面列出的Java客户端随路由器启动并运行于同一JVM中。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:318
 msgid "To change other client options, edit the file"
 msgstr "修改其他客户端设置请编辑文件"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:324
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:415
 msgid "All changes require restart to take effect."
 msgstr "所有更改均需要程序重启才能生效。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:336
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:337
+msgid "Advanced Client Interface Configuration"
+msgstr "客户端接口设置(高级)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339
+msgid "External I2CP (I2P Client Protocol) Interface Configuration"
+msgstr "外部I2CP接口 (I2P客户协议) 设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345
+msgid "Enabled without SSL"
+msgstr "启用无需 SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351
+msgid "Enabled with SSL required"
+msgstr "启用强制 SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357
+msgid "Disabled - Clients outside this Java process may not connect"
+msgstr "禁用 - 如果客户端与I2P不运行与同一Java虚拟机中则禁止其连接。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359
+msgid "I2CP Port"
+msgstr "I2CP 端口"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363
+msgid "I2CP Interface"
+msgstr "I2CP接口"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379
+msgid "Authorization"
+msgstr "认证"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385
+msgid "Require username and password"
+msgstr "强制用户名密码登陆"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:387
+msgid "Username"
+msgstr "用户名"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:391
+msgid "Password"
+msgstr "密码"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:397
+msgid "Any changes made here must also be configured in the external client."
+msgstr "对于此处的做出的任何更改,外部客户端程序中也必须做出相应设置。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:399
+msgid "Many clients do not support SSL or authorization."
+msgstr "很多客户端程序还不支持SSL或认证。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407
 msgid "WebApp Configuration"
 msgstr "WebApp 设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338
-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 separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)."
-msgstr "下面列出的Java Web 程序随客户端“web控制台”一同启动,并与路由运行于同一JVM中。这些Web程序通常可以通过路由器界面直接访问。他们可能是完整的程序 (例如  i2psnark/BT客户端),其他客户端程序的前端或必须单独启动的程序(例如. susidns, i2ptunnel),甚至根本没有Web界面(例如 addressbook)。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409
+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 "
+"separately enabled (e.g. susidns, i2ptunnel), or have no web interface at "
+"all (e.g. addressbook)."
+msgstr ""
+"下面列出的Java Web 程序随客户端“web控制台”一同启动,并与路由运行于同一JVM中。"
+"这些Web程序通常可以通过路由器界面直接访问。他们可能是完整的程序 (例如  "
+"i2psnark/BT客户端),其他客户端程序的前端或必须单独启动的程序(例如. susidns, "
+"i2ptunnel),甚至根本没有Web界面(例如 addressbook)。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:340
-msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method."
-msgstr "从webapps目录中删除相应的.war文件同样可以禁用Web程序;然而这些 .war 文件和Web程序在更新I2P后还会再次出现,所以推荐在这里通过设置的方法禁用不用的Web程序。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:411
+msgid ""
+"A web app may also be disabled by removing the .war file from the webapps "
+"directory; however the .war file and web app will reappear when you update "
+"your router to a newer version, so disabling the web app here is the "
+"preferred method."
+msgstr ""
+"从webapps目录中删除相应的.war文件同样可以禁用Web程序;然而这些 .war 文件和Web"
+"程序在更新I2P后还会再次出现,所以推荐在这里通过设置的方法禁用不用的Web程序。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421
 msgid "Plugin Configuration"
 msgstr "插件设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:352
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423
 msgid "The plugins listed below are started by the webConsole client."
 msgstr "下面列出的插件将由 webConsole 客户程序负责启动。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429
 msgid "Plugin Installation"
 msgstr "插件安装"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:360
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431
 msgid "To install a plugin, enter the download URL:"
 msgstr "安装插件前,请输入插件的下载链接:"
 
@@ -4503,39 +4883,40 @@ msgstr "安装插件前,请输入插件的下载链接:"
 msgid "config keyring"
 msgstr "钥匙环设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:227
 msgid "I2P Keyring Configuration"
 msgstr "I2P 钥匙环设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:294
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:295
 msgid "The router keyring is used to decrypt encrypted leaseSets."
 msgstr "路由的钥匙环被用来解密和加密赁集."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:297
-msgid "The keyring may contain keys for local or remote encrypted destinations."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:298
+msgid ""
+"The keyring may contain keys for local or remote encrypted destinations."
 msgstr "钥匙环可以包含本地和远程的加密目标(Destination)."
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:308
 msgid "Manual Keyring Addition"
 msgstr "手动添加钥匙环"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:310
 msgid "Enter keys for encrypted remote destinations here."
 msgstr "在此处添加远程加密目标的密钥。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:312
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:313
 msgid "Keys for local destinations must be entered on the"
 msgstr "输入本地目标的密钥请到"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:314
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315
 msgid "I2PTunnel page"
 msgstr "I2P 隧道页面"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317
 msgid "Dest. name, hash, or full key"
 msgstr "目标(Dest.)名称, HASH, 或完整公钥"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:319
 msgid "Encryption Key"
 msgstr "加密密钥"
 
@@ -4543,92 +4924,109 @@ msgstr "加密密钥"
 msgid "config logging"
 msgstr "日志设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:241
 msgid "I2P Logging Configuration"
 msgstr "I2P 记录设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301
 msgid "Configure I2P Logging Options"
 msgstr "设置 I2P 记录选项"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:303
 msgid "Logging filename"
 msgstr "日志文件名称"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307
 msgid "(the symbol '@' will be replaced during log rotation)"
 msgstr "(日志轮转时符号'@'将被替换)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:309
 msgid "Log record format"
 msgstr "日志记录格式"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:311
-msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313
+msgid ""
+"(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
 msgstr "( 'd' = 日期, 'c' = 类, 't' = 线程, 'p' = 优先级, 'm' = 消息)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:315
 msgid "Log date format"
 msgstr "日志日期格式"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:317
-msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)"
-msgstr "('MM' = 月, 'dd' = 天, 'HH' = 小时, 'mm' = 分钟, 'ss' = 秒, 'SSS' = 毫秒)"
-
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
+msgid ""
+"('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' "
+"= millisecond)"
+msgstr ""
+"('MM' = 月, 'dd' = 天, 'HH' = 小时, 'mm' = 分钟, 'ss' = 秒, 'SSS' = 毫秒)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321
 msgid "Max log file size"
 msgstr "日志最大体积"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325
 msgid "Default log level"
 msgstr "默认日志等级"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327
-msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329
+msgid ""
+"(DEBUG and INFO are not recommended defaults, as they will drastically slow "
+"down your router)"
 msgstr "(建议不要使用 DEBUG 或 INFO 作为默认等级,他们会明显降低程序性能)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331
 msgid "Log level overrides"
 msgstr "等级外<br>日志项目"
 
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335
+msgid "New override"
+msgstr "新建参数"
+
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106
 msgid "config peers"
 msgstr "节点设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:227
 msgid "I2P Peer Configuration"
 msgstr "I2P 节点设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:305
 msgid "Manual Peer Controls"
 msgstr "手动节点控制"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:307
 msgid "Router Hash"
 msgstr "路由器Key(见NetDB)"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:310
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:311
 msgid "Manually Ban / Unban a Peer"
 msgstr "手动封杀/解封某个节点"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:312
-msgid "Banning will prevent the participation of this peer in tunnels you create."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:313
+msgid ""
+"Banning will prevent the participation of this peer in tunnels you create."
 msgstr "封锁将阻止节点参与您的隧道创建"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:324
-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 Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the"
-msgstr "评分(Bonuse)可能为正或为负并影响节点是否评为快速和高容量节点。快速节点用于客户程序通道,高容量节点用于探索隧道。当前评分显示于"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323
+msgid "Adjust Profile Bonuses"
+msgstr "调整节点评分"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325
+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 "
+"Capacity peers are used for some exploratory tunnels. Current bonuses are "
+"displayed on the"
+msgstr ""
+"评分(Bonuse)可能为正或为负并影响节点是否评为快速和高容量节点。快速节点用于客"
+"户程序通道,高容量节点用于探索隧道。当前评分显示于"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:326
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:327
 msgid "profiles page"
 msgstr "节点信息页面"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:342
-msgid "Adjust peer bonuses"
-msgstr "调整节点评分"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:344
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:253
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:251
 msgid "Banned Peers"
 msgstr "已封锁节点"
 
@@ -4636,140 +5034,258 @@ msgstr "已封锁节点"
 msgid "Banned IPs"
 msgstr "已封锁IP"
 
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:106
+msgid "config reseeding"
+msgstr "设置引导"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240
+msgid "I2P Reseeding Configuration"
+msgstr "I2P 网络引导设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:300
+msgid "Reseeding Configuration"
+msgstr "网络引导设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:302
+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)是一个网络引导(Bootstrip)过程,新用户通过这个过程发现其他I2P用"
+"户,很久未上线的老用户在已知的有效节点很少时也会进入引导/补种状态。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:304
+msgid ""
+"If reseeding has failed, you should first check your network connection."
+msgstr "如果网络引导失败请先检查您的网络设置,确定本机网络正常。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:308
+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代理。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:310
+#, java-format
+msgid "See {0} for instructions on reseeding manually."
+msgstr "手动引导的方法请参见 {0}"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:310
+msgid "the FAQ"
+msgstr " 常见问题解答 "
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:312
+msgid "Reseed URL Selection"
+msgstr "引导链接选择"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318
+msgid "Try SSL first then non-SSL"
+msgstr "先尝试SSL再尝试HTTP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324
+msgid "Use SSL only"
+msgstr "仅使用SSL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330
+msgid "Use non-SSL only"
+msgstr "仅使用普通HTTP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:332
+msgid "Reseed URLs"
+msgstr "网络启动"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336
+msgid "Enable HTTP proxy (not used for SSL)"
+msgstr "使用 HTTP 代理(目前不支持SSL)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:340
+msgid "HTTP Proxy Host"
+msgstr "HTTP 代理地址"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:344
+msgid "HTTP Proxy Port"
+msgstr "HTTP 代理端口"
+
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106
 msgid "config service"
 msgstr "服务设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:227
 msgid "I2P Service Configuration"
 msgstr "I2P 服务设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:285
 msgid "Shutdown the router"
 msgstr "关闭路由器"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:286
-msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes."
-msgstr "平滑关闭让路由器在关闭前完成已达成的任务,但这可能需要花费几分钟的时间。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:287
+msgid ""
+"Graceful shutdown lets the router satisfy the agreements it has already made "
+"before shutting down, but may take a few minutes."
+msgstr ""
+"平滑关闭让路由器在关闭前完成已达成的任务,但这可能需要花费几分钟的时间。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:288
-msgid "If you need to kill the router immediately, that option is available as well."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:289
+msgid ""
+"If you need to kill the router immediately, that option is available as well."
 msgstr "当然你也可以选择立即关闭路由。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:298
-msgid "If you want the router to restart itself after shutting down, you can choose one of the following."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:299
+msgid ""
+"If you want the router to restart itself after shutting down, you can choose "
+"one of the following."
 msgstr "如果你想要路由器关闭后自动重新启动,可以选择下面的选项。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:300
-msgid "This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on."
-msgstr "此功能在如下情况下适用 - 例如当您修改了某些只在启动时读取的设置,例如路由器控制台密码,路由监听接口等。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:301
+msgid ""
+"This is useful in some situations - for example, if you changed some "
+"settings that client applications only read at startup, such as the "
+"routerconsole password or the interface it listens on."
+msgstr ""
+"此功能在如下情况下适用 - 例如当您修改了某些只在启动时读取的设置,例如路由器控"
+"制台密码,路由监听接口等。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:302
-msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately."
-msgstr "平滑重启可能会等待几分钟的时间(但你的节点一定会感激你的耐心),硬重启可以立即完成。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303
+msgid ""
+"A graceful restart will take a few minutes (but your peers will appreciate "
+"your patience), while a hard restart does so immediately."
+msgstr ""
+"平滑重启可能会等待几分钟的时间(但你的节点一定会感激你的耐心),硬重启可以立即"
+"完成。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:304
-msgid "After tearing down the router, it will wait 1 minute before starting back up again."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305
+msgid ""
+"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:314
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:315
 msgid "Systray integration"
 msgstr "使用系统托盘"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:316
-msgid "On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317
+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 平台允许小程序进驻系统托盘,让你可以查看路由状态"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:318
-msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319
+msgid ""
+"(later on, I2P client applications will be able to integrate their own "
+"functionality into the system tray as well)."
 msgstr "(以后的 I2P 客户端程序也会将它们的功能集成到系统托盘里)。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321
 msgid "If you are on windows, you can either enable or disable that icon here."
 msgstr "如果你使用Windows, 可以在这里开启或关闭这个托盘图标。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:326
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323
+msgid "Show systray icon"
+msgstr "显示托盘图标"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325
+msgid "Hide systray icon"
+msgstr "隐藏系统图标"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327
 msgid "Run on startup"
 msgstr "启动时运行"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:328
-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 是否启动 - I2P 将相应的安装或卸载I2P服务。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:329
+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 是否启动 - I2P 将相应的安装或卸载I2P"
+"服务。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:331
 msgid "If you prefer the command line, you can also run the "
 msgstr "如果你偏好使用命令行,可以运行"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:340
-msgid "If you are running I2P as service right now, removing it will shut down your router immediately."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341
+msgid ""
+"If you are running I2P as service right now, removing it will shut down your "
+"router immediately."
 msgstr "如果您目前已经以服务形式运行 I2P ,删除 I2P 服务将立刻关闭路由器。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:342
-msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat."
-msgstr "您可以考虑先平滑关闭路由,待退出后运行 uninstall_i2p_service_winnt.bat。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343
+msgid ""
+"You may want to consider shutting down gracefully, as above, then running "
+"uninstall_i2p_service_winnt.bat."
+msgstr ""
+"您可以考虑先平滑关闭路由,待退出后运行 uninstall_i2p_service_winnt.bat。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347
 msgid "Debugging"
 msgstr "调试"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:348
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349
 msgid "View the job queue"
 msgstr "查看作业队列"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:352
-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>."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353
+msgid ""
+"At times, it may be helpful to debug I2P by getting a thread dump. To do so, "
+"please select the following option and review the thread dumped to <a href="
+"\"logs.jsp#servicelogs\">wrapper.log</a>."
 msgstr ""
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:358
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359
 msgid "Launch browser on router startup?"
 msgstr "路由器启动时运行浏览器?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:360
-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 "此Web控制台是I2P的主要设置界面,所以如果您您觉得有必要I2P可以在路由启动时调用浏览器打开"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361
+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 ""
+"此Web控制台是I2P的主要设置界面,所以如果您您觉得有必要I2P可以在路由启动时调用"
+"浏览器打开"
 
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107
 msgid "config stats"
 msgstr "统计设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:229
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:228
 msgid "I2P Stats Configuration"
 msgstr "I2P 统计设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:300
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302
 msgid "Configure I2P Stat Collection"
 msgstr "设置 I2P 统计项"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304
 msgid "Enable full stats?"
 msgstr "启用完整统计?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311
 msgid "change requires restart to take effect"
 msgstr "设置需要程序重启后才能生效。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:313
 msgid "Stat file"
 msgstr "统计文件"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317
 msgid "Filter"
 msgstr "过滤器"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:326
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328
 msgid "toggle all"
 msgstr "全部切换"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330
 msgid "Log"
 msgstr "日志"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:332
 msgid "Graph"
 msgstr "图表"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:369
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:371
 msgid "Advanced filter"
 msgstr "高级过滤器"
 
@@ -4777,43 +5293,49 @@ msgstr "高级过滤器"
 msgid "config tunnels"
 msgstr "隧道设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240
 msgid "I2P Tunnel Configuration"
 msgstr "I2P 隧道设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:306
 msgid "The default settings work for most people."
 msgstr "默认设置适于大多数人。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:310
 msgid "There is a fundamental tradeoff between anonymity and performance."
 msgstr "匿名性需要以性能为代价。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:312
-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个跳点的隧道(例如 2跳点 + 0-2跳点,3跳点 + 0-1跳点, 3跳点 + 0-2跳点),或大量常规+大量备用,可能降低性能和稳定性。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:313
+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个跳点的隧道(例如 2跳点 + 0-2跳点,3跳点 + 0-1跳点, 3跳点 + 0-2跳点),或"
+"大量常规+大量备用,可能降低性能和稳定性。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:316
 msgid "High CPU and/or high outbound bandwidth usage may result."
 msgstr "导致高CPU占用和/或高上行流量。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:318
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:319
 msgid "Change these settings with care, and adjust them if you have problems."
 msgstr "小心更改这些设置。如果遇到问题可以在这里调整。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332
-msgid "Exploratory tunnel setting changes are stored in the router.config file."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:333
+msgid ""
+"Exploratory tunnel setting changes are stored in the router.config file."
 msgstr "对探测隧道设置的更改将保存入router.config文件中。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:336
 msgid "Client tunnel changes are temporary and are not saved."
 msgstr "对客户程序隧道的修改是临时的,将不予保存。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:337
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338
 msgid "To make permanent client tunnel changes see the"
 msgstr "要永久性更改客户通道的设置参见"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:340
 msgid "i2ptunnel page"
 msgstr "I2P 隧道页面"
 
@@ -4821,31 +5343,39 @@ msgstr "I2P 隧道页面"
 msgid "config UI"
 msgstr "界面设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:241
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240
 msgid "I2P UI Configuration"
 msgstr "I2P 界面设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:291
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:292
 msgid "Router Console Theme"
 msgstr "路由控制台主题"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:309
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:310
 msgid "Theme selection disabled for Internet Explorer, sorry."
 msgstr "抱歉,主题功能在InternetExplorer中已禁用。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:311
-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的UserAgent;您需要设置浏览器(或过滤式代理)使用不同的UserAgent,才能访问路由控制台的主题功能。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:312
+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的UserAgent;您需要设置浏览器(或过滤"
+"式代理)使用不同的UserAgent,才能访问路由控制台的主题功能。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:316
 msgid "Router Console Language"
 msgstr "路由控制台语言"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:319
-msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help."
-msgstr "欢迎加入路由控制台翻译项目!提供帮助请通过IRC到#i2p房间与开发人员联系。"
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:320
+msgid ""
+"Please contribute to the router console translation project! Contact the "
+"developers on IRC #i2p to help."
+msgstr ""
+"欢迎加入路由控制台翻译项目!提供帮助请通过IRC到#i2p房间与开发人员联系。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:324
 msgid "Apply"
 msgstr "应用"
 
@@ -4853,83 +5383,145 @@ msgstr "应用"
 msgid "config update"
 msgstr "更新设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:227
 msgid "I2P Update Configuration"
 msgstr "I2P 更新设置"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:302
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:303
 msgid "Check for I2P and news updates"
 msgstr "检查I2P软件及新闻更新"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:304
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:305
 msgid "News &amp; I2P Updates"
 msgstr "软件及新闻更新"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:308
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:309
 msgid "Update In Progress"
 msgstr "更新中"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:316
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:317
 msgid "News URL"
 msgstr "新闻链接"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:320
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321
 msgid "Refresh frequency"
 msgstr "更新频率"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:326
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327
 msgid "Update policy"
 msgstr "升级策略"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:330
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331
 msgid "Update through the eepProxy?"
 msgstr "通过I2P代理更新?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:334
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335
 msgid "eepProxy host"
 msgstr "I2P代理主机"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:338
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339
 msgid "eepProxy port"
 msgstr "I2P代理端口"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:343
 msgid "Update URLs"
 msgstr "更新链接"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:346
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:347
 msgid "Trusted keys"
 msgstr "可信公钥"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:350
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:351
 msgid "Update with unsigned development builds?"
 msgstr "更新包括未签名的开发版?"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:354
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:355
 msgid "Unsigned Build URL"
 msgstr "未签名软件链接"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:360
-msgid "I2P updates are disabled because you do not have write permission for the install directory."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
+msgid ""
+"I2P updates are disabled because you do not have write permission for the "
+"install directory."
 msgstr "I2P更新功能已禁用,因为您对I2P的安装目录没有写权限。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:366
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367
 msgid "Save"
 msgstr "保存"
 
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:115
+msgid "Internal Error"
+msgstr "内部错误"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:117
+msgid "Router Console"
+msgstr "路由控制台"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121
+msgid "Configuration"
+msgstr "设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129
+msgid "Sorry! There has been an internal error."
+msgstr "抱歉!程序发生内部错误。"
+
+#. note to translators - both parameters are URLs
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:133
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:232
+#, java-format
+msgid "Please report bugs on {0} or {1}."
+msgstr "Bug报告请到 {0} 或 {1}。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:137
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:236
+msgid ""
+"You may use the username \"guest\" and password \"guest\" if you do not wish "
+"to register."
+msgstr "如果您不想注册可以用“guest”作为用户名和密码登陆。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:238
+msgid "Please include this information in bug reports"
+msgstr "报告问题时请包括以下信息"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:141
+msgid "Error Details"
+msgstr "错误详情"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143
+#, java-format
+msgid "Error {0}"
+msgstr "错误 {0}"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:163
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:228
+msgid "I2P Version and Running Environment"
+msgstr "I2P 版本及运行环境"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:191
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266
+msgid ""
+"Note that system information, log timestamps, and log messages may provide "
+"clues to your location; please review everything you include in a bug report."
+msgstr ""
+"注意,系统信息、日志时间戳和日志中的部分信息中可能泄露您真实位置;提交前请仔"
+"细检查。"
+
 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117
 msgid "Page Not Found"
 msgstr "页面未找到"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:243
-msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource."
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242
+msgid ""
+"Sorry! You appear to be requesting a non-existent Router Console page or "
+"resource."
 msgstr "抱歉!您请求的页面或资源不存在。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:245
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:244
 msgid "Error 404"
 msgstr "错误 404"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:249
 msgid "not found"
 msgstr "未找到"
 
@@ -4937,7 +5529,7 @@ msgstr "未找到"
 msgid "graphs"
 msgstr "图表"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:227
 msgid "I2P Performance Graphs"
 msgstr "I2P 性能图表"
 
@@ -4949,7 +5541,7 @@ msgstr "主页"
 msgid "job queue"
 msgstr "作业队列"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:226
 msgid "I2P Router Job Queue"
 msgstr "I2P 路由器作业队列"
 
@@ -4957,31 +5549,19 @@ msgstr "I2P 路由器作业队列"
 msgid "logs"
 msgstr "日志"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226
 msgid "I2P Router Logs"
 msgstr "I2P 路由器日志"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:229
-msgid "I2P Version & Running Environment"
-msgstr "I2P 版本及运行环境"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:231
-msgid "Please report bugs on <a href=\"http://trac.i2p2.i2p/newticket\">trac.i2p2.i2p</a>."
-msgstr "如果您发现错误请报告至<a href=\"http://trac.i2p2.i2p/newticket\">trac.i2p2.i2p</a>。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:233
-msgid "Please include this information in bug reports"
-msgstr "报告问题时请包括以下信息"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:274
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:281
 msgid "Critical Logs"
 msgstr "关键日志"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:278
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:285
 msgid "Router Logs"
 msgstr "路由器日志"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:284
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:291
 msgid "Service (Wrapper) Logs"
 msgstr "服务(封装)日志"
 
@@ -4989,7 +5569,7 @@ msgstr "服务(封装)日志"
 msgid "network database summary"
 msgstr "I2P 网络数据库概况"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:226
 msgid "I2P Network Database Summary"
 msgstr "I2P 网络数据库概况"
 
@@ -4997,23 +5577,26 @@ msgstr "I2P 网络数据库概况"
 msgid "WebApp Not Found"
 msgstr "Web程序(war)未找到"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:230
 msgid "Web Application Not Running"
 msgstr "Web程序(.war)未运行"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:233
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:232
 msgid "The requested web application is not running."
 msgstr "您所访问的Web程序未启动。"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:235
-msgid "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/nowebapp_jsp.java:234
+msgid ""
+"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:105
 msgid "peer connections"
 msgstr "节点连接"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:226
 msgid "I2P Network Peers"
 msgstr "I2P 网络节点"
 
@@ -5021,7 +5604,7 @@ msgstr "I2P 网络节点"
 msgid "peer profiles"
 msgstr "节点信息"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:226
 msgid "I2P Network Peer Profiles"
 msgstr "I2P 网络节点信息"
 
@@ -5029,11 +5612,11 @@ msgstr "I2P 网络节点信息"
 msgid "statistics"
 msgstr "统计"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243
 msgid "I2P Router Statistics"
 msgstr "I2P 路由器统计数据"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:247
 #, java-format
 msgid "Disable {0} Refresh"
 msgstr "停止 {0} 刷新"
@@ -5042,49 +5625,129 @@ msgstr "停止 {0} 刷新"
 msgid "tunnel summary"
 msgstr "隧道概况"
 
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:226
 msgid "I2P Tunnel Summary"
 msgstr "I2P 隧道概况"
 
+#~ msgid "Client Interface Configuration (Advacned)"
+#~ msgstr "客户端接口设置(高级)"
+
+#~ msgid ""
+#~ "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href="
+#~ "\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" "
+#~ "href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually."
+#~ msgstr ""
+#~ "请保证HTTP通信没有受阻,检查 <a target=\"_top\" href=\"logs.jsp\">日志</"
+#~ "a> ,如果问题仍无法解决,请参照 <a target=\"_top\" href=\"http://www.i2p2."
+#~ "de/faq.html\">FAQ</a> 进行手动补种。"
+
+#~ msgid "Last reseed failed fully (failed reading seed URL)."
+#~ msgstr "上次补种尝试失败(读取补种URL失败)。"
+
+#~ msgid "Last reseed failed fully (no routerInfo URLs at seed URL)."
+#~ msgstr "上次补种尝试失败(补种服务器未返回任何路由信息URL)。"
+
+#~ msgid "Last reseed failed partly ({0}% of {1})."
+#~ msgstr "上次补种部分失败({0}%失败,共{1})"
+
+#~ msgid "Last reseed failed ({0}% of {1})."
+#~ msgstr "上次补种失败({0}%失败,共{1})"
+
+#~ msgid "Last reseed failed fully (exception caught)."
+#~ msgstr "上次补种失败(exception caught)."
+
+#~ msgid "System tray icon enabled."
+#~ msgstr "系统托盘图标已启用"
+
+#~ msgid "System tray icon feature not supported on this platform. Sorry!"
+#~ msgstr "您的平台不支持系统托盘图标功能"
+
+#~ msgid "Warning: unable to contact the systray manager"
+#~ msgstr "警告:与托盘管理器通讯失败"
+
+#~ msgid "System tray icon disabled."
+#~ msgstr "系统托盘已禁用"
+
+#~ msgid "minute"
+#~ msgstr "分钟"
+
+#~ msgid "minutes"
+#~ msgstr "分钟"
+
+#~ msgid "avg value"
+#~ msgstr "均值"
+
+#~ msgid "events"
+#~ msgstr "事件"
+
+#~ msgid "lifetime average"
+#~ msgstr "总平均值"
+
+#~ msgid "peak average"
+#~ msgstr "峰值平均值"
+
+#~ msgid ""
+#~ "Please report bugs on <a href=\"http://trac.i2p2.i2p/newticket\">trac."
+#~ "i2p2.i2p</a>."
+#~ msgstr ""
+#~ "如果您发现错误请报告至<a href=\"http://trac.i2p2.i2p/newticket\">trac."
+#~ "i2p2.i2p</a>。"
+
 #~ msgid "hops"
 #~ msgstr "跳点"
+
 #~ msgid "tunnels"
 #~ msgstr "隧道"
+
 #~ msgid "Tunnels in/out"
 #~ msgstr "通道(上/下行)"
-#~ msgid "name"
-#~ msgstr "名称"
+
 #~ msgid ""
 #~ "WebApp configuration saved successfully - restart required to take effect."
 #~ msgstr "WebApp设置保存成功 - 程序重启后生效"
+
 #~ msgid "Start Now"
 #~ msgstr "立即启动"
+
 #~ msgid "Show the router's workload, and how it's performing"
 #~ msgstr "显示I2P路由器的负载与工作状况"
+
 #~ msgid "Jobs"
 #~ msgstr "作业"
+
 #~ msgid "This is useful in some situations"
 #~ msgstr "重启在某些情况下有用"
+
 #~ msgid "I2P will install (or remove) a service accordingly."
 #~ msgstr "I2P将相应的将自身安装为服务(或卸载服务)。"
+
 #~ msgid "Expl. + Client"
 #~ msgstr "探测+客户"
+
 #~ msgid "Part. from + to"
 #~ msgstr "相邻共享节点"
+
 #~ msgid "Depth"
 #~ msgstr "深度"
+
 #~ msgid "Addresses"
 #~ msgstr "地址"
+
 #~ msgid "view without"
 #~ msgstr "查看不含"
+
 #~ msgid "view with"
 #~ msgstr "查看含"
+
 #~ msgid "stats"
 #~ msgstr "统计"
+
 #~ msgid "View"
 #~ msgstr "查看"
+
 #~ msgid "Not Failing"
 #~ msgstr "标准"
+
 #~ msgid ""
 #~ "If you want the router to restart itself after shutting down, you can "
 #~ "choose one of the following.  This is useful in some situations - for "
@@ -5099,6 +5762,7 @@ msgstr "I2P 隧道概况"
 #~ "- 例如当修改了客户程序仅在启动时读取的设置比如路由器控制界面的密码,监听的"
 #~ "接口。平滑重启可能会等待几分钟的时间 (但其他节点一定会感激你的耐心),硬重"
 #~ "启可以立即完成。 路由关闭后将等待1分钟再重新启动。"
+
 #~ msgid ""
 #~ "On the windows platform, there is a small application to sit in the "
 #~ "system tray, allowing you to view the router's status (later on, I2P "
@@ -5109,4 +5773,3 @@ msgstr "I2P 隧道概况"
 #~ "windows 平台允许小程序进驻系统托盘,让你可以查看路由状态,(以后的 I2P 客户"
 #~ "端程序也会将它们的功能集成到系统托盘里)。如果你使用Windows, 可以在这里开启"
 #~ "或关闭这个托盘图标。"
-
diff --git a/apps/sam/java/build.xml b/apps/sam/java/build.xml
index 57aeff9947071c36fc7877cc0d89c236c0ee59f2..7e62fd27c2fee17fdbb77c6084c394dd6eacfdda 100644
--- a/apps/sam/java/build.xml
+++ b/apps/sam/java/build.xml
@@ -28,6 +28,7 @@
         <javac 
             srcdir="./src" 
             debug="true" deprecation="on" source="1.5" target="1.5" 
+            includeAntRuntime="false"
             destdir="./build/obj" 
             classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar:../../streaming/java/build/streaming.jar" >
             <compilerarg line="${javac.compilerargs}" />
@@ -37,19 +38,42 @@
         <javac 
             srcdir="./test" 
             debug="true" deprecation="on" source="1.5" target="1.5" 
+            includeAntRuntime="false"
             destdir="./build/obj" 
             classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar:../../streaming/java/build/streaming.jar" >
             <compilerarg line="${javac.compilerargs}" />
         </javac>
     </target>
-    <target name="jar" depends="compile">
+
+    <target name="jar" depends="compile, jarUpToDate" unless="jar.uptodate" >
+        <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="." />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
         <jar destfile="./build/sam.jar" basedir="./build/obj" includes="**/*.class">
             <manifest>
                 <attribute name="Main-Class" value="net.i2p.sam.SAMBridge" />
                 <attribute name="Class-Path" value="i2p.jar mstreaming.jar streaming.jar" />
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
             </manifest>
         </jar>
     </target>
+
+    <target name="jarUpToDate">
+        <uptodate property="jar.uptodate" targetfile="build/sam.jar" >
+            <srcfiles dir= "build/obj" includes="**/*.class" />
+        </uptodate>
+    </target>
+
     <target name="jarTest" depends="jar, compileTest">
         <jar destfile="./build/sam.jar" basedir="./build/obj" includes="**/*Test*.class" update="true" />
     </target>
diff --git a/apps/streaming/java/build.xml b/apps/streaming/java/build.xml
index dff6fbf1d55989a5774d762d0cbfd72f3c328709..1351399b72c66ba1c692ab57a077de1e95558a66 100644
--- a/apps/streaming/java/build.xml
+++ b/apps/streaming/java/build.xml
@@ -27,6 +27,7 @@
         <javac 
             srcdir="./src" 
             debug="true" deprecation="on" source="1.5" target="1.5" 
+            includeAntRuntime="false"
             destdir="./build/obj" 
             classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar" >
             <compilerarg line="${javac.compilerargs}" />
@@ -36,14 +37,40 @@
         <javac 
             srcdir="./test" 
             debug="true" deprecation="on" source="1.5" target="1.5" 
+            includeAntRuntime="false"
             destdir="./build/obj" 
             classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar" >
             <compilerarg line="${javac.compilerargs}" />
         </javac>
     </target>
-    <target name="jar" depends="builddep, compile">
-        <jar destfile="./build/streaming.jar" basedir="./build/obj" includes="**/*.class" />
+
+    <target name="jar" depends="builddep, compile, jarUpToDate" unless="jar.uptodate" >
+        <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="." />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
+        <jar destfile="./build/streaming.jar" basedir="./build/obj" includes="**/*.class" >
+            <manifest>
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
+            </manifest>
+        </jar>
     </target>
+
+    <target name="jarUpToDate">
+        <uptodate property="jar.uptodate" targetfile="build/streaming.jar" >
+            <srcfiles dir= "." includes="build/obj/**/*.class" />
+        </uptodate>
+    </target>
+
     <target name="jarTest" depends="jar, compileTest">
         <jar destfile="./build/streaming.jar" basedir="./build/obj" includes="**/*Test*.class" update="true" />
     </target>
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java
index 69ace81a2833f19ebd84fc25f6caa172e69ab223..10ff38856435ed20d8da256bcf6b3b67028b5c12 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java
@@ -40,7 +40,7 @@ class ConnectionManager {
     private int _maxConcurrentStreams;
     private ConnectionOptions _defaultOptions;
     private volatile int _numWaiting;
-    private long SoTimeout;
+    private long _soTimeout;
     private ConnThrottler _minuteThrottler;
     private ConnThrottler _hourThrottler;
     private ConnThrottler _dayThrottler;
@@ -64,7 +64,7 @@ class ConnectionManager {
         _allowIncoming = false;
         _numWaiting = 0;
         /** Socket timeout for accept() */
-        SoTimeout = -1;
+        _soTimeout = -1;
 
         _context.statManager().createRateStat("stream.con.lifetimeMessagesSent", "How many messages do we send on a stream?", "Stream", new long[] { 60*60*1000, 24*60*60*1000 });
         _context.statManager().createRateStat("stream.con.lifetimeMessagesReceived", "How many messages do we receive on a stream?", "Stream", new long[] { 60*60*1000, 24*60*60*1000 });
@@ -97,16 +97,16 @@ class ConnectionManager {
      * Set the socket accept() timeout.
      * @param x
      */
-    public void MsetSoTimeout(long x) {
-        SoTimeout = x;
+    public void setSoTimeout(long x) {
+        _soTimeout = x;
     }
 
     /**
      * Get the socket accept() timeout.
      * @return accept timeout in ms.
      */
-    public long MgetSoTimeout() {
-        return SoTimeout;
+    public long getSoTimeout() {
+        return _soTimeout;
     }
 
     public void setAllowIncomingConnections(boolean allow) { 
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/I2PServerSocketFull.java b/apps/streaming/java/src/net/i2p/client/streaming/I2PServerSocketFull.java
index acb58fe15fc7025f25bdf6882de2981b16706244..71e1dd3ac7e172e2ad5238e206006105939459ed 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/I2PServerSocketFull.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/I2PServerSocketFull.java
@@ -26,11 +26,11 @@ class I2PServerSocketFull implements I2PServerSocket {
     }
     
     public long getSoTimeout() {
-        return _socketManager.getConnectionManager().MgetSoTimeout();
+        return _socketManager.getConnectionManager().getSoTimeout();
     }
     
     public void setSoTimeout(long x) {
-        _socketManager.getConnectionManager().MsetSoTimeout(x);
+        _socketManager.getConnectionManager().setSoTimeout(x);
     }
     /**
      * Close the connection.
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketFull.java b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketFull.java
index dfcfacfa1f55f6e188c70cf8f9f42d8d676a4926..f8dbe74ea691d79241461b2dac53569a94bffebd 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketFull.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketFull.java
@@ -46,6 +46,10 @@ class I2PSocketFull implements I2PSocket {
     
     Connection getConnection() { return _connection; }
     
+    /**
+     *  Warning, may return null instead of throwing IOE,
+     *  which is not what the interface says.
+     */
     public InputStream getInputStream() {
         Connection c = _connection;
         if (c != null)
@@ -62,6 +66,10 @@ class I2PSocketFull implements I2PSocket {
             return null;
     }
     
+    /**
+     *  Warning, may return null instead of throwing IOE,
+     *  which is not what the interface says.
+     */
     public OutputStream getOutputStream() throws IOException {
         Connection c = _connection;
         if (c != null)
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java
index 03abafdda1163d6b9462696f1179a8c4355426a6..573354e8981f88840f85bee0f5aeda8082a2361a 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java
@@ -1,6 +1,9 @@
 package net.i2p.client.streaming;
 
+import java.io.IOException;
 import java.net.NoRouteToHostException;
+import java.net.ServerSocket;
+import java.net.Socket;
 import java.net.SocketTimeoutException;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -30,6 +33,7 @@ public class I2PSocketManagerFull implements I2PSocketManager {
     private Log _log;
     private I2PSession _session;
     private I2PServerSocketFull _serverSocket;
+    private StandardServerSocket _realServerSocket;
     private ConnectionOptions _defaultOptions;
     private long _acceptTimeout;
     private String _name;
@@ -44,8 +48,6 @@ public class I2PSocketManagerFull implements I2PSocketManager {
     private static final long ACCEPT_TIMEOUT_DEFAULT = 5*1000;
     
     public I2PSocketManagerFull() {
-        _context = null;
-        _session = null;
     }
 
     /**
@@ -120,7 +122,7 @@ public class I2PSocketManagerFull implements I2PSocketManager {
      */
     public I2PSocket receiveSocket() throws I2PException, SocketTimeoutException {
         verifySession();
-        Connection con = _connectionManager.getConnectionHandler().accept(_connectionManager.MgetSoTimeout());
+        Connection con = _connectionManager.getConnectionHandler().accept(_connectionManager.getSoTimeout());
         if(_log.shouldLog(Log.DEBUG)) {
             _log.debug("receiveSocket() called: " + con);
         }
@@ -129,7 +131,7 @@ public class I2PSocketManagerFull implements I2PSocketManager {
             con.setSocket(sock);
             return sock;
         } else { 
-            if(_connectionManager.MgetSoTimeout() == -1) {
+            if(_connectionManager.getSoTimeout() == -1) {
                 return null;
             }
             throw new SocketTimeoutException("I2PSocket timed out");
@@ -171,6 +173,17 @@ public class I2PSocketManagerFull implements I2PSocketManager {
         return _serverSocket;
     }
 
+    /**
+     *  Like getServerSocket but returns a real ServerSocket for easier porting of apps.
+     *  @since 0.8.4
+     */
+    public synchronized ServerSocket getStandardServerSocket() throws IOException {
+        if (_realServerSocket == null)
+            _realServerSocket = new StandardServerSocket(_serverSocket);
+        _connectionManager.setAllowIncomingConnections(true);
+        return _realServerSocket;
+    }
+
     private void verifySession() throws I2PException {
         if (!_connectionManager.getSession().isClosed())
             return;
@@ -185,7 +198,7 @@ public class I2PSocketManagerFull implements I2PSocketManager {
      * this data will be bundled in the SYN packet.
      *
      * @param peer Destination to connect to
-     * @param options I2P socket options to be used for connecting
+     * @param options I2P socket options to be used for connecting, may be null
      *
      * @return I2PSocket if successful
      * @throws NoRouteToHostException if the peer is not found or not reachable
@@ -235,6 +248,45 @@ public class I2PSocketManagerFull implements I2PSocketManager {
         return connect(peer, _defaultOptions);
     }
 
+    /**
+     *  Like connect() but returns a real Socket, and throws only IOE,
+     *  for easier porting of apps.
+     *  @since 0.8.4
+     */
+    public Socket connectToSocket(Destination peer) throws IOException {
+        return connectToSocket(peer, _defaultOptions);
+    }
+
+    /**
+     *  Like connect() but returns a real Socket, and throws only IOE,
+     *  for easier porting of apps.
+     *  @param timeout ms if > 0, forces blocking (disables connectDelay)
+     *  @since 0.8.4
+     */
+    public Socket connectToSocket(Destination peer, int timeout) throws IOException {
+        ConnectionOptions opts = new ConnectionOptions(_defaultOptions);
+        opts.setConnectTimeout(timeout);
+        if (timeout > 0)
+            opts.setConnectDelay(-1);
+        return connectToSocket(peer, opts);
+    }
+
+    /**
+     *  Like connect() but returns a real Socket, and throws only IOE,
+     *  for easier porting of apps.
+     *  @param options may be null
+     *  @since 0.8.4
+     */
+    private Socket connectToSocket(Destination peer, I2PSocketOptions options) throws IOException {
+        try {
+            I2PSocket sock = connect(peer, options);
+            return new StandardSocket(sock);
+        } catch (I2PException i2pe) {
+            // fixme in 1.6 change to cause
+            throw new IOException(i2pe.toString());
+        }
+    }
+
     /**
      * Destroy the socket manager, freeing all the associated resources.  This
      * method will block untill all the managed sockets are closed.
@@ -259,11 +311,10 @@ public class I2PSocketManagerFull implements I2PSocketManager {
      *
      * @return set of currently connected I2PSockets
      */
-    public Set listSockets() {
-        Set connections = _connectionManager.listConnections();
-        Set rv = new HashSet(connections.size());
-        for (Iterator iter = connections.iterator(); iter.hasNext(); ) {
-            Connection con = (Connection)iter.next();
+    public Set<I2PSocket> listSockets() {
+        Set<Connection> connections = _connectionManager.listConnections();
+        Set<I2PSocket> rv = new HashSet(connections.size());
+        for (Connection con : connections) {
             if (con.getSocket() != null)
                 rv.add(con.getSocket());
         }
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/MessageHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/MessageHandler.java
index 4097c568f2c0ab6f918964e9dc121e8422f9ce93..632b904b74a598993a73ae31c6b94e8d31e9b961 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/MessageHandler.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/MessageHandler.java
@@ -2,13 +2,13 @@ package net.i2p.client.streaming;
 
 import java.util.Iterator;
 import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
 
 import net.i2p.I2PAppContext;
 import net.i2p.client.I2PSession;
 import net.i2p.client.I2PSessionException;
 import net.i2p.client.I2PSessionListener;
 import net.i2p.util.Log;
-import net.i2p.util.ConcurrentHashSet;
 
 /**
  * Receive raw information from the I2PSession and turn it into
@@ -24,7 +24,7 @@ class MessageHandler implements I2PSessionListener {
     public MessageHandler(I2PAppContext ctx, ConnectionManager mgr) {
         _manager = mgr;
         _context = ctx;
-        _listeners = new ConcurrentHashSet(1);
+        _listeners = new CopyOnWriteArraySet();
         _log = ctx.logManager().getLog(MessageHandler.class);
         _context.statManager().createRateStat("stream.packetReceiveFailure", "When do we fail to decrypt or otherwise receive a packet sent to us?", "Stream", new long[] { 60*60*1000, 24*60*60*1000 });
     }
@@ -81,8 +81,8 @@ class MessageHandler implements I2PSessionListener {
         for (Iterator<I2PSocketManager.DisconnectListener> iter = _listeners.iterator(); iter.hasNext(); ) {
             I2PSocketManager.DisconnectListener lsnr = iter.next();
             lsnr.sessionDisconnected();
-            iter.remove();
         }
+        _listeners.clear();
     }
 
     /**
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/StandardServerSocket.java b/apps/streaming/java/src/net/i2p/client/streaming/StandardServerSocket.java
new file mode 100644
index 0000000000000000000000000000000000000000..324d12687704dda3f139fb0c1a4e8580e06b9580
--- /dev/null
+++ b/apps/streaming/java/src/net/i2p/client/streaming/StandardServerSocket.java
@@ -0,0 +1,170 @@
+package net.i2p.client.streaming;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.net.SocketException;
+import java.nio.channels.ServerSocketChannel;
+
+import net.i2p.I2PException;
+
+/**
+ * Bridge to I2PServerSocket.
+ *
+ * This extends ServerSocket to make porting apps easier.
+ * accept() returns a real Socket (a StandardSocket).
+ * accept() throws IOExceptions like ServerSockets do, rather than returning
+ * null or throwing I2PExceptions.
+ *
+ * StandardServerSockets are always bound.
+ * You may not create an unbound StandardServerSocket.
+ * Create this through the SocketManager.
+ *
+ * @author zzz
+ * @since 0.8.4
+ */
+class StandardServerSocket extends ServerSocket {
+    private final I2PServerSocketFull _socket;
+
+    /**
+     *  Doesn't really throw IOE but super() does
+     */
+    StandardServerSocket(I2PServerSocketFull socket) throws IOException {
+        _socket = socket;
+    }
+
+    @Override
+    public Socket accept() throws IOException {
+        try {
+            I2PSocket sock = _socket.accept();
+            if (sock == null)
+                throw new IOException("No socket");
+            return new StandardSocket(sock);
+        } catch (I2PException i2pe) {
+            // fixme in 1.6 change to cause
+            throw new IOException(i2pe.toString());
+        }
+    }
+
+    /**
+     *  @throws UnsupportedOperationException always
+     */
+    @Override
+    public void bind(SocketAddress endpoint) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     *  @throws UnsupportedOperationException always
+     */
+    @Override
+    public void bind(SocketAddress endpoint, int backlog) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void close() throws IOException {
+        if (isClosed())
+            throw new IOException("Already closed");
+        _socket.close();
+    }
+
+    /**
+     *  @return null always
+     */
+    @Override
+    public ServerSocketChannel getChannel() {
+        return null;
+    }
+
+    /**
+     *  @return null always
+     */
+    @Override
+    public InetAddress getInetAddress() {
+        return null;
+    }
+
+    /**
+     *  @return -1 always
+     */
+    @Override
+    public int getLocalPort() {
+        return -1;
+    }
+
+    /**
+     *  @return null always
+     */
+    @Override
+    public SocketAddress getLocalSocketAddress() {
+        return null;
+    }
+
+    @Override
+    public int getReceiveBufferSize() {
+        ConnectionOptions opts = (ConnectionOptions) ((I2PSocketManagerFull)_socket.getManager()).getDefaultOptions();
+        if (opts == null)
+            return 64*1024;
+        return opts.getInboundBufferSize();
+    }
+
+    /**
+     *  @return false always
+     */
+    @Override
+    public boolean getReuseAddress() {
+        return false;
+    }
+
+    @Override
+    public int getSoTimeout() {
+        return (int) _socket.getSoTimeout();
+    }
+
+    /**
+     *  @return true always
+     */
+    @Override
+    public boolean isBound() {
+        return true;
+    }
+
+    @Override
+    public boolean isClosed() {
+        return ((I2PSocketManagerFull)_socket.getManager()).getConnectionManager().getAllowIncomingConnections();
+    }
+
+    /**
+     *  Does nothing.
+     */
+    @Override
+    public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) {
+    }
+
+    /**
+     *  Does nothing.
+     */
+    @Override
+    public void setReceiveBufferSize(int size) {
+    }
+
+    /**
+     *  Does nothing.
+     */
+    @Override
+    public void setReuseAddress(boolean on) {
+    }
+
+    @Override
+    public void setSoTimeout(int timeout) throws SocketException {
+        _socket.setSoTimeout(timeout);
+    }
+
+    @Override
+    public String toString() {
+        return _socket.toString();
+    }
+}
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/StandardSocket.java b/apps/streaming/java/src/net/i2p/client/streaming/StandardSocket.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ba78bfd49eccb3341cd5ebf96da7c2d1fe32717
--- /dev/null
+++ b/apps/streaming/java/src/net/i2p/client/streaming/StandardSocket.java
@@ -0,0 +1,341 @@
+package net.i2p.client.streaming;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.net.SocketException;
+import java.nio.channels.SocketChannel;
+
+import net.i2p.I2PException;
+
+/**
+ * Bridge to I2PSocket.
+ *
+ * This extends Socket to make porting apps easier.
+ * Methods throw IOExceptions like Sockets do, rather than returning
+ * null for some methods.
+ *
+ * StandardSockets are always bound, and always start out connected
+ * (unless connectDelay is > 0).
+ * You may not create an unbound StandardSocket.
+ * Create this through the SocketManager.
+ *
+ * Todo: Make public and add getPeerDestination() ?
+ *
+ * @author zzz
+ * @since 0.8.4
+ */
+class StandardSocket extends Socket {
+    private final I2PSocket _socket;
+
+    StandardSocket(I2PSocket socket) {
+        _socket = socket;
+    }
+
+    /**
+     *  @throws UnsupportedOperationException always
+     */
+    @Override
+    public void bind(SocketAddress bindpoint) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void close() throws IOException {
+        if (_socket.isClosed())
+            throw new IOException("Already closed");
+        _socket.close();
+    }
+
+    /**
+     *  @throws UnsupportedOperationException always
+     */
+    @Override
+    public void connect(SocketAddress endpoint) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     *  @throws UnsupportedOperationException always
+     */
+    @Override
+    public void connect(SocketAddress endpoint, int timeout) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     *  @return null always
+     */
+    @Override
+    public SocketChannel getChannel() {
+        return null;
+    }
+
+    /**
+     *  @return null always
+     */
+    @Override
+    public InetAddress getInetAddress() {
+        return null;
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        InputStream rv = _socket.getInputStream();
+        if (rv != null)
+            return rv;
+        throw new IOException("No stream");
+    }
+
+    @Override
+    public boolean getKeepAlive() {
+        ConnectionOptions opts = (ConnectionOptions) _socket.getOptions();
+        if (opts == null)
+            return false;
+        return opts.getInactivityAction() == ConnectionOptions.INACTIVITY_ACTION_SEND;
+    }
+
+    /**
+     *  @return null always
+     */
+    @Override
+    public InetAddress getLocalAddress() {
+        return null;
+    }
+
+    /**
+     *  @return -1 always
+     */
+    @Override
+    public int getLocalPort() {
+        return -1;
+    }
+
+    /**
+     *  @return null always
+     */
+    @Override
+    public SocketAddress getLocalSocketAddress() {
+        return null;
+    }
+
+    /**
+     *  @return false always
+     */
+    @Override
+    public boolean getOOBInline() {
+        return false;
+    }
+
+    @Override
+    public OutputStream getOutputStream() throws IOException {
+        OutputStream rv = _socket.getOutputStream();
+        if (rv != null)
+            return rv;
+        throw new IOException("No stream");
+    }
+
+    /**
+     *  @return 0 always
+     */
+    @Override
+    public int getPort() {
+        return 0;
+    }
+
+    @Override
+    public int getReceiveBufferSize() {
+        ConnectionOptions opts = (ConnectionOptions) _socket.getOptions();
+        if (opts == null)
+            return 64*1024;
+        return opts.getInboundBufferSize();
+    }
+
+    /**
+     *  @throws UnsupportedOperationException always
+     */
+    @Override
+    public SocketAddress getRemoteSocketAddress() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     *  @return false always
+     */
+    @Override
+    public boolean getReuseAddress() {
+        return false;
+    }
+
+    @Override
+    public int getSendBufferSize() {
+        ConnectionOptions opts = (ConnectionOptions) _socket.getOptions();
+        if (opts == null)
+            return 64*1024;
+        return opts.getInboundBufferSize();
+    }
+
+    @Override
+    public int getSoLinger() {
+        I2PSocketOptions opts = _socket.getOptions();
+        if (opts == null)
+            return -1;
+        return -1;  // fixme really?
+    }
+
+    @Override
+    public int getSoTimeout() {
+        I2PSocketOptions opts = _socket.getOptions();
+        if (opts == null)
+            return 0;
+        return (int) opts.getReadTimeout();
+    }
+
+    /**
+     *  @return false always
+     */
+    @Override
+    public boolean getTcpNoDelay() {
+        // No option yet. See ConnectionDataReceiver
+        return false;
+    }
+
+    /**
+     *  @return 0 always
+     */
+    @Override
+    public int getTrafficClass() {
+        return 0;
+    }
+
+    /**
+     *  @return true always
+     */
+    @Override
+    public boolean isBound() {
+        return true;
+    }
+
+    @Override
+    public boolean isClosed() {
+        return _socket.isClosed();
+    }
+
+    @Override
+    public boolean isConnected() {
+        return !_socket.isClosed();
+    }
+
+    @Override
+    public boolean isInputShutdown() {
+        return _socket.isClosed();
+    }
+
+    @Override
+    public boolean isOutputShutdown() {
+        return _socket.isClosed();
+    }
+
+    /**
+     *  @throws UnsupportedOperationException always
+     */
+    @Override
+    public void sendUrgentData(int data) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setKeepAlive(boolean on) {
+        ConnectionOptions opts = (ConnectionOptions) _socket.getOptions();
+        if (opts == null)
+            return;
+        if (on)
+            opts.setInactivityAction(ConnectionOptions.INACTIVITY_ACTION_SEND);
+        else
+            opts.setInactivityAction(ConnectionOptions.INACTIVITY_ACTION_NOOP);  // DISCONNECT?
+    }
+
+    /**
+     *  @throws UnsupportedOperationException if on is true
+     */
+    @Override
+    public void setOOBInline(boolean on) {
+        if (on)
+            throw new UnsupportedOperationException();
+    }
+
+    /**
+     *  Does nothing.
+     */
+    @Override
+    public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) {
+    }
+
+    /**
+     *  Does nothing.
+     */
+    @Override
+    public void setReceiveBufferSize(int size) {
+    }
+
+    /**
+     *  Does nothing.
+     */
+    @Override
+    public void setReuseAddress(boolean on) {
+    }
+
+    /**
+     *  Does nothing.
+     */
+    @Override
+    public void setSendBufferSize(int size) {
+    }
+
+    /**
+     *  Does nothing.
+     */
+    @Override
+    public void setSoLinger(boolean on, int linger) {
+    }
+
+    @Override
+    public void setSoTimeout(int timeout) throws SocketException {
+        I2PSocketOptions opts = _socket.getOptions();
+        if (opts == null)
+            throw new SocketException("No options");
+        opts.setReadTimeout(timeout);
+    }
+
+    /**
+     *  Does nothing.
+     */
+    @Override
+    public void setTcpNoDelay(boolean on) {
+    }
+
+    /**
+     *  Does nothing.
+     */
+    @Override
+    public void setTrafficClass(int tc) {
+    }
+
+    @Override
+    public void shutdownInput() throws IOException {
+        close();
+    }
+
+    @Override
+    public void shutdownOutput() throws IOException {
+        close();
+    }
+
+    @Override
+    public String toString() {
+        return _socket.toString();
+    }
+}
diff --git a/apps/susidns/locale/messages_ar.po b/apps/susidns/locale/messages_ar.po
new file mode 100644
index 0000000000000000000000000000000000000000..6523a43a4d78643bf0b5ef244dfc87c6fea59074
--- /dev/null
+++ b/apps/susidns/locale/messages_ar.po
@@ -0,0 +1,501 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the susidns package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P susidns\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-03 18:29+0000\n"
+"PO-Revision-Date: 2011-02-25 18:40-0000\n"
+"Last-Translator: hamada <hamada@mail.i2p>\n"
+"Language-Team: duck <duck@mail.i2p>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:197
+msgid "Search"
+msgstr "بحث"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:204
+msgid "Search within filtered list"
+msgstr "بحث ضمن القائمة"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206
+msgid "Filtered list"
+msgstr "قائمة الترشيح"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:210
+msgid "no matches"
+msgstr "لا يوجد شبيه"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:213
+msgid "Addressbook"
+msgstr "دفتر العناوين"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:215
+msgid "contains no entries"
+msgstr "لايحتوي على بيانات"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:217
+msgid "contains 1 entry"
+msgstr "يحتوي على واحدة"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:219
+#, java-format
+msgid "contains {0} entries"
+msgstr "يحتوي على {0} "
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:229
+#, java-format
+msgid "Showing {0} of {1}"
+msgstr "اظهار {0} من {1}"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368
+msgid "Add"
+msgstr "أضف"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:366
+msgid "Replace"
+msgstr "عوض"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264
+#, java-format
+msgid "Host name {0} is already in addressbook, unchanged."
+msgstr "اسم مضيف {0} موجود في دفتر العناوين."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266
+#, java-format
+msgid ""
+"Host name {0} is already in addressbook with a different destination. Click "
+"\"Replace\" to overwrite."
+msgstr "اسم المضيف {0} موجود مسبقا في دفتر العناوين. أنقر \"عوض\" يتعويضه."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278
+#, java-format
+msgid "Destination added for {0}."
+msgstr "تم اضافة الوجهة الى {0}."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:280
+#, java-format
+msgid "Destination changed for {0}."
+msgstr "تم تغيير الوجهة الى {0}."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:285
+msgid "Invalid Base 64 destination."
+msgstr "باطلة Base 64 وجهة."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:289
+msgid "Please enter a host name and destination"
+msgstr "قم بادخال اسم المضيف والوجهة"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:293
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314
+msgid "Delete Selected"
+msgstr "حذف"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:303
+#, java-format
+msgid "Destination {0} deleted."
+msgstr "وجهة {0} محذوفة."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:305
+#, java-format
+msgid "{0} destinations deleted."
+msgstr "{0} وجهة محذوفة."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:311
+msgid "Addressbook saved."
+msgstr "تم حفظ دفتر العناوين"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:314
+msgid "ERROR: Could not write addressbook file."
+msgstr "خطأ: لم يتم حفظ دفتر العناوين"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:148
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151
+msgid ""
+"Invalid form submission, probably because you used the \"back\" or \"reload"
+"\" button on your browser. Please resubmit."
+msgstr ""
+"فشل في الارسال، ربما لاستعمال زر \"رجوع\" او  \"أنعش\". قم بالارسال مرة أخرى."
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:139
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:130
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130
+msgid "Save"
+msgstr "حفظ"
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:141
+msgid "Configuration saved."
+msgstr "حفظ الخيارات"
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:142
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:145
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:128
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:128
+msgid "Reload"
+msgstr "أعد تشغيل"
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:144
+msgid "Configuration reloaded."
+msgstr "اعادة تحميل الاعدادات"
+
+#. Yes this is a hack.
+#. No it doesn't work on a text-mode browser.
+#. Fetching from the addressbook servlet
+#. with the correct parameters will kick off a
+#. config reload and fetch.
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139
+msgid ""
+"Subscriptions saved, updating addressbook from subscription sources now."
+msgstr "تم حفظ الاشتراكات وتحديث دفتر العناوين من مصادر اشتراك الآن."
+
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143
+msgid "Subscriptions saved."
+msgstr "تم حفظ الاشتراك."
+
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147
+msgid "Subscriptions reloaded."
+msgstr "تم اعادة تحميل الاشتراك."
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:125
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:145
+msgid "addressbook"
+msgstr "دفتر العناوين"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:127
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:104
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:93
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:104
+msgid "addressbooks"
+msgstr "دفتر العناوين"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:129
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:106
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:95
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:106
+msgid "private"
+msgstr "خاص"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:131
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:108
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:97
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:108
+msgid "master"
+msgstr "رئيسي"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:133
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:110
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:99
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:110
+msgid "router"
+msgstr "موجه"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:135
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:112
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:101
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:112
+msgid "published"
+msgstr "منشور"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:137
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:114
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:103
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:102
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:114
+msgid "subscriptions"
+msgstr "اشتراك"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:139
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:102
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:116
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:105
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:116
+msgid "configuration"
+msgstr "خيارات"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:141
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:118
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:107
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:118
+msgid "overview"
+msgstr "نظرة عامة"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:163
+msgid "Filter"
+msgstr "ترشيح"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:166
+msgid "all"
+msgstr "جمبع"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:177
+msgid "Current filter"
+msgstr "الترشيح الحالي"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:182
+msgid "clear filter"
+msgstr "الغاء الترشيح"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:224
+msgid "Name"
+msgstr "الإسم"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:226
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:362
+msgid "Destination"
+msgstr "الوجهة"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:257
+msgid "Mark for deletion"
+msgstr "اختر للحذف"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:279
+msgid "address helper link"
+msgstr "وصلة مساعدة"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:312
+msgid "Cancel"
+msgstr "الغاء"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:345
+msgid "This addressbook is empty."
+msgstr "هذا دفتر العناوين فارغ"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:356
+msgid "Add new destination"
+msgstr "أضف وجهة جديدة"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:358
+msgid "Hostname"
+msgstr "اسم مضيف"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:132
+msgid "Hints"
+msgstr "إشارة"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134
+msgid ""
+"File and directory paths here are relative to the addressbook's working "
+"directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P"
+"\\addressbook\\ (Windows)."
+msgstr ""
+"عنوان الملف والمجلد نسبي الى مجلد دفتر العناوين، الذي عادة هو ~/.i2p/"
+"addressbook/ (Linux) or %APPDATA%\\I2P\\addressbook\\ (Windows)."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136
+msgid ""
+"If you want to manually add lines to an addressbook, add them to the private "
+"or master addressbooks."
+msgstr ""
+"اذا اردت اضافة العناوين الى دفتر العناوين، اضفها مباشرة الى دفتر العناوين "
+"الرئيسي."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:138
+msgid ""
+"The router addressbook and the published addressbook are updated by the "
+"addressbook application."
+msgstr ""
+"يتم تحديث دفتر العناوين الخاص و  دفتر العناوين العمومي من طرف تطبيق  دفتر "
+"العناوين."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140
+msgid ""
+"When you publish your addressbook, ALL destinations from the master and "
+"router addressbooks appear there."
+msgstr "عندما تنشر دفتر العناوين، ستظهر جميع المواقع هنا."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:142
+msgid ""
+"Use the private addressbook for private destinations, these are not "
+"published."
+msgstr "استعمل دفتر العناوين الخاص من أجل العناوين الخاصة التي لن يتم نشرها."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144
+msgid "Options"
+msgstr "خيارات"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146
+msgid "File containing the list of subscriptions URLs (no need to change)"
+msgstr "ملف يحتوي على قائمة الاشتراكات"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148
+msgid "Update interval in hours"
+msgstr "تحديث الفاصل الزمني في ساعات"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150
+msgid ""
+"Your public hosts.txt file (choose a path within your webserver document "
+"root)"
+msgstr "hosts.txt ملف"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152
+msgid "Your hosts.txt (don't change)"
+msgstr "hosts.txt (ﻻتغير)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:154
+msgid "Your personal addressbook, these hosts will be published"
+msgstr "سيتم نشر هذه العناوين"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:156
+msgid "Your private addressbook, it is never published"
+msgstr "دفتر عناوينك الخاص، لن يتم نشره"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:158
+msgid "Port for your eepProxy (no need to change)"
+msgstr "رقم منفذ eepProxy (ﻻ حاجة للتغيير)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160
+msgid "Hostname for your eepProxy (no need to change)"
+msgstr "عنوان لـ eepProxy"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:162
+msgid "Whether to update the published addressbook"
+msgstr "تعديل دفتر العناوين المنشور"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164
+msgid ""
+"File containing the etags header from the fetched subscription URLs (no need "
+"to change)"
+msgstr "ملف يحتوي على قائمة عناوين الاشتراك"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166
+msgid ""
+"File containing the modification timestamp for each fetched subscription URL "
+"(no need to change)"
+msgstr "ملف يحتوي على تاريخ التحديث"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:168
+msgid "File to log activity to (change to /dev/null if you like)"
+msgstr "ملف لحفظ الأخطاء"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:91
+msgid "Introduction"
+msgstr "تقديم"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:109
+msgid "What is the addressbook?"
+msgstr "ماهو دفتر العناوين؟"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:111
+msgid "The addressbook application is part of your i2p installation."
+msgstr "تطبيق دفتر العناوين هو ضمن مجموعة برامج i2p"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113
+msgid ""
+"It regularly updates your hosts.txt file from distributed sources or "
+"\"subscriptions\"."
+msgstr "يقوم بتحديث ملف hosts.txt من عدة مصادر"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115
+msgid ""
+"In the default configuration, the addressbook is only subscribed to www.i2p2."
+"i2p."
+msgstr "في الاعدادت العادية، دفتر العناوين مرتبط ب www.i2p2.i2p."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:117
+msgid ""
+"Subscribing to additional sites is easy, just add them to your <a href="
+"\"subscriptions.jsp\">subscriptions</a> file."
+msgstr ""
+"من السهل الانخراط في باقي المواقع فقط أضفه الى <a href=\"subscriptions.jsp"
+"\">الانخراط</a>"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119
+msgid ""
+"For more information on naming in i2p, see <a href=\"http://www.i2p2.i2p/"
+"naming.html\">the overview on www.i2p2.i2p</a>."
+msgstr ""
+"للمزيد من المعلومات حول التسمية<a href=\"http://www.i2p2.i2p/naming.html"
+"\">لمحة عامة www.i2p2.i2p</a>."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121
+msgid "How does the addressbook work?"
+msgstr "كيف يشتغل دفتر العناوين؟"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123
+msgid ""
+"The addressbook application regularly polls your subscriptions and merges "
+"their content into your \"router\" addressbook, stored in the hosts.txt file."
+msgstr ""
+"دفتر العناوين الخاص بك يقوم بستمرار من الحصول على الاشتراكات و حفظ العناولن "
+"الجديدة في ملف hosts.txt."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125
+msgid ""
+"Then it merges your \"master\" addressbook (userhosts.txt) into the router "
+"addressbook as well."
+msgstr "ثم اضافة العناوين الى دفتر العناوين أيضا."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127
+msgid ""
+"If configured, the router addressbook is now written to the \"published\" "
+"addressbook, which will be publicly available if you are running an eepsite."
+msgstr "اذا قمت بالاختيار لن تتم نشر دفتر العناوين "
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129
+msgid ""
+"The router also uses a private addressbook (privatehosts.txt, not shown in "
+"the picture), which is not merged or published."
+msgstr "الموجه يستعمل ايضا دفتر عناوين خاص الذ لا يتم نشره"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131
+msgid ""
+"Hosts in the private addressbook can be accessed by you but their addresses "
+"are never distributed to others."
+msgstr ""
+"يمكنك الإطلاع على المواقع في دفتر العناوينك الخاص  توزيع أبدا لكم ولكن "
+"عناوينهم للآخرين."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:133
+msgid ""
+"The private addressbook can also be used for aliases of hosts in your other "
+"addressbooks."
+msgstr ""
+"ويمكن أيضا أن تستعمل دفتر العناوين الخاص  لأجل الأسماء المستعارة لأخرى "
+"الخاصة بك."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132
+msgid "The subscription file contains a list of i2p URLs."
+msgstr "ملف الاشتراك يحتوي على قائمة مواقع i2p."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134
+msgid ""
+"The addressbook application regularly checks this list for new eepsites."
+msgstr "دفتر العناوين تقوم يستمرار بالتحقق من قائمة eepsites."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136
+msgid "Those URLs refer to published hosts.txt files."
+msgstr "هذه العناوين لملف hosts.txt."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138
+msgid ""
+"The default subscription is the hosts.txt from www.i2p2.i2p, which is "
+"updated infrequently."
+msgstr ""
+"الاشتراك العادي هو لملف hosts.txt from www.i2p2.i2p الذي يتم ترقيته باستمرار."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140
+msgid ""
+"So it is a good idea to add additional subscriptions to sites that have the "
+"latest addresses."
+msgstr ""
+"انها فكرة جيدة لإضافة اشتراكات إضافية إلى المواقع التي تحتوي على أحدث "
+"العناوين."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142
+msgid "See the FAQ for a list of subscription URLs."
+msgstr "أنظر الأسئلة الشائعة للخصول على قائمة بالعناوين"
diff --git a/apps/susidns/locale/messages_de.po b/apps/susidns/locale/messages_de.po
index 3e983ffec963278385959a18271fa17950460913..d8f2b2e57e64757768ebbcff32460f1a41f20309 100644
--- a/apps/susidns/locale/messages_de.po
+++ b/apps/susidns/locale/messages_de.po
@@ -8,10 +8,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P susidns\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-08 18:21+0000\n"
+"POT-Creation-Date: 2011-03-03 18:29+0000\n"
 "PO-Revision-Date: 2010-12-19 04:36+0100\n"
 "Last-Translator: mixxy <m1xxy@mail.i2p>\n"
 "Language-Team: foo <foo@bar>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -75,8 +76,12 @@ msgstr "Hostname {0} ist bereits im Adressbuch, nicht geändert."
 
 #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266
 #, java-format
-msgid "Host name {0} is already in addressbook with a different destination. Click \"Replace\" to overwrite."
-msgstr "Hostname {0} ist mit einem anderen Ziel bereits im Adressbuch. Klicken Sie auf \"Ersetzen\", um den alten Eintrag zu ersetzen!"
+msgid ""
+"Host name {0} is already in addressbook with a different destination. Click "
+"\"Replace\" to overwrite."
+msgstr ""
+"Hostname {0} ist mit einem anderen Ziel bereits im Adressbuch. Klicken Sie "
+"auf \"Ersetzen\", um den alten Eintrag zu ersetzen!"
 
 #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278
 #, java-format
@@ -122,8 +127,12 @@ msgstr "FEHLER: Konnte Adressbuchdatei nicht schreiben."
 #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319
 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:148
 #: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151
-msgid "Invalid form submission, probably because you used the \"back\" or \"reload\" button on your browser. Please resubmit."
-msgstr "Ungültige Datenübertragung, vielleicht haben Sie die \"Zurück\"- oder \"Neu laden\"-Schalter in Ihrem Browser genutzt. Bitte neu senden!"
+msgid ""
+"Invalid form submission, probably because you used the \"back\" or \"reload"
+"\" button on your browser. Please resubmit."
+msgstr ""
+"Ungültige Datenübertragung, vielleicht haben Sie die \"Zurück\"- oder \"Neu "
+"laden\"-Schalter in Ihrem Browser genutzt. Bitte neu senden!"
 
 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:139
 #: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:130
@@ -153,8 +162,11 @@ msgstr "Einstellungen neu geladen"
 #. with the correct parameters will kick off a
 #. config reload and fetch.
 #: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139
-msgid "Subscriptions saved, updating addressbook from subscription sources now."
-msgstr "Abonnement gespeichert, aktualisiere jetzt das Adressbuch von untenstehenden Aboquellen."
+msgid ""
+"Subscriptions saved, updating addressbook from subscription sources now."
+msgstr ""
+"Abonnement gespeichert, aktualisiere jetzt das Adressbuch von untenstehenden "
+"Aboquellen."
 
 #: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143
 msgid "Subscriptions saved."
@@ -281,24 +293,46 @@ msgid "Hints"
 msgstr "Hinweise"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134
-msgid "File and directory paths here are relative to the addressbook's working directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P\\addressbook\\ (Windows)."
-msgstr "Dateien und Verzeichnispfade sind relativ zum Arbeitsverzeichnis des Adressbuchs - normalerweise ~/.i2p/addressbook/ (Linux) oder %APPDATA%\\I2P\\addressbook\\ (Windows)."
+msgid ""
+"File and directory paths here are relative to the addressbook's working "
+"directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P"
+"\\addressbook\\ (Windows)."
+msgstr ""
+"Dateien und Verzeichnispfade sind relativ zum Arbeitsverzeichnis des "
+"Adressbuchs - normalerweise ~/.i2p/addressbook/ (Linux) oder %APPDATA%\\I2P"
+"\\addressbook\\ (Windows)."
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136
-msgid "If you want to manually add lines to an addressbook, add them to the private or master addressbooks."
-msgstr "Falls Sie manuell Einträge zum Adressbuch hinzufügen möchten, fügen Sie diese zum privaten oder zum Master-Adressbuch hinzu!"
+msgid ""
+"If you want to manually add lines to an addressbook, add them to the private "
+"or master addressbooks."
+msgstr ""
+"Falls Sie manuell Einträge zum Adressbuch hinzufügen möchten, fügen Sie "
+"diese zum privaten oder zum Master-Adressbuch hinzu!"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:138
-msgid "The router addressbook and the published addressbook are updated by the addressbook application."
-msgstr "Das Router-Adressbuch und das veröffentlichte Adressbuch werden von der Adressbuch-Anwendung aktualisiert."
+msgid ""
+"The router addressbook and the published addressbook are updated by the "
+"addressbook application."
+msgstr ""
+"Das Router-Adressbuch und das veröffentlichte Adressbuch werden von der "
+"Adressbuch-Anwendung aktualisiert."
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140
-msgid "When you publish your addressbook, ALL destinations from the master and router addressbooks appear there."
-msgstr "Falls Sie das Adressbuch veröffentlichen, erscheinen dort ALLE Ziele aus dem Master- und dem Router-Adressbuch."
+msgid ""
+"When you publish your addressbook, ALL destinations from the master and "
+"router addressbooks appear there."
+msgstr ""
+"Falls Sie das Adressbuch veröffentlichen, erscheinen dort ALLE Ziele aus dem "
+"Master- und dem Router-Adressbuch."
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:142
-msgid "Use the private addressbook for private destinations, these are not published."
-msgstr "Benutzen Sie das private Adressbuch für private Ziele. Diese werden nicht veröffentlicht."
+msgid ""
+"Use the private addressbook for private destinations, these are not "
+"published."
+msgstr ""
+"Benutzen Sie das private Adressbuch für private Ziele. Diese werden nicht "
+"veröffentlicht."
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144
 msgid "Options"
@@ -306,15 +340,20 @@ msgstr "Optionen"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146
 msgid "File containing the list of subscriptions URLs (no need to change)"
-msgstr "Datei mit der Liste von Abonnement-URLs (braucht nicht geändert zu werden)"
+msgstr ""
+"Datei mit der Liste von Abonnement-URLs (braucht nicht geändert zu werden)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148
 msgid "Update interval in hours"
 msgstr "Aktualisierungsintervall in Stunden"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150
-msgid "Your public hosts.txt file (choose a path within your webserver document root)"
-msgstr "Ihre öffentliche hosts.txt-Datei (Wählen Sie einen Pfad in Ihrem Webserver Wurzelverzeichnis!)"
+msgid ""
+"Your public hosts.txt file (choose a path within your webserver document "
+"root)"
+msgstr ""
+"Ihre öffentliche hosts.txt-Datei (Wählen Sie einen Pfad in Ihrem Webserver "
+"Wurzelverzeichnis!)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152
 msgid "Your hosts.txt (don't change)"
@@ -341,16 +380,26 @@ msgid "Whether to update the published addressbook"
 msgstr "Soll Ihr veröffentlichtes Adressbuch aktualisiert werden?"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164
-msgid "File containing the etags header from the fetched subscription URLs (no need to change)"
-msgstr "Datei, die die etags-Kopfzeilen der bereits aktualisierten Abonnement-URLs enthält (braucht nicht geändert zu werden)"
+msgid ""
+"File containing the etags header from the fetched subscription URLs (no need "
+"to change)"
+msgstr ""
+"Datei, die die etags-Kopfzeilen der bereits aktualisierten Abonnement-URLs "
+"enthält (braucht nicht geändert zu werden)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166
-msgid "File containing the modification timestamp for each fetched subscription URL (no need to change)"
-msgstr "Datei, welche die Zeitstempel der letzten Modifikation für jede bereits aktualisierte Abonnement-URL enthält (braucht nicht geändert zu werden)"
+msgid ""
+"File containing the modification timestamp for each fetched subscription URL "
+"(no need to change)"
+msgstr ""
+"Datei, welche die Zeitstempel der letzten Modifikation für jede bereits "
+"aktualisierte Abonnement-URL enthält (braucht nicht geändert zu werden)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:168
 msgid "File to log activity to (change to /dev/null if you like)"
-msgstr "Berichte zu Aktivitäten werden in dieser Datei gespeichert. (Ändern Sie es zu /dev/null, wenn Sie möchten!)"
+msgstr ""
+"Berichte zu Aktivitäten werden in dieser Datei gespeichert. (Ändern Sie es "
+"zu /dev/null, wenn Sie möchten!)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:91
 msgid "Introduction"
@@ -365,70 +414,122 @@ msgid "The addressbook application is part of your i2p installation."
 msgstr "Das Adressbuch ist ein Teil Ihrer I2P-Installation."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113
-msgid "It regularly updates your hosts.txt file from distributed sources or \"subscriptions\"."
-msgstr "Es aktualisiert regelmäßig Ihre hosts.txt-Datei aus verteilten Quellen oder den \"Abonnementquellen\"."
+msgid ""
+"It regularly updates your hosts.txt file from distributed sources or "
+"\"subscriptions\"."
+msgstr ""
+"Es aktualisiert regelmäßig Ihre hosts.txt-Datei aus verteilten Quellen oder "
+"den \"Abonnementquellen\"."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115
-msgid "In the default configuration, the addressbook is only subscribed to www.i2p2.i2p."
-msgstr "In der Standardeinstellung bezieht das Adressbuch sein Abonnement nur von www.i2p2.i2p."
+msgid ""
+"In the default configuration, the addressbook is only subscribed to www.i2p2."
+"i2p."
+msgstr ""
+"In der Standardeinstellung bezieht das Adressbuch sein Abonnement nur von "
+"www.i2p2.i2p."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:117
-msgid "Subscribing to additional sites is easy, just add them to your <a href=\"subscriptions.jsp\">subscriptions</a> file."
-msgstr "Zusätzliche Abonnementquellen hinzuzufügen ist einfach: Geben Sie dazu deren URL in Ihrer <a href=\"subscriptions.jsp\">Abonnement</a>-Datei an."
+msgid ""
+"Subscribing to additional sites is easy, just add them to your <a href="
+"\"subscriptions.jsp\">subscriptions</a> file."
+msgstr ""
+"Zusätzliche Abonnementquellen hinzuzufügen ist einfach: Geben Sie dazu deren "
+"URL in Ihrer <a href=\"subscriptions.jsp\">Abonnement</a>-Datei an."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119
-msgid "For more information on naming in i2p, see <a href=\"http://www.i2p2.i2p/naming.html\">the overview on www.i2p2.i2p</a>."
-msgstr "Für mehr Informationen über das Namenssystem in I2P konsultieren Sie bitte die <a href=\"http://www.i2p2.i2p/naming.html\">&Uuml;bersichtsseite auf www.i2p2.i2p</a>."
+msgid ""
+"For more information on naming in i2p, see <a href=\"http://www.i2p2.i2p/"
+"naming.html\">the overview on www.i2p2.i2p</a>."
+msgstr ""
+"Für mehr Informationen über das Namenssystem in I2P konsultieren Sie bitte "
+"die <a href=\"http://www.i2p2.i2p/naming.html\">&Uuml;bersichtsseite auf www."
+"i2p2.i2p</a>."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121
 msgid "How does the addressbook work?"
 msgstr "Wie funktioniert das Adressbuch?"
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123
-msgid "The addressbook application regularly polls your subscriptions and merges their content into your \"router\" addressbook, stored in the hosts.txt file."
-msgstr "Die Adressbuch-Anwendung bezieht regelmäßig ihre Abonnements und führt deren Inhalt mit dem Ihres \"Router\"-Adressbuchs zusammen, welches in der hosts.txt-Datei gespeichert ist."
+msgid ""
+"The addressbook application regularly polls your subscriptions and merges "
+"their content into your \"router\" addressbook, stored in the hosts.txt file."
+msgstr ""
+"Die Adressbuch-Anwendung bezieht regelmäßig ihre Abonnements und führt deren "
+"Inhalt mit dem Ihres \"Router\"-Adressbuchs zusammen, welches in der hosts."
+"txt-Datei gespeichert ist."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125
-msgid "Then it merges your \"master\" addressbook (userhosts.txt) into the router addressbook as well."
-msgstr "Dann fügt sie auch Ihr \"Master\"-Adressbuch (userhosts.txt) dem Router-Adressbuch hinzu."
+msgid ""
+"Then it merges your \"master\" addressbook (userhosts.txt) into the router "
+"addressbook as well."
+msgstr ""
+"Dann fügt sie auch Ihr \"Master\"-Adressbuch (userhosts.txt) dem Router-"
+"Adressbuch hinzu."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127
-msgid "If configured, the router addressbook is now written to the \"published\" addressbook, which will be publicly available if you are running an eepsite."
-msgstr "Falls eingestellt, wird das Router-Adressbuch jetzt in das \"veröffentlichte\" Adressbuch kopiert. Dieses ist öffentlich erreichbar, solange Sie eine Eepseite betreiben."
+msgid ""
+"If configured, the router addressbook is now written to the \"published\" "
+"addressbook, which will be publicly available if you are running an eepsite."
+msgstr ""
+"Falls eingestellt, wird das Router-Adressbuch jetzt in das \"veröffentlichte"
+"\" Adressbuch kopiert. Dieses ist öffentlich erreichbar, solange Sie eine "
+"Eepseite betreiben."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129
-msgid "The router also uses a private addressbook (privatehosts.txt, not shown in the picture), which is not merged or published."
-msgstr "Der Router besitzt auch ein privates Adressbuch (privatehosts.txt, nicht im Bild gezeigt), welches nicht mit anderen vereinigt oder veröffentlicht wird."
+msgid ""
+"The router also uses a private addressbook (privatehosts.txt, not shown in "
+"the picture), which is not merged or published."
+msgstr ""
+"Der Router besitzt auch ein privates Adressbuch (privatehosts.txt, nicht im "
+"Bild gezeigt), welches nicht mit anderen vereinigt oder veröffentlicht wird."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131
-msgid "Hosts in the private addressbook can be accessed by you but their addresses are never distributed to others."
-msgstr "Hosts in Ihrem privatem Adressbuch können von Ihnen aufgerufen werden, aber ihre Adressen werden nicht an andere verteilt."
+msgid ""
+"Hosts in the private addressbook can be accessed by you but their addresses "
+"are never distributed to others."
+msgstr ""
+"Hosts in Ihrem privatem Adressbuch können von Ihnen aufgerufen werden, aber "
+"ihre Adressen werden nicht an andere verteilt."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:133
-msgid "The private addressbook can also be used for aliases of hosts in your other addressbooks."
-msgstr "Das private Adressbuch kann auch für Verweise auf Hosts in Ihren anderen Adressbüchern genutzt werden."
+msgid ""
+"The private addressbook can also be used for aliases of hosts in your other "
+"addressbooks."
+msgstr ""
+"Das private Adressbuch kann auch für Verweise auf Hosts in Ihren anderen "
+"Adressbüchern genutzt werden."
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132
 msgid "The subscription file contains a list of i2p URLs."
 msgstr "Die Abonnementdatei enthält eine Liste von I2P-URLs."
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134
-msgid "The addressbook application regularly checks this list for new eepsites."
-msgstr "Die Adressbuchanwendung prüft diese Liste regelmäßig auf neue Eepsites."
+msgid ""
+"The addressbook application regularly checks this list for new eepsites."
+msgstr ""
+"Die Adressbuchanwendung prüft diese Liste regelmäßig auf neue Eepsites."
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136
 msgid "Those URLs refer to published hosts.txt files."
 msgstr "Diese URLs verweisen auf veröffentlichte hosts.txt-Dateien."
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138
-msgid "The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently."
-msgstr "Das Standardabonnement ist die hosts.txt-Datei von www.i2p2.i2p, welche nicht regelmäßig aktualisiert wird."
+msgid ""
+"The default subscription is the hosts.txt from www.i2p2.i2p, which is "
+"updated infrequently."
+msgstr ""
+"Das Standardabonnement ist die hosts.txt-Datei von www.i2p2.i2p, welche "
+"nicht regelmäßig aktualisiert wird."
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140
-msgid "So it is a good idea to add additional subscriptions to sites that have the latest addresses."
-msgstr "Somit ist es eine gute Idee, weitere Abonnements von Seiten mit den neuesten Adressen hinzuzufügen."
+msgid ""
+"So it is a good idea to add additional subscriptions to sites that have the "
+"latest addresses."
+msgstr ""
+"Somit ist es eine gute Idee, weitere Abonnements von Seiten mit den neuesten "
+"Adressen hinzuzufügen."
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142
 msgid "See the FAQ for a list of subscription URLs."
 msgstr "Schauen Sie in den FAQ nach einer Liste von Abonnement-URLs!"
-
diff --git a/apps/susidns/locale/messages_en.po b/apps/susidns/locale/messages_en.po
new file mode 100644
index 0000000000000000000000000000000000000000..f907ba15474147dcbcaffeff180414c432e3abca
--- /dev/null
+++ b/apps/susidns/locale/messages_en.po
@@ -0,0 +1,481 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the susidns package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P susidns\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-03 18:29+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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:197
+msgid "Search"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:204
+msgid "Search within filtered list"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206
+msgid "Filtered list"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:210
+msgid "no matches"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:213
+msgid "Addressbook"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:215
+msgid "contains no entries"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:217
+msgid "contains 1 entry"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:219
+#, java-format
+msgid "contains {0} entries"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:229
+#, java-format
+msgid "Showing {0} of {1}"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368
+msgid "Add"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:366
+msgid "Replace"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264
+#, java-format
+msgid "Host name {0} is already in addressbook, unchanged."
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266
+#, java-format
+msgid ""
+"Host name {0} is already in addressbook with a different destination. Click "
+"\"Replace\" to overwrite."
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278
+#, java-format
+msgid "Destination added for {0}."
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:280
+#, java-format
+msgid "Destination changed for {0}."
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:285
+msgid "Invalid Base 64 destination."
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:289
+msgid "Please enter a host name and destination"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:293
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314
+msgid "Delete Selected"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:303
+#, java-format
+msgid "Destination {0} deleted."
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:305
+#, java-format
+msgid "{0} destinations deleted."
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:311
+msgid "Addressbook saved."
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:314
+msgid "ERROR: Could not write addressbook file."
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:148
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151
+msgid ""
+"Invalid form submission, probably because you used the \"back\" or \"reload"
+"\" button on your browser. Please resubmit."
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:139
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:130
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130
+msgid "Save"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:141
+msgid "Configuration saved."
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:142
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:145
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:128
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:128
+msgid "Reload"
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:144
+msgid "Configuration reloaded."
+msgstr ""
+
+#. Yes this is a hack.
+#. No it doesn't work on a text-mode browser.
+#. Fetching from the addressbook servlet
+#. with the correct parameters will kick off a
+#. config reload and fetch.
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139
+msgid ""
+"Subscriptions saved, updating addressbook from subscription sources now."
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143
+msgid "Subscriptions saved."
+msgstr ""
+
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147
+msgid "Subscriptions reloaded."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:125
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:145
+msgid "addressbook"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:127
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:104
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:93
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:104
+msgid "addressbooks"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:129
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:106
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:95
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:106
+msgid "private"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:131
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:108
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:97
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:108
+msgid "master"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:133
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:110
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:99
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:110
+msgid "router"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:135
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:112
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:101
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:112
+msgid "published"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:137
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:114
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:103
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:102
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:114
+msgid "subscriptions"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:139
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:102
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:116
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:105
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:116
+msgid "configuration"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:141
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:118
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:107
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:118
+msgid "overview"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:163
+msgid "Filter"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:166
+msgid "all"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:177
+msgid "Current filter"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:182
+msgid "clear filter"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:224
+msgid "Name"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:226
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:362
+msgid "Destination"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:257
+msgid "Mark for deletion"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:279
+msgid "address helper link"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:312
+msgid "Cancel"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:345
+msgid "This addressbook is empty."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:356
+msgid "Add new destination"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:358
+msgid "Hostname"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:132
+msgid "Hints"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134
+msgid ""
+"File and directory paths here are relative to the addressbook's working "
+"directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P"
+"\\addressbook\\ (Windows)."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136
+msgid ""
+"If you want to manually add lines to an addressbook, add them to the private "
+"or master addressbooks."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:138
+msgid ""
+"The router addressbook and the published addressbook are updated by the "
+"addressbook application."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140
+msgid ""
+"When you publish your addressbook, ALL destinations from the master and "
+"router addressbooks appear there."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:142
+msgid ""
+"Use the private addressbook for private destinations, these are not "
+"published."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144
+msgid "Options"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146
+msgid "File containing the list of subscriptions URLs (no need to change)"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148
+msgid "Update interval in hours"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150
+msgid ""
+"Your public hosts.txt file (choose a path within your webserver document "
+"root)"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152
+msgid "Your hosts.txt (don't change)"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:154
+msgid "Your personal addressbook, these hosts will be published"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:156
+msgid "Your private addressbook, it is never published"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:158
+msgid "Port for your eepProxy (no need to change)"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160
+msgid "Hostname for your eepProxy (no need to change)"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:162
+msgid "Whether to update the published addressbook"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164
+msgid ""
+"File containing the etags header from the fetched subscription URLs (no need "
+"to change)"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166
+msgid ""
+"File containing the modification timestamp for each fetched subscription URL "
+"(no need to change)"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:168
+msgid "File to log activity to (change to /dev/null if you like)"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:91
+msgid "Introduction"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:109
+msgid "What is the addressbook?"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:111
+msgid "The addressbook application is part of your i2p installation."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113
+msgid ""
+"It regularly updates your hosts.txt file from distributed sources or "
+"\"subscriptions\"."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115
+msgid ""
+"In the default configuration, the addressbook is only subscribed to www.i2p2."
+"i2p."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:117
+msgid ""
+"Subscribing to additional sites is easy, just add them to your <a href="
+"\"subscriptions.jsp\">subscriptions</a> file."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119
+msgid ""
+"For more information on naming in i2p, see <a href=\"http://www.i2p2.i2p/"
+"naming.html\">the overview on www.i2p2.i2p</a>."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121
+msgid "How does the addressbook work?"
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123
+msgid ""
+"The addressbook application regularly polls your subscriptions and merges "
+"their content into your \"router\" addressbook, stored in the hosts.txt file."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125
+msgid ""
+"Then it merges your \"master\" addressbook (userhosts.txt) into the router "
+"addressbook as well."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127
+msgid ""
+"If configured, the router addressbook is now written to the \"published\" "
+"addressbook, which will be publicly available if you are running an eepsite."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129
+msgid ""
+"The router also uses a private addressbook (privatehosts.txt, not shown in "
+"the picture), which is not merged or published."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131
+msgid ""
+"Hosts in the private addressbook can be accessed by you but their addresses "
+"are never distributed to others."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:133
+msgid ""
+"The private addressbook can also be used for aliases of hosts in your other "
+"addressbooks."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132
+msgid "The subscription file contains a list of i2p URLs."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134
+msgid ""
+"The addressbook application regularly checks this list for new eepsites."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136
+msgid "Those URLs refer to published hosts.txt files."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138
+msgid ""
+"The default subscription is the hosts.txt from www.i2p2.i2p, which is "
+"updated infrequently."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140
+msgid ""
+"So it is a good idea to add additional subscriptions to sites that have the "
+"latest addresses."
+msgstr ""
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142
+msgid "See the FAQ for a list of subscription URLs."
+msgstr ""
diff --git a/apps/susidns/locale/messages_es.po b/apps/susidns/locale/messages_es.po
new file mode 100644
index 0000000000000000000000000000000000000000..8e1ee29c1b23901ce271d39c38daa16317485200
--- /dev/null
+++ b/apps/susidns/locale/messages_es.po
@@ -0,0 +1,544 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the susidns package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P\n"
+"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
+"POT-Creation-Date: 2011-03-03 18:29+0000\n"
+"PO-Revision-Date: 2011-03-22 15:48+0000\n"
+"Last-Translator: punkibastardo <punkibastardo@gmail.com>\n"
+"Language-Team: Spanish (Castilian) <None>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:197
+msgid "Search"
+msgstr "Buscar"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:204
+msgid "Search within filtered list"
+msgstr "Buscar con la lista filtrada"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206
+msgid "Filtered list"
+msgstr "Lista filtrada"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:210
+msgid "no matches"
+msgstr "No hay coincidencias"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:213
+msgid "Addressbook"
+msgstr "Libreta de direcciones"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:215
+msgid "contains no entries"
+msgstr "no contiene entradas"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:217
+msgid "contains 1 entry"
+msgstr "contiene 1 entrada"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:219
+#, java-format
+msgid "contains {0} entries"
+msgstr "contiene {0} entradas"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:229
+#, java-format
+msgid "Showing {0} of {1}"
+msgstr "Mostrando {0} de {1}"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368
+msgid "Add"
+msgstr "Agregar"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:366
+msgid "Replace"
+msgstr "Reemplazar"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264
+#, java-format
+msgid "Host name {0} is already in addressbook, unchanged."
+msgstr ""
+"El nombre del host {0} ya está en la libreta de direcciones, sin cambios."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266
+#, java-format
+msgid ""
+"Host name {0} is already in addressbook with a different destination. Click "
+"\"Replace\" to overwrite."
+msgstr ""
+"El nombre del host {0} ya está en la libreta de direcciones con un destino "
+"diferente. Haga clic en \"reemplazar\" para sobrescribir."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278
+#, java-format
+msgid "Destination added for {0}."
+msgstr "Destino añadido para {0}."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:280
+#, java-format
+msgid "Destination changed for {0}."
+msgstr "Destino cambiado para {0}."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:285
+msgid "Invalid Base 64 destination."
+msgstr "Destino en Base 64 no válido"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:289
+msgid "Please enter a host name and destination"
+msgstr "Por favor, introduzca un nombre de host y destino"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:293
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314
+msgid "Delete Selected"
+msgstr "Eliminar seleccionados"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:303
+#, java-format
+msgid "Destination {0} deleted."
+msgstr "Destino {0} eliminado."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:305
+#, java-format
+msgid "{0} destinations deleted."
+msgstr "{0} destinos eliminados."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:311
+msgid "Addressbook saved."
+msgstr "Libreta de direcciones guardada."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:314
+msgid "ERROR: Could not write addressbook file."
+msgstr "ERROR: No se pudo escribir el archivo de la libreta direcciones."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:148
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151
+msgid ""
+"Invalid form submission, probably because you used the \"back\" or "
+"\"reload\" button on your browser. Please resubmit."
+msgstr ""
+"presentación de formulario no válido, probablemente debido a que ha "
+"utilizado el botón \"atrás\" o \"recargar\" de su navegador. Por favor, "
+"vuelva a enviarlo."
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:139
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:130
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130
+msgid "Save"
+msgstr "Guardar"
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:141
+msgid "Configuration saved."
+msgstr "Configuración guardada."
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:142
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:145
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:128
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:128
+msgid "Reload"
+msgstr "Recargar"
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:144
+msgid "Configuration reloaded."
+msgstr "Configuración recargada."
+
+#. Yes this is a hack.
+#. No it doesn't work on a text-mode browser.
+#. Fetching from the addressbook servlet
+#. with the correct parameters will kick off a
+#. config reload and fetch.
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139
+msgid ""
+"Subscriptions saved, updating addressbook from subscription sources now."
+msgstr ""
+"Suscripciones guardadas, actualizando la libreta de direcciones a partir de "
+"las fuentes de suscripción ahora."
+
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143
+msgid "Subscriptions saved."
+msgstr "Suscripciones guardadas."
+
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147
+msgid "Subscriptions reloaded."
+msgstr "Suscripciones recargadas."
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:125
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:145
+msgid "addressbook"
+msgstr "libreta de direcciones"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:127
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:104
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:93
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:104
+msgid "addressbooks"
+msgstr "libretas de direcciones"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:129
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:106
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:95
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:106
+msgid "private"
+msgstr "privado"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:131
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:108
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:97
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:108
+msgid "master"
+msgstr "maestro"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:133
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:110
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:99
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:110
+msgid "router"
+msgstr "router"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:135
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:112
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:101
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:112
+msgid "published"
+msgstr "publicado"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:137
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:114
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:103
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:102
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:114
+msgid "subscriptions"
+msgstr "suscripciones"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:139
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:102
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:116
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:105
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:116
+msgid "configuration"
+msgstr "configuración"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:141
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:118
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:107
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:118
+msgid "overview"
+msgstr "resumen"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:163
+msgid "Filter"
+msgstr "Filtro"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:166
+msgid "all"
+msgstr "todos"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:177
+msgid "Current filter"
+msgstr "Filtro actual"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:182
+msgid "clear filter"
+msgstr "filtro actual"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:224
+msgid "Name"
+msgstr "Nombre"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:226
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:362
+msgid "Destination"
+msgstr "Destino"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:257
+msgid "Mark for deletion"
+msgstr "Marcar para eliminar"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:279
+msgid "address helper link"
+msgstr "ayudante de dirección del enlace"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:312
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:345
+msgid "This addressbook is empty."
+msgstr "Esta libreta de direcciones está vacía."
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:356
+msgid "Add new destination"
+msgstr "Añadir nuevo destino"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:358
+msgid "Hostname"
+msgstr "Nombre de Host"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:132
+msgid "Hints"
+msgstr "Consejos"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134
+msgid ""
+"File and directory paths here are relative to the addressbook's working "
+"directory, which is normally ~/.i2p/addressbook/ (Linux) or "
+"%APPDATA%\\I2P\\addressbook\\ (Windows)."
+msgstr ""
+"Las rutas de archivos y de directorios mostradas aquí son relativas al "
+"directorio de trabajo de la libreta de direcciones, que es normalmente "
+"~/.i2p/addressbook/ (Linux) o %APPDATA%\\I2P\\addressbook\\ (Windows)."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136
+msgid ""
+"If you want to manually add lines to an addressbook, add them to the private"
+" or master addressbooks."
+msgstr ""
+"Si desea agregar manualmente líneas a una libreta de direcciones, añadalos a"
+" la libreta de direcciones privada o maestra."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:138
+msgid ""
+"The router addressbook and the published addressbook are updated by the "
+"addressbook application."
+msgstr ""
+"La libreta de direcciones del router y la libreta de direcciones publicada "
+"son actualizadas por la aplicación libreta de direcciones."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140
+msgid ""
+"When you publish your addressbook, ALL destinations from the master and "
+"router addressbooks appear there."
+msgstr ""
+"Al publicar su libro de direcciones, TODOS los destinos de la libreta "
+"maestra y la libreta de direcciones del router aparecen ahí."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:142
+msgid ""
+"Use the private addressbook for private destinations, these are not "
+"published."
+msgstr ""
+"Utilice la libreta de direcciones privada para destinos privados, éstos no "
+"serán publicados."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144
+msgid "Options"
+msgstr "Opciones"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146
+msgid "File containing the list of subscriptions URLs (no need to change)"
+msgstr ""
+"El archivo que contiene la lista de suscripciones URL (no es necesario "
+"cambiarlo)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148
+msgid "Update interval in hours"
+msgstr "Intervalo de actualización en horas"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150
+msgid ""
+"Your public hosts.txt file (choose a path within your webserver document "
+"root)"
+msgstr ""
+"Su archivo hosts.txt público (elija una ruta dentro de la raíz de la "
+"documentación de su servidor web)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152
+msgid "Your hosts.txt (don't change)"
+msgstr "Su hosts.txt (no cambiar)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:154
+msgid "Your personal addressbook, these hosts will be published"
+msgstr "Su libreta de direcciones personal, estos hosts serán publicados"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:156
+msgid "Your private addressbook, it is never published"
+msgstr "Su libreta de direcciones privada, nunca se publica"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:158
+msgid "Port for your eepProxy (no need to change)"
+msgstr "Puerto para su eepProxy (no es necesario cambiarlo)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160
+msgid "Hostname for your eepProxy (no need to change)"
+msgstr "Nombre de la host para su eepProxy (no es necesario cambiarlo)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:162
+msgid "Whether to update the published addressbook"
+msgstr "Sea para actualizar la libreta de direcciones publicadas"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164
+msgid ""
+"File containing the etags header from the fetched subscription URLs (no need"
+" to change)"
+msgstr ""
+"Archivo que contiene la cabecera de los etags desde la URL de subscripciones"
+" capturada  (no es necesario cambiarlo)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166
+msgid ""
+"File containing the modification timestamp for each fetched subscription URL"
+" (no need to change)"
+msgstr ""
+"Archivo que contiene la fecha y hora de modificación para cada URL de "
+"suscripción capturada (no es necesario cambiarlo)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:168
+msgid "File to log activity to (change to /dev/null if you like)"
+msgstr ""
+"El archivo en el que se guarda el registro de actividad (cambielo a "
+"/dev/null si quiere)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:91
+msgid "Introduction"
+msgstr "Introducción"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:109
+msgid "What is the addressbook?"
+msgstr "¿Qué es la libreta de direcciones?"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:111
+msgid "The addressbook application is part of your i2p installation."
+msgstr ""
+"La aplicación de libreta de direcciones es parte de la instalación I2P."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113
+msgid ""
+"It regularly updates your hosts.txt file from distributed sources or "
+"\"subscriptions\"."
+msgstr ""
+"Actualiza constantemente su archivo hosts.txt desde fuentes distribuidas o "
+"\"suscripciones\"."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115
+msgid ""
+"In the default configuration, the addressbook is only subscribed to "
+"www.i2p2.i2p."
+msgstr ""
+"Con la configuración predeterminada, la libreta de direcciones sólo está "
+"suscrita a www.i2p2.i2p."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:117
+msgid ""
+"Subscribing to additional sites is easy, just add them to your <a "
+"href=\"subscriptions.jsp\">subscriptions</a> file."
+msgstr ""
+"Suscribirse a otros sitios es fácil, sólo tiene que añadirlos a su archivo "
+"de <a href=\"subscriptions.jsp\">suscripciones</a>."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119
+msgid ""
+"For more information on naming in i2p, see <a "
+"href=\"http://www.i2p2.i2p/naming.html\">the overview on www.i2p2.i2p</a>."
+msgstr ""
+"Para obtener más información sobre los nombres en I2P, consulte <a "
+"href=\"http://www.i2p2.i2p/naming.html\">la información general en "
+"www.i2p2.i2p</a> ."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121
+msgid "How does the addressbook work?"
+msgstr "¿Cómo funciona la libreta de direcciones?"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123
+msgid ""
+"The addressbook application regularly polls your subscriptions and merges "
+"their content into your \"router\" addressbook, stored in the hosts.txt "
+"file."
+msgstr ""
+"La aplicación de libreta de direcciones comprueba periódicamente sus "
+"suscripciones y funde su contenido con la libreta de direcciones de su "
+"\"router\" almacenada en el archivo hosts.txt."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125
+msgid ""
+"Then it merges your \"master\" addressbook (userhosts.txt) into the router "
+"addressbook as well."
+msgstr ""
+"Luego también une su libreta de direcciones \"maestra\" (userhosts.txt) con "
+"la libreta de direcciones del router."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127
+msgid ""
+"If configured, the router addressbook is now written to the \"published\" "
+"addressbook, which will be publicly available if you are running an eepsite."
+msgstr ""
+"Si está configurada, la libreta de direcciones del router ahora se escribirá"
+" a la libreta \"publicada\", que estará disponible al público si está "
+"ejecutando un eepsite."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129
+msgid ""
+"The router also uses a private addressbook (privatehosts.txt, not shown in "
+"the picture), which is not merged or published."
+msgstr ""
+"El router también utiliza una libreta de direcciones privadas "
+"(privatehosts.txt, no se muestra en la imagen), que ni se fusiona ni es "
+"publicada."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131
+msgid ""
+"Hosts in the private addressbook can be accessed by you but their addresses "
+"are never distributed to others."
+msgstr ""
+"Puede visitar a los hosts que aparecen en su libreta de direcciones privada,"
+" pero su dirección no se distribuye a terceros."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:133
+msgid ""
+"The private addressbook can also be used for aliases of hosts in your other "
+"addressbooks."
+msgstr ""
+"La libreta de direcciones privada también se pueden utilizar para alias de "
+"los hosts en sus otras libretas de direcciones."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132
+msgid "The subscription file contains a list of i2p URLs."
+msgstr "El archivo de suscripción contiene una lista de URLs I2P."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134
+msgid ""
+"The addressbook application regularly checks this list for new eepsites."
+msgstr ""
+"La aplicación de libreta de direcciones comprueba regularmente esta lista en"
+" busca de nuevos eepsites."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136
+msgid "Those URLs refer to published hosts.txt files."
+msgstr "Esas URLs referencian a los archivos hosts.txt publicados."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138
+msgid ""
+"The default subscription is the hosts.txt from www.i2p2.i2p, which is "
+"updated infrequently."
+msgstr ""
+"La suscripción por defecto es el hosts.txt de www.i2p2.i2p, que se actualiza"
+" con poca frecuencia."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140
+msgid ""
+"So it is a good idea to add additional subscriptions to sites that have the "
+"latest addresses."
+msgstr ""
+"Por lo tanto, es una buena idea agregar suscripciones adicionales a sitios "
+"que ttengan las direcciones más recientes"
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142
+msgid "See the FAQ for a list of subscription URLs."
+msgstr ""
+"Ver las preguntas frecuentes para obtener una lista de direcciones URL de "
+"suscripciónes."
diff --git a/apps/susidns/locale/messages_fr.po b/apps/susidns/locale/messages_fr.po
new file mode 100644
index 0000000000000000000000000000000000000000..8d2c13c2984ca012fdfd7571e5a3c88c827f9e70
--- /dev/null
+++ b/apps/susidns/locale/messages_fr.po
@@ -0,0 +1,435 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the susidns package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P susidns\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-24 16:49+0000\n"
+"PO-Revision-Date: 2011-04-09 02:53+0100\n"
+"Last-Translator: magma <magma@mail.i2p>\n"
+"Language-Team: duck <duck@mail.i2p>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n >= 2)\n"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:197
+msgid "Search"
+msgstr "Chercher"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:204
+msgid "Search within filtered list"
+msgstr "Chercher dans la liste filtrée"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206
+msgid "Filtered list"
+msgstr "Liste filtrée"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:210
+msgid "no matches"
+msgstr "aucune correspondance"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:213
+msgid "Addressbook"
+msgstr "Le carnet d'adresses"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:215
+msgid "contains no entries"
+msgstr "est vide"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:217
+msgid "contains 1 entry"
+msgstr "contient 1 entrée"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:219
+#, java-format
+msgid "contains {0} entries"
+msgstr "contient {0} entrée(s)"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:229
+#, java-format
+msgid "Showing {0} of {1}"
+msgstr "Affichage {0} sur {1}"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368
+msgid "Add"
+msgstr "Ajouter"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:366
+msgid "Replace"
+msgstr "Remplacer"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264
+#, java-format
+msgid "Host name {0} is already in addressbook, unchanged."
+msgstr "L''hôte {0} est déjà présent: inchangé."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266
+#, java-format
+msgid "Host name {0} is already in addressbook with a different destination. Click \"Replace\" to overwrite."
+msgstr "L''hôte {0} est déjà présent avec une destination différente. Cliquez sur \"Remplacer\"...pour le remplacer."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278
+#, java-format
+msgid "Destination added for {0}."
+msgstr "Destination ajoutée pour {0}."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:280
+#, java-format
+msgid "Destination changed for {0}."
+msgstr "Destination modifiée pour {0}."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:285
+msgid "Invalid Base 64 destination."
+msgstr "Destination Base64 incorrecte."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:289
+msgid "Please enter a host name and destination"
+msgstr "Entrez un nom d'hôte et sa destination"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:293
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314
+msgid "Delete Selected"
+msgstr "Supprimer les éléments sélectionnés"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:303
+#, java-format
+msgid "Destination {0} deleted."
+msgstr "Destination {0} supprimée."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:305
+#, java-format
+msgid "{0} destinations deleted."
+msgstr "{0} destination(s) supprimée(s)."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:311
+msgid "Addressbook saved."
+msgstr "Carnet d'adresses enregistré."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:314
+msgid "ERROR: Could not write addressbook file."
+msgstr "ERREUR: impossible d'enregistrer le fichier carnet d'adresses."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:148
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151
+msgid "Invalid form submission, probably because you used the \"back\" or \"reload\" button on your browser. Please resubmit."
+msgstr "Soumission du formulaire incorrecte: vous avez peut-être utilisé le bouton \"Page précédente\" ou \"Recharger\". Merci de soumettre à nouveau."
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:139
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:130
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130
+msgid "Save"
+msgstr "Enregistrer"
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:141
+msgid "Configuration saved."
+msgstr "Configuration enregistrée."
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:142
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:145
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:128
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:128
+msgid "Reload"
+msgstr "Recharger"
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:144
+msgid "Configuration reloaded."
+msgstr "Configuration rechargée."
+
+#. Yes this is a hack.
+#. No it doesn't work on a text-mode browser.
+#. Fetching from the addressbook servlet
+#. with the correct parameters will kick off a
+#. config reload and fetch.
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139
+msgid "Subscriptions saved, updating addressbook from subscription sources now."
+msgstr "Souscriptions enregistrées, mise à jour en cours du carnet d'adresses à partir de celles-ci."
+
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143
+msgid "Subscriptions saved."
+msgstr "Souscription enregistrée."
+
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147
+msgid "Subscriptions reloaded."
+msgstr "Souscription rechargée."
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:125
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:145
+msgid "addressbook"
+msgstr "carnet d'adresses"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:127
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:104
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:93
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:104
+msgid "addressbooks"
+msgstr "carnets d'adresses"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:129
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:106
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:95
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:106
+msgid "private"
+msgstr "privé"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:131
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:108
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:97
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:108
+msgid "master"
+msgstr "principal"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:133
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:110
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:99
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:110
+msgid "router"
+msgstr "routeur"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:135
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:112
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:101
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:112
+msgid "published"
+msgstr "publié"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:137
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:114
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:103
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:102
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:114
+msgid "subscriptions"
+msgstr "souscriptions"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:139
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:102
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:116
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:105
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:116
+msgid "configuration"
+msgstr "configuration"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:141
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:118
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:107
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:118
+msgid "overview"
+msgstr "aperçu"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:163
+msgid "Filter"
+msgstr "Filtrer"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:166
+msgid "all"
+msgstr "tout"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:177
+msgid "Current filter"
+msgstr "Filtre courant"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:182
+msgid "clear filter"
+msgstr "effacer le filtre"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:224
+msgid "Name"
+msgstr "Nom"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:226
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:362
+msgid "Destination"
+msgstr "Destination"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:257
+msgid "Mark for deletion"
+msgstr "Marquer pour suppression"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:279
+msgid "address helper link"
+msgstr "lien d'aide d'adresse"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:312
+msgid "Cancel"
+msgstr "Annuler"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:345
+msgid "This addressbook is empty."
+msgstr "Ce carnet d'adresses est vide"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:356
+msgid "Add new destination"
+msgstr "Ajoutez une nouvelle destination"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:358
+msgid "Hostname"
+msgstr "Nom d'hôte"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:132
+msgid "Hints"
+msgstr "Aides"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134
+msgid "File and directory paths here are relative to the addressbook's working directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P\\addressbook\\ (Windows)."
+msgstr "Les chemins des fichiers et dossiers listés sont relatifs au répertoire de travail du carnet d'adresses, normalement ~/.i2p/addressbook/ (Linux) ou %APPDATA%\\I2P\\addressbook\\ (Windows)."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136
+msgid "If you want to manually add lines to an addressbook, add them to the private or master addressbooks."
+msgstr "si vous voulez ajouter manuellement des lignes dans un carnet d'adresses, faites-le dans le carnet privé ou principal."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:138
+msgid "The router addressbook and the published addressbook are updated by the addressbook application."
+msgstr "Le carnet d'adresses du routeur et le carnet d'adresses publié sont mis à jour par l'application carnet d'adresses."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140
+msgid "When you publish your addressbook, ALL destinations from the master and router addressbooks appear there."
+msgstr "Quand vous publiez votre carnet d'adresses, TOUTES les destinations des carnets principal et routeur le sont."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:142
+msgid "Use the private addressbook for private destinations, these are not published."
+msgstr "Utilisez le carnet d'adresses privé pour les destinations privées: elles ne seront pas publiées."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144
+msgid "Options"
+msgstr "Options"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146
+msgid "File containing the list of subscriptions URLs (no need to change)"
+msgstr "fichier contenant la liste des URLs de souscriptions (inutile de modifier)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148
+msgid "Update interval in hours"
+msgstr "Intervalle de mise à jour (en heures)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150
+msgid "Your public hosts.txt file (choose a path within your webserver document root)"
+msgstr "Votre fichier hosts.txt (choisissez un emplacement dans la racine de votre serveur web)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152
+msgid "Your hosts.txt (don't change)"
+msgstr "Votre hosts.txt (ne pas modifier)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:154
+msgid "Your personal addressbook, these hosts will be published"
+msgstr "Votre carnet d'adresses personnel: ces hôtes peuvent être publiés"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:156
+msgid "Your private addressbook, it is never published"
+msgstr "Votre carnet d'adresses privé n'est jamais publié"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:158
+msgid "Port for your eepProxy (no need to change)"
+msgstr "Port de votre proxy eep (inutile de modifier)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160
+msgid "Hostname for your eepProxy (no need to change)"
+msgstr "nom d'hôte de votre proxy eep (inutile de modifier)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:162
+msgid "Whether to update the published addressbook"
+msgstr "S'il faut actualiser le carnet d'adresses publié"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164
+msgid "File containing the etags header from the fetched subscription URLs (no need to change)"
+msgstr "Fichier contenant les en-têtes etag des URLs de souscription (inutile de changer)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166
+msgid "File containing the modification timestamp for each fetched subscription URL (no need to change)"
+msgstr "Fichier contenant les tampons horaires de modification de chaque URL de souscription importée (inutile de modifier)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:168
+msgid "File to log activity to (change to /dev/null if you like)"
+msgstr "Fichier d'historiques (modifiez en /dev/null si ça vous chante) "
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:91
+msgid "Introduction"
+msgstr "Introduction"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:109
+msgid "What is the addressbook?"
+msgstr "Qu'est-ce que le carnet d'adresses?"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:111
+msgid "The addressbook application is part of your i2p installation."
+msgstr "L'application carnet d'adresses fait partie intégrante de votre installation I2P."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113
+msgid "It regularly updates your hosts.txt file from distributed sources or \"subscriptions\"."
+msgstr "Elle actualise votre fichier hosts.txt à intervalle régulier à partir de sources décentralisées (\"souscriptions\" ou \"abonnements\")"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115
+msgid "In the default configuration, the addressbook is only subscribed to www.i2p2.i2p."
+msgstr "Dans sa configuration par défaut, le carnet d'adresses est seulement abonné à www.i2p2.i2p."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:117
+msgid "Subscribing to additional sites is easy, just add them to your <a href=\"subscriptions.jsp\">subscriptions</a> file."
+msgstr "La souscription à des sites supplémentaires est aisée:  ajoutez-les simplement à votre fichier de <a href=\"subscriptions.jsp\">souscriptions</a> ."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119
+msgid "For more information on naming in i2p, see <a href=\"http://www.i2p2.i2p/naming.html\">the overview on www.i2p2.i2p</a>."
+msgstr "Plus d'infos sur <a href=\"http://www.i2p2.i2p/techintro_fr.html#app.naming\">le nommage dans I2P</a>."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121
+msgid "How does the addressbook work?"
+msgstr "Fonctionnement du carnet d'adresses."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123
+msgid "The addressbook application regularly polls your subscriptions and merges their content into your \"router\" addressbook, stored in the hosts.txt file."
+msgstr "L'application carnet d'adresses interroge vos souscriptions à intervalle régulier et fusionne leurs contenus dans le carnet d'adresses du \"routeur\", stocké dans le fichier hosts.txt."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125
+msgid "Then it merges your \"master\" addressbook (userhosts.txt) into the router addressbook as well."
+msgstr "Puis elle fusionne votre carnet d'adresses \"principal\" (userhosts.txt) dans celui du routeur. "
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127
+msgid "If configured, the router addressbook is now written to the \"published\" addressbook, which will be publicly available if you are running an eepsite."
+msgstr "Si c'est activé, le carnet du routeur est alors écrit dans le carnet d'adresses \"publié\" qui devient publiquement disponible si vous avez votre propre site eep."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129
+msgid "The router also uses a private addressbook (privatehosts.txt, not shown in the picture), which is not merged or published."
+msgstr "Le routeur utilise également un carnet privé (privatehosts.txt, non illustré), qui n'est ni fusionné ni publié."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131
+msgid "Hosts in the private addressbook can be accessed by you but their addresses are never distributed to others."
+msgstr "Les hôtes du carnet privé ne sont accessibles qu'à vous, et leurs adresses ne sont jamais distribuées à personne."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:133
+msgid "The private addressbook can also be used for aliases of hosts in your other addressbooks."
+msgstr "Le carnet privé peut aussi servir à stocker des alias/pseudos pour des hôtes des autres carnets."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132
+msgid "The subscription file contains a list of i2p URLs."
+msgstr "Le fichier de souscriptions contient une liste d'URLs I2P."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134
+msgid "The addressbook application regularly checks this list for new eepsites."
+msgstr "L'application vérifie régulièrement cette liste pour trouver de nouveaux sites eep."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136
+msgid "Those URLs refer to published hosts.txt files."
+msgstr "Ces URLs font référence aux fichiers hosts.txt des autres utilisateurs."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138
+msgid "The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently."
+msgstr "L'abonnement par défaut est le fichier hosts.txt de www.i2p2.i2p, mais il est très peu actualisé."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140
+msgid "So it is a good idea to add additional subscriptions to sites that have the latest addresses."
+msgstr "C'est donc une bonne idée d'ajouter des souscriptions supplémentaires à des sites qui disposent des dernières adresses."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142
+msgid "See the FAQ for a list of subscription URLs."
+msgstr "Voir la <a href=\"http://www.i2p2.i2p/faq_fr.html#subscriptions\">FAQ</a> pour une liste d'URLs de souscriptions."
+
diff --git a/apps/susidns/locale/messages_nl.po b/apps/susidns/locale/messages_nl.po
index 8f1c5b3c0ad6bf2f6578a6660c123a7d7af7e711..7664c92c895840a7ff1b95bb9ae686460e3648ba 100644
--- a/apps/susidns/locale/messages_nl.po
+++ b/apps/susidns/locale/messages_nl.po
@@ -6,16 +6,17 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: I2P susidns\n"
+"Project-Id-Version: I2P\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-17 15:05+0000\n"
-"PO-Revision-Date: 2010-06-15 11:22+0100\n"
-"Last-Translator: duck <duck@mail.i2p>\n"
-"Language-Team: duck <duck@mail.i2p>, monkeybrains <monkeybrains@mail.i2p>\n"
+"POT-Creation-Date: 2011-03-03 18:29+0000\n"
+"PO-Revision-Date: 2011-02-20 12:15+0000\n"
+"Last-Translator: ducki2p <ducki2p@gmail.com>\n"
+"Language-Team: Dutch <>\n"
+"Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Dutch\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
 #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200
 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193
diff --git a/apps/susidns/locale/messages_ru.po b/apps/susidns/locale/messages_ru.po
index 7e689c89ad8548e8be0f6adf8dce4b7f6911dcc8..22752452af5a79711fedc8756425d64b9470d4ab 100644
--- a/apps/susidns/locale/messages_ru.po
+++ b/apps/susidns/locale/messages_ru.po
@@ -8,125 +8,135 @@ msgid ""
 msgstr ""
 "Project-Id-Version: I2P susidns\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-25 21:15+0000\n"
+"POT-Creation-Date: 2011-03-03 18:29+0000\n"
 "PO-Revision-Date: 2010-05-25 21:43+0000\n"
 "Last-Translator: 4get <forget@mail.i2p>\n"
 "Language-Team: foo <foo@bar>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Poedit-Language: Russian\n"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:199
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200
 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193
 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:197
 msgid "Search"
 msgstr "Поиск"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:203
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:204
 msgid "Search within filtered list"
 msgstr "Поиск в отфильтрованном списке"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:205
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206
 msgid "Filtered list"
 msgstr "Отфильтрованный список"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:209
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:210
 msgid "no matches"
 msgstr "ничего не найдено"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:212
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:213
 msgid "Addressbook"
 msgstr "Адресная книга"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:214
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:215
 msgid "contains no entries"
 msgstr "не содержит записей"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:216
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:217
 msgid "contains 1 entry"
 msgstr "содержит одну запись"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:218
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:219
 #, java-format
 msgid "contains {0} entries"
 msgstr "содержит {0} записей"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:228
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:229
 #, java-format
 msgid "Showing {0} of {1}"
 msgstr "Показаны {0} из {1}"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:259
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260
 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368
 msgid "Add"
 msgstr "Добавить"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:259
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265
 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:366
 msgid "Replace"
 msgstr "Заменить"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:263
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264
 #, java-format
 msgid "Host name {0} is already in addressbook, unchanged."
 msgstr "Для узла {0} уже существует запись с совпадающим адресом назначения."
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266
 #, java-format
-msgid "Host name {0} is already in addressbook with a different destination. Click \"Replace\" to overwrite."
-msgstr "Для узла {0} уже существует запись с другим адресом назначения. Нажмите \"Заменить\" для перезаписи."
+msgid ""
+"Host name {0} is already in addressbook with a different destination. Click "
+"\"Replace\" to overwrite."
+msgstr ""
+"Для узла {0} уже существует запись с другим адресом назначения. Нажмите "
+"\"Заменить\" для перезаписи."
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:277
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278
 #, java-format
 msgid "Destination added for {0}."
 msgstr "Добавлен адрес для {0}."
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:279
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:280
 #, java-format
 msgid "Destination changed for {0}."
 msgstr "Заменён адрес для {0}."
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:284
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:285
 msgid "Invalid Base 64 destination."
 msgstr "Некорректный Base-64 адрес."
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:288
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:289
 msgid "Please enter a host name and destination"
 msgstr "Пожалуйста, введите имя узла и адрес назначения"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:292
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:293
 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314
 msgid "Delete Selected"
 msgstr "Удалить выделенное"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:302
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:303
 #, java-format
 msgid "Destination {0} deleted."
 msgstr "Адрес {0} удален."
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:304
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:305
 #, java-format
 msgid "{0} destinations deleted."
 msgstr "{0} адресов удалено."
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:310
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:311
 msgid "Addressbook saved."
 msgstr "Адресная книга сохранена."
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:313
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:314
 msgid "ERROR: Could not write addressbook file."
 msgstr "ОШИБКА: Не удалось сохранить файл адресной книги."
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:318
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319
 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:148
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:150
-msgid "Invalid form submission, probably because you used the \"back\" or \"reload\" button on your browser. Please resubmit."
-msgstr "Форма не принята, скорее всего это произошло из-за того, что Вы нажимали кнопку \"Назад\" или \"Обновить\" в браузере. Пожалуйста, заполните форму заново."
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151
+msgid ""
+"Invalid form submission, probably because you used the \"back\" or \"reload"
+"\" button on your browser. Please resubmit."
+msgstr ""
+"Форма не принята, скорее всего это произошло из-за того, что Вы нажимали "
+"кнопку \"Назад\" или \"Обновить\" в браузере. Пожалуйста, заполните форму "
+"заново."
 
 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:139
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:129
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:130
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130
 msgid "Save"
@@ -137,7 +147,7 @@ msgid "Configuration saved."
 msgstr "Настройки сохранены."
 
 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:142
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:144
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:145
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:128
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:128
 msgid "Reload"
@@ -147,15 +157,22 @@ msgstr "Перезагрузить"
 msgid "Configuration reloaded."
 msgstr "Настройки перезагружены."
 
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:138
-msgid "Subscriptions saved, updating addressbook from subscription sources now."
-msgstr "Подписки сохранены, запущена загрузка подписок и обновление адресной книги."
+#. Yes this is a hack.
+#. No it doesn't work on a text-mode browser.
+#. Fetching from the addressbook servlet
+#. with the correct parameters will kick off a
+#. config reload and fetch.
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139
+msgid ""
+"Subscriptions saved, updating addressbook from subscription sources now."
+msgstr ""
+"Подписки сохранены, запущена загрузка подписок и обновление адресной книги."
 
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:142
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143
 msgid "Subscriptions saved."
 msgstr "Подписки сохранены."
 
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:146
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147
 msgid "Subscriptions reloaded."
 msgstr "Подписки перезагружены."
 
@@ -276,24 +293,46 @@ msgid "Hints"
 msgstr "Примечания"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134
-msgid "File and directory paths here are relative to the addressbook's working directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P\\addressbook\\ (Windows)."
-msgstr "Пути указываются относительно домашней директории адресной книги, которая обычно расположена в ~/.i2p/addressbook/ (под Linux) или в %APPDATA%\\I2P\\addressbook\\ (под Windows)."
+msgid ""
+"File and directory paths here are relative to the addressbook's working "
+"directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P"
+"\\addressbook\\ (Windows)."
+msgstr ""
+"Пути указываются относительно домашней директории адресной книги, которая "
+"обычно расположена в ~/.i2p/addressbook/ (под Linux) или в %APPDATA%\\I2P"
+"\\addressbook\\ (под Windows)."
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136
-msgid "If you want to manually add lines to an addressbook, add them to the private or master addressbooks."
-msgstr "Если Вы хотите вручную добавлять записи в адресную книгу, то добавляйте их в «приватную» или «основную»."
+msgid ""
+"If you want to manually add lines to an addressbook, add them to the private "
+"or master addressbooks."
+msgstr ""
+"Если Вы хотите вручную добавлять записи в адресную книгу, то добавляйте их в "
+"«приватную» или «основную»."
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:138
-msgid "The router addressbook and the published addressbook are updated by the addressbook application."
-msgstr "Адресные книги «маршрутизатор» и «публикуемая» создаются/перезаписываются автоматически."
+msgid ""
+"The router addressbook and the published addressbook are updated by the "
+"addressbook application."
+msgstr ""
+"Адресные книги «маршрутизатор» и «публикуемая» создаются/перезаписываются "
+"автоматически."
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140
-msgid "When you publish your addressbook, ALL destinations from the master and router addressbooks appear there."
-msgstr "Когда Вы публикуете свою адресную книгу, то публикуются ВСЕ записи из адресных книг «основная» и «маршрутизатор»."
+msgid ""
+"When you publish your addressbook, ALL destinations from the master and "
+"router addressbooks appear there."
+msgstr ""
+"Когда Вы публикуете свою адресную книгу, то публикуются ВСЕ записи из "
+"адресных книг «основная» и «маршрутизатор»."
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:142
-msgid "Use the private addressbook for private destinations, these are not published."
-msgstr "Пользуйтесь «приватной» адресной книгой для адресов, которые Вы не хотите публиковать."
+msgid ""
+"Use the private addressbook for private destinations, these are not "
+"published."
+msgstr ""
+"Пользуйтесь «приватной» адресной книгой для адресов, которые Вы не хотите "
+"публиковать."
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144
 msgid "Options"
@@ -301,15 +340,20 @@ msgstr "Параметры"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146
 msgid "File containing the list of subscriptions URLs (no need to change)"
-msgstr "Файл для хранения списка URL подписок (перенастраивать нет необходимости)"
+msgstr ""
+"Файл для хранения списка URL подписок (перенастраивать нет необходимости)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148
 msgid "Update interval in hours"
 msgstr "Интервал обновления (часы)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150
-msgid "Your public hosts.txt file (choose a path within your webserver document root)"
-msgstr "hosts.txt для публикации (по умолчанию сохраняется в корневой директории встроенного в I2P маршутизатор вебсервера)"
+msgid ""
+"Your public hosts.txt file (choose a path within your webserver document "
+"root)"
+msgstr ""
+"hosts.txt для публикации (по умолчанию сохраняется в корневой директории "
+"встроенного в I2P маршутизатор вебсервера)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152
 msgid "Your hosts.txt (don't change)"
@@ -336,12 +380,20 @@ msgid "Whether to update the published addressbook"
 msgstr "Обновлять ли публикуемую адресную книгу (true/false)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164
-msgid "File containing the etags header from the fetched subscription URLs (no need to change)"
-msgstr "Файл для хранения etags-заголовков от загруженных адресов подписок (перенастраивать нет необходимости)"
+msgid ""
+"File containing the etags header from the fetched subscription URLs (no need "
+"to change)"
+msgstr ""
+"Файл для хранения etags-заголовков от загруженных адресов подписок "
+"(перенастраивать нет необходимости)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166
-msgid "File containing the modification timestamp for each fetched subscription URL (no need to change)"
-msgstr "Файл для хранения даты/времени модификации каждого загруженного адреса подписки (перенастраивать нет необходимости)"
+msgid ""
+"File containing the modification timestamp for each fetched subscription URL "
+"(no need to change)"
+msgstr ""
+"Файл для хранения даты/времени модификации каждого загруженного адреса "
+"подписки (перенастраивать нет необходимости)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:168
 msgid "File to log activity to (change to /dev/null if you like)"
@@ -360,68 +412,120 @@ msgid "The addressbook application is part of your i2p installation."
 msgstr "Адресная книга — это приложение в составе Вашего I2P маршрутизатора."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113
-msgid "It regularly updates your hosts.txt file from distributed sources or \"subscriptions\"."
-msgstr "Его задача регулярно пополнять Ваш hosts.txt адресами из настраиваемых источников («подписок»)."
+msgid ""
+"It regularly updates your hosts.txt file from distributed sources or "
+"\"subscriptions\"."
+msgstr ""
+"Его задача регулярно пополнять Ваш hosts.txt адресами из настраиваемых "
+"источников («подписок»)."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115
-msgid "In the default configuration, the addressbook is only subscribed to www.i2p2.i2p."
-msgstr "По умолчанию в адресной книге настроена лишь одна подписка — на www.i2p2.i2p."
+msgid ""
+"In the default configuration, the addressbook is only subscribed to www.i2p2."
+"i2p."
+msgstr ""
+"По умолчанию в адресной книге настроена лишь одна подписка — на www.i2p2.i2p."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:117
-msgid "Subscribing to additional sites is easy, just add them to your <a href=\"subscriptions.jsp\">subscriptions</a> file."
-msgstr "Добавить другие подписки просто, достаточно вписать их URL в <a href=\"subscriptions.jsp\">файл подписок</a>."
+msgid ""
+"Subscribing to additional sites is easy, just add them to your <a href="
+"\"subscriptions.jsp\">subscriptions</a> file."
+msgstr ""
+"Добавить другие подписки просто, достаточно вписать их URL в <a href="
+"\"subscriptions.jsp\">файл подписок</a>."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119
-msgid "For more information on naming in i2p, see <a href=\"http://www.i2p2.i2p/naming.html\">the overview on www.i2p2.i2p</a>."
-msgstr "Подробнее о механизме доменных имен в I2P читайте на странице <a href=\"http://www.i2p2.i2p/naming.html\">Naming in I2P</a>."
+msgid ""
+"For more information on naming in i2p, see <a href=\"http://www.i2p2.i2p/"
+"naming.html\">the overview on www.i2p2.i2p</a>."
+msgstr ""
+"Подробнее о механизме доменных имен в I2P читайте на странице <a href="
+"\"http://www.i2p2.i2p/naming.html\">Naming in I2P</a>."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121
 msgid "How does the addressbook work?"
 msgstr "Как работает адресная книга?"
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123
-msgid "The addressbook application regularly polls your subscriptions and merges their content into your \"router\" addressbook, stored in the hosts.txt file."
-msgstr "Адресная книга периодически опрашивает Ваши подписки и добавляет их содержимое в Вашу «маршрутизаторную» адресную книгу, которая хранится в файле hosts.txt."
+msgid ""
+"The addressbook application regularly polls your subscriptions and merges "
+"their content into your \"router\" addressbook, stored in the hosts.txt file."
+msgstr ""
+"Адресная книга периодически опрашивает Ваши подписки и добавляет их "
+"содержимое в Вашу «маршрутизаторную» адресную книгу, которая хранится в "
+"файле hosts.txt."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125
-msgid "Then it merges your \"master\" addressbook (userhosts.txt) into the router addressbook as well."
-msgstr "После этого туда добавляется содержимое Вашей «основной» адресной книги (userhosts.txt)."
+msgid ""
+"Then it merges your \"master\" addressbook (userhosts.txt) into the router "
+"addressbook as well."
+msgstr ""
+"После этого туда добавляется содержимое Вашей «основной» адресной книги "
+"(userhosts.txt)."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127
-msgid "If configured, the router addressbook is now written to the \"published\" addressbook, which will be publicly available if you are running an eepsite."
-msgstr "Если разрешена публикация, то «маршрутизаторная» адресная книга копируется в «публикуемую» адресную книгу. «Публикуемая» адресная книга доступна публично, если у Вас запущен Ваш I2P-сайт."
+msgid ""
+"If configured, the router addressbook is now written to the \"published\" "
+"addressbook, which will be publicly available if you are running an eepsite."
+msgstr ""
+"Если разрешена публикация, то «маршрутизаторная» адресная книга копируется в "
+"«публикуемую» адресную книгу. «Публикуемая» адресная книга доступна "
+"публично, если у Вас запущен Ваш I2P-сайт."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129
-msgid "The router also uses a private addressbook (privatehosts.txt, not shown in the picture), which is not merged or published."
-msgstr "Маршрутизатор также использует приватную адресную книгу (privatehosts.txt, на иллюстрации не показано), которая никуда не копируется и не публикуется."
+msgid ""
+"The router also uses a private addressbook (privatehosts.txt, not shown in "
+"the picture), which is not merged or published."
+msgstr ""
+"Маршрутизатор также использует приватную адресную книгу (privatehosts.txt, "
+"на иллюстрации не показано), которая никуда не копируется и не публикуется."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131
-msgid "Hosts in the private addressbook can be accessed by you but their addresses are never distributed to others."
-msgstr "Таким образом Вы можете пользоваться адресами из этой адресной книги, не раскрывая другим её содержимое."
+msgid ""
+"Hosts in the private addressbook can be accessed by you but their addresses "
+"are never distributed to others."
+msgstr ""
+"Таким образом Вы можете пользоваться адресами из этой адресной книги, не "
+"раскрывая другим её содержимое."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:133
-msgid "The private addressbook can also be used for aliases of hosts in your other addressbooks."
-msgstr "Приватную адресную книгу также удобно иcпользовать для хранения альтернативных/коротких адресов."
+msgid ""
+"The private addressbook can also be used for aliases of hosts in your other "
+"addressbooks."
+msgstr ""
+"Приватную адресную книгу также удобно иcпользовать для хранения "
+"альтернативных/коротких адресов."
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132
 msgid "The subscription file contains a list of i2p URLs."
 msgstr "Файл подписок содержит список i2p URL."
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134
-msgid "The addressbook application regularly checks this list for new eepsites."
-msgstr "Адресная книга периодически проверяет этот список на наличие новых адресов I2P-сайтов."
+msgid ""
+"The addressbook application regularly checks this list for new eepsites."
+msgstr ""
+"Адресная книга периодически проверяет этот список на наличие новых адресов "
+"I2P-сайтов."
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136
 msgid "Those URLs refer to published hosts.txt files."
 msgstr "Каждый URL указывает на опубликованный hosts.txt файл."
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138
-msgid "The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently."
-msgstr "По умолчанию в списке задана только ссылка на hosts.txt с www.i2p2.i2p, который обновляется очень редко."
+msgid ""
+"The default subscription is the hosts.txt from www.i2p2.i2p, which is "
+"updated infrequently."
+msgstr ""
+"По умолчанию в списке задана только ссылка на hosts.txt с www.i2p2.i2p, "
+"который обновляется очень редко."
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140
-msgid "So it is a good idea to add additional subscriptions to sites that have the latest addresses."
-msgstr "Поэтому не помешает дополнительно подписаться на hosts.txt с более часто обновляемых сайтов."
+msgid ""
+"So it is a good idea to add additional subscriptions to sites that have the "
+"latest addresses."
+msgstr ""
+"Поэтому не помешает дополнительно подписаться на hosts.txt с более часто "
+"обновляемых сайтов."
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142
 msgid "See the FAQ for a list of subscription URLs."
@@ -429,4 +533,3 @@ msgstr "В соответствующем разделе FAQ можно найт
 
 #~ msgid "Delete"
 #~ msgstr "Удалить"
-
diff --git a/apps/susidns/locale/messages_zh.po b/apps/susidns/locale/messages_zh.po
index ace16bf4b86971b824e8e90d8addeb32b9d11adf..52f1c37272b85595a6ebe9d65956f51450fc4e8c 100644
--- a/apps/susidns/locale/messages_zh.po
+++ b/apps/susidns/locale/messages_zh.po
@@ -1,132 +1,139 @@
-# I2P
-# Copyright (C) 2009 The I2P Project
-# This file is distributed under the same license as the susidns package.
-# To contribute translations, see http://www.i2p2.de/newdevelopers
-# foo <foo@bar>, 2009.
-#
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the susidns package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+# 
 msgid ""
 msgstr ""
 "Project-Id-Version: I2P susidns\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-05-29 02:35+0000\n"
+"POT-Creation-Date: 2011-03-03 18:29+0000\n"
 "PO-Revision-Date: 2010-05-29 12:51+0800\n"
 "Last-Translator: walking <walking@mail.i2p>\n"
 "Language-Team: foo <foo@bar>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Poedit-Language: Chinese\n"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:199
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200
 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193
 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:197
 msgid "Search"
 msgstr "搜索"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:203
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:204
 msgid "Search within filtered list"
 msgstr "在过滤结果中搜索"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:205
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206
 msgid "Filtered list"
 msgstr "过滤结果列表"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:209
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:210
 msgid "no matches"
 msgstr "无匹配项目"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:212
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:213
 msgid "Addressbook"
 msgstr "地址簿"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:214
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:215
 msgid "contains no entries"
 msgstr "包含 0 个项目"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:216
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:217
 msgid "contains 1 entry"
 msgstr "包含 1 个项目"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:218
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:219
 #, java-format
 msgid "contains {0} entries"
 msgstr "包含 {0} 个项目"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:228
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:229
 #, java-format
 msgid "Showing {0} of {1}"
 msgstr "显示 {0} 个项目共 {1}"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:259
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260
 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368
 msgid "Add"
 msgstr "添加"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:259
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265
 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:366
 msgid "Replace"
 msgstr "替换"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:263
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264
 #, java-format
 msgid "Host name {0} is already in addressbook, unchanged."
 msgstr "主机名称{0}已存在于地址簿中,本次操作未更新。"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266
 #, java-format
-msgid "Host name {0} is already in addressbook with a different destination. Click \"Replace\" to overwrite."
+msgid ""
+"Host name {0} is already in addressbook with a different destination. Click "
+"\"Replace\" to overwrite."
 msgstr "域名{0}已以不同目标密钥的存在于地址簿中,点击“替换”进行覆盖"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:277
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278
 #, java-format
 msgid "Destination added for {0}."
 msgstr "目标密钥已添加为{0}。"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:279
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:280
 #, java-format
 msgid "Destination changed for {0}."
 msgstr "目标已更新为{0}。"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:284
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:285
 msgid "Invalid Base 64 destination."
 msgstr "无效的Base64目标密钥"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:288
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:289
 msgid "Please enter a host name and destination"
 msgstr "请输入主机名称与目标"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:292
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:293
 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314
 msgid "Delete Selected"
 msgstr "删除选中项"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:302
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:303
 #, java-format
 msgid "Destination {0} deleted."
 msgstr "目标 {0} 已删除"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:304
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:305
 #, java-format
 msgid "{0} destinations deleted."
 msgstr "{0} 个目标已删除"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:310
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:311
 msgid "Addressbook saved."
 msgstr "地址簿已保存"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:313
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:314
 msgid "ERROR: Could not write addressbook file."
 msgstr "错误:无法写入地址簿文件"
 
-#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:318
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319
 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:148
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:150
-msgid "Invalid form submission, probably because you used the \"back\" or \"reload\" button on your browser. Please resubmit."
-msgstr "提交数据无效,可能的原因是您使用了浏览器中的“前进”或“后退”按钮造成会话过期,请重新提交。"
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151
+msgid ""
+"Invalid form submission, probably because you used the \"back\" or \"reload"
+"\" button on your browser. Please resubmit."
+msgstr ""
+"提交数据无效,可能的原因是您使用了浏览器中的“前进”或“后退”按钮造成会话过期,"
+"请重新提交。"
 
 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:139
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:129
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:130
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130
 msgid "Save"
@@ -137,7 +144,7 @@ msgid "Configuration saved."
 msgstr "配置已保存"
 
 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:142
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:144
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:145
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:128
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:128
 msgid "Reload"
@@ -147,15 +154,21 @@ msgstr "刷新"
 msgid "Configuration reloaded."
 msgstr "配置已重新载入"
 
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:138
-msgid "Subscriptions saved, updating addressbook from subscription sources now."
+#. Yes this is a hack.
+#. No it doesn't work on a text-mode browser.
+#. Fetching from the addressbook servlet
+#. with the correct parameters will kick off a
+#. config reload and fetch.
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139
+msgid ""
+"Subscriptions saved, updating addressbook from subscription sources now."
 msgstr "订阅已保存,正在通过订阅地址更新地址簿。"
 
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:142
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143
 msgid "Subscriptions saved."
 msgstr "订阅已保存。"
 
-#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:146
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147
 msgid "Subscriptions reloaded."
 msgstr "订阅设置已重新载入。"
 
@@ -276,23 +289,38 @@ msgid "Hints"
 msgstr "提示"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134
-msgid "File and directory paths here are relative to the addressbook's working directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P\\addressbook\\ (Windows)."
-msgstr "此处使用的路径是以地址簿工作目录为参照的相对路径,通常为 ~/.i2p/addressbook/ (Linux) 或 %APPDATA%\\I2P\\addressbook\\ (Windows)."
+msgid ""
+"File and directory paths here are relative to the addressbook's working "
+"directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P"
+"\\addressbook\\ (Windows)."
+msgstr ""
+"此处使用的路径是以地址簿工作目录为参照的相对路径,通常为 ~/.i2p/addressbook/ "
+"(Linux) 或 %APPDATA%\\I2P\\addressbook\\ (Windows)."
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136
-msgid "If you want to manually add lines to an addressbook, add them to the private or master addressbooks."
+msgid ""
+"If you want to manually add lines to an addressbook, add them to the private "
+"or master addressbooks."
 msgstr "如果您希望想地址簿手动添加地址条目,请将其加入私有地址簿或主地址簿。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:138
-msgid "The router addressbook and the published addressbook are updated by the addressbook application."
+msgid ""
+"The router addressbook and the published addressbook are updated by the "
+"addressbook application."
 msgstr "路由地址簿与已发布地址簿会由地址簿程序负责更新。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140
-msgid "When you publish your addressbook, ALL destinations from the master and router addressbooks appear there."
-msgstr "当您发布地址簿时,主地址簿与路由地址簿中的所有地址条目都会显示于已发布地址簿中。"
+msgid ""
+"When you publish your addressbook, ALL destinations from the master and "
+"router addressbooks appear there."
+msgstr ""
+"当您发布地址簿时,主地址簿与路由地址簿中的所有地址条目都会显示于已发布地址簿"
+"中。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:142
-msgid "Use the private addressbook for private destinations, these are not published."
+msgid ""
+"Use the private addressbook for private destinations, these are not "
+"published."
 msgstr "私有地址簿用来记录需要保密的私人目标,其中的条目不会被发布。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144
@@ -308,8 +336,11 @@ msgid "Update interval in hours"
 msgstr "更新周期(小时)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150
-msgid "Your public hosts.txt file (choose a path within your webserver document root)"
-msgstr "您发布的公开地址簿 hosts.txt (请指定为您Web服务器目录中的某个路径以便发布。)"
+msgid ""
+"Your public hosts.txt file (choose a path within your webserver document "
+"root)"
+msgstr ""
+"您发布的公开地址簿 hosts.txt (请指定为您Web服务器目录中的某个路径以便发布。)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152
 msgid "Your hosts.txt (don't change)"
@@ -336,11 +367,15 @@ msgid "Whether to update the published addressbook"
 msgstr "是否更新发布地址簿"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164
-msgid "File containing the etags header from the fetched subscription URLs (no need to change)"
+msgid ""
+"File containing the etags header from the fetched subscription URLs (no need "
+"to change)"
 msgstr "此文件含有订阅URL返回的etag头(无需修改)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166
-msgid "File containing the modification timestamp for each fetched subscription URL (no need to change)"
+msgid ""
+"File containing the modification timestamp for each fetched subscription URL "
+"(no need to change)"
 msgstr "此文件含有每个地址簿订阅URL上次获取时的修改时间(无需修改)"
 
 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:168
@@ -360,47 +395,80 @@ msgid "The addressbook application is part of your i2p installation."
 msgstr "地址簿程序是I2P安装程序的一部分。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113
-msgid "It regularly updates your hosts.txt file from distributed sources or \"subscriptions\"."
-msgstr "他通过分散的来源或称地址簿“订阅”(概念类似RSS)更新您的地址簿文件 host.txt。"
+msgid ""
+"It regularly updates your hosts.txt file from distributed sources or "
+"\"subscriptions\"."
+msgstr ""
+"他通过分散的来源或称地址簿“订阅”(概念类似RSS)更新您的地址簿文件 host.txt。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115
-msgid "In the default configuration, the addressbook is only subscribed to www.i2p2.i2p."
+msgid ""
+"In the default configuration, the addressbook is only subscribed to www.i2p2."
+"i2p."
 msgstr "默认设置中地址簿仅订阅 www.i2p2.i2p 的项目。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:117
-msgid "Subscribing to additional sites is easy, just add them to your <a href=\"subscriptions.jsp\">subscriptions</a> file."
-msgstr "订阅其他网站的地址簿也很简单,只需将它们加入 <a href=\"subscriptions.jsp\">订阅</a> 文件即可。"
+msgid ""
+"Subscribing to additional sites is easy, just add them to your <a href="
+"\"subscriptions.jsp\">subscriptions</a> file."
+msgstr ""
+"订阅其他网站的地址簿也很简单,只需将它们加入 <a href=\"subscriptions.jsp\">订"
+"阅</a> 文件即可。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119
-msgid "For more information on naming in i2p, see <a href=\"http://www.i2p2.i2p/naming.html\">the overview on www.i2p2.i2p</a>."
-msgstr "关于I2P网络域名系统的更多信息,参见 <a href=\"http://www.i2p2.i2p/naming.html\"> www.i2p2.i2p 网站上的“概述” </a>."
+msgid ""
+"For more information on naming in i2p, see <a href=\"http://www.i2p2.i2p/"
+"naming.html\">the overview on www.i2p2.i2p</a>."
+msgstr ""
+"关于I2P网络域名系统的更多信息,参见 <a href=\"http://www.i2p2.i2p/naming.html"
+"\"> www.i2p2.i2p 网站上的“概述” </a>."
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121
 msgid "How does the addressbook work?"
 msgstr "那么地址簿是如何工作的呢?"
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123
-msgid "The addressbook application regularly polls your subscriptions and merges their content into your \"router\" addressbook, stored in the hosts.txt file."
-msgstr "地址簿程序定期通过订阅的URL获取新的地址簿条目并将它们合并入您的“路由”地址簿中,保存与 hosts.txt 文件内。"
+msgid ""
+"The addressbook application regularly polls your subscriptions and merges "
+"their content into your \"router\" addressbook, stored in the hosts.txt file."
+msgstr ""
+"地址簿程序定期通过订阅的URL获取新的地址簿条目并将它们合并入您的“路由”地址簿"
+"中,保存与 hosts.txt 文件内。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125
-msgid "Then it merges your \"master\" addressbook (userhosts.txt) into the router addressbook as well."
+msgid ""
+"Then it merges your \"master\" addressbook (userhosts.txt) into the router "
+"addressbook as well."
 msgstr "随后他还会将您的“主要”地址簿(userhost.txt)合并入路由器地址簿。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127
-msgid "If configured, the router addressbook is now written to the \"published\" addressbook, which will be publicly available if you are running an eepsite."
-msgstr "如果启用了相关配置,路由器地址簿会写入您的“发布”地址簿中,如果您有自己的eepsite匿名站点,那么它可以通过您的站点公开发布。"
+msgid ""
+"If configured, the router addressbook is now written to the \"published\" "
+"addressbook, which will be publicly available if you are running an eepsite."
+msgstr ""
+"如果启用了相关配置,路由器地址簿会写入您的“发布”地址簿中,如果您有自己的"
+"eepsite匿名站点,那么它可以通过您的站点公开发布。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129
-msgid "The router also uses a private addressbook (privatehosts.txt, not shown in the picture), which is not merged or published."
-msgstr "路由器同时提供了私有地址簿(privatehost.txt,图片中为出现),其中的项目不会被合并或发布。"
+msgid ""
+"The router also uses a private addressbook (privatehosts.txt, not shown in "
+"the picture), which is not merged or published."
+msgstr ""
+"路由器同时提供了私有地址簿(privatehost.txt,图片中为出现),其中的项目不会被合并"
+"或发布。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131
-msgid "Hosts in the private addressbook can be accessed by you but their addresses are never distributed to others."
-msgstr "您可以访问私有地址簿中的网站,但它们的地址绝不会通过您的公开地址簿发布给别人。"
+msgid ""
+"Hosts in the private addressbook can be accessed by you but their addresses "
+"are never distributed to others."
+msgstr ""
+"您可以访问私有地址簿中的网站,但它们的地址绝不会通过您的公开地址簿发布给别"
+"人。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:133
-msgid "The private addressbook can also be used for aliases of hosts in your other addressbooks."
+msgid ""
+"The private addressbook can also be used for aliases of hosts in your other "
+"addressbooks."
 msgstr "私有地址簿还可以被用来设置网站别名。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132
@@ -408,7 +476,8 @@ msgid "The subscription file contains a list of i2p URLs."
 msgstr "订阅文件是一个I2P链接列表。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134
-msgid "The addressbook application regularly checks this list for new eepsites."
+msgid ""
+"The addressbook application regularly checks this list for new eepsites."
 msgstr "地址簿程序定期通过这些链接检查是否有新的I2P匿名网站。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136
@@ -416,17 +485,22 @@ msgid "Those URLs refer to published hosts.txt files."
 msgstr "这些URL指向公开发布的hosts.txt文件。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138
-msgid "The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently."
+msgid ""
+"The default subscription is the hosts.txt from www.i2p2.i2p, which is "
+"updated infrequently."
 msgstr "默认订阅是 www.i2p2.i2p 提供的 hosts.txt,此文件很少更新。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140
-msgid "So it is a good idea to add additional subscriptions to sites that have the latest addresses."
+msgid ""
+"So it is a good idea to add additional subscriptions to sites that have the "
+"latest addresses."
 msgstr "所以订阅一些网站的最新地址簿是个不错的主意。"
 
 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142
 msgid "See the FAQ for a list of subscription URLs."
-msgstr "其他来源的订阅链接参见I2P站点的 <a href=\"http://www.i2p2.i2p/faq_zh.html\">FAQ</a>"
+msgstr ""
+"其他来源的订阅链接参见I2P站点的 <a href=\"http://www.i2p2.i2p/faq_zh.html"
+"\">FAQ</a>"
 
 #~ msgid "Delete"
 #~ msgstr "删除"
-
diff --git a/apps/susidns/src/bmsg.sh b/apps/susidns/src/bmsg.sh
deleted file mode 100644
index b9d294b32336537241eb2f9953fb65673c93b524..0000000000000000000000000000000000000000
--- a/apps/susidns/src/bmsg.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Update messages_xx.po and messages_xx.class files,
-# from both java and jsp sources.
-# Requires installed programs xgettext, msgfmt, msgmerge, and find.
-# zzz - public domain
-#
-
-## launching sh.exe with -login parameter will open a shell with the current path always pointing to \bin\
-## need to cd into our orignal path - where we call sh.exe from.
-
-cd $CALLFROM
-## echo $PWD
-
-## except this everything is the same with bundle-message.sh
-## walking - public domain :-D
-
-source bundle-messages.sh $PARAS
\ No newline at end of file
diff --git a/apps/susidns/src/build.xml b/apps/susidns/src/build.xml
index 8244d37cfb7dc2d1ebad4a1e3390ec64cb7e6bf1..d2dc2f121b7383f03a905a30fba065563b03526d 100644
--- a/apps/susidns/src/build.xml
+++ b/apps/susidns/src/build.xml
@@ -23,13 +23,16 @@
         <pathelement location="../../../core/java/build/i2p.jar" />
  	</path>
 	<property name="javac.compilerargs" value="" />
+
  	<target name="compile">
 		<mkdir dir="${bin}" />
 		<javac debug="true" deprecation="on" source="1.5" target="1.5"
+			includeAntRuntime="false"
  			classpathref="cp" destdir="${bin}" srcdir="${src}" includes="**/*.java" >
 			<compilerarg line="${javac.compilerargs}" />
 		</javac>
 	</target>
+
     <target name="precompilejsp" unless="precompilejsp.uptodate">
         <delete file="WEB-INF/web-fragment.xml" />
         <delete file="WEB-INF/web-out.xml" />
@@ -47,6 +50,7 @@
             <arg value="./jsp" />
         </java>
         <javac debug="true" deprecation="on" source="1.5" target="1.5" 
+               includeAntRuntime="false"
                destdir="${bin}" srcdir="${tmp}" includes="**/*.java" classpathref="cp">
 		<compilerarg line="${javac.compilerargs}" />
          </javac>
@@ -61,8 +65,20 @@
         <srcfiles dir= "." includes="jsp/*.jsp, WEB-INF/web-template.xml"/>
     </uptodate>
 
-    <target name="all" depends="compile,precompilejsp,bundle,war"/> 
-    <target name="war"> 
+    <target name="all" depends="war"/> 
+
+    <target name="war" depends="compile, precompilejsp, bundle, warUpToDate" unless="war.uptodate" > 
+        <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="." />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
         <war destfile="${project}.war" webxml="WEB-INF/web-out.xml">
         	<fileset dir=".">
         		<include name="WEB-INF/**/*.class"/>
@@ -74,21 +90,32 @@
         		<include name="index.html"/>
         		<include name="WEB-INF/classes/${project}.properties"/>
         	</fileset>
+            <manifest>
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
+            </manifest>
         </war>
     </target>
 
+    <target name="warUpToDate">
+        <uptodate property="war.uptodate" targetfile="${project}.war">
+            <srcfiles dir= "." includes="WEB-INF/web-out.xml WEB-INF/**/*.class images/*.png css.css index.html WEB-INF/classes/${project}.properties" />
+        </uptodate>
+    </target>
+
     <target name="bundle" depends="compile, precompilejsp">
         <!-- Update the messages_*.po files.
              We need to supply the bat file for windows, and then change the fail property to true -->
-        <exec executable="sh" osfamily="unix" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="unix" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="sh" osfamily="mac" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="mac" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="false" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+		<!-- multi-lang is optional -->
+        <exec executable="sh" osfamily="windows" failifexecutionfails="false" >
+            <arg value="./bundle-messages.sh" />
         </exec>
     </target>
 
@@ -102,9 +129,8 @@
             <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="true" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
     </target>
diff --git a/apps/susidns/src/bundle-messages.bat b/apps/susidns/src/bundle-messages.bat
deleted file mode 100644
index 90feca972a6457eebf97f9bdbea6028ac88d7789..0000000000000000000000000000000000000000
--- a/apps/susidns/src/bundle-messages.bat
+++ /dev/null
@@ -1,26 +0,0 @@
-@echo off
-set Callfrom=%cd%
-set Paras=%1
-
-rem before calling make sure you have msys and mingw 's "bin" path 
-rem in your current searching path
-rem type "set path" to check 
-if not exist ..\locale\*.only goto updateALL
-
-rem put a messages_xx.only(eg messages_zh.only) into locale folder
-rem this script will only touch the po file(eg zh) you specified, leaving other po files untact.
-
-for %%i in (..\locale\*.only) do set PO=%%~ni
-echo [Notice] Yu choose to Ony update the choosen file: %PO%.po 
-for %%i in (..\locale\*.po) do if not %%~ni==%PO% ren %%i %%~ni.po-
-
-call sh --login %cd%\bmsg.sh
-
-for %%i in (..\locale\*.po-) do if not %%~ni==%PO% ren %%i %%~ni.po
-goto end
-
-:updateALL
-call sh --login %cd%\bmsg.sh
-
-:end
-echo End of Message Bundling
\ No newline at end of file
diff --git a/apps/susidns/src/bundle-messages.sh b/apps/susidns/src/bundle-messages.sh
index b1cd377b3ff9511229b49b14cd43370047f48973..349eb3f1db83ffe33ca0e267cdf9ef57417f0f30 100755
--- a/apps/susidns/src/bundle-messages.sh
+++ b/apps/susidns/src/bundle-messages.sh
@@ -18,6 +18,14 @@ then
 	POUPDATE=1
 fi
 
+# on windows, one must specify the path of commnad find
+# since windows has its own retarded version of find.
+if which find|grep -q -i windows ; then
+	export PATH=.:/bin:/usr/local/bin:$PATH
+fi
+# Fast mode - update ondemond
+# set LG2 to the language you need in envrionment varibales to enable this
+
 # add ../src/ so the refs will work in the po file
 JPATHS="../src/java/ ../src/tmp/"
 for i in ../locale/messages_*.po
@@ -26,6 +34,11 @@ do
 	LG=${i#../locale/messages_}
 	LG=${LG%.po}
 
+	# skip, if specified
+	if [ $LG2 ]; then
+		[ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only.
+	fi
+
 	if [ "$POUPDATE" = "1" ]
 	then
 		# make list of java files newer than the .po file
@@ -72,15 +85,19 @@ do
 		touch $i
 	fi
 
-	echo "Generating ${CLASS}_$LG ResourceBundle..."
+    if [ "$LG" != "en" ]
+    then
+        # only generate for non-source language
+        echo "Generating ${CLASS}_$LG ResourceBundle..."
 
-	# convert to class files in build/obj
-	msgfmt --java --statistics -r $CLASS -l $LG -d WEB-INF/classes $i
-	if [ $? -ne 0 ]
-	then
-		echo 'Warning - msgfmt failed, not updating translations'
-		break
-	fi
+        # convert to class files in build/obj
+        msgfmt --java --statistics -r $CLASS -l $LG -d WEB-INF/classes $i
+        if [ $? -ne 0 ]
+        then
+            echo 'Warning - msgfmt failed, not updating translations'
+            break
+        fi
+    fi
 done
 rm -f $TMPFILE
 # todo: return failure
diff --git a/apps/susidns/src/images/how_fr.png b/apps/susidns/src/images/how_fr.png
new file mode 100644
index 0000000000000000000000000000000000000000..43da5d091e98e8a034b523799d89976080c4a981
Binary files /dev/null and b/apps/susidns/src/images/how_fr.png differ
diff --git a/apps/susimail/build.xml b/apps/susimail/build.xml
index 9ab38ce42e60e352ced5472c0fe28b2c60c9362e..b38edf9b9ad9ffa1a8be29e232e337bdf4c66d31 100644
--- a/apps/susimail/build.xml
+++ b/apps/susimail/build.xml
@@ -10,6 +10,7 @@
         <javac 
             srcdir="./src/src"
             debug="true" deprecation="off" source="1.5" target="1.5" 
+            includeAntRuntime="false"
             destdir="./src/WEB-INF/classes">
             <compilerarg line="${javac.compilerargs}" />
             <classpath>
@@ -20,11 +21,66 @@
         </javac>
     </target>
     <target name="jar" depends="compile, war" />
-    <target name="war" depends="compile">
+
+    <target name="war" depends="compile, bundle, warUpToDate" unless="war.uptodate" >
+        <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="." />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
         <war destfile="susimail.war" webxml="src/WEB-INF/web.xml"
              basedir="src/" excludes="WEB-INF/web.xml LICENSE src/**/*">
+            <manifest>
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
+            </manifest>
         </war>
     </target>
+
+    <target name="warUpToDate">
+        <uptodate property="war.uptodate" targetfile="susimail.war">
+            <srcfiles dir= "src" excludes="LICENSE src/**/*" />
+        </uptodate>
+    </target>
+
+    <target name="bundle" depends="compile">
+        <!-- Update the messages_*.po files.
+             We need to supply the bat file for windows, and then change the fail property to true -->
+        <exec executable="sh" osfamily="unix" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
+        </exec>
+        <exec executable="sh" osfamily="mac" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
+        </exec>
+        <!-- multi-lang is optional -->
+        <exec executable="sh" osfamily="windows" failifexecutionfails="false" >
+            <arg value="./bundle-messages.sh" />
+        </exec>
+    </target>
+
+    <target name="poupdate" depends="builddep, compile">
+        <!-- Update the messages_*.po files.  -->
+        <exec executable="sh" osfamily="unix" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
+            <arg value="-p" />
+        </exec>
+        <exec executable="sh" osfamily="mac" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
+            <arg value="-p" />
+        </exec>
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
+            <arg value="-p" />
+        </exec>
+    </target>
+
     <target name="javadoc">
         <mkdir dir="./build" />
         <mkdir dir="./build/javadoc" />
diff --git a/apps/susimail/bundle-messages.sh b/apps/susimail/bundle-messages.sh
new file mode 100644
index 0000000000000000000000000000000000000000..10b6f150abc9b2517f448f55a6c4f689dd553151
--- /dev/null
+++ b/apps/susimail/bundle-messages.sh
@@ -0,0 +1,102 @@
+#
+# Update messages_xx.po and messages_xx.class files,
+# from both java and jsp sources.
+# Requires installed programs xgettext, msgfmt, msgmerge, and find.
+#
+# usage:
+#    bundle-messages.sh (generates the resource bundle from the .po file)
+#    bundle-messages.sh -p (updates the .po file from the source tags, then generates the resource bundle)
+#
+# zzz - public domain
+#
+CLASS=i2p.susi.webmail.messages
+TMPFILE=javafiles.txt
+export TZ=UTC
+
+if [ "$1" = "-p" ]
+then
+	POUPDATE=1
+fi
+
+# on windows, one must specify the path of commnad find
+# since windows has its own retarded version of find.
+if which find|grep -q -i windows ; then
+	export PATH=.:/bin:/usr/local/bin:$PATH
+fi
+# Fast mode - update ondemond
+# set LG2 to the language you need in envrionment varibales to enable this
+
+# add ../java/ so the refs will work in the po file
+JPATHS="src"
+for i in locale/messages_*.po
+do
+	# get language
+	LG=${i#locale/messages_}
+	LG=${LG%.po}
+
+	# skip, if specified
+	if [ $LG2 ]; then
+		[ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only.
+	fi
+
+	if [ "$POUPDATE" = "1" ]
+	then
+		# make list of java files newer than the .po file
+		find $JPATHS -name *.java -newer $i > $TMPFILE
+	fi
+
+	if [ -s src/WEB-INF/classes/i2p/susi/webmail/messages_$LG.class -a \
+	     src/WEB-INF/classes/i2p/susi/webmail/messages_$LG.class -nt $i -a \
+	     ! -s $TMPFILE ]
+	then
+		continue
+	fi
+
+	if [ "$POUPDATE" = "1" ]
+	then
+        echo "Updating the $i file from the tags..."
+		# extract strings from java and jsp files, and update messages.po files
+		# translate calls must be one of the forms:
+		# _("foo")
+		# _x("foo")
+		# To start a new translation, copy the header from an old translation to the new .po file,
+		# then ant distclean poupdate.
+		find $JPATHS -name *.java > $TMPFILE
+		xgettext -f $TMPFILE -F -L java --from-code=UTF-8 --add-comments\
+	                 --keyword=_ --keyword=_x \
+		         -o ${i}t
+		if [ $? -ne 0 ]
+		then
+			echo 'Warning - xgettext failed, not updating translations'
+			rm -f ${i}t
+			break
+		fi
+		msgmerge -U --backup=none $i ${i}t
+		if [ $? -ne 0 ]
+		then
+			echo 'Warning - msgmerge failed, not updating translations'
+			rm -f ${i}t
+			break
+		fi
+		rm -f ${i}t
+		# so we don't do this again
+		touch $i
+	fi
+
+    if [ "$LG" != "en" ]
+    then
+        # only generate for non-source language
+        echo "Generating ${CLASS}_$LG ResourceBundle..."
+
+        # convert to class files in build/obj
+        msgfmt --java --statistics -r $CLASS -l $LG -d src/WEB-INF/classes $i
+        if [ $? -ne 0 ]
+        then
+            echo 'Warning - msgfmt failed, not updating translations'
+            break
+        fi
+    fi
+done
+rm -f $TMPFILE
+# todo: return failure
+exit 0
diff --git a/apps/susimail/locale/messages_de.po b/apps/susimail/locale/messages_de.po
new file mode 100644
index 0000000000000000000000000000000000000000..f00349039f89807ccdccbae0dfe84901941d030a
--- /dev/null
+++ b/apps/susimail/locale/messages_de.po
@@ -0,0 +1,441 @@
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P susimail\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-12 22:04+0000\n"
+"PO-Revision-Date: 2011-03-13 12:31+0100\n"
+"Last-Translator: mixxy <m1xxy@mail.i2p>\n"
+"Language-Team: mixxy <m1xxy@mail.i2p>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: src/src/i2p/susi/webmail/WebMail.java:454
+msgid "unknown"
+msgstr "unbekannt"
+
+#: src/src/i2p/susi/webmail/WebMail.java:473
+msgid "Warning: no transfer encoding found, fallback to 7bit."
+msgstr "Warnung: keine Übertragungskodierung gefunden, Rückgriff auf 7-bit"
+
+#: src/src/i2p/susi/webmail/WebMail.java:478
+#, java-format
+msgid "No encoder found for encoding \\''{0}\\''."
+msgstr "kein Kodierer für Kodierung \\''{0}\\'' gefunden"
+
+#: src/src/i2p/susi/webmail/WebMail.java:484
+msgid "Warning: no charset found, fallback to US-ASCII."
+msgstr "Warnung: kein Zeichensatz gefunden; Rückgriff auf US-ASCII"
+
+#: src/src/i2p/susi/webmail/WebMail.java:498
+#, java-format
+msgid "Charset \\''{0}\\'' not supported."
+msgstr "Zeichensatz \\''{0}\\'' nicht unterstützt"
+
+#: src/src/i2p/susi/webmail/WebMail.java:502
+#, java-format
+msgid "Part ({0}) not shown, because of {1}"
+msgstr "Teil ({0}) aufgrund von {1} nicht angezeigt"
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+msgid "Download"
+msgstr "Herunterladen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+msgid "File is packed into a zipfile for security reasons."
+msgstr "Die Datei wurde aus Sicherheitsgründen in ein Zip-Archiv gepackt."
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+#, java-format
+msgid "attachment ({0})."
+msgstr "Anhang ({0})."
+
+#: src/src/i2p/susi/webmail/WebMail.java:529
+#, java-format
+msgid "Attachment ({0})."
+msgstr "Anhang ({0})."
+
+#: src/src/i2p/susi/webmail/WebMail.java:579
+msgid "Need username for authentication."
+msgstr "Benutzername zur Authentifizierung benötigt"
+
+#: src/src/i2p/susi/webmail/WebMail.java:583
+msgid "Need password for authentication."
+msgstr "Passwort zur Authentifizierung benötigt"
+
+#: src/src/i2p/susi/webmail/WebMail.java:587
+msgid "Need hostname for connect."
+msgstr "Host-Name für die Verbindung benötigt"
+
+#: src/src/i2p/susi/webmail/WebMail.java:592
+msgid "Need port number for pop3 connect."
+msgstr "POP3-Port für die Verbindung benötigt"
+
+#: src/src/i2p/susi/webmail/WebMail.java:599
+msgid "POP3 port number is not in range 0..65535."
+msgstr "Der POP3-Port liegt nicht im Bereich 0-65535."
+
+#: src/src/i2p/susi/webmail/WebMail.java:605
+msgid "POP3 port number is invalid."
+msgstr "ungültiger POP3-Port"
+
+#: src/src/i2p/susi/webmail/WebMail.java:611
+msgid "Need port number for smtp connect."
+msgstr "SMTP-Port für die SMTP-Verbindung benötigt"
+
+#: src/src/i2p/susi/webmail/WebMail.java:618
+msgid "SMTP port number is not in range 0..65535."
+msgstr "Der SMTP-Port liegt nicht im Bereich 0-65535."
+
+#: src/src/i2p/susi/webmail/WebMail.java:624
+msgid "SMTP port number is invalid."
+msgstr "ungültiger SMTP-Port"
+
+#: src/src/i2p/susi/webmail/WebMail.java:671
+msgid "User logged out."
+msgstr "Benutzer wurde abgemeldet"
+
+#: src/src/i2p/susi/webmail/WebMail.java:675
+msgid "Internal error, lost connection."
+msgstr "interner Fehler; Verbindung unterbrochen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:771
+#, java-format
+msgid "On {0} {1} wrote:"
+msgstr "Am {0} schrieb {1}:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:818
+msgid "begin forwarded mail"
+msgstr "Anfang weitergeleiteter Nachricht"
+
+#: src/src/i2p/susi/webmail/WebMail.java:840
+msgid "end forwarded mail"
+msgstr "Ende weitergeleiteter Nachricht"
+
+#: src/src/i2p/susi/webmail/WebMail.java:847
+#: src/src/i2p/susi/webmail/WebMail.java:1701
+msgid "Could not fetch mail body."
+msgstr "konnte den Körper der Nachricht nicht holen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:875
+msgid "Message id not valid."
+msgstr "ungültige Nachrichten-ID"
+
+#: src/src/i2p/susi/webmail/WebMail.java:958
+#, java-format
+msgid "No Encoding found for {0}"
+msgstr "keine Kodierung für {0} gefunden"
+
+#: src/src/i2p/susi/webmail/WebMail.java:962
+#, java-format
+msgid "Could not encode data: {0}"
+msgstr "Konte Daten nicht kodieren: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:967
+#, java-format
+msgid "Error reading uploaded file: {0}"
+msgstr "Fehler beim Lesen der hochzuladenen Datei: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1045
+msgid "Error parsing download parameter."
+msgstr "Fehler beim Parsen des Download-Parameters"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1089
+msgid "Invalid pagesize number, resetting to default value."
+msgstr "ungültige Seitengröße, wird auf Standardwert zurückgesetzt"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1113
+msgid "No messages marked for deletion."
+msgstr "Keine Nachrichten zum Löschen markiert"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1133
+#, java-format
+msgid "Error deleting message: {0}"
+msgstr "Fehler beim Löschen der Nachricht: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1144
+#, java-format
+msgid "1 message deleted."
+msgid_plural "{0} messages deleted."
+msgstr[0] "Eine Nachricht gelöscht"
+msgstr[1] "{0} Nachrichten gelöscht"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1264
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Login"
+msgstr "Anmelden"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1266
+#, java-format
+msgid "1 Message"
+msgid_plural "{0} Messages"
+msgstr[0] "Eine Nachricht"
+msgstr[1] "{0} Nachrichten"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1268
+msgid "Show Message"
+msgstr "Nachricht anzeigen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1325
+#, java-format
+msgid "Error decoding content: {0}"
+msgstr "Fehler beim Dekodieren des Inhalts: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1330
+msgid "Error decoding content: No encoder found."
+msgstr "Fehler bei der Dekodierung: kein Kodierer gefunden"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1377
+msgid "no subject"
+msgstr "kein Betreff"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1394
+msgid "Found no valid sender address."
+msgstr "Keine gültige Absenderadresse vorgefunden"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1400
+#, java-format
+msgid "Found no valid address in \\''{0}\\''."
+msgstr "keine gültige Adresse in \\''{0}\\''"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1419
+msgid "No recipients found."
+msgstr "Keine Empfänger gefunden"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1426
+msgid "Quoted printable encoder not available."
+msgstr "Der angegebene druckbare Kodierer ist nicht verfügbar."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1431
+msgid "Header line encoder not available."
+msgstr "Kodierer für die Kopfzeilen nicht verfügbar"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1482
+msgid "Mail sent."
+msgstr "Mail versandt."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1519
+msgid "Send"
+msgstr "Senden"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1520
+msgid "Cancel"
+msgstr "Abbruch"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1521
+msgid "Delete Attachment"
+msgstr "Anhang löschen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1522
+#: src/src/i2p/susi/webmail/WebMail.java:1607
+#: src/src/i2p/susi/webmail/WebMail.java:1688
+msgid "Reload Config"
+msgstr "Einstellungen neu laden"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1523
+#: src/src/i2p/susi/webmail/WebMail.java:1608
+#: src/src/i2p/susi/webmail/WebMail.java:1689
+msgid "Logout"
+msgstr "Abmelden"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1546
+#: src/src/i2p/susi/webmail/WebMail.java:1693
+msgid "From:"
+msgstr "Von:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1547
+msgid "To:"
+msgstr "An:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1548
+msgid "Cc:"
+msgstr "Kopie an:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1549
+msgid "Bcc:"
+msgstr "Blindkopie an:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1550
+#: src/src/i2p/susi/webmail/WebMail.java:1695
+msgid "Subject:"
+msgstr "Betreff:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1551
+msgid "Bcc to self"
+msgstr "Blindkopie zurück?"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1554
+msgid "New Attachment:"
+msgstr "Neuer Anhang:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1554
+msgid "Upload File"
+msgstr "Datei hochladen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1560
+msgid "Attachments:"
+msgstr "Anhänge:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1582
+msgid "User"
+msgstr "Benutzer"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1583
+msgid "Pass"
+msgstr "Passwort"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1584
+msgid "Host"
+msgstr "Host"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1585
+msgid "POP3-Port"
+msgstr "POP3-Port"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1586
+msgid "SMTP-Port"
+msgstr "SMTP-Port"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Create Account"
+msgstr "Konto anlegen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Reset"
+msgstr "Zurücksetzen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1599
+msgid "Really delete the marked messages?"
+msgstr "Sollen die markierten Nachrichten wirklich gelöscht werden?"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1599
+msgid "Yes, really delete them!"
+msgstr "Ja, löschen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1601
+#: src/src/i2p/susi/webmail/WebMail.java:1680
+msgid "New"
+msgstr "Verfassen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1602
+#: src/src/i2p/susi/webmail/WebMail.java:1681
+msgid "Reply"
+msgstr "Antworten"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1603
+#: src/src/i2p/susi/webmail/WebMail.java:1682
+msgid "Reply All"
+msgstr "Allen antworten"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1604
+#: src/src/i2p/susi/webmail/WebMail.java:1683
+msgid "Forward"
+msgstr "Weiterleiten"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1605
+#: src/src/i2p/susi/webmail/WebMail.java:1684
+msgid "Delete"
+msgstr "Löschen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1606
+msgid "Check Mail"
+msgstr "Nachrichten abrufen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1610
+msgid "Sender"
+msgstr "Absender"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1611
+msgid "Subject"
+msgstr "Betreff"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1612
+msgid "Date"
+msgstr "Datum"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1613
+msgid "Size"
+msgstr "Größe"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1639
+#, java-format
+msgid "1 Byte"
+msgid_plural "{0} Bytes"
+msgstr[0] "1 Byte"
+msgstr[1] "{0} Bytes"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1644
+msgid "Mark All"
+msgstr "Alles markieren"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1645
+msgid "Invert Selection"
+msgstr "Markierung umkehren"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1646
+msgid "Clear"
+msgstr "Verwerfen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1649
+#: src/src/i2p/susi/webmail/WebMail.java:1650
+msgid "First"
+msgstr "erste"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1649
+#: src/src/i2p/susi/webmail/WebMail.java:1650
+#: src/src/i2p/susi/webmail/WebMail.java:1685
+msgid "Previous"
+msgstr "vorherige"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1651
+#, java-format
+msgid "Page {0} of {1}"
+msgstr "Seite {0} von {1}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1653
+#: src/src/i2p/susi/webmail/WebMail.java:1654
+msgid "Last"
+msgstr "letzte"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1653
+#: src/src/i2p/susi/webmail/WebMail.java:1654
+#: src/src/i2p/susi/webmail/WebMail.java:1686
+msgid "Next"
+msgstr "nächste"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1657
+msgid "Pagesize:"
+msgstr "Seitengröße"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1658
+msgid "Set"
+msgstr "festlegen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1668
+msgid "Really delete this message?"
+msgstr "Diese Nachricht wirklich löschen?"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1668
+msgid "Yes, really delete it!"
+msgstr "Ja, wirklich löschen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1687
+msgid "Back to Folder"
+msgstr "Zurück zur Übersicht"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1694
+msgid "Date:"
+msgstr "Datum:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1705
+msgid "Could not fetch mail."
+msgstr "Konnte Nachrichten nicht abrufen."
+
diff --git a/apps/susimail/locale/messages_en.po b/apps/susimail/locale/messages_en.po
new file mode 100644
index 0000000000000000000000000000000000000000..aac4c983fcf565146cb7d8e927ec3e0d5a1c657e
--- /dev/null
+++ b/apps/susimail/locale/messages_en.po
@@ -0,0 +1,440 @@
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P susimail\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-12 20:49+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"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: \n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: src/src/i2p/susi/webmail/WebMail.java:454
+msgid "unknown"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:473
+msgid "Warning: no transfer encoding found, fallback to 7bit."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:478
+#, java-format
+msgid "No encoder found for encoding \\''{0}\\''."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:484
+msgid "Warning: no charset found, fallback to US-ASCII."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:498
+#, java-format
+msgid "Charset \\''{0}\\'' not supported."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:502
+#, java-format
+msgid "Part ({0}) not shown, because of {1}"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+msgid "Download"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+msgid "File is packed into a zipfile for security reasons."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+#, java-format
+msgid "attachment ({0})."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:529
+#, java-format
+msgid "Attachment ({0})."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:579
+msgid "Need username for authentication."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:583
+msgid "Need password for authentication."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:587
+msgid "Need hostname for connect."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:592
+msgid "Need port number for pop3 connect."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:599
+msgid "POP3 port number is not in range 0..65535."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:605
+msgid "POP3 port number is invalid."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:611
+msgid "Need port number for smtp connect."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:618
+msgid "SMTP port number is not in range 0..65535."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:624
+msgid "SMTP port number is invalid."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:671
+msgid "User logged out."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:675
+msgid "Internal error, lost connection."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:771
+#, java-format
+msgid "On {0} {1} wrote:"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:818
+msgid "begin forwarded mail"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:840
+msgid "end forwarded mail"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:847
+#: src/src/i2p/susi/webmail/WebMail.java:1701
+msgid "Could not fetch mail body."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:875
+msgid "Message id not valid."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:958
+#, java-format
+msgid "No Encoding found for {0}"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:962
+#, java-format
+msgid "Could not encode data: {0}"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:967
+#, java-format
+msgid "Error reading uploaded file: {0}"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1045
+msgid "Error parsing download parameter."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1089
+msgid "Invalid pagesize number, resetting to default value."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1113
+msgid "No messages marked for deletion."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1133
+#, java-format
+msgid "Error deleting message: {0}"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1144
+#, java-format
+msgid "1 message deleted."
+msgid_plural "{0} messages deleted."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1264
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Login"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1266
+#, java-format
+msgid "1 Message"
+msgid_plural "{0} Messages"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1268
+msgid "Show Message"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1325
+#, java-format
+msgid "Error decoding content: {0}"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1330
+msgid "Error decoding content: No encoder found."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1377
+msgid "no subject"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1394
+msgid "Found no valid sender address."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1400
+#, java-format
+msgid "Found no valid address in \\''{0}\\''."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1419
+msgid "No recipients found."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1426
+msgid "Quoted printable encoder not available."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1431
+msgid "Header line encoder not available."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1482
+msgid "Mail sent."
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1519
+msgid "Send"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1520
+msgid "Cancel"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1521
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1522
+#: src/src/i2p/susi/webmail/WebMail.java:1607
+#: src/src/i2p/susi/webmail/WebMail.java:1688
+msgid "Reload Config"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1523
+#: src/src/i2p/susi/webmail/WebMail.java:1608
+#: src/src/i2p/susi/webmail/WebMail.java:1689
+msgid "Logout"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1546
+#: src/src/i2p/susi/webmail/WebMail.java:1693
+msgid "From:"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1547
+msgid "To:"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1548
+msgid "Cc:"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1549
+msgid "Bcc:"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1550
+#: src/src/i2p/susi/webmail/WebMail.java:1695
+msgid "Subject:"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1551
+msgid "Bcc to self"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1554
+msgid "New Attachment:"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1554
+msgid "Upload File"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1560
+msgid "Attachments:"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1582
+msgid "User"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1583
+msgid "Pass"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1584
+msgid "Host"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1585
+msgid "POP3-Port"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1586
+msgid "SMTP-Port"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Create Account"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Reset"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1599
+msgid "Really delete the marked messages?"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1599
+msgid "Yes, really delete them!"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1601
+#: src/src/i2p/susi/webmail/WebMail.java:1680
+msgid "New"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1602
+#: src/src/i2p/susi/webmail/WebMail.java:1681
+msgid "Reply"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1603
+#: src/src/i2p/susi/webmail/WebMail.java:1682
+msgid "Reply All"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1604
+#: src/src/i2p/susi/webmail/WebMail.java:1683
+msgid "Forward"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1605
+#: src/src/i2p/susi/webmail/WebMail.java:1684
+msgid "Delete"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1606
+msgid "Check Mail"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1610
+msgid "Sender"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1611
+msgid "Subject"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1612
+msgid "Date"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1613
+msgid "Size"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1639
+#, java-format
+msgid "1 Byte"
+msgid_plural "{0} Bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1644
+msgid "Mark All"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1645
+msgid "Invert Selection"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1646
+msgid "Clear"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1649
+#: src/src/i2p/susi/webmail/WebMail.java:1650
+msgid "First"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1649
+#: src/src/i2p/susi/webmail/WebMail.java:1650
+#: src/src/i2p/susi/webmail/WebMail.java:1685
+msgid "Previous"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1651
+#, java-format
+msgid "Page {0} of {1}"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1653
+#: src/src/i2p/susi/webmail/WebMail.java:1654
+msgid "Last"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1653
+#: src/src/i2p/susi/webmail/WebMail.java:1654
+#: src/src/i2p/susi/webmail/WebMail.java:1686
+msgid "Next"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1657
+msgid "Pagesize:"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1658
+msgid "Set"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1668
+msgid "Really delete this message?"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1668
+msgid "Yes, really delete it!"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1687
+msgid "Back to Folder"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1694
+msgid "Date:"
+msgstr ""
+
+#: src/src/i2p/susi/webmail/WebMail.java:1705
+msgid "Could not fetch mail."
+msgstr ""
diff --git a/apps/susimail/locale/messages_es.po b/apps/susimail/locale/messages_es.po
new file mode 100644
index 0000000000000000000000000000000000000000..8d930c4e70eec1ed3fc9639db47bddcf01893019
--- /dev/null
+++ b/apps/susimail/locale/messages_es.po
@@ -0,0 +1,441 @@
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P\n"
+"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
+"POT-Creation-Date: 2011-03-12 20:49+0000\n"
+"PO-Revision-Date: 2011-04-18 21:35+0100\n"
+"Last-Translator: mixxy <m1xxy@mail.i2p>\n"
+"Language-Team: Spanish (Castilian) <None>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: src/src/i2p/susi/webmail/WebMail.java:454
+msgid "unknown"
+msgstr "desconocido"
+
+#: src/src/i2p/susi/webmail/WebMail.java:473
+msgid "Warning: no transfer encoding found, fallback to 7bit."
+msgstr "Aviso: no se encuentra codificación de transferencia, volviendo a 7 bits."
+
+#: src/src/i2p/susi/webmail/WebMail.java:478
+#, java-format
+msgid "No encoder found for encoding \\''{0}\\''."
+msgstr "No se ha encontrado codificador para la codificación \\''{0}''\\."
+
+#: src/src/i2p/susi/webmail/WebMail.java:484
+msgid "Warning: no charset found, fallback to US-ASCII."
+msgstr "Aviso: no se ha encontrado el juego de caracteres, volviendo a US-ASCII."
+
+#: src/src/i2p/susi/webmail/WebMail.java:498
+#, java-format
+msgid "Charset \\''{0}\\'' not supported."
+msgstr "juego de caracteres \\''{0}\\''no soportado."
+
+#: src/src/i2p/susi/webmail/WebMail.java:502
+#, java-format
+msgid "Part ({0}) not shown, because of {1}"
+msgstr "La parte ({0}) no se muestra, debido a {1}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+msgid "Download"
+msgstr "Descarga"
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+msgid "File is packed into a zipfile for security reasons."
+msgstr "El archivo está empaquetado en un archivo zip por razones de seguridad."
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+#, java-format
+msgid "attachment ({0})."
+msgstr "adjunto ({0})."
+
+#: src/src/i2p/susi/webmail/WebMail.java:529
+#, java-format
+msgid "Attachment ({0})."
+msgstr "Adjunto ({0})."
+
+#: src/src/i2p/susi/webmail/WebMail.java:579
+msgid "Need username for authentication."
+msgstr "Es necesario un nombre de usuario para la autenticación."
+
+#: src/src/i2p/susi/webmail/WebMail.java:583
+msgid "Need password for authentication."
+msgstr "Es necesaria una contraseña para la autenticación."
+
+#: src/src/i2p/susi/webmail/WebMail.java:587
+msgid "Need hostname for connect."
+msgstr "Es necesario un nombre de host para la conexión."
+
+#: src/src/i2p/susi/webmail/WebMail.java:592
+msgid "Need port number for pop3 connect."
+msgstr "Es necesario el número de puerto para conectar pop3."
+
+#: src/src/i2p/susi/webmail/WebMail.java:599
+msgid "POP3 port number is not in range 0..65535."
+msgstr "El puerto POP3 no está en el rango 0..65535."
+
+#: src/src/i2p/susi/webmail/WebMail.java:605
+msgid "POP3 port number is invalid."
+msgstr "El puerto POP3 no es válido."
+
+#: src/src/i2p/susi/webmail/WebMail.java:611
+msgid "Need port number for smtp connect."
+msgstr "Es necesario el número de puerto para conectar smtp."
+
+#: src/src/i2p/susi/webmail/WebMail.java:618
+msgid "SMTP port number is not in range 0..65535."
+msgstr "El puerto SMTP no está en el rango 0..65535."
+
+#: src/src/i2p/susi/webmail/WebMail.java:624
+msgid "SMTP port number is invalid."
+msgstr "El puerto SMTP no es válido."
+
+#: src/src/i2p/susi/webmail/WebMail.java:671
+msgid "User logged out."
+msgstr "Usuario desconectado."
+
+#: src/src/i2p/susi/webmail/WebMail.java:675
+msgid "Internal error, lost connection."
+msgstr "Error interno, pérdida de conexión."
+
+#: src/src/i2p/susi/webmail/WebMail.java:771
+#, java-format
+msgid "On {0} {1} wrote:"
+msgstr "En {0} {1} escribió:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:818
+msgid "begin forwarded mail"
+msgstr "comenzar correo reenviado"
+
+#: src/src/i2p/susi/webmail/WebMail.java:840
+msgid "end forwarded mail"
+msgstr "terminar correo reenviado"
+
+#: src/src/i2p/susi/webmail/WebMail.java:847
+#: src/src/i2p/susi/webmail/WebMail.java:1701
+msgid "Could not fetch mail body."
+msgstr "No se pudo obtener el cuerpo del correo."
+
+#: src/src/i2p/susi/webmail/WebMail.java:875
+msgid "Message id not valid."
+msgstr "ID del mensaje no válida."
+
+#: src/src/i2p/susi/webmail/WebMail.java:958
+#, java-format
+msgid "No Encoding found for {0}"
+msgstr "No se ha encontrado codificación para {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:962
+#, java-format
+msgid "Could not encode data: {0}"
+msgstr "No se pudo codificar los datos: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:967
+#, java-format
+msgid "Error reading uploaded file: {0}"
+msgstr "Error al leer el archivo subido: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1045
+msgid "Error parsing download parameter."
+msgstr "Error al analizar parámetros de descarga."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1089
+msgid "Invalid pagesize number, resetting to default value."
+msgstr "Tamaño de página no válida, restableciendo a los valores predeterminados."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1113
+msgid "No messages marked for deletion."
+msgstr "No hay mensajes marcados para su eliminación."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1133
+#, java-format
+msgid "Error deleting message: {0}"
+msgstr "Error al eliminar el mensaje: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1144
+#, java-format
+msgid "1 message deleted."
+msgid_plural "{0} messages deleted."
+msgstr[0] "1 mensaje eliminado."
+msgstr[1] "{0} mensajes eliminados."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1264
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Login"
+msgstr "Iniciar sesión"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1266
+#, java-format
+msgid "1 Message"
+msgid_plural "{0} Messages"
+msgstr[0] "1 Mensaje"
+msgstr[1] "{0} Mensajes"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1268
+msgid "Show Message"
+msgstr "Mostrar mensaje"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1325
+#, java-format
+msgid "Error decoding content: {0}"
+msgstr "Error al descifrar el contenido: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1330
+msgid "Error decoding content: No encoder found."
+msgstr "Error al descifrar el contenido: No se ha encontrado codificador."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1377
+msgid "no subject"
+msgstr "sin asunto"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1394
+msgid "Found no valid sender address."
+msgstr "No se ha encontrado una dirección de remitente válida."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1400
+#, java-format
+msgid "Found no valid address in \\''{0}\\''."
+msgstr "No se ha encontrado ninguna dirección válida en \\''{0}\\''."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1419
+msgid "No recipients found."
+msgstr "No se han encontrado destinatarios."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1426
+msgid "Quoted printable encoder not available."
+msgstr "El codificador imprimible citado no se encuentra disponible."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1431
+msgid "Header line encoder not available."
+msgstr "El codificador de línea de encabezado no está disponible."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1482
+msgid "Mail sent."
+msgstr "Correo enviado."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1519
+msgid "Send"
+msgstr "Enviar"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1520
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1521
+msgid "Delete Attachment"
+msgstr "Eliminar datos adjuntos"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1522
+#: src/src/i2p/susi/webmail/WebMail.java:1607
+#: src/src/i2p/susi/webmail/WebMail.java:1688
+msgid "Reload Config"
+msgstr "Actualizar configuración"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1523
+#: src/src/i2p/susi/webmail/WebMail.java:1608
+#: src/src/i2p/susi/webmail/WebMail.java:1689
+msgid "Logout"
+msgstr "Desconectarse"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1546
+#: src/src/i2p/susi/webmail/WebMail.java:1693
+msgid "From:"
+msgstr "De:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1547
+msgid "To:"
+msgstr "Para:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1548
+msgid "Cc:"
+msgstr "Cc:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1549
+msgid "Bcc:"
+msgstr "CCO:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1550
+#: src/src/i2p/susi/webmail/WebMail.java:1695
+msgid "Subject:"
+msgstr "Asunto:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1551
+msgid "Bcc to self"
+msgstr "CCO a mí mismo"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1554
+msgid "New Attachment:"
+msgstr "Nuevo Archivo adjunto:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1554
+msgid "Upload File"
+msgstr "Subir Archivo"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1560
+msgid "Attachments:"
+msgstr "Archivos adjuntos:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1582
+msgid "User"
+msgstr "Usuario"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1583
+msgid "Pass"
+msgstr "Contraseña"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1584
+msgid "Host"
+msgstr "Host"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1585
+msgid "POP3-Port"
+msgstr "Puerto-POP3"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1586
+msgid "SMTP-Port"
+msgstr "Puerto-SMTP"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Create Account"
+msgstr "Crear una cuenta"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Reset"
+msgstr "Cancelar"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1599
+msgid "Really delete the marked messages?"
+msgstr "¿Realmente deseas borrar los mensajes marcados?"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1599
+msgid "Yes, really delete them!"
+msgstr "Sí, realmente eliminarlos!"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1601
+#: src/src/i2p/susi/webmail/WebMail.java:1680
+msgid "New"
+msgstr "Nuevo"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1602
+#: src/src/i2p/susi/webmail/WebMail.java:1681
+msgid "Reply"
+msgstr "Responder"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1603
+#: src/src/i2p/susi/webmail/WebMail.java:1682
+msgid "Reply All"
+msgstr "Responder a todos"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1604
+#: src/src/i2p/susi/webmail/WebMail.java:1683
+msgid "Forward"
+msgstr "Reenviar"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1605
+#: src/src/i2p/susi/webmail/WebMail.java:1684
+msgid "Delete"
+msgstr "Eliminar"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1606
+msgid "Check Mail"
+msgstr "Comprobar correo"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1610
+msgid "Sender"
+msgstr "Remitente"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1611
+msgid "Subject"
+msgstr "Asunto"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1612
+msgid "Date"
+msgstr "Fecha"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1613
+msgid "Size"
+msgstr "Tamaño"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1639
+#, java-format
+msgid "1 Byte"
+msgid_plural "{0} Bytes"
+msgstr[0] "1 Byte"
+msgstr[1] "{0} Bytes"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1644
+msgid "Mark All"
+msgstr "Marcar todos"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1645
+msgid "Invert Selection"
+msgstr "Invertir selección"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1646
+msgid "Clear"
+msgstr "Despejar"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1649
+#: src/src/i2p/susi/webmail/WebMail.java:1650
+msgid "First"
+msgstr "Primero"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1649
+#: src/src/i2p/susi/webmail/WebMail.java:1650
+#: src/src/i2p/susi/webmail/WebMail.java:1685
+msgid "Previous"
+msgstr "Anterior"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1651
+#, java-format
+msgid "Page {0} of {1}"
+msgstr "Página {0} de {1}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1653
+#: src/src/i2p/susi/webmail/WebMail.java:1654
+msgid "Last"
+msgstr "Última"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1653
+#: src/src/i2p/susi/webmail/WebMail.java:1654
+#: src/src/i2p/susi/webmail/WebMail.java:1686
+msgid "Next"
+msgstr "Siguiente"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1657
+msgid "Pagesize:"
+msgstr "Tamaño de página:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1658
+msgid "Set"
+msgstr "Set"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1668
+msgid "Really delete this message?"
+msgstr "¿Realmente deseas borrar este mensaje?"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1668
+msgid "Yes, really delete it!"
+msgstr "Sí, realmente eliminarlo!"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1687
+msgid "Back to Folder"
+msgstr "Volver a carpeta"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1694
+msgid "Date:"
+msgstr "Fecha:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1705
+msgid "Could not fetch mail."
+msgstr "No se pudo descargar el correo."
+
diff --git a/apps/susimail/locale/messages_fr.po b/apps/susimail/locale/messages_fr.po
new file mode 100644
index 0000000000000000000000000000000000000000..238ebd4e716d8d7587497e06d0879e3ed793a2f5
--- /dev/null
+++ b/apps/susimail/locale/messages_fr.po
@@ -0,0 +1,441 @@
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P susimail\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-24 16:49+0000\n"
+"PO-Revision-Date: 2011-04-09 03:06+0100\n"
+"Last-Translator: magma <magma@mail.i2p>\n"
+"Language-Team: duck <duck@mail.i2p>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n >= 2)\n"
+
+#: src/src/i2p/susi/webmail/WebMail.java:454
+msgid "unknown"
+msgstr "inconnu"
+
+#: src/src/i2p/susi/webmail/WebMail.java:473
+msgid "Warning: no transfer encoding found, fallback to 7bit."
+msgstr "Avertissement: pas d'encodage de transfert trouvé: retour en 7bits."
+
+#: src/src/i2p/susi/webmail/WebMail.java:478
+#, java-format
+msgid "No encoder found for encoding \\''{0}\\''."
+msgstr "Pas d''encodeur trouvé pour encoder \"{0}\"."
+
+#: src/src/i2p/susi/webmail/WebMail.java:484
+msgid "Warning: no charset found, fallback to US-ASCII."
+msgstr "Avertissement: aucun jeu de caractères trouvé, retour en ASCII-US"
+
+#: src/src/i2p/susi/webmail/WebMail.java:498
+#, java-format
+msgid "Charset \\''{0}\\'' not supported."
+msgstr "Jeu de caractères \\''{0}\\'' non pris en charge."
+
+#: src/src/i2p/susi/webmail/WebMail.java:502
+#, java-format
+msgid "Part ({0}) not shown, because of {1}"
+msgstr "Partie ({0}) non affichée car {1}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+msgid "Download"
+msgstr "Télécharger"
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+msgid "File is packed into a zipfile for security reasons."
+msgstr "Fichier compressé en zip par sécurité."
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+#, java-format
+msgid "attachment ({0})."
+msgstr "pièce jointe ({0})."
+
+#: src/src/i2p/susi/webmail/WebMail.java:529
+#, java-format
+msgid "Attachment ({0})."
+msgstr "Pièce jointe ({0})."
+
+#: src/src/i2p/susi/webmail/WebMail.java:579
+msgid "Need username for authentication."
+msgstr "Identifiant requis pour l'authentification."
+
+#: src/src/i2p/susi/webmail/WebMail.java:583
+msgid "Need password for authentication."
+msgstr "Mot de passe requis pour l'authentification."
+
+#: src/src/i2p/susi/webmail/WebMail.java:587
+msgid "Need hostname for connect."
+msgstr "Nom d'hôte requis pour la connexion."
+
+#: src/src/i2p/susi/webmail/WebMail.java:592
+msgid "Need port number for pop3 connect."
+msgstr "Port requis pour la connexion POP3."
+
+#: src/src/i2p/susi/webmail/WebMail.java:599
+msgid "POP3 port number is not in range 0..65535."
+msgstr "Le port POP3 n'est pas compris entre 0 et 65535."
+
+#: src/src/i2p/susi/webmail/WebMail.java:605
+msgid "POP3 port number is invalid."
+msgstr "Port POP3 incorrect."
+
+#: src/src/i2p/susi/webmail/WebMail.java:611
+msgid "Need port number for smtp connect."
+msgstr "Port requis pour la connexion SMTP."
+
+#: src/src/i2p/susi/webmail/WebMail.java:618
+msgid "SMTP port number is not in range 0..65535."
+msgstr "Le port SMTP n'est pas compris entre 0 et 65535."
+
+#: src/src/i2p/susi/webmail/WebMail.java:624
+msgid "SMTP port number is invalid."
+msgstr "Port SMTP incorrect."
+
+#: src/src/i2p/susi/webmail/WebMail.java:671
+msgid "User logged out."
+msgstr "Utilisateur déconnecté."
+
+#: src/src/i2p/susi/webmail/WebMail.java:675
+msgid "Internal error, lost connection."
+msgstr "Erreur interne, connexion perdue."
+
+#: src/src/i2p/susi/webmail/WebMail.java:771
+#, java-format
+msgid "On {0} {1} wrote:"
+msgstr "Sur {0} {1} écrit:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:818
+msgid "begin forwarded mail"
+msgstr "tranfert du message commencé"
+
+#: src/src/i2p/susi/webmail/WebMail.java:840
+msgid "end forwarded mail"
+msgstr "tranfert du message terminé"
+
+#: src/src/i2p/susi/webmail/WebMail.java:847
+#: src/src/i2p/susi/webmail/WebMail.java:1701
+msgid "Could not fetch mail body."
+msgstr "Impossible de ramener le corps du message."
+
+#: src/src/i2p/susi/webmail/WebMail.java:875
+msgid "Message id not valid."
+msgstr "ID de message incorrecte."
+
+#: src/src/i2p/susi/webmail/WebMail.java:958
+#, java-format
+msgid "No Encoding found for {0}"
+msgstr "Pas d''encodage trouvé pour {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:962
+#, java-format
+msgid "Could not encode data: {0}"
+msgstr "Impossible d''encoder les données: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:967
+#, java-format
+msgid "Error reading uploaded file: {0}"
+msgstr "Erreur de lecture du fichier envoyé: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1045
+msgid "Error parsing download parameter."
+msgstr "Erreur d'analyse des paramètres de téléchargement."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1089
+msgid "Invalid pagesize number, resetting to default value."
+msgstr "Taille de page incorrecte: réinitialisation à la valeur par défaut."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1113
+msgid "No messages marked for deletion."
+msgstr "Aucun message marqué pour suppression"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1133
+#, java-format
+msgid "Error deleting message: {0}"
+msgstr "Erreur de suppression du message: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1144
+#, java-format
+msgid "1 message deleted."
+msgid_plural "{0} messages deleted."
+msgstr[0] "{0} message supprimé"
+msgstr[1] "{0} messages supprimés"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1264
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Login"
+msgstr "Identification"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1266
+#, java-format
+msgid "1 Message"
+msgid_plural "{0} Messages"
+msgstr[0] "{0} Message"
+msgstr[1] "{0} Messages"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1268
+msgid "Show Message"
+msgstr "Afficher le message"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1325
+#, java-format
+msgid "Error decoding content: {0}"
+msgstr "Erreur de décodage de contenu: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1330
+msgid "Error decoding content: No encoder found."
+msgstr "Erreur de décodage de contenu: pas d'encodeur trouvé."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1377
+msgid "no subject"
+msgstr "pas d'objet"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1394
+msgid "Found no valid sender address."
+msgstr "Adresse d'expéditeur correcte non trouvée"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1400
+#, java-format
+msgid "Found no valid address in \\''{0}\\''."
+msgstr "Pas d''adresse correcte dans \\''{0}\\''."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1419
+msgid "No recipients found."
+msgstr "Pas de destinataire trouvé."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1426
+msgid "Quoted printable encoder not available."
+msgstr "Encodeur \"Quoted printable\" non disponible."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1431
+msgid "Header line encoder not available."
+msgstr "Ligne d'en-tête \"Encodeur\" non disponible."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1482
+msgid "Mail sent."
+msgstr "Message envoyé."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1519
+msgid "Send"
+msgstr "Envoyer"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1520
+msgid "Cancel"
+msgstr "Annuler"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1521
+msgid "Delete Attachment"
+msgstr "Supprimer la pièce jointe"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1522
+#: src/src/i2p/susi/webmail/WebMail.java:1607
+#: src/src/i2p/susi/webmail/WebMail.java:1688
+msgid "Reload Config"
+msgstr "Recharger la configuration"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1523
+#: src/src/i2p/susi/webmail/WebMail.java:1608
+#: src/src/i2p/susi/webmail/WebMail.java:1689
+msgid "Logout"
+msgstr "Déconnexion"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1546
+#: src/src/i2p/susi/webmail/WebMail.java:1693
+msgid "From:"
+msgstr "De:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1547
+msgid "To:"
+msgstr "À:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1548
+msgid "Cc:"
+msgstr "Cc:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1549
+msgid "Bcc:"
+msgstr "Cci:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1550
+#: src/src/i2p/susi/webmail/WebMail.java:1695
+msgid "Subject:"
+msgstr "Objet:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1551
+msgid "Bcc to self"
+msgstr "Cci à moi-même"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1554
+msgid "New Attachment:"
+msgstr "Nouvelle pièce jointe:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1554
+msgid "Upload File"
+msgstr "Envoyer le fichier"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1560
+msgid "Attachments:"
+msgstr "Pièces jointes:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1582
+msgid "User"
+msgstr "Utilisateur"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1583
+msgid "Pass"
+msgstr "Mot de passe"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1584
+msgid "Host"
+msgstr "Hôte"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1585
+msgid "POP3-Port"
+msgstr "Port POP3"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1586
+msgid "SMTP-Port"
+msgstr "Port SMTP"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Create Account"
+msgstr "Créer un compte"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Reset"
+msgstr "Remise à zéro"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1599
+msgid "Really delete the marked messages?"
+msgstr "voulez-vous vraiment supprimer les messages marqués?"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1599
+msgid "Yes, really delete them!"
+msgstr "Oui, suppression!"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1601
+#: src/src/i2p/susi/webmail/WebMail.java:1680
+msgid "New"
+msgstr "Nouveau message"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1602
+#: src/src/i2p/susi/webmail/WebMail.java:1681
+msgid "Reply"
+msgstr "Répondre"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1603
+#: src/src/i2p/susi/webmail/WebMail.java:1682
+msgid "Reply All"
+msgstr "Répondre à tous"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1604
+#: src/src/i2p/susi/webmail/WebMail.java:1683
+msgid "Forward"
+msgstr "Transférer"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1605
+#: src/src/i2p/susi/webmail/WebMail.java:1684
+msgid "Delete"
+msgstr "Supprimer"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1606
+msgid "Check Mail"
+msgstr "Relever le courrier"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1610
+msgid "Sender"
+msgstr "De"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1611
+msgid "Subject"
+msgstr "Objet"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1612
+msgid "Date"
+msgstr "Date"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1613
+msgid "Size"
+msgstr "Taille"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1639
+#, java-format
+msgid "1 Byte"
+msgid_plural "{0} Bytes"
+msgstr[0] "{0} octet"
+msgstr[1] "{0} octets"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1644
+msgid "Mark All"
+msgstr "Tout cocher"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1645
+msgid "Invert Selection"
+msgstr "Inverser la sélection"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1646
+msgid "Clear"
+msgstr "Effacer"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1649
+#: src/src/i2p/susi/webmail/WebMail.java:1650
+msgid "First"
+msgstr "Premier"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1649
+#: src/src/i2p/susi/webmail/WebMail.java:1650
+#: src/src/i2p/susi/webmail/WebMail.java:1685
+msgid "Previous"
+msgstr "Précédent"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1651
+#, java-format
+msgid "Page {0} of {1}"
+msgstr "Page {0} sur {1}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1653
+#: src/src/i2p/susi/webmail/WebMail.java:1654
+msgid "Last"
+msgstr "Dernier"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1653
+#: src/src/i2p/susi/webmail/WebMail.java:1654
+#: src/src/i2p/susi/webmail/WebMail.java:1686
+msgid "Next"
+msgstr "Suivant"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1657
+msgid "Pagesize:"
+msgstr "Taille de page:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1658
+msgid "Set"
+msgstr "Définir"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1668
+msgid "Really delete this message?"
+msgstr "Voulez-vous vraiment supprimer ce message?"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1668
+msgid "Yes, really delete it!"
+msgstr "Oui, supprimer!"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1687
+msgid "Back to Folder"
+msgstr "Retour au dossier"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1694
+msgid "Date:"
+msgstr "Date:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1705
+msgid "Could not fetch mail."
+msgstr "Impossible de ramener le courrier."
+
diff --git a/apps/susimail/locale/messages_nl.po b/apps/susimail/locale/messages_nl.po
new file mode 100644
index 0000000000000000000000000000000000000000..411a02eb64961e636a4d62732b17054de9d0b0db
--- /dev/null
+++ b/apps/susimail/locale/messages_nl.po
@@ -0,0 +1,440 @@
+# I2P
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P susimail\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-12 20:49+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"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: src/src/i2p/susi/webmail/WebMail.java:454
+msgid "unknown"
+msgstr "onbekend"
+
+#: src/src/i2p/susi/webmail/WebMail.java:473
+msgid "Warning: no transfer encoding found, fallback to 7bit."
+msgstr "Waarschuwing: geen transfer encoding gevonden, terugval naar 7bit."
+
+#: src/src/i2p/susi/webmail/WebMail.java:478
+#, java-format
+msgid "No encoder found for encoding \\''{0}\\''."
+msgstr "Geen encoder gevonden voor de encoding \\''{0}\\''."
+
+#: src/src/i2p/susi/webmail/WebMail.java:484
+msgid "Warning: no charset found, fallback to US-ASCII."
+msgstr "Waarschuwing: geen charset gevonden, terugval naar US-ASCII."
+
+#: src/src/i2p/susi/webmail/WebMail.java:498
+#, java-format
+msgid "Charset \\''{0}\\'' not supported."
+msgstr "Charset \\''{0}\\'' niet ondersteund."
+
+#: src/src/i2p/susi/webmail/WebMail.java:502
+#, java-format
+msgid "Part ({0}) not shown, because of {1}"
+msgstr "Deel ({0}) niet getoond, vanwege {1}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+msgid "Download"
+msgstr "Download"
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+msgid "File is packed into a zipfile for security reasons."
+msgstr "Bestand is verpakt in een zipbestand wegens veiligheid."
+
+#: src/src/i2p/susi/webmail/WebMail.java:525
+#, java-format
+msgid "attachment ({0})."
+msgstr "bijlage ({0})."
+
+#: src/src/i2p/susi/webmail/WebMail.java:529
+#, java-format
+msgid "Attachment ({0})."
+msgstr "Bijlage ({0})."
+
+#: src/src/i2p/susi/webmail/WebMail.java:579
+msgid "Need username for authentication."
+msgstr "Gebruikersnaam nodig voor authenticatie."
+
+#: src/src/i2p/susi/webmail/WebMail.java:583
+msgid "Need password for authentication."
+msgstr "Wachtwoord nodig voor authenticatie."
+
+#: src/src/i2p/susi/webmail/WebMail.java:587
+msgid "Need hostname for connect."
+msgstr "Hostnaam nodig voor verbinding."
+
+#: src/src/i2p/susi/webmail/WebMail.java:592
+msgid "Need port number for pop3 connect."
+msgstr "Poortnummer nodig voor pop3 verbinding."
+
+#: src/src/i2p/susi/webmail/WebMail.java:599
+msgid "POP3 port number is not in range 0..65535."
+msgstr "POP3 poortnummer valt niet in het bereik 0..65535."
+
+#: src/src/i2p/susi/webmail/WebMail.java:605
+msgid "POP3 port number is invalid."
+msgstr "POP3 poortnummer is ongeldig."
+
+#: src/src/i2p/susi/webmail/WebMail.java:611
+msgid "Need port number for smtp connect."
+msgstr "Poortnummer nodig voor smtp verbinding."
+
+#: src/src/i2p/susi/webmail/WebMail.java:618
+msgid "SMTP port number is not in range 0..65535."
+msgstr "SMTP poortnummer valt niet in het bereik 0..65535."
+
+#: src/src/i2p/susi/webmail/WebMail.java:624
+msgid "SMTP port number is invalid."
+msgstr "SMTP poortnummer is ongeldig."
+
+#: src/src/i2p/susi/webmail/WebMail.java:671
+msgid "User logged out."
+msgstr "Gebruiker is uitgelogged."
+
+#: src/src/i2p/susi/webmail/WebMail.java:675
+msgid "Internal error, lost connection."
+msgstr "Interne fout, verbinding verbroken."
+
+#: src/src/i2p/susi/webmail/WebMail.java:771
+#, java-format
+msgid "On {0} {1} wrote:"
+msgstr "Op {0} schreef {1}:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:818
+msgid "begin forwarded mail"
+msgstr "begin doorgestuurde mail"
+
+#: src/src/i2p/susi/webmail/WebMail.java:840
+msgid "end forwarded mail"
+msgstr "einde doorgestuurde mail"
+
+#: src/src/i2p/susi/webmail/WebMail.java:847
+#: src/src/i2p/susi/webmail/WebMail.java:1701
+msgid "Could not fetch mail body."
+msgstr "Kon de body van het bericht niet ophalen."
+
+#: src/src/i2p/susi/webmail/WebMail.java:875
+msgid "Message id not valid."
+msgstr "Message id is ongeldig."
+
+#: src/src/i2p/susi/webmail/WebMail.java:958
+#, java-format
+msgid "No Encoding found for {0}"
+msgstr "Geen Encoding gevonden voor {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:962
+#, java-format
+msgid "Could not encode data: {0}"
+msgstr "Kon de data niet encoden: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:967
+#, java-format
+msgid "Error reading uploaded file: {0}"
+msgstr "Fout bij lezen van geupload bestand: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1045
+msgid "Error parsing download parameter."
+msgstr "Fout bij verwerken download parameter."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1089
+msgid "Invalid pagesize number, resetting to default value."
+msgstr "Ongeldig nummer voor paginagrootte, herstel naar standaardwaarde."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1113
+msgid "No messages marked for deletion."
+msgstr "Geen berichten gemarkeerd voor verwijdering."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1133
+#, java-format
+msgid "Error deleting message: {0}"
+msgstr "Fout bij verwijderen van bericht: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1144
+#, java-format
+msgid "1 message deleted."
+msgid_plural "{0} messages deleted."
+msgstr[0] "1 bericht verwijderd."
+msgstr[1] "{0} berichten verwijderd."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1264
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Login"
+msgstr "Login"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1266
+#, java-format
+msgid "1 Message"
+msgid_plural "{0} Messages"
+msgstr[0] "1 Bericht"
+msgstr[1] "{0} Berichten"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1268
+msgid "Show Message"
+msgstr "Toon Bericht"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1325
+#, java-format
+msgid "Error decoding content: {0}"
+msgstr "Fout bij decoden van inhoud: {0}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1330
+msgid "Error decoding content: No encoder found."
+msgstr "Fout bij decoden van inhoud: Geen encoder gevonden."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1377
+msgid "no subject"
+msgstr "geen onderwerp"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1394
+msgid "Found no valid sender address."
+msgstr "Geen geldig afzender adres gevonden."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1400
+#, java-format
+msgid "Found no valid address in \\''{0}\\''."
+msgstr "Geen geldig adres gevonden in \\''{0}\\''."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1419
+msgid "No recipients found."
+msgstr "Geen ontvangers gevonden."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1426
+msgid "Quoted printable encoder not available."
+msgstr "Gequote print encoder niet beschikbaar."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1431
+msgid "Header line encoder not available."
+msgstr "Kopregel encoder niet beschikbaar."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1482
+msgid "Mail sent."
+msgstr "Mail verzonden."
+
+#: src/src/i2p/susi/webmail/WebMail.java:1519
+msgid "Send"
+msgstr "Verstuur"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1520
+msgid "Cancel"
+msgstr "Annuleer"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1521
+msgid "Delete Attachment"
+msgstr "Verwijder Bijlage"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1522
+#: src/src/i2p/susi/webmail/WebMail.java:1607
+#: src/src/i2p/susi/webmail/WebMail.java:1688
+msgid "Reload Config"
+msgstr "Herlaad Configuratie"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1523
+#: src/src/i2p/susi/webmail/WebMail.java:1608
+#: src/src/i2p/susi/webmail/WebMail.java:1689
+msgid "Logout"
+msgstr "Uitloggen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1546
+#: src/src/i2p/susi/webmail/WebMail.java:1693
+msgid "From:"
+msgstr "Van:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1547
+msgid "To:"
+msgstr "Aan:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1548
+msgid "Cc:"
+msgstr "Cc:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1549
+msgid "Bcc:"
+msgstr "Bcc:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1550
+#: src/src/i2p/susi/webmail/WebMail.java:1695
+msgid "Subject:"
+msgstr "Onderwerp:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1551
+msgid "Bcc to self"
+msgstr "Bcc zelf"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1554
+msgid "New Attachment:"
+msgstr "Nieuwe Bijlage:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1554
+msgid "Upload File"
+msgstr "Upload Bestand"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1560
+msgid "Attachments:"
+msgstr "Bijlagen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1582
+msgid "User"
+msgstr "Gebruiker"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1583
+msgid "Pass"
+msgstr "Wachtwoord"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1584
+msgid "Host"
+msgstr "Host"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1585
+msgid "POP3-Port"
+msgstr "POP3-Poort"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1586
+msgid "SMTP-Port"
+msgstr "SMTP-Poort"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Create Account"
+msgstr "Account Aanmaken"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1587
+msgid "Reset"
+msgstr "Herstel"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1599
+msgid "Really delete the marked messages?"
+msgstr "Wil je de gemarkeerde berichten daadwerkelijk verwijderen?"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1599
+msgid "Yes, really delete them!"
+msgstr "Ja, verwijder ze!"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1601
+#: src/src/i2p/susi/webmail/WebMail.java:1680
+msgid "New"
+msgstr "Nieuw"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1602
+#: src/src/i2p/susi/webmail/WebMail.java:1681
+msgid "Reply"
+msgstr "Beantwoorden"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1603
+#: src/src/i2p/susi/webmail/WebMail.java:1682
+msgid "Reply All"
+msgstr "Allen Beantwoorden"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1604
+#: src/src/i2p/susi/webmail/WebMail.java:1683
+msgid "Forward"
+msgstr "Doorsturen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1605
+#: src/src/i2p/susi/webmail/WebMail.java:1684
+msgid "Delete"
+msgstr "Verwijder"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1606
+msgid "Check Mail"
+msgstr "Controlleer Mail"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1610
+msgid "Sender"
+msgstr "Verzender"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1611
+msgid "Subject"
+msgstr "Onderwerp"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1612
+msgid "Date"
+msgstr "Datum"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1613
+msgid "Size"
+msgstr "Grootte"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1639
+#, java-format
+msgid "1 Byte"
+msgid_plural "{0} Bytes"
+msgstr[0] "1 Byte"
+msgstr[1] "{0} Bytes"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1644
+msgid "Mark All"
+msgstr "Allen Markeren"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1645
+msgid "Invert Selection"
+msgstr "Selectie Omkeren"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1646
+msgid "Clear"
+msgstr "Selectie Wissen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1649
+#: src/src/i2p/susi/webmail/WebMail.java:1650
+msgid "First"
+msgstr "Eerste"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1649
+#: src/src/i2p/susi/webmail/WebMail.java:1650
+#: src/src/i2p/susi/webmail/WebMail.java:1685
+msgid "Previous"
+msgstr "Vorige"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1651
+#, java-format
+msgid "Page {0} of {1}"
+msgstr "Pagina {0} van {1}"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1653
+#: src/src/i2p/susi/webmail/WebMail.java:1654
+msgid "Last"
+msgstr "Laatste"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1653
+#: src/src/i2p/susi/webmail/WebMail.java:1654
+#: src/src/i2p/susi/webmail/WebMail.java:1686
+msgid "Next"
+msgstr "Volgende"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1657
+msgid "Pagesize:"
+msgstr "Paginagrootte:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1658
+msgid "Set"
+msgstr "Instellen"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1668
+msgid "Really delete this message?"
+msgstr "Werkelijk dit bericht verwijderen?"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1668
+msgid "Yes, really delete it!"
+msgstr "Ja, verwijder ze!"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1687
+msgid "Back to Folder"
+msgstr "Terug naar de Map"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1694
+msgid "Date:"
+msgstr "Datum:"
+
+#: src/src/i2p/susi/webmail/WebMail.java:1705
+msgid "Could not fetch mail."
+msgstr "Kon de mail niet ophalen."
diff --git a/apps/susimail/src/src/i2p/susi/webmail/Messages.java b/apps/susimail/src/src/i2p/susi/webmail/Messages.java
new file mode 100644
index 0000000000000000000000000000000000000000..84b97450e2e7ee1a807f67f584d9f91dd4339516
--- /dev/null
+++ b/apps/susimail/src/src/i2p/susi/webmail/Messages.java
@@ -0,0 +1,38 @@
+package i2p.susi.webmail;
+
+import net.i2p.I2PAppContext;
+import net.i2p.util.Translate;
+
+/**
+ * Translate strings for this package.
+ * @since 0.8.5
+ */
+public class Messages {
+    private static final String BUNDLE_NAME = "i2p.susi.webmail.messages";
+    private final I2PAppContext _context;
+
+    public Messages() {
+        _context = I2PAppContext.getGlobalContext();
+    }
+
+    /** lang in routerconsole.lang property, else current locale */
+    public String _(String key) {
+        return Translate.getString(key, _context, BUNDLE_NAME);
+    }
+
+    public static String getString(String s) {
+        return Translate.getString(s, I2PAppContext.getGlobalContext(), BUNDLE_NAME);
+    }
+
+    public static String getString(String s, Object o) {
+        return Translate.getString(s, o, I2PAppContext.getGlobalContext(), BUNDLE_NAME);
+    }
+
+    public static String getString(String s, Object o, Object o2) {
+        return Translate.getString(s, o, o2, I2PAppContext.getGlobalContext(), BUNDLE_NAME);
+    }
+    
+    public static String getString(int n, String s, String p) {
+        return Translate.getString(n, s, p, I2PAppContext.getGlobalContext(), BUNDLE_NAME);
+    }
+}
diff --git a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
index b356c73d17a1d41c090d2a746498535e7bc61264..c07947c289e3b4689dd3b2a86e805f208befc65f 100644
--- a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
+++ b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
@@ -27,6 +27,7 @@ import i2p.susi.debug.Debug;
 import i2p.susi.util.Config;
 import i2p.susi.util.Folder;
 import i2p.susi.util.ReadBuffer;
+import i2p.susi.webmail.Messages;
 import i2p.susi.webmail.encoding.DecodingException;
 import i2p.susi.webmail.encoding.Encoding;
 import i2p.susi.webmail.encoding.EncodingException;
@@ -450,7 +451,7 @@ public class WebMail extends HttpServlet
 					( mailPart.description != null ? mailPart.description + ", " : "" ) +
 					( mailPart.filename != null ? mailPart.filename + ", " : "" ) +
 					( mailPart.name != null ? mailPart.name + ", " : "" ) +
-					( mailPart.type != null ? mailPart.type : "unknown" ) );
+					( mailPart.type != null ? mailPart.type : _("unknown") ) );
 			
 			if( level == 0 && mailPart.version == null ) {
 				/*
@@ -469,18 +470,18 @@ public class WebMail extends HttpServlet
 				String encoding = mailPart.encoding;
 				if( encoding == null ) {
 					encoding = "7bit";
-					reason += "Warning: no transfer encoding found, fallback to 7bit." + br;
+					reason += _("Warning: no transfer encoding found, fallback to 7bit.") + br;
 				}
 				Encoding e = EncodingFactory.getEncoding( encoding );
 				if( e == null ) {
 					showBody = false;
-					reason += "No encoder found for encoding '" + quoteHTML( encoding ) + "'.";
+					reason += _("No encoder found for encoding \\''{0}\\''.", quoteHTML( encoding ));
 				}
 				else {
 					String charset = mailPart.charset;
 					if( charset == null ) {
 						charset = "US-ASCII";
-						reason += "Warning: no charset found, fallback to US-ASCII." + br;
+						reason += _("Warning: no charset found, fallback to US-ASCII.") + br;
 					}
 					try {
 						ReadBuffer decoded = e.decode( mailPart.buffer.content, mailPart.beginBody, mailPart.end - mailPart.beginBody );
@@ -494,11 +495,11 @@ public class WebMail extends HttpServlet
 					}
 					catch( UnsupportedEncodingException uee ) {
 						showBody = false;
-						reason = "Charset '" + quoteHTML( mailPart.charset ) + "' not supported." + br;
+						reason = _("Charset \\''{0}\\'' not supported.", quoteHTML( mailPart.charset )) + br;
 					}
 					catch (Exception e1) {
 						showBody = false;
-						reason += "Part (" + ident + ") not shown, because of " + e1.getClass().getName() + br;
+						reason += _("Part ({0}) not shown, because of {1}", ident, e1.getClass().getName()) + br;
 					}
 				}
 			}
@@ -521,11 +522,11 @@ public class WebMail extends HttpServlet
 			if( prepareAttachment ) {
 				if( html ) {
 					out.println( "<p class=\"mailbody\">" );
-					out.println( "<a target=\"_blank\" href=\"" + myself + "?" + DOWNLOAD + "=" + mailPart.hashCode() + "\">Download</a> attachment (" + ident + "). File is packed into a zipfile for security reasons." );
+					out.println( "<a target=\"_blank\" href=\"" + myself + "?" + DOWNLOAD + "=" + mailPart.hashCode() + "\">" + _("Download") + "</a> " + _("attachment ({0}).", ident) + " " + _("File is packed into a zipfile for security reasons.") );
 					out.println( "</p>" );					
 				}
 				else {
-					out.println( "Attachment (" + ident + ")." );
+					out.println( _("Attachment ({0}).", ident) );
 				}
 			}
 			if( html )
@@ -575,52 +576,52 @@ public class WebMail extends HttpServlet
 			if( buttonPressed( request, LOGIN ) ) {
 				
 				if( user == null || user.length() == 0 ) {
-					sessionObject.error += "Need username for authentication.<br>";
+					sessionObject.error += _("Need username for authentication.") + "<br>";
 					doContinue = false;
 				}
 				if( pass == null || pass.length() == 0 ) {
-					sessionObject.error += "Need password for authentication.<br>";
+					sessionObject.error += _("Need password for authentication.") + "<br>";
 					doContinue = false;
 				}
 				if( host == null || host.length() == 0 ) {
-					sessionObject.error += "Need hostname for connect.<br>";
+					sessionObject.error += _("Need hostname for connect.") + "<br>";
 					doContinue = false;
 				}
 				int pop3PortNo = 0;
 				if( pop3Port == null || pop3Port.length() == 0 ) {
-					sessionObject.error += "Need port number for pop3 connect.<br>";
+					sessionObject.error += _("Need port number for pop3 connect.") + "<br>";
 					doContinue = false;
 				}
 				else {
 					try {
 						pop3PortNo = Integer.parseInt( pop3Port );
 						if( pop3PortNo < 0 || pop3PortNo > 65535 ) {
-							sessionObject.error += "POP3 port number is not in range 0..65535.<br>";
+							sessionObject.error += _("POP3 port number is not in range 0..65535.") + "<br>";
 							doContinue = false;
 						}
 					}
 					catch( NumberFormatException nfe )
 					{
-						sessionObject.error += "POP3 port number is invalid.<br>";
+						sessionObject.error += _("POP3 port number is invalid.") + "<br>";
 						doContinue = false;
 					}
 				}
 				int smtpPortNo = 0;
 				if( smtpPort == null || smtpPort.length() == 0 ) {
-					sessionObject.error += "Need port number for smtp connect.<br>";
+					sessionObject.error += _("Need port number for smtp connect.") + "<br>";
 					doContinue = false;
 				}
 				else {
 					try {
 						smtpPortNo = Integer.parseInt( smtpPort );
 						if( smtpPortNo < 0 || smtpPortNo > 65535 ) {
-							sessionObject.error += "SMTP port number is not in range 0..65535.<br>";
+							sessionObject.error += _("SMTP port number is not in range 0..65535.") + "<br>";
 							doContinue = false;
 						}
 					}
 					catch( NumberFormatException nfe )
 					{
-						sessionObject.error += "SMTP port number is invalid.<br>";
+						sessionObject.error += _("SMTP port number is invalid.") + "<br>";
 						doContinue = false;
 					}
 				}
@@ -667,11 +668,11 @@ public class WebMail extends HttpServlet
 				sessionObject.mailbox.close();
 				sessionObject.mailbox = null;
 			}
-			sessionObject.info += "User logged out.<br>";
+			sessionObject.info += _("User logged out.") + "<br>";
 			sessionObject.state = STATE_AUTH;
 		}
 		else if( sessionObject.mailbox == null ) {
-			sessionObject.error += "Internal error, lost connection.<br>";
+			sessionObject.error += _("Internal error, lost connection.") + "<br>";
 			sessionObject.state = STATE_AUTH;
 		}
 	}
@@ -767,7 +768,7 @@ public class WebMail extends HttpServlet
 							sessionObject.subject = "Re: " + mail.formattedSubject;
 							StringWriter text = new StringWriter();
 							PrintWriter pw = new PrintWriter( text );
-							pw.println( "On " + mail.formattedDate + " " + sessionObject.replyTo + " wrote:" );
+							pw.println( _("On {0} {1} wrote:", mail.formattedDate, sessionObject.replyTo) );
 							StringWriter text2 = new StringWriter();
 							PrintWriter pw2 = new PrintWriter( text2 );
 							showPart( pw2, mail.part, 0, TEXT_ONLY );
@@ -814,7 +815,7 @@ public class WebMail extends HttpServlet
 							pw.println();
 							pw.println();
 							pw.println();
-							pw.println( "---- begin forwarded mail ----" );
+							pw.println( "---- " + _("begin forwarded mail") + " ----" );
 							pw.println( "From: " + sender );
 							if( mail.to != null ) {
 								String pad = "To: ";
@@ -836,14 +837,14 @@ public class WebMail extends HttpServlet
 								pw.print( "Date: " + mail.dateString );
 							pw.println();
 							showPart( pw, mail.part, 0, TEXT_ONLY );
-							pw.println( "----  end forwarded mail  ----" );
+							pw.println( "----  " + _("end forwarded mail") + "  ----" );
 							pw.flush();
 							sessionObject.body = text.toString();
 						}
 						sessionObject.state = STATE_NEW;
 					}
 					else {
-						sessionObject.error += "Could not fetch mail body.<br>";
+						sessionObject.error += _("Could not fetch mail body.") + "<br>";
 					}
 				}
 			}
@@ -871,7 +872,7 @@ public class WebMail extends HttpServlet
 				}
 				catch( NumberFormatException nfe )
 				{
-					sessionObject.error += "Message id not valid.<br>";
+					sessionObject.error += _("Message id not valid.") + "<br>";
 				}
 			}
 		}
@@ -954,16 +955,16 @@ public class WebMail extends HttpServlet
 								sessionObject.attachments.add( attachment );
 							}
 							else {
-								sessionObject.error += "No Encoding found for " + encodeTo + "<br>";
+								sessionObject.error += _("No Encoding found for {0}", encodeTo) + "<br>";
 							}
 						}
 						catch (EncodingException e1) {
-							sessionObject.error += "Could not encode data: " + e1.getMessage();
+							sessionObject.error += _("Could not encode data: {0}", e1.getMessage());
 						}
 					}
 				}
 				catch (IOException e) {
-					sessionObject.error += "Error reading uploaded file: " + e.getMessage() + "<br>";
+					sessionObject.error += _("Error reading uploaded file: {0}", e.getMessage()) + "<br>";
 				}
 			}
 		}
@@ -1041,7 +1042,7 @@ public class WebMail extends HttpServlet
 					sessionObject.showAttachment = part;
 			}
 			catch( NumberFormatException nfe ) {
-				sessionObject.error += "Error parsing download parameter.";
+				sessionObject.error += _("Error parsing download parameter.");
 			}
 		}
 	}
@@ -1085,7 +1086,7 @@ public class WebMail extends HttpServlet
 					sessionObject.folder.setPageSize( pageSize );
 			}
 			catch( NumberFormatException nfe ) {
-				sessionObject.error += "Invalid pagesize number, resetting to default value.<br>";
+				sessionObject.error += _("Invalid pagesize number, resetting to default value.") + "<br>";
 			}
 		}
 		if( buttonPressed( request, PREVPAGE ) ) {
@@ -1109,7 +1110,7 @@ public class WebMail extends HttpServlet
 			if( m != -1 )
 				sessionObject.reallyDelete = true;
 			else
-				sessionObject.error += "No messages marked for deletion.<br>";
+				sessionObject.error += _("No messages marked for deletion.") + "<br>";
 		}
 		else {
 			int numberDeleted = 0;
@@ -1129,7 +1130,7 @@ public class WebMail extends HttpServlet
 										numberDeleted++;
 									}
 									else
-										sessionObject.error += "Error deleting message: " + sessionObject.mailbox.lastError() + "<br>";
+										sessionObject.error += _("Error deleting message: {0}", sessionObject.mailbox.lastError()) + "<br>";
 								}
 							}
 						}
@@ -1140,7 +1141,7 @@ public class WebMail extends HttpServlet
 				sessionObject.mailbox.performDelete();
 				sessionObject.folder.setElements( sessionObject.mailbox.getUIDLs() );
 				sessionObject.pageChanged = true;
-				sessionObject.info += numberDeleted + " messages deleted.";
+				sessionObject.info += ngettext("1 message deleted.", "{0} messages deleted.", numberDeleted);
 			}
 			sessionObject.reallyDelete = false;
 		}
@@ -1260,11 +1261,11 @@ public class WebMail extends HttpServlet
 				 * build subtitle
 				 */
 				if( sessionObject.state == STATE_AUTH )
-					subtitle = "Login";
+					subtitle = _("Login");
 				else if( sessionObject.state == STATE_LIST )
-					subtitle = "" + sessionObject.mailbox.getNumMails() + " Messages";
+					subtitle = ngettext("1 Message", "{0} Messages", sessionObject.mailbox.getNumMails());
 				else if( sessionObject.state == STATE_SHOW )
-					subtitle = "Show Message";
+					subtitle = _("Show Message");
 
 				response.setContentType( "text/html" );
 				out.println( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>" );
@@ -1321,12 +1322,12 @@ public class WebMail extends HttpServlet
 						content = encoding.decode( part.buffer.content, part.beginBody + 2, part.end - part.beginBody - 2 );
 					}
 					catch (DecodingException e) {
-						sessionObject.error += "Error decoding content: " + e.getMessage() + "<br>";
+						sessionObject.error += _("Error decoding content: {0}", e.getMessage()) + "<br>";
 						content = null;
 					}
 				}
 				else {
-					sessionObject.error += "Error decoding content: No encoder found.";
+					sessionObject.error += _("Error decoding content: No encoder found.");
 					content = null;
 				}
 			}
@@ -1373,7 +1374,7 @@ public class WebMail extends HttpServlet
 		String to = request.getParameter( NEW_TO );
 		String cc = request.getParameter( NEW_CC );
 		String bcc = request.getParameter( NEW_BCC );
-		String subject = request.getParameter( NEW_SUBJECT, "no subject" );
+		String subject = request.getParameter( NEW_SUBJECT, _("no subject") );
 		String text = request.getParameter( NEW_TEXT, "" );
 
 		String prop = Config.getProperty( CONFIG_SENDER_FIXED, "true" );
@@ -1390,13 +1391,13 @@ public class WebMail extends HttpServlet
 		
 		if( from == null || !Mail.validateAddress( from ) ) {
 			ok = false;
-			sessionObject.error += "Found no valid sender address.<br>";
+			sessionObject.error += _("Found no valid sender address.") + "<br>";
 		}
 		else {
 			sender = Mail.getAddress( from );
 			if( sender == null || sender.length() == 0 ) {
 				ok = false;
-				sessionObject.error += "Found no valid address in '" + quoteHTML( from ) + "'.<br>";
+				sessionObject.error += _("Found no valid address in \\''{0}\\''.", quoteHTML( from )) + "<br>";
 			}
 		}
 		
@@ -1415,19 +1416,19 @@ public class WebMail extends HttpServlet
 		
 		if( recipients.isEmpty() ) {
 			ok = false;
-			sessionObject.error += "No recipients found.<br>";
+			sessionObject.error += _("No recipients found.") + "<br>";
 		}
 		Encoding qp = EncodingFactory.getEncoding( "quoted-printable" );
 		Encoding hl = EncodingFactory.getEncoding( "HEADERLINE" );
 		
 		if( qp == null ) {
 			ok = false;
-			sessionObject.error += "Quoted printable encoder not available.";
+			sessionObject.error += _("Quoted printable encoder not available.");
 		}
 		
 		if( hl == null ) {
 			ok = false;
-			sessionObject.error += "Header line encoder not available.";
+			sessionObject.error += _("Header line encoder not available.");
 		}
 
 		if( ok ) {
@@ -1478,7 +1479,7 @@ public class WebMail extends HttpServlet
 						sessionObject.user, sessionObject.pass,
 						sender, recipients.toArray(), body.toString() ) ) {
 					
-					sessionObject.info += "Mail sent.";
+					sessionObject.info += _("Mail sent.");
 					
 					if( sessionObject.attachments != null )
 						sessionObject.attachments.clear();
@@ -1515,11 +1516,11 @@ public class WebMail extends HttpServlet
 	 */
 	private void showCompose( PrintWriter out, SessionObject sessionObject, RequestWrapper request )
 	{
-		out.println( button( SEND, "Send" ) +
-				button( CANCEL, "Cancel" ) + spacer +
-				(sessionObject.attachments != null && (!sessionObject.attachments.isEmpty()) ? button( DELETE_ATTACHMENT, "Delete Attachment" ) : button2( DELETE_ATTACHMENT, "Delete Attachment" ) ) + spacer +
-				button( RELOAD, "Reload Config" ) + spacer +
-				button( LOGOUT, "Logout" ) );
+		out.println( button( SEND, _("Send") ) +
+				button( CANCEL, _("Cancel") ) + spacer +
+				(sessionObject.attachments != null && (!sessionObject.attachments.isEmpty()) ? button( DELETE_ATTACHMENT, _("Delete Attachment") ) : button2( DELETE_ATTACHMENT, _("Delete Attachment") ) ) + spacer +
+				button( RELOAD, _("Reload Config") ) + spacer +
+				button( LOGOUT, _("Logout") ) );
 
 		String from = (String)request.getParameter( NEW_FROM );
 		String fixed = Config.getProperty( CONFIG_SENDER_FIXED, "true" );
@@ -1542,21 +1543,21 @@ public class WebMail extends HttpServlet
 		
 		out.println( "<table cellspacing=\"0\" cellpadding=\"5\">\n" +
 				"<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" +
-				"<tr><td align=\"right\">From:</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_FROM + "\" value=\"" + from + "\" " + ( fixed.compareToIgnoreCase( "false" ) != 0 ? "disabled" : "" ) +"></td></tr>\n" +
-				"<tr><td align=\"right\">To:</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_TO + "\" value=\"" + to + "\"></td></tr>\n" +
-				"<tr><td align=\"right\">Cc:</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_CC + "\" value=\"" + cc + "\"></td></tr>\n" +
-				"<tr><td align=\"right\">Bcc:</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_BCC + "\" value=\"" + bcc + "\"></td></tr>\n" +
-				"<tr><td align=\"right\">Subject:</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_SUBJECT + "\" value=\"" + subject + "\"></td></tr>\n" +
-				"<tr><td>&nbsp;</td><td align=\"left\"><input type=\"checkbox\" class=\"optbox\" name=\"" + NEW_BCC_TO_SELF + "\" value=\"1\"" + ( bccToSelf.compareToIgnoreCase( "false" ) != 0 ? "checked" : "" )+ ">Bcc to self</td></tr>\n" +
+				"<tr><td align=\"right\">" + _("From:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_FROM + "\" value=\"" + from + "\" " + ( fixed.compareToIgnoreCase( "false" ) != 0 ? "disabled" : "" ) +"></td></tr>\n" +
+				"<tr><td align=\"right\">" + _("To:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_TO + "\" value=\"" + to + "\"></td></tr>\n" +
+				"<tr><td align=\"right\">" + _("Cc:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_CC + "\" value=\"" + cc + "\"></td></tr>\n" +
+				"<tr><td align=\"right\">" + _("Bcc:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_BCC + "\" value=\"" + bcc + "\"></td></tr>\n" +
+				"<tr><td align=\"right\">" + _("Subject:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_SUBJECT + "\" value=\"" + subject + "\"></td></tr>\n" +
+				"<tr><td>&nbsp;</td><td align=\"left\"><input type=\"checkbox\" class=\"optbox\" name=\"" + NEW_BCC_TO_SELF + "\" value=\"1\"" + ( bccToSelf.compareToIgnoreCase( "false" ) != 0 ? "checked" : "" )+ ">" + _("Bcc to self") + "</td></tr>\n" +
 				"<tr><td colspan=\"2\" align=\"center\"><textarea cols=\"" + Config.getProperty( CONFIG_COMPOSER_COLS, 80 )+ "\" rows=\"" + Config.getProperty( CONFIG_COMPOSER_ROWS, 10 )+ "\" name=\"" + NEW_TEXT + "\">" + text + "</textarea>" +
 				"<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" +
-				"<tr><td align=\"right\">New Attachment:</td><td align=\"left\"><input type=\"file\" size=\"50%\" name=\"" + NEW_FILENAME + "\" value=\"\"><input type=\"submit\" name=\"" + NEW_UPLOAD + "\" value=\"Upload File\"></td></tr>" );
+				"<tr><td align=\"right\">" + _("New Attachment:") + "</td><td align=\"left\"><input type=\"file\" size=\"50%\" name=\"" + NEW_FILENAME + "\" value=\"\"><input type=\"submit\" name=\"" + NEW_UPLOAD + "\" value=\"" + _("Upload File") + "\"></td></tr>" );
 		
 		if( sessionObject.attachments != null && !sessionObject.attachments.isEmpty() ) {
 			boolean wroteHeader = false;
 			for( Iterator it = sessionObject.attachments.iterator(); it.hasNext(); ) {
 				if( !wroteHeader ) {
-					out.println( "<tr><td colspan=\"2\" align=\"center\">Attachments:</td></tr>" );
+					out.println( "<tr><td colspan=\"2\" align=\"center\">" + _("Attachments:") + "</td></tr>" );
 					wroteHeader = true;
 				}
 				Attachment attachment = (Attachment)it.next();
@@ -1578,12 +1579,12 @@ public class WebMail extends HttpServlet
 		String smtp = Config.getProperty( CONFIG_PORTS_SMTP, "" + DEFAULT_SMTPPORT );
 		
 		out.println( "<table cellspacing=\"0\" cellpadding=\"5\">\n" +
-			"<tr><td align=\"right\" width=\"30%\">User</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + USER + "\" value=\"" + ( RELEASE ? "" : "test") + "\"></td></tr>\n" +
-			"<tr><td align=\"right\" width=\"30%\">Pass</td><td width=\"40%\" align=\"left\"><input type=\"password\" size=\"32\" name=\"pass\" value=\"" + ( RELEASE ? "" : "test") + "\"></td></tr>\n" +
-			"<tr><td align=\"right\" width=\"30%\">Host</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + HOST +"\" value=\"" + host + "\"" + ( fixed ? " disabled" : "" ) + "></td></tr>\n" +
-			"<tr><td align=\"right\" width=\"30%\">POP3-Port</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + POP3 +"\" value=\"" + pop3 + "\"" + ( fixed ? " disabled" : "" ) + "></td></tr>\n" +
-			"<tr><td align=\"right\" width=\"30%\">SMTP-Port</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + SMTP +"\" value=\"" + smtp + "\"" + ( fixed ? " disabled" : "" ) + "></td></tr>\n" +
-			"<tr><td align=\"center\" colspan=\"2\"><a href=\"http://hq.postman.i2p/?page_id=16\">Create Account</a> " + button( LOGIN, "Login" ) + " <input type=\"reset\" value=\"Reset\"></td></tr>\n" +
+			"<tr><td align=\"right\" width=\"30%\">" + _("User") + "</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + USER + "\" value=\"" + ( RELEASE ? "" : "test") + "\"></td></tr>\n" +
+			"<tr><td align=\"right\" width=\"30%\">" + _("Pass") + "</td><td width=\"40%\" align=\"left\"><input type=\"password\" size=\"32\" name=\"pass\" value=\"" + ( RELEASE ? "" : "test") + "\"></td></tr>\n" +
+			"<tr><td align=\"right\" width=\"30%\">" + _("Host") + "</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + HOST +"\" value=\"" + host + "\"" + ( fixed ? " disabled" : "" ) + "></td></tr>\n" +
+			"<tr><td align=\"right\" width=\"30%\">" + _("POP3-Port") + "</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + POP3 +"\" value=\"" + pop3 + "\"" + ( fixed ? " disabled" : "" ) + "></td></tr>\n" +
+			"<tr><td align=\"right\" width=\"30%\">" + _("SMTP-Port") + "</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + SMTP +"\" value=\"" + smtp + "\"" + ( fixed ? " disabled" : "" ) + "></td></tr>\n" +
+			"<tr><td align=\"center\" colspan=\"2\"><a href=\"http://hq.postman.i2p/?page_id=16\">" + _("Create Account") + "</a> " + button( LOGIN, _("Login") ) + " <input type=\"reset\" value=\"" + _("Reset") + "\"></td></tr>\n" +
 			"</table>");
 	}
 	/**
@@ -1595,21 +1596,21 @@ public class WebMail extends HttpServlet
 	private void showFolder( PrintWriter out, SessionObject sessionObject, RequestWrapper request )
 	{
 		if( sessionObject.reallyDelete ) {
-			out.println( "<p class=\"error\">Really delete the marked messages? " + button( REALLYDELETE, "Yes, really delete them!" ) + "</p>" );
+			out.println( "<p class=\"error\">" + _("Really delete the marked messages?") + " " + button( REALLYDELETE, _("Yes, really delete them!") ) + "</p>" );
 		}
-		out.println( button( NEW, "New" ) + spacer +
-			button( REPLY, "Reply" ) +
-			button( REPLYALL, "Reply All" ) +
-			button( FORWARD, "Forward" ) + spacer +
-			button( DELETE, "Delete" ) + spacer +
-			button( REFRESH, "Check Mail" ) + spacer +
-			button( RELOAD, "Reload Config" ) + spacer +
-			button( LOGOUT, "Logout" ) + "<table cellspacing=\"0\" cellpadding=\"5\">\n" +
+		out.println( button( NEW, _("New") ) + spacer +
+			button( REPLY, _("Reply") ) +
+			button( REPLYALL, _("Reply All") ) +
+			button( FORWARD, _("Forward") ) + spacer +
+			button( DELETE, _("Delete") ) + spacer +
+			button( REFRESH, _("Check Mail") ) + spacer +
+			button( RELOAD, _("Reload Config") ) + spacer +
+			button( LOGOUT, _("Logout") ) + "<table cellspacing=\"0\" cellpadding=\"5\">\n" +
 			"<tr><td colspan=\"8\"><hr></td></tr>\n<tr>" +
-			thSpacer + "<th>" + sortHeader( SORT_SENDER, "Sender" ) + "</th>" +
-			thSpacer + "<th>" + sortHeader( SORT_SUBJECT, "Subject" ) + "</th>" +
-			thSpacer + "<th>" + sortHeader( SORT_DATE, "Date" ) + sortHeader( SORT_ID, "" ) + "</th>" +
-			thSpacer + "<th>" + sortHeader( SORT_SIZE, "Size" ) + "</th></tr>" );
+			thSpacer + "<th>" + sortHeader( SORT_SENDER, _("Sender") ) + "</th>" +
+			thSpacer + "<th>" + sortHeader( SORT_SUBJECT, _("Subject") ) + "</th>" +
+			thSpacer + "<th>" + sortHeader( SORT_DATE, _("Date") ) + sortHeader( SORT_ID, "" ) + "</th>" +
+			thSpacer + "<th>" + sortHeader( SORT_SIZE, _("Size") ) + "</th></tr>" );
 		int bg = 0;
 		int i = 0;
 		for( Iterator it = sessionObject.folder.currentPageIterator(); it != null && it.hasNext(); ) {
@@ -1635,26 +1636,26 @@ public class WebMail extends HttpServlet
 					", invert=" + sessionObject.invert +
 					", clear=" + sessionObject.clear );
 			out.println( "<tr class=\"list" + bg + "\"><td><input type=\"checkbox\" class=\"optbox\" name=\"check" + i + "\" value=\"1\"" + 
-					( idChecked ? "checked" : "" ) + ">" + ( RELEASE ? "" : "" + i ) + "</td><td>" + link + mail.shortSender + "</a></td><td>&nbsp;</td><td>" + link + mail.shortSubject + "</a></td><td>&nbsp;</td><td>" + mail.formattedDate + "</a></td><td>&nbsp;</td><td>" + mail.size + " Bytes</a></td></tr>" );
+					( idChecked ? "checked" : "" ) + ">" + ( RELEASE ? "" : "" + i ) + "</td><td>" + link + mail.shortSender + "</a></td><td>&nbsp;</td><td>" + link + mail.shortSubject + "</a></td><td>&nbsp;</td><td>" + mail.formattedDate + "</a></td><td>&nbsp;</td><td>" + ngettext("1 Byte", "{0} Bytes", mail.size) + "</a></td></tr>" );
 			bg = 1 - bg;
 			i++;
 		}
 		out.println( "<tr><td colspan=\"8\"><hr></td></tr>\n</table>" +
-				button( MARKALL, "Mark All" ) +
-				button( INVERT, "Invert Selection" ) +
-				button( CLEAR, "Clear" ) +
+				button( MARKALL, _("Mark All") ) +
+				button( INVERT, _("Invert Selection") ) +
+				button( CLEAR, _("Clear") ) +
 				"<br>" +
 				( sessionObject.folder.isFirstPage() ?
-										 button2( FIRSTPAGE, "First" ) + button2( PREVPAGE, "Previous" ) :
- 										 button( FIRSTPAGE, "First" ) + button( PREVPAGE, "Previous" ) ) +
-				" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Page&nbsp;" + sessionObject.folder.getCurrentPage() + "&nbsp;of&nbsp;" + sessionObject.folder.getPages() + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " +
+										 button2( FIRSTPAGE, _("First") ) + button2( PREVPAGE, _("Previous") ) :
+ 										 button( FIRSTPAGE, _("First") ) + button( PREVPAGE, _("Previous") ) ) +
+				" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + _("Page {0} of {1}", sessionObject.folder.getCurrentPage(), sessionObject.folder.getPages()) + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " +
 				( sessionObject.folder.isLastPage() ? 
-														   button2( NEXTPAGE, "Next" ) + button2( LASTPAGE, "Last" ) :
-														   button( NEXTPAGE, "Next" ) + button( LASTPAGE, "Last" ) ) +
+														   button2( NEXTPAGE, _("Next") ) + button2( LASTPAGE, _("Last") ) :
+														   button( NEXTPAGE, _("Next") ) + button( LASTPAGE, _("Last") ) ) +
 														   
 				"<br>" +
-				"Pagesize:&nbsp;<input type=\"text\" name=\"" + PAGESIZE + "\" size=\"4\" value=\"" +  sessionObject.folder.getPageSize() + "\">" +
-				button( SETPAGESIZE, "Set" ) );
+				_("Pagesize:") + "&nbsp;<input type=\"text\" name=\"" + PAGESIZE + "\" size=\"4\" value=\"" +  sessionObject.folder.getPageSize() + "\">" +
+				button( SETPAGESIZE, _("Set") ) );
 	}
 	/**
 	 * 
@@ -1664,7 +1665,7 @@ public class WebMail extends HttpServlet
 	private void showMessage( PrintWriter out, SessionObject sessionObject )
 	{
 		if( sessionObject.reallyDelete ) {
-			out.println( "<p class=\"error\">Really delete this messages? " + button( REALLYDELETE, "Yes, really delete it!" ) + "</p>" );
+			out.println( "<p class=\"error\">" + _("Really delete this message?") + " " + button( REALLYDELETE, _("Yes, really delete it!") ) + "</p>" );
 		}
 		Mail mail = sessionObject.mailCache.getMail( sessionObject.showUIDL, MailCache.FETCH_ALL );
 		if( mail != null && mail.body != null && mail.part == null ) {
@@ -1676,33 +1677,53 @@ public class WebMail extends HttpServlet
 			out.println( quoteHTML( new String( mail.body.content, mail.body.offset, mail.body.length ) ) );
 			out.println( "-->" );
 		}
-		out.println( button( NEW, "New" ) + spacer +
-			button( REPLY, "Reply" ) +
-			button( REPLYALL, "Reply All" ) +
-			button( FORWARD, "Forward" ) + spacer +
-			button( DELETE, "Delete" ) + spacer +
-			( sessionObject.folder.isFirstElement( sessionObject.showUIDL ) ? button2( PREV, "Previous" ) : button( PREV, "Previous" ) ) +
-			( sessionObject.folder.isLastElement( sessionObject.showUIDL ) ? button2( NEXT, "Next" ) : button( NEXT, "Next" ) ) + spacer +
-			button( LIST, "Back to Folder" ) + spacer +
-			button( RELOAD, "Reload Config" ) + spacer +
-			button( LOGOUT, "Logout" ) );
+		out.println( button( NEW, _("New") ) + spacer +
+			button( REPLY, _("Reply") ) +
+			button( REPLYALL, _("Reply All") ) +
+			button( FORWARD, _("Forward") ) + spacer +
+			button( DELETE, _("Delete") ) + spacer +
+			( sessionObject.folder.isFirstElement( sessionObject.showUIDL ) ? button2( PREV, _("Previous") ) : button( PREV, _("Previous") ) ) +
+			( sessionObject.folder.isLastElement( sessionObject.showUIDL ) ? button2( NEXT, _("Next") ) : button( NEXT, _("Next") ) ) + spacer +
+			button( LIST, _("Back to Folder") ) + spacer +
+			button( RELOAD, _("Reload Config") ) + spacer +
+			button( LOGOUT, _("Logout") ) );
 		if( mail != null ) {
 			out.println( "<table cellspacing=\"0\" cellpadding=\"5\">\n" +
 					"<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" +
-					"<tr class=\"mailhead\"><td align=\"right\">From:</td><td align=\"left\">" + quoteHTML( mail.formattedSender ) + "</td></tr>\n" +
-					"<tr class=\"mailhead\"><td align=\"right\">Date:</td><td align=\"left\">" + mail.quotedDate + "</td></tr>\n" +
-					"<tr class=\"mailhead\"><td align=\"right\">Subject:</td><td align=\"left\">" + quoteHTML( mail.formattedSubject ) + "</td></tr>\n" +
+					"<tr class=\"mailhead\"><td align=\"right\">" + _("From:") + "</td><td align=\"left\">" + quoteHTML( mail.formattedSender ) + "</td></tr>\n" +
+					"<tr class=\"mailhead\"><td align=\"right\">" + _("Date:") + "</td><td align=\"left\">" + mail.quotedDate + "</td></tr>\n" +
+					"<tr class=\"mailhead\"><td align=\"right\">" + _("Subject:") + "</td><td align=\"left\">" + quoteHTML( mail.formattedSubject ) + "</td></tr>\n" +
 					"<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>" );
 			if( mail.body != null ) {
 				showPart( out, mail.part, 0, SHOW_HTML );
 			}
 			else {
-				out.println( "<tr class=\"mailbody\"><td colspan=\"2\" align=\"center\"><p class=\"error\">Could not fetch mail body.</p></td></tr>" );
+				out.println( "<tr class=\"mailbody\"><td colspan=\"2\" align=\"center\"><p class=\"error\">" + _("Could not fetch mail body.") + "</p></td></tr>" );
 			}
 		}
 		else {
-			out.println( "<tr class=\"mailbody\"><td colspan=\"2\" align=\"center\"><p class=\"error\">Could not fetch mail.</p></td></tr>" );
+			out.println( "<tr class=\"mailbody\"><td colspan=\"2\" align=\"center\"><p class=\"error\">" + _("Could not fetch mail.") + "</p></td></tr>" );
 		}
 		out.println( "<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n</table>" );
 	}
+
+	/** translate */
+	private static String _(String s) {
+		return Messages.getString(s);
+	}
+
+	/** translate */
+	private static String _(String s, Object o) {
+		return Messages.getString(s, o);
+	}
+
+	/** translate */
+	private static String _(String s, Object o, Object o2) {
+		return Messages.getString(s, o, o2);
+	}
+	
+	/** translate */
+    private String ngettext(String s, String p, int n) {
+        return Messages.getString(n, s, p);
+    }
 }
diff --git a/apps/systray/java/build.xml b/apps/systray/java/build.xml
index 9d48f902cbbf0bcafe163927deb50d91b93d8fbd..dc8f08afb81d6bf6a57d6cee18bbbaf01ccca8f2 100644
--- a/apps/systray/java/build.xml
+++ b/apps/systray/java/build.xml
@@ -16,28 +16,41 @@
             source="1.5"
             target="1.5"
             destdir="./build/obj"
+            includeAntRuntime="false"
             includes="**/*.java"
             classpath="./lib/systray4j.jar:../../../core/java/build/i2p.jar" >
             <compilerarg line="${javac.compilerargs}" />
         </javac>
     </target>
-    <target name="jar" depends="compile" unless="jar.uptodate">
-        <mkdir dir="./build/jar_temp" />
-        <copy todir="./build/jar_temp">
-            <fileset dir="./build/obj" includes="**/*.class" />
-        </copy>
-        <jar destfile="./build/systray.jar" basedir="./build/jar_temp" includes="**/*">
+
+    <target name="jar" depends="compile, jarUpToDate" unless="jar.uptodate">
+        <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="." />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
+        <jar destfile="./build/systray.jar" basedir="./build/obj" includes="**/*.class">
             <manifest>
                 <attribute name="Main-Class" value="net.i2p.apps.systray.SysTray" />
                 <attribute name="Class-Path" value="systray4j.jar" />
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
             </manifest>
         </jar>
-        <delete dir="./build/jar_temp" />
     </target>
 
-    <uptodate property="jar.uptodate" targetfile="./build/systray.jar">
-        <srcfiles dir= "src" includes="**/*.java" />
-    </uptodate>
+    <target name="jarUpToDate">
+        <uptodate property="jar.uptodate" targetfile="./build/systray.jar">
+            <srcfiles dir= "build/obj" includes="**/*.class" />
+        </uptodate>
+    </target>
 
     <target name="javadoc">
         <mkdir dir="./build" />
diff --git a/build.xml b/build.xml
index 6a96b143c656619c52e5269e7225afdbd720aa77..51fd85ff555774aa4df30241a7e982d4845b847e 100644
--- a/build.xml
+++ b/build.xml
@@ -32,6 +32,7 @@
         <echo message="  updaterRouter:  updater with the i2p.jar and router.jar only" />
         <echo message="  distclean: clean up all derived files" />
         <echo message="  syndie:    generate a standalone syndie install" />
+        <echo message="  desktopgui: generate a standalone desktopgui install" />
         <echo message="  i2psnark:  generate a standalone i2psnark install" />
         <echo message="  justBOB:  generate a standalone BOB-one.jar" />
         <echo message="  javadoc:   generate javadoc for the entire project into ./build/javadoc" />
@@ -40,12 +41,9 @@
         <echo message="  debian: generate Debian packages in ./debian/packages" />
         <echo message="          (libc6-i686 and libc6-amd64 required, ant>=1.8 required)" />
         <echo message="  debianrepo: build a Debian repository (reprepro required)" />
-        <echo message="  updaterWithDesktopgui: tar the built files and desktopgui in an i2pupdate.zip" />
-        <echo message="  pkgWithDesktopgui: distclean then package everything up with the desktopgui" />
-        <echo message="  distWithDesktopgui: pkgWithDesktopgui and javadoc" />
-        <echo message="  distcleanWithDesktopgui: clean up all derived files (including desktopgui files)" />
         <echo message="  poupdate: update the .po files for translators" />
-    </target>
+        <echo message="  pkg-portable-win32:  build a minimum portable version for win32" />
+   </target>
     <target name="debianhowto">
         <echo message="To build debian packages, you must run dpkg-buildpackage as root in the source directory. It will then run ant for you. dpkg-buildpackage is found in the 'dpkg-dev' package. Also it should work fine to use the 'fakeroot' package with dpkg-buildpackage, if you don't want to run as root. Please read 'man dpkg-buildpackage' before building any packages yourself." />
     </target>
@@ -64,15 +62,14 @@
 
     <target name="builddep" depends="builddepSmall, buildBOB, buildSAM, buildSusiMail, buildSusiDNS, buildI2PSnark" />
 
-    <target name="builddepSmall" depends="buildrouter, buildSystray, buildRouterConsole, buildStreaming, buildI2PTunnel, buildAddressbook" />
+    <target name="builddepSmall" depends="buildrouter, buildSystray, buildDesktopGui, buildRouterConsole, buildStreaming, buildI2PTunnel, buildAddressbook" />
 
     <!-- start of buildX, one for each sub-build.xml.
          Do not put ant tasks in the sub-build.xmls anymore,
          so the build will go faster.
       -->
 
-    <!-- TODO remove I2PTunnel dependency in BOB -->
-    <target name="buildBOB" depends="buildStreaming, buildI2PTunnel" >
+    <target name="buildBOB" depends="buildStreaming" >
         <ant dir="apps/BOB/" target="jar" />
     </target>
 
@@ -100,11 +97,18 @@
         <ant dir="apps/i2ptunnel/java/" target="build" />
     </target>
 
-    <target name="buildRouterConsole" depends="buildrouter, buildSystray, buildJetty" >
+    <target name="buildDesktopGui" depends="buildCore, buildrouter" >
+<!--
+        <ant dir="apps/desktopgui" target="clean" />
+-->
+        <ant dir="apps/desktopgui" target="jar" />
+    </target>
+
+    <target name="buildRouterConsole" depends="buildrouter, buildSystray, buildDesktopGui, buildJetty" >
         <ant dir="apps/routerconsole/java/" target="jar" />
     </target>
 
-    <target name="buildJetty" >
+    <target name="buildJetty" depends="buildProperties" >
         <ant dir="apps/jetty" target="build" />
     </target>
 
@@ -126,11 +130,21 @@
         <copy file="router/java/build/router.jar" todir="build/" />
     </target>
 
-    <target name="buildCore" >
+    <target name="buildCore" depends="buildProperties" >
         <ant dir="core/java/" target="jar" />
         <copy file="core/java/build/i2p.jar" todir="build/" />
     </target>
 
+    <target name="buildProperties" >
+        <exec executable="mtn" outputproperty="workspace.version" errorproperty="mtn.error1" failifexecutionfails="false" >
+            <arg value="automate" />
+            <arg value="get_base_revision_id" />
+        </exec>
+        <tstamp>
+            <format property="build.timestamp" pattern="yyyy-MM-dd HH:mm:ss z" timezone="UTC" locale="en" />
+        </tstamp>
+    </target>
+
     <!-- end of sub-build.xml targets -->
 
     <target name="buildWEB" depends="buildRouterConsole" >
@@ -164,11 +178,13 @@
 	</condition>
 	<ant target="doBuildEXE" />
     </target>
-    <target name="doBuildEXE" unless="noExe">
+    <target name="doBuildEXE" depends="buildProperties" unless="noExe">
         <jar destfile="./build/launchi2p.jar">
             <manifest>
 	     <attribute name="Main-Class" value="net.i2p.router.RouterLaunch" />
-	     <attribute name="Class-Path" value="lib/i2p.jar lib/router.jar lib/jbigi.jar lib/BOB.jar lib/sam.jar lib/mstreaming.jar lib/streaming.jar lib/routerconsole.jar lib/i2ptunnel.jar lib/org.mortbay.jetty.jar lib/javax.servlet.jar lib/jasper-compiler.jar lib/jasper-runtime.jar lib/commons-logging.jar lib/commons-el.jar lib/wrapper.jar lib/systray.jar lib/systray4j.jar" />
+	     <attribute name="Class-Path" value="lib/i2p.jar lib/router.jar lib/jbigi.jar lib/BOB.jar lib/sam.jar lib/mstreaming.jar lib/streaming.jar lib/routerconsole.jar lib/i2ptunnel.jar lib/org.mortbay.jetty.jar lib/javax.servlet.jar lib/jasper-compiler.jar lib/jasper-runtime.jar lib/commons-logging.jar lib/commons-el.jar lib/wrapper.jar lib/systray.jar lib/systray4j.jar lib/desktopgui.jar" />
+             <attribute name="Build-Date" value="${build.timestamp}" />
+             <attribute name="Base-Revision" value="${workspace.version}" />
 	    </manifest>
         </jar>
 	<!-- now the standalone launcher exe -->
@@ -196,6 +212,8 @@
         <copy file="apps/i2ptunnel/java/build/i2ptunnel.jar" todir="build/" />
         <copy file="apps/i2ptunnel/java/build/i2ptunnel.war" todir="build/" />
         <copy file="apps/systray/java/build/systray.jar" todir="build/" />
+        <copy file="apps/desktopgui/dist/desktopgui.jar" todir="build/" />
+        <copy file="installer/lib/jbigi/jbigi.jar" todir="build" />
         <copy file="apps/addressbook/dist/addressbook.war" todir="build/" />
     </target>
 
@@ -218,11 +236,15 @@
     </target>
 
     <!-- the apps need to compile the jsps to poupdate -->
-    <target name="poupdate" depends="buildRouter, buildStreaming, buildSystray, buildJetty" >
+    <target name="poupdate" depends="buildRouter, buildStreaming, buildSystray, buildJetty, buildDesktopGui" >
+        <echo message="Setting environment variable LG2 to a lang code (eg: de,zh,nl etc)" />
+        <echo message=" will restrict language update to the language you specified, leaving other language untact." />
         <ant dir="apps/routerconsole/java/" target="poupdate" />
         <ant dir="apps/i2psnark/java/" target="poupdate" />
         <ant dir="apps/i2ptunnel/java/" target="poupdate" />
         <ant dir="apps/susidns/src/" target="poupdate" />
+        <ant dir="apps/susimail/" target="poupdate" />
+        <ant dir="apps/desktopgui" target="poupdate" />
     </target>
     <target name="javadoc">
         <ant dir="apps/jetty" target="ensureJettylib" />
@@ -268,6 +290,7 @@
             <group title="SusiDNS Application" packages="i2p.susi.dns" />
             <group title="SusiMail Application" packages="i2p.susi.webmail:i2p.susi.webmail.*:i2p.susi.debug:i2p.susi.util" />
             <group title="Systray Application" packages="net.i2p.apps.systray" />
+            <group title="Desktopgui Application" packages="net.i2p.desktopgui.*" />
             <sourcepath>
                 <pathelement location="core/java/src" />
                 <!--<pathelement location="core/java/test" />-->
@@ -277,6 +300,7 @@
                 <pathelement location="apps/streaming/java/src" />
                 <pathelement location="apps/i2ptunnel/java/src" />
                 <pathelement location="apps/systray/java/src" />
+                <pathelement location="apps/desktopgui/src" />
                 <pathelement location="apps/routerconsole/java/src" />
                 <pathelement location="apps/addressbook/java/src" />
                 <pathelement location="apps/i2psnark/java/src" />
@@ -323,6 +347,7 @@
         <ant dir="apps/i2ptunnel/java/" target="distclean" />
         <ant dir="apps/sam/java/" target="distclean" />
         <ant dir="apps/BOB" target="clean" />
+        <ant dir="apps/desktopgui" target="clean" />
         <ant dir="apps/routerconsole/java/" target="distclean" />
         <ant dir="apps/addressbook/" target="distclean" />
         <ant dir="apps/susimail/" target="distclean" />
@@ -403,6 +428,7 @@
         <copy file="installer/resources/fixperms.bat" todir="pkg-temp/" />
         <copy file="installer/resources/install_i2p_service_winnt.bat" todir="pkg-temp/" />
         <copy file="installer/resources/postinstall.bat" todir="pkg-temp/" />
+        <copy file="installer/resources/set_config_dir_for_nt_service.bat" todir="pkg-temp/" />
         <copy file="installer/resources/uninstall_i2p_service_winnt.bat" todir="pkg-temp/" />
         <copy todir="pkg-temp/lib/wrapper/win32/">
             <fileset dir="installer/lib/wrapper/win32/" />
@@ -448,6 +474,7 @@
         <copy file="build/streaming.jar" todir="pkg-temp/lib/" />
         <copy file="build/org.mortbay.jetty.jar" todir="pkg-temp/lib/" />
         <copy file="build/router.jar" todir="pkg-temp/lib/" />
+        <copy file="build/desktopgui.jar" todir="pkg-temp/lib/" />
         <copy file="build/routerconsole.jar" todir="pkg-temp/lib/" />
         <!-- pulled out of routerconsole.jar in 0.7.12; name without version so we can overwrite if we upgrade  -->
         <copy file="apps/jrobin/jrobin-1.4.0.jar" tofile="pkg-temp/lib/jrobin.jar" />
@@ -490,7 +517,10 @@
         <mkdir dir="pkg-temp/eepsite/docroot/help" />
         <mkdir dir="pkg-temp/eepsite/docroot/help/lib" />
         <copy todir="pkg-temp/eepsite/docroot/" >
-            <fileset dir="installer/resources/eepsite.help/"  includes="robots.txt index.html help/pagetemplate.html help/index*.html **/*.png **/*.css" />
+            <fileset dir="installer/resources/eepsite.help/" />
+        </copy>
+        <copy todir="pkg-temp/eepsite/docroot/help/lib/" >
+            <fileset dir="installer/resources/icons/flags/" includes="cn.png de.png es.png fr.png ir.png it.png jp.png nl.png ru.png se.png us.png" />
         </copy>
         <copy file="installer/resources/themes/console/images/favicon.ico" tofile="pkg-temp/eepsite/docroot/favicon.ico" />
         <copy file="installer/resources/jetty.xml" tofile="pkg-temp/eepsite/jetty.xml" />
@@ -550,6 +580,8 @@
         <copy todir="pkg-temp/docs/" >
           <fileset dir="installer/resources/readme/" includes="readme*.html" />
           <fileset dir="installer/resources/proxy/" includes="*.ht" />
+          <!-- lang_ar.png added in 0.8.4 -->
+          <fileset dir="installer/resources/" includes="icons/flags/lang_ar.png" />
         </copy>
     </target>
 
@@ -618,6 +650,7 @@
         <copy file="build/i2psnark.jar" todir="pkg-temp/lib" />
         <!-- include systray changes in 0.7.5 -->
         <copy file="build/systray.jar" todir="pkg-temp/lib/" />
+        <copy file="build/desktopgui.jar" todir="pkg-temp/lib/" />
         <copy file="build/susimail.war" todir="pkg-temp/webapps/" />
         <copy file="build/susidns.war" todir="pkg-temp/webapps/" />
         <!-- as of 0.7.12; someday, we can remove these from the updater -->
@@ -680,17 +713,43 @@
     <target name="prepjupdatefixes" depends="prepupdate, buildWEB">
         <copy file="build/org.mortbay.jetty.jar" todir="pkg-temp/lib/" />
     </target>
-    <target name="installer" depends="preppkg">
+    <target name="installer" depends="preppkg, buildProperties">
         <taskdef name="izpack" classpath="${basedir}/installer/lib/izpack/standalone-compiler.jar" classname="com.izforge.izpack.ant.IzPackTask" />
         <mkdir dir="pkg-temp/installer" />
+        <exec executable="mtn" outputproperty="workspace.changes.util" errorproperty="mtn.error.util" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="core/java/src/net/i2p/util" />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes.util}" outputproperty="workspace.changes.util.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
         <jar destfile="./pkg-temp/installer/copy.jar" basedir="./core/java/build/obj" includes="net/i2p/util/Copy.class net/i2p/util/FileUtil.class">
-            <manifest><attribute name="Main-Class" value="net.i2p.util.Copy" /></manifest>
+            <manifest>
+                <attribute name="Main-Class" value="net.i2p.util.Copy" />
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.util.tr}" />
+            </manifest>
         </jar>
         <jar destfile="./pkg-temp/installer/delete.jar" basedir="./core/java/build/obj" includes="net/i2p/util/Delete.class net/i2p/util/FileUtil.class">
-            <manifest><attribute name="Main-Class" value="net.i2p.util.Delete" /></manifest>
+            <manifest>
+                <attribute name="Main-Class" value="net.i2p.util.Delete" />
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.util.tr}" />
+            </manifest>
         </jar>
         <jar destfile="./pkg-temp/installer/exec.jar" basedir="./core/java/build/obj" includes="net/i2p/util/Exec.class">
-            <manifest><attribute name="Main-Class" value="net.i2p.util.Exec" /></manifest>
+            <manifest>
+                <attribute name="Main-Class" value="net.i2p.util.Exec" />
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.util.tr}" />
+            </manifest>
         </jar>
         <!--
           Force 1.5 pack200 output
@@ -731,29 +790,31 @@
         <launch4j configFile="./installer/i2pstandalone.xml" />
 	<!-- thazzit -->
     </target>
-    <target name="test">
+
+    <target name="test" depends="buildProperties" >
         <ant dir="core/java/" target="test" />
     </target>
-    <target name="junit.report">
+    <target name="junit.report" depends="buildProperties" >
         <ant dir="core/java/" target="junit.report" />
     </target>
-    <target name="clover.report">
+    <target name="clover.report" depends="buildProperties" >
         <ant dir="core/java/" target="clover.report" />
     </target>
     <target name="test.report" depends="junit.report, clover.report"/>
-    <target name="fulltest">
+    <target name="fulltest" depends="buildProperties" >
 		<ant dir="core/java/" target="fulltest" />
 		<ant dir="router/java/" target="fulltest" />
     </target>
-    <target name="fullclovertest">
+    <target name="fullclovertest" depends="buildProperties" >
 		<ant dir="core/java/" target="fullclovertest" />
 		<ant dir="router/java/" target="fullclovertest" />
     </target>
+
     <target name="syndie" >
         <ant dir="apps/syndie/java/" target="standalone" />
         <copy file="apps/syndie/java/syndie-standalone.zip" todir="." />
     </target>
-    <target name="i2psnark">
+    <target name="i2psnark" depends="buildProperties" >
         <ant dir="apps/i2psnark/java" target="standalone" />
         <copy file="apps/i2psnark/java/i2psnark-standalone.zip" todir="." />
     </target>
@@ -791,6 +852,7 @@
             <arg value="build/i2ptunnel.war"/>
             <arg value="build/mstreaming.jar"/>
             <arg value="build/router.jar/"/>
+            <arg value="build/desktopgui.jar"/>
             <arg value="build/routerconsole.jar"/>
             <arg value="build/routerconsole.war"/>
             <arg value="build/sam.jar"/>
@@ -802,34 +864,6 @@
         <echo message="Findbugs output stored in i2p.fba" />
         <echo message="Now run: findbugs i2p.fba" />
     </target>
-    <target name="buildWithDesktopgui" depends="buildrouter,builddepSmall">
-        <ant dir="apps/desktopgui" target="build_jar" />
-    </target>
-    <target name="preppkgWithDesktopgui" depends="buildWithDesktopgui,preppkg">
-        <copy file="apps/desktopgui/dist/desktopgui.jar" todir="pkg-temp/lib/" />
-        <copy file="apps/desktopgui/lib/swing-worker.jar" todir="pkg-temp/lib/" />
-        <copy file="apps/desktopgui/lib/appframework.jar" todir="pkg-temp/lib/" />
-        <mkdir dir="pkg-temp/desktopgui/resources/" />
-        <copy todir="pkg-temp/desktopgui/resources/">
-            <fileset dir="apps/desktopgui/desktopgui/resources/" />
-        </copy>
-    </target>
-    <target name="installerWithDesktopgui" depends="preppkgWithDesktopgui,installer" />
-    <target name="prepupdateWithDesktopgui" depends="buildWithDesktopgui,prepupdate">
-        <copy file="apps/desktopgui/dist/desktopgui.jar" todir="pkg-temp/lib/" />
-        <copy file="apps/desktopgui/lib/swing-worker.jar" todir="pkg-temp/lib/" />
-        <copy file="apps/desktopgui/lib/appframework.jar" todir="pkg-temp/lib/" />
-        <mkdir dir="pkg-temp/desktopgui/resources/" />
-        <copy todir="pkg-temp/desktopgui/resources/">
-            <fileset dir="apps/desktopgui/desktopgui/resources/" />
-        </copy>
-    </target>
-    <target name="updaterWithDesktopgui" depends="prepupdateWithDesktopgui,updater" />
-    <target name="pkgWithDesktopgui" depends="distclean, updaterWithDesktopgui, installerWithDesktopgui, preppkg" />
-    <target name="distWithDesktopgui" depends="pkgWithDesktopgui, javadoc" />
-    <target name="distcleanWithDesktopgui" depends="distclean">
-        <ant dir="apps/desktopgui" target="build_clean" />
-    </target>
 
     <!-- this is the same dependency as pkg, but with updater200 in the middle,
          since preppkg puts too much stuff in pkg-temp -->
@@ -984,7 +1018,7 @@
 
     <target name="debian" depends="distclean, debian-source, debian-binary" />
 
-    <target name="debian-binary">
+    <target name="debian-binary" depends="buildProperties" >
         <echo message="Did you update the version in these files?" />
         <exec executable="ls" failonerror="true">
             <arg value="-l" />
@@ -1001,7 +1035,7 @@
             <arg value="amd64" />
         </exec>
     </target>
-    <target name="debian-source">
+    <target name="debian-source" depends="buildProperties" >
         <!-- bundle the 20MB jetty 5 lib since there probably isn't a deb for it -->
         <ant dir="apps/jetty" target="ensureJettylib" />
         <echo message="Did you update the version in these files?" />
diff --git a/core/java/build.xml b/core/java/build.xml
index 2ae9d655fadb00e1c1866326ebca1afe0206753b..60f1a4dcc3175a91b26b1c085a91bf8edf86fcb1 100644
--- a/core/java/build.xml
+++ b/core/java/build.xml
@@ -21,20 +21,51 @@
     <target name="compile" depends="depend">
         <mkdir dir="./build" />
         <mkdir dir="./build/obj" />
-        <javac srcdir="./src" debug="true" source="1.5" target="1.5" deprecation="on" destdir="./build/obj" classpath="${javac.classpath}" >
+        <javac srcdir="./src" debug="true" source="1.5" target="1.5" deprecation="on"
+               includeAntRuntime="false"
+               destdir="./build/obj" classpath="${javac.classpath}" >
             <compilerarg line="${javac.compilerargs}" />
         </javac>
     </target>
+
     <target name="compileTest">
         <mkdir dir="./build" />
         <mkdir dir="./build/obj" />
-        <javac srcdir="./src:./test" debug="true" source="1.5" target="1.5" deprecation="on" destdir="./build/obj" >
+        <!-- junit classes are in ant runtime -->
+        <javac srcdir="./src:./test" debug="true" source="1.5" target="1.5" deprecation="on"
+               includeAntRuntime="true"
+               destdir="./build/obj" >
             <compilerarg line="${javac.compilerargs}" />
         </javac>
     </target>
-    <target name="jar" depends="compile">
-        <jar destfile="./build/i2p.jar" basedir="./build/obj" includes="**/*.class" />
+
+    <target name="jar" depends="compile, jarUpToDate" unless="jar.uptodate" >
+        <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="." />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
+        <jar destfile="./build/i2p.jar" basedir="./build/obj" includes="**/*.class" >
+            <manifest>
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
+            </manifest>
+        </jar>
     </target>
+
+    <target name="jarUpToDate" >
+        <uptodate property="jar.uptodate" targetfile="build/i2p.jar" >
+            <srcfiles dir= "build/obj" includes="**/*.class" />
+        </uptodate>
+    </target>
+
     <target name="jarTest" depends="compileTest">
         <jar destfile="./build/i2ptest.jar" basedir="./build/obj" includes="**/*.class" />
     </target>
@@ -43,15 +74,35 @@
         <mkdir dir="./build/javadoc" />
         <javadoc sourcepath="./src:./test" destdir="./build/javadoc" packagenames="*" use="true" splitindex="true" windowtitle="I2P SDK" />
     </target>
-    <target name="test" depends="clean, compileTest">
-        <junit printsummary="on" fork="yes">
+    <target name="prepareTest" depends="compileTest" if="with.cobertura">
+        <taskdef classpath="${with.cobertura}" resource="tasks.properties" onerror="report" />
+        <mkdir dir="./build/obj_test" />
+        <cobertura-instrument todir="./build/obj_test">
+            <fileset dir="./build/obj">
+                <include name="**/*.class"/>
+                <exclude name="**/*Test.class" />
+            </fileset>
+        </cobertura-instrument>
+    </target>
+    <target name="test" depends="clean, compileTest, prepareTest">
+        <delete>
+            <fileset dir="../../reports/core/junit">
+                <include name="TEST-*.xml"/>
+            </fileset>
+        </delete>
+        <mkdir dir="../../reports/" />
+        <mkdir dir="../../reports/core/" />
+        <mkdir dir="../../reports/core/junit/" />
+        <junit printsummary="on" fork="yes" maxmemory="384m">
+            <sysproperty key="net.sourceforge.cobertura.datafile" file="./cobertura.ser" />
             <classpath>
                 <pathelement path="${classpath}" />
+                <pathelement location="./build/obj_test" />
                 <pathelement location="./build/obj" />
                 <pathelement location="../../installer/lib/jbigi/jbigi.jar" />
-                <pathelement path="${ant.home}/lib/clover.jar"/>
+                <pathelement location="${with.cobertura}" />
             </classpath>
-            <batchtest>
+            <batchtest todir="../../reports/core/junit/">
                 <fileset dir="./test/">
                     <include name="**/*Test.java" />
                     <exclude name="**/ElGamalAESEngineTest.java" />
@@ -60,24 +111,11 @@
             </batchtest>
             <formatter type="xml"/>
         </junit>
-        <mkdir dir="../../reports/" />
-        <mkdir dir="../../reports/core/" />
-        <mkdir dir="../../reports/core/junit/" />
-        <delete>
-            <fileset dir="../../reports/core/junit">
-                <include name="TEST-*.xml"/>
-            </fileset>
-        </delete>
-        <copy todir="../../reports/core/junit">
-            <fileset dir=".">
-                <include name="TEST-*.xml"/>
-            </fileset>
-        </copy>
-        <delete>
-            <fileset dir=".">
-                <include name="TEST-*.xml"/>
-            </fileset>
-        </delete>
+    </target>
+    <target name="cobertura" depends="test" if="with.cobertura">
+        <mkdir dir="../../reports/core/cobertura" />
+        <cobertura-report format="xml" srcdir="./src" destdir="../../reports/core/cobertura" />
+        <delete file="./cobertura.ser" />
     </target>
     <target name="junit.report">
         <junitreport todir="../../reports/core/junit">
@@ -87,28 +125,8 @@
             <report format="frames" todir="../../reports/core/html/junit"/>
         </junitreport>
     </target>
-    <target name="clover.report">
-        <taskdef resource="clovertasks"/>
-        <mkdir dir="../../reports/" />
-        <mkdir dir="../../reports/core" />
-        <mkdir dir="../../reports/core/clover" />
-        <clover-setup initString="../../reports/core/clover/coverage.db"/>
-        <clover-report>
-            <current outfile="../../reports/core/html/clover">
-                <format type="html"/>
-            </current>
-        </clover-report>
-    </target>
-    <target name="test.report" depends="junit.report, clover.report"/>
-    <target name="useclover">
-        <taskdef resource="clovertasks"/>
-        <mkdir dir="../../reports/" />
-        <mkdir dir="../../reports/core/" />
-        <mkdir dir="../../reports/core/clover" />
-        <clover-setup initString="../../reports/core/clover/coverage.db"/>
-    </target>
+    <target name="test.report" depends="junit.report"/>
     <target name="fulltest" depends="test, junit.report" />
-    <target name="fullclovertest" depends="useclover, test, test.report" />
     <target name="clean">
         <delete dir="./build" />
     </target>
diff --git a/core/java/src/freenet/support/CPUInformation/CPUID.java b/core/java/src/freenet/support/CPUInformation/CPUID.java
index e3712e4ad8ce9888fe658aa9a328ca2592079fa6..921f497ddedb924f5f776e44c865c59fb8bfa79a 100644
--- a/core/java/src/freenet/support/CPUInformation/CPUID.java
+++ b/core/java/src/freenet/support/CPUInformation/CPUID.java
@@ -324,18 +324,26 @@ public class CPUID {
             return getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=3);
         }
         public boolean IsPentium3Compatible()
-        {
-            return getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=7);
+        {	
+		// Atom
+		if (getCPUExtendedModel() == 1 && (getCPUFamily() == 6 && (getCPUModel() == 12))){
+			return true;
+		// ??
+		} else if (getCPUExtendedModel() == 0 && (getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=7))){
+			return true;
+		} else {
+			return false;
+		}
         }
         public boolean IsPentium4Compatible()
         {	
-			// P4
+		// P4
         	if (getCPUFamily() >= 15){
         		return true;
-			// Xeon MP (45nm) or Core i7
+		// Xeon MP (45nm) or Core i7
         	} else if (getCPUExtendedModel() == 1 && (getCPUFamily() == 6 && (getCPUModel() == 10 || getCPUModel() == 13))){
         		return true;
-			// Core 2 Duo
+		// Core 2 Duo
         	} else if (getCPUExtendedModel() == 0 && getCPUFamily() == 6 && getCPUModel() == 15){
         		return true;
         	} else {
@@ -417,17 +425,18 @@ public class CPUID {
 	                    case 15:
 	                        return "Core 2 (Conroe)";
 	                }
-            	}
-            	if (getCPUExtendedModel() == 1){
-            		 switch(getCPUModel()){
-            		 	case 10:
-            		 		return "Core i7";
-            		 	case 12:
-            		 		return "Atom";
-            		 	case 13:
-            		 		return "Xeon MP";
-            		 }
-            	}
+            	} else {
+		    	if (getCPUExtendedModel() == 1){
+		    		 switch(getCPUModel()){
+		    		 	case 10:
+		    		 		return "Core i7";
+		    		 	case 12:
+		    		 		return "Atom";
+		    		 	case 13:
+		    		 		return "Xeon MP";
+		    		 }
+		    	}
+		}
             }
             if(getCPUFamily() == 7){
                 switch(getCPUModel()){
diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java
index 860747c760e4d973fa9c9b7206339a12ce35bcc1..6005a73485cad24834c57ce14f7e5d05ac497dee 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.8.2";
+    public final static String VERSION = "0.8.6";
 
     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 e6df37e6f467ffb683daa48138fa4c3b866ec44e..5cfc37ac5d4370ebf054fda6bef635e220f49c6e 100644
--- a/core/java/src/net/i2p/I2PAppContext.java
+++ b/core/java/src/net/i2p/I2PAppContext.java
@@ -30,11 +30,13 @@ import net.i2p.util.Clock;
 import net.i2p.util.ConcurrentHashSet;
 import net.i2p.util.FileUtil;
 import net.i2p.util.FortunaRandomSource;
+import net.i2p.util.I2PProperties;
 import net.i2p.util.KeyRing;
 import net.i2p.util.LogManager;
 //import net.i2p.util.PooledRandomSource;
 import net.i2p.util.RandomSource;
 import net.i2p.util.SecureDirectory;
+import net.i2p.util.I2PProperties.I2PPropertyCallback;
 
 /**
  * <p>Provide a base scope for accessing singletons that I2P exposes.  Rather than
@@ -63,9 +65,9 @@ import net.i2p.util.SecureDirectory;
  */
 public class I2PAppContext {
     /** the context that components without explicit root are bound */
-    protected static I2PAppContext _globalAppContext;
+    protected static volatile I2PAppContext _globalAppContext;
     
-    private Properties _overrideProps;
+    protected I2PProperties _overrideProps;
     
     private StatManager _statManager;
     private SessionKeyManager _sessionKeyManager;
@@ -117,7 +119,8 @@ public class I2PAppContext {
      *
      */
     public static I2PAppContext getGlobalContext() { 
-        // skip the global lock
+        // skip the global lock - _gAC must be volatile
+        // http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
         I2PAppContext rv = _globalAppContext;
         if (rv != null)
             return rv;
@@ -168,7 +171,9 @@ public class I2PAppContext {
                     _globalAppContext = this;
             }
         }
-        _overrideProps = envProps;
+        _overrideProps = new I2PProperties();
+        if (envProps != null)
+            _overrideProps.putAll(envProps);
         _statManager = null;
         _sessionKeyManager = null;
         _namingService = null;
@@ -474,6 +479,9 @@ public class I2PAppContext {
      * provided during the context construction, as well as the ones included in
      * System.getProperties.
      *
+     * WARNING - not overridden in RouterContext, doesn't contain router config settings,
+     * use getProperties() instead.
+     *
      * @return set of Strings containing the names of defined system properties
      */
     public Set getPropertyNames() { 
@@ -483,6 +491,29 @@ public class I2PAppContext {
         return names;
     }
     
+    /**
+     * Access the configuration attributes of this context, listing the properties 
+     * provided during the context construction, as well as the ones included in
+     * System.getProperties.
+     *
+     * @return new Properties with system and context properties
+     * @since 0.8.4
+     */
+    public Properties getProperties() { 
+        Properties rv = new Properties();
+        rv.putAll(System.getProperties());
+        rv.putAll(_overrideProps);
+        return rv;
+    }
+    
+    /**
+     * Add a callback, which will fire upon changes in the property
+     * given in the specific callback.
+     * Unimplemented in I2PAppContext: this only makes sense in a router context.
+     * @param callback The implementation of the callback.
+     */
+    public void addPropertyCallback(I2PPropertyCallback callback) {}
+    
     /**
      * The statistics component with which we can track various events
      * over time.
@@ -757,7 +788,7 @@ public class I2PAppContext {
      * enable simulators to play with clock skew among different instances.
      *
      */
-    public Clock clock() { // overridden in RouterContext
+    public Clock clock() {
         if (!_clockInitialized)
             initializeClock();
         return _clock;
diff --git a/core/java/src/net/i2p/client/DestReplyMessageHandler.java b/core/java/src/net/i2p/client/DestReplyMessageHandler.java
index 8d5527d59b4e7d4c4d65f6687e702b920615f515..2207a56c514af61b858968272432efdd410ca903 100644
--- a/core/java/src/net/i2p/client/DestReplyMessageHandler.java
+++ b/core/java/src/net/i2p/client/DestReplyMessageHandler.java
@@ -26,11 +26,13 @@ class DestReplyMessageHandler extends HandlerImpl {
             _log.debug("Handle message " + message);
         DestReplyMessage msg = (DestReplyMessage) message;
         Destination d = msg.getDestination();
-        if (d != null)
+        if (d != null) {
             session.destReceived(d);
-        Hash h = msg.getHash();
-        if (h != null)
-            session.destLookupFailed(h);
+        } else {
+            Hash h = msg.getHash();
+            if (h != null)
+                session.destLookupFailed(h);
+        }
         // else let it time out
     }
 }
diff --git a/core/java/src/net/i2p/client/I2CPMessageProducer.java b/core/java/src/net/i2p/client/I2CPMessageProducer.java
index 0fa35d8cff10dc2904e2afe81fbc094d98be2d33..336c858cace3664d80ac0348d4024cd82a4df3d7 100644
--- a/core/java/src/net/i2p/client/I2CPMessageProducer.java
+++ b/core/java/src/net/i2p/client/I2CPMessageProducer.java
@@ -12,6 +12,8 @@ package net.i2p.client;
 import java.util.Date;
 import java.util.Properties;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.DataFormatException;
@@ -41,22 +43,51 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 class I2CPMessageProducer {
-    private final static Log _log = new Log(I2CPMessageProducer.class);
+    private final Log _log;
     private final I2PAppContext _context;
-    private int _sendBps;
-    private long _sendPeriodBytes;
-    private long _sendPeriodBeginTime;
+    private int _maxBytesPerSecond;
+    private volatile int _sendPeriodBytes;
+    private volatile long _sendPeriodBeginTime;
+    private final ReentrantLock _lock;
+    private static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond";
+    /** see ConnectionOptions in streaming  - MTU + streaming overhead + gzip overhead */
+    private static final int TYP_SIZE = 1730 + 28 + 23;
+    private static final int MIN_RATE = 2 * TYP_SIZE;
 
     public I2CPMessageProducer(I2PAppContext context) {
         _context = context;
-        context.statManager().createRateStat("client.sendBpsRaw", "How fast we pump out I2CP data messages", "ClientMessages", new long[] { 60*1000, 5*60*1000, 10*60*1000, 60*60*1000 });
+        _log = context.logManager().getLog(I2CPMessageProducer.class);
+        _lock = new ReentrantLock(true);
+        context.statManager().createRateStat("client.sendThrottled", "Times waited for bandwidth", "ClientMessages", new long[] { 60*1000 });
+        context.statManager().createRateStat("client.sendDropped", "Length of msg dropped waiting for bandwidth", "ClientMessages", new long[] { 60*1000 });
     }
     
+    /** 
+     * Update the bandwidth setting
+     * @since 0.8.4
+     */
+    public void updateBandwidth(I2PSessionImpl session) {
+        String max = session.getOptions().getProperty(PROP_MAX_BW);
+        if (max != null) {
+            try {
+                int iMax = Integer.parseInt(max);
+                if (iMax > 0)
+                    // round up to next higher TYP_SIZE for efficiency, then add some fudge for small messages
+                    _maxBytesPerSecond = 256 + Math.max(MIN_RATE, TYP_SIZE * ((iMax + TYP_SIZE - 1) / TYP_SIZE));
+                else
+                    _maxBytesPerSecond = 0;
+            } catch (NumberFormatException nfe) {}
+        }
+        if (_log.shouldLog(Log.DEBUG))
+            _log.debug("Setting " + _maxBytesPerSecond + " BPS max");
+    }
+
     /** 
      * Send all the messages that a client needs to send to a router to establish
      * a new session.  
      */
     public void connect(I2PSessionImpl session) throws I2PSessionException {
+        updateBandwidth(session);
         CreateSessionMessage msg = new CreateSessionMessage();
         SessionConfig cfg = new SessionConfig(session.getMyDestination());
         cfg.setOptions(session.getOptions());
@@ -99,32 +130,135 @@ class I2CPMessageProducer {
      */
     public void sendMessage(I2PSessionImpl session, Destination dest, long nonce, byte[] payload, SessionTag tag,
                             SessionKey key, Set tags, SessionKey newKey, long expires) throws I2PSessionException {
+        sendMessage(session, dest, nonce, payload, expires, 0);
+    }
+
+    /**
+     * Package up and send the payload to the router for delivery
+     * @since 0.8.4
+     */
+    public void sendMessage(I2PSessionImpl session, Destination dest, long nonce, byte[] payload,
+                            long expires, int flags) throws I2PSessionException {
+
+        if (!updateBps(payload.length, expires))
+            // drop the message... send fail notification?
+            return;
         SendMessageMessage msg;
-        if (expires > 0) {
-            msg = new SendMessageExpiresMessage();
-            ((SendMessageExpiresMessage)msg).setExpiration(new Date(expires));
+        if (expires > 0 || flags > 0) {
+            SendMessageExpiresMessage smsg = new SendMessageExpiresMessage();
+            smsg.setExpiration(expires);
+            smsg.setFlags(flags);
+            msg = smsg;
         } else
             msg = new SendMessageMessage();
         msg.setDestination(dest);
         msg.setSessionId(session.getSessionId());
         msg.setNonce(nonce);
-        Payload data = createPayload(dest, payload, tag, key, tags, newKey);
+        Payload data = createPayload(dest, payload, null, null, null, null);
         msg.setPayload(data);
         session.sendMessage(msg);
-        updateBps(payload.length);
     }
 
-    private void updateBps(int len) {
-        long now = _context.clock().now();
-        float period = ((float)now-_sendPeriodBeginTime)/1000f;
-        if (period >= 1f) {
-            // first term decays on slow transmission
-            _sendBps = (int)(((float)0.9f * (float)_sendBps) + ((float)0.1f*((float)_sendPeriodBytes)/period));
-            _sendPeriodBytes = len;
-            _sendPeriodBeginTime = now;
-            _context.statManager().addRateData("client.sendBpsRaw", _sendBps, 0);
-        } else {
-            _sendPeriodBytes += len;
+    /**
+     *  Super-simple bandwidth throttler.
+     *  We only calculate on a one-second basis, so large messages
+     *  (compared to the one-second limit) may exceed the limits.
+     *  Tuned for streaming, may not work well for large datagrams.
+     *
+     *  This does poorly with low rate limits since it doesn't credit
+     *  bandwidth across two periods. So the limit is rounded up,
+     *  and the min limit is set to 2x the typ size, above.
+     *
+     *  Blocking so this could be very bad for retransmissions,
+     *  as it could clog StreamingTimer.
+     *  Waits are somewhat "fair" using ReentrantLock.
+     *  While out-of-order transmission is acceptable, fairness
+     *  reduces the chance of starvation. ReentrantLock does not
+     *  guarantee in-order execution due to thread priority issues,
+     *  so out-of-order may still occur. But shouldn't happen within
+     *  the same thread anyway... Also note that small messages may
+     *  go ahead of large ones that are waiting for the next window.
+     *  Also, threads waiting a second time go to the back of the line.
+     *
+     *  Since this is at the I2CP layer, it includes streaming overhead,
+     *  streaming acks and retransmissions,
+     *  gzip overhead (or "underhead" for compression),
+     *  repliable datagram overhead, etc.
+     *  However, it does not, of course, include the substantial overhead
+     *  imposed by the router for the leaseset, tags, encryption,
+     *  and fixed-size tunnel messages.
+     *
+     *  @param expires if > 0, an expiration date
+     *  @return true if we should send the message, false to drop it
+     */
+    private boolean updateBps(int len, long expires) {
+        if (_maxBytesPerSecond <= 0)
+            return true;
+        //synchronized(this) {
+        _lock.lock();
+        try {
+            int waitCount = 0;
+            while (true) {
+                long now = _context.clock().now();
+                if (waitCount > 0 && expires > 0 && expires < now) {
+                    // just say no to bufferbloat... drop the message right here
+                    _context.statManager().addRateData("client.sendDropped", len, 0);
+                    if (_log.shouldLog(Log.WARN))
+                        _log.warn("Dropping " + len + " byte msg expired in queue");
+                    return false;
+                }
+
+                long period = now - _sendPeriodBeginTime;
+                if (period >= 2000) {
+                    // start new period, always let it through no matter how big
+                    _sendPeriodBytes = len;
+                    _sendPeriodBeginTime = now;
+                    if (_log.shouldLog(Log.DEBUG))
+                        _log.debug("New period after idle, " + len + " bytes");
+                    return true;
+                }
+
+                if (period >= 1000) {
+                    // start new period
+                    // Allow burst within 2 sec, only advance window by 1 sec, and
+                    // every other second give credit for unused bytes in previous period
+                    if (_sendPeriodBytes > 0 && ((_sendPeriodBeginTime / 1000) & 0x01) == 0)
+                        _sendPeriodBytes += len - _maxBytesPerSecond;
+                    else
+                        _sendPeriodBytes = len;
+                    _sendPeriodBeginTime += 1000;
+                    if (_log.shouldLog(Log.DEBUG))
+                        _log.debug("New period, " + len + " bytes");
+                    return true;
+                }
+
+                if (_sendPeriodBytes + len <= _maxBytesPerSecond) {
+                    // still bytes available in this period
+                    _sendPeriodBytes += len;
+                    if (_log.shouldLog(Log.DEBUG))
+                        _log.debug("Sending " + len + ", Elapsed " + period + "ms, total " + _sendPeriodBytes + " bytes");
+                    return true;
+                }
+
+                if (waitCount >= 2) {
+                    // just say no to bufferbloat... drop the message right here
+                    _context.statManager().addRateData("client.sendDropped", len, 0);
+                    if (_log.shouldLog(Log.WARN))
+                        _log.warn("Dropping " + len + " byte msg after waiting " + waitCount + " times");
+                    return false;
+                }
+
+                // wait until next period
+                _context.statManager().addRateData("client.sendThrottled", ++waitCount, 0);
+                if (_log.shouldLog(Log.DEBUG))
+                    _log.debug("Throttled " + len + " bytes, wait #" + waitCount + ' ' + (1000 - period) + "ms" /*, new Exception()*/);
+                try {
+                    //this.wait(1000 - period);
+                    _lock.newCondition().await(1000 - period, TimeUnit.MILLISECONDS);
+                } catch (InterruptedException ie) {}
+            }
+        } finally {
+            _lock.unlock();
         }
     }
     
diff --git a/core/java/src/net/i2p/client/I2PSession.java b/core/java/src/net/i2p/client/I2PSession.java
index cd20cfc2d655ef86580e18c1faaf248421d5e33d..567c9e521dbfc5981c2e67407a38d35452ed40b6 100644
--- a/core/java/src/net/i2p/client/I2PSession.java
+++ b/core/java/src/net/i2p/client/I2PSession.java
@@ -9,6 +9,7 @@ package net.i2p.client;
  *
  */
 
+import java.util.Properties;
 import java.util.Set;
 
 import net.i2p.data.Destination;
@@ -20,17 +21,20 @@ import net.i2p.data.SigningPrivateKey;
 /**
  * <p>Define the standard means of sending and receiving messages on the 
  * I2P network by using the I2CP (the client protocol).  This is done over a 
- * bidirectional TCP socket and never sends any private keys - all end to end 
- * encryption is done transparently within the client's I2PSession
- * itself.  Periodically the router will ask the client to authorize a new set of
+ * bidirectional TCP socket and never sends any private keys.
+ *
+ * End to end encryption in I2PSession was disabled in release 0.6.
+ *
+ * Periodically the router will ask the client to authorize a new set of
  * tunnels to be allocated to the client, which the client can accept by sending a
  * {@link net.i2p.data.LeaseSet} signed by the {@link net.i2p.data.Destination}.  
- * In addition, the router may on occation provide the client with an updated 
+ * In addition, the router may on occasion provide the client with an updated 
  * clock offset so that the client can stay in sync with the network (even if 
  * the host computer's clock is off).</p>
  *
  */
 public interface I2PSession {
+
     /** Send a new message to the given destination, containing the specified
      * payload, returning true if the router feels confident that the message
      * was delivered.
@@ -39,11 +43,18 @@ public interface I2PSession {
      * @return whether it was accepted by the router for delivery or not
      */
     public boolean sendMessage(Destination dest, byte[] payload) throws I2PSessionException;
+
     public boolean sendMessage(Destination dest, byte[] payload, int offset, int size) throws I2PSessionException;
-    /** See I2PSessionMuxedImpl for details */
+
+    /**
+     * See I2PSessionMuxedImpl for proto/port details.
+     * @since 0.7.1
+     */
     public boolean sendMessage(Destination dest, byte[] payload, int proto, int fromport, int toport) throws I2PSessionException;
 
     /**
+     * End-to-End Crypto is disabled, tags and keys are ignored!
+     * 
      * Like sendMessage above, except the key used and the tags sent are exposed to the 
      * application.  <p /> 
      * 
@@ -61,25 +72,62 @@ public interface I2PSession {
      *
      * @param dest location to send the message
      * @param payload body of the message to be sent (unencrypted)
-     * @param keyUsed session key delivered to the destination for association with the tags sent.  This is essentially
+     * @param keyUsed UNUSED, IGNORED. Session key delivered to the destination for association with the tags sent.  This is essentially
      *                an output parameter - keyUsed.getData() is ignored during this call, but after the call completes,
      *                it will be filled with the bytes of the session key delivered.  Typically the key delivered is the
      *                same one as the key encrypted with, but not always.  If this is null then the key data will not be
      *                exposed.
-     * @param tagsSent set of tags delivered to the peer and associated with the keyUsed.  This is also an output parameter -
+     * @param tagsSent UNUSED, IGNORED. Set of tags delivered to the peer and associated with the keyUsed.  This is also an output parameter -
      *                 the contents of the set is ignored during the call, but afterwards it contains a set of SessionTag 
      *                 objects that were sent along side the given keyUsed.
      */
     public boolean sendMessage(Destination dest, byte[] payload, SessionKey keyUsed, Set tagsSent) throws I2PSessionException;
+
+    /**
+     * End-to-End Crypto is disabled, tags and keys are ignored.
+     * @param keyUsed UNUSED, IGNORED.
+     * @param tagsSent UNUSED, IGNORED.
+     */
     public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent) throws I2PSessionException;
+
+    /**
+     * End-to-End Crypto is disabled, tags and keys are ignored.
+     * @param keyUsed UNUSED, IGNORED.
+     * @param tagsSent UNUSED, IGNORED.
+     * @since 0.7.1
+     */
     public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire) throws I2PSessionException;
-    /** See I2PSessionMuxedImpl for details */
+
+    /**
+     * See I2PSessionMuxedImpl for proto/port details.
+     * End-to-End Crypto is disabled, tags and keys are ignored.
+     * @param keyUsed UNUSED, IGNORED.
+     * @param tagsSent UNUSED, IGNORED.
+     * @since 0.7.1
+     */
     public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent,
                                int proto, int fromport, int toport) throws I2PSessionException;
-    /** See I2PSessionMuxedImpl for details */
+
+    /**
+     * See I2PSessionMuxedImpl for proto/port details.
+     * End-to-End Crypto is disabled, tags and keys are ignored.
+     * @param keyUsed UNUSED, IGNORED.
+     * @param tagsSent UNUSED, IGNORED.
+     * @since 0.7.1
+     */
     public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire,
                                int proto, int fromport, int toport) throws I2PSessionException;
 
+    /**
+     * See I2PSessionMuxedImpl for proto/port details.
+     * End-to-End Crypto is disabled, tags and keys are ignored.
+     * @param keyUsed UNUSED, IGNORED.
+     * @param tagsSent UNUSED, IGNORED.
+     * @since 0.8.4
+     */
+    public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire,
+                               int proto, int fromport, int toport, int flags) throws I2PSessionException;
+
     /** Receive a message that the router has notified the client about, returning
      * the payload.
      * @param msgId message to fetch
@@ -151,8 +199,16 @@ public interface I2PSession {
      */
     public Destination lookupDest(Hash h, long maxWait) throws I2PSessionException;
 
+    /**
+     *  Does not remove properties previously present but missing from this options parameter.
+     *  @param options non-null
+     *  @since 0.8.4
+     */
+    public void updateOptions(Properties options);
+
     /**
      * Get the current bandwidth limits. Blocking.
+     * @since 0.8.3
      */
     public int[] bandwidthLimits() throws I2PSessionException;
 
diff --git a/core/java/src/net/i2p/client/I2PSessionImpl.java b/core/java/src/net/i2p/client/I2PSessionImpl.java
index 8b4389e47da3a78db1799e995047e4516cc7bcc9..dc7e875d9cf4f6dd0798fbbb0bfb955b5244f4f5 100644
--- a/core/java/src/net/i2p/client/I2PSessionImpl.java
+++ b/core/java/src/net/i2p/client/I2PSessionImpl.java
@@ -221,20 +221,32 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
         }
     }
 
+    /** save some memory, don't pass along the pointless properties */
     private Properties filter(Properties options) {
         Properties rv = new Properties();
         for (Iterator iter = options.keySet().iterator(); iter.hasNext();) {
             String key = (String) iter.next();
-            String val = options.getProperty(key);
-            if (key.startsWith("java") ||
-                key.startsWith("user") ||
-                key.startsWith("os") ||
-                key.startsWith("sun") ||
-                key.startsWith("file") ||
-                key.startsWith("line") ||
-                key.startsWith("wrapper")) {
+            if (key.startsWith("java.") ||
+                key.startsWith("user.") ||
+                key.startsWith("os.") ||
+                key.startsWith("sun.") ||
+                key.startsWith("file.") ||
+                key.equals("line.separator") ||
+                key.equals("path.separator") ||
+                key.equals("prng.buffers") ||
+                key.equals("router.trustedUpdateKeys") ||
+                key.startsWith("router.update") ||
+                key.startsWith("routerconsole.") ||
+                key.startsWith("time.") ||
+                key.startsWith("stat.") ||
+                key.startsWith("gnu.") ||  // gnu JVM
+                key.startsWith("net.i2p.router.web.") ||  // console nonces
+                key.startsWith("wrapper.")) {
                 if (_log.shouldLog(Log.DEBUG)) _log.debug("Skipping property: " + key);
-            } else if ((key.length() > 255) || (val.length() > 255)) {
+                continue;
+            }
+            String val = options.getProperty(key);
+            if ((key.length() > 255) || (val.length() > 255)) {
                 if (_log.shouldLog(Log.WARN))
                     _log.warn(getPrefix() + "Not passing on property ["
                               + key
@@ -247,6 +259,18 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
         return rv;
     }
 
+    /**
+     * Update the tunnel and bandwidth settings
+     * @since 0.8.4
+     */
+    public void updateOptions(Properties options) {
+        _options.putAll(filter(options));
+        _producer.updateBandwidth(this);
+        try {
+            _producer.updateTunnels(this, 0);
+        } catch (I2PSessionException ise) {}
+    }
+
     void setLeaseSet(LeaseSet ls) {
         _leaseSet = ls;
         if (ls != null) {
@@ -397,7 +421,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
      *
      */
     public byte[] receiveMessage(int msgId) throws I2PSessionException {
-        MessagePayloadMessage msg = _availableMessages.remove(new Long(msgId));
+        MessagePayloadMessage msg = _availableMessages.remove(Long.valueOf(msgId));
         if (msg == null) {
             _log.error("Receive message " + msgId + " had no matches");
             return null;
@@ -414,21 +438,6 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
         _producer.reportAbuse(this, msgId, severity);
     }
 
-    /**
-     * Send the data to the destination.  
-     * TODO: this currently always returns true, regardless of whether the message was 
-     * delivered successfully.  make this wait for at least ACCEPTED
-     *
-     */
-    public abstract boolean sendMessage(Destination dest, byte[] payload) throws I2PSessionException;
-    
-    /**
-     * @param keyUsed unused - no end-to-end crypto
-     * @param tagsSent unused - no end-to-end crypto
-     */
-    public abstract boolean sendMessage(Destination dest, byte[] payload, SessionKey keyUsed, 
-                                        Set tagsSent) throws I2PSessionException;
-
     public abstract void receiveStatus(int msgId, long nonce, int status);
 
 /****** no end-to-end crypto
@@ -444,7 +453,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
      * Recieve a payload message and let the app know its available
      */
     public void addNewMessage(MessagePayloadMessage msg) {
-        Long mid = new Long(msg.getMessageId());
+        Long mid = Long.valueOf(msg.getMessageId());
         _availableMessages.put(mid, msg);
         long id = msg.getMessageId();
         byte data[] = msg.getPayload().getUnencryptedData();
@@ -494,7 +503,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
         
         public void available(long msgId, int size) {
             synchronized (AvailabilityNotifier.this) {
-                _pendingIds.add(new Long(msgId));
+                _pendingIds.add(Long.valueOf(msgId));
                 _pendingSizes.add(Integer.valueOf(size));
                 AvailabilityNotifier.this.notifyAll();
             }
diff --git a/core/java/src/net/i2p/client/I2PSessionImpl2.java b/core/java/src/net/i2p/client/I2PSessionImpl2.java
index f0000b68cb4302cdf079b01007ef7463f70b0743..3af551eaaf9c6fa96a7152f3f13c23e8f2696216 100644
--- a/core/java/src/net/i2p/client/I2PSessionImpl2.java
+++ b/core/java/src/net/i2p/client/I2PSessionImpl2.java
@@ -130,6 +130,10 @@ class I2PSessionImpl2 extends I2PSessionImpl {
                                int proto, int fromport, int toport) throws I2PSessionException {
         throw new IllegalArgumentException("Use MuxedImpl");
     }
+    public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire,
+                               int proto, int fromport, int toport, int flags) throws I2PSessionException {
+        throw new IllegalArgumentException("Use MuxedImpl");
+    }
 
     @Override
     public boolean sendMessage(Destination dest, byte[] payload) throws I2PSessionException {
@@ -222,14 +226,23 @@ class I2PSessionImpl2 extends I2PSessionImpl {
     private static final int NUM_TAGS = 50;
 
     /**
-     * TODO - Don't need to save MessageState since actuallyWait is false...
-     * But for now just use sendNoEffort() instead.
-     *
      * @param keyUsed unused - no end-to-end crypto
      * @param tagsSent unused - no end-to-end crypto
      */
     protected boolean sendBestEffort(Destination dest, byte payload[], SessionKey keyUsed, Set tagsSent, long expires)
                     throws I2PSessionException {
+        return sendBestEffort(dest, payload, expires, 0);
+    }
+
+    /**
+     * TODO - Don't need to save MessageState since actuallyWait is false...
+     * But for now just use sendNoEffort() instead.
+     *
+     * @param flags to be passed to the router
+     * @since 0.8.4
+     */
+    protected boolean sendBestEffort(Destination dest, byte payload[], long expires, int flags)
+                    throws I2PSessionException {
         //SessionKey key = null;
         //SessionKey newKey = null;
         //SessionTag tag = null;
@@ -324,7 +337,7 @@ class I2PSessionImpl2 extends I2PSessionImpl {
                        + " sync took " + (inSendingSync-beforeSendingSync) 
                        + " add took " + (afterSendingSync-inSendingSync));
         //_producer.sendMessage(this, dest, nonce, payload, tag, key, sentTags, newKey, expires);
-        _producer.sendMessage(this, dest, nonce, payload, null, null, null, null, expires);
+        _producer.sendMessage(this, dest, nonce, payload, expires, flags);
         
         // since this is 'best effort', all we're waiting for is a status update 
         // saying that the router received it - in theory, that should come back
diff --git a/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java b/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java
index 342b05d260e584e5e61e52685ea330210fe36ab8..fcf11d0dafab3e8fcb2d7d87a90c9dcdcc576b3d 100644
--- a/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java
+++ b/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java
@@ -162,12 +162,34 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 implements I2PSession {
      *         255 disallowed
      *  @param fromPort 1-65535 or 0 for unset
      *  @param toPort 1-65535 or 0 for unset
+     *  @since 0.7.1
      */
     @Override
     public boolean sendMessage(Destination dest, byte[] payload, int offset, int size,
                                SessionKey keyUsed, Set tagsSent, long expires,
                                int proto, int fromPort, int toPort)
                    throws I2PSessionException {
+        return sendMessage(dest, payload, offset, size, keyUsed, tagsSent, 0, proto, fromPort, toPort, 0);
+    }
+
+    /**
+     *  @param keyUsed unused - no end-to-end crypto
+     *  @param tagsSent unused - no end-to-end crypto
+     *  @param proto 1-254 or 0 for unset; recommended:
+     *         I2PSession.PROTO_UNSPECIFIED
+     *         I2PSession.PROTO_STREAMING
+     *         I2PSession.PROTO_DATAGRAM
+     *         255 disallowed
+     *  @param fromPort 1-65535 or 0 for unset
+     *  @param toPort 1-65535 or 0 for unset
+     *  @param flags to be passed to the router
+     *  @since 0.8.4
+     */
+    @Override
+    public boolean sendMessage(Destination dest, byte[] payload, int offset, int size,
+                               SessionKey keyUsed, Set tagsSent, long expires,
+                               int proto, int fromPort, int toPort, int flags)
+                   throws I2PSessionException {
         if (isClosed()) throw new I2PSessionException("Already closed");
         updateActivity();
 
@@ -183,7 +205,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 implements I2PSession {
 
         _context.statManager().addRateData("i2cp.tx.msgCompressed", payload.length, 0);
         _context.statManager().addRateData("i2cp.tx.msgExpanded", size, 0);
-        return sendBestEffort(dest, payload, keyUsed, tagsSent, expires);
+        return sendBestEffort(dest, payload, expires, flags);
     }
 
     /**
@@ -191,7 +213,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 implements I2PSession {
      */
     @Override
     public void addNewMessage(MessagePayloadMessage msg) {
-        Long mid = new Long(msg.getMessageId());
+        Long mid = Long.valueOf(msg.getMessageId());
         _availableMessages.put(mid, msg);
         long id = msg.getMessageId();
         byte data[] = msg.getPayload().getUnencryptedData();
diff --git a/core/java/src/net/i2p/client/I2PSimpleSession.java b/core/java/src/net/i2p/client/I2PSimpleSession.java
index e984b6d30712e00b93afd0d3542aac41f28634ef..e108fc008ba0e577d142f40fd0ca127adec1360d 100644
--- a/core/java/src/net/i2p/client/I2PSimpleSession.java
+++ b/core/java/src/net/i2p/client/I2PSimpleSession.java
@@ -98,10 +98,17 @@ class I2PSimpleSession extends I2PSessionImpl2 {
         }
     }
 
+    /**
+     * Ignore, does nothing
+     * @since 0.8.4
+     */
+    @Override
+    public void updateOptions(Properties options) {}
+
     /**
      * Only map message handlers that we will use
      */
-    class SimpleMessageHandlerMap extends I2PClientMessageHandlerMap {
+    private static class SimpleMessageHandlerMap extends I2PClientMessageHandlerMap {
         public SimpleMessageHandlerMap(I2PAppContext context) {
             int highest = Math.max(DestReplyMessage.MESSAGE_TYPE, BandwidthLimitsMessage.MESSAGE_TYPE);
             _handlers = new I2CPMessageHandler[highest+1];
diff --git a/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java b/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java
index 4748e749502e4d3c4958d3878ff38a1e1c92ced6..be88bdb53f248cdd696ffa18148121fd62b0edc7 100644
--- a/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java
+++ b/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java
@@ -30,10 +30,10 @@ public final class I2PDatagramDissector {
 
     private static Log _log = new Log(I2PDatagramDissector.class);
 
-    private static int DGRAM_BUFSIZE = 32768;
+    private static final int DGRAM_BUFSIZE = 32768;
 
-    private DSAEngine dsaEng = DSAEngine.getInstance();
-    private SHA256Generator hashGen = SHA256Generator.getInstance();
+    private final DSAEngine dsaEng = DSAEngine.getInstance();
+    private final SHA256Generator hashGen = SHA256Generator.getInstance();
 
     private Hash rxHash = null;
 
@@ -41,7 +41,7 @@ public final class I2PDatagramDissector {
 
     private Destination rxDest;
 
-    private byte[] rxPayload = new byte[DGRAM_BUFSIZE];
+    private final byte[] rxPayload = new byte[DGRAM_BUFSIZE];
 
     private int rxPayloadLen = 0;
     
@@ -63,36 +63,36 @@ public final class I2PDatagramDissector {
     public void loadI2PDatagram(byte[] dgram) throws DataFormatException {
         ByteArrayInputStream dgStream = new ByteArrayInputStream(dgram);
         byte[] rxTrimmedPayload;
-
-		// set invalid(very important!)
-		this.valid = false;
-
+        
+        // set invalid(very important!)
+        this.valid = false;
+        
         try {
             rxDest = new Destination();
             rxSign = new Signature();
-
-			// read destination
+            
+            // read destination
             rxDest.readBytes(dgStream);
-
-			// read signature
+            
+            // read signature
             rxSign.readBytes(dgStream);
-
-			// read payload
+            
+            // read payload
             rxPayloadLen = dgStream.read(rxPayload);
-			
-			// calculate the hash of the payload
+            
+            // calculate the hash of the payload
             this.rxHash = hashGen.calculateHash(rxPayload, 0, rxPayloadLen);
-			assert this.hashGen.calculateHash(this.extractPayload()).equals(this.rxHash);
+            assert this.hashGen.calculateHash(this.extractPayload()).equals(this.rxHash);
         } catch (IOException e) {
             _log.error("Caught IOException - INCONSISTENT STATE!", e);
         } catch(AssertionError e) {
-			_log.error("Assertion failed!", e);
-		}
-
+            _log.error("Assertion failed!", e);
+        }
+        
         //_log.debug("Datagram payload size: " + rxPayloadLen + "; content:\n"
         //           + HexDump.dump(rxPayload, 0, rxPayloadLen));
     }
-
+    
     /**
      * Get the payload carried by an I2P repliable datagram (previously loaded
      * with the loadI2PDatagram() method), verifying the datagram signature.
@@ -106,7 +106,7 @@ public final class I2PDatagramDissector {
         
         return this.extractPayload();
     }
-
+    
     /**
      * Get the sender of an I2P repliable datagram (previously loaded with the
      * loadI2PDatagram() method), verifying the datagram signature.
@@ -118,23 +118,23 @@ public final class I2PDatagramDissector {
     public Destination getSender() throws I2PInvalidDatagramException {
         this.verifySignature();
         
-		return this.extractSender();
+        return this.extractSender();
     }
-
-	/**
-	 * Extract the hash of the payload of an I2P repliable datagram (previously
-	 * loaded with the loadI2PDatagram() method), verifying the datagram
-	 * signature.
-	 * @return The hash of the payload of the I2P repliable datagram
-	 * @throws I2PInvalidDatagramException if the signature verification fails
-	 */
-	public Hash getHash() throws I2PInvalidDatagramException {
-		// make sure it has a valid signature
-		this.verifySignature();
-
-		return this.extractHash();
-	}
-
+    
+    /**
+     * Extract the hash of the payload of an I2P repliable datagram (previously
+     * loaded with the loadI2PDatagram() method), verifying the datagram
+     * signature.
+     * @return The hash of the payload of the I2P repliable datagram
+     * @throws I2PInvalidDatagramException if the signature verification fails
+     */
+    public Hash getHash() throws I2PInvalidDatagramException {
+        // make sure it has a valid signature
+        this.verifySignature();
+        
+        return this.extractHash();
+    }
+    
     /**
      * Extract the payload carried by an I2P repliable datagram (previously
      * loaded with the loadI2PDatagram() method), without verifying the
@@ -145,10 +145,10 @@ public final class I2PDatagramDissector {
     public byte[] extractPayload() {
         byte[] retPayload = new byte[this.rxPayloadLen];
         System.arraycopy(this.rxPayload, 0, retPayload, 0, this.rxPayloadLen);
-
+        
         return retPayload;
     }
-
+    
     /**
      * Extract the sender of an I2P repliable datagram (previously loaded with
      * the loadI2PDatagram() method), without verifying the datagram signature.
@@ -168,31 +168,30 @@ public final class I2PDatagramDissector {
         
         return retDest;
     }
-
-	/**
-	 * Extract the hash of the payload of an I2P repliable datagram (previously
-	 * loaded with the loadI2PDatagram() method), without verifying the datagram
-	 * signature.
-	 * @return The hash of the payload of the I2P repliable datagram
-	 */
-	public Hash extractHash() {
-		return this.rxHash;
-	}
+    
+    /**
+     * Extract the hash of the payload of an I2P repliable datagram (previously
+     * loaded with the loadI2PDatagram() method), without verifying the datagram
+     * signature.
+     * @return The hash of the payload of the I2P repliable datagram
+     */
+    public Hash extractHash() {
+        return this.rxHash;
+    }
     
     /**
      * Verify the signature of this datagram (previously loaded with the
      * loadI2PDatagram() method)
-	 * @throws I2PInvalidDatagramException if the signature is invalid
+     * @throws I2PInvalidDatagramException if the signature is invalid
      */
     public void verifySignature() throws I2PInvalidDatagramException {
         // first check if it already got validated
         if(this.valid)
             return;
         
-        if (rxSign == null || rxSign.getData() == null ||
-            rxDest == null || rxDest.getSigningPublicKey() == null)
+        if (rxSign == null || rxSign.getData() == null || rxDest == null || rxDest.getSigningPublicKey() == null)
             throw new I2PInvalidDatagramException("Datagram not yet read");
-
+        
         // now validate
         if (!this.dsaEng.verifySignature(rxSign, rxHash.getData(), rxDest.getSigningPublicKey()))
             throw new I2PInvalidDatagramException("Incorrect I2P repliable datagram signature");
diff --git a/core/java/src/net/i2p/client/datagram/I2PDatagramMaker.java b/core/java/src/net/i2p/client/datagram/I2PDatagramMaker.java
index 0b3baf5b4def9a492cb8e844cc76b77523d3609b..7d711492bb60ec5223038461dba494a7c5f21d83 100644
--- a/core/java/src/net/i2p/client/datagram/I2PDatagramMaker.java
+++ b/core/java/src/net/i2p/client/datagram/I2PDatagramMaker.java
@@ -28,15 +28,15 @@ public final class I2PDatagramMaker {
 
     private static Log _log = new Log(I2PDatagramMaker.class);
 
-    private static int DGRAM_BUFSIZE = 32768;
+    private static final int DGRAM_BUFSIZE = 32768;
 
-    private SHA256Generator hashGen = SHA256Generator.getInstance();
-    private DSAEngine dsaEng = DSAEngine.getInstance();
+    private final SHA256Generator hashGen = SHA256Generator.getInstance();
+    private final DSAEngine dsaEng = DSAEngine.getInstance();
 
     private SigningPrivateKey sxPrivKey = null;
     private byte[] sxDestBytes = null;
 
-    private ByteArrayOutputStream sxDGram = new ByteArrayOutputStream(DGRAM_BUFSIZE);
+    private final ByteArrayOutputStream sxDGram = new ByteArrayOutputStream(DGRAM_BUFSIZE);
 
     /**
      * Construct a new I2PDatagramMaker that will be able to create I2P
@@ -45,8 +45,8 @@ public final class I2PDatagramMaker {
      * @param session I2PSession used to send I2PDatagrams through
      */
     public I2PDatagramMaker(I2PSession session) {
-        sxPrivKey = session.getPrivateKey();
-        sxDestBytes = session.getMyDestination().toByteArray();
+        this();
+        this.setI2PDatagramMaker(session);
     }
     /**
      * Construct a new I2PDatagramMaker that is null.
@@ -70,12 +70,12 @@ public final class I2PDatagramMaker {
         
         try {
             sxDGram.write(sxDestBytes);
-        
+            
             dsaEng.sign(hashGen.calculateHash(payload).toByteArray(),
                         sxPrivKey).writeBytes(sxDGram);
-
+            
             sxDGram.write(payload);
-
+            
             return sxDGram.toByteArray();
         } catch (IOException e) {
             _log.error("Caught IOException", e);
diff --git a/core/java/src/net/i2p/client/datagram/I2PInvalidDatagramException.java b/core/java/src/net/i2p/client/datagram/I2PInvalidDatagramException.java
index 97756a7768c57f3490544abc7859106540358f8a..e64bfb38eb4176fb658ac941cb3cc8be76e3211b 100644
--- a/core/java/src/net/i2p/client/datagram/I2PInvalidDatagramException.java
+++ b/core/java/src/net/i2p/client/datagram/I2PInvalidDatagramException.java
@@ -16,10 +16,10 @@ package net.i2p.client.datagram;
 public class I2PInvalidDatagramException extends Exception {
 
     public I2PInvalidDatagramException() {
-	super();
+        super();
     }
     
     public I2PInvalidDatagramException(String s) {
-	super(s);
+        super(s);
     }
 }
diff --git a/core/java/src/net/i2p/crypto/CryptixAESEngine.java b/core/java/src/net/i2p/crypto/CryptixAESEngine.java
index ea2338003ce4c9f80209a7f642f54405e440466c..350821e35558fe6324db6cbc538ce02ad53f6174 100644
--- a/core/java/src/net/i2p/crypto/CryptixAESEngine.java
+++ b/core/java/src/net/i2p/crypto/CryptixAESEngine.java
@@ -149,7 +149,7 @@ public class CryptixAESEngine extends AESEngine {
     @Override
     public final void decryptBlock(byte payload[], int inIndex, SessionKey sessionKey, byte rv[], int outIndex) {
         if ( (payload == null) || (rv == null) )
-            throw new IllegalArgumentException("null block args [payload=" + payload + " rv="+rv);
+            throw new IllegalArgumentException("null block args");
         if (payload.length - inIndex > rv.length - outIndex)
             throw new IllegalArgumentException("bad block args [payload.len=" + payload.length 
                                                + " inIndex=" + inIndex + " rv.len=" + rv.length 
diff --git a/core/java/src/net/i2p/crypto/DHSessionKeyBuilder.java b/core/java/src/net/i2p/crypto/DHSessionKeyBuilder.java
index 192bde062920e187cb639320e498a6756f5934de..160cc1354bb54a5d5e2c3948f65574b7eae05aaa 100644
--- a/core/java/src/net/i2p/crypto/DHSessionKeyBuilder.java
+++ b/core/java/src/net/i2p/crypto/DHSessionKeyBuilder.java
@@ -82,7 +82,9 @@ public class DHSessionKeyBuilder {
 
         // add to the defaults for every 128MB of RAM, up to 512MB
         long maxMemory = Runtime.getRuntime().maxMemory();
-        int factor = Math.min(4, (int) (1 + (maxMemory / (128*1024*1024l))));
+        if (maxMemory == Long.MAX_VALUE)
+            maxMemory = 127*1024*1024l;
+        int factor = (int) Math.max(1l, Math.min(4l, 1 + (maxMemory / (128*1024*1024l))));
         int defaultMin = DEFAULT_DH_PRECALC_MIN * factor;
         int defaultMax = DEFAULT_DH_PRECALC_MAX * factor;
         MIN_NUM_BUILDERS = ctx.getProperty(PROP_DH_PRECALC_MIN, defaultMin);
diff --git a/core/java/src/net/i2p/crypto/ElGamalAESEngine.java b/core/java/src/net/i2p/crypto/ElGamalAESEngine.java
index 6160caf5b7a9243401ac5b6a166340649fcccb67..df4867574d7f52911025297a414592f2eec845bf 100644
--- a/core/java/src/net/i2p/crypto/ElGamalAESEngine.java
+++ b/core/java/src/net/i2p/crypto/ElGamalAESEngine.java
@@ -10,6 +10,7 @@ package net.i2p.crypto;
  */
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -527,8 +528,6 @@ public class ElGamalAESEngine {
         return aesEncr;
     }
 
-    private final static Set EMPTY_SET = new HashSet();
-
     /**
      * For both scenarios, this method encrypts the AES area using the given key, iv
      * and making sure the resulting data is at least as long as the paddedSize and 
@@ -552,7 +551,7 @@ public class ElGamalAESEngine {
                                         long paddedSize, int prefixBytes) {
         //_log.debug("iv for encryption: " + DataHelper.toString(iv, 16));
         //_log.debug("Encrypting AES");
-        if (tagsForDelivery == null) tagsForDelivery = EMPTY_SET;
+        if (tagsForDelivery == null) tagsForDelivery = Collections.EMPTY_SET;
         int size = 2 // sizeof(tags)
                  + tagsForDelivery.size()
                  + SessionTag.BYTE_LENGTH*tagsForDelivery.size()
diff --git a/core/java/src/net/i2p/crypto/SHA256Generator.java b/core/java/src/net/i2p/crypto/SHA256Generator.java
index 8d5b6957b5e2743e83e29429c732236aa475bb23..87955646beff602b64caf979a24229882ee9062d 100644
--- a/core/java/src/net/i2p/crypto/SHA256Generator.java
+++ b/core/java/src/net/i2p/crypto/SHA256Generator.java
@@ -23,13 +23,18 @@ public final class SHA256Generator {
         return I2PAppContext.getGlobalContext().sha();
     }
     
-    /** Calculate the SHA-256 has of the source
+    /**
+     * Calculate the SHA-256 hash of the source and cache the result.
      * @param source what to hash
      * @return hash of the source
      */
     public final Hash calculateHash(byte[] source) {
         return calculateHash(source, 0, source.length);
     }
+
+    /**
+     * Calculate the hash and cache the result.
+     */
     public final Hash calculateHash(byte[] source, int start, int len) {
         Sha256Standalone digest = acquireGnu();
         digest.update(source, start, len);
@@ -39,6 +44,10 @@ public final class SHA256Generator {
         return Hash.create(rv);
     }
     
+    /**
+     * Use this if you only need the data, not a Hash object.
+     * Does not cache.
+     */
     public final void calculateHash(byte[] source, int start, int len, byte out[], int outOffset) {
         Sha256Standalone digest = acquireGnu();
         digest.update(source, start, len);
diff --git a/core/java/src/net/i2p/crypto/YKGenerator.java b/core/java/src/net/i2p/crypto/YKGenerator.java
index 165749a7cf52aecf92ac9131fb346e013edae69a..ef8546e2f0f415225669fc213101fbf3488ababe 100644
--- a/core/java/src/net/i2p/crypto/YKGenerator.java
+++ b/core/java/src/net/i2p/crypto/YKGenerator.java
@@ -60,7 +60,9 @@ class YKGenerator {
 
         // add to the defaults for every 128MB of RAM, up to 1GB
         long maxMemory = Runtime.getRuntime().maxMemory();
-        int factor = Math.min(8, (int) (1 + (maxMemory / (128*1024*1024l))));
+        if (maxMemory == Long.MAX_VALUE)
+            maxMemory = 127*1024*1024l;
+        int factor = (int) Math.max(1l, Math.min(8l, 1 + (maxMemory / (128*1024*1024l))));
         int defaultMin = DEFAULT_YK_PRECALC_MIN * factor;
         int defaultMax = DEFAULT_YK_PRECALC_MAX * factor;
         MIN_NUM_BUILDERS = ctx.getProperty(PROP_YK_PRECALC_MIN, defaultMin);
diff --git a/core/java/src/net/i2p/data/Base32.java b/core/java/src/net/i2p/data/Base32.java
index 3071e0bc013ca784b8264c37589fa04809a38c3e..cbcb93515f9f8dcb90e3eaa73fdf1da862c706f5 100644
--- a/core/java/src/net/i2p/data/Base32.java
+++ b/core/java/src/net/i2p/data/Base32.java
@@ -72,13 +72,13 @@ public class Base32 {
     }
 
     private static void runApp(String args[]) {
+        if ("encodestring".equalsIgnoreCase(args[0])) {
+            System.out.println(encode(args[1].getBytes()));
+            return;
+        }
+        InputStream in = System.in;
+        OutputStream out = System.out;
         try {
-            if ("encodestring".equalsIgnoreCase(args[0])) {
-                System.out.println(encode(args[1].getBytes()));
-                return;
-            }
-            InputStream in = System.in;
-            OutputStream out = System.out;
             if (args.length >= 3) {
                 out = new FileOutputStream(args[2]);
             }
@@ -95,6 +95,9 @@ public class Base32 {
             }
         } catch (IOException ioe) {
             ioe.printStackTrace(System.err);
+        } finally {
+            try { in.close(); } catch (IOException e) {}
+            try { out.close(); } catch (IOException e) {}
         }
     }
 
diff --git a/core/java/src/net/i2p/data/Base64.java b/core/java/src/net/i2p/data/Base64.java
index fe730af6b4a0349e527f7347d32e094c16aeaa6c..52d59002d8ef654bff0b9314b9d48b348895e0b7 100644
--- a/core/java/src/net/i2p/data/Base64.java
+++ b/core/java/src/net/i2p/data/Base64.java
@@ -178,13 +178,13 @@ public class Base64 {
     }
 
     private static void runApp(String args[]) {
+        if ("encodestring".equalsIgnoreCase(args[0])) {
+            System.out.println(encode(args[1].getBytes()));
+            return;
+        }
+        InputStream in = System.in;
+        OutputStream out = System.out;
         try {
-            if ("encodestring".equalsIgnoreCase(args[0])) {
-                System.out.println(encode(args[1].getBytes()));
-                return;
-            }
-            InputStream in = System.in;
-            OutputStream out = System.out;
             if (args.length >= 3) {
                 out = new FileOutputStream(args[2]);
             }
@@ -201,6 +201,9 @@ public class Base64 {
             }
         } catch (IOException ioe) {
             ioe.printStackTrace(System.err);
+        } finally {
+            try { in.close(); } catch (IOException e) {}
+            try { out.close(); } catch (IOException e) {}
         }
     }
 
diff --git a/core/java/src/net/i2p/data/ByteArray.java b/core/java/src/net/i2p/data/ByteArray.java
index 7369a27d191c01e63c2d9ca9b4f10807b4f7f344..9f460fe4753f8eb41d4a7f399ee5c54bf166619d 100644
--- a/core/java/src/net/i2p/data/ByteArray.java
+++ b/core/java/src/net/i2p/data/ByteArray.java
@@ -24,6 +24,7 @@ public class ByteArray implements Serializable, Comparable {
     public ByteArray() {
     }
 
+    /** Sets valid */
     public ByteArray(byte[] data) {
         _data = data;
         _valid = (data != null ? data.length : 0);
@@ -38,6 +39,7 @@ public class ByteArray implements Serializable, Comparable {
         return _data;
     }
 
+    /** Warning, does not set valid */
     public void setData(byte[] data) {
         _data = data;
     }
diff --git a/core/java/src/net/i2p/data/Certificate.java b/core/java/src/net/i2p/data/Certificate.java
index 5222000987f0a571ede238d73392827572383927..c6d7c61b222754ce609944f9dfb4513b8fb7abdb 100644
--- a/core/java/src/net/i2p/data/Certificate.java
+++ b/core/java/src/net/i2p/data/Certificate.java
@@ -44,7 +44,7 @@ public class Certificate extends DataStructureImpl {
     public final static int CERTIFICATE_TYPE_MULTIPLE = 4;
 
     /**
-     * Pull from cache or return new
+     * If null cert, return immutable static instance, else create new
      * @throws AIOOBE if not enough bytes
      * @since 0.8.3
      */
@@ -57,7 +57,7 @@ public class Certificate extends DataStructureImpl {
         if (length == 0)
             return new Certificate(type, null);
         byte[] payload = new byte[length];
-        System.arraycopy(data, off = 3, payload, 0, length);
+        System.arraycopy(data, off + 3, payload, 0, length);
         return new Certificate(type, payload);
     }
 
diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java
index bd6bf260d9c5734186e6ae50f91b15274d52ed3a..9eab8649e569dc5581259382cfc57b19d3643f2a 100644
--- a/core/java/src/net/i2p/data/DataHelper.java
+++ b/core/java/src/net/i2p/data/DataHelper.java
@@ -31,6 +31,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
@@ -178,6 +179,7 @@ public class DataHelper {
      * @param props source
      * @return new offset
      */
+    @Deprecated
     public static int toProperties(byte target[], int offset, Properties props) throws DataFormatException, IOException {
         if (props != null) {
             OrderedProperties p = new OrderedProperties();
@@ -218,6 +220,7 @@ public class DataHelper {
      * @param target returned Properties
      * @return new offset
      */
+    @Deprecated
     public static int fromProperties(byte source[], int offset, Properties target) throws DataFormatException, IOException {
         int size = (int)fromLong(source, offset, 2);
         offset += 2;
@@ -253,6 +256,7 @@ public class DataHelper {
      *
      * @throws RuntimeException if either is too long.
      */
+    @Deprecated
     public static byte[] toProperties(Properties opts) {
         try {
             ByteArrayOutputStream baos = new ByteArrayOutputStream(2);
@@ -543,6 +547,7 @@ public class DataHelper {
     }
 
     /** @deprecated unused */
+    @Deprecated
     public static byte[] toDate(Date date) throws IllegalArgumentException {
         if (date == null)
             return toLong(DATE_LENGTH, 0L);
@@ -677,6 +682,7 @@ public class DataHelper {
      * @throws IOException if there is an IO error writing the boolean
      * @deprecated unused
      */
+    @Deprecated
     public static void writeBoolean(OutputStream out, Boolean bool) 
         throws DataFormatException, IOException {
         if (bool == null)
@@ -688,6 +694,7 @@ public class DataHelper {
     }
     
     /** @deprecated unused */
+    @Deprecated
     public static Boolean fromBoolean(byte data[], int offset) {
         if (data[offset] == BOOLEAN_TRUE)
             return Boolean.TRUE;
@@ -698,11 +705,13 @@ public class DataHelper {
     }
     
     /** @deprecated unused */
+    @Deprecated
     public static void toBoolean(byte data[], int offset, boolean value) {
         data[offset] = (value ? BOOLEAN_TRUE : BOOLEAN_FALSE);
     }
 
     /** @deprecated unused */
+    @Deprecated
     public static void toBoolean(byte data[], int offset, Boolean value) {
         if (value == null)
             data[offset] = BOOLEAN_UNKNOWN;
@@ -711,12 +720,16 @@ public class DataHelper {
     }
     
     /** deprecated - used only in DatabaseLookupMessage */
+    @Deprecated
     public static final byte BOOLEAN_TRUE = 0x1;
     /** deprecated - used only in DatabaseLookupMessage */
+    @Deprecated
     public static final byte BOOLEAN_FALSE = 0x0;
     /** @deprecated unused */
+    @Deprecated
     public static final byte BOOLEAN_UNKNOWN = 0x2;
     /** @deprecated unused */
+    @Deprecated
     public static final int BOOLEAN_LENGTH = 1;
 
     //
@@ -768,17 +781,17 @@ public class DataHelper {
      * This treats (null == null) as true, (null == (!null)) as false, 
      * and unequal length arrays as false.
      *
+     * @return Arrays.equals(lhs, rhs)
      */
     public final static boolean eq(byte lhs[], byte rhs[]) {
-        // this appears to be the way Arrays.equals is defined, so all the extra tests are unnecessary?
-        boolean eq = (((lhs == null) && (rhs == null)) || ((lhs != null) && (rhs != null) && (Arrays.equals(lhs, rhs))));
-        return eq;
+        return Arrays.equals(lhs, rhs);
     }
 
     /**
      * Compare two integers, really just for consistency.
      * @deprecated inefficient
      */
+    @Deprecated
     public final static boolean eq(int lhs, int rhs) {
         return lhs == rhs;
     }
@@ -787,6 +800,7 @@ public class DataHelper {
      * Compare two longs, really just for consistency.
      * @deprecated inefficient
      */
+    @Deprecated
     public final static boolean eq(long lhs, long rhs) {
         return lhs == rhs;
     }
@@ -795,6 +809,7 @@ public class DataHelper {
      * Compare two bytes, really just for consistency.
      * @deprecated inefficient
      */
+    @Deprecated
     public final static boolean eq(byte lhs, byte rhs) {
         return lhs == rhs;
     }
@@ -844,7 +859,7 @@ public class DataHelper {
      */
     public final static void xor(byte lhs[], int startLeft, byte rhs[], int startRight, byte out[], int startOut, int len) {
         if ( (lhs == null) || (rhs == null) || (out == null) )
-            throw new NullPointerException("Invalid params to xor (" + lhs + ", " + rhs + ", " + out + ")");
+            throw new NullPointerException("Null params to xor");
         if (lhs.length < startLeft + len)
             throw new IllegalArgumentException("Left hand side is too short");
         if (rhs.length < startRight + len)
@@ -973,6 +988,7 @@ public class DataHelper {
      * @return true if the line was read, false if eof was reached before a 
      *              newline was found
      */
+    @Deprecated
     public static boolean readLine(InputStream in, StringBuffer buf) throws IOException {
         return readLine(in, buf, null);
     }
@@ -986,6 +1002,7 @@ public class DataHelper {
      * Warning - 8KB line length limit as of 0.7.13, @throws IOException if exceeded
      * @deprecated use StringBuilder version
      */
+    @Deprecated
     public static boolean readLine(InputStream in, StringBuffer buf, Sha256Standalone hash) throws IOException {
         int c = -1;
         int i = 0;
@@ -1040,25 +1057,45 @@ public class DataHelper {
     }
 
     /**
-     *  Sort based on the Hash of the DataStructure
+     *  Sort based on the Hash of the DataStructure.
      *  Warning - relatively slow.
-     *  Only used by RouterInfo
-     *  Why? Just because it has to be consistent so signing will work?
+     *  WARNING - this sort order must be consistent network-wide, so while the order is arbitrary,
+     *  it cannot be changed.
+     *  Why? Just because it has to be consistent so signing will work.
      *  How to spec as returning the same type as the param?
+     *  DEPRECATED - Only used by RouterInfo.
      */
     public static List<? extends DataStructure> sortStructures(Collection<? extends DataStructure> dataStructures) {
         if (dataStructures == null) return Collections.EMPTY_LIST;
-        ArrayList<DataStructure> rv = new ArrayList(dataStructures.size());
-        TreeMap<String, DataStructure> tm = new TreeMap();
-        for (DataStructure struct : dataStructures) {
-            tm.put(struct.calculateHash().toString(), struct);
-        }
-        for (DataStructure struct : tm.values()) {
-            rv.add(struct);
-        }
+
+        // This used to use Hash.toString(), which is insane, since a change to toString()
+        // would break the whole network. Now use Hash.toBase64().
+        // Note that the Base64 sort order is NOT the same as the raw byte sort order,
+        // despite what you may read elsewhere.
+
+        //ArrayList<DataStructure> rv = new ArrayList(dataStructures.size());
+        //TreeMap<String, DataStructure> tm = new TreeMap();
+        //for (DataStructure struct : dataStructures) {
+        //    tm.put(struct.calculateHash().toString(), struct);
+        //}
+        //for (DataStructure struct : tm.values()) {
+        //    rv.add(struct);
+        //}
+        ArrayList<DataStructure> rv = new ArrayList(dataStructures);
+        Collections.sort(rv, new DataStructureComparator());
         return rv;
     }
 
+    /**
+     * See sortStructures() comments.
+     * @since 0.8.3
+     */
+    private static class DataStructureComparator implements Comparator<DataStructure> {
+        public int compare(DataStructure l, DataStructure r) {
+            return l.calculateHash().toBase64().compareTo(r.calculateHash().toBase64());
+        }
+    }
+
     /**
      *  NOTE: formatDuration2() recommended in most cases for readability
      */
@@ -1157,6 +1194,10 @@ public class DataHelper {
             case 2: return str + "M";
             case 3: return str + "G";
             case 4: return str + "T";
+            case 5: return str + "P";
+            case 6: return str + "E";
+            case 7: return str + "Z";
+            case 8: return str + "Y";
             default: return bytes + "";
         }
     }
@@ -1183,12 +1224,17 @@ public class DataHelper {
             case 2: return str + "&nbsp;M";
             case 3: return str + "&nbsp;G";
             case 4: return str + "&nbsp;T";
+            case 5: return str + "&nbsp;P";
+            case 6: return str + "&nbsp;E";
+            case 7: return str + "&nbsp;Z";
+            case 8: return str + "&nbsp;Y";
             default: return bytes + "&nbsp;";
         }
     }
     
     /**
      * Strip out any HTML (simply removing any less than / greater than symbols)
+     * @param orig may be null, returns empty string if null
      */
     public static String stripHTML(String orig) {
         if (orig == null) return "";
diff --git a/core/java/src/net/i2p/data/DateAndFlags.java b/core/java/src/net/i2p/data/DateAndFlags.java
new file mode 100644
index 0000000000000000000000000000000000000000..0810cddca6e9db88719b7ace262f38803c0ca30b
--- /dev/null
+++ b/core/java/src/net/i2p/data/DateAndFlags.java
@@ -0,0 +1,139 @@
+package net.i2p.data;
+
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Released into the public domain 
+ * with no warranty of any kind, either expressed or implied.  
+ *
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Date;
+
+/**
+ * A six-byte Date and 2 bytes of flags, since a Date won't encroach
+ * on the top two bytes until the year 10889.
+ *
+ * The flag format is not specified here. The bits may be used in
+ * an application-specific manner. The application should
+ * be designed so that a flags value of 0 is the default, for
+ * compatibility with an 8-byte Date.
+ *
+ * If we really need some more bits we could use the first few bits
+ * of the third byte.
+ *
+ * @author zzz
+ * @since 0.8.4
+ */
+public class DateAndFlags extends DataStructureImpl {
+    private int _flags;
+    private long _date;
+
+    public DateAndFlags() {}
+
+    /**
+     *  @param flags 0 - 65535
+     */
+    public DateAndFlags(long date, int flags) {
+        _flags = flags;
+        _date = date;
+    }
+
+    /**
+     *  @param flags 0 - 65535
+     */
+    public DateAndFlags(Date date, int flags) {
+        _flags = flags;
+        _date = date.getTime();
+    }
+
+    public int getFlags() {
+        return _flags;
+    }
+
+    /**
+     *  @param flags 0 - 65535
+     */
+    public void setFlags(int flags) {
+        _flags = flags;
+    }
+
+    /**
+     *  The Date object is created here, it is not cached.
+     *  Use getTime() if you only need the long value.
+     */
+    public Date getDate() {
+        return new Date(_date);
+    }
+
+    public long getTime() {
+        return (_date);
+    }
+
+    public void setDate(long date) {
+        _date = date;
+    }
+
+    public void setDate(Date date) {
+        _date = date.getTime();
+    }
+
+    public void readBytes(InputStream in) throws DataFormatException, IOException {
+        _flags = (int) DataHelper.readLong(in, 2);
+        _date = DataHelper.readLong(in, 6);
+    }
+    
+    public void writeBytes(OutputStream out) throws DataFormatException, IOException {
+        DataHelper.writeLong(out, 2, _flags);
+        DataHelper.writeLong(out, 6, _date);
+    }
+    
+    /**
+     * Overridden for efficiency.
+     */
+    @Override
+    public byte[] toByteArray() {
+        byte[] rv = DataHelper.toLong(8, _date);
+        rv[0] = (byte) ((_flags >> 8) & 0xff);
+        rv[1] = (byte) (_flags & 0xff);
+        return rv;
+    }
+
+    /**
+     * Overridden for efficiency.
+     * @param data non-null
+     * @throws DataFormatException if null or wrong length
+     */
+    @Override
+    public void fromByteArray(byte data[]) throws DataFormatException {
+        if (data == null) throw new DataFormatException("Null data passed in");
+        if (data.length != 8) throw new DataFormatException("Bad data length");
+        _flags = (int) DataHelper.fromLong(data, 0, 2);
+        _date = DataHelper.fromLong(data, 2, 6);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if ((object == null) || !(object instanceof DateAndFlags)) return false;
+        DateAndFlags daf = (DateAndFlags) object;
+        return _date == daf._date && _flags == daf._flags;
+
+    }
+    
+    @Override
+    public int hashCode() {
+        return _flags + (int) _date;
+    }
+    
+    @Override
+    public String toString() {
+        StringBuilder buf = new StringBuilder(64);
+        buf.append("[DateAndFlags: ");
+        buf.append("\n\tDate: ").append((new Date(_date)).toString());
+        buf.append("\n\tFlags: 0x").append(Integer.toHexString(_flags));
+        buf.append("]");
+        return buf.toString();
+    }
+}
diff --git a/core/java/src/net/i2p/data/PrivateKey.java b/core/java/src/net/i2p/data/PrivateKey.java
index bf415bdc9c522acabcae644858666858c5cfff21..5b0a5e4bbb4512824e82ad355c3ec858e25b448f 100644
--- a/core/java/src/net/i2p/data/PrivateKey.java
+++ b/core/java/src/net/i2p/data/PrivateKey.java
@@ -16,6 +16,9 @@ import net.i2p.crypto.KeyGenerator;
  * A private key is 256byte Integer. The private key represents only the 
  * exponent, not the primes, which are constant and defined in the crypto spec.
  *
+ * Note that we use short exponents, so all but the last 28.25 bytes are zero.
+ * See http://www.i2p2.i2p/how_cryptography for details.
+ *
  * @author jrandom
  */
 public class PrivateKey extends SimpleDataStructure {
@@ -50,4 +53,24 @@ public class PrivateKey extends SimpleDataStructure {
         return KeyGenerator.getPublicKey(this);
     }
 
+    /**
+     * We assume the data has enough randomness in it, so use the last 4 bytes for speed.
+     * Overridden since we use short exponents, so the first 227 bytes are all zero.
+     * Not that we are storing PrivateKeys in any Sets or Maps anywhere.
+     */
+    @Override
+    public int hashCode() {
+        if (_data == null)
+            return 0;
+        int rv = _data[KEYSIZE_BYTES - 4];
+        for (int i = 1; i < 4; i++)
+            rv ^= (_data[i + (KEYSIZE_BYTES - 4)] << (i*8));
+        return rv;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ((obj == null) || !(obj instanceof PrivateKey)) return false;
+        return DataHelper.eq(_data, ((PrivateKey) obj)._data);
+    }
 }
diff --git a/core/java/src/net/i2p/data/PrivateKeyFile.java b/core/java/src/net/i2p/data/PrivateKeyFile.java
index 0c752f9d6a22c0eed86d5aeb97d99081997f8eb1..4f4af3cf9ae51a582bce40f0a7a0cb6c7a71c390 100644
--- a/core/java/src/net/i2p/data/PrivateKeyFile.java
+++ b/core/java/src/net/i2p/data/PrivateKeyFile.java
@@ -133,9 +133,15 @@ public class PrivateKeyFile {
      */
     public Destination createIfAbsent() throws I2PException, IOException, DataFormatException {
         if(!this.file.exists()) {
-            FileOutputStream out = new FileOutputStream(this.file);
-            this.client.createDestination(out);
-            out.close();
+            FileOutputStream out = null;
+            try {
+                out = new FileOutputStream(this.file);
+                this.client.createDestination(out);
+            } finally {
+                if (out != null) {
+                    try { out.close(); } catch (IOException ioe) {}
+                }
+            }
         }
         return getDestination();
     }
@@ -243,29 +249,36 @@ public class PrivateKeyFile {
     public I2PSession open() throws I2PSessionException, IOException {
         return this.open(new Properties());
     }
+
     public I2PSession open(Properties opts) throws I2PSessionException, IOException {
-        // open input file
-        FileInputStream in = new FileInputStream(this.file);
-        
-        // create sesssion
-        I2PSession s = this.client.createSession(in, opts);
-        
-        // close file
-        in.close();
-        
-        return s;
+        FileInputStream in = null;
+        try {
+            in = new FileInputStream(this.file);
+            I2PSession s = this.client.createSession(in, opts);
+            return s;
+        } finally {
+            if (in != null) {
+                try { in.close(); } catch (IOException ioe) {}
+            }
+        }
     }
     
     /**
      *  Copied from I2PClientImpl.createDestination()
      */
     public void write() throws IOException, DataFormatException {
-        FileOutputStream out = new FileOutputStream(this.file);
-        this.dest.writeBytes(out);
-        this.privKey.writeBytes(out);
-        this.signingPrivKey.writeBytes(out);
-        out.flush();
-        out.close();
+        FileOutputStream out = null;
+        try {
+            out = new FileOutputStream(this.file);
+            this.dest.writeBytes(out);
+            this.privKey.writeBytes(out);
+            this.signingPrivKey.writeBytes(out);
+            out.flush();
+        } finally {
+            if (out != null) {
+                try { out.close(); } catch (IOException ioe) {}
+            }
+        }
     }
 
     @Override
@@ -377,7 +390,8 @@ public class PrivateKeyFile {
                         }
                     }
                 }
-            } catch (Exception ioe) {
+            } catch (DataFormatException dfe) {
+            } catch (IOException ioe) {
             }
             // not found, continue to the next file
         }
diff --git a/core/java/src/net/i2p/data/RouterAddress.java b/core/java/src/net/i2p/data/RouterAddress.java
index 1b4d6438f5e518caf134c9f4a9a61183f7aaf96e..647104574a2a8518f85178f6f6686f4939449348 100644
--- a/core/java/src/net/i2p/data/RouterAddress.java
+++ b/core/java/src/net/i2p/data/RouterAddress.java
@@ -131,10 +131,13 @@ public class RouterAddress extends DataStructureImpl {
                && DataHelper.eq(_transportStyle, addr.getTransportStyle());
     }
     
-    /** the style should be sufficient, for speed */
+    /**
+     * Just use style and hashCode for speed (expiration is always null).
+     * If we add multiple addresses of the same style, this may need to be changed.
+     */
     @Override
     public int hashCode() {
-        return DataHelper.hashCode(_transportStyle);
+        return DataHelper.hashCode(_transportStyle) ^ _cost;
     }
     
     /**
diff --git a/core/java/src/net/i2p/data/RouterInfo.java b/core/java/src/net/i2p/data/RouterInfo.java
index 9c6db01f9111a728fb666b0d713b9ed18549c178..7d6ff8a8e5b2f5f9288fad7faaef4550214499d4 100644
--- a/core/java/src/net/i2p/data/RouterInfo.java
+++ b/core/java/src/net/i2p/data/RouterInfo.java
@@ -14,6 +14,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -39,7 +40,8 @@ public class RouterInfo extends DatabaseEntry {
     private RouterIdentity _identity;
     private volatile long _published;
     private final Set<RouterAddress> _addresses;
-    private final Set<Hash> _peers;
+    /** may be null to save memory, no longer final */
+    private Set<Hash> _peers;
     private /* FIXME final FIXME */ Properties _options;
     private volatile boolean _validated;
     private volatile boolean _isValid;
@@ -47,6 +49,11 @@ public class RouterInfo extends DatabaseEntry {
     private volatile byte _byteified[];
     private volatile int _hashCode;
     private volatile boolean _hashCodeInitialized;
+    /** should we cache the byte and string versions _byteified ? **/
+    private boolean _shouldCache;
+    /** maybe we should check if we are floodfill? */
+    private static final boolean CACHE_ALL = Runtime.getRuntime().maxMemory() > 128*1024*1024l &&
+                                             Runtime.getRuntime().maxMemory() < Long.MAX_VALUE;
 
     public static final String PROP_NETWORK_ID = "netId";
     public static final String PROP_CAPABILITIES = "caps";
@@ -58,7 +65,6 @@ public class RouterInfo extends DatabaseEntry {
     
     public RouterInfo() {
         _addresses = new HashSet(2);
-        _peers = new HashSet(0);
         _options = new OrderedProperties();
     }
 
@@ -70,6 +76,7 @@ public class RouterInfo extends DatabaseEntry {
         setPeers(old.getPeers());
         setOptions(old.getOptions());
         setSignature(old.getSignature());
+        // copy over _byteified?
     }
 
     public long getDate() {
@@ -105,6 +112,11 @@ public class RouterInfo extends DatabaseEntry {
     public void setIdentity(RouterIdentity ident) {
         _identity = ident;
         resetCache();
+        // We only want to cache the bytes for our own RI, which is frequently written.
+        // To cache for all RIs doubles the RI memory usage.
+        // setIdentity() is only called when we are creating our own RI.
+        // Otherwise, the data is populated with readBytes().
+        _shouldCache = true;
     }
 
     /**
@@ -159,6 +171,8 @@ public class RouterInfo extends DatabaseEntry {
      * @deprecated Implemented here but unused elsewhere
      */
     public Set<Hash> getPeers() {
+        if (_peers == null)
+            return Collections.EMPTY_SET;
         return _peers;
     }
 
@@ -169,9 +183,15 @@ public class RouterInfo extends DatabaseEntry {
      * @deprecated Implemented here but unused elsewhere
      */
     public void setPeers(Set<Hash> peers) {
+        if (peers == null || peers.isEmpty()) {
+            _peers = null;
+            return;
+        }
+        if (_peers == null)
+            _peers = new HashSet(2);
         synchronized (_peers) {
             _peers.clear();
-            if (peers != null) _peers.addAll(peers);
+            _peers.addAll(peers);
         }
         resetCache();
     }
@@ -223,7 +243,6 @@ public class RouterInfo extends DatabaseEntry {
         if (_byteified != null) return _byteified;
         if (_identity == null) throw new DataFormatException("Router identity isn't set? wtf!");
         if (_addresses == null) throw new DataFormatException("Router addressess isn't set? wtf!");
-        if (_peers == null) throw new DataFormatException("Router peers isn't set? wtf!");
         if (_options == null) throw new DataFormatException("Router options isn't set? wtf!");
 
         long before = Clock.getInstance().now();
@@ -239,6 +258,9 @@ public class RouterInfo extends DatabaseEntry {
                 DataHelper.writeLong(out, 1, sz);
                 Collection<RouterAddress> addresses = _addresses;
                 if (sz > 1)
+                    // WARNING this sort algorithm cannot be changed, as it must be consistent
+                    // network-wide. The signature is not checked at readin time, but only
+                    // later, and the addresses are stored in a Set, not a List.
                     addresses = (Collection<RouterAddress>) DataHelper.sortStructures(addresses);
                 for (RouterAddress addr : addresses) {
                     addr.writeBytes(out);
@@ -248,12 +270,14 @@ public class RouterInfo extends DatabaseEntry {
             // answer: they're always empty... they're a placeholder for one particular
             //         method of trusted links, which isn't implemented in the router
             //         at the moment, and may not be later.
-            // fixme to reduce objects - allow _peers == null
-            int psz = _peers.size();
+            int psz = _peers == null ? 0 : _peers.size();
             DataHelper.writeLong(out, 1, psz);
             if (psz > 0) {
                 Collection<Hash> peers = _peers;
                 if (psz > 1)
+                    // WARNING this sort algorithm cannot be changed, as it must be consistent
+                    // network-wide. The signature is not checked at readin time, but only
+                    // later, and the hashes are stored in a Set, not a List.
                     peers = (Collection<Hash>) DataHelper.sortStructures(peers);
                 for (Hash peerHash : peers) {
                     peerHash.writeBytes(out);
@@ -266,7 +290,8 @@ public class RouterInfo extends DatabaseEntry {
         byte data[] = out.toByteArray();
         long after = Clock.getInstance().now();
         _log.debug("getBytes()  took " + (after - before) + "ms");
-        _byteified = data;
+        if (CACHE_ALL || _shouldCache)
+            _byteified = data;
         return data;
     }
 
@@ -466,10 +491,15 @@ public class RouterInfo extends DatabaseEntry {
             _addresses.add(address);
         }
         int numPeers = (int) DataHelper.readLong(in, 1);
-        for (int i = 0; i < numPeers; i++) {
-            Hash peerIdentityHash = new Hash();
-            peerIdentityHash.readBytes(in);
-            _peers.add(peerIdentityHash);
+        if (numPeers == 0) {
+            _peers = null;
+        } else {
+            _peers = new HashSet(numPeers);
+            for (int i = 0; i < numPeers; i++) {
+                Hash peerIdentityHash = new Hash();
+                peerIdentityHash.readBytes(in);
+                _peers.add(peerIdentityHash);
+            }
         }
         _options = DataHelper.readProperties(in);
         _signature = new Signature();
@@ -504,7 +534,7 @@ public class RouterInfo extends DatabaseEntry {
                && _published == info.getPublished()
                && DataHelper.eq(_addresses, info.getAddresses())
                && DataHelper.eq(_options, info.getOptions()) 
-               && DataHelper.eq(_peers, info.getPeers());
+               && DataHelper.eq(getPeers(), info.getPeers());
     }
     
     @Override
@@ -530,7 +560,7 @@ public class RouterInfo extends DatabaseEntry {
             RouterAddress addr = (RouterAddress) iter.next();
             buf.append("\n\t\tAddress: ").append(addr);
         }
-        Set peers = _peers; // getPeers()
+        Set peers = getPeers();
         buf.append("\n\tPeers: #: ").append(peers.size());
         for (Iterator iter = peers.iterator(); iter.hasNext();) {
             Hash hash = (Hash) iter.next();
diff --git a/core/java/src/net/i2p/data/SDSCache.java b/core/java/src/net/i2p/data/SDSCache.java
index 562c49c79ae0ca8d880e0022fed1c619f8392d8f..8698f6a78b7d80c9ce89b4d18f480099412f4025 100644
--- a/core/java/src/net/i2p/data/SDSCache.java
+++ b/core/java/src/net/i2p/data/SDSCache.java
@@ -50,6 +50,8 @@ public class SDSCache<V extends SimpleDataStructure> {
     private static final double FACTOR;
     static {
         long maxMemory = Runtime.getRuntime().maxMemory();
+        if (maxMemory == Long.MAX_VALUE)
+            maxMemory = 96*1024*1024l;
         FACTOR = Math.max(MIN_FACTOR, Math.min(MAX_FACTOR, maxMemory / (128*1024*1024d)));
     }
 
diff --git a/core/java/src/net/i2p/data/SimpleDataStructure.java b/core/java/src/net/i2p/data/SimpleDataStructure.java
index 0017e567cc41ae573874a9bba06c4ef25918b746..01ca5443f38fe5694b753d9ff3804365c6c2aa43 100644
--- a/core/java/src/net/i2p/data/SimpleDataStructure.java
+++ b/core/java/src/net/i2p/data/SimpleDataStructure.java
@@ -75,7 +75,7 @@ public abstract class SimpleDataStructure extends DataStructureImpl {
 
     /**
      * Sets the data.
-     * @param data of correct length, or null
+     * @param in the stream to read
      * @throws RuntimeException if data already set.
      */
     public void readBytes(InputStream in) throws DataFormatException, IOException {
diff --git a/core/java/src/net/i2p/data/TunnelId.java b/core/java/src/net/i2p/data/TunnelId.java
index 2e625e606fbfb4f5c47f3082b5f4cee02eb7b45f..0e1c815f6005befb716fa5ca1d0ef3bb270ad063 100644
--- a/core/java/src/net/i2p/data/TunnelId.java
+++ b/core/java/src/net/i2p/data/TunnelId.java
@@ -50,6 +50,26 @@ public class TunnelId extends DataStructureImpl {
         DataHelper.writeLong(out, 4, _tunnelId);
     }
 
+    /**
+     * Overridden for efficiency.
+     */
+    @Override
+    public byte[] toByteArray() {
+        return DataHelper.toLong(4, _tunnelId);
+    }
+
+    /**
+     * Overridden for efficiency.
+     * @param data non-null
+     * @throws DataFormatException if null or wrong length
+     */
+    @Override
+    public void fromByteArray(byte data[]) throws DataFormatException {
+        if (data == null) throw new DataFormatException("Null data passed in");
+        if (data.length != 4) throw new DataFormatException("Bad data length");
+        _tunnelId = (int) DataHelper.fromLong(data, 0, 4);
+    }
+
     @Override
     public boolean equals(Object obj) {
         if ( (obj == null) || !(obj instanceof TunnelId))
diff --git a/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java b/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java
index 788fb36a0d3930e45b7f2f98bef37790ab383f73..f4d44a3ae30103619d83147b5b3cb5f4d25f659a 100644
--- a/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java
@@ -74,10 +74,11 @@ public class DestReplyMessage extends I2CPMessageImpl {
     }
 
     protected byte[] doWriteMessage() throws I2CPMessageException, IOException {
-        if (_dest == null && _hash == null)
-            return new byte[0];  // null response allowed
-        if (_dest == null && _hash != null)
+        if (_dest == null) {
+            if (_hash == null)
+                return new byte[0];  // null response allowed
             return _hash.getData();
+        }
         ByteArrayOutputStream os = new ByteArrayOutputStream(_dest.size());
         try {
             _dest.writeBytes(os);
diff --git a/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java b/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java
index 9bcabe2fb77a4fb875d4bf0d38465a9409314008..08b31a6e759fb8c1b31242fbc89b25f127a2a2a3 100644
--- a/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java
@@ -16,32 +16,66 @@ import java.util.Date;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
+import net.i2p.data.DateAndFlags;
 import net.i2p.data.Destination;
 import net.i2p.data.Payload;
 
 /**
  * Same as SendMessageMessage, but with an expiration to be passed to the router
  *
+ * As of 0.8.4, retrofitted to use DateAndFlags. Backwards compatible.
+ *
  * @author zzz
  */
 public class SendMessageExpiresMessage extends SendMessageMessage {
     /* FIXME hides another field FIXME */
     public final static int MESSAGE_TYPE = 36;
-    private SessionId _sessionId;
-    private Destination _destination;
-    private Payload _payload;
-    private Date _expiration;
+    private final DateAndFlags _daf;
 
     public SendMessageExpiresMessage() {
         super();
+        _daf = new DateAndFlags();
     }
 
+    /**
+     *  The Date object is created here, it is not cached.
+     *  Use getExpirationTime() if you only need the long value.
+     */
     public Date getExpiration() {
-        return _expiration;
+        return _daf.getDate();
+    }
+
+    /**
+     *  Use this instead of getExpiration().getTime()
+     *  @since 0.8.4
+     */
+    public long getExpirationTime() {
+        return _daf.getTime();
     }
 
     public void setExpiration(Date d) {
-        _expiration = d;
+        _daf.setDate(d);
+    }
+
+    /**
+     *  @since 0.8.4
+     */
+    public void setExpiration(long d) {
+        _daf.setDate(d);
+    }
+
+    /**
+     *  @since 0.8.4
+     */
+    public int getFlags() {
+        return _daf.getFlags();
+    }
+
+    /**
+     *  @since 0.8.4
+     */
+    public void setFlags(int f) {
+        _daf.setFlags(f);
     }
 
     /**
@@ -54,7 +88,7 @@ public class SendMessageExpiresMessage extends SendMessageMessage {
         super.readMessage(in, length, type);
 
         try {
-            _expiration = DataHelper.readDate(in);
+            _daf.readBytes(in);
         } catch (DataFormatException dfe) {
             throw new I2CPMessageException("Unable to load the message data", dfe);
         }
@@ -68,7 +102,7 @@ public class SendMessageExpiresMessage extends SendMessageMessage {
      */
     @Override
     public void writeMessage(OutputStream out) throws I2CPMessageException, IOException {
-        if ((getSessionId() == null) || (getDestination() == null) || (getPayload() == null) || (getNonce() <= 0) || (_expiration == null))
+        if ((getSessionId() == null) || (getDestination() == null) || (getPayload() == null) || (getNonce() <= 0))
             throw new I2CPMessageException("Unable to write out the message as there is not enough data");
         int len = 2 + getDestination().size() + getPayload().getSize() + 4 + 4 + DataHelper.DATE_LENGTH;
         
@@ -79,7 +113,7 @@ public class SendMessageExpiresMessage extends SendMessageMessage {
             getDestination().writeBytes(out);
             getPayload().writeBytes(out);
             DataHelper.writeLong(out, 4, getNonce());
-            DataHelper.writeDate(out, _expiration);
+            _daf.writeBytes(out);
         } catch (DataFormatException dfe) {
             throw new I2CPMessageException("Error writing the msg", dfe);
         }
@@ -96,7 +130,7 @@ public class SendMessageExpiresMessage extends SendMessageMessage {
         if ((object != null) && (object instanceof SendMessageExpiresMessage)) {
             SendMessageExpiresMessage msg = (SendMessageExpiresMessage) object;
             return super.equals(object)
-                   && DataHelper.eq(getExpiration(), msg.getExpiration());
+                   && _daf.equals(msg._daf);
         }
          
         return false;
diff --git a/core/java/src/net/i2p/internal/QueuedI2CPMessageReader.java b/core/java/src/net/i2p/internal/QueuedI2CPMessageReader.java
index d713b678d4463a2ff617f54638a9e9500c8c421f..4b14d5ed8c4dcc70e5092eb84d2028804f5f236e 100644
--- a/core/java/src/net/i2p/internal/QueuedI2CPMessageReader.java
+++ b/core/java/src/net/i2p/internal/QueuedI2CPMessageReader.java
@@ -5,7 +5,7 @@ import net.i2p.data.i2cp.I2CPMessageReader;
 import net.i2p.util.I2PThread;
 
 /**
- * Get messages off an In-JVM queue, zero-copy
+ * Get messages off an In-JVM queue, zero-copy.
  *
  * @author zzz
  * @since 0.8.3
@@ -13,6 +13,9 @@ import net.i2p.util.I2PThread;
 public class QueuedI2CPMessageReader extends I2CPMessageReader {
     private final I2CPMessageQueue in;
 
+    /**
+     * Creates a new instance of this QueuedMessageReader and spawns a pumper thread.
+     */
     public QueuedI2CPMessageReader(I2CPMessageQueue in, I2CPMessageEventListener lsnr) {
         super(lsnr);
         this.in = in;
@@ -25,13 +28,19 @@ public class QueuedI2CPMessageReader extends I2CPMessageReader {
         public QueuedI2CPMessageReaderRunner() {
             super();
         }
-
+        
+        /**
+         * Shuts the pumper down.
+         */
         @Override
         public void cancelRunner() {
             super.cancelRunner();
             _readerThread.interrupt();
         }
-
+        
+        /**
+         * Pumps messages from the incoming message queue to the listener.
+         */
         @Override
         public void run() {
             while (_stayAlive) {
@@ -40,11 +49,15 @@ public class QueuedI2CPMessageReader extends I2CPMessageReader {
                     I2CPMessage msg = null;
                     try {
                         msg = in.take();
-                        if (msg.getType() == PoisonI2CPMessage.MESSAGE_TYPE)
+                        if (msg.getType() == PoisonI2CPMessage.MESSAGE_TYPE) {
+                            _listener.disconnected(QueuedI2CPMessageReader.this);
                             cancelRunner();
-                        else
+                        } else {
                             _listener.messageReceived(QueuedI2CPMessageReader.this, msg);
-                    } catch (InterruptedException ie) {}
+                        }
+                    } catch (InterruptedException ie) {
+                        // hint that we probably should check the continue running flag
+                    }
                 }
                 // ??? unused
                 if (_stayAlive && !_doRun) {
diff --git a/core/java/src/net/i2p/stat/FrequencyStat.java b/core/java/src/net/i2p/stat/FrequencyStat.java
index dfa7bcfe675298c564d2169f4d8d95372c19e4ad..d18a469dbd3c921a640cf7e06d3141db968747be 100644
--- a/core/java/src/net/i2p/stat/FrequencyStat.java
+++ b/core/java/src/net/i2p/stat/FrequencyStat.java
@@ -89,7 +89,7 @@ public class FrequencyStat {
     /** @since 0.8.2 */
     @Override
     public boolean equals(Object obj) {
-        if ((obj == null) || (obj.getClass() != FrequencyStat.class)) return false;
+        if ((obj == null) || !(obj instanceof FrequencyStat)) return false;
         return _statName.equals(((FrequencyStat)obj)._statName);
     }
 
diff --git a/core/java/src/net/i2p/stat/PersistenceHelper.java b/core/java/src/net/i2p/stat/PersistenceHelper.java
index d8c1312d42432ac31275f1fee0f6abdb0a459f79..1d5c6a46631700734765b6c70befcf413a4e3650 100644
--- a/core/java/src/net/i2p/stat/PersistenceHelper.java
+++ b/core/java/src/net/i2p/stat/PersistenceHelper.java
@@ -1,10 +1,16 @@
 package net.i2p.stat;
 
+import java.util.Date;
 import java.util.Properties;
 
+import net.i2p.data.DataHelper;
 import net.i2p.util.Log;
 
-/** object orientation gives you hairy palms. */
+/**
+ *  Output rate data.
+ *  This is used via ProfilePersistenceHelper and the output
+ *  must be compatible.
+ */
 class PersistenceHelper {
     private final static Log _log = new Log(PersistenceHelper.class);
     private final static String NL = System.getProperty("line.separator");
@@ -15,6 +21,18 @@ class PersistenceHelper {
         buf.append(prefix).append(name).append('=').append(value).append(NL).append(NL);
     }
 
+    /** @since 0.8.5 */
+    public final static void addDate(StringBuilder buf, String prefix, String name, String description, long value) {
+        String when = value > 0 ? (new Date(value)).toString() : "Never";
+        add(buf, prefix, name, description + ' ' + when, value);
+    }
+
+    /** @since 0.8.5 */
+    public final static void addTime(StringBuilder buf, String prefix, String name, String description, long value) {
+        String when = DataHelper.formatDuration(value);
+        add(buf, prefix, name, description + ' ' + when, value);
+    }
+
     public final static void add(StringBuilder buf, String prefix, String name, String description, long value) {
         buf.append("# ").append(prefix).append(name).append(NL);
         buf.append("# ").append(description).append(NL);
@@ -48,4 +66,4 @@ class PersistenceHelper {
         }
         return 0;
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/stat/Rate.java b/core/java/src/net/i2p/stat/Rate.java
index fd0fae49f00d197c575c866c87cc21aca98bfdd2..8bf5bcf472aa40d56d703fb60ebce622021ab4f9 100644
--- a/core/java/src/net/i2p/stat/Rate.java
+++ b/core/java/src/net/i2p/stat/Rate.java
@@ -3,6 +3,7 @@ package net.i2p.stat;
 import java.io.IOException;
 import java.util.Properties;
 
+import net.i2p.data.DataHelper;
 import net.i2p.util.Log;
 
 /**
@@ -399,42 +400,41 @@ public class Rate {
     }
 
     public void store(String prefix, StringBuilder buf) throws IOException {
-        PersistenceHelper.add(buf, prefix, ".period", "Number of milliseconds in the period", _period);
-        PersistenceHelper.add(buf, prefix, ".creationDate",
-                              "When was this rate created?  (milliseconds since the epoch, GMT)", _creationDate);
-        PersistenceHelper.add(buf, prefix, ".lastCoalesceDate",
-                              "When did we last coalesce this rate?  (milliseconds since the epoch, GMT)",
+        PersistenceHelper.addTime(buf, prefix, ".period", "Length of the period:", _period);
+        PersistenceHelper.addDate(buf, prefix, ".creationDate",
+                              "When was this rate created?", _creationDate);
+        PersistenceHelper.addDate(buf, prefix, ".lastCoalesceDate",
+                              "When did we last coalesce this rate?",
                               _lastCoalesceDate);
-        PersistenceHelper.add(buf, prefix, ".currentDate",
-                              "When did this data get written?  (milliseconds since the epoch, GMT)", now());
+        PersistenceHelper.addDate(buf, prefix, ".currentDate",
+                              "When was this data written?", now());
         PersistenceHelper.add(buf, prefix, ".currentTotalValue",
                               "Total value of data points in the current (uncoalesced) period", _currentTotalValue);
-        PersistenceHelper
-                         .add(buf, prefix, ".currentEventCount",
+        PersistenceHelper.add(buf, prefix, ".currentEventCount",
                               "How many events have occurred in the current (uncoalesced) period?", _currentEventCount);
-        PersistenceHelper.add(buf, prefix, ".currentTotalEventTime",
-                              "How many milliseconds have the events in the current (uncoalesced) period consumed?",
+        PersistenceHelper.addTime(buf, prefix, ".currentTotalEventTime",
+                              "How much time have the events in the current (uncoalesced) period consumed?",
                               _currentTotalEventTime);
         PersistenceHelper.add(buf, prefix, ".lastTotalValue",
                               "Total value of data points in the most recent (coalesced) period", _lastTotalValue);
         PersistenceHelper.add(buf, prefix, ".lastEventCount",
                               "How many events have occurred in the most recent (coalesced) period?", _lastEventCount);
-        PersistenceHelper.add(buf, prefix, ".lastTotalEventTime",
-                              "How many milliseconds have the events in the most recent (coalesced) period consumed?",
+        PersistenceHelper.addTime(buf, prefix, ".lastTotalEventTime",
+                              "How much time have the events in the most recent (coalesced) period consumed?",
                               _lastTotalEventTime);
         PersistenceHelper.add(buf, prefix, ".extremeTotalValue",
                               "Total value of data points in the most extreme period", _extremeTotalValue);
         PersistenceHelper.add(buf, prefix, ".extremeEventCount",
                               "How many events have occurred in the most extreme period?", _extremeEventCount);
-        PersistenceHelper.add(buf, prefix, ".extremeTotalEventTime",
-                              "How many milliseconds have the events in the most extreme period consumed?",
+        PersistenceHelper.addTime(buf, prefix, ".extremeTotalEventTime",
+                              "How much time have the events in the most extreme period consumed?",
                               _extremeTotalEventTime);
         PersistenceHelper.add(buf, prefix, ".lifetimeTotalValue",
                               "Total value of data points since this stat was created", _lifetimeTotalValue);
         PersistenceHelper.add(buf, prefix, ".lifetimeEventCount",
                               "How many events have occurred since this stat was created?", _lifetimeEventCount);
-        PersistenceHelper.add(buf, prefix, ".lifetimeTotalEventTime",
-                              "How many milliseconds have the events since this stat was created consumed?",
+        PersistenceHelper.addTime(buf, prefix, ".lifetimeTotalEventTime",
+                              "How much total time was consumed by the events since this stat was created?",
                               _lifetimeTotalEventTime);
     }
 
@@ -471,48 +471,28 @@ public class Rate {
         coalesce();
     }
 
+    /**
+     * This is used in StatSummarizer and SummaryListener.
+     * We base it on the stat we are tracking, not the stored data.
+     */
     @Override
     public boolean equals(Object obj) {
-        if ((obj == null) || (obj.getClass() != Rate.class)) return false;
+        if ((obj == null) || !(obj instanceof Rate)) return false;
         if (obj == this) return true;
         Rate r = (Rate) obj;
         return _period == r.getPeriod() && _creationDate == r.getCreationDate() &&
-        //_lastCoalesceDate == r.getLastCoalesceDate() &&
-               _currentTotalValue == r.getCurrentTotalValue() && _currentEventCount == r.getCurrentEventCount()
-               && _currentTotalEventTime == r.getCurrentTotalEventTime() && _lastTotalValue == r.getLastTotalValue()
-               && _lastEventCount == r.getLastEventCount() && _lastTotalEventTime == r.getLastTotalEventTime()
-               && _extremeTotalValue == r.getExtremeTotalValue() && _extremeEventCount == r.getExtremeEventCount()
-               && _extremeTotalEventTime == r.getExtremeTotalEventTime()
-               && _lifetimeTotalValue == r.getLifetimeTotalValue() && _lifetimeEventCount == r.getLifetimeEventCount()
-               && _lifetimeTotalEventTime == r.getLifetimeTotalEventTime();
+               // do this the easy way to avoid NPEs.
+               // Alternative: compare name and group name (very carefully to avoid NPEs)
+               _stat == r._stat;
     }
 
     /**
      * It doesn't appear that Rates are ever stored in a Set or Map
      * (RateStat stores in an array) so let's make this easy.
-     * We can always make something faster if it's actually used.
      */
     @Override
     public int hashCode() {
-/*****
-        int hash = 5;
-        hash = 67 * hash + (int)(Double.doubleToLongBits(this._currentTotalValue) ^ (Double.doubleToLongBits(this._currentTotalValue) >>> 32));
-        hash = 67 * hash + (int)(this._currentEventCount ^ (this._currentEventCount >>> 32));
-        hash = 67 * hash + (int)(this._currentTotalEventTime ^ (this._currentTotalEventTime >>> 32));
-        hash = 67 * hash + (int)(Double.doubleToLongBits(this._lastTotalValue) ^ (Double.doubleToLongBits(this._lastTotalValue) >>> 32));
-        hash = 67 * hash + (int)(this._lastEventCount ^ (this._lastEventCount >>> 32));
-        hash = 67 * hash + (int)(this._lastTotalEventTime ^ (this._lastTotalEventTime >>> 32));
-        hash = 67 * hash + (int)(Double.doubleToLongBits(this._extremeTotalValue) ^ (Double.doubleToLongBits(this._extremeTotalValue) >>> 32));
-        hash = 67 * hash + (int)(this._extremeEventCount ^ (this._extremeEventCount >>> 32));
-        hash = 67 * hash + (int)(this._extremeTotalEventTime ^ (this._extremeTotalEventTime >>> 32));
-        hash = 67 * hash + (int)(Double.doubleToLongBits(this._lifetimeTotalValue) ^ (Double.doubleToLongBits(this._lifetimeTotalValue) >>> 32));
-        hash = 67 * hash + (int)(this._lifetimeEventCount ^ (this._lifetimeEventCount >>> 32));
-        hash = 67 * hash + (int)(this._lifetimeTotalEventTime ^ (this._lifetimeTotalEventTime >>> 32));
-        hash = 67 * hash + (int)(this._creationDate ^ (this._creationDate >>> 32));
-        hash = 67 * hash + (int)(this._period ^ (this._period >>> 32));
-        return hash;
-******/
-        return toString().hashCode();
+        return DataHelper.hashCode(_stat) ^ ((int)_period) ^ ((int) _creationDate);
     }
 
     @Override
diff --git a/core/java/src/net/i2p/stat/RateStat.java b/core/java/src/net/i2p/stat/RateStat.java
index 79ddec51980efdcf689f9f95b4cade1f25223d18..fded9b019f4665dd15dc15214f75d67bdf8c0618 100644
--- a/core/java/src/net/i2p/stat/RateStat.java
+++ b/core/java/src/net/i2p/stat/RateStat.java
@@ -108,7 +108,7 @@ public class RateStat {
 
     @Override
     public boolean equals(Object obj) {
-        if ((obj == null) || (obj.getClass() != RateStat.class)) return false;
+        if ((obj == null) || !(obj instanceof RateStat)) return false;
         RateStat rs = (RateStat) obj;
         if (DataHelper.eq(getGroupName(), rs.getGroupName()) && DataHelper.eq(getDescription(), rs.getDescription())
             && DataHelper.eq(getName(), rs.getName())) {
diff --git a/core/java/src/net/i2p/stat/StatManager.java b/core/java/src/net/i2p/stat/StatManager.java
index 531138d1a2b502df5d2b38948b820ce54ef5b627..868e18402a01ca5737846cb66e292d6841bdb290 100644
--- a/core/java/src/net/i2p/stat/StatManager.java
+++ b/core/java/src/net/i2p/stat/StatManager.java
@@ -54,7 +54,7 @@ public class StatManager {
         "jobQueue.jobLag,netDb.successTime,peer.failedLookupRate,router.fastPeers," +
         "prng.bufferFillTime,prng.bufferWaitTime,router.memoryUsed," +
         "transport.receiveMessageSize,transport.sendMessageSize,transport.sendProcessingTime," +
-        "tunnel.acceptLoad,tunnel.buildRequestTime,tunnel.rejectOverloaded,tunnel.rejectTimeout" +
+        "tunnel.acceptLoad,tunnel.buildRequestTime,tunnel.rejectOverloaded,tunnel.rejectTimeout," +
         "tunnel.buildClientExpire,tunnel.buildClientReject,tunnel.buildClientSuccess," +
         "tunnel.buildExploratoryExpire,tunnel.buildExploratoryReject,tunnel.buildExploratorySuccess," +
         "tunnel.buildRatio.*,tunnel.corruptMessage,tunnel.dropLoad*," +
diff --git a/core/java/src/net/i2p/time/Timestamper.java b/core/java/src/net/i2p/time/Timestamper.java
index a84882215c275ff3514e96e99b7a251671422827..2c798bab6b2bb75b9671b3951d6b17118fe81246 100644
--- a/core/java/src/net/i2p/time/Timestamper.java
+++ b/core/java/src/net/i2p/time/Timestamper.java
@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 import java.util.StringTokenizer;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import net.i2p.I2PAppContext;
 import net.i2p.util.I2PThread;
@@ -56,7 +57,7 @@ public class Timestamper implements Runnable {
     public Timestamper(I2PAppContext ctx, UpdateListener lsnr, boolean daemon) {
         // moved here to prevent problems with synchronized statements.
         _servers = new ArrayList(3);
-        _listeners = new ArrayList(1);
+        _listeners = new CopyOnWriteArrayList();
         // Don't bother starting a thread if we are disabled.
         // This means we no longer check every 5 minutes to see if we got enabled,
         // so the property must be set at startup.
@@ -92,24 +93,16 @@ public class Timestamper implements Runnable {
     public boolean getIsDisabled() { return _disabled; }
     
     public void addListener(UpdateListener lsnr) {
-        synchronized (_listeners) {
             _listeners.add(lsnr);
-        }
     }
     public void removeListener(UpdateListener lsnr) {
-        synchronized (_listeners) {
             _listeners.remove(lsnr);
-        }
     }
     public int getListenerCount() {
-        synchronized (_listeners) {
             return _listeners.size();
-        }
     }
     public UpdateListener getListener(int index) {
-        synchronized (_listeners) {
             return _listeners.get(index);
-        }
     }
     
     private void startTimestamper() {
@@ -257,11 +250,8 @@ public class Timestamper implements Runnable {
      */
     private void stampTime(long now, int stratum) {
         long before = _context.clock().now();
-        synchronized (_listeners) {
-            for (int i = 0; i < _listeners.size(); i++) {
-                UpdateListener lsnr = _listeners.get(i);
-                lsnr.setNow(now, stratum);
-            }
+        for (UpdateListener lsnr : _listeners) {
+             lsnr.setNow(now, stratum);
         }
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Stamped the time as " + now + " (delta=" + (now-before) + ")");
diff --git a/core/java/src/net/i2p/util/ByteCache.java b/core/java/src/net/i2p/util/ByteCache.java
index 3ef72ca10c3ca55d352223eee1868403269e0730..2d3eb482db5b9f64a259e132fca70d1aeb53ae6e 100644
--- a/core/java/src/net/i2p/util/ByteCache.java
+++ b/core/java/src/net/i2p/util/ByteCache.java
@@ -69,6 +69,8 @@ public final class ByteCache {
     private static final int MAX_CACHE;
     static {
         long maxMemory = Runtime.getRuntime().maxMemory();
+        if (maxMemory == Long.MAX_VALUE)
+            maxMemory = 96*1024*1024l;
         MAX_CACHE = (int) Math.min(4*1024*1024l, Math.max(128*1024l, maxMemory / 128));
     }
 
diff --git a/core/java/src/net/i2p/util/Clock.java b/core/java/src/net/i2p/util/Clock.java
index 4fc5eaff075ba2e3d475fb9583f64117425d5ad2..ee43af44cc32248ab61c706e8c4de95addb6b6d8 100644
--- a/core/java/src/net/i2p/util/Clock.java
+++ b/core/java/src/net/i2p/util/Clock.java
@@ -1,8 +1,8 @@
 package net.i2p.util;
 
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
 
 import net.i2p.I2PAppContext;
 import net.i2p.time.Timestamper;
@@ -19,19 +19,19 @@ import net.i2p.time.Timestamper;
  *
  */
 public class Clock implements Timestamper.UpdateListener {
-    protected I2PAppContext _context;
-    private Timestamper _timestamper;
-    protected long _startedOn;
+    protected final I2PAppContext _context;
+    private final Timestamper _timestamper;
+    protected final long _startedOn;
     protected boolean _statCreated;
+    protected volatile long _offset;
+    protected boolean _alreadyChanged;
+    private final Set _listeners;
     
     public Clock(I2PAppContext context) {
         _context = context;
-        _offset = 0;
-        _alreadyChanged = false;
-        _listeners = new HashSet(1);
+        _listeners = new CopyOnWriteArraySet();
         _timestamper = new Timestamper(context, this);
         _startedOn = System.currentTimeMillis();
-        _statCreated = false;
     }
     public static Clock getInstance() {
         return I2PAppContext.getGlobalContext().clock();
@@ -41,10 +41,6 @@ public class Clock implements Timestamper.UpdateListener {
     
     /** we fetch it on demand to avoid circular dependencies (logging uses the clock) */
     protected Log getLog() { return _context.logManager().getLog(Clock.class); }
-    
-    protected volatile long _offset;
-    protected boolean _alreadyChanged;
-    private final Set _listeners;
 
     /** if the clock is skewed by 3+ days, fuck 'em */
     public final static long MAX_OFFSET = 3 * 24 * 60 * 60 * 1000;
@@ -53,14 +49,22 @@ public class Clock implements Timestamper.UpdateListener {
     /** if the clock skewed changes by less than this, ignore the update (so we don't slide all over the place) */
     public final static long MIN_OFFSET_CHANGE = 5 * 1000;
 
+    /**
+     * Specify how far away from the "correct" time the computer is - a positive
+     * value means that the system time is slow, while a negative value means the system time is fast.
+     *
+     * @param offsetMs the delta from System.currentTimeMillis() (NOT the delta from now())
+     */
     public void setOffset(long offsetMs) {
         setOffset(offsetMs, false);        
     }
     
     /**
      * Specify how far away from the "correct" time the computer is - a positive
-     * value means that we are slow, while a negative value means we are fast.
+     * value means that the system time is slow, while a negative value means the system time is fast.
      * Warning - overridden in RouterClock
+     *
+     * @param offsetMs the delta from System.currentTimeMillis() (NOT the delta from now())
      */
     public void setOffset(long offsetMs, boolean force) {
         if (false) return;
@@ -105,6 +109,9 @@ public class Clock implements Timestamper.UpdateListener {
         fireOffsetChanged(delta);
     }
 
+    /*
+     * @return the current delta from System.currentTimeMillis() in milliseconds
+     */
     public long getOffset() {
         return _offset;
     }
@@ -136,24 +143,18 @@ public class Clock implements Timestamper.UpdateListener {
     }
 
     public void addUpdateListener(ClockUpdateListener lsnr) {
-        synchronized (_listeners) {
             _listeners.add(lsnr);
-        }
     }
 
     public void removeUpdateListener(ClockUpdateListener lsnr) {
-        synchronized (_listeners) {
             _listeners.remove(lsnr);
-        }
     }
 
     protected void fireOffsetChanged(long delta) {
-        synchronized (_listeners) {
             for (Iterator iter = _listeners.iterator(); iter.hasNext();) {
                 ClockUpdateListener lsnr = (ClockUpdateListener) iter.next();
                 lsnr.offsetChanged(delta);
             }
-        }
     }
 
     public static interface ClockUpdateListener {
diff --git a/core/java/src/net/i2p/util/ConcurrentHashSet.java b/core/java/src/net/i2p/util/ConcurrentHashSet.java
index 3610c54b939f3527648726d0e91fc0e84c057b49..6c6d8bfb675e1f63bc8b3aefeb0d9079b5f90806 100644
--- a/core/java/src/net/i2p/util/ConcurrentHashSet.java
+++ b/core/java/src/net/i2p/util/ConcurrentHashSet.java
@@ -14,7 +14,7 @@ import java.util.concurrent.ConcurrentHashMap;
  */
 public class ConcurrentHashSet<E> extends AbstractSet<E> implements Set<E> {
     private static final Object DUMMY = new Object();
-    private Map<E, Object> _map;
+    private final Map<E, Object> _map;
 
     public ConcurrentHashSet() {
         _map = new ConcurrentHashMap();
diff --git a/core/java/src/net/i2p/util/DecayingBloomFilter.java b/core/java/src/net/i2p/util/DecayingBloomFilter.java
index 4179edd389625664757a36b3149c863b2928dffe..ff564b2656b659decc000a2a43d03732957d9d3f 100644
--- a/core/java/src/net/i2p/util/DecayingBloomFilter.java
+++ b/core/java/src/net/i2p/util/DecayingBloomFilter.java
@@ -20,28 +20,34 @@ import org.xlattice.crypto.filters.BloomSHA1;
  * Further analysis and tweaking for the tunnel IVV may be required.
  */
 public class DecayingBloomFilter {
-    private I2PAppContext _context;
-    private Log _log;
+    protected final I2PAppContext _context;
+    protected final Log _log;
     private BloomSHA1 _current;
     private BloomSHA1 _previous;
-    private int _durationMs;
-    private int _entryBytes;
+    protected final int _durationMs;
+    protected final int _entryBytes;
     private byte _extenders[][];
     private byte _extended[];
     private byte _longToEntry[];
     private long _longToEntryMask;
     protected long _currentDuplicates;
-    private boolean _keepDecaying;
-    private DecayEvent _decayEvent;
+    protected volatile boolean _keepDecaying;
+    protected SimpleTimer.TimedEvent _decayEvent;
     /** just for logging */
-    private String _name;
+    protected final String _name;
     
     private static final int DEFAULT_M = 23;
     private static final int DEFAULT_K = 11;
     private static final boolean ALWAYS_MISS = false;
    
-    /** noop for DHS */
-    public DecayingBloomFilter() {}
+    /** only for extension by DHS */
+    protected DecayingBloomFilter(int durationMs, int entryBytes, String name, I2PAppContext context) {
+        _context = context;
+        _log = context.logManager().getLog(getClass());
+        _entryBytes = entryBytes;
+        _name = name;
+        _durationMs = durationMs;
+    }
 
     /**
      * Create a bloom filter that will decay its entries over time.  
@@ -87,7 +93,6 @@ public class DecayingBloomFilter {
             _longToEntry = new byte[_entryBytes];
             _longToEntryMask = (1l << (_entryBytes * 8l)) -1;
         }
-        _currentDuplicates = 0;
         _decayEvent = new DecayEvent();
         _keepDecaying = true;
         SimpleTimer.getInstance().addEvent(_decayEvent, _durationMs);
@@ -105,11 +110,13 @@ public class DecayingBloomFilter {
     }
     
     public long getCurrentDuplicateCount() { return _currentDuplicates; }
+
     public int getInsertedCount() { 
         synchronized (this) {
             return _current.size() + _previous.size(); 
         }
     }
+
     public double getFalsePositiveRate() { 
         synchronized (this) {
             return _current.falsePositives(); 
@@ -117,12 +124,15 @@ public class DecayingBloomFilter {
     }
     
     /** 
-     * return true if the entry added is a duplicate
-     *
+     * @return true if the entry added is a duplicate
      */
     public boolean add(byte entry[]) {
         return add(entry, 0, entry.length);
     }
+
+    /** 
+     * @return true if the entry added is a duplicate
+     */
     public boolean add(byte entry[], int off, int len) {
         if (ALWAYS_MISS) return false;
         if (entry == null) 
@@ -131,55 +141,52 @@ public class DecayingBloomFilter {
             throw new IllegalArgumentException("Bad entry [" + len + ", expected " 
                                                + _entryBytes + "]");
         synchronized (this) {
-            return locked_add(entry, off, len);
+            return locked_add(entry, off, len, true);
         }
     }
     
     /** 
-     * return true if the entry added is a duplicate.  the number of low order 
+     * @return true if the entry added is a duplicate.  the number of low order 
      * bits used is determined by the entryBytes parameter used on creation of the
      * filter.
      *
      */
     public boolean add(long entry) {
         if (ALWAYS_MISS) return false;
+        if (_entryBytes <= 7)
+            entry = ((entry ^ _longToEntryMask) & ((1 << 31)-1)) | (entry ^ _longToEntryMask);
+            //entry &= _longToEntryMask; 
+        if (entry < 0) {
+            DataHelper.toLong(_longToEntry, 0, _entryBytes, 0-entry);
+            _longToEntry[0] |= (1 << 7);
+        } else {
+            DataHelper.toLong(_longToEntry, 0, _entryBytes, entry);
+        }
         synchronized (this) {
-            if (_entryBytes <= 7)
-                entry = ((entry ^ _longToEntryMask) & ((1 << 31)-1)) | (entry ^ _longToEntryMask);
-                //entry &= _longToEntryMask; 
-            if (entry < 0) {
-                DataHelper.toLong(_longToEntry, 0, _entryBytes, 0-entry);
-                _longToEntry[0] |= (1 << 7);
-            } else {
-                DataHelper.toLong(_longToEntry, 0, _entryBytes, entry);
-            }
-            return locked_add(_longToEntry, 0, _longToEntry.length);
+            return locked_add(_longToEntry, 0, _longToEntry.length, true);
         }
     }
     
     /** 
-     * return true if the entry is already known.  this does NOT add the
+     * @return true if the entry is already known.  this does NOT add the
      * entry however.
      *
      */
     public boolean isKnown(long entry) {
         if (ALWAYS_MISS) return false;
+        if (_entryBytes <= 7)
+            entry = ((entry ^ _longToEntryMask) & ((1 << 31)-1)) | (entry ^ _longToEntryMask); 
+        if (entry < 0) {
+            DataHelper.toLong(_longToEntry, 0, _entryBytes, 0-entry);
+            _longToEntry[0] |= (1 << 7);
+        } else {
+            DataHelper.toLong(_longToEntry, 0, _entryBytes, entry);
+        }
         synchronized (this) {
-            if (_entryBytes <= 7)
-                entry = ((entry ^ _longToEntryMask) & ((1 << 31)-1)) | (entry ^ _longToEntryMask); 
-            if (entry < 0) {
-                DataHelper.toLong(_longToEntry, 0, _entryBytes, 0-entry);
-                _longToEntry[0] |= (1 << 7);
-            } else {
-                DataHelper.toLong(_longToEntry, 0, _entryBytes, entry);
-            }
             return locked_add(_longToEntry, 0, _longToEntry.length, false);
         }
     }
     
-    private boolean locked_add(byte entry[], int offset, int len) {
-        return locked_add(entry, offset, len, true);
-    }
     private boolean locked_add(byte entry[], int offset, int len, boolean addIfNew) {
         if (_extended != null) {
             // extend the entry to 32 bytes
@@ -195,7 +202,6 @@ public class DecayingBloomFilter {
             } else {
                 if (addIfNew) {
                     _current.locked_insert(_extended);
-                    _previous.locked_insert(_extended);
                 }
                 return false;
             }
@@ -208,7 +214,6 @@ public class DecayingBloomFilter {
             } else {
                 if (addIfNew) {
                     _current.locked_insert(entry, offset, len);
-                    _previous.locked_insert(entry, offset, len);
                 }
                 return false;
             }
diff --git a/core/java/src/net/i2p/util/DecayingHashSet.java b/core/java/src/net/i2p/util/DecayingHashSet.java
index a72b6b9e2e9a3fc01a92492514602d17d59b04cb..f090cf727b61989ca9bec1d4f205ba48767fba17 100644
--- a/core/java/src/net/i2p/util/DecayingHashSet.java
+++ b/core/java/src/net/i2p/util/DecayingHashSet.java
@@ -17,12 +17,15 @@ import net.i2p.data.DataHelper;
  *
  *      ./router/java/src/net/i2p/router/tunnel/BuildMessageProcessor.java:
  *           32 bytes, peak 10 entries in 1m
+ *           (320 peak entries seen on fast router)
  *
  *      ./router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java:
  *           4 bytes, peak 150 entries in 10s
+ *           (1600 peak entries seen on fast router)
  *
  *      ./router/java/src/net/i2p/router/MessageValidator.java:
  *           8 bytes, peak 1K entries in 2m
+ *           (36K peak entries seen on fast router)
  *
  *      ./router/java/src/net/i2p/router/tunnel/BloomFilterIVValidator.java:
  *           16 bytes, peak 15K entries in 10m
@@ -57,19 +60,10 @@ import net.i2p.data.DataHelper;
  * @author zzz
  */
 public class DecayingHashSet extends DecayingBloomFilter {
-    private final I2PAppContext _context;
-    private final Log _log;
     private ConcurrentHashSet<ArrayWrapper> _current;
     private ConcurrentHashSet<ArrayWrapper> _previous;
-    private int _durationMs;
-    private int _entryBytes;
-    private volatile boolean _keepDecaying;
-    private final DecayEvent _decayEvent;
-    /** just for logging */
-    private final String _name;
     /** synchronize against this lock when switching double buffers */
     private final ReentrantReadWriteLock _reorganizeLock = new ReentrantReadWriteLock(true);
-    
    
     /**
      * Create a double-buffered hash set that will decay its entries over time.  
@@ -83,16 +77,11 @@ public class DecayingHashSet extends DecayingBloomFilter {
 
     /** @param name just for logging / debugging / stats */
     public DecayingHashSet(I2PAppContext context, int durationMs, int entryBytes, String name) {
+        super(durationMs, entryBytes, name, context);
         if (entryBytes <= 0 || entryBytes > 32)
             throw new IllegalArgumentException("Bad size");
-        _context = context;
-        _log = context.logManager().getLog(DecayingHashSet.class);
-        _entryBytes = entryBytes;
-        _name = name;
         _current = new ConcurrentHashSet(128);
         _previous = new ConcurrentHashSet(128);
-        _durationMs = durationMs;
-        _currentDuplicates = 0;
         _decayEvent = new DecayEvent();
         _keepDecaying = true;
         SimpleScheduler.getInstance().addEvent(_decayEvent, _durationMs);
@@ -111,6 +100,7 @@ public class DecayingHashSet extends DecayingBloomFilter {
     public int getInsertedCount() { 
         return _current.size() + _previous.size(); 
     }
+
     /** pointless, only used for logging elsewhere */
     @Override
     public double getFalsePositiveRate() { 
@@ -121,7 +111,6 @@ public class DecayingHashSet extends DecayingBloomFilter {
     
     /** 
      * @return true if the entry added is a duplicate
-     *
      */
     @Override
     public boolean add(byte entry[], int off, int len) {
@@ -130,9 +119,10 @@ public class DecayingHashSet extends DecayingBloomFilter {
         if (len != _entryBytes) 
             throw new IllegalArgumentException("Bad entry [" + len + ", expected " 
                                                + _entryBytes + "]");
+        ArrayWrapper w = new ArrayWrapper(entry, off, len);
         getReadLock();
         try {
-            return locked_add(entry, off, len, true);
+            return locked_add(w, true);
         } finally { releaseReadLock(); }
     }
 
@@ -158,35 +148,30 @@ public class DecayingHashSet extends DecayingBloomFilter {
     }
 
     private boolean add(long entry, boolean addIfNew) {
-        int len = Math.min(8, _entryBytes);
-        byte[] b = toLong(len, entry);
+        ArrayWrapper w = new ArrayWrapper(entry);
         getReadLock();
         try {
-            return locked_add(b, 0, len, addIfNew);
+            return locked_add(w, addIfNew);
         } finally { releaseReadLock(); }
     }
     
-    /** from DataHelper, except negative values ok */
-    private static byte[] toLong(int numBytes, long value) {
-        byte target[] = new byte[numBytes];
-        for (int i = 0; i < numBytes; i++)
-            target[numBytes-i-1] = (byte)(value >>> (i*8));
-        return target;
-    }
-    
-    /** so many questions... */
-    private boolean locked_add(byte entry[], int offset, int len, boolean addIfNew) {
-        ArrayWrapper w = new ArrayWrapper(entry, offset, len);
-        boolean seen = _current.contains(w);
-        seen = seen || _previous.contains(w);
+    /**
+     *  @param addIfNew if true, add the element to current if it is not already there;
+     *                  if false, only check
+     *  @return if the element is in either the current or previous set
+     */
+    private boolean locked_add(ArrayWrapper w, boolean addIfNew) {
+        boolean seen;
+        // only access _current once. This adds to _current even if seen in _previous.
+        if (addIfNew)
+            seen = !_current.add(w);
+        else
+            seen = _current.contains(w);
+        if (!seen)
+            seen = _previous.contains(w);
         if (seen) {
-            // why increment if addIfNew == false?
-            // why not add to current if only in previous?
+            // why increment if addIfNew == false? Only used for stats...
             _currentDuplicates++;
-        } else if (addIfNew) {
-            _current.add(w);
-            // why add to previous?
-            _previous.add(w);
         }
         return seen;
     }
@@ -270,14 +255,22 @@ public class DecayingHashSet extends DecayingBloomFilter {
      *  the maximum entropy given the length of the data.
      */
     private static class ArrayWrapper {
-        private long _longhashcode;
+        private final long _longhashcode;
+
         public ArrayWrapper(byte[] b, int offset, int len) {
             int idx = offset;
             int shift = Math.min(8, 64 / len);
+            long lhc = 0;
             for (int i = 0; i < len; i++) {
                 // xor better than + in tests
-                _longhashcode ^= (((long) b[idx++]) << (i * shift));
+                lhc ^= (((long) b[idx++]) << (i * shift));
             }
+            _longhashcode = lhc;
+        }
+
+        /** faster version for when storing <= 8 bytes */
+        public ArrayWrapper(long b) {
+            _longhashcode = b;
         }
 
         public int hashCode() {
diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java
index f055ce98cbbeb4594cc1a53d5de10bd4bf97a0a5..955ae8238dec3df9e54e2212fb2d87cfcaa0e241 100644
--- a/core/java/src/net/i2p/util/EepGet.java
+++ b/core/java/src/net/i2p/util/EepGet.java
@@ -28,21 +28,21 @@ import net.i2p.util.InternalSocket;
  * Bug: a malformed url http://example.i2p (no trailing '/') fails cryptically
  */
 public class EepGet {
-    protected I2PAppContext _context;
-    protected Log _log;
-    protected boolean _shouldProxy;
-    private String _proxyHost;
-    private int _proxyPort;
-    protected int _numRetries;
-    private long _minSize; // minimum and maximum acceptable response size, -1 signifies unlimited,
-    private long _maxSize; // applied both against whole responses and chunks
-    protected String _outputFile;
-    protected OutputStream _outputStream;
+    protected final I2PAppContext _context;
+    protected final Log _log;
+    protected final boolean _shouldProxy;
+    private final String _proxyHost;
+    private final int _proxyPort;
+    protected final int _numRetries;
+    private final long _minSize; // minimum and maximum acceptable response size, -1 signifies unlimited,
+    private final long _maxSize; // applied both against whole responses and chunks
+    protected final String _outputFile;
+    protected final OutputStream _outputStream;
     /** url we were asked to fetch */
-    protected String _url;
+    protected final String _url;
     /** the URL we actually fetch from (may differ from the _url in case of redirect) */
     protected String _actualURL;
-    private String _postData;
+    private final String _postData;
     private boolean _allowCaching;
     protected final List<StatusListener> _listeners;
     
@@ -106,7 +106,7 @@ public class EepGet {
                   String outputFile, OutputStream outputStream, String url, boolean allowCaching,
                   String etag, String lastModified, String postData) {
         _context = ctx;
-        _log = ctx.logManager().getLog(EepGet.class);
+        _log = ctx.logManager().getLog(getClass());
         _shouldProxy = (proxyHost != null) && (proxyHost.length() > 0) && (proxyPort > 0) && shouldProxy;
         _proxyHost = proxyHost;
         _proxyPort = proxyPort;
@@ -118,13 +118,7 @@ public class EepGet {
         _url = url;
         _actualURL = url;
         _postData = postData;
-        _alreadyTransferred = 0;
-        _bytesTransferred = 0;
         _bytesRemaining = -1;
-        _currentAttempt = 0;
-        _transferFailed = false;
-        _headersRead = false;
-        _aborted = false;
         _fetchHeaderTimeout = CONNECT_TIMEOUT;
         _listeners = new ArrayList(1);
         _etag = etag;
@@ -255,9 +249,9 @@ public class EepGet {
         public void attempting(String url);
     }
     protected class CLIStatusListener implements StatusListener {
-        private int _markSize;
-        private int _lineSize;
-        private long _startedOn;
+        private final int _markSize;
+        private final int _lineSize;
+        private final long _startedOn;
         private long _written;
         private long _previousWritten;
         private long _discarded;
@@ -271,9 +265,6 @@ public class EepGet {
         public CLIStatusListener(int markSize, int lineSize) { 
             _markSize = markSize;
             _lineSize = lineSize;
-            _written = 0;
-            _previousWritten = 0;
-            _discarded = 0;
             _lastComplete = _context.clock().now();
             _startedOn = _lastComplete;
             _firstTime = true;
@@ -430,29 +421,33 @@ public class EepGet {
             _log.debug("Fetching (proxied? " + _shouldProxy + ") url=" + _actualURL);
         while (_keepFetching) {
             SocketTimeout timeout = null;
-            if (_fetchHeaderTimeout > 0)
+            if (_fetchHeaderTimeout > 0) {
                 timeout = new SocketTimeout(_fetchHeaderTimeout);
-            final SocketTimeout stimeout = timeout; // ugly - why not use sotimeout?
-            timeout.setTimeoutCommand(new Runnable() {
-                public void run() {
-                    if (_log.shouldLog(Log.DEBUG))
-                        _log.debug("timeout reached on " + _url + ": " + stimeout);
-                    _aborted = true;
-                }
-            });
-            timeout.setTotalTimeoutPeriod(_fetchEndTime);
+                final SocketTimeout stimeout = timeout; // ugly - why not use sotimeout?
+                timeout.setTimeoutCommand(new Runnable() {
+                    public void run() {
+                        if (_log.shouldLog(Log.DEBUG))
+                            _log.debug("timeout reached on " + _url + ": " + stimeout);
+                        _aborted = true;
+                    }
+                });
+                timeout.setTotalTimeoutPeriod(_fetchEndTime);
+            }
             try {
                 for (int i = 0; i < _listeners.size(); i++) 
                     _listeners.get(i).attempting(_url);
                 sendRequest(timeout);
-                timeout.resetTimer();
+                if (timeout != null)
+                    timeout.resetTimer();
                 doFetch(timeout);
-                timeout.cancel();
+                if (timeout != null)
+                    timeout.cancel();
                 if (!_transferFailed)
                     return true;
                 break;
             } catch (IOException ioe) {
-                timeout.cancel();
+                if (timeout != null)
+                    timeout.cancel();
                 for (int i = 0; i < _listeners.size(); i++) 
                     _listeners.get(i).attemptFailed(_url, _bytesTransferred, _bytesRemaining, _currentAttempt, _numRetries, ioe);
                 if (_log.shouldLog(Log.WARN))
@@ -492,7 +487,10 @@ public class EepGet {
         return false;
     }
 
-    /** single fetch */
+    /**
+     *  single fetch
+     *  @param timeout may be null
+     */
     protected void doFetch(SocketTimeout timeout) throws IOException {
         _headersRead = false;
         _aborted = false;
@@ -504,11 +502,13 @@ public class EepGet {
         if (_aborted)
             throw new IOException("Timed out reading the HTTP headers");
         
-        timeout.resetTimer();
-        if (_fetchInactivityTimeout > 0)
-            timeout.setInactivityTimeout(_fetchInactivityTimeout);
-        else
-            timeout.setInactivityTimeout(INACTIVITY_TIMEOUT);
+        if (timeout != null) {
+            timeout.resetTimer();
+            if (_fetchInactivityTimeout > 0)
+                timeout.setInactivityTimeout(_fetchInactivityTimeout);
+            else
+                timeout.setInactivityTimeout(INACTIVITY_TIMEOUT);
+        }
         
         if (_redirectLocation != null) {
             //try {
@@ -571,7 +571,8 @@ public class EepGet {
             int read = _proxyIn.read(buf, 0, toRead);
             if (read == -1)
                 break;
-            timeout.resetTimer();
+            if (timeout != null)
+                timeout.resetTimer();
             _out.write(buf, 0, read);
             _bytesTransferred += read;
             if ((_maxSize > -1) && (_alreadyTransferred + read > _maxSize)) // could transfer a little over maxSize
@@ -597,7 +598,8 @@ public class EepGet {
                     read++;
                 }
             }
-            timeout.resetTimer();
+            if (timeout != null)
+                timeout.resetTimer();
             if (_bytesRemaining >= read) // else chunked?
                 _bytesRemaining -= read;
             if (read > 0) {
@@ -622,7 +624,8 @@ public class EepGet {
         if (_aborted)
             throw new IOException("Timed out reading the HTTP data");
         
-        timeout.cancel();
+        if (timeout != null)
+            timeout.cancel();
         
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Done transferring " + _bytesTransferred + " (ok? " + !_transferFailed + ")");
@@ -867,6 +870,9 @@ public class EepGet {
     private static final byte NL = '\n';
     private static boolean isNL(byte b) { return (b == NL); }
 
+    /**
+     *  @param timeout may be null
+     */
     protected void sendRequest(SocketTimeout timeout) throws IOException {
         if (_outputStream != null) {
             // We are reading into a stream supplied by a caller,
@@ -907,7 +913,8 @@ public class EepGet {
         _proxyIn = _proxy.getInputStream();
         _proxyOut = _proxy.getOutputStream();
         
-        timeout.setSocket(_proxy);
+        if (timeout != null)
+            timeout.setSocket(_proxy);
         
         _proxyOut.write(DataHelper.getUTF8(req));
         _proxyOut.flush();
@@ -945,8 +952,6 @@ public class EepGet {
             buf.append(_alreadyTransferred);
             buf.append("-\r\n");
         }
-        if (_shouldProxy)
-            buf.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n");
         if (!_allowCaching) {
             buf.append("Cache-control: no-cache\r\n" +
                        "Pragma: no-cache\r\n");
diff --git a/core/java/src/net/i2p/util/EepHead.java b/core/java/src/net/i2p/util/EepHead.java
index 5c0d9c8fc2e6337428da9bfdc4a312b4240f6e29..bb8304a3963a04b0d739c28f6efcd9ea5a7adfb5 100644
--- a/core/java/src/net/i2p/util/EepHead.java
+++ b/core/java/src/net/i2p/util/EepHead.java
@@ -202,8 +202,6 @@ public class EepHead extends EepGet {
         buf.append("HEAD ").append(_actualURL).append(" HTTP/1.1\r\n");
         buf.append("Host: ").append(url.getHost()).append("\r\n");
         buf.append("Accept-Encoding: \r\n");
-        if (_shouldProxy)
-            buf.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n");
         // This will be replaced if we are going through I2PTunnelHTTPClient
         buf.append("User-Agent: " + USER_AGENT + "\r\n");
         buf.append("Connection: close\r\n\r\n");
diff --git a/core/java/src/net/i2p/util/EepPost.java b/core/java/src/net/i2p/util/EepPost.java
index 615361e2045ef3ed4742ec620a7fd68c8a029a1a..2e7836f62645a3576155604fcb4be902e389d566 100644
--- a/core/java/src/net/i2p/util/EepPost.java
+++ b/core/java/src/net/i2p/util/EepPost.java
@@ -31,6 +31,7 @@ public class EepPost {
         _log = ctx.logManager().getLog(EepPost.class);
     }
     
+/*****
     public static void main(String args[]) {
         EepPost e = new EepPost();
         Map fields = new HashMap();
@@ -47,6 +48,8 @@ public class EepPost {
         //e.postFiles("http://localhost/cgi-bin/read.pl", null, -1, fields, null);
         //e.postFiles("http://localhost:2001/import.jsp", null, -1, fields, null);
     }
+*****/
+
     /**
      * Submit an HTTP POST to the given URL (using the proxy if specified),
      * uploading the given fields.  If the field's value is a File object, then
@@ -117,7 +120,7 @@ public class EepPost {
                     }
                 }
                 out.close();
-            } catch (Exception e) {
+            } catch (IOException e) {
                 e.printStackTrace();
             } finally {
                 if (s != null) try { s.close(); } catch (IOException ioe) {}
diff --git a/core/java/src/net/i2p/util/Executor.java b/core/java/src/net/i2p/util/Executor.java
index 8092d7ac447ee98f152306101d59e925fb18baf6..3c81d46f157f581455d30c4ea19f52b2b6232e19 100644
--- a/core/java/src/net/i2p/util/Executor.java
+++ b/core/java/src/net/i2p/util/Executor.java
@@ -5,10 +5,10 @@ import java.util.List;
 import net.i2p.I2PAppContext;
 
 class Executor implements Runnable {
-    private I2PAppContext _context;
+    private final I2PAppContext _context;
     private Log _log;
     private final List _readyEvents;
-    private SimpleStore runn;
+    private final SimpleStore runn;
 
     public Executor(I2PAppContext ctx, Log log, List events, SimpleStore x) {
         _context = ctx;
@@ -31,9 +31,10 @@ class Executor implements Runnable {
                 try {
                     evt.timeReached();
                 } catch (Throwable t) {
-                    log("wtf, event borked: " + evt, t);
+                    log("Executing task " + evt + " exited unexpectedly, please report", t);
                 }
                 long time = _context.clock().now() - before;
+                // FIXME _log won't be non-null unless we already had a CRIT
                 if ( (time > 1000) && (_log != null) && (_log.shouldLog(Log.WARN)) )
                     _log.warn("wtf, event execution took " + time + ": " + evt);
             }
diff --git a/core/java/src/net/i2p/util/FileUtil.java b/core/java/src/net/i2p/util/FileUtil.java
index b5bb48a4353fef584bc6088f0408df34d97f5568..de9d354aa42b71c20987a36f28dc69e6d7721455 100644
--- a/core/java/src/net/i2p/util/FileUtil.java
+++ b/core/java/src/net/i2p/util/FileUtil.java
@@ -122,24 +122,24 @@ public class FileUtil {
                         }
                     }
                 } else {
+                    InputStream in = null;
+                    FileOutputStream fos = null;
+                    JarOutputStream jos = null;
                     try {
-                        InputStream in = zip.getInputStream(entry);
+                        in = zip.getInputStream(entry);
                         if (entry.getName().endsWith(".jar.pack") || entry.getName().endsWith(".war.pack")) {
                             target = new File(targetDir, entry.getName().substring(0, entry.getName().length() - ".pack".length()));
-                            JarOutputStream fos = new JarOutputStream(new FileOutputStream(target));
-                            unpack(in, fos);
-                            fos.close();
+                            jos = new JarOutputStream(new FileOutputStream(target));
+                            unpack(in, jos);
                             System.err.println("INFO: File [" + entry.getName() + "] extracted and unpacked");
                         } else {
-                            FileOutputStream fos = new FileOutputStream(target);
+                            fos = new FileOutputStream(target);
                             int read = 0;
                             while ( (read = in.read(buf)) != -1) {
                                 fos.write(buf, 0, read);
                             }
-                            fos.close();
                             System.err.println("INFO: File [" + entry.getName() + "] extracted");
                         }
-                        in.close();
                     } catch (IOException ioe) {
                         System.err.println("ERROR: Error extracting the zip entry (" + entry.getName() + ')');
                         if (ioe.getMessage() != null && ioe.getMessage().indexOf("CAFED00D") >= 0)
@@ -151,6 +151,10 @@ public class FileUtil {
                         System.err.println("ERROR: Error unpacking the zip entry (" + entry.getName() +
                                            "), your JVM does not support unpack200");
                         return false;
+                    } finally {
+                        try { if (in != null) in.close(); } catch (IOException ioe) {}
+                        try { if (fos != null) fos.close(); } catch (IOException ioe) {}
+                        try { if (jos != null) jos.close(); } catch (IOException ioe) {}
                     }
                 }
             }
@@ -353,6 +357,9 @@ public class FileUtil {
      * Dump the contents of the given path (relative to the root) to the output 
      * stream.  The path must not go above the root, either - if it does, it will
      * throw a FileNotFoundException
+     *
+     * Closes the OutputStream out on successful completion
+     * but leaves it open when throwing IOE.
      */
     public static void readFile(String path, String root, OutputStream out) throws IOException {
         File rootDir = new File(root);
@@ -372,10 +379,10 @@ public class FileUtil {
             int read = 0;
             while ( (read = in.read(buf)) != -1) 
                 out.write(buf, 0, read);
-            out.close();
+            try { out.close(); } catch (IOException ioe) {}
         } finally {
             if (in != null) 
-                in.close();
+                try { in.close(); } catch (IOException ioe) {}
         }
     }
 
@@ -401,21 +408,24 @@ public class FileUtil {
         if (dst.exists() && !overwriteExisting) return false;
         
         byte buf[] = new byte[4096];
+        InputStream in = null;
+        OutputStream out = null;
         try {
-            FileInputStream in = new FileInputStream(src);
-            FileOutputStream out = new FileOutputStream(dst);
+            in = new FileInputStream(src);
+            out = new FileOutputStream(dst);
             
             int read = 0;
             while ( (read = in.read(buf)) != -1)
                 out.write(buf, 0, read);
             
-            in.close();
-            out.close();
             return true;
         } catch (IOException ioe) {
             if (!quiet)
                 ioe.printStackTrace();
             return false;
+        } finally {
+            try { if (in != null) in.close(); } catch (IOException ioe) {}
+            try { if (out != null) out.close(); } catch (IOException ioe) {}
         }
     }
     
diff --git a/core/java/src/net/i2p/util/I2PAppThread.java b/core/java/src/net/i2p/util/I2PAppThread.java
index a9f027caeb15091cf17698b7d794fd9638b6a921..8111083551d93cfb1c6e75d5d93477a2a8aa204d 100644
--- a/core/java/src/net/i2p/util/I2PAppThread.java
+++ b/core/java/src/net/i2p/util/I2PAppThread.java
@@ -10,9 +10,9 @@ package net.i2p.util;
  */
 
 
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
 
 /**
  * Like I2PThread but with per-thread OOM listeners,
@@ -22,7 +22,7 @@ import java.util.Set;
  */
 public class I2PAppThread extends I2PThread {
 
-    private Set _threadListeners = new HashSet(0);
+    private final Set _threadListeners = new CopyOnWriteArraySet();
 
     public I2PAppThread() {
         super();
diff --git a/core/java/src/net/i2p/util/I2PProperties.java b/core/java/src/net/i2p/util/I2PProperties.java
new file mode 100644
index 0000000000000000000000000000000000000000..e943f561fdfa094ce58c82af8c62b6f1f9c7ea9f
--- /dev/null
+++ b/core/java/src/net/i2p/util/I2PProperties.java
@@ -0,0 +1,53 @@
+package net.i2p.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * This class contains a number of properties ((key,value)-pairs).
+ * Additionally, it adds the possibility for callbacks,
+ * to allow immediate response to changing properties.
+ * @author Mathiasdm
+ *
+ */
+public class I2PProperties extends Properties {
+	
+	/**
+	 * Keep a list of callbacks to contact the interested parties
+	 * that want to know about property changes.
+	 */
+	private final List<I2PPropertyCallback> _callbacks = new CopyOnWriteArrayList<I2PPropertyCallback>();
+
+	public I2PProperties() {
+		super();
+	}
+
+	public I2PProperties(Properties defaults) {
+		super(defaults);
+	}
+	
+	public void addCallBack(I2PPropertyCallback callback) {
+		_callbacks.add(callback);
+	}
+	
+	public void removeCallBack(I2PPropertyCallback callback) {
+		_callbacks.remove(callback);
+	}
+	
+	public Object setProperty(String key, String value) {
+		Object returnValue = super.setProperty(key, value);
+		for(I2PPropertyCallback callback: _callbacks) {
+			callback.propertyChanged(key, value);
+		}
+		return returnValue;
+	}
+	
+	public interface I2PPropertyCallback {
+		
+		public void propertyChanged(String key, String value);
+		
+	}
+
+}
diff --git a/core/java/src/net/i2p/util/I2PThread.java b/core/java/src/net/i2p/util/I2PThread.java
index 9b76b8fc9c92c9261c1e2338e3c5a05931f4e9fa..90c95d3818d70b3a3c17c566a5a6190cf5ade57d 100644
--- a/core/java/src/net/i2p/util/I2PThread.java
+++ b/core/java/src/net/i2p/util/I2PThread.java
@@ -10,9 +10,9 @@ package net.i2p.util;
  */
 
 
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
 
 /**
  * In case its useful later...
@@ -21,7 +21,7 @@ import java.util.Set;
  */
 public class I2PThread extends Thread {
     private static volatile Log _log;
-    private static Set _listeners = new HashSet(4);
+    private static final Set _listeners = new CopyOnWriteArraySet();
     private String _name;
     private Exception _createdBy;
 
diff --git a/core/java/src/net/i2p/util/Log.java b/core/java/src/net/i2p/util/Log.java
index b22325adb4d213f809f5f3d2d74824e097d6dfd8..6ce320c9d124beacdde2ae0a6a2eaf5942c77e8e 100644
--- a/core/java/src/net/i2p/util/Log.java
+++ b/core/java/src/net/i2p/util/Log.java
@@ -205,7 +205,8 @@ public class Log {
         }
         @Override
         public boolean equals(Object obj) {
-            if (obj == null) throw new NullPointerException("Null object scope?");
+            if (obj == null)
+                return false;
             if (obj instanceof LogScope) {
                 LogScope s = (LogScope)obj;
                 return s._scopeCache.equals(_scopeCache);
diff --git a/core/java/src/net/i2p/util/LogManager.java b/core/java/src/net/i2p/util/LogManager.java
index 49eaf291febff73acf522210ae7d186ac07684ad..a57512d4d33e9ac50225f311d8ba7a9ce4db26d5 100644
--- a/core/java/src/net/i2p/util/LogManager.java
+++ b/core/java/src/net/i2p/util/LogManager.java
@@ -152,7 +152,9 @@ public class LogManager {
         if (_writer != null)
             return;
         _writer = new LogWriter(this);
-        Thread t = new I2PThread(_writer, "LogWriter", true);
+        // NOT an I2PThread, as it contains logging and we end up with problems
+        Thread t = new Thread(_writer, "LogWriter");
+        t.setDaemon(true);
         t.start();
     }
 
@@ -164,8 +166,10 @@ public class LogManager {
         Log rv = _logs.get(scope);
         if (rv == null) {
             rv = new Log(this, cls, name);
-            _logs.putIfAbsent(scope, rv);
-            isNew = true;
+            Log old = _logs.putIfAbsent(scope, rv);
+            isNew = old == null;
+            if (!isNew)
+                rv = old;
         }
         if (isNew)
             updateLimit(rv);
@@ -178,8 +182,9 @@ public class LogManager {
     }
 
     void addLog(Log log) {
-        _logs.putIfAbsent(log.getScope(), log);
-        updateLimit(log);
+        Log old = _logs.putIfAbsent(log.getScope(), log);
+        if (old == null)
+            updateLimit(log);
     }
     
     public LogConsoleBuffer getBuffer() { return _consoleBuffer; }
@@ -634,6 +639,7 @@ public class LogManager {
         return _dateFormatPattern;
     }
 
+/*****
     public static void main(String args[]) {
         I2PAppContext ctx = new I2PAppContext();
         Log l1 = ctx.logManager().getLog("test.1");
@@ -654,6 +660,7 @@ public class LogManager {
         }
         System.exit(0);
     }
+*****/
 
     public void shutdown() {
         if (_writer != null) {
diff --git a/core/java/src/net/i2p/util/LogRecordFormatter.java b/core/java/src/net/i2p/util/LogRecordFormatter.java
index 52583b63c393290f4da98836635d731219d4cefc..58d08af74a789611ea1dd09aa3031f0af7943290 100644
--- a/core/java/src/net/i2p/util/LogRecordFormatter.java
+++ b/core/java/src/net/i2p/util/LogRecordFormatter.java
@@ -92,10 +92,13 @@ class LogRecordFormatter {
     }
 
     /** don't translate */
+/****
     private static String getPriority(LogRecord rec) {
         return toString(Log.toLevelString(rec.getPriority()), MAX_PRIORITY_LENGTH);
     }
+****/
 
+    /** */
     private static final String BUNDLE_NAME = "net.i2p.router.web.messages";
 
     /** translate @since 0.7.14 */
diff --git a/core/java/src/net/i2p/util/LogWriter.java b/core/java/src/net/i2p/util/LogWriter.java
index 51108e18b8841207d06d0f9f1d76654df5f212c2..c141cc24343ee861576d7e0d89d3a96b535ab0da 100644
--- a/core/java/src/net/i2p/util/LogWriter.java
+++ b/core/java/src/net/i2p/util/LogWriter.java
@@ -77,7 +77,8 @@ class LogWriter implements Runnable {
                     writeRecord(rec);
                 }
                 try {
-                    _currentOut.flush();
+                    if (_currentOut != null)
+                        _currentOut.flush();
                 } catch (IOException ioe) {
                     if (++_diskFullMessageCount < MAX_DISKFULL_MESSAGES)
                         System.err.println("Error writing the router log - disk full? " + ioe);
@@ -180,7 +181,8 @@ class LogWriter implements Runnable {
         try {
             _currentOut = new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(f), "UTF-8"));
         } catch (IOException ioe) {
-            System.err.println("Error rotating into [" + f.getAbsolutePath() + "]" + ioe);
+            if (++_diskFullMessageCount < MAX_DISKFULL_MESSAGES)
+                System.err.println("Error creating log file [" + f.getAbsolutePath() + "]" + ioe);
         }
     }
 
diff --git a/core/java/src/net/i2p/util/LookaheadInputStream.java b/core/java/src/net/i2p/util/LookaheadInputStream.java
index 7b23d26aeef4208cdc2659345a757e49ef60a148..d9a1d9f93e44a78025c1e7a37df98c8adf4c1946 100644
--- a/core/java/src/net/i2p/util/LookaheadInputStream.java
+++ b/core/java/src/net/i2p/util/LookaheadInputStream.java
@@ -78,6 +78,7 @@ public class LookaheadInputStream extends FilterInputStream {
     /** grab the lookahead footer */
     public byte[] getFooter() { return _footerLookahead; }
     
+/*******
     public static void main(String args[]) {
         byte buf[] = new byte[32];
         for (int i = 0; i < 32; i++)
@@ -128,4 +129,5 @@ public class LookaheadInputStream extends FilterInputStream {
             return false;
         }
     }
+******/
 }
diff --git a/core/java/src/net/i2p/util/PartialEepGet.java b/core/java/src/net/i2p/util/PartialEepGet.java
index 5b18bc7619ffbdc4ebe2e749243d5f9186735e04..1b44fce25d8c3eb5fc9919dfdbf8f5034171d8ed 100644
--- a/core/java/src/net/i2p/util/PartialEepGet.java
+++ b/core/java/src/net/i2p/util/PartialEepGet.java
@@ -114,8 +114,6 @@ public class PartialEepGet extends EepGet {
         buf.append(_fetchSize - 1);
         buf.append("\r\n");
 
-        if (_shouldProxy)
-            buf.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n");
         buf.append("Cache-control: no-cache\r\n" +
                    "Pragma: no-cache\r\n");
         // This will be replaced if we are going through I2PTunnelHTTPClient
diff --git a/core/java/src/net/i2p/util/RandomSource.java b/core/java/src/net/i2p/util/RandomSource.java
index c7c87239c9db5484c311d0158a2722e83465f0b9..fe042915212baa352031616a60fba01f91e9f9ca 100644
--- a/core/java/src/net/i2p/util/RandomSource.java
+++ b/core/java/src/net/i2p/util/RandomSource.java
@@ -146,14 +146,18 @@ public class RandomSource extends SecureRandom implements EntropyHarvester {
     public final boolean initSeed(byte buf[]) {
         // why urandom?  because /dev/random blocks, and there are arguments
         // suggesting such blockages are largely meaningless
-        boolean ok = seedFromFile("/dev/urandom", buf);
+        boolean ok = seedFromFile(new File("/dev/urandom"), buf);
         // we merge (XOR) in the data from /dev/urandom with our own seedfile
-        ok = seedFromFile("prngseed.rnd", buf) || ok;
+        File localFile = new File(_context.getConfigDir(), SEEDFILE);
+        ok = seedFromFile(localFile, buf) || ok;
         return ok;
     }
     
-    private static final boolean seedFromFile(String filename, byte buf[]) {
-        File f = new File(I2PAppContext.getGlobalContext().getConfigDir(), filename);
+    /**
+     *  @param f absolute path
+     *  @return success
+     */
+    private static final boolean seedFromFile(File f, byte buf[]) {
         if (f.exists()) {
             FileInputStream fis = null;
             try {
diff --git a/core/java/src/net/i2p/util/SSLEepGet.java b/core/java/src/net/i2p/util/SSLEepGet.java
index e3ba43ae7a3ad12138f924749fbecfef74b188c9..d35545ae7e54bb039ce7e855eeec01b56034bd2b 100644
--- a/core/java/src/net/i2p/util/SSLEepGet.java
+++ b/core/java/src/net/i2p/util/SSLEepGet.java
@@ -482,12 +482,14 @@ public class SSLEepGet extends EepGet {
         if (_aborted)
             throw new IOException("Timed out reading the HTTP headers");
         
-        timeout.resetTimer();
-        if (_fetchInactivityTimeout > 0)
-            timeout.setInactivityTimeout(_fetchInactivityTimeout);
-        else
-            timeout.setInactivityTimeout(60*1000);
-        
+        if (timeout != null) {
+            timeout.resetTimer();
+            if (_fetchInactivityTimeout > 0)
+                timeout.setInactivityTimeout(_fetchInactivityTimeout);
+            else
+                timeout.setInactivityTimeout(60*1000);
+        }        
+
         if (_redirectLocation != null) {
             throw new IOException("Server redirect to " + _redirectLocation + " not allowed");
         }
@@ -506,7 +508,8 @@ public class SSLEepGet extends EepGet {
             int read = _proxyIn.read(buf, 0, toRead);
             if (read == -1)
                 break;
-            timeout.resetTimer();
+            if (timeout != null)
+                timeout.resetTimer();
             _out.write(buf, 0, read);
             _bytesTransferred += read;
 
@@ -531,7 +534,8 @@ public class SSLEepGet extends EepGet {
                     read++;
                 }
             }
-            timeout.resetTimer();
+            if (timeout != null)
+                timeout.resetTimer();
             if (_bytesRemaining >= read) // else chunked?
                 _bytesRemaining -= read;
             if (read > 0) {
@@ -556,7 +560,8 @@ public class SSLEepGet extends EepGet {
         if (_aborted)
             throw new IOException("Timed out reading the HTTP data");
         
-        timeout.cancel();
+        if (timeout != null)
+            timeout.cancel();
         
         if (_transferFailed) {
             // 404, etc - transferFailed is called after all attempts fail, by fetch() above
diff --git a/core/java/src/net/i2p/util/ShellCommand.java b/core/java/src/net/i2p/util/ShellCommand.java
index 12b668f67ee7b9345b4d3c301e3969b182c7f96c..bb0aec5f80b8bd420ece4131da52c9d28fdcae03 100644
--- a/core/java/src/net/i2p/util/ShellCommand.java
+++ b/core/java/src/net/i2p/util/ShellCommand.java
@@ -89,7 +89,7 @@ public class ShellCommand {
      * 
      * @author hypercubus
      */
-    private class StreamConsumer extends Thread {
+    private static class StreamConsumer extends Thread {
 
         private BufferedReader    bufferedReader;
         private InputStreamReader inputStreamReader;
@@ -123,7 +123,7 @@ public class ShellCommand {
      * 
      * @author hypercubus
      */
-    private class StreamReader extends Thread {
+    private static class StreamReader extends Thread {
 
         private BufferedReader    bufferedReader;
         private InputStreamReader inputStreamReader;
@@ -159,7 +159,7 @@ public class ShellCommand {
      * 
      * @author hypercubus
      */
-    private class StreamWriter extends Thread {
+    private static class StreamWriter extends Thread {
 
         private BufferedWriter     bufferedWriter;
         private BufferedReader     in;
@@ -183,7 +183,7 @@ public class ShellCommand {
                     bufferedWriter.write(input, 0, input.length());
                     bufferedWriter.flush();
                 }
-            } catch (Exception e) {
+            } catch (IOException e) {
                 try {
                     bufferedWriter.flush();
                 } catch (IOException e1) {
diff --git a/core/java/src/net/i2p/util/SimpleScheduler.java b/core/java/src/net/i2p/util/SimpleScheduler.java
index f764debe99f6cad3d730c64bae342b9679011d13..61e2e66b347bcb3e823e8a4bf815ef6a9234bfec 100644
--- a/core/java/src/net/i2p/util/SimpleScheduler.java
+++ b/core/java/src/net/i2p/util/SimpleScheduler.java
@@ -30,10 +30,10 @@ public class SimpleScheduler {
     public static SimpleScheduler getInstance() { return _instance; }
     private static final int MIN_THREADS = 2;
     private static final int MAX_THREADS = 4;
-    private I2PAppContext _context;
-    private Log _log;
-    private ScheduledThreadPoolExecutor _executor;
-    private String _name;
+    private final I2PAppContext _context;
+    private final Log _log;
+    private final ScheduledThreadPoolExecutor _executor;
+    private final String _name;
     private int _count;
     private final int _threads;
 
@@ -42,8 +42,9 @@ public class SimpleScheduler {
         _context = I2PAppContext.getGlobalContext();
         _log = _context.logManager().getLog(SimpleScheduler.class);
         _name = name;
-        _count = 0;
         long maxMemory = Runtime.getRuntime().maxMemory();
+        if (maxMemory == Long.MAX_VALUE)
+            maxMemory = 96*1024*1024l;
         _threads = (int) Math.max(MIN_THREADS, Math.min(MAX_THREADS, 1 + (maxMemory / (32*1024*1024))));
         _executor = new ScheduledThreadPoolExecutor(_threads, new CustomThreadFactory());
         _executor.prestartAllCoreThreads();
@@ -139,7 +140,7 @@ public class SimpleScheduler {
             try {
                 _timedEvent.timeReached();
             } catch (Throwable t) {
-                _log.log(Log.CRIT, _name + " wtf, event borked: " + _timedEvent, t);
+                _log.log(Log.CRIT, _name + ": Scheduled task " + _timedEvent + " exited unexpectedly, please report", t);
             }
             long time = System.currentTimeMillis() - before;
             if (time > 1000 && _log.shouldLog(Log.WARN))
diff --git a/core/java/src/net/i2p/util/SimpleTimer.java b/core/java/src/net/i2p/util/SimpleTimer.java
index 0b543071199669c8ea3e802ead0b4aae82c7b254..b19b5d691ac542a585a19a8a783878de3c7ad2f1 100644
--- a/core/java/src/net/i2p/util/SimpleTimer.java
+++ b/core/java/src/net/i2p/util/SimpleTimer.java
@@ -14,6 +14,8 @@ import net.i2p.I2PAppContext;
  * appropriate time.  The method that is fired however should NOT block (otherwise
  * they b0rk the timer).
  *
+ * WARNING - Deprecated.
+ * This is an inefficient mess. Use SimpleScheduler or SimpleTimer2 if possible.
  */
 public class SimpleTimer {
     private static final SimpleTimer _instance = new SimpleTimer();
@@ -42,6 +44,8 @@ public class SimpleTimer {
         runner.setDaemon(true);
         runner.start();
         long maxMemory = Runtime.getRuntime().maxMemory();
+        if (maxMemory == Long.MAX_VALUE)
+            maxMemory = 128*1024*1024l;
         int threads = (int) Math.max(MIN_THREADS, Math.min(MAX_THREADS, 1 + (maxMemory / (32*1024*1024))));
         for (int i = 1; i <= threads ; i++) {
             I2PThread executor = new I2PThread(new Executor(_context, _log, _readyEvents, runn));
@@ -90,7 +94,7 @@ public class SimpleTimer {
         int totalEvents = 0;
         long now = System.currentTimeMillis();
         long eventTime = now + timeoutMs;
-        Long time = new Long(eventTime);
+        Long time = Long.valueOf(eventTime);
         synchronized (_events) {
             // remove the old scheduled position, then reinsert it
             Long oldTime = (Long)_eventTimes.get(event);
diff --git a/core/java/src/net/i2p/util/SimpleTimer2.java b/core/java/src/net/i2p/util/SimpleTimer2.java
index bda41e6211b5a58c8ebd483d4118094eaa9e4e60..955f8faa3a3b034c218c523232aa07d8d23a8477 100644
--- a/core/java/src/net/i2p/util/SimpleTimer2.java
+++ b/core/java/src/net/i2p/util/SimpleTimer2.java
@@ -29,10 +29,10 @@ public class SimpleTimer2 {
     public static SimpleTimer2 getInstance() { return _instance; }
     private static final int MIN_THREADS = 2;
     private static final int MAX_THREADS = 4;
-    private I2PAppContext _context;
+    private final I2PAppContext _context;
     private static Log _log; // static so TimedEvent can use it
-    private ScheduledThreadPoolExecutor _executor;
-    private String _name;
+    private final ScheduledThreadPoolExecutor _executor;
+    private final String _name;
     private int _count;
     private final int _threads;
 
@@ -43,6 +43,8 @@ public class SimpleTimer2 {
         _name = name;
         _count = 0;
         long maxMemory = Runtime.getRuntime().maxMemory();
+        if (maxMemory == Long.MAX_VALUE)
+            maxMemory = 96*1024*1024l;
         _threads = (int) Math.max(MIN_THREADS, Math.min(MAX_THREADS, 1 + (maxMemory / (32*1024*1024))));
         _executor = new CustomScheduledThreadPoolExecutor(_threads, new CustomThreadFactory());
         _executor.prestartAllCoreThreads();
@@ -55,7 +57,7 @@ public class SimpleTimer2 {
         _executor.shutdownNow();
     }
 
-    private class CustomScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor {
+    private static class CustomScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor {
         public CustomScheduledThreadPoolExecutor(int threads, ThreadFactory factory) {
              super(threads, factory);
         }
@@ -223,7 +225,7 @@ public class SimpleTimer2 {
             try {
                 timeReached();
             } catch (Throwable t) {
-                _log.log(Log.CRIT, _pool + " wtf, event borked: " + this, t);
+                _log.log(Log.CRIT, _pool + ": Timed task " + this + " exited unexpectedly, please report", t);
             }
             long time = System.currentTimeMillis() - before;
             if (time > 500 && _log.shouldLog(Log.WARN))
diff --git a/core/java/test/net/i2p/crypto/SHA1Test.java b/core/java/test/net/i2p/crypto/SHA1Test.java
deleted file mode 100644
index 2c532c5cdee1742581fc544caf0869d27eebe31c..0000000000000000000000000000000000000000
--- a/core/java/test/net/i2p/crypto/SHA1Test.java
+++ /dev/null
@@ -1,192 +0,0 @@
-package net.i2p.crypto;
-/* @(#)SHA1Test.java	1.10 2004-04-24
- * This file was freely contributed to the LimeWire project and is covered
- * by its existing GPL licence, but it may be used individually as a public
- * domain implementation of a published algorithm (see below for references).
- * It was also freely contributed to the Bitzi public domain sources.
- * @author  Philippe Verdy
- */
- 
-/* Sun may wish to change the following package name, if integrating this
- * class in the Sun JCE Security Provider for Java 1.5 (code-named Tiger).
- */
-//package com.bitzi.util;
- 
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
- 
-public class SHA1Test {
-    
-    private static final SHA1 hash = new SHA1();
- 
-    public static void main(String args[]) {
-// http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
-        System.out.println("****************************************");
-        System.out.println("* Basic FIPS PUB 180-1 test vectors... *");
-        System.out.println("****************************************");
-        tst(1, 1,
-            "abc",
-            "A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D");
-        tst(1, 2,
-            "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-            "84983E44 1C3BD26e BAAE4AA1 F95129E5 E54670F1");
-        tst(1, 3, /* one million bytes */
-            1000000, "a",
-            "34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F");
-        System.out.println();
- 
-// http://csrc.ncsl.nist.gov/cryptval/shs/SHAVS.pdf
-        System.out.println("********************************************************");
-        System.out.println("* SHSV Examples of the selected short messages test... *");
-        System.out.println("********************************************************");
-        tst(2, 2, new byte[] {/* 8 bits, i.e. 1 byte */
-            (byte)0x5e},
-            "5e6f80a3 4a9798ca fc6a5db9 6cc57ba4 c4db59c2");
-        tst(2, 4, new byte[] {/* 128 bits, i.e. 16 bytes */
-            (byte)0x9a,(byte)0x7d,(byte)0xfd,(byte)0xf1,(byte)0xec,(byte)0xea,(byte)0xd0,(byte)0x6e,
-            (byte)0xd6,(byte)0x46,(byte)0xaa,(byte)0x55,(byte)0xfe,(byte)0x75,(byte)0x71,(byte)0x46},
-            "82abff66 05dbe1c1 7def12a3 94fa22a8 2b544a35");
-        System.out.println();
- 
-        System.out.println("*******************************************************");
-        System.out.println("* SHSV Examples of the selected long messages test... *");
-        System.out.println("*******************************************************");
-        tst(3, 2, new byte[] {/* 1304 bits, i.e. 163 bytes */
-            (byte)0xf7,(byte)0x8f,(byte)0x92,(byte)0x14,(byte)0x1b,(byte)0xcd,(byte)0x17,(byte)0x0a,
-            (byte)0xe8,(byte)0x9b,(byte)0x4f,(byte)0xba,(byte)0x15,(byte)0xa1,(byte)0xd5,(byte)0x9f,
-            (byte)0x3f,(byte)0xd8,(byte)0x4d,(byte)0x22,(byte)0x3c,(byte)0x92,(byte)0x51,(byte)0xbd,
-            (byte)0xac,(byte)0xbb,(byte)0xae,(byte)0x61,(byte)0xd0,(byte)0x5e,(byte)0xd1,(byte)0x15,
-            (byte)0xa0,(byte)0x6a,(byte)0x7c,(byte)0xe1,(byte)0x17,(byte)0xb7,(byte)0xbe,(byte)0xea,
-            (byte)0xd2,(byte)0x44,(byte)0x21,(byte)0xde,(byte)0xd9,(byte)0xc3,(byte)0x25,(byte)0x92,
-            (byte)0xbd,(byte)0x57,(byte)0xed,(byte)0xea,(byte)0xe3,(byte)0x9c,(byte)0x39,(byte)0xfa,
-            (byte)0x1f,(byte)0xe8,(byte)0x94,(byte)0x6a,(byte)0x84,(byte)0xd0,(byte)0xcf,(byte)0x1f,
-            (byte)0x7b,(byte)0xee,(byte)0xad,(byte)0x17,(byte)0x13,(byte)0xe2,(byte)0xe0,(byte)0x95,
-            (byte)0x98,(byte)0x97,(byte)0x34,(byte)0x7f,(byte)0x67,(byte)0xc8,(byte)0x0b,(byte)0x04,
-            (byte)0x00,(byte)0xc2,(byte)0x09,(byte)0x81,(byte)0x5d,(byte)0x6b,(byte)0x10,(byte)0xa6,
-            (byte)0x83,(byte)0x83,(byte)0x6f,(byte)0xd5,(byte)0x56,(byte)0x2a,(byte)0x56,(byte)0xca,
-            (byte)0xb1,(byte)0xa2,(byte)0x8e,(byte)0x81,(byte)0xb6,(byte)0x57,(byte)0x66,(byte)0x54,
-            (byte)0x63,(byte)0x1c,(byte)0xf1,(byte)0x65,(byte)0x66,(byte)0xb8,(byte)0x6e,(byte)0x3b,
-            (byte)0x33,(byte)0xa1,(byte)0x08,(byte)0xb0,(byte)0x53,(byte)0x07,(byte)0xc0,(byte)0x0a,
-            (byte)0xff,(byte)0x14,(byte)0xa7,(byte)0x68,(byte)0xed,(byte)0x73,(byte)0x50,(byte)0x60,
-            (byte)0x6a,(byte)0x0f,(byte)0x85,(byte)0xe6,(byte)0xa9,(byte)0x1d,(byte)0x39,(byte)0x6f,
-            (byte)0x5b,(byte)0x5c,(byte)0xbe,(byte)0x57,(byte)0x7f,(byte)0x9b,(byte)0x38,(byte)0x80,
-            (byte)0x7c,(byte)0x7d,(byte)0x52,(byte)0x3d,(byte)0x6d,(byte)0x79,(byte)0x2f,(byte)0x6e,
-            (byte)0xbc,(byte)0x24,(byte)0xa4,(byte)0xec,(byte)0xf2,(byte)0xb3,(byte)0xa4,(byte)0x27,
-            (byte)0xcd,(byte)0xbb,(byte)0xfb},
-            "cb0082c8 f197d260 991ba6a4 60e76e20 2bad27b3");
-        System.out.println();
- 
-// See also http://csrc.ncsl.nist.gov/cryptval/shs/sha1-vectors.zip
- 
-        {
-            final int RETRIES = 10;
-            final int ITERATIONS = 2000;
-            final int BLOCKSIZE = 65536;
-            byte[] input = new byte[BLOCKSIZE];
-            for (int i = BLOCKSIZE; --i >= 0; )
-                input[i] = (byte)i;
-            long best = 0;
-            for (int i = 0; i < 1000; i++) // training for stable measure
-                 System.currentTimeMillis();
- 
-            for (int retry = 0; retry < RETRIES; retry++) {
-                long t0 = System.currentTimeMillis();
-                for (int i = ITERATIONS; --i >= 0; );
-                long t1 = System.currentTimeMillis();
-                for (int i = ITERATIONS; --i >= 0; )
-                    hash.engineUpdate(input, 0, BLOCKSIZE);
-                long t2 = System.currentTimeMillis();
-                long time = (t2 - t1) - (t1 - t0);
-                if (retry == 0 || time < best)
-                     best = time;
-            }
-            hash.engineReset();
-            double rate = 1000.0 * ITERATIONS * BLOCKSIZE / best;
-            System.out.println("Our rate = " +
-                               (float)(rate * 8) + " bits/s = " +
-                               (float)(rate / (1024 * 1024)) + " Megabytes/s");
-            // Java 1.5 beta-b32c, on Athlon XP 1800+:
-            // with java -client: 48.21 Megabytes/s.
-            // with java -server: 68.23 Megabytes/s.
- 
-            try {
-                MessageDigest md = MessageDigest.getInstance("SHA");
-                for (int retry = 0; retry < RETRIES; retry++) {
-                    long t0 = System.currentTimeMillis();
-                    for (int i = ITERATIONS; --i >= 0; );
-                    long t1 = System.currentTimeMillis();
-                    for (int i = ITERATIONS; --i >= 0; )
-                        md.update(input, 0, BLOCKSIZE);
-                    long t2 = System.currentTimeMillis();
-                    long time = (t2 - t1) - (t1 - t0);
-                    if (retry == 0 || time < best)
-                         best = time;
-                }
-                md.reset();
-                rate = 1000.0 * ITERATIONS * BLOCKSIZE / best;
-                System.out.println("JCE rate = " +
-                                   (float)(rate * 8) + " bits/s = " +
-                                   (float)(rate / (1024 * 1024)) + " Megabytes/s");
-            } catch (NoSuchAlgorithmException nsae) {
-                System.out.println("No SHA algorithm in local JCE Security Providers");
-            }
-            // Java 1.5 beta-b32c, on Athlon XP 1800+:
-            // with java -client: 23.20 Megabytes/s.
-            // with java -server: 45.72 Megabytes/s.
-        }
-    }
-    
-    private static final boolean tst(final int set, final int vector,
-                                     final String source,
-                                     final String expect) {
-        byte[] input = new byte[source.length()];
-        for (int i = 0; i < input.length; i++)
-            input[i] = (byte)source.charAt(i);
-        return tst(set, vector, input, expect);
-    }
- 
-    private static final boolean tst(final int set, final int vector,
-                                     final byte[] input,
-                                     final String expect) {
-        System.out.print("Set " + set + ", vector# " + vector + ": ");
-        hash.engineUpdate(input, 0, input.length);
-        return tstResult(expect);
-    }
- 
-    private static final boolean tst(final int set, final int vector,
-                                     final int times, final String source,
-                                     final String expect) {
-        byte[] input = new byte[source.length()];
-        for (int i = 0; i < input.length; i++)
-            input[i] = (byte)source.charAt(i);
-        System.out.print("Set " + set + ", vector# " + vector + ": ");
-        for (int i = 0; i < times; i++)
-            hash.engineUpdate(input, 0, input.length);
-        return tstResult(expect);
-    }
- 
-    private static final boolean tstResult(String expect) {
-        final String result = toHex(hash.engineDigest());
-        expect = expect.toUpperCase();
-        if (!expect.equals(result)) {
-            System.out.println("**************** WRONG ***************");
-            System.out.println("  expect: " + expect);
-            System.out.println("  result: " + result);
-            return false;
-        }
-        System.out.println("OK");
-        return true;
-    }
- 
-    private static final String toHex(final byte[] bytes) {
-        StringBuilder buf = new StringBuilder(bytes.length * 2);
-        for (int i = 0; i < bytes.length; i++) {
-            if ((i & 3) == 0 && i != 0)
-               buf.append(' ');
-            buf.append(HEX.charAt((bytes[i] >> 4) & 0xF))
-               .append(HEX.charAt( bytes[i]       & 0xF));
-        }
-        return buf.toString();
-    }
-    private static final String HEX = "0123456789ABCDEF";
-}
diff --git a/core/java/test/net/i2p/crypto/SHA256Test.java b/core/java/test/net/i2p/crypto/SHA256Test.java
index 9778887db3d80a3bdfb80c5c906eb1632687bf5c..4e6d1a032099a0e160d3823b2825e834f73b16f5 100644
--- a/core/java/test/net/i2p/crypto/SHA256Test.java
+++ b/core/java/test/net/i2p/crypto/SHA256Test.java
@@ -32,66 +32,19 @@ public class SHA256Test extends TestCase{
             SHA256Generator.getInstance().calculateHash(message);
         }
     }
-    
-    public void testCopyConstructor(){
-        SHA256Digest orig = new SHA256Digest();
-        byte[] message = "update this!".getBytes();
-        orig.update(message, 0, message.length);
-        
-        SHA256Digest copy = new SHA256Digest(orig);
-        
-        byte[] origData = new byte[32];
-        orig.doFinal(origData, 0);
-        byte[] copyData = new byte[32];
-        copy.doFinal(copyData, 0);
-        
-        assertTrue(DataHelper.eq(origData, copyData));
-        
-    }
-    
-    public void testCheckName(){
-        SHA256Digest digest = new SHA256Digest();
-        assertEquals("SHA-256", digest.getAlgorithmName());
-    }
-    
-    public void testManualUpdate(){
-        byte[] data = "deathnotronic".getBytes();
-        
-        SHA256Digest one = new SHA256Digest();
-        for(int i = 0; i < data.length; i++){
-            one.update(data[i]);
+
+    /**
+     * Check if the behaviour remains the same.
+     */
+    public void testMultipleEquality(){
+        byte[] data = "blahblah".getBytes();
+
+        Hash firstHash = SHA256Generator.getInstance().calculateHash(data);
+
+        for(int i=0; i<5; i++){
+            Hash h = SHA256Generator.getInstance().calculateHash(data);
+            assertEquals(firstHash, h);
         }
-        
-        SHA256Digest two = new SHA256Digest();
-        two.update(data[0]);
-        two.update(data, 1, data.length-1);
-        
-        byte[] oneData = new byte[32];
-        one.doFinal(oneData, 0);
-        byte[] twoData = new byte[32];
-        two.doFinal(twoData, 0);
-        
-        assertTrue(DataHelper.eq(oneData, twoData));
-    }
-    
-    public void test14Words(){
-        byte message[] = new byte[56];
-        _context.random().nextBytes(message);
-        SHA256Digest orig = new SHA256Digest();
-        orig.update(message, 0, message.length);
-        orig.doFinal(new byte[32], 0);
-    }
-    
-    public void testSHA(){
-        I2PAppContext ctx = I2PAppContext.getGlobalContext();
-        byte orig[] = new byte[4096];
-        ctx.random().nextBytes(orig);
-        Hash old = ctx.sha().calculateHash(orig);
-        SHA256Digest d = new SHA256Digest();
-        d.update(orig, 0, orig.length);
-        byte out[] = new byte[Hash.HASH_LENGTH];
-        d.doFinal(out, 0);
-        assertTrue(DataHelper.eq(out, old.getData()));
     }
         
-}
\ No newline at end of file
+}
diff --git a/core/java/test/net/i2p/crypto/SessionEncryptionTest.java b/core/java/test/net/i2p/crypto/SessionEncryptionTest.java
index c6ec05326c11f7748e1a987810a25f8d42a7f907..0641db6ab144a6b74a519fc1a95c42cca3add81b 100644
--- a/core/java/test/net/i2p/crypto/SessionEncryptionTest.java
+++ b/core/java/test/net/i2p/crypto/SessionEncryptionTest.java
@@ -102,7 +102,8 @@ public class SessionEncryptionTest extends TestCase{
         
         
         
-        _context.sessionKeyManager().tagsDelivered(pubKey, curKey, firstTags);
+        TagSetHandle tsh = _context.sessionKeyManager().tagsDelivered(pubKey, curKey, firstTags);
+        _context.sessionKeyManager().tagsAcked(pubKey, curKey, tsh);
         
         curKey = _context.sessionKeyManager().getCurrentKey(pubKey);
         SessionTag curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey);
@@ -130,7 +131,8 @@ public class SessionEncryptionTest extends TestCase{
         
         
         
-        _context.sessionKeyManager().tagsDelivered(pubKey, curKey, secondTags);
+        tsh = _context.sessionKeyManager().tagsDelivered(pubKey, curKey, secondTags);
+        _context.sessionKeyManager().tagsAcked(pubKey, curKey, tsh);
         
         curKey = _context.sessionKeyManager().getCurrentKey(pubKey);
         curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey);
@@ -199,7 +201,8 @@ public class SessionEncryptionTest extends TestCase{
         
         
         
-        _context.sessionKeyManager().tagsDelivered(pubKey, curKey, firstTags);
+        TagSetHandle tsh = _context.sessionKeyManager().tagsDelivered(pubKey, curKey, firstTags);
+        _context.sessionKeyManager().tagsAcked(pubKey, curKey, tsh);
         
         curKey = _context.sessionKeyManager().getCurrentKey(pubKey);
         SessionTag curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey);
@@ -226,7 +229,8 @@ public class SessionEncryptionTest extends TestCase{
         
         
         
-        _context.sessionKeyManager().tagsDelivered(pubKey, nextKey, secondTags); // note nextKey not curKey
+        tsh = _context.sessionKeyManager().tagsDelivered(pubKey, nextKey, secondTags); // note nextKey not curKey
+        _context.sessionKeyManager().tagsAcked(pubKey, nextKey, tsh);
         
         curKey = _context.sessionKeyManager().getCurrentKey(pubKey);
         curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey);
@@ -288,9 +292,11 @@ public class SessionEncryptionTest extends TestCase{
             
             if ( (tags != null) && (tags.size() > 0) ) {
                 if (nextKey == null) {
-                    _context.sessionKeyManager().tagsDelivered(pubKey, curKey, tags);
+                    TagSetHandle tsh = _context.sessionKeyManager().tagsDelivered(pubKey, curKey, tags);
+                    _context.sessionKeyManager().tagsAcked(pubKey, curKey, tsh);
                 } else {
-                    _context.sessionKeyManager().tagsDelivered(pubKey, nextKey, tags);
+                    TagSetHandle tsh = _context.sessionKeyManager().tagsDelivered(pubKey, nextKey, tags);
+                    _context.sessionKeyManager().tagsAcked(pubKey, nextKey, tsh);
                 }
             }
         }
diff --git a/core/java/test/net/i2p/data/LeaseSetTest.java b/core/java/test/net/i2p/data/LeaseSetTest.java
index 61c3b73c6de2625c97f4427efe47b38f5c3d0aed..30fb8c11fb2041ee3d69076d7b5d1fc4b0f92c22 100644
--- a/core/java/test/net/i2p/data/LeaseSetTest.java
+++ b/core/java/test/net/i2p/data/LeaseSetTest.java
@@ -25,4 +25,50 @@ public class LeaseSetTest extends StructureTest {
         return leaseSet; 
     }
     public DataStructure createStructureToRead() { return new LeaseSet(); }
+    
+    public void testGetLeaseInvalid() {
+        // create test subject
+        LeaseSet subj = new LeaseSet();
+        
+        // should contain no leases now..
+        try {
+            assertNull(subj.getLease(0));
+        } catch(RuntimeException exc) {
+            // all good
+        }
+        
+        // this shouldn't work either
+        try {
+            assertNull(subj.getLease(-1));
+        } catch(RuntimeException exc) {
+            // all good
+        }
+    }
+    
+    public void testAddLeaseNull() {
+        // create test subject
+        LeaseSet subj = new LeaseSet();
+        
+        // now add an null lease
+        try {
+            subj.addLease(null);
+            fail("Failed at failing.");
+        } catch(IllegalArgumentException exc) {
+            // all good
+        }
+    }
+    
+    public void testAddLeaseInvalid() {
+        // create test subject
+        LeaseSet subj = new LeaseSet();
+        
+        // try to add completely invalid lease(ie. no data)
+        try {
+            subj.addLease(new Lease());
+            fail("Failed at failing.");
+        } catch(IllegalArgumentException exc) {
+            // all good
+        }
+    }
+            
 }
diff --git a/core/java/test/net/i2p/data/PrivateKeyTest.java b/core/java/test/net/i2p/data/PrivateKeyTest.java
index cb3c3124d90028c60282227bbebc0809c80f9768..9d25fb449ababe1489d4c57f298c39f01698c70d 100644
--- a/core/java/test/net/i2p/data/PrivateKeyTest.java
+++ b/core/java/test/net/i2p/data/PrivateKeyTest.java
@@ -66,13 +66,15 @@ public class PrivateKeyTest extends StructureTest {
         byte data[] = new byte[56];
         for (int i = 0; i < data.length; i++)
             data[i] = (byte)(i);
-        privateKey.setData(data);
         
         boolean error = false;
         try{
+            privateKey.setData(data);
             privateKey.writeBytes(new ByteArrayOutputStream());
         }catch(DataFormatException dfe){
             error = true;
+        }catch(IllegalArgumentException exc) {
+            error = true;
         }
         assertTrue(error);
     }
diff --git a/core/java/test/net/i2p/data/PublicKeyTest.java b/core/java/test/net/i2p/data/PublicKeyTest.java
index 8ca6282ccc129039e477e86af9261ff5a5152ea9..8fed332bd5aacec06708172f3e94dab2c8a6c767 100644
--- a/core/java/test/net/i2p/data/PublicKeyTest.java
+++ b/core/java/test/net/i2p/data/PublicKeyTest.java
@@ -66,13 +66,15 @@ public class PublicKeyTest extends StructureTest {
         byte data[] = new byte[56];
         for (int i = 0; i < data.length; i++)
             data[i] = (byte)(i);
-        publicKey.setData(data);
         
         boolean error = false;
         try{
+            publicKey.setData(data);
             publicKey.writeBytes(new ByteArrayOutputStream());
         }catch(DataFormatException dfe){
             error = true;
+        }catch(IllegalArgumentException exc) {
+            error = true;
         }
         assertTrue(error);
     }
diff --git a/core/java/test/net/i2p/data/RouterAddressTest.java b/core/java/test/net/i2p/data/RouterAddressTest.java
index 65a44f92128aff26350a5467bef22d09e17b1718..aab4a88bb9ac593362200f066a2d4774ffd54d57 100644
--- a/core/java/test/net/i2p/data/RouterAddressTest.java
+++ b/core/java/test/net/i2p/data/RouterAddressTest.java
@@ -58,6 +58,7 @@ public class RouterAddressTest extends StructureTest {
         addr.setOptions(options);
         addr.setTransportStyle("Blah");
         assertFalse(addr.equals(null));
+        assertFalse(addr.equals(""));
     }
     
     public void testToString(){
@@ -73,5 +74,7 @@ public class RouterAddressTest extends StructureTest {
         addr.setOptions(options);
         addr.setTransportStyle("Blah");
         addr.toString();
+        addr.setOptions(null);
+        addr.toString();
     }
 }
diff --git a/core/java/test/net/i2p/data/SigningPrivateKeyTest.java b/core/java/test/net/i2p/data/SigningPrivateKeyTest.java
index bafc3bdaca72d2453152cd4755f0b728930e991c..baa038812d55e237743825daacb821d097634b32 100644
--- a/core/java/test/net/i2p/data/SigningPrivateKeyTest.java
+++ b/core/java/test/net/i2p/data/SigningPrivateKeyTest.java
@@ -66,13 +66,15 @@ public class SigningPrivateKeyTest extends StructureTest {
         byte data[] = new byte[56];
         for (int i = 0; i < data.length; i++)
             data[i] = (byte)(i);
-        signingPrivateKey.setData(data);
         
         boolean error = false;
         try{
+            signingPrivateKey.setData(data);
             signingPrivateKey.writeBytes(new ByteArrayOutputStream());
         }catch(DataFormatException dfe){
             error = true;
+        }catch(IllegalArgumentException exc) {
+            error = true;
         }
         assertTrue(error);
     }
diff --git a/core/java/test/net/i2p/data/SigningPublicKeyTest.java b/core/java/test/net/i2p/data/SigningPublicKeyTest.java
index f976e53dac06343762ad91f9a3a453548219d19f..b97099e6e2de2e0cd2c644520d8fb23c2923e9a5 100644
--- a/core/java/test/net/i2p/data/SigningPublicKeyTest.java
+++ b/core/java/test/net/i2p/data/SigningPublicKeyTest.java
@@ -66,14 +66,17 @@ public class SigningPublicKeyTest extends StructureTest {
         byte data[] = new byte[56];
         for (int i = 0; i < data.length; i++)
             data[i] = (byte)(i);
-        publicKey.setData(data);
         
         boolean error = false;
         try{
+            publicKey.setData(data);
             publicKey.writeBytes(new ByteArrayOutputStream());
         }catch(DataFormatException dfe){
             error = true;
+        }catch(IllegalArgumentException exc) {
+            error = true;
         }
+        
         assertTrue(error);
     }
     
diff --git a/core/java/test/net/i2p/data/SimpleDataStructureTest.java b/core/java/test/net/i2p/data/SimpleDataStructureTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4cf8233429a2e76b63f27c4dff66bc2fe9604b73
--- /dev/null
+++ b/core/java/test/net/i2p/data/SimpleDataStructureTest.java
@@ -0,0 +1,96 @@
+package net.i2p.data;
+/*
+ * free (adj.): unencumbered; not under the control of others
+ * Written by jrandom in 2003 and released into the public domain 
+ * with no warranty of any kind, either expressed or implied.  
+ * It probably won't make your computer catch on fire, or eat 
+ * your children, but it might.  Use at your own risk.
+ *
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+import junit.framework.TestCase;
+
+/**
+ * Test harness for the simple data structure
+ *
+ * @author welterde
+ */
+public class SimpleDataStructureTest extends TestCase {
+    
+    public void testSetDataImmutable() throws Exception {
+        // create new test subject
+        TestStruct struct = new TestStruct();
+        
+        // try to set null object.. should not fail..
+        struct.setData(null);
+        
+        // set data to something
+        struct.setData(new byte[3]);
+        
+        // now setting it to null should fail
+        try {
+            struct.setData(null);
+            fail("Should not have allowed us to change this..");
+        } catch(RuntimeException exc) {
+            // all good
+        }
+        
+        // setting it to something non-null should fail as well.
+        try {
+            struct.setData(new byte[3]);
+            fail("Should not have allowed us to change this..");
+        } catch(RuntimeException exc) {
+            // all good
+        }
+    }
+    
+    public void testReadBytesImmutable() throws Exception {
+        // create new test subject
+        TestStruct struct = new TestStruct();
+        
+        // load some data using setData
+        struct.setData(new byte[3]);
+        
+        // now try to load via readBytes
+        try {
+            struct.readBytes(null);
+            fail("blah blah blah..");
+        } catch(RuntimeException exc) {
+            // all good
+        }
+    }
+    
+    public void testToBase64Safe() throws Exception {
+        // create new test subject
+        TestStruct struct = new TestStruct();
+        
+        // now try to get the Base64.. should not throw an exception, but should not be an empty string either
+        assertNull(struct.toBase64());
+    }
+
+    public void testCalculateHashSafe() throws Exception {
+        // create new test subject
+        TestStruct struct = new TestStruct();
+        
+        // now try to get the hash.. should not throw an exception
+        assertNull(struct.calculateHash());
+    }
+    
+    public void testHashCodeSafe() throws Exception {
+        // create new test subject
+        TestStruct struct = new TestStruct();
+        
+        // just make sure it doesn't explode in our face
+        struct.hashCode();
+    }
+    
+    public class TestStruct extends SimpleDataStructure {
+        public int length() {
+            return 3;
+        }
+    }
+    
+}
\ No newline at end of file
diff --git a/core/java/test/net/i2p/stat/RateTest.java b/core/java/test/net/i2p/stat/RateTest.java
index 471e7bb8f328ac396e848a83bc13852f63f60a77..82235a785def51e6cc8161d696ec6395d64833a0 100644
--- a/core/java/test/net/i2p/stat/RateTest.java
+++ b/core/java/test/net/i2p/stat/RateTest.java
@@ -1,5 +1,6 @@
 package net.i2p.stat;
 
+import java.io.ByteArrayInputStream;
 import java.util.Properties;
 
 import junit.framework.TestCase;
@@ -7,7 +8,7 @@ import junit.framework.TestCase;
 
 public class RateTest extends TestCase {
     public void testRate() throws Exception{
-        Rate rate = new Rate(1000);
+        Rate rate = new Rate(5000);
         for (int i = 0; i < 50; i++) {
             Thread.sleep(20);
             rate.addData(i * 100, 20);
@@ -19,10 +20,10 @@ public class RateTest extends TestCase {
         byte data[] = buf.toString().getBytes();
 
         Properties props = new Properties();
-        props.load(new java.io.ByteArrayInputStream(data));
+        props.load(new ByteArrayInputStream(data));
 
         Rate r = new Rate(props, "rate.test", true);
 
         assertEquals(r, rate);
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/test/net/i2p/stat/SizeTest.java b/core/java/test/net/i2p/stat/SizeMeasure.java
similarity index 98%
rename from core/java/test/net/i2p/stat/SizeTest.java
rename to core/java/test/net/i2p/stat/SizeMeasure.java
index aaf157c1aa26378f7498e3a46285dcd5a6b44892..7bb162604ee62d6cf19bf5e7983a380c88fd8275 100644
--- a/core/java/test/net/i2p/stat/SizeTest.java
+++ b/core/java/test/net/i2p/stat/SizeMeasure.java
@@ -1,6 +1,6 @@
 package net.i2p.stat;
 
-public class SizeTest {
+public class SizeMeasure {
     public static void main(String args[]) {
         testRateSize(100); //117KB
         testRateSize(100000); // 4.5MB
diff --git a/core/java/test/net/i2p/util/LogSettingsTest.java b/core/java/test/net/i2p/util/LogSettingsTest.java
index face457257307725ea7abced3809ef1165c8b390..529190a77cda8e0feb037c6d698e4876a52ab3b4 100644
--- a/core/java/test/net/i2p/util/LogSettingsTest.java
+++ b/core/java/test/net/i2p/util/LogSettingsTest.java
@@ -82,28 +82,37 @@ public class LogSettingsTest extends TestCase {
         
         System.setOut(pout);
 
-        log.debug("DEBUG" + ": debug");
-        log.info("DEBUG" + ": info");
-        log.warn("DEBUG" + ": warn");
-        log.error("DEBUG" + ": error");
-        log.log(Log.CRIT, "DEBUG" + ": crit");
-        _context.logManager().shutdown();
-        
-        String l1 = in.readLine();
-        String l2 = in.readLine();
-        String l3 = in.readLine();
-        String l4 = in.readLine();
-        String l5 = in.readLine();
-        
-        assertTrue(
-            l1.matches(".*DEBUG: debug") &&
-            l2.matches(".*DEBUG: info") &&
-            l3.matches(".*DEBUG: warn") &&
-            l4.matches(".*DEBUG: error") &&
-            l5.matches(".*DEBUG: crit")
-        );    
-
-        System.setOut(systemOut);
+        try {
+            log.debug("DEBUG" + ": debug");
+            log.info("DEBUG" + ": info");
+            log.warn("DEBUG" + ": warn");
+            log.error("DEBUG" + ": error");
+            log.log(Log.CRIT, "DEBUG" + ": crit");
+
+            // Wait for the LogWriter to flush, then write extra stuff so
+            // the test doesn't hang on failure
+            try { Thread.sleep(12*1000); } catch (InterruptedException ie) {}
+            for (int i = 0; i < 5; i++)
+                 pout.println("");
+            pout.flush();
+            String l1 = in.readLine();
+            String l2 = in.readLine();
+            String l3 = in.readLine();
+            String l4 = in.readLine();
+            String l5 = in.readLine();
+        
+            assertTrue(
+                l1.matches(".*DEBUG: debug") &&
+                l2.matches(".*DEBUG: info") &&
+                l3.matches(".*DEBUG: warn") &&
+                l4.matches(".*DEBUG: error") &&
+                l5.matches(".*DEBUG: crit")
+            );    
+        } finally {
+            System.setOut(systemOut);
+            pout.close();
+        }
+
         
     }
 
@@ -122,26 +131,35 @@ public class LogSettingsTest extends TestCase {
         
         System.setOut(pout);
         
-        log.debug("INFO" + ": debug");
-        log.info("INFO" + ": info");
-        log.warn("INFO" + ": warn");
-        log.error("INFO" + ": error");
-        log.log(Log.CRIT, "INFO" + ": crit");
-        _context.logManager().shutdown();
-       
-        String l1 = in.readLine();
-        String l2 = in.readLine();
-        String l3 = in.readLine();
-        String l4 = in.readLine();
-        
-        assertTrue(
-            l1.matches(".*INFO: info") &&
-            l2.matches(".*INFO: warn") &&
-            l3.matches(".*INFO: error") &&
-            l4.matches(".*INFO: crit")
-        );
-
-        System.setOut(systemOut);
+        try {
+            log.debug("INFO" + ": debug");
+            log.info("INFO" + ": info");
+            log.warn("INFO" + ": warn");
+            log.error("INFO" + ": error");
+            log.log(Log.CRIT, "INFO" + ": crit");
+
+            // Wait for the LogWriter to flush, then write extra stuff so
+            // the test doesn't hang on failure
+            try { Thread.sleep(12*1000); } catch (InterruptedException ie) {}
+            for (int i = 0; i < 4; i++)
+                 pout.println("");
+            pout.flush();
+            String l1 = in.readLine();
+            String l2 = in.readLine();
+            String l3 = in.readLine();
+            String l4 = in.readLine();
+        
+            assertTrue(
+                l1.matches(".*INFO: info") &&
+                l2.matches(".*INFO: warn") &&
+                l3.matches(".*INFO: error") &&
+                l4.matches(".*INFO: crit")
+            );
+        } finally {
+            System.setOut(systemOut);
+            pout.close();
+        }
+
 
     }
 
@@ -160,24 +178,33 @@ public class LogSettingsTest extends TestCase {
         
         System.setOut(pout);
         
-        log.debug("WARN" + ": debug");
-        log.info("WARN" + ": info");
-        log.warn("WARN" + ": warn");
-        log.error("WARN" + ": error");
-        log.log(Log.CRIT, "WARN" + ": crit");
-        _context.logManager().shutdown();
-        
-        String l1 = in.readLine();
-        String l2 = in.readLine();
-        String l3 = in.readLine();
-        
-        assertTrue(
-            l1.matches(".*WARN: warn") &&
-            l2.matches(".*WARN: error") &&
-            l3.matches(".*WARN: crit")
-        );
+        try {
+            log.debug("WARN" + ": debug");
+            log.info("WARN" + ": info");
+            log.warn("WARN" + ": warn");
+            log.error("WARN" + ": error");
+            log.log(Log.CRIT, "WARN" + ": crit");
+
+            // Wait for the LogWriter to flush, then write extra stuff so
+            // the test doesn't hang on failure
+            try { Thread.sleep(12*1000); } catch (InterruptedException ie) {}
+            for (int i = 0; i < 3; i++)
+                 pout.println("");
+            pout.flush();
+            String l1 = in.readLine();
+            String l2 = in.readLine();
+            String l3 = in.readLine();
+        
+            assertTrue(
+                l1.matches(".*WARN: warn") &&
+                l2.matches(".*WARN: error") &&
+                l3.matches(".*WARN: crit")
+            );
+        } finally {
+            System.setOut(systemOut);
+            pout.close();
+        }
 
-        System.setOut(systemOut);
     }
 
     public void testError() throws IOException{
@@ -195,22 +222,31 @@ public class LogSettingsTest extends TestCase {
         
         System.setOut(pout);
         
-        log.debug("ERROR" + ": debug");
-        log.info("ERROR" + ": info");
-        log.warn("ERROR" + ": warn");
-        log.error("ERROR" + ": error");
-        log.log(Log.CRIT, "ERROR" + ": crit");
-        _context.logManager().shutdown();
-        
-        String l1 = in.readLine();
-        String l2 = in.readLine();
-        
-        assertTrue(
-            l1.matches(".*ERROR: error") &&
-            l2.matches(".*ERROR: crit")
-        );
+        try {
+            log.debug("ERROR" + ": debug");
+            log.info("ERROR" + ": info");
+            log.warn("ERROR" + ": warn");
+            log.error("ERROR" + ": error");
+            log.log(Log.CRIT, "ERROR" + ": crit");
+
+            // Wait for the LogWriter to flush, then write extra stuff so
+            // the test doesn't hang on failure
+            try { Thread.sleep(12*1000); } catch (InterruptedException ie) {}
+            for (int i = 0; i < 2; i++)
+                 pout.println("");
+            pout.flush();
+            String l1 = in.readLine();
+            String l2 = in.readLine();
+        
+            assertTrue(
+                l1.matches(".*ERROR: error") &&
+                l2.matches(".*ERROR: crit")
+            );
+        } finally {
+            System.setOut(systemOut);
+            pout.close();
+        }
 
-        System.setOut(systemOut);
     }
 
     public void testCrit() throws IOException {
@@ -228,21 +264,29 @@ public class LogSettingsTest extends TestCase {
         
         System.setOut(pout);
         
-        log.debug("CRIT" + ": debug");
-        log.info("CRIT" + ": info");
-        log.warn("CRIT" + ": warn");
-        log.error("CRIT" + ": error");
-        log.log(Log.CRIT, "CRIT" + ": crit");
-        _context.logManager().shutdown();
-        
-        String l1 = in.readLine();
-        
-        assertTrue(
-            l1.matches(".*CRIT: crit")
-        );
+        try {
+            log.debug("CRIT" + ": debug");
+            log.info("CRIT" + ": info");
+            log.warn("CRIT" + ": warn");
+            log.error("CRIT" + ": error");
+            log.log(Log.CRIT, "CRIT" + ": crit");
+
+            // Wait for the LogWriter to flush, then write extra stuff so
+            // the test doesn't hang on failure
+            try { Thread.sleep(12*1000); } catch (InterruptedException ie) {}
+            pout.println("");
+            pout.flush();
+            String l1 = in.readLine();
+        
+            assertTrue(
+                l1.matches(".*CRIT: crit")
+            );
+        } finally {
+            System.setOut(systemOut);
+            pout.close();
+        }
 
-        System.setOut(systemOut);
     }
 
     
-}
\ No newline at end of file
+}
diff --git a/history.txt b/history.txt
index 187b3623a705cd8a2616608912804153dc04f42a..b552cc43e39abeae5f68bdbd891ee6d9413dce40 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,311 @@
+* 2011-05-16  0.8.6 released
+
+2011-05-13 zzz
+    * Increase min floodfills; decrease min routerinfo expiration
+
+2011-05-11 zzz
+    * Use partitions of fast tier for various hops of client tunnels
+
+2011-05-06 zzz
+    * Tunnels and profiles:
+      - Increase max fast and high-cap tier sizes
+      - Slow profile eval cycle after sufficient uptime
+      - Fix bug which started a new build after a successful build
+      - Misc. cleanups
+
+2011-04-28 zzz
+    * Console: Try to prevent cascaded IllegalStateExceptions in .jsp code;
+      add logging for original error
+    * peers.jsp: Tag UPnP strings
+    * UPnP: Strip trailing nulls from incoming XML to prevent
+      "content not allowed in trailing section" exceptions
+
+* 2011-04-18  0.8.5 released
+
+2011-04-11 zzz
+    * Console: Hide iframe on mobile browsers
+    * DataHelper: Speed up eq() (Ticket #437)
+    * HTTPServer: Strip inbound X-Accept-Encoding header
+    * netdb.jsp: HTML fixes
+    * Plugins: Log error when console server not found
+    * Reseed: Log tweak
+
+2011-04-02 m1xxy
+    * routerconsole, i2psnark, ...  I2P ahora también en español: ¡Bienvenidos los hispanohablantes!
+      - routerconsole, i2ptunnel, i2psnark, SusiDNS, Susimail fully translated into Spanish
+        (thx to PunkiBastardo and user)
+    * routerconsole, i2psnark, ...  
+      - French translations completed by magma
+      
+2011-03-22 zzz
+    * Handle GNU JRE returning Long.MAX_VALUE for max memory
+    * i2ptunnel: HTML fixes
+
+2011-03-20 zzz
+    * Console: Remove cache directives
+    * i2psnark: Fix peers stuck at uninteresting after metainfo fetch
+    * i2ptunnel: Change all clients to 3 hops by default (new installs only)
+    * Profiles:
+      - Nicer profile dump
+      - More efficient profile lookup for display
+      - Fix dumpprofile NPE
+      - Change file suffix from .dat to .txt.gz
+      - Set firstHeardAbout on creation
+    * Rate: Fix equals()
+    * Recognize links and links2 as text browsers
+
+2011-03-12 zzz
+    * Blocklist: Add bogons since they won't change any more
+    * BuildHandler: Loop double-check
+    * Console:
+      - Fix HTML errors in form message box,
+        logs.jsp, netdb.jsp, profiles.jsp, stats.jsp,
+        configpeer.jsp, configtunnels.jsp, configupdate.jsp
+      - ngettext cleanups
+    * LogWriter: Prevent NPE after permissions fail
+
+2011-03-11 duck
+    * Susimail: translation support, including dutch translation.
+
+2011-03-10 zzz
+    * configclients.jsp: Split form up, fix HTML warnings
+    * configui.jsp: Fix lang setting broken by previous nonce change
+    * Console: Consolidate nonce handling
+    * eepget: Don't send X-Accept-Encoding header to proxy (ticket #422)
+    * logs.jsp: Fix NPE (ticket #430)
+    * netdb.jsp: Fix table alignment
+    * Tunnel Preprocessor: Use entropy for padding more efficiently
+
+2011-03-08 zzz
+    * Clock: Cleanups and javadocs
+    * Console:
+      - Parameterize download button tags (ticket #425)
+      - Clean up summary bar HTML warnings
+      - Just display a summary bar link for text browsers
+      - Move welcome div from the readme files to index.jsp
+      - Require a nonce to change language
+    * EepGet: Cleanups and javadocs
+    * i2psnark:
+      - More efficient metainfo handling, reduce instantiations
+      - Improved handling of storage errors
+      - Improved handling of duplicate file names
+      - More metainfo sanity checks
+      - Metadata transfer error handling improvements
+      - Code cleanup, remove dead and duplicated code
+    * Reseed: Use the reseeder as a clock source
+
+2011-03-02 zzz
+    * BuildHandler:
+      - Limit request queue size
+      - Concurrent request queue
+      - Remove dead code for queued reply handling
+    * OutNetMessage: Remove dead code
+    * Tunnel cleanups, final, javadoc
+
+* 2011-03-02  0.8.4 released
+
+2011-02-27 zzz
+    * Console:
+      - Fix numerous readme HTML errors
+      - Fix flag locations in readmes
+      - desktopgui.enable now defaults to false; run systray if false
+      - Start icon app before console
+      - Restore systray form in configservice.jsp
+      - Only save lang when clicking on flags if desktopgui is running
+      - Only allow two-letter lang code from cgi parameter
+    * Reseed: Disable HTTPS until we have enough working hosts again
+
+2011-02-24 zzz
+    * i2psnark:
+      - Fix delete and remove buttons for Opera and w3m
+      - Stop torrent if no valid trackers
+      - Fix war build dependencies
+
+2011-02-23 zzz
+    * BuildHandler:
+      - Lower participating throttler max limit
+      - Cleanups and loop checks
+    * Console: Fix summary bar HTML error
+
+2011-02-22 zzz
+    * BuildHandler: Prelmiinary participating tunnel throttler
+    * I2PTunnel:
+      - Add spellcheck=false to textareas
+      - Fix HTML error in 503 error page
+
+2011-02-19 zzz
+    * I2PTunnel: Fix standalone server tunnels
+                 http://forum.i2p/viewtopic.php?t=5376
+    * Plugins: Fix signature verification if router.config specifies
+               trustedUpdateKeys (ticket #416)
+
+2011-02-18 Mathiasdm
+    * Desktopgui now has an option to be disabled (desktopgui.enabled)
+
+2011-02-17 zzz
+    * Build:
+      - Add includeAntRuntime=false to all javac targets
+      - Add build date, mtn rev, and changed file list to all manifests
+      - Add unless=uptodate to all jar and war targets
+        (bob and dtg still todo)
+    * Console: Add Arabic
+    * i2ptunnel: outproxy2 -> outproxyng (Ticket #394 take 2)
+
+2011-02-15 zzz
+    * i2psnark: Details link shuffle, mostly restore 0.8.3 behavior
+    * Profiles: Punish rejections more, in an attempt to spread the
+                load more through the network
+    * Timers: Log cleanup
+
+2011-02-14 Mathiasdm
+    * Fix headless issue without reboot
+
+2011-02-13 zzz
+    * Connect Client: Minor NPE fix cleanup
+    * JobQueue: Prevent NPE at shutdown (thanks liberty)
+    * GeoIP: Prevent startup NPE (ticket #413, thanks RN)
+    * NetDB: Prevent ExpireLeaseJob NPE (thanks sponge)
+
+2011-02-11 Mathiasdm
+    * routerconsole: fixed graphs using jrobin; and headless issue
+          in general: no more switches between headless and non-headless.
+
+2011-02-11 sponge
+    * I2PTunnel: fix NPE in I2PTunnelConnectClient
+
+2011-02-10 sponge
+    * I2CP: fix NPE in QueuedClientConnectionRunner
+
+2011-02-10 zzz
+    * I2CP: Correctly close internal connections on the router side
+            when closed by the client, was causing massive memory leak
+            for internal clients using lots of sessions (thanks sponge)
+            (ticket #397)
+    * i2psnark:
+      - Improved magnet link parsing, use tr parameter if present
+    * i2ptunnel: Change shared clients default for new clients to false
+    * Streaming: Don't use iter.remove() on a COWAS
+
+2011-02-09 sponge
+    * BOB: fixup delivery in config, adds config file versioning.
+    * I2CP: Fix most of the I2CP leaks. Two leaks remain, but they are small.
+            net.i2p.internal.QueuedI2CPMessageReader and
+            net.i2p.router.client.I2CPMessageQueueImpl
+            are the two remaining leaks.
+
+2011-02-07 zzz
+    * i2psnark:
+      - Check for dup magnet torrent when adding torrent file
+      - Add exotrack.i2p (ticket #403)
+      - Disable spellcheck in textarea
+    * i2ptunnel: Generate error message when i2ptunnel.config save fails
+                 (ticket #404)
+
+2011-02-06 zzz
+    * i2psnark: Fix maggot links, and magnet links with trailing parameters (thx user)
+
+2011-02-05 zzz
+    * .mtn-ignore: New, to make it harder to check in stuff you shouldn't
+    * BOB: Drop checked-in build dir
+    * i2psnark:
+      - Big refactor to support torrents where only the infohash is known
+        (i.e., added by magnet links)
+      - Big refactor to use accessors instead of public fields
+      - Add support for metadata transfer (BEP 9) via the
+        extension protocol (BEP 10)
+      - Add support for adding torrents via standard magnet links (BEP 9)
+        and "maggot" links (http://sponge.i2p/files/maggotspec.txt)
+      - Add support for peer exchange (i2p_pex)
+      - Add stubs for future DHT support (BEP 5)
+      - Add more information on torrent details page;
+        add details page for single-file torrents
+      - Make filename filtering consistent (ticket #368)
+      - Fix add-torrent locking (ticket #371)
+      - Fix opentracker configuration
+      - Add several connect-to-self checks
+      - Add support for using new I2CP bandwidth limiter
+      - Add support for using new in-session I2CP naming lookups
+      - Don't expire outbound Piece messages, since we now defer loading the
+        data from disk
+    * i2ptunnel:
+      - Change connect proxy default to outproxy2.h2ik.i2p (ticket #394)
+      - IRCClient: Use tunnel log instance
+      - Server: Full queue log tweak
+
+2011-02-03 zzz
+    * Build:
+      - Remove dup flag files (ticket #316)
+      - Remove BOB dependency on i2ptunnel
+    * Console: Add DTG to classpath for old installs
+    * I2PTunnel: Fix NPE
+    * RandomSource: Fix seeding from /dev/urandom
+    * Reseed: Limit time spent downloading from a single source
+
+2011-02-02 sponge
+    * BOB: Revise lookup code, bump BOB version
+
+2011-01-31 zzz
+    * Console: Put all socket handlers in same thread pool,
+               set min/max threads and idle timeout
+    * Context: Fix properties init
+    * DataStructures:
+      - Cleanups
+    * DecayingBloomFilter, DecayingHashSet: Cleanups and speedups
+    * Findbugs: Lots of cleanups
+    * I2CP:
+      - Add experimental bandwidth limiter
+      - Add I2PSession API method to update tunnel and bandwidth
+        configuration on an existing session
+      - Filter more system properties before passing them to the router
+      - Start work on passing per-message flags to the router via I2CP
+    * I2PAppContext: New getProperties() method
+    * i2ptunnel:
+      - Use context properties as defaults
+    * NetDB, DatabaseStoreMessage:
+      - Convert everything from DataStructure to the
+        new DatabaseEntry superclass
+      - Optimizations made possible by DatabaseEntry
+      - Don't rescan netDb directory unless changed
+    * OCMOSJ:
+      - Don't send expired messages
+      - Clean up stat init
+    * PeerManager: Make calculators static, take out of router context
+    * Router:
+      - Add new RandomIterator, use in UDP, peer selector,
+        profile organizer
+      - Add a stat to monitor peer selector run time
+    * RouterContext: Clean up clock overrides
+    * Streaming:
+      - Add new real sockets for easier porting of apps.
+        See http://zzz.i2p/topics/792 for info. Untested.
+      - Case cleanups
+      - Javadoc
+
+* 2011-01-24  0.8.3 released
+
+2011-01-16 zzz
+    * Console: Allow editing of console args
+    * UDP: Prevent rare startup NPE
+    * UPnP:
+      - Change all log errors to warns (tickets #76, #95, #120)
+      - Double socket soTimeout to 2 seconds
+
+2011-01-15 zzz
+    * Console: Add some HTTP headers in the view servlets
+
+2011-01-12 zzz
+    * Log: Fix rare initialization problem
+    * PrivateKey: Fix hashCode()
+
+2011-01-09 zzz
+    * DataHelper: Speed up and annotate sortStructures()
+    * Data Structures: More caching improvements, don't cache where we shouldn't
+    * NetDB: Don't rescan netDb directory unless changed,
+             to reduce Hash cache thrash (backport from test4)
+    * RouterInfo:
+      - Don't cache byteified data by default, to save ~1.5 MB
+      - Don't create empty peers Set, to save ~100KB
+
 2011-01-07 zzz
     * Data Structures: More caching
     * i2psnark: Improve request tracking to reduce memory usage
diff --git a/installer/install.xml b/installer/install.xml
index 5b685f0a358a4b6c511d1e6af9b9b756ebf1e500..4c0e9057e6facb955a666df0a7dba85cab8fea8c 100644
--- a/installer/install.xml
+++ b/installer/install.xml
@@ -4,7 +4,7 @@
 
     <info>
         <appname>i2p</appname>
-        <appversion>0.8.2</appversion>
+        <appversion>0.8.6</appversion>
         <authors>
             <author name="I2P" email="http://forum.i2p2.de/"/>
         </authors>
@@ -105,13 +105,14 @@
     <panels>
         <panel classname="HelloPanel"/>
         <panel classname="InfoPanel"/>
+        <panel classname="PacksPanel"><os family="windows" /></panel>
         <panel classname="TargetPanel"/>
-        <panel classname="InstallPanel"/>
         <panel classname="ShortcutPanel"><os family="windows" /></panel>
         <!-- <panel classname="ProcessPanel"><os family="windows" /></panel> -->
         <!-- unix|mac doesn't work, displays for windows too -->
         <panel classname="XInfoPanel" ><os family="unix" /></panel>
         <panel classname="XInfoPanel" ><os family="mac" /></panel>
+        <panel classname="InstallPanel"/>
         <panel classname="SimpleFinishPanel"/>
     </panels>
 
@@ -178,6 +179,32 @@
                 <args><arg value="$INSTALL_PATH" /></args></executable>
 
         </pack>
+
+        <pack name="Windows Service" required="no">
+            <description>Automatically start I2P in the background</description>
+            <os family="windows" />
+            <executable targetfile="$INSTALL_PATH/set_config_dir_for_nt_service.bat" stage="postinstall" failure="warn" keep="false" />
+<!--
+-->
+            <executable targetfile="$INSTALL_PATH/install_i2p_service_winnt.bat" stage="postinstall" failure="warn" keep="true">
+                <args>
+                    <arg value="$INSTALL_PATH\wrapper.config" />
+                    <arg value="--nopause" />
+                </args>
+            </executable>
+            <executable targetfile="$INSTALL_PATH/I2Psvc.exe" stage="postinstall" failure="warn" keep="true">
+                <args>
+                    <arg value="-t" />
+                    <arg value="$INSTALL_PATH\wrapper.config" />
+                </args>
+            </executable>
+            <executable targetfile="$INSTALL_PATH/uninstall_i2p_service_winnt.bat" stage="uninstall" failure="warn" keep="true">
+                <args>
+                    <arg value="$INSTALL_PATH\wrapper.config" />
+                    <arg value="--nopause" />
+                </args>
+            </executable>
+        </pack>
     </packs>
 
 </installation>
diff --git a/installer/resources/blocklist.txt b/installer/resources/blocklist.txt
index 99570520c1a983e55e56f914336e6298d85cc310..6108d17823bfe6696176800443cc05729f78b8e7 100644
--- a/installer/resources/blocklist.txt
+++ b/installer/resources/blocklist.txt
@@ -4,7 +4,8 @@
 # edit the file in the configuration directory, NOT the install directory.
 #
 # Blocking is now enabled by default.
-# To disable blocking, set router.blocklist.enable=false on configadvanced.jsp and restart.
+# To disable blocking, set router.blocklist.enable=false on configadvanced.jsp,
+# or simply delete this file or remove all the entries below, and restart.
 #
 # Add additional entries as desired, sorting not required.
 # This file is only read at router startup.
@@ -14,8 +15,8 @@
 # For example, http://www.bluetack.co.uk/config/splist.zip is very broad and includes Tor users, it is not recommended.
 # A more reasonable list: http://www.bluetack.co.uk/config/level1.zip
 #
-# You may also wish to add the bogons from http://www.cymru.com/Documents/bogon-list.html ,
-# but you will have to update your blocklist manually as IP ranges are assigned.
+# We have included the bogons from http://www.team-cymru.org/Services/Bogons/http.html ,
+# but you will have to update your blocklist manually if the bogon list changes.
 # You must update this list yourself, it is not overwritten by the update process.
 #
 #   * Acceptable formats (IPV4 only):
@@ -34,7 +35,19 @@
 #   * For further information and downloads:
 #   *   http://www.bluetack.co.uk/forums/index.php?autocom=faq&CODE=02&qid=17
 #   *   http://blocklist.googlepages.com/
-#   *   http://www.cymru.com/Documents/bogon-list.html
+#   *   http://www.team-cymru.org/Services/Bogons/http.html
 #
 Chinese Floodfill Flooder:159.226.40.7
 Friend of the Chinese Floodfill Flooder:159.226.40.3
+<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:0.0.0.0/8
+<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:10.0.0.0/8
+<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:127.0.0.0/8
+<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:169.254.0.0/16
+<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:172.16.0.0/12
+<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:192.0.0.0/24
+<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:192.0.2.0/24
+<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:192.168.0.0/16
+<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:198.18.0.0/15
+<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:198.51.100.0/24
+<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:203.0.113.0/24
+<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:224.0.0.0/3
diff --git a/installer/resources/certificates/forum.i2p2.de.crt b/installer/resources/certificates/forum.i2p2.de.crt
new file mode 100644
index 0000000000000000000000000000000000000000..e28b1cc59fcb1ce9069737b490ca4e3abe83e891
--- /dev/null
+++ b/installer/resources/certificates/forum.i2p2.de.crt
@@ -0,0 +1,30 @@
+-----BEGIN CERTIFICATE-----
+MIIFLDCCAxQCCQDLNmFBp0hvZzANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJV
+SzEPMA0GA1UECBMGTG9uZG9uMQwwCgYDVQQKEwNJMlAxEjAQBgNVBAsTCVRoZSBG
+b3J1bTEWMBQGA1UEAxMNZm9ydW0uaTJwMi5kZTAeFw0xMDEyMTkxNTAzNTJaFw0y
+MDEyMTYxNTAzNTJaMFgxCzAJBgNVBAYTAlVLMQ8wDQYDVQQIEwZMb25kb24xDDAK
+BgNVBAoTA0kyUDESMBAGA1UECxMJVGhlIEZvcnVtMRYwFAYDVQQDEw1mb3J1bS5p
+MnAyLmRlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4y3yMKKnJZ6I
+Q/f6e+e6LgsGGMWvpa8+EqQKMR4UH3n+8olwTdUqMx3XnyXhmeSYA8idpF+7Izdj
+y/z/2UXZWJM5eEl3OER7Uv64CStr8Q1Xdq7Zg+4nomnWrCDv7pDVgwUlIplctFDk
+uPijXdfgs8xHERR20DmgBGMIW9U+gkyCfcqis9OOcsV8xgFMqAqaGRyPnHW4WGR6
+93IVFavox8nWDy0KhY4TL3DDV1uEeaQqF9F97k1nQxSepH1yR23qB3Nta7E3OsHZ
+7uwU/cBcNxGag1HsfXufPub0pay9jc8anXT3Ip5OFYpTaUjpYVRBq9m1VW+BUJiV
+ir06wRiPLx5/rAVtsWquuyEn4Ou9kXnil3Lenq8IHfv3yEHq7EMQm7AgK8brSVRb
+PyUXGOpgC/jfDydXDh4Dc0jJ2O6czk1U5BZcIxAHJ+x3t/vE4ks2tPLlJUoQ/lMt
+3fn2u9jWY/eZMOe/V1lkEbGc4Vi6qrJoI6VIESwsgFmV7R9g4C1e3cAmbRMINV5r
+0SAJ2pwzO+rSgVTnYd3Hq3GzvC1MmJd8tme3WVZVggLQbOaeLnzAKmX9ktfA4VUl
+kGUIixnL0K96u5iAoH9bwwbirWRHnfmY1HnmQXidSmDj9clSrsrD64VYwv6ACy5b
+wkb/XPtXzx/b9Pr6Co79141eqT9ArtECAwEAATANBgkqhkiG9w0BAQUFAAOCAgEA
+1oaksgeb8eqVH17+lkIr1cs43jA1rMJ2ogYdLxodrwtGzniv7pGpv/MNMFQ6rN9a
+dGwJKm1mo/uOpsPBIcSSScZA4ER7RWMXbuR+vIGpmjO6RMr0sjRLoc7VoK9NBP02
+AcudKm9/6dQ2X46oByUCqaTk0INQkWWOOX4M8GXqXFuEle1aZF6KC2wytxdzspyA
+BpE+7xbV68DAdE3FbZuowjHcWlebaDp1JBFj1H1WwLGC0gyIwIevxPft6eW0Z5m2
+p3B4EDG6ZChurBjng9bcMBJNqRFWo0Zo2FfdyLkFRYOtGzhWUgjLJqkEJsLC3Gpx
+83y2fXQ0qdxY6yNuwoZSXEX0vLQPJbVvB3Apcmjc2Q0xg+CkONP6S+D6eziRcqyh
+LaRLWKNELUB7ikWj1IpDmAb/dZ/zaL51rqCqwN4glebAg2HWqzFm/MNT7YfTKI4+
+/QC7812Tcge8j+/368dmbfcQqOMB+nQha1YpNw5i+cUgKW4HJMwuoSGEaDQ9NLg6
+JH110OAwLL5tCwbgRlC+Cr1zTtwHkq1NRk3eIjAlz6HKsSos0IBxW8m0TLvrsHKE
+/3B9w2hv+20k24ND1hiCYv4ShghpAeaaJEs0Rb1Km/jgH9jeHSRUBzpZYAhkKIzr
+PlrC0DfYlSLTdTJ3MTx9gXyK8RqSh16M+tTvoQ0zEl8=
+-----END CERTIFICATE-----
diff --git a/installer/resources/eepsite.help/help/lib/cn.png b/installer/resources/eepsite.help/help/lib/cn.png
deleted file mode 100644
index 89144146219e6fbec7eaa89e1bf4b073d299569e..0000000000000000000000000000000000000000
Binary files a/installer/resources/eepsite.help/help/lib/cn.png and /dev/null differ
diff --git a/installer/resources/eepsite.help/help/lib/de.png b/installer/resources/eepsite.help/help/lib/de.png
deleted file mode 100644
index ac4a977362738ca7daa20784717f10f9617136b4..0000000000000000000000000000000000000000
Binary files a/installer/resources/eepsite.help/help/lib/de.png and /dev/null differ
diff --git a/installer/resources/eepsite.help/help/lib/es.png b/installer/resources/eepsite.help/help/lib/es.png
deleted file mode 100644
index c2de2d7111e3cb59cf6511dd2ab045e824bdb43e..0000000000000000000000000000000000000000
Binary files a/installer/resources/eepsite.help/help/lib/es.png and /dev/null differ
diff --git a/installer/resources/eepsite.help/help/lib/fr.png b/installer/resources/eepsite.help/help/lib/fr.png
deleted file mode 100644
index 8332c4ec23c853944c29b02d7b32a88033f48a71..0000000000000000000000000000000000000000
Binary files a/installer/resources/eepsite.help/help/lib/fr.png and /dev/null differ
diff --git a/installer/resources/eepsite.help/help/lib/ir.png b/installer/resources/eepsite.help/help/lib/ir.png
deleted file mode 100644
index c5fd136aee534ecb59914e336cad18d18ead2a4a..0000000000000000000000000000000000000000
Binary files a/installer/resources/eepsite.help/help/lib/ir.png and /dev/null differ
diff --git a/installer/resources/eepsite.help/help/lib/it.png b/installer/resources/eepsite.help/help/lib/it.png
deleted file mode 100644
index 89692f74f051cd43503744c3dab65c8ba773b7e2..0000000000000000000000000000000000000000
Binary files a/installer/resources/eepsite.help/help/lib/it.png and /dev/null differ
diff --git a/installer/resources/eepsite.help/help/lib/jp.png b/installer/resources/eepsite.help/help/lib/jp.png
deleted file mode 100644
index 325fbad3ffd3075a4a84d8d898ad26ef7d3e0d56..0000000000000000000000000000000000000000
Binary files a/installer/resources/eepsite.help/help/lib/jp.png and /dev/null differ
diff --git a/installer/resources/eepsite.help/help/lib/nl.png b/installer/resources/eepsite.help/help/lib/nl.png
deleted file mode 100644
index fe44791e32b790949b0317ab3c258864b9024ebe..0000000000000000000000000000000000000000
Binary files a/installer/resources/eepsite.help/help/lib/nl.png and /dev/null differ
diff --git a/installer/resources/eepsite.help/help/lib/ru.png b/installer/resources/eepsite.help/help/lib/ru.png
deleted file mode 100644
index 47da4214fd9edb383687c1d4f84fe8b42a51ceb2..0000000000000000000000000000000000000000
Binary files a/installer/resources/eepsite.help/help/lib/ru.png and /dev/null differ
diff --git a/installer/resources/eepsite.help/help/lib/se.png b/installer/resources/eepsite.help/help/lib/se.png
deleted file mode 100644
index 1994653dac1fc1c6ee3c9fcb35c8af97f16eefc7..0000000000000000000000000000000000000000
Binary files a/installer/resources/eepsite.help/help/lib/se.png and /dev/null differ
diff --git a/installer/resources/eepsite.help/help/lib/us.png b/installer/resources/eepsite.help/help/lib/us.png
deleted file mode 100644
index 10f451fe85c41c6c9a06d543a57114ae2f87ecc1..0000000000000000000000000000000000000000
Binary files a/installer/resources/eepsite.help/help/lib/us.png and /dev/null differ
diff --git a/installer/resources/hosts.txt b/installer/resources/hosts.txt
index 3af2337760169f14e22f9c95dafe56e90390ca05..594d4d8d6f7ba3e64c6e65899223b3104633e4fd 100644
--- a/installer/resources/hosts.txt
+++ b/installer/resources/hosts.txt
@@ -323,4 +323,7 @@ outproxy.h2ik.i2p=Wa-LfCQjQBcJVItWynp6NWNnjbCDNAD9HJl2v6koEq3B3nGfID7Xxbyq17h9mY
 trac.i2p2.i2p=24SmhWiRDm-GzpV5Gq2sXhuvPpa1OihY7rkxQO4aHy5qKjr6zmEnZ3xQXdkFJJ0Z1lKy73XRmgCyys02G25Hl3cuxlZ2fNbp6KhOzlRKpOIAWFdSWZNF4Fp7sos0x-a-9fxOWnwwQ9MFcRYwixE~iCZf4JG~-Pd-MHgAuDhIX0P3~GmfUvo~9xPjof1ZsnaOV1zC0XUkHxZA5D6V0Bse~Ptfb66lPNcgBxIEntCStBAy~rTjaA3SdAufG29IRWDscpFq1-D4XPaXHnlXu7n7WdpFEM8WWd3ebUMqnq8XvLL1eqoWYzKCe3aaavC3W6~pJp8cxKl2IKrhvSFatHZ0chRg3B4~ja1Cxmw1psisplSkJqMnF921E6pury0i6GH52XAVoj4iiDY~EAvqDhzG-ThwlzTs~2JKzslwxOrD2ejd-dcKdi4i9xvi2JQ4Ib2Mw2ktaQhuAw3Y9EkqAs7oriQQN8N8dwIoYkJLfvh7ousm0iKJJvMt3s55PccM46SoAAAA
 i2plugins.i2p=7oQz2gHOxFXxXTI6uGMk1Giv9UmviBhbubWKDjDqW1Rxvmm55tvC1znaAAZoV0X6YPd9aubYwsvfXAYatPHY1eehlELe3XdrgzqWvj566j62gv8atxhJQHjbaWqF-ZvntYRefVRFJ49sPi~MmAv5EBoSUKGuVu~8Bw-nKlCEhL7PLRdzA98515U5cFC6-srI2poZiWJ35rfbIqbEOLbECC4HbTedXv2PbRyukCiGrU-wPx4GnfSSaMeYMTAtHOf0IiYEKPSExjWkovgWbnCQaBzP4M-fAKIkSIMuOF8T4wmGaGESLCgiHukDoiiXmsTRm3cNeotm-BXncF~tft8sL4OB9cV-SeOtgkgIsaoO1JpQ1ACdtgOzlIB6H032jpuMQ5U9u1OQbTS8CtdRIlBv7Zcd6621MI2KGXLldHpcMs5hecbqctit~it5lB-wSkG6lllT2ZXBn8Yxeu8xo6kdrZ4bkolBYPEH1RPxiCj9GEchhUSPi75dkgb-vgoMnSMgAAAA
 i2pbote.i2p=~taSfBfeiMM5fW~qwUGZr4kAXmSoentWVjlQhTCKWhVj04KV34tLguNQEpHb1cA2eIwlkTpY0TPYUVKt866jLgQEteuIImmNuStVgm6DWh4baPqI22oSNC7O-4EW6PJy1tT9nr1NXu5p4w2jY4P4Css76xthaf6Z5YUOWAIwnMlptyac-qFHmjmU3CFqvKQgBnA4NB0ts7Y2~TcvciANllfsjfsMgFdg--FYpKiwC8bSsTHKJ3~oGb6osMqql~Vzr6kvIzfLnvabbuW8wjG2JvATBuJ3IY-BN59KdT84nc00SuMgmt1ywVvHOl0~n8Cjr1hASYiJ2FTxEQRbQ9WRaxbnk5BO~yeiedCsjw7ImsSES3GzcU5zVVx9p3bgx7P~X0h52VripL6bovj9YJznN3qw0eRCJGjY-du8azFNV6~6ZZ6ss14RNC~HKIzlhR7F5kF~4H2wfC1EdNlmm1cI0iYRdEdwSSVX47LngHyK-ZQbVZOGeEeCU8J8Vhk~8WdLAAAA
-planet.i2p=W0omtMApOdlTkgJoct08QnzDkeb~xc60df5Cx3k3qqOFmyEkRB65NdpSdvldI5STmXmXlZe68f8Hu1dfBMmKvfpBFMpP-mRVYuHbEa4N1dRkp3AOswZFO51lSC~MVPMZKGHAv0cfv5WFaJ9nfuaR7iYYWJF11xotoPTMbJdB-I3XPC8rxHI-73ATlOD4cU9oZ6BYcBE0dun9zw4IHBcRpnFRx~s-TkevNfPnBqujB-NNgA8a5s~QUj0h3FwwUWsNB8f1Uwy~DwoQh7pMp6dsZ3umEyBn2HaXZasSmbzB30qkQRs9vrAtIFdIzCQ~8gI2cHdHEPgExUQX~xlM8QZEgnLXSfS93asWPdpitv~KT7bO-35BgTBdCozHTCcvys6bYJ24UnkFVBE0D2L0t98neelWkJSaEU0QzxdRphoCZY8OABQIaS4qw6PEFD1Un1vxNCh~TDFWcYBZ3Rqsc~ISW0wF7oOS6-DPT3q5O8cGLc8iAEdRchrU9XyAHAKVlEZxAAAA
\ No newline at end of file
+planet.i2p=W0omtMApOdlTkgJoct08QnzDkeb~xc60df5Cx3k3qqOFmyEkRB65NdpSdvldI5STmXmXlZe68f8Hu1dfBMmKvfpBFMpP-mRVYuHbEa4N1dRkp3AOswZFO51lSC~MVPMZKGHAv0cfv5WFaJ9nfuaR7iYYWJF11xotoPTMbJdB-I3XPC8rxHI-73ATlOD4cU9oZ6BYcBE0dun9zw4IHBcRpnFRx~s-TkevNfPnBqujB-NNgA8a5s~QUj0h3FwwUWsNB8f1Uwy~DwoQh7pMp6dsZ3umEyBn2HaXZasSmbzB30qkQRs9vrAtIFdIzCQ~8gI2cHdHEPgExUQX~xlM8QZEgnLXSfS93asWPdpitv~KT7bO-35BgTBdCozHTCcvys6bYJ24UnkFVBE0D2L0t98neelWkJSaEU0QzxdRphoCZY8OABQIaS4qw6PEFD1Un1vxNCh~TDFWcYBZ3Rqsc~ISW0wF7oOS6-DPT3q5O8cGLc8iAEdRchrU9XyAHAKVlEZxAAAA
+exotrack.i2p=Ly1vs4plBuGisqlMiQOjhVkXFZPBMy9joSCrus~tuLXBRXDrPYG9WXJMzY4gb3LiW0VVawv0kLgikX8eeeruXmgKwQW5zB9UPSP0CQnXTRelE3Jn7lev~re4woHvgS-EGBwWikxqXF3f7W8-LhieI0JhBZxItiWhJJME07oncW0kgS8UIMl0wqN2Y-p0sryFCN056TfGNTXigfxrSLqKnpi6a2OyEkF62qvRID3qXzRque0vKQjqvavq2mqxjFrSgLUoyKod5h9Px6qK08gtoAyDKMLPk7fPgReYKj6awiOxRSGfsMpZD3~ZuV0Sts2XtCau3S3myYMIDe5oKziPtZRIej4KBDxT0YYIw5v4RoqzqF88gNgHDfkPZ25JKTOt5xGcPTG8kwYrtx39PX6NrJmv-I~LUz6sZZlIW24k1qbO7zBxZ6mazldQY1~FJGXzn5MNzsxp44iOZdMDJJh18N0Psthk2hqlQOS4L0Ss1Odm1czhBxf1Y~j3L-QsMttcAAAA
+outproxyng.h2ik.i2p=1RqMQd58RgA4D~XT34rCjQteJVQwFKQbPK5P03GetL-DyCfKV6Vg61xyxGOZK-K4KTXXf45PG~oDAWIzE7UY5aXN9oAjHXfPrU9hHxv35BaxFqUpsJLgjWu41OwSjl5aN2-freH4gGVSiL62I1y2bcXHc2kVHlbToQOy8bJoS3KSDHEeU0r79f~cY3xf6rBHpHNMJtdYdnWlLq5KFc2cz~8lIut~sSIAwUEfebBkhfl2ctvdEGdSshBWGTxXiahtQX0xraynF-Cex2hxvBAl0g9aoOnrLx~Gses54WPD-m3RArI3fiaxEALRuFa0mfrrEgjOhBtVU8IlTYrTEkR8JSGofsEmuqqM03FIrwOv6lJZi-xemiNUr3OX6VdO4ckIg69BxpCYzP2IxLO5r8lSwyHqGbYPFxBIjbSMsv6tGWWdglV4Y9sQHTarboA-XDih3DzDpomb1~78cSiV3PRidjj4MDggn1abkQbRVd6WLV~eTi54bctS-JwW-I5Xyqq~AAAA
+inr.i2p=GGB99wXYBnX-wOxQ~Xrvo7AvngoYgifvZZL54ksZWzclcirG7AysqfkAKyv906PxfM4y2DcN2K9m4-D99yFj-1BdnUuIEqfi2yuaaVoWuOffT3h9ne~kZnq3C-wrmczD70Gxk4shvSVxMdUEFvEip8QY4K0R-FiKBsFAfWGTE3b9d-QCzP0H9VP5V-CaYjYVQuMRgMluk9gnoLRipvV7483f~rmGgYX8xwygEAQ3v9P4hrAlJrP0lWJLI1K6KQucP3THIxZ4A9Xxnl0I7EZAT8bHwzschFrcDPYM~DtQdkJTz2VphocbNLfIExTrFt88-xC69WE-fSbaMf9jucT4f5kdpfpRu0kM~am40etxPs8uXGF-L9IXCjgUkJHrWdPHeGhnx-ye2xvUTLO2jyga8iY89Ee3IpqivVUg-iAQJzX9NXC29sf0YzNj8d8mdWRNuzbLSx9CVJ3l1NPJr4k7hmCqf8lBGXNIFZQL4Wez1PPcM4gw0o73gqIxkxvVzVcpAAAA
diff --git a/installer/resources/i2ptunnel.config b/installer/resources/i2ptunnel.config
index ecb45b2067b3b51c66fa398cd46b945de915eeb3..0a7f3fe4015a8cbbd99d7feeb2b06a711360299e 100644
--- a/installer/resources/i2ptunnel.config
+++ b/installer/resources/i2ptunnel.config
@@ -21,6 +21,10 @@ tunnel.0.option.i2cp.reduceIdleTime=900000
 tunnel.0.option.i2cp.reduceOnIdle=true
 tunnel.0.option.i2cp.reduceQuantity=1
 tunnel.0.option.i2p.streaming.connectDelay=1000
+tunnel.0.option.inbound.length=3
+tunnel.0.option.inbound.lengthVariance=0
+tunnel.0.option.outbound.length=3
+tunnel.0.option.outbound.lengthVariance=0
 tunnel.0.startOnLoad=true
 
 # irc
@@ -44,6 +48,10 @@ tunnel.1.option.i2cp.reduceOnIdle=true
 tunnel.1.option.i2cp.reduceQuantity=1
 tunnel.1.option.i2p.streaming.connectDelay=1000
 tunnel.1.option.i2p.streaming.maxWindowSize=16
+tunnel.1.option.inbound.length=3
+tunnel.1.option.inbound.lengthVariance=0
+tunnel.1.option.outbound.length=3
+tunnel.1.option.outbound.lengthVariance=0
 tunnel.1.startOnLoad=true
 
 # I2P's mtn server
@@ -61,6 +69,10 @@ tunnel.2.option.outbound.nickname=shared clients
 tunnel.2.option.i2cp.reduceIdleTime=900000
 tunnel.2.option.i2cp.reduceOnIdle=true
 tunnel.2.option.i2cp.reduceQuantity=1
+tunnel.2.option.inbound.length=3
+tunnel.2.option.inbound.lengthVariance=0
+tunnel.2.option.outbound.length=3
+tunnel.2.option.outbound.lengthVariance=0
 tunnel.2.startOnLoad=false
 
 # local eepserver
@@ -94,6 +106,10 @@ tunnel.4.option.i2cp.reduceIdleTime=900000
 tunnel.4.option.i2cp.reduceOnIdle=true
 tunnel.4.option.i2cp.reduceQuantity=1
 tunnel.4.option.i2p.streaming.connectDelay=1000
+tunnel.4.option.inbound.length=3
+tunnel.4.option.inbound.lengthVariance=0
+tunnel.4.option.outbound.length=3
+tunnel.4.option.outbound.lengthVariance=0
 tunnel.4.startOnLoad=true
 tunnel.4.targetDestination=smtp.postman.i2p
 tunnel.4.type=client
@@ -112,6 +128,10 @@ tunnel.5.option.i2cp.reduceIdleTime=900000
 tunnel.5.option.i2cp.reduceOnIdle=true
 tunnel.5.option.i2cp.reduceQuantity=1
 tunnel.5.option.i2p.streaming.connectDelay=1000
+tunnel.5.option.inbound.length=3
+tunnel.5.option.inbound.lengthVariance=0
+tunnel.5.option.outbound.length=3
+tunnel.5.option.outbound.lengthVariance=0
 tunnel.5.startOnLoad=true
 tunnel.5.targetDestination=pop.postman.i2p
 tunnel.5.type=client
@@ -124,7 +144,7 @@ tunnel.6.type=connectclient
 tunnel.6.sharedClient=true
 tunnel.6.interface=127.0.0.1
 tunnel.6.listenPort=4445
-tunnel.6.proxyList=outproxy.h2ik.i2p
+tunnel.6.proxyList=outproxyng.h2ik.i2p
 tunnel.6.i2cpHost=127.0.0.1
 tunnel.6.i2cpPort=7654
 tunnel.6.option.inbound.nickname=shared clients
@@ -133,5 +153,9 @@ tunnel.6.option.i2cp.reduceIdleTime=900000
 tunnel.6.option.i2cp.reduceOnIdle=true
 tunnel.6.option.i2cp.reduceQuantity=1
 tunnel.6.option.i2p.streaming.connectDelay=1000
+tunnel.6.option.inbound.length=3
+tunnel.6.option.inbound.lengthVariance=0
+tunnel.6.option.outbound.length=3
+tunnel.6.option.outbound.lengthVariance=0
 tunnel.6.startOnLoad=true
 
diff --git a/installer/resources/icons/flags/ch.png b/installer/resources/icons/flags/ch.png
index 4e6fa9641e85e30b303edd6553096290bf0e4531..3fe13cab509b4dc01fd09daccc4bcf136c3dd9de 100644
Binary files a/installer/resources/icons/flags/ch.png and b/installer/resources/icons/flags/ch.png differ
diff --git a/installer/resources/icons/flags/lang_ar.png b/installer/resources/icons/flags/lang_ar.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9dee35851c8c76ae16b6cc53fe27aa1ead25f3d
Binary files /dev/null and b/installer/resources/icons/flags/lang_ar.png differ
diff --git a/installer/resources/initialNews/initialNews_ar.xml b/installer/resources/initialNews/initialNews_ar.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e21ae5cb8eacc4f5f429aae4a2a7e2a0f8c83c68
--- /dev/null
+++ b/installer/resources/initialNews/initialNews_ar.xml
@@ -0,0 +1,20 @@
+<div lang="ar" dir="rtl">
+<h3>Congratulations on getting I2P installed!</h3>
+<p>
+<b> !I2P مرحبا بك في شبكة</b>
+انتظر قليلا بينما يتم ربط الإتصال بباقي أعضاء الشبكة.
+</p>
+<p>
+
+بسنما يتم الإتصال <b>بتغير بيانات سرعة الشبكة في</b> قم
+<a href="config.jsp">صفحة الخيارات</a>.
+</p>
+<p>
+عندما تظهر عبارة "shared clients" على اليسار يمكنك حينها <b>زيارة</b> 
+<a href="http://www.i2p2.i2p/faq.html">الأسئلة الشائعة</a>.
+</p>
+<p>IRC اتصل بخادم الدردشة الفورية  على
+ <b>localhost:6668</b> 
+<a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a> or <a href="irc://127.0.0.1:6668/i2p">#i2p</a>.
+</p>
+</div>
diff --git a/installer/resources/initialNews/initialNews_fr.xml b/installer/resources/initialNews/initialNews_fr.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8f027c270471183f55f8d0607fd5940e6d6dfe07
--- /dev/null
+++ b/installer/resources/initialNews/initialNews_fr.xml
@@ -0,0 +1,20 @@
+<div lang="fr">
+<h3>Merci d'utiliser I2P !</h3>
+<p>
+<b>Bienvenue sur I2P !</b>
+Merci de <b>patienter</b> le temps qu'I2P démarre et trouve des pairs.
+</p>
+<p>
+Pendant ce temps, merci d'<b>adjuster vos réglages de bande passante</b> sur la page de 
+<a href="config.jsp">configuration</a>.
+</p>
+<p>
+Une fois que vous avez une indication "clients partagés&hellip;" listée sur la gauche,
+merci de <b>jeter un œil</b> à la <a href="http://www.i2p2.i2p/faq_fr.html">FAQ</a>.
+</p>
+<p>
+Pointez votre client IRC sur <b>localhost:6668</b> et venez nous faire coucou sur  
+<a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p-fr">#i2p-fr</a> 
+ou <a href="irc://127.0.0.1:6668/i2p">#i2p</a>.
+</p>
+</div>
diff --git a/installer/resources/install_i2p_service_winnt.bat b/installer/resources/install_i2p_service_winnt.bat
index fb668c64a7e292c869c16c81eed64671dc0a276e..a6eb0495d17e265c1291e77012d60ff77733757c 100644
--- a/installer/resources/install_i2p_service_winnt.bat
+++ b/installer/resources/install_i2p_service_winnt.bat
@@ -31,5 +31,6 @@ rem
 :startup
 "%_WRAPPER_EXE%" -i %_WRAPPER_CONF%
 if not errorlevel 1 goto :eof
+if %2=="--nopause" goto :eof
 pause
 
diff --git a/installer/resources/jetty.xml b/installer/resources/jetty.xml
index 29900cb6b07975af1d9488ce9a82721971bc9c84..a5072d8d757d197a3a0891b827578cb0364ed67c 100644
--- a/installer/resources/jetty.xml
+++ b/installer/resources/jetty.xml
@@ -12,7 +12,9 @@
 <!--           been patched to allow IPv6 addresses as well,                   -->
 <!--           enclosed in brackets e.g. [::1]                                 -->
 <!--   * port: Default 7658 in the addListener section                         -->
-<!--   * threads: Raise MaxThreads in the addListener section                  -->
+<!--   * docroot: Change the ResourceBase in the addContext section            -->
+<!--           to serve files from a different location.                       -->
+<!--   * threads: Raise MinThreads and/or MaxThreads in the addListener section -->
 <!--           if you have a high-traffic site and get a lot of warnings.      -->
 <!--   * Uncomment the addWebApplications section to use to enable             -->
 <!--           war files placed in the webapps/ dir.                           -->
@@ -23,7 +25,7 @@
 <!-- found in Jetty 5, you may install and run Jetty 6 in a different JVM,     -->
 <!-- or run any other web server such as Apache. If you do run another         -->
 <!-- web server instead, be sure and disable the Jetty 5 server for your       -->
-<!-- eepsite on http://127.0.0.1/configclients.jsp .                           -->
+<!-- eepsite on http://127.0.0.1:7657/configclients.jsp .                      -->
 <!--                                                                           -->
 <!-- Jetty errors and warnings will appear in wrapper.log, check there         -->
 <!-- to diagnose problems.                                                     -->
@@ -57,13 +59,12 @@
             <Set name="port">7658</Set>
           </New>
         </Arg>
-        <Set name="MinThreads">3</Set>
-        <Set name="MaxThreads">10</Set>
+        <Set name="MinThreads">1</Set>
+        <Set name="MaxThreads">16</Set>
         <Set name="MaxIdleTimeMs">60000</Set>
         <Set name="LowResourcePersistTimeMs">1000</Set>
         <Set name="ConfidentialPort">8443</Set>
         <Set name="IntegralPort">8443</Set>
-        <Set name="PoolName">main</Set>
       </New>
     </Arg>
   </Call>
@@ -90,9 +91,7 @@
         <Set name="Port">8443</Set>
         <Set name="PoolName">main</Set>
         <Set name="Keystore">./eepsite/keystore.ks</Set>
-        <!-- the keystore password -->
 	<Set name="Password">changeit</Set>
-        <!-- the X.509 certificate password -->
 	<Set name="KeyPassword">myKeyPassword</Set>
         <Set name="NonPersistentUserAgent">MSIE 5</Set>
       </New>
diff --git a/installer/resources/news.xml b/installer/resources/news.xml
index e542e7a2496e4716a22705716f39b8aa9309814b..e978528c5f5d100b9149fb29824210df1d4b2309 100644
--- a/installer/resources/news.xml
+++ b/installer/resources/news.xml
@@ -1,17 +1,13 @@
 <!--
-<i2p.news date="$Date: 2010-12-22 00:00:00 $">
-<i2p.release version="0.8.2" date="2010/12/22" minVersion="0.6" />
+<i2p.news date="$Date: 2011-05-16 00:00:00 $">
+<i2p.release version="0.8.6" date="2011/05/16" minVersion="0.6" />
 -->
 <div lang="en">
-<h3>2010-12-22: <b>0.8.2 <a href="http://www.i2p2.i2p/release-0.8.2.html">Released</a></b></h3>
+<h3>2011-05-16: <b>0.8.6 <a href="http://www.i2p2.i2p/release-0.8.6.html">Released</a></b></h3>
 <p>
-The 0.8.2 release includes extensive bug fixes and theme updates in the router and in i2psnark.
-There are also optimizations to reduce memory usage in i2psnark.
-The HTTP and SOCKS proxies now support local and remote authorization.
-As usual, upgrading is recommended.
-</p><p>
-I2P will be at 27C3 in Berlin the week of the December 27th.
-Look for the I2P people there and ask for I2P stickers!
+The 0.8.6 release contains more peer selection defenses to resist powerful attackers, and
+tweaks to adjust to the recent rapid growth in the network.
+Upgrading is recommended.
 </p><p>
 Please help grow the network.
 Say hello to the volunteers on the <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help IRC channel</a>.
@@ -20,6 +16,6 @@ spread the word,
 and <a href="http://www.i2p2.i2p/donate.html">donate</a>!
 If you find a bug, please enter a report on <a href="http://trac.i2p2.i2p/report/1">trac</a>.
 We are still looking for volunteers to work on new and existing translations.
-Please volunteer on <a href="irc://127.0.0.1:6668/i2p">IRC #i2p</a>.
+Please volunteer on <a href="irc://127.0.0.1:6668/i2p">IRC #i2p-dev</a>.
 </p>
 </div>
diff --git a/installer/resources/news_fr.xml b/installer/resources/news_fr.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ab045e4bfaf6a2b7c022a29607250c85476c864d
--- /dev/null
+++ b/installer/resources/news_fr.xml
@@ -0,0 +1,21 @@
+<!--
+<i2p.news date="$Date: 2011-03-02 00:00:00 $">
+<i2p.release version="0.8.4" date="2011/03/02" minVersion="0.6" />
+-->
+<div lang="fr">
+<h3>2011-03-02: <b>La version 0.8.4 <a href="http://www.i2p2.i2p/release-0.8.4_fr.html">est sortie</a></b></h3>
+<p>
+Cette version 0.8.4 contient quelques améliorations de performances et des corrections de bogues importantes. 
+i2psnark prend désormais en charge les liens magnet.
+Comme d'habitude, la mise à jour est recommmandée.
+</p><p>
+Merci de participer à la croissance du réseau.
+Venez nous encourager sur le <a href="irc://127.0.0.1:6668/i2p-help">canal IRC #i2p-help</a>.
+<a href="http://www.i2p2.i2p/getinvolved.html">Impliquez-vous</a>, 
+passez le mot,
+et <a href="http://www.i2p2.i2p/donate.html">un petit don</a>!
+Si vous trouvez un bogue, merci d'entrer un rapport sur <a href="http://trac.i2p2.i2p/report/1">trac</a>.
+Nous cherchons toujours des volontaires pour travailler sur les traductions existantes et des nouvelles.
+Merci de vous manifester sur l'<a href="irc://127.0.0.1:6668/i2p">IRC #i2p-dev</a>.
+</p>
+</div>
diff --git a/installer/resources/proxy/ahelper-conflict-header.ht b/installer/resources/proxy/ahelper-conflict-header.ht
index 670a64693c92b85b0dfc7f87b18feb19b5ad9802..e15e0f57e39f7417729475ae58290e0921fe543d 100644
--- a/installer/resources/proxy/ahelper-conflict-header.ht
+++ b/installer/resources/proxy/ahelper-conflict-header.ht
@@ -1,28 +1,28 @@
-HTTP/1.1 409 Conflict
-Content-Type: text/html; charset=UTF-8
-Cache-control: no-cache
-Connection: close
-Proxy-Connection: close
-
-<html><head>
-<title>I2P Warning: Destination key conflict</title>
-<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
-<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
-</head>
-<body>
-<div class=logo>
- <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
- <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Help</a> <a href="http://127.0.0.1:7657/susidns/">Addressbook</a>
-</div>
-<div class=warning id=warning>
-<h3>Warning: Destination Key Conflict</h3>
-The addresshelper link you followed specifies a different destination key
-than a host entry in your host database.
-Someone could be trying to impersonate another eepsite,
-or people have given two eepsites identical names.
-<p>
-You can resolve the conflict by considering which key you trust,
-and either discarding the addresshelper link,
-discarding the host entry from your host database,
-or naming one of them differently.
-<p>
+HTTP/1.1 409 Conflict
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>I2P Warning: Destination key conflict</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Help</a> <a href="http://127.0.0.1:7657/susidns/">Addressbook</a>
+</div>
+<div class=warning id=warning>
+<h3>Warning: Destination Key Conflict</h3>
+The addresshelper link you followed specifies a different destination key
+than a host entry in your host database.
+Someone could be trying to impersonate another eepsite,
+or people have given two eepsites identical names.
+<p>
+You can resolve the conflict by considering which key you trust,
+and either discarding the addresshelper link,
+discarding the host entry from your host database,
+or naming one of them differently.
+<p>
diff --git a/installer/resources/proxy/ahelper-conflict-header_ar.ht b/installer/resources/proxy/ahelper-conflict-header_ar.ht
new file mode 100644
index 0000000000000000000000000000000000000000..d3a4d8380dc2f036e7ed6dc9c6d890b0e224dc20
--- /dev/null
+++ b/installer/resources/proxy/ahelper-conflict-header_ar.ht
@@ -0,0 +1,28 @@
+HTTP/1.1 409 Conflict
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html lang="ar" dir="rtl"><head>
+<title>I2P Warning: Destination key conflict</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">اعدادات</a> <a href="http://127.0.0.1:7657/help.jsp">مساعدة</a> <a href="http://127.0.0.1:7657/susidns/">دفتر العناوين</a>
+</div>
+<div class=warning id=warning>
+<h3>Warning: Destination Key Conflict</h3>
+The addresshelper link you followed specifies a different destination key
+than a host entry in your host database.
+Someone could be trying to impersonate another eepsite,
+or people have given two eepsites identical names.
+<p>
+You can resolve the conflict by considering which key you trust,
+and either discarding the addresshelper link,
+discarding the host entry from your host database,
+or naming one of them differently.
+<p>
diff --git a/installer/resources/proxy/ahelper-conflict-header_fr.ht b/installer/resources/proxy/ahelper-conflict-header_fr.ht
new file mode 100644
index 0000000000000000000000000000000000000000..071bf7ab8918ace32896949c0f2d5c799c3715b4
--- /dev/null
+++ b/installer/resources/proxy/ahelper-conflict-header_fr.ht
@@ -0,0 +1,24 @@
+HTTP/1.1 409 Conflict
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Avertissement I2P: conflit de clef de destination</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Console routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console routeur I2P" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/">Carnet d'adresses</a>
+</div>
+<div class=warning id=warning>
+<h3>Avertissement: conflit de clef de destination</h3>
+Le lien d'adresse que vous avez suivi indique une clef de destination différente de celle de votre carnet d'adresses.
+Quelqu'un est peut-être en train d'usurper un autre site eep, ou des gens ont donné le même nom à des sites eep différents.
+<p>
+Vous pouvez résoudre le conflit en décidant à quelle clé accorder votre confiance,
+et soit écarter le lien d'adresse, supprimer l'entrée de votre carnet d'adresses, ou renommer un des deux.
+<p>
diff --git a/installer/resources/proxy/auth-header_fr.ht b/installer/resources/proxy/auth-header_fr.ht
new file mode 100644
index 0000000000000000000000000000000000000000..cace47865e6ff44197922632489b337838f9708a
--- /dev/null
+++ b/installer/resources/proxy/auth-header_fr.ht
@@ -0,0 +1,23 @@
+HTTP/1.1 407 Proxy Authorization Required
+Content-Type: text/html; charset=UTF-8
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.5
+Proxy-Authenticate: Basic realm="I2P HTTP Proxy"
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Autorisation Proxy requise</title>
+<!-- we cannot have links to CSS or images here, but we could put in some simple inline style -->
+</head>
+<body>
+<div class=warning id=warning>
+<h3>Autorisation I2P HTTP Proxy requise</h3>
+Ce mandataire est configuré pour demander un nom d'utilisateur et un mot de passe pour les accès.
+Merci d'entrer votre identifiant / mot de passe, ou vérifier la 
+<a href="http://127.0.0.1:7657/advancedconfig.jsp">configuration</a> de votre routeur, 
+ou du 
+<a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">I2PTunnel</a>.
+Pour désactiver le contrôle d'accès, supprimez la configuration
+<code>i2ptunnel.proxy.auth=basic</code>, puis redémarrez le tunnel proxy HTTP.
+</div>
diff --git a/installer/resources/proxy/denied-header_ar.ht b/installer/resources/proxy/denied-header_ar.ht
new file mode 100644
index 0000000000000000000000000000000000000000..9e9d83a83d541af1b8acd1c9b13c77151417cbab
--- /dev/null
+++ b/installer/resources/proxy/denied-header_ar.ht
@@ -0,0 +1,20 @@
+HTTP/1.1 403 Request Denied
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html lang="ar" dir="rtl"><head>
+<title>تحذير: لم يحدد بروكسي خارجي</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">اعدادات</a> <a href="http://127.0.0.1:7657/help.jsp">مساعدة</a> <a href="http://127.0.0.1:7657/susidns/">دفتر العناوين</a>
+</div>
+<div class=warning id=warning>
+<h3>تحذير : رفض طلب</h3>
+حاولت الدخول الى موقع I2P خارج الشبكة.
+</div>
diff --git a/installer/resources/proxy/denied-header_fr.ht b/installer/resources/proxy/denied-header_fr.ht
new file mode 100644
index 0000000000000000000000000000000000000000..0f05e5a618584c19b3cf5b074882b97b301a2d8c
--- /dev/null
+++ b/installer/resources/proxy/denied-header_fr.ht
@@ -0,0 +1,20 @@
+HTTP/1.1 403 Requête refusée
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Avertissement I2P: Requête refusée</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Console routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console routeur I2P" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/index.jsp">Carnet d'adresse</a>
+</div>
+<div class=warning id=warning>
+<h3>Avertissement I2P: Requête refusée</h3>
+Vous avez tenté de vous connecter a un site ou emplacement non-I2P.
+</div>
diff --git a/installer/resources/proxy/dnf-header_fr.ht b/installer/resources/proxy/dnf-header_fr.ht
new file mode 100644
index 0000000000000000000000000000000000000000..e0dea27996fa2b8f78aafc596e7605c55eb084fc
--- /dev/null
+++ b/installer/resources/proxy/dnf-header_fr.ht
@@ -0,0 +1,23 @@
+HTTP/1.1 504 Gateway Timeout
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Avertissement I2P: site eep non joignable</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Console routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console routeur I2P" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/index.jsp">Carnet d'adresse</a>
+</div>
+<div class=warning id=warning>
+<h3>Avertissement I2P: site eep non joignable</h3>
+Le site eep n'a pas pu être atteint. Il est hors service, 
+le réseau est surchargé, ou votre routeur n'est pas bien intégré aux pairs.
+Vous pouvez  
+<a href="javascript: window.location.reload()">réessayer</a>. 
+<hr><b>Destination injoignable:</b><BR><BR>
diff --git a/installer/resources/proxy/dnfb-header_ar.ht b/installer/resources/proxy/dnfb-header_ar.ht
new file mode 100644
index 0000000000000000000000000000000000000000..1ceb0d1025115e57b25ed4ab48a889ea1b046c38
--- /dev/null
+++ b/installer/resources/proxy/dnfb-header_ar.ht
@@ -0,0 +1,26 @@
+HTTP/1.1 400 Destination Not Found
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html lang="ar" dir="rtl"><head>
+<title>
+تحذير: عنوان eepsite خاطئ
+</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">اعدادات</a> <a href="http://127.0.0.1:7657/help.jsp">مساعدة</a> <a href="http://127.0.0.1:7657/susidns/">دفتر العناوين</a>
+</div>
+<div class=warning id=warning>
+<h3>
+تحذير: عنوان eepsite خاطئ
+</h3>
+عنوان الموقع eepsite خاطئ، أو  ربما قمت بلصق عنوان غير موجود، أو الموقع متوقف. يمكنك
+
+<a href="javascript: window.location.reload()">اعادة المحاولة</a>. 
+<hr><b>لم يتم الوصول الى هذا العنوان:</b><BR><BR>
diff --git a/installer/resources/proxy/dnfb-header_fr.ht b/installer/resources/proxy/dnfb-header_fr.ht
new file mode 100644
index 0000000000000000000000000000000000000000..c7ed858f459fd9f526b9725745519db3cf75d038
--- /dev/null
+++ b/installer/resources/proxy/dnfb-header_fr.ht
@@ -0,0 +1,23 @@
+HTTP/1.1 400 Destination non trouvée
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Avertissement I2P: destination eep site incorrecte</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Console routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console routeur I2P" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/index.jsp">Carnet d'adresse</a>
+</div>
+<div class=warning id=warning>
+<h3>Avertissement I2P: destination eep site incorrecte</h3>
+La destination du site eep indiquée est incorrecte, ou injoignable. 
+Vous avez peut-être collé une chaîne BASE64 incorrecte le lien que vous suivez est incorrect. 
+L'hôte I2P est peut-être aussi hors-servicehost.
+Vous pouvez <a href="javascript: window.location.reload()">réessayer</a>. 
+<hr><b>Destination non trouvée:</b><BR><BR>
diff --git a/installer/resources/proxy/dnfh-header_fr.ht b/installer/resources/proxy/dnfh-header_fr.ht
new file mode 100644
index 0000000000000000000000000000000000000000..157173973fbe1c7050e2fa502b5a02afe171598d
--- /dev/null
+++ b/installer/resources/proxy/dnfh-header_fr.ht
@@ -0,0 +1,27 @@
+HTTP/1.1 404 Domaine non trouvé
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Avertissement I2P: site eep inconnu</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Console routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console routeur I2P" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/index.jsp">Carnet d'adresse</a>
+</div>
+<div class=warning id=warning>
+<h3>Avertissement I2P: site eep non trouvé dans le carnet d'adresses</h3>
+Le site eep n'était pas dans le carnet d'adresses de votre routeur.
+Vérifiez le lien ou trouvez l'adresse BASE64.
+Si vous avez l'adresse BASE64,  reportez-la dans votre fichier userhosts.txt en passant par 
+<a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=master">SusiDNS</a>,
+utilisez un lien d'adresse BASE64, ou un service de saut (jump) en  lien ci-dessous.<br><br>
+Si vous voyez cette page souvent: lisez la <a href="http://www.i2p2.i2p/faq_fr.html#subscriptions">faq</a> pour obtenir 
+de l'aide sur <a href="http://127.0.0.1:7657/susidns/config.jsp">l'ajout de quelques souscrptions</a> à votre carnet 
+d'adresses.<hr>
+<b>Destination introuvable:</b><BR><BR>
diff --git a/installer/resources/proxy/dnfp-header_ar.ht b/installer/resources/proxy/dnfp-header_ar.ht
new file mode 100644
index 0000000000000000000000000000000000000000..b194b1266e003e1b6d89e65a7a6d7a66b7cf9ecd
--- /dev/null
+++ b/installer/resources/proxy/dnfp-header_ar.ht
@@ -0,0 +1,28 @@
+HTTP/1.1 504 Gateway Timeout
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html lang="ar" dir="rtl"><head>
+<title>تحذير: لابوجد بروكسي خارجي</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">اعدادات</a> <a href="http://127.0.0.1:7657/help.jsp">مساعدة</a> <a href="http://127.0.0.1:7657/susidns/">دفتر العناوين</a>
+</div>
+<div class=warning id=warning>
+<h3>تحذير: لابوجد بروكسي خارجي</h3>
+لم يتم ايجاد بروكسي خارجي www
+خارج الشبكة أو غير متصل جيدا بباقي المستخدمين.
+يمكنك
+<a href="javascript: parent.window.location.reload()">اعادة المحاولة</a> 
+لإختيار بروكسي خارجي جديد
+<a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">هنا</a> 
+(اذا كان لديك اكثر من واحد). 
+اذا استمر المشكل قم بتحرير قائمة البروكسي الخارجية
+<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=0">هنا</a>. 
+<hr><b>لم يستطع الوصول الى هذا العنوان</b><BR><BR>
diff --git a/installer/resources/proxy/dnfp-header_fr.ht b/installer/resources/proxy/dnfp-header_fr.ht
new file mode 100644
index 0000000000000000000000000000000000000000..40e9ad82f06a1800f332407584905f8a29df985b
--- /dev/null
+++ b/installer/resources/proxy/dnfp-header_fr.ht
@@ -0,0 +1,29 @@
+HTTP/1.1 504 Délai d'attente de passerelle dépassé
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Avertissement I2P: Proxy sortant non trouvé</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Console routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console routeur I2P" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/">Carnet d'adresses</a>
+</div>
+<div class=warning id=warning>
+<h3>Avertissement I2P: Proxy sortant non trouvé</h3>
+Le serveur mandataire sortant est introuvable. 
+Il est hors service, le réseau est surchargé,
+ou votre routeur n'est pas encore bien intégré avec des pairs.
+Vous pouvez essayer de 
+<a href="javascript: parent.window.location.reload()">retenter</a> 
+car il se produira une sélection aléatoire de mandataire dans le groupe que vous avez défini 
+<a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">ici</a> 
+(si vous en avez plus d'un de défini). 
+Si vous avez toujours des problèmes vous pouvez modifier votre liste de 
+mandataires <a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=0">ici</a>. 
+<hr><b>Destination suivante introuvable:</b><BR><BR>
diff --git a/installer/resources/proxy/localhost-header_ar.ht b/installer/resources/proxy/localhost-header_ar.ht
new file mode 100644
index 0000000000000000000000000000000000000000..dc6b0304e833ea5b0d0412bca5272b499235c994
--- /dev/null
+++ b/installer/resources/proxy/localhost-header_ar.ht
@@ -0,0 +1,24 @@
+HTTP/1.1 403 Access Denied
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html lang="ar" dir="rtl"><head>
+<title>خطأ: تم رفض الطلب</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<!-----------------------------
+  Let's not infinite loop here....
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Help</a> <a href="http://127.0.0.1:7657/susidns/">Addressbook</a>
+</div>
+------------------------------>
+<div class=warning id=warning>
+<h3>خطـأ: عنوان محلي</h3>
+خطأ في اعدادات المتصفح. لا تستعمل بروكسي للوصول الى شاشة التحكم، localhost او الشبكة المحلية LAN.
+
+</div>
diff --git a/installer/resources/proxy/localhost-header_fr.ht b/installer/resources/proxy/localhost-header_fr.ht
new file mode 100644
index 0000000000000000000000000000000000000000..c38f220b8ac20ef5eebf0a54bd199eebc7febb4e
--- /dev/null
+++ b/installer/resources/proxy/localhost-header_fr.ht
@@ -0,0 +1,24 @@
+HTTP/1.1 403 Accès refusé
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Erreur I2P: Requête refusée</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<!-----------------------------
+  Let's not infinite loop here....
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Help</a> <a href="http://127.0.0.1:7657/susidns/">Addressbook</a>
+</div>
+------------------------------>
+<div class=warning id=warning>
+<h3>Erreur: Accès local</h3>
+Votre navigateur est mal configuré. N'utilisez pas de mandataire pour accéder à la console du routeur I2P,
+à l'hôte local (localhost), ou des destinations LAN: définissez une exception.
+</div>
diff --git a/installer/resources/proxy/noproxy-header_ar.ht b/installer/resources/proxy/noproxy-header_ar.ht
new file mode 100644
index 0000000000000000000000000000000000000000..0f6f1ba643f9a1b8858a14a02138441e10e3efa6
--- /dev/null
+++ b/installer/resources/proxy/noproxy-header_ar.ht
@@ -0,0 +1,20 @@
+HTTP/1.1 503 Service Unavailable
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html lang="ar" dir="rtl"><head>
+<title>تحذير: لم يحدد بروكسي خارجي</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">اعدادات</a> <a href="http://127.0.0.1:7657/help.jsp">مساعدة</a> <a href="http://127.0.0.1:7657/susidns/">دفتر العناوين</a>
+</div>
+<div class=warning id=warning>
+<h3>تحذير: لم يحدد بروكسي خارجي</h3>
+قمت بطلب موقع خارج عن شبكة I2P، لكن لم تقم بتحديد بروكسي خارجي. قم يتحديد بروكسي خارجي في اعدادات I2PTunnel.
+</div>
diff --git a/installer/resources/proxy/noproxy-header_fr.ht b/installer/resources/proxy/noproxy-header_fr.ht
new file mode 100644
index 0000000000000000000000000000000000000000..96e9f3e78261ec00f0290d639c7ffa28a59d8a73
--- /dev/null
+++ b/installer/resources/proxy/noproxy-header_fr.ht
@@ -0,0 +1,21 @@
+HTTP/1.1 503 Service indisponible
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Avertissement I2P: Mandataire non configuré</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Console Routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console Routeur I2P" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/">Carnet d'adresses</a>
+</div>
+<div class=warning id=warning>
+<h3>Avertissement I2P: Mandataire non configuré</h3>
+Votre requête était pour un site hors du réseau I2P, mais vous n'avez pas de mandataire 
+configuré.  Merci de configurer un mandataire dans I2PTunnel.
+</div>
diff --git a/installer/resources/proxy/protocol-header_ar.ht b/installer/resources/proxy/protocol-header_ar.ht
new file mode 100644
index 0000000000000000000000000000000000000000..d31c7579102fa532c4ee3a9324606b994be5828a
--- /dev/null
+++ b/installer/resources/proxy/protocol-header_ar.ht
@@ -0,0 +1,21 @@
+HTTP/1.1 403 Bad Protocol
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html lang="ar" dir="rtl"><head>
+<title>HTTP تحذير: استعمال بروتوكول غير متوافق مع </title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">اعدادات</a> <a href="http://127.0.0.1:7657/help.jsp">مساعدة</a> <a href="http://127.0.0.1:7657/susidns/">دفتر العناوين</a>
+</div>
+<div class=warning id=warning>
+<h3>HTTP تحذير: استعمال بروتوكول غير متوافق مع </h3>
+تم استعمال بروتوكول غير متوافق.
+بروكسي I2P يدعم طلبات http:// فقط. باقي البروتوكولات مثل https:// و ftp:// غير مدعومة.
+</div>
diff --git a/installer/resources/proxy/protocol-header_fr.ht b/installer/resources/proxy/protocol-header_fr.ht
new file mode 100644
index 0000000000000000000000000000000000000000..47fdc9fa9f2adc4672e2c5dd26edd0b75266e7fd
--- /dev/null
+++ b/installer/resources/proxy/protocol-header_fr.ht
@@ -0,0 +1,21 @@
+HTTP/1.1 403 Protocole incorrect
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Avertissement I2P: Protocole Non-HTTP</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Console Routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console Routeur I2P" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/">Carnet d'adresses</a>
+</div>
+<div class=warning id=warning>
+<h3>Avertissement I2P: Protocole Non-HTTP</h3>
+La requête a utilisé un protocole inadpté.
+Le mandataire HTTP I2P prend en charge les requêtes http:// seulement. Les autre protocoles tels que https:// and ftp:// ne sont pas permis.
+</div>
diff --git a/installer/resources/readme/readme.html b/installer/resources/readme/readme.html
index 00667aea28ec3266ca178f566ecc662dea0d0245..bf0f5d6a1919a57b4ce0e4dbdb7be61e4e0cb8c3 100644
--- a/installer/resources/readme/readme.html
+++ b/installer/resources/readme/readme.html
@@ -1,21 +1,8 @@
 <div lang="en">
-<div align="right"> 
-  <div class="langbox" align="right">
-    <a href="/?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> 
-    <a href="/?lang=zh"><img src="/flags.jsp?c=cn" title="中文" alt="中文"></a> 
-    <a href="/?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> 
-    <a href="/?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> 
-    <a href="/?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a> 
-    <a href="/?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> 
-    <a href="/?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> 
-    <a href="/?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> 
-    <a href="/?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
-  </div>
-</div><a name="top"></a>
-<div class="welcome"><h2>Welcome to the Invisible Internet</h2></div>
+
 <ul class="links"><li class="tidylist"><b>Starting Up&hellip;</b><br>If you've just started I2P, the number of <i>Active Peers</i> indicated under the <i>Peers</i> section in the side panel on the left should start to grow over the next few minutes and you'll also see a <i>Local Destination</i> named <i>Shared Clients</i> listed there, and possibly other clients and servers depending on how I2P is configured (if not, see the troubleshooting section <a href="#trouble">below</a>). These <i>Local Destinations</i> provide connections on different ports (and sometimes protocols) to the I2P network, enabling your bittorrent, e-mail, web proxy and other services to function. Your <a href="/netdb">Network Database</a> indicates all known peers on the network. Additionally, you can monitor existing <a href="/peers">Peer Connections</a>, and view existing <a href="/tunnels">Tunnels</a> and their status. More information is available on the <a href="/help">help page</a>.</li>
 
-<li class="tidylist"><b>Network integration</b><br> The first time you start I2P it may take a few minutes to bootstrap (integrate) you into the network and find additional peers to optimize your integration, so please be patient. Once green stars are indicated next to your <i>Local Destinations</i>, there is a wide variety of things you can do with I2P, and below we introduce you to some of them.</li></ul>
+<li class="tidylist"><b>Network integration</b><br> The first time you start I2P it may take a few minutes to bootstrap (integrate) you into the network and find additional peers to optimize your integration, so please be patient. When I2P starts up, and during normal operation, I2P's tunnel build readiness indicator (immediately above the <i>Local Destinations</i> section in the sidepanel) may tell you that I2P is "Rejecting Tunnels"; this is normal behavior and should be of no cause for concern! Once green stars are indicated next to your <i>Local Destinations</i>, there is a wide variety of things you can do with I2P, and below we introduce you to some of them.</li></ul>
   
 <h3>Services on I2P</h3>
 <ul class="links">
@@ -23,17 +10,27 @@
 <li class="tidylist"><b>Invisible Internet &amp; Public Web Browsing</b><br>On I2P you can access anonymous websites (eepsites) and other services (e.g. ssh over I2P, IRC, Jabber etc.) in addition to being able to host your own services. You can also access the normal web anonymously via I2P's built-in web proxy (outproxy). <a href="http://www.i2p2.de/htproxyports.html" target="_blank">Configure your browser</a> to use the HTTP proxy at <code>127.0.0.1 port 4444</code>, then browse to an eepsite or a normal, unencrypted <code>http://</code> address. For a pre-configured browser, you may wish to try <a href="http://echelon.i2p/i2pfox/">I2PFox</a>, a custom build of Firefox security hardened and tailored especially for I2P. If you wish to disable or change outproxy access to the normal internet, remove or modify the outproxy entry for <code>false.i2p</code> under the <i>Outproxies</i> option in the <a href="/i2ptunnel/edit?tunnel=0" target="_blank">I2P HTTP Proxy  Tunnel Editor</a>. In the "Sites of Interest" section <a href="#eepsites">below</a>, we list a few of the sites hosted on I2P.</li>
 
 <li class="tidylist"><b>Anonymous E-Mail</b><br>Postman's I2P-based mail system can be accessed either via <a href="/susimail/susimail">I2P's built-in mail client</a>
-(susimail) or using any mail client that supports smtp and pop3.
-Accounts can send and receive mail from the normal internet. For an
-account, visit <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Additionally, <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> is a new serverless, end-to-end encrypted e-mail system providing a web
-interface and an integrated addressbook. It is developed by HungryHobo
-and can be installed as a <a href="#plugins">plugin</a>.</li>
-
-<li class="tidylist"><b>Anonymous File Transfer</b><br><a href="/i2psnark/" target="_blank">I2PSnark</a> is integrated into I2P, providing anonymous, encrypted <a href="https://secure.wikimedia.org/wikipedia/en/wiki/BitTorrent_%28protocol%29" target="_blank">BitTorrent</a> transfers. In addition, Sponge develops a bittorrent client called <a href="http://bob.i2p/Robert.html">Robert</a> written in Python. There is also a port of <a href="http://www.emule-project.net/" target="_blank">eMule</a> to I2P called <a href="http://echelon.i2p/imule/">iMule</a> [Needs developers!], an anonymous, secure implementation of a <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Gnutella" target="_blank">Gnutella network</a>, accessible using <a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a> [maintained by Complication, seeking new developers!], and additional facilities including browser-based file hosting.</li>
-      <li class="tidylist"><b>Anonymous Chat</b><br>Start your IRC client (e.g. Chatzilla, Pidgin, XChat)
-        and connect to the <a href="irc://127.0.0.1:6668/i2p">server</a> at <code>127.0.0.1 port 6668</code>. You do not need to configure a proxy in your IRC client; I2P provides you with a local IRC tunnel (configured in your IRC client as an IRC server or remote host). Your local I2P IRC tunnel on <code>localhost:6668</code> will direct you to one of two IRC servers hosted on I2P by Postman and Badger, but neither you nor they know where the other is, and your mom, ISP or government is unable to intercept your conversation! Once you're there, <code>#i2p-help</code>,<code>#i2p</code>,<code>#i2p-chat</code> and <code>#i2p-dev</code> are just a few of the available channels you may wish to /join. There's also an I2P-based <a href="http://echelon.i2p/qti2pmessenger/">Instant Messenger</a> for unmonitorable and uncensorable anonymous chat, as well as alternative IRC servers, Jabber servers, website-based chat, and more. 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-based 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://i2plugins.i2p/" target="_blank">i2plugins.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>
-      <a name="plugins"></a><li class="tidylist"><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://i2plugins.i2p/plugins/" target="_blank">installation</a>! Browse the plugins and related info at <a href="http://i2plugins.i2p/" target="_blank">i2plugins.i2p</a>. If you're a <a href="http://i2plugins.i2p/developers/" target="_blank">developer</a>, a complete language-agnostic framework for writing your own plugins is provided with <a href="http://www.i2p2.i2p/plugins.html" target="_blank">documentation</a>; I2P plugins can be coded in any language.</li>
+  (susimail) or using any mail client that supports smtp and pop3.
+  Accounts can send and receive mail from the normal internet. For an
+  account, visit <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Additionally, <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> is a new I2P-internal serverless, secure (end-to-end encrypted) e-mail system with an integrated anonymous/pseudonymous remailer, providing a web interface and a built-in addressbook. It is developed by HungryHobo, and can be installed as a <a href="#plugins">plugin</a>.</li>
+
+<li class="tidylist"><b>Anonymous File Transfer</b><br><a href="/i2psnark/" target="_blank">I2PSnark</a> is integrated into I2P, providing anonymous, encrypted <a href="https://secure.wikimedia.org/wikipedia/en/wiki/BitTorrent_%28protocol%29" target="_blank">BitTorrent</a> transfers.
+  In addition, Sponge develops a bittorrent client called <a href="http://bob.i2p/Robert.html">Robert</a> written in Python.
+  There is also a port of <a href="http://www.emule-project.net/" target="_blank">eMule</a> to I2P called <a href="http://echelon.i2p/imule/">iMule</a> [Needs developers!], an anonymous, secure implementation of a <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Gnutella" target="_blank">Gnutella network</a>, accessible using <a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a> [maintained by Complication, seeking new developers!], and additional facilities including browser-based file hosting.</li>
+<li class="tidylist"><b>Anonymous Chat</b><br>Start your IRC client (e.g. Chatzilla, Pidgin, XChat)
+  and connect to the <a href="irc://127.0.0.1:6668/i2p-help">server</a> at <code>127.0.0.1 port 6668</code>. You do not need to configure a proxy in your IRC client; I2P provides you with a local IRC tunnel (configured in your IRC client as an IRC server or remote host).
+  Your local I2P IRC tunnel on <code>localhost:6668</code> will direct you to one of two IRC servers hosted on I2P by Postman and Badger, but neither you nor they know where the other is, and your mom, ISP or government is unable to intercept your conversation!
+  Once you're there, <code>#i2p-help</code>,<code>#i2p</code>,<code>#i2p-chat</code> and <code>#i2p-dev</code> are just a few of the available channels you may wish to /join.
+  There's also an I2P-based <a href="http://echelon.i2p/qti2pmessenger/">Instant Messenger</a> for unmonitorable and uncensorable anonymous chat, as well as alternative IRC servers, Jabber servers, website-based chat, and more.
+  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://i2plugins.i2p/" target="_blank">i2plugins.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://i2plugins.i2p/plugins/" target="_blank">installation</a>!
+  Browse the plugins and related info at <a href="http://i2plugins.i2p/" target="_blank">i2plugins.i2p</a>.
+  If you're a <a href="http://i2plugins.i2p/developers/" target="_blank">developer</a>, a complete language-agnostic framework for writing your own plugins is provided with <a href="http://www.i2p2.i2p/plugins.html" target="_blank">documentation</a>; I2P plugins can be coded in any language.</li>
 </ul>
 
 <h3>Anonymous Encrypted Web Hosting on I2P</h3>
@@ -44,9 +41,9 @@ and can be installed as a <a href="#plugins">plugin</a>.</li>
   any standard JSP/Servlet .war files under <code>eepsite/webapps</code>, 
   or standard CGI scripts under <code>eepsite/cgi-bin</code>) and they'll show 
   up. You can also run any alternative web server platform over I2P and replace the built-in server, or run it on another tunnel.</li>
-      <li class="tidylist"><b>Start Your Tunnel</b><br>  
+<li class="tidylist"><b>Start Your Tunnel</b><br>  
   After starting up, your pre-configured <a href="/i2ptunnel/" target="_blank">I2P Webserver Tunnel</a>,  
-your eepsite will be visible (but not discoverable) to others. Detailed instructions for starting 
+  your eepsite will be visible (but not discoverable) to others. Detailed instructions for starting 
   your eepsite, registering an .i2p domain and promoting your site to others are accessible via your own I2P webserver on <a href="http://127.0.0.1:7658/help/" target="_blank">http://127.0.0.1:7658/help/</a>.</li></ul>
     
 <a name="eepsites"></a>    
@@ -74,38 +71,56 @@ your eepsite will be visible (but not discoverable) to others. Detailed instruct
 
 
 <h2>Troubleshooting &amp; Further Assistance</h2><a name="trouble"></a>
-    <ul class="links">
-      <li class="tidylist"><b>Be Patient!</b><br>I2P may be slow to integrate into network the first time you run it as it bootstraps into the network and learns of additional peers. The longer your I2P router is running, the better it will perform, so try and keep your router on as long as you can, 24/7 if possible! If, after 30 minutes, your <i>Active: [connected/recent]</i> count still has less than 10 peers, or your total number of <i>Integrated</i> peers is less than 5, there are several things you can do to check for problems: 
+
+<ul class="links">
+
+<li class="tidylist"><b>Be Patient!</b><br>I2P may be slow to integrate into network the first time you run it as it bootstraps into the network and learns of additional peers. The longer your I2P router is running, the better it will perform, so try and keep your router on as long as you can, 24/7 if possible! If, after 30 minutes, your <i>Active: [connected/recent]</i> count still has less than 10 peers, or your total number of <i>Integrated</i> peers is less than 5, there are several things you can do to check for problems: 
   </li>
 
-  <li class="tidylist"><b>Check your Configuration &amp; Bandwidth Allocation</b><br>I2P functions best when you can accurately reflect the speed of your network connection in the <a href="/config">bandwidth configuration section</a>. By default I2P is configured with some fairly conservative values that will not suit many use cases, so please take time to review these settings and correct where necessary. The more bandwidth you allocate, <i>specifically</i> upstream bandwidth, the more you will benefit from the network. 
+<li class="tidylist"><b>Check your Configuration &amp; Bandwidth Allocation</b><br>I2P functions best when you can accurately reflect the speed of your network connection in the <a href="/config">bandwidth configuration section</a>. By default I2P is configured with some fairly conservative values that will not suit many use cases, so please take time to review these settings and correct where necessary. The more bandwidth you allocate, <i>specifically</i> upstream bandwidth, the more you will benefit from the network. 
   </li>
 
-    <li class="tidylist"><b>Firewalls, Modems & Routers</b><br>Where possible, please ensure I2P/Java is allowed bi-directional port access from the internet by configuring your modem/router/pc firewall accordingly.  
-If you're behind a prohibitive firewall but have unrestricted outbound access, I2P can still function; you can turn off inbound access and rely on <a href="http://www.i2p2.i2p/udp.html" target="_blank">SSU IP Address Detection</a> (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Hole_punching" target="_blank">firewall hole punching</a>) to connect you to the network, and your network status in the side panel will indicate "Network: Firewalled". For optimal performance, where possible please ensure I2P's <a href="/config">external port</a> is visible from the internet (see below for more information).</li>
+<li class="tidylist"><b>Firewalls, Modems &amp; Routers</b><br>Where possible, please ensure I2P/Java is allowed bi-directional port access from the internet by configuring your modem/router/pc firewall accordingly.  
+   If you're behind a prohibitive firewall but have unrestricted outbound access, I2P can still function; you can turn off inbound access and rely on <a href="http://www.i2p2.i2p/udp.html" target="_blank">SSU IP Address Detection</a> (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Hole_punching" target="_blank">firewall hole punching</a>) to connect you to the network, and your network status in the side panel will indicate "Network: Firewalled". For optimal performance, where possible please ensure I2P's <a href="/config">external port</a> is visible from the internet (see below for more information).
+   </li>
   
-  <li class="tidylist"><b>Check Your Proxy Setttings</b><br>If 
+<li class="tidylist"><b>Check Your Proxy Setttings</b><br>If 
   you cannot see any eepsites at all (not even <a href="http://www.i2p2.i2p/" target="_blank">www.i2p2.i2p</a>), 
-  make sure your browser's proxy is set to access http traffic (<i>not</i> https, <i>not</i> socks) via <code>127.0.0.1 port 4444</code>. If you need some help, there's <a href="http://www.i2p2.i2p/htproxyports.html" target="_blank">a guide</a> to configuring your browser for I2P use, also <a href="http://www.i2p2.de/htproxyports.html" target="_blank">available</a> on the normal web. </li>
+  make sure your browser's proxy is set to access http traffic (<i>not</i> https, <i>not</i> socks) via <code>127.0.0.1 port 4444</code>. If you need some help, there's <a href="http://www.i2p2.i2p/htproxyports.html" target="_blank">a guide</a> to configuring your browser for I2P use, also <a href="http://www.i2p2.de/htproxyports.html" target="_blank">available</a> on the normal web. 
+  </li>
+
+<li class="tidylist"><b>Check Your Logs</b><br><a href="/logs">Logs</a> may help resolve a problem. You may wish to paste excerpts in a <a href="http://forum.i2p/viewforum.php?f=10" target="_blank">forum</a> for help, or perhaps <a href="http://paste.i2p2.i2p/" target="_blank">paste</a> it instead and reference the link on IRC for help.
+  </li> 
+
+<li class="tidylist"><b>Verify Java is Up to Date</b><br>Ensure your Java is up to date [version 1.6 recommended and required for some features]. Check the version of your JRE (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/JRE" target="_blank">Java Runtime Environment</a>)
+  at the top of <a href="/logs">the logs page</a>.
+  If you're a developer, a <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Java_SDK" target="_blank">Java SDK</a> and <a href="http://ant.apache.org/" target="_blank">Apache Ant</a> are required to build from source.
+  </li>
+ 
+<li class="tidylist"><b>Problems running on Legacy Hardware</b><br>[Linux/Unix/Solaris] If you can't start the router with <code>i2p/i2prouter start</code> try the <code>runplain.sh</code> script in the same directory. Root privileges are usually not required to run I2P. If you need to compile the <a href="http://www.i2p2.i2p/jbigi.html" target="_blank">jBigi library</a> (which is necessary in rare cases), consult appropriate documentation, visit the forums, or come pay a visit to our <a href="irc://127.0.0.1:6668/i2p-dev">IRC developer channel</a>.
+  </li>
 
-  <li class="tidylist"><b>Check Your Logs</b><br><a href="/logs">Logs</a> may help resolve a problem. You may wish to paste excerpts in a <a href="http://forum.i2p/viewforum.php?f=10" target="_blank">forum</a> for help, or perhaps <a href="http://paste.i2p2.i2p/" target="_blank">paste</a> it instead and reference the link on IRC for help.</li> 
-  <li class="tidylist"><b>Verify Java is Up to Date</b><br>Ensure your Java is up to date [version 1.6 recommended and required for some features]. If you don't have Java installed, you probably want some implementation of the JRE (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/JRE" target="_blank">Java Runtime Engine</a>); if you're a developer, the <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Java_SDK" target="_blank">SDK</a> may also be of interest, and possibly <a href="http://ant.apache.org/" target="_blank">Apache Ant</a> which we use to build the I2P Java binaries.
+<li class="tidylist"><b>Enable Universal Plug and Play (UPnP)</b><br>Your modem or router may support <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Universal_Plug_and_Play" target="_blank">Universal Plug &amp; Play</a> (UPnP), which permits automatic port forwarding. Ensure UPnP support for I2P is enabled on the <a href="/config">config page</a>, then try to activate UPnP on your modem/router and possibly your computer also. Now try restarting the <a href="/">I2P router</a>. If successful, I2P should report "Network: OK" in the side panel once the I2P router completes initial connectivity tests. 
   </li>
  
-  <li class="tidylist"><b>Problems running on Legacy Hardware</b><br>[Linux/Unix/Solaris] If you can't start the router with <code>i2p/i2prouter start</code> try the <code>runplain.sh</code> script in the same directory. Root privileges are usually not required to run I2P. If you need to compile the <a href="http://www.i2p2.i2p/jbigi.html" target="_blank">jBigi library</a> (which is necessary in rare cases), consult appropriate documentation, visit the forums, or come pay a visit to our <a href="irc://127.0.0.1:6668/i2p-dev">IRC developer channel</a>.
+<li class="tidylist"><b>Port Forwarding</b><br>Open <a href="/config">I2P's port</a> on your modem, router and/or firewall(s) for better connectivity (ideally both UDP and TCP). More information on how to go about port forwarding can be found at <a href="http://portforward.com/" target="_blank">portforward.com</a>, in addition to our forums and IRC channels listed below. Note that I2P does not support connecting to the internet via an http or socks proxy [patches welcome!], though you can connect to proxies via I2P itself once connected to the network.
+  </li>
 
-  <li class="tidylist"><b>Enable Universal Plug and Play (UPnP)</b><br>Your modem or router may support <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Universal_Plug_and_Play" target="_blank">Universal Plug &amp; Play</a> (UPnP), which permits automatic port forwarding. Ensure UPnP support for I2P is enabled on the <a href="/config">config page</a>, then try to activate UPnP on your modem/router and possibly your computer also. Now try restarting the <a href="/">I2P router</a>. If successful, I2P should report "Network: OK" in the side panel once the I2P router completes initial connectivity tests. 
-    </li>
-  <li class="tidylist"><b>Port Forwarding</b><br>Open <a href="/config">I2P's port</a> on your modem, router and/or firewall(s) for better connectivity (ideally both UDP and TCP). More information on how to go about port forwarding can be found at <a href="http://portforward.com/" target="_blank">portforward.com</a>, in addition to our forums and IRC channels listed below. Note that I2P does not support connecting to the internet via an http or socks proxy [patches welcome!], though you can connect to proxies via I2P itself once connected to the network.
- </li>
-  <li class="tidylist"><b>Getting Support Online</b><br>You may also want 
+<li class="tidylist"><b>Getting Support Online</b><br>You may also want 
   to review the information on the <a href="http://www.i2p2.i2p/" target="_blank">I2P website</a>, 
-  post messages to the <a href="http://forum.i2p2.i2p/" target="_blank">I2P discussion forum</a>, 
+  post messages to the <a href="http://forum.i2p/" target="_blank">I2P discussion forum</a> (also reachable <a href="http://forum.i2p2.de/" target="_blank">on the internet</a>), 
   or swing by
-  <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> or <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> on I2P's internal IRC network (<code>irc.postman.i2p</code> or <code>irc.freshcoffee.i2p</code>). These channels are also available outside of I2P's encrypted, anonymous network via <a href="irc://irc.freenode.net/i2p">Freenode IRC</a>.</li> 
+  <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> or <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> on I2P's internal IRC network (<code>irc.postman.i2p</code> or <code>irc.freshcoffee.i2p</code>). These channels are also available outside of I2P's encrypted, anonymous network via <a href="irc://irc.freenode.net/i2p">Freenode IRC</a>.
+  </li> 
   
-<li class="tidylist"><b>Reporting Bugs</b><br>If you'd like to report a bug, please file a ticket on <a href="http://trac.i2p2.i2p/" target="_blank">trac.i2p2.i2p</a>. For developer-related discussions, please visit <a href="http://zzz.i2p/" target="_blank">zzz's developer forums</a> or come and visit the <a href="irc://127.0.0.1:6668/i2p-dev">developer channel</a> on I2P's IRC network. Developers can browse source at <a href="http://stats.i2p/cgi-bin/viewmtn/" target="_blank">zzz's mtn repository viewer</a>, <a href="http://i2host.i2p/cgi-bin/view/branch/changes/i2p.i2p" target="_blank">Sponge's instance</a>, or via <a href="http://trac.i2p2.i2p/browser" target="_blank">trac.i2p2.i2p</a>. We primarily use <a href="http://www.i2p2.i2p/monotone.html" target="_blank">monotone</a> to manage our source code.</li>
+<li class="tidylist"><b>Reporting Bugs</b><br>If you'd like to report a bug, please file a ticket on <a href="http://trac.i2p2.i2p/" target="_blank">trac.i2p2.i2p</a>. For developer-related discussions, please visit <a href="http://zzz.i2p/" target="_blank">zzz's developer forums</a> or come and visit the <a href="irc://127.0.0.1:6668/i2p-dev">developer channel</a> on I2P's IRC network. Developers can browse source at <a href="http://stats.i2p/cgi-bin/viewmtn/" target="_blank">zzz's mtn repository viewer</a>, <a href="http://i2host.i2p/cgi-bin/view/branch/changes/i2p.i2p" target="_blank">Sponge's instance</a>, or via <a href="http://trac.i2p2.i2p/browser" target="_blank">trac.i2p2.i2p</a>. We primarily use <a href="http://www.i2p2.i2p/monotone.html" target="_blank">monotone</a> to manage our source code.
+  </li>
+
+<li class="tidylist"><b>Get Involved!</b><br>I2P is developed and maintained mostly through unfunded, voluntary participation by community members. We're happy to accept <a href="http://www.i2p2.i2p/donate.html" target="_blank">donations</a>, which go into essential hosting and administrative costs. We have <a href="http://www.i2p2.i2p/bounties.html" target="_blank">cash bounties</a> for aspects of I2P for developers looking for incentives to participate, and we're always looking for more <a href="http://www.i2p2.i2p/newdevelopers.html" target="_blank">Java coders</a>, <a href="http://www.i2p2.i2p/newtranslators.html" target="_blank">translators</a>, promoters and users to help I2P grow. The bigger the I2P network, the more everyone benefits, so simply telling all your friends about I2P (and lending a hand with the installation and setup where needed) is a big help. For further info on how you can participate, visit the <a href="http://www.i2p2.i2p/getinvolved.html" target="_blank">volunteers page</a> on the website.
+  </li>
+
+</ul>
 
-<li class="tidylist"><b>Get Involved!</b><br>I2P is developed and maintained mostly through unfunded, voluntary participation by community members. We're happy to accept <a href="http://www.i2p2.i2p/donate.html" target="_blank">donations</a>, which go into essential hosting and administrative costs. We have <a href="http://www.i2p2.i2p/bounties.html" target="_blank">cash bounties</a> for aspects of I2P for developers looking for incentives to participate, and we're always looking for more <a href="http://www.i2p2.i2p/newdevelopers.html" target="_blank">Java coders</a>, <a href="http://www.i2p2.i2p/newtranslators.html" target="_blank">translators</a>, promoters and users to help I2P grow. The bigger the I2P network, the more everyone benefits, so simply telling all your friends about I2P (and lending a hand with the installation and setup where needed) is a big help. For further info on how you can participate, visit the <a href="http://www.i2p2.i2p/getinvolved.html" target="_blank">volunteers page</a> on the website.</li>
-</ul><div class="topness"><a href="#top">[Return to Top]</a></div>
-<div class="footnote"><hr>Document updated: December 2010.</div>
+<div class="topness"><a href="#top">[Return to Top]</a></div>
+<div class="footnote"><hr>Document updated: February 2011</div>
+</div>
diff --git a/installer/resources/readme/readme_ar.html b/installer/resources/readme/readme_ar.html
new file mode 100644
index 0000000000000000000000000000000000000000..67ef0d0edf6c0497211761fc1bd99443059d21f5
--- /dev/null
+++ b/installer/resources/readme/readme_ar.html
@@ -0,0 +1,34 @@
+<div dir="rtl" lang="ar">
+
+<p>عندما تقوم بتشغيل I2P ستبدأ الأرقام على يسار الشاشة في الازدياد خلال الدقائق التالية وستظهر عبارة <i>Shared Clients</i> (ان <a href=#trouble>لم تظهر، انظر التعليمات اسفله</a>). عندها يمكنك الحصول على عدة خدمات مثل تورنت، البريد الإلكتروني السري، وخدمات أخرى:</p>
+<ul>
+  <li>يمكنك الوصول الى مواقع مجهولة (تسمى eepsites) و خدمات أخرى ( ssh على I2P Jabber،IRC الخ...) زيادة على امكانية استضافة ونشر موقعك الخاص :
+لتصفح مواقع (eepsites) على شبكة I2P عليك تغيير اعدادات المتصفح HTTP proxy الى عنوان 127.0.0.1 و port الى 4444، ثم يمكنك تصفح مواقع <br>
+     <ul class="links">
+          <li><a href="http://forum.i2p/">forum.i2p</a>: وصلة آمنة ومجهولة الى منتدى <a href="http://forum.i2p2.de/">forum.i2p2.de</a></li>
+          <li><a href="http://www.i2p2.i2p/index_fr.html">www.i2p2.i2p</a> Ùˆ <a href="http://i2p-projekt.i2p/index_fr.html">i2p-projekt.i2p</a>:
+              هما موقع الرسمي للمشروع <a href="http://www.i2p2.de/index_fr.html">www.i2p2.de</a></li>
+          <li><a href="http://eepsites.i2p/">eepsites.i2p</a>محرك بحث</li>
+          <li><a href="http://ugha.i2p/">ugha.i2p</a>ويكي مفتوح التي يستطيع الجميع تحريرها مع الكثير من المعلومات حول الشبكة</li>
+          <li><a href="http://fproxy.tino.i2p">fproxy.tino.i2p</a>Freenet مدخل الى شبكة </li>
+	  <li><a href="http://echelon.i2p">echelon.i2p</a>موقع لتحميل مجموعة من البرامج  (I2PFox, iMule, I2P-Messenger, ...) <br></li>
+	       </ul>
+     هناك العديد من eepsites، فقط اتبع هذه الروابط لإكتشاف المزيد!</li>
+  
+  <li class="tidylist"><b>تحميل الملفات</b> يمكن استعمال برنامج <a href="http://www.klomp.org/snark/">Snark</a> الموجود ضمن حزمة برامج I2P لتحميل ملفات <a href="http://www.bittorrent.com/">BitTorrent</a>.</li>
+
+  <li class="tidylist"><b>البريد الالكتروني المجهول:</b> يمكن استعمال شبكة I2P لإرسال واستقبال البريد الالكتروني بطريقة متوافقة مع بروتوكول (POP3 / SMTP) الشيء الذي يمكن من ارسال واستقبال البريد الالكتروني المجهول و المشفر داخل الشبكة وايضا عن طريق الإنترنت العادية. يمكن زيارة <a href="http://hq.postman.i2p/">hq.postman.i2p</a> للحصول على حساب.  .
+     
+  <li class="tidylist"><b>الدردشة بطريقة مجهولة</b> استعمل برنامج الدردشة IRC مثل (Chatzilla, Pidgin, XChat) واتصل بالسيرفر على عنوان 127.0.0.1 وبورت 6668 ليتم الإتصال باحدى السيرفرات IRC المجهولة والمشقرة بحيث لا يستطيع مزود الانترنت او الحكومة او أي شخص آخر التنصت على محادثتك! ثم قم بالدخول الى احدى الغرف i2p-help,#i2p,#i2p-chat# او غرف أخرى.
+  </ul>
+
+<h2>استضافة موقع مجهول ومشفر على شبكة I2P</h2>
+
+<p>يمكنك استضافة موقعك على الشبكة بوضع ملفاتك في مجلد eepsite/docroot (كما يمكن وضع تطبيقات JSP/Servlet ايضا) او استعمال سكريبتات CGI في eepsite/cgi-bin
+</p>
+
+<h2><a name="trouble">المساعدة</a></h2>
+
+<p>يمكن ان يستغرق I2P بعض الوقت في البداية لأنه يقوم بالبحث عن نظائر ليتم الإتضال بالشبكة. اذا استمر الوضع بعد 30 دقيقة، وعدد النظائر المتصلين أقل من 10، تأكد من فتح بورت 8887 على برنامج الجدار الناري.
+اذا لم تستطع الوصول الى اي موقع على الشيكة (مثل www.i2p2.i2p) تأكد من وجود البروكسي 127.0.0.1 وبوورت 4444 في اعدادات متصفح.</p><hr />
+</div>
diff --git a/installer/resources/readme/readme_de.html b/installer/resources/readme/readme_de.html
index 02f35947e4b1080bd2a37d7e8936555da09dcf93..0edc7751e15fefbe29aae5e832c0cb574338377c 100644
--- a/installer/resources/readme/readme_de.html
+++ b/installer/resources/readme/readme_de.html
@@ -1,18 +1,5 @@
 <div lang="de">
-<div align="right">
-  <div class="langbox" align="right">
-    <a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a>
-    <a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="中文" alt="中文"></a>
-    <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
-    <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a>
-    <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a>
-    <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> 
-    <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
-    <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
-    <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a>
-  </div>
-</div></div>
-<div class="welcome"><h2>Willkommen im I2P!</h2></div>
+
 <p>Wenn Du I2P gerade gestartet hast, sollten die "Aktiv:"-Zahlen links in den n&auml;chsten Minuten anwachsen. Du siehst dann dort ein als "versch. Klienten" bezeichnetes lokales Ziel gelistet (falls nicht, <a href="#trouble">siehe unten</a>). Sobald dieses erscheint, kannst Du:</p>
 <ul>
  <li><b>"Eepseiten" besuchen</b> - In I2P gibt es anonym gehostete Websites: 
@@ -28,7 +15,7 @@
          <li><a href="http://paste.i2p2.i2p">paste.i2p2.i2p</a>: anonymer Pastebin</li>
 	</ul><br />
      Es gibt viele andere Eepseiten - folge einfach den Links, die du findest,
-     setze Lesezeichen f&uuml;r Deine Favoriten, und besuche sie oft!</li><br />
+     setze Lesezeichen f&uuml;r Deine Favoriten, und besuche sie oft!</li>
  <li class="tidylist"><b>Im Internet surfen</b> - Es gibt in I2P einen HTTP-"Outproxy". Um ihn zu nutzen, kannst du ebenfalls den
      HTTP-Proxy auf Port 4444 verwenden - Konfiguriere Deines Browsers Proxy-Einstellungen 
      darauf (siehe oben) und besuche jede normale URL - Deine Anfrage wird dann anonym 
@@ -88,5 +75,5 @@
   in <a href="irc://127.0.0.1:6668/i2p">#i2p</a> oder in <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a>
   auf
   irc.postman.i2p 
-  bzw. irc.freshcoffee.i2p chatten. (Beide unter <a href="irc://localhost:6668">irc://localhost:6668</a> erreichbar; die Server sind verbunden.) Wenn Du keinen Zugriff auf I2P hast, kannst du #i2p, #i2p-help und #i2p-de auch auf <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a> erreichen, dann allerdings nicht anonym.</p><hr />
+  bzw. irc.freshcoffee.i2p chatten. (Beide unter <a href="irc://localhost:6668">irc://localhost:6668</a> erreichbar; die Server sind verbunden.) Wenn Du keinen Zugriff auf I2P hast, kannst du #i2p, #i2p-help und #i2p-de auch auf <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a> erreichen, dann allerdings nicht anonym.</p>
 </div>
diff --git a/installer/resources/readme/readme_es.html b/installer/resources/readme/readme_es.html
index b04baaf918ea30c70a45639c505ac1fa1cf08ae1..f6f2cd54423367c1f061f05d02827e2ce911f5a9 100644
--- a/installer/resources/readme/readme_es.html
+++ b/installer/resources/readme/readme_es.html
@@ -1,17 +1,5 @@
 <div lang="es">
-<div align="right">
-<div class="langbox" align="right">
-	<a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> 
-	<a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="中文" alt="中文"></a> 
-	<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> 
-	<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> 
-	<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> 
-	<a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> 
-	<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> 
-	<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> 
-	<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
-</div></div>
-<div class="welcome"><h2>&iexcl;Bienvenido a I2P!</h2></div>
+
 <p>Si acabas de iniciar I2P, al observar el menú de la izquierda, deberías notar que los n&uacute;meros al lado de "Activos:" subirán en los próximos minutos y luego verás allí un Destino llamado "clientes diferentes" (si no, <a href="#trouble">&iexcl;mira abajo!</a>) <br>Apenas aparezca esto, puedes:</p>
 <ul>
  <li><b>visitar p&aacute;ginas I2P ("Eepsites")</b> - En I2P hay p&aacute;ginas web an&oacute;nimas: 
@@ -26,8 +14,7 @@
 	 <li><a href="http://echelon.i2p">echelon.i2p</a>: archivo de software e informaciones sobre I2P (con aplicaciones de BitTorrent, iMule, I2PFox, I2P-Messenger, ...)</li>
          <li><a href="http://paste.i2p2.i2p">paste.i2p2.i2p</a>: pastebin an&oacute;nimo</li>
 	</ul><br />
-     Hay muchas p&aacute;ginas I2P m&aacute;s - simplemente &iexcl;sigue los enlaces que encuentres, pon marcadores para tus favoritos y vis&iacute;talos frecuentemente!</
-     li><br />
+     Hay muchas p&aacute;ginas I2P m&aacute;s - simplemente &iexcl;sigue los enlaces que encuentres, pon marcadores para tus favoritos y vis&iacute;talos frecuentemente!</li>
  <li class="tidylist"><b>navegar en internet</b> - I2P cuenta con un HTTP-"Outproxy". Para poder usarlo, puedes tambi&eacute;n utilizar el proxy HTTP en el puerto 4444 - Si configuras tu navegador web para usar este proxy, puedes visitar las p&aacute;ginas web de forma an&oacute;nima. El tr&aacute;fico ser&aacute; enrutado atrav&eacute;s de la red I2P.</li>
  <li class="tidylist"><b>intercambiar datos</b> - Hay una <a href="i2psnark/">adaptaci&oacute;n</a> para I2P de la aplicaci&oacute;n <a href="http://www.bittorrent.com/">BitTorrent</a> 
      <a href="http://www.klomp.org/snark/">Snark</a>.</li>
@@ -75,5 +62,5 @@
    , todos en los servidores irc.postman.i2p y irc.freshcoffee.i2p. 
    (Puedes acceder a ambos bajo <a href="irc://localhost:6668">irc://localhost:6668</a>; los dos servidores est&aacute;n conectados.) 
    Si a&uacute;n no tienes acceso a I2P, tambi&eacute;n puedes entrar en #i2p y #i2p-help del servidor <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a> - 
-   entonces de forma no an&oacute;nima.</p><hr />
+   entonces de forma no an&oacute;nima.</p>
 </div>
diff --git a/installer/resources/readme/readme_fr.html b/installer/resources/readme/readme_fr.html
index dea15fa7e6e02d0f7f3b9736a8c79633f22563a3..9f2122dd9433efbe5cf1086525a2d32a67a0bbc2 100644
--- a/installer/resources/readme/readme_fr.html
+++ b/installer/resources/readme/readme_fr.html
@@ -1,55 +1,277 @@
 <div lang="fr">
-<div align="right">
-<div class="langbox" align="right">
-	<a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> 
-	<a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="中文" alt="中文"></a> 
-	<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> 
-	<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> 
-	<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> 
-	<a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> 
-	<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> 
-	<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> 
-	<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
-</div></div>
-<div class="welcome"><h2>Bienvenu sur I2P!</h2></div>
-<p>Si vous venez juste de lancer I2P, les chiffres sur la gauche &agrave; cot&eacute; de Active devraient commencer &agrave; augmenter dans les prochaines minutes et vous verrez un "Shared client" en destination locale list&eacute;s sur la gauche (si non, <a href=#trouble>voir plus bas</a>). Une fois qu'ils apparaissent, vous pouvez:</p>
-<ul>
-  <li><b>Parcourir les "eepsites"</b> - sur I2P il y a des sites web anonymes h&eacute;berg&eacute;s - dites &agrave; votre navigateur d'utiliser <b>le HTTP proxy a l'adresse 127.0.0.1 port 4444</b>, ensuite vous pouvez naviguer sur les eepsites:<br>
-     <ul class="links">
-          <li><a href="http://forum.i2p/">forum.i2p</a>: une connection s&eacute;curis&eacute;e et anonyme vers <a href="http://forum.i2p2.de/">forum.i2p2.de</a></li>
-          <li><a href="http://www.i2p2.i2p/index_fr.html">www.i2p2.i2p</a> et le miroir <a href="http://i2p-projekt.i2p/index_fr.html">i2p-projekt.i2p</a>:
-              connections s&eacute;curis&eacute;es et anonyme vers <a href="http://www.i2p2.de/index_fr.html">www.i2p2.de</a></li>
-          <li><a href="http://eepsites.i2p/">eepsites.i2p</a>: un moteur de recherche d'eepsites</li>
-          <li><a href="http://ugha.i2p/">ugha.i2p</a>: l'eepsite d'ugha, un wiki que chaucun peut &eacute;diter ainsi que</li>
-          <li><a href="http://fproxy.tino.i2p">fproxy.tino.i2p</a>: un proxy Freenet 0.5</li>
-	  <li><a href="http://echelon.i2p">echelon.i2p</a>: archive de software (I2PFox, iMule, I2P-Messenger, ...) et informations &agrave; propos de I2P<br></li>
-	  <li><a href="http://paste.i2p2.i2p">paste.i2p2.i2p</a>: Pastebin anonyme</li>
-	  <br>
-     </ul>
-     Il y a bien plus d'eepsites - suivez juste les liens au d&eacute;part de ceux sur lesquels vous &ecirc;tes, mettez-les dans vos favoris et visitez-les souvent!</li><br>
-  <li class="tidylist"><b>Parcourir le web</b> - Il y a pour l'instant un outproxy HTTP sur I2P attach&eacute; &agrave; votre propre proxy HTTP sur le port 4444 - vous devez simplement configurer le proxy de votre navigateur pour l'utiliser (comme expliqu&eacute; ci-dessus) et aller sur n'importe quel URL normale - vos requ&ecirc;tes seront relay&eacute;es par le r&eacute;seau i2p.</li>
-  <li class="tidylist"><b>Transfer de fichiers</b> - Il y a un <a href="i2psnark/">port</a> int&eacute;gr&eacute; de <a href="http://www.klomp.org/snark/">Snark</a> le client <a href="http://www.bittorrent.com/">BitTorrent</a>.</li>
-  <li class="tidylist"><b>Utiliser le service de mail anonyme</b> - Postman a cr&eacute;&eacute; un syt&egrave;me de mails compatible avec un client de messagerie normal (POP3 / SMTP) qui permet d'envoyer des emails autant au sein d'i2p que vers et &agrave; partir de l'internet normal! Cr&eacute;ez-vous un compte &agrave;  <a href="http://hq.postman.i2p/">hq.postman.i2p</a>.
-     Nous fournissons dans la version de base de i2p <a href="/susimail/susimail">susimail</a>,
-     un client web pop3/smtp orient&eacute; sur l'anonymat qui est configur&eacute; pour acc&eacute;der aux services email de postman. 
-     <br>Alternativement, vous pouvez essayer le nouveau syst&egrave;me de courrier sans serveur et crypt&eacute; de bout-en-bout 
-     <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a> (avec une interface web), installable comme un plugin.<br></li>
-  <li class="tidylist"><b>Chatter de mani&egrave;re anonyme</b> - Activez votre client IRC et connectez-le sur le serveur <b>127.0.0.1 port 6668</b>. Ceci pointe vers l'un des deux serveur IRC anonyme, mais ni vous ni eux ne savent qui est l'autre</li>
-  <li class="tidylist"><b>Cr&eacute;ez-vous un blog anonyme</b> - Renseignez-vous chez <a href="http://syndie.i2p2.de/">Syndie</a></li>
-  <li class="tidylist">Et bien d'autres</li>
+(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> 
+intitulée <i>Clients partagés</i>, avec d'éventuels autres clients et serveurs suivant la configuration initiale d'I2P
+(sinon, voir plus bas la <a href=#trouble>section dépannage</a>). Ces <i>destinations locales</i> fournissent des 
+connexions sur différent ports (et parfois des protocoles) au réseau I2P, pour permettre le fonctionnement de votre 
+client BitTorrent, de votre messagerie, du mandataire Internet et autres services. Votre 
+<a href="/netdb">base de données réseau</a> indique tous les pairs que connaît votre routeur. Vous pouvez surveiller 
+les <a href="/peers">connexions de pairs</a> en cours et voir les <a href="/tunnels">tunnels</a> existants et leur 
+état. D'autres informations sont disponibles sur la page d'<a href="/help">aide</a>.</li>
+
+<li class="tidylist"><b>Intégration au réseau</b><br>La première fois que vous lancez I2P l'intégration au réseau peut 
+prendre quelques minutes, le temps que votre routeur soit connu et trouve d'autres pairs qui amélioreront alors son 
+intégration: soyez patient. Quand I2P démarre, et en fonctionnement établi, I2P affiche un indicateur d'état, (juste au 
+dessus de la section <i>destinations locales</i> dans le panneau de surveillance), qui peut vous signaler l'information 
+"Refus de tunnels"; ce comportement est normal et ne doit pas vous inquiéter! Une fois que les étoiles vertes 
+s'affichent en face des <i>destinations locales</i>, le monde d'I2P vous est ouvert. En voici un aperçu:
+</li></ul>
+
+<h3>Les services sur I2P</h3>
+<ul class="links">
+
+<li class="tidylist"><b>Internet invisible &amp; exploration anonyme du web public</b><br>Sur I2P vous pouvez accéder 
+à des sites anonymes (les sites eep) et à d'autres services (par exemple SSH sur I2P, IRC, Jabber, etc&hellip;), et 
+vous pouvez aussi héberger vos propres services anonyme. Vous avez également un accès anonyme au web normal via le 
+serveur mandataire sortant ("outproxy") I2P intégré. Pour ceci, 
+<a href="http://www.i2p2.de/htproxyports_fr.html" target="_blank">configurez votre navigateur</a> pour qu'il utilise le 
+mandataire <code>127.0.0.1 sur le port 4444</code>, puis promenez-vous sur les sites eep ou non cryptés normaux 
+(adresses <code>http://</code>. Vous trouverez sûrement un intérêt à utiliser un navigateur préconfiguré: essayez 
+<a href="http://echelon.i2p/i2pfox/">I2PFox</a>, une version de Firefox renforcée en termes de sécurité et spécialement 
+adaptée à i2P. Si vous voulez désactiver ou modifier l'accès mandaté à l'Internet normal, enlevez ou modifiez l'entrée 
+<code>false.i2p</code> dans les options de <i>mandataires</i> du <i>gestionnaire de tunnels</i> pour le 
+<a href="/i2ptunnel/edit?tunnel=0" target="_blank">mandataire HTTP I2P</a>. Dans la section "Sites intéressants" 
+<a href="#eepsites">ci-dessous</a>, vous trouverez notre petite sélection de sites hébergés sur I2P.</li>
+
+<li class="tidylist"><b>Messagerie anonyme</b><br>Le système de messagerie basé sur I2P de Postman est utilisable soit 
+par le <a href="/susimail/susimail">client de messagerie I2P intégré</a> dans la console du routeur (susimail), soit en 
+configurant n'importe quel logiciel client de messagerie compatible SMTP et POP3. Les comptes peuvent recevoir et 
+envoyer du courrier de/vers l'Internet normal. Créez au moins votre compte sur 
+<a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. En complément, 
+<a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> est le nouveau système intra-I2P décentralisé, sécurisé 
+(crypté de bout en bout) et équipé d'un système de relayage anonymo-pseudonymique, ainsi que d'une interface web et d'un 
+carnet d'adresses intégré. Développé par HungryHobo, il s'installe en tant que <a href="#plugins">greffon</a>.</li>
+
+
+<li class="tidylist"><b>Transfert de fichiers anonyme</b><br><a href="/i2psnark/" target="_blank">I2PSnark</a> est 
+intégré dans le router I2P. Il permet les transferts anonymes et cryptés 
+<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/BitTorrent_%28protocole%29" target="_blank">BitTorrent</a>. 
+Sponge a développé en Python un autre client bittorrent appelé <a href="http://bob.i2p/Robert.html">Robert</a>.
+Il y a aussi un portage d'<a href="http://www.emule-project.net/" target="_blank">eMule/aMule</a> sur I2P:&hellip; 
+<a href="http://echelon.i2p/imule/">iMule</a> [Cherche développeurs!], une implémentation anonyme et sécurisée d'un 
+<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Gnutella" target="_blank">réseau Gnutella</a> accessible par  
+<a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a> [maintenu par Complication, mais on cherche de nouveaux 
+développeurs!], ainsi que d'autres utilitaires dont un hébergement de fichiers basé sur le navigateur.</li>
+<li class="tidylist"><b>Claviotage anonyme (non ça n'est pas le nom de mon chat)</b><br>Lancez votre client IRC (p.e. 
+Chatzilla, Pidgin, XChat, etc&hellip;) et connectez-vous au <a href="irc://127.0.0.1:6668/i2p-help">serveur</a> sur 
+<code>127.0.0.1 port 6668</code>. Vous n'avez pas besoin de configurer un proxy dans votre client IRC: I2P vous fournit 
+un tunnel IRC local (configuré dans votre client IRC en tant qu'hôte serveur IRC distant). Votre tunnel IRC local 
+sur <code>localhost:6668</code> vous emmènera sur un des deux serveurs hébergés sur I2P par Postman and Badger, mais 
+ni vous ni eux ne sauront où se trouve l'autre, et ni ta maman ni ton gouvernement ne sera capable d'intercepter ta  
+conversation!&hellip; (sauf,&hellip; heu&hellip; regarde quand même dans ton dos!&hellip;ET dans le faux plafond ET dis 
+à ton correspondant d'en faire autant&hellip; ET coulez vos PC dans du béton). Une fois là, /join 
+<code>#i2p-help</code>, <code>#i2p-chat</code>, <code>#i2p</code>, <code>#i2p-chat</code> ou <code>#i2p-dev</code> 
+ne sont que quelques unes des possibilités pour mettre la tête dehors, même si ça va pas améliorer le bronzage de ta 
+couenne d'endive.&LT;/délire&GT; Il y a aussi une 
+<a href="http://echelon.i2p/qti2pmessenger/">messagerie instantanée</a> à la sauce I2P pour le claviotage anonyme 
+(tiens, le rev'là) non surveillable et non censurable, ainsi que d'autres serveurs IRC, Jabber, website-based chat, 
+and more. Et bien sûr vous avez l'entière liberté de faire tourner vos propres serveurs sur I2P, dans la version qui 
+vous émoustille les papilles, et si vous êtes un développeur, d'écrire vos propres 
+<a href="http://www.i2p2.i2p/applications.html" target="_blank">applications I2P</a> (les protocoles 
+<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/User_Datagram_Protocol" target="_blank">UDP</a> et 
+<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Transmission_Control_Protocol" target="_blank">TCP</a> 
+sont tous deux <a href="http://www.i2p2.i2p/techintro_fr.html#op.transport" target="_blank">compatibles</a>), et 
+<a href="http://www.i2p2.i2p/streaming.html" target="_bla_nk">les flux en temps réel</a> sont aussi au menu. 
+Nous fournissons aussi un accès complet à l'<a href="http://docs.i2p2.de/javadoc/" target="_blank">API Java</a>.</li>
+<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://i2plugins.i2p/" target="_blank">i2plugins.i2p</a>. 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> 
+d'autres suggestions.</li>
+  <li class="tidylist"><a name="plugins"></a><b>Greffons pour I2P</b><br>Étendez l'usage et la portée d'I2P en 
+installant des greffons&hellip; blog, chat, partage de fichiers et autres sont déjà écrits ou portés, et n'attendent 
+autre chose que vous les <a href="http://i2plugins.i2p/plugins/" target="_blank">installiez</a>! 
+Consultez la carte (et les secrets du chef) sur <a href="http://i2plugins.i2p/" target="_blank">i2plugins.i2p</a>. 
+Si vous êtes <a href="http://i2plugins.i2p/developers/" target="_blank">développeur</a>, vous disposez d'un 
+environnement d'écriture de greffons indépendant de tout langage dans la  
+<a href="http://www.i2p2.i2p/plugins_fr.html" target="_blank">documentation</a>; les greffons I2P peuvent être codés dans 
+n'importe quel langage.</li>
 </ul>
 
-<h2>Vous voulez votre propre eepsite?</h2>
+<h3>Hébergement crypté anonyme sur I2P</h3>
+<ul class="links">
+
+<li class="tidylist"><b>Prêt à servir!</b><br>I2P arrive avec un serveur intégré, prêt à servir votre propre site web 
+anonyme (eepsite) sur le réseau I2P: une instance <a href="http://jetty.mortbay.org/" target="_blank">Jetty</a> qui 
+écoute sur <a href="http://127.0.0.1:7658/" target="_blank">http://127.0.0.1:7658/</a>. Pour héberger votre propre 
+contenu, placez tout bêtement vos fichiers dans le répertoire <code>eepsite/docroot/</code> (ou déposez n'importe quel 
+fichier JSP/Servlet standard .war dans <code>eepsite/webapps</code>, ou des scripts CGI standards dans 
+<code>eepsite/cgi-bin</code>) et ils s'afficheront. Vous gardez tout loisir de choisir le serveur web qui vous convient 
+pour fonctionner sur I2P et remplacer le serveur intégré, ou exécuter celui-ci sur un autre tunnel.</li>
+<li class="tidylist"><b>Démarrez votre tunnel</b><br>  
+  Après le démarrage de votre <a href="/i2ptunnel/" target="_blank">Tunnel serveurWeb I2P</a>, votre eepsite sera 
+visible (mais pas encore découvrable) par les I2P'nautes. Les instructions détaillées de démarrage de votre eepsite, 
+d'enregistrement d'un domaine .i2p et de promotion de votre site sont accessibles via votre propre serveur à 
+l'adresse <a href="http://127.0.0.1:7658/help/" target="_blank">http://127.0.0.1:7658/help/</a>.</li></ul>
+    
+<a name="eepsites"></a>    
+    <h3>Sites I2P intéressants</h3>
+    <ul class="links">
+      <li class="tidylist"><b>Le site officiel de l'Invisible Internet Project (I2P)</b><br>
+<a href="http://www.i2p2.i2p/" target="_blank">www.i2p2.i2p</a> et son miroir 
+<a href="http://i2p-projekt.i2p/" target="_blank">i2p-projekt.i2p</a> sont les adresses de connexions sécurisées et 
+anonymes des sites classiques <a href="http://www.i2p2.de/" target="_blank">www.i2p2.de</a> et 
+<a href="http://geti2p.net/" target="_blank">geti2p.net</a>. Si vous êtes curieux du fonctionnement d'I2P et de la 
+façon d'y contribuer, vous venez de trouver la porte d'entrée.</li>
+      <li class="tidylist"><b>Les fora de la communauté</b><br>
+<a href="http://forum.i2p/" target="_blank">forum.i2p</a>: la version anonyme et sécurisée de 
+<a href="http://forum.i2p2.de/" target="_blank">forum.i2p2.de</a>, le forum sur lequel les développeurs et les 
+utilisateurs aiment discuter de problèmes et d'idées relatifs à I2P et aux sujets apparentés, et le 
+<a href="http://zzz.i2p/" target="_blank">forum des développeurs de zzz</a> également ouvert aux utilisateurs.</li>
+      <li class="tidylist"><b>Pastebin anonyme I2P</b><br>
+<a href="http://paste.i2p2.i2p/" target="_blank">paste.i2p2.i2p</a>: service de collage sécurisé et anonyme pour le 
+partage de texte et de code au format textuel sur I2P.</li>
+      <li class="tidylist"><b>Les ressources i2P d'Echelon</b>
+<br><a href="http://echelon.i2p/" target="_blank">echelon.i2p</a>: dépôt de logiciels I2P (I2PFox, iMule, 
+I2P-Messenger&hellip;) avec leurs code sources (quand c'est permis), informations sur I2P, dont le  
+<a href="http://echelon.i2p/I2Pguide/index.html" target="_blank">guide du débutant</a> et pour les plus téméraires, 
+les pré-versions d'I2P à essayer.</li>
+        <li class="tidylist"><b>Le Wiki d'Ugha</b><br><a href="http://ugha.i2p/" target="_blank">ugha.i2p</a>: un wiki 
+ouvert et anonyme sur lequel chacun peut modifier toute sorte d'informations sur I2P, l'aide pour les débutants, 
+des liens supplémentaires dans le réseau, etc&hellip;</li>
+      <li class="tidylist"><b>Proxy I2P-vers-Freenet</b><br>
+<a href="http://fproxy.tino.i2p/" target="_blank">fproxy.tino.i2p</a>: une fenêtre sur le monde du réseau 
+<a href="http://freenetproject.org/" target="_blank">Freenet</a> grâce au mandataire I2P-vers-Freenet de Tino.</li>
+     <li class="tidylist"><b>The Planet (sur I2P)</b><br><a href="http://planet.i2p/" target="_blank">planet.i2p</a>: 
+un site agrégateur RSS qui collecte les nouvelles et évènements concernant I2P et les publie toutes regroupée en un 
+seul endroit. Un bon aperçu de la communauté au travail!</li>
+        <li class="tidylist"><b>Moteur de recherches eepsites</b><br>
+<a href="http://eepsites.i2p/" target="_blank">eepsites.i2p</a>: moteur de recherches sur les contenus I2P hébergé 
+anonymement.</li>
+      <li class="tidylist"><b>Météo du réseau I2P</b><br>
+<a href="http://stats.i2p/cgi-bin/dashboard.cgi" target="_blank">stats.i2p</a>: vérifiez divers aspects des 
+performances du réseau I2P avec ce site superviseur maintenu par zzz.</li> 
+      <li class="tidylist"><b>Découvrez I2P</b><br>Il y a plein d'autres eepsites: suivez simplement les liens que vous 
+rencontrez, marquez-les en favoris, et retournez-y souvent!<br></li>     
+    </ul>
+
+
+<h2><a name="trouble"></a>Résolution de problèmes &amp; assistance supplémentaire</h2>
 
-<p>Nous fournissons de base quelques logiciels pour vous permettre de cr&eacute;er votre propre eepsite - une instance 
-<a href="http://jetty.mortbay.org/">Jetty</a>, qui &eacute;coute sur
-<a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a>.  Placer simplement vos fichiers dans le r&eacute;pertoire <code>eepsite/docroot/</code> (ou placez n'importe quel fichier JSP/Servlet standard <code>.war</code>) dans eepsite/webapps, ou script CGI standard dans <code>eepsite/cgi-bin</code>) et ils apparaitront. Apr&egrave;s avoir d&eacute;marr&eacute; un <a href="/i2ptunnel/">tunnel pour votre eepsite</a> (le tunnel doit pointer sur l'adresse locale du eepsite), votre eepsite sera visible pour les autes. Des instructions plus d&eacute;taill&eacute;es pour cr&eacute;er un eepsite se trouvent sur <a href="http://127.0.0.1:7658/">Votre eepsite temporaire</a>.
-</p>
+<ul class="links">
 
-<h2><a name="trouble">D&eacute;pannage</a></h2>
+<li class="tidylist"><b>Soyez patient!</b><br>I2P peut être long à s'intégrer au réseau la première fois que vous le 
+lancez car il s'amorce en découvrant des pairs supplémentaires. Plus il tourne longtemps, mieux il fonctionnera, donc 
+essayez de le laisser marcher le plus longtemps que vous pouvez, 24h/24 7j/7 si possible! Si après 30mn le nombre 
+<i>Actifs: [connectés/récents]</i> montre moins de 10 pairs, ou que le nombre de pairs <i>bien intégrés</i> est 
+inférieur à 5, voici ce que vous pouvez faire pour trouver l'origine du problème: 
+  </li>
+
+<li class="tidylist"><b>Vérifiez votre configuration &amp; allocation de bande passante</b><br>I2P fonctionne au mieux 
+quand vous reflétez correctement la vitesse de votre connexion Internet dans la section  
+<a href="/config">Gestionnaire de bande passante</a>. 
+I2P est configuré par défaut avec des valeurs volontairement faibles qui ne conviennent généralement pas. Merci de 
+prendre le temps d'adapter ces valeurs à votre cas particulier. Plus vous allouez de bande passante, <i>en particulier 
+la bande passante sortante</i>, plus vous obtiendrez de bonnes performances.</li>
+
+<li class="tidylist"><b>Pare-feux, Modems &amp; Routeurs</b><br>Si possible, assurez-vous que I2P/Java dispose d'un 
+accès bidirectionnel à un port accessible depuis Internet en configurant votre modem-routeur(box x-DSL) et le pare-feu 
+logiciel de votre PC en conséquence. Si vous êtes derrière un pare-feu hors de votre contrôle mais avec un accès 
+sortant non restrictif, I2P peut quand même fonctionner: vous pouvez désactiver les accès entrants et vous reposer sur 
+la <a href="http://www.i2p2.i2p/udp.html" target="_blank">détection d'adresse IP par SSU</a> 
+(<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Hole_punching" target="_blank">firewall hole punching</a>) 
+pour vous connecter au réseau, et le panneau de surveillance indiquera alors l'état "Réseau: Bloqué par un pare-feu". 
+Pour obtenir des performances optimales, préférez si possible de donnez accès à I2P l'accès à un 
+<b><a href="/config">port externe</a> visible depuis Internet</b>.<br />
+Pendant l'installation, I2P choisit aléatoirement ce port <a href="http://127.0.0.1:7657/config">modifiable ici</a>. 
+Vous pouvez laisser ce port ou en choisir un autre, et quel que soit votre choix régler vos pare-feux en conséquence.
+<br />
+Voir plus bas pour d'autres solutions.
+   </li>
+  
+<li class="tidylist"><b>Vérifiez vos réglages de mandataire</b><br>Si vous n'avez accès à aucun site eep (même pas 
+à <a href="http://www.i2p2.i2p/" target="_blank">www.i2p2.i2p</a>), assurez-vous que le mandataire de votre navigateur 
+est réglé pour le trafic HTTP (<i>pas</i> https, <i>ni</i> socks) via <code>127.0.0.1 port 4444</code>. Si vous avez 
+besoin d'aide, voici le  
+<a href="http://www.i2p2.i2p/htproxyports_fr.html" target="_blank">guide</a> de configuration du navigateur pour 
+l'utilisation avec I2P, également 
+<a href="http://www.i2p2.de/htproxyports_fr.html" target="_blank">disponible sur le web normal</a>. 
+  </li>
+
+<li class="tidylist"><b>Vérifiez vos historiques</b><br>Les <a href="/logs">historiques</a> peuvent aider à 
+diagnostiquer un problème. Vous pouvez en coller un extrait sur un 
+<a href="http://forum.i2p/viewforum.php?f=10" target="_blank">forum</a> pour obtenir de l'aide, ou plutôt le 
+<a href="http://paste.i2p2.i2p/" target="_blank">coller ici</a> et faire référence au lien sur le canal IRC #i2p-fr 
+(Freenode).
+  </li> 
+
+<li class="tidylist"><b>Vérifiez que Java est à jour</b><br>Assurez-vous que vous avez la dernière version de Java 
+[vers. 1.6 ou plus récente recommandée, et impérative pour certaines fonctionnalités]. Vérifez la version de votre JRE 
+ (<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Environnement_d%27ex%C3%A9cution_Java" target="_blank">
+Java Runtime Environment</a>) en haut de page de vos <a href="/logs">historiques</a>. Si vous êtes un développeur, 
+un <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Java_Development_Kit" target="_blank">SDK Java</a> et  
+<a href="http://ant.apache.org/" target="_blank">Apache Ant</a> sont nécessaires à la compilation des sources.
+  </li>
+ 
+<li class="tidylist"><b>Problèmes avec des matériels anciens</b><br>[Linux/Unix/Solaris] Si vous ne pouvez pas 
+démarrer le routeur avec <code>i2p/i2prouter start</code> essayez le script <code>runplain.sh</code> dans le même 
+répertoire. L'accès root n'est normalement pas requis pour exécuter I2P. Si vous devez compiler la  
+<a href="http://www.i2p2.i2p/jbigi.html" target="_blank">bibliothèque jBigi</a> (ce est nécessaire dans de rares cas), 
+consultez la documentation appropriée, visitez les forums, ou venez faire un tour sur notre 
+<a href="irc://127.0.0.1:6668/i2p-dev">canal des développeur</a>.
+  </li>
+
+<li class="tidylist"><b>Activez Universal Plug and Play (UPnP)</b><br>Votre modem-routeur est peut-être compatible avec 
+<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Universal_Plug_and_Play" target="_blank">Universal Plug 
+&amp; Play</a> (UPnP) qui permet le transfert de ports automatique. Vérifiez que le support UPnP pour I2P est activé 
+dans la page de <a href="/config">configuration</a>, puis essayez d'activer UPnP dans votre modem-routeur et 
+éventuellement dans votre ordinateur. Maintenant, <a href="/">redémarrez le routeur I2P</a>. Si ça marche, le panneau 
+de surveillance devrait alors indiquer "Réseau: OK" une fois que le routeur I2P aura terminé ses tests de connectivité. 
+</li>
+ 
+<li class="tidylist"><b>Redirection de ports</b><br>Ouvrez le <a href="/config">port d'I2P</a> sur votre modem, routeur 
+et/ou pare-feu(x) logiciels pour améliorer la connectivité (idéalement, pour UDP et TCP). Plus d'informations sur la 
+façon de s'y prendre pour divers matériels est accessible sur 
+<a href="http://portforward.com/" target="_blank">portforward.com</a>, avec nos forums et canaux IRC listés ci-dessous. 
+Notez qu'I2P ne prend pas en charge la connexion à Internet via des mandataires (proxies) http ou socks [correctifs 
+bienvenus!], bien qui vous puissiez vous connecter à des mandataires via I2P lui-même quand il connecté au réseau</li>
+
+<li class="tidylist"><b>Aide en ligne</b><br>Vous pouvez trouver de l'information à parcourir sur le 
+<a href="http://www.i2p2.i2p/" target="_blank">site web I2P</a>, poster des messages sur le 
+<a href="http://forum.i2p/" target="_blank">forum de discussion I2P</a> 
+(accessible <a href="http://forum.i2p2.de/" target="_blank">ici</a> sur l'Internet classique), ou louvoyer sur les 
+canaux IRC 
+<a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> ou encore 
+<a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> dans le réseau interne I2P (<code>irc.postman.i2p</code> ou 
+<code>irc.freshcoffee.i2p</code>). Ces canaux sont aussi accessibles de façon non cryptée en dehors du réseau anonyme 
+via le serveur IRC <a href="irc://irc.freenode.net/i2p">Freenode</a>.
+  </li> 
+  
+<li class="tidylist"><b>Rapports de bogues</b><br>Si vous voulez rapporter un bogue, merci d'enregistrer un ticket sur 
+<a href="http://trac.i2p2.i2p/" target="_blank">trac.i2p2.i2p</a>. Les développeurs discutent sur les 
+<a href="http://zzz.i2p/" target="_blank">fora de développeurs de zzz</a> ou sur le 
+<a href="irc://127.0.0.1:6668/i2p-dev">canal des développeurs</a>. Les développeurs peuvent consulter les sources sur 
+<a href="http://stats.i2p/cgi-bin/viewmtn/" target="_blank">l'explorateur du dépôt de zzz</a>, 
+<a href="http://i2host.i2p/cgi-bin/view/branch/changes/i2p.i2p" target="_blank">l'instance de Sponge</a>, ou par  
+<a href="http://trac.i2p2.i2p/browser" target="_blank">trac.i2p2.i2p</a>. Nous utilisons 
+<a href="http://www.i2p2.i2p/monotone.html" target="_blank">monotone</a> pour gérer les sources du code.
+  </li>
+
+<li class="tidylist"><b>Impliquez-vous!</b><br>I2P est principalement développé et maintenu bénévolement par les 
+membres dévoués d'une équipe de développeurs. Nous acceptons les 
+<a href="http://www.i2p2.i2p/donate_fr.html" target="_blank">dons</a>. Ils sont essentiellement affectés aux coûts 
+administratifs et d'hébergements. Nous avons un système de 
+<a href="http://www.i2p2.i2p/bounties.html" target="_blank">primes</a> pour certains aspects d'I2P à l'intention de 
+développeurs qui rechercheraient des incitations, et nous sommes en recherche permanente de plus de  
+<a href="http://www.i2p2.i2p/newdevelopers_fr.html" target="_blank">codeurs Java</a>, de
+<a href="http://www.i2p2.i2p/newtranslators_fr.html" target="_blank">traducteurs</a>, de prescripteurs et 
+d'utilisateurs pour accélérer la diffusion d'I2P. Plus grand sera le réseau I2P, plus tout le monde en profitera, 
+alors en parler simplement à l'apéro avec vos amis au lieu de vous étriper pour savoir si le PSG est plus tafiole 
+que l'OM n'est tarlouze, (et tendre la main à votre pire ennemi pour l'installation et les réglages chaque fois que 
+le besoin s'en fait sentir) sera une belle participation! Pour en savoir plus sur les façons de participer, venez 
+visiter le zoo sur la page "<a href="http://www.i2p2.i2p/getinvolved_fr.html" target="_blank">Engagez-vous!</a>" du 
+site web.
+  </li>
+
+</ul>
 
-<p>Soyez patient - i2p peut s'av&eacute;rer lent &agrave; d&eacute;marrer la premi&egrave;re fois car il recherche des pairs. Si, apr&egrave;s 30 minutes, votre Actives: connect&eacute;/r&eacute;cent compte moins de 10 pairs connect&eacute;s, vous devez ouvrir le port 8887 sur votre pare-feu pour avoir une meilleure connection. Si vous ne pouvez acc&eacute;der &agrave; aucun eepsite (m&ecirc;me <a href="http://www.i2p2.i2p/index_fr.html">www.i2p2.i2p</a>), soyez s&ucirc;r que votre navigateur utilise bien le proxy 127.0.0.1 sur le port 4444. Vous pouvez aussi faire part de votre d&eacute;marche sur le <a href="http://www.i2p2.i2p/index_fr.html">site web I2P</a>, poster des message sur le <a href="http://forum.i2p/">forum de discussion</a>,
- ou passer par
- <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p-fr">#i2p-fr</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> ou <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a>
- sur IRC sur le serveur <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a>, irc.postman.i2p ou irc.freshcoffee.i2p (ils sont li&eacute;s).</p><hr />
+<div class="topness"><a href="#top">[Haut de page]</a></div>
+<div class="footnote"><hr>Document mis à jour en février 2011</div>
 </div>
diff --git a/installer/resources/readme/readme_nl.html b/installer/resources/readme/readme_nl.html
index bd5938ef27ac358c45ae0006ebb322c9dcb2d013..beb580c929a8b5f385c257a04844cf18a3c6dbdc 100644
--- a/installer/resources/readme/readme_nl.html
+++ b/installer/resources/readme/readme_nl.html
@@ -1,71 +1,94 @@
 <div lang="nl">
-<div align="right">
-<div class="langbox" align="right">
-	<a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> 
-	<a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="中文" alt="中文"></a> 
-	<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> 
-	<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> 
-	<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> 
-	<a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> 
-	<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> 
-	<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> 
-	<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
-</div></div>
-<div class="welcome"><h2>Welkom bij I2P!</h2></div>
-<p>Als je net I2P opgestart hebt, zullen de 'Active:' (Actieve) getallen aan de linkerkant in de komende minuten stijgen, en je zal een "Shared clients" (Gedeelde clients) lokale bestemming zien staan aan de linkerkant (indien niet, <a href=#trouble>zie hieronder</a>). Eenmaal je deze bestemming ziet, kan je:</p>
-<ul>
- <li><b>surfen naar "eepsites"</b> - op I2P zijn er anonieme websites - stel je browser in om de <b>HTTP proxy op 127.0.0.1, poort 4444</b> te gebruiken, en surf vervolgens naar een eepsite:<br>
-     <ul class="links">
-         <li><a href="http://forum.i2p/">forum.i2p</a>: een beveiligde en anonieme verbinding naar <a href="http://forum.i2p2.de/">forum.i2p2.de</a></li>
-         <li><a href="http://www.i2p2.i2p/">www.i2p2.i2p</a> en de kopie <a href="http://i2p-projekt.i2p">i2p-projekt.i2p</a>:
-              beveiligde en anonieme verbindingen naar <a href="http://www.i2p2.de/">www.i2p2.de</a></li>
-         <li><a href="http://eepsites.i2p/">eepsites.i2p</a>: een anoniem gehoste zoekmachine voor eepsites</li>
-         <li><a href="http://ugha.i2p/">ugha.i2p</a>: ugha's eepsite, een wiki die door iedereen aangepast kan worden, met veel links</li>
-         <li><a href="http://fproxy.tino.i2p">fproxy.tino.i2p</a>: proxy naar het Freenet-netwerk</li>
-         <li><a href="http://echelon.i2p">echelon.i2p</a>: software 
-        archive and information for I2P</li>
-	       <li><a href="http://paste.i2p2.i2p">paste.i2p2.i2p</a>: anonieme Pastebin</li>         
-     </ul><br>
-     Er zijn nog veel meer eepsites - volg gewoon de links vanaf diegene die je ziet. Voeg de beste toe aan je favorieten, en bezoek ze regelmatig!</li>
-<ul><li class="tidylist"><b>surfen op het web</b> - er is momenteel een HTTP "outproxy" in I2P, vastgehaakt aan je eigen HTTP proxy op poort 4444 - stel eenvoudigweg de proxy van je browser in om deze te gebruiken (zoals hierboven voor eepsites) en ga naar een willekeurige normale URL - je verzoeken voor websites worden rondgestuurd via het I2P-network.</li>
- <li class="tidylist"><b>bestanden versturen</b> - er is een geintegreerde <a href="i2psnark/">aangepaste versie</a> van de
-     <a href="http://www.klomp.org/snark/">Snark</a> <a href="http://www.bittorrent.com/">BitTorrent</a>
-     client.</li>
- <li class="tidylist"><b>anonieme e-mail gebruiken</b> - postman heeft een e-mailsysteem gecreerd, compatibel met normale e-mail
-     clients (POP3 / SMTP) dat toelaat e-mail binnen I2P evenals e-mail van en naar het gewone internet te versturen.
-     Maak je eigen account op <a href="http://hq.postman.i2p/">hq.postman.i2p</a>.
-     In i2p zit een gebundelde <a href="/susimail/susimail">susimail</a>,
-     een webgebaseerde anonimiteits-georienteerde pop3/smtp-client ingesteld om postman zijn e-mailservices te gebruiken.</li>
- <li class="tidylist"><b>anoniem chatten</b> - start je eigen IRC-client op en verbind met
-     de server op <b>127.0.0.1 poort 6668</b>.  Dit wijst naar een of twee anoniem gehoste
-     IRC servers, maar zowel jij als zei weten niet waar de andere is.</li>
- <li class="tidylist"><b>anoniem bloggen</b> - neem een kijkje bij <a href="http://syndie.i2p2.de/">Syndie</a></li>
- <li class="tidylist">en veel meer</li>
+
+<ul class="links"><li class="tidylist"><b>Opstarten&hellip;</b><br>Als je zojuist I2P gestart hebt zal het nummer van <i>Actieve Peers</i> onder de <i>Peers</i> sectie in het linker zijpaneel toenemen binnen de komende minuten, tevens zal je een <i>Lokale bestemming</i> genaamd <i>Gedeelde Clients</i> zien, en mogelijk andere clients en servers, afhankelijk van de I2P configuratie (als dit niet het geval is, zie 'problemen oplossen' <a href="#trouble">hier onder</a>). Deze <i>Lokale bestemmingen</i> bieden verbindingen aan op verschillende poorten (en soms protocollen) naar het I2P netwerk waardoor diensten als BitTorrent, email, webproxy en andere diensten zullen werken. De <a href="/netdb">Netwerk Database</a> geeft een indicatie van alle bekende peers op het netwerk. Daarnaast kunnen bestaande <a href="/peers">Peer Connecties</a> gemonitord worden en bestaande <a href="/tunnels">Tunnels</a> en hun status worden bekeken. Meer informatie is beschikbaar op de <a href="/help">hulp pagina</a>.</li>
+
+<li class="tidylist"><b>Netwerk integratie</b><br> De eerste keer dat I2P start duurt het mogelijk enkele minuten om de router te integreren in het netwerk en meerdere peers te vinden om de verbinding te optimaliseren. Als I2P opstart, bij een normale werking, geeft de tunnel gereedheid indicator (direct boven het <i>Lokale bestemmingen</i> gedeelte in het zijpaneel) mogelijk de melding "Tunnels Geweigerd"; dit is normaal en is geen reden voor zorgen. Zodra de <i>Lokale bestemmingen</i> eenmaal aangegeven worden met groene sterren zijn er veel mogelijkheden voor het gebruik van I2P, hieronder worden enkele voorbeelden geïntroduceerd.</li></ul>
+  
+<h3>Diensten op I2P</h3>
+<ul class="links">
+
+<li class="tidylist"><b>Invisible Internet &amp; Public Web Browsing</b><br>Op I2P kan je toegang verkrijgen tot anonieme websites (eepsites) en andere diensten (zoals; SSH over I2P, IRC, Jabber etc.), daarnaast heb je ook de mogelijkheid om je eigen dienst aan te bieden. Je kan ook anoniem toegang krijgen tot het normale Internet via de ingebouwde web proxy (outproxy). <a href="http://www.i2p2.de/htproxyports.html" target="_blank">Configureer je browser</a> voor het gebruik van de HTTP proxy op <code>127.0.0.1 poort 4444</code>, waarna je naar zowel eepsites als normale, onversleutelde <code>http://</code> websites kan surfen. Voor een vooraf ingestelde browser kan je <a href="http://echelon.i2p/i2pfox/">I2PFox</a> proberen, dit is een speciaal ontworpen versie van Firefox met extra veiligheid en speciaal ontworpen voor gebruik met I2P. Als je een aanpassing wilt maken aan de outproxy of deze wilt uitschakelen kan je de 'client tunnel' voor <code>false.i2p</code> onder het <i>Outproxies</i> gedeelte in de <a href="/i2ptunnel/edit?tunnel=0" target="_blank">I2P HTTP Proxy Tunnel Editor</a>. In het "Interessante websites" gedeelte <a href="#eepsites">hier onder</a> staat een lijst met een paar van de bekende sites die op I2P gehost worden.</li>
+
+<li class="tidylist"><b>Anonieme E-Mail</b><br>Postman's I2P email systeem kan worden benaderd via <a href="/susimail/susimail">de ingebouwde email client</a>
+(susimail) of door het gebruik van elke andere normale email client die ondersteuning biedt voor SMTP en POP3.
+Deze accounts kunnen tevens email versturen en ontvangen naar en van het normale Internet. Voor een account, bezoek <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Daarnaast is er <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a>, dit is een nieuw end-to-end versleuteld email systeem zonder centrale servers welke een webinterface en geïntegreerd adressen boek bied. Het is ontwikkeld door HungryHobo en kan worden geïnstalleerd als <a href="#plugins">plugin</a>.</li>
+
+<li class="tidylist"><b>Anonieme Bestands Overdracht</b><br><a href="/i2psnark/" target="_blank">I2PSnark</a> is geïntegreerd in I2P en biedt anonieme en versleutelde <a href="https://secure.wikimedia.org/wikipedia/en/wiki/BitTorrent_%28protocol%29" target="_blank">BitTorrent</a> overdracht aan. Tevens is er een bittorrent client door Sponge ontwikkeld genaamd <a href="http://bob.i2p/Robert.html">Robert</a>, geschreven in Python. Er is ook een port van <a href="http://www.emule-project.net/" target="_blank">eMule</a> voor I2P genaamd <a href="http://echelon.i2p/imule/">iMule</a> [Ontwikkelaars gezocht!], dit is een anonieme en veilige implementatie van een <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Gnutella" target="_blank">Gnutella netwerk</a>, toegankelijk op <a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a> [onderhouden door Complication, ontwikkelaars gezocht!], daarnaast zijn er nog faciliteiten voor het aanbieden van bestanden via de browser.</li>
+
+<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://i2plugins.i2p/" target="_blank">i2plugins.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"><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://i2plugins.i2p/plugins/" target="_blank">installatie</a>! Surf naar de plugins en gerelateerde info op <a href="http://i2plugins.i2p/" target="_blank">i2plugins.i2p</a>. Als je een <a href="http://i2plugins.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>
 
-<h2>Wil je je eigen eepsite?</h2>
-
-<p>We hebben aan I2P software toegevoegd om je je eigen eepsite te laten hosten - een
-<a href="http://jetty.mortbay.org/">Jetty</a> webserver, die luistert op
-<a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a>.  Plaats gewoonweg je bestanden in
-de <code>eepsite/docroot/</code> map (of plaats standaard JSP/Servlet <code>.war</code>
-bestanden onder <code>eepsite/webapps</code>, of standaard CGI scripts onder <code>eepsite/cgi-bin</code>) 
-en ze zullen verschijnen. Na een <a href="/i2ptunnel/">eepsite tunnel</a> opgestart te hebben die er naar wijst,
-zal je eepsite zichtbaar zijn voor anderen.
-Gedetailleerde instructies voor het starten van je eepsite staan op
-<a href="http://127.0.0.1:7658/">je tijdelijke eepsite-pagina</a>.
-</p>
-
-<h2><a name="trouble">Problemen</a></h2>
-
-<p>Wees geduldig - I2P kan wat langzaam zijn bij het opstarten, omdat het nog andere gebruikers zoekt.
-Als, na 30 minuten, je Active: (Actieve) verbonden/recent verbonden aantallen lager zijn dan 10 verbonden gebruikers,
-zou je best poort 8887 op je firewall openen voor een betere verbinding.
-Als je in het geheel geen eepsites kan zien (zelfs <a href="http://www.i2p2.i2p/">www.i2p2.i2p</a> niet),
-controleer dan nog eens of de proxy van je browser op 127.0.0.1 poort 4444 staat.
-Je zou best ook de informatie controleren op de
-<a href="http://www.i2p2.i2p/">I2P website</a>, of plaats een bericht op het
-<a href="http://forum.i2p/">I2P discussie forum</a>, of kom langs bij
- <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p-nl">#i2p-nl</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> of <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a>
- op IRC bij de kanalen <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a>, irc.postman.i2p of irc.freshcoffee.i2p (ze linken allemaal door naar elkaar).</p><hr />
+<h3>Anoniem en versleutelde Web Hosting op I2P</h3>
+<ul class="links">
+
+<li class="tidylist"><b>Ready to Roll!</b><br> I2P komt met een ingebouwde, ready-to-go web server voor het hosten van je eigen anonieme website (eepsite) op het I2P netwerk: een <a href="http://jetty.mortbay.org/" target="_blank">Jetty</a> server die luistert op <a href="http://127.0.0.1:7658/" target="_blank">http://127.0.0.1:7658/</a>. Om je eigen inhoud te hosten plaats je simpelweg alle bestanden in de <code>eepsite/docroot/</code> directory (of plaats elke standaard JSP/Servlet .war bestanden onder <code>eepsite/webapps</code>,
+  of standaard CGI scripts onder <code>eepsite/cgi-bin</code>) en ze zullen zichtbaar zijn. 
+  Je kan ook een alternatief webserver platform voor I2P gebruiken om de ingebouwde server te vervangen of te draaien op een andere tunnel.</li>
+<li class="tidylist"><b>Start je Tunnel</b><br>  
+  Na het starten van de vooraf ingestelde <a href="/i2ptunnel/" target="_blank">I2P Webserver Tunnel</a>,  
+  zal je eepsite zichtbaar zijn (maar niet vindbaar) voor anderen. Gedetaïlleerde instructies voor het starten van je eepsite, het registreren van een.i2p domein en promotie van je website aan anderen zijn toegankelijk via je eigen I2P webserver op <a href="http://127.0.0.1:7658/help/" target="_blank">http://127.0.0.1:7658/help/</a>.</li></ul>
+
+<a name="eepsites"></a>    
+    <h3>I2P-Hosted Sites of Interest</h3>
+    <ul class="links">
+      <li class="tidylist"><b>Invisible Internet Project (I2P) Officiële Website</b><br><a href="http://www.i2p2.i2p/" target="_blank">www.i2p2.i2p</a> en 
+        de mirror <a href="http://i2p-projekt.i2p/" target="_blank">i2p-projekt.i2p</a>: Veilige en  
+        anonieme verbindingen naar <a href="http://www.i2p2.de/" target="_blank">www.i2p2.de</a>. Er is ook een officiële mirror actief op <a href="http://geti2p.net/" target="_blank">geti2p.net</a>. Als je meer wilt weten over hoe I2P werkt of hoe je mee kan doen is dit de website waar je terecht kan!</li>
+      <li class="tidylist"><b>I2P Community Forums</b><br><a href="http://forum.i2p/" target="_blank">forum.i2p</a>: Een veilige
+        en anonieme verbinding naar <a href="http://forum.i2p2.de/" target="_blank">forum.i2p2.de</a>, een online forum waar ontwikkelaars en gebruikers problemen bespreken en ideëen uitwisselen gerelateerd aan I2P en geassocieerde onderwerpen, en <a href="http://zzz.i2p/" target="_blank">zzz's developer forums</a> voor zowel ontwikkelaars als eindgebruikers.</li>
+      <li class="tidylist"><b>I2P Anonieme Pastebin</b><br><a href="http://paste.i2p2.i2p/" target="_blank">paste.i2p2.i2p</a>: Veilige en  
+        anonieme paste dienst die het anoniem delen van tekst en tekst-based code over I2P.</li>
+      <li class="tidylist"><b>Echelon's I2P Resources</b><br><a href="http://echelon.i2p/" target="_blank">echelon.i2p</a>: I2P software 
+        archief met broncode (waar toegestaan), informatie over I2P, inclusief een <a href="http://echelon.i2p/I2Pguide/index.html" target="_blank">beginner's guide</a> en pre-release ontwikkelaars versies van I2P voor de avonturiers om te proberen.</li>
+        <li class="tidylist"><b>Ugha's Wiki</b><br><a href="http://ugha.i2p/" target="_blank">ugha.i2p</a>: Een open wiki die iedereen kan bewerken met veel informatie over I2P, help voor beginners en meer links voor het I2P netwerk en meer.</li>
+      <li class="tidylist"><b>I2P-to-Freenet Proxy</b><br><a href="http://fproxy.tino.i2p/" target="_blank">fproxy.tino.i2p</a>: 
+        Neem een kijkje in de wereld van het <a href="http://freenetproject.org/" target="_blank">Freenet</a> netwerk met Tino's I2P-to-Freenet proxy.</li>
+        <li class="tidylist"><b>The Planet (on I2P)</b><br><a href="http://planet.i2p/" target="_blank">planet.i2p</a>: Een RSS aggregator site die nieuwswaardigheden en evenementen rondom I2P verzamelt en publiceerd in één plek. Een goede site om te bezoeken om de community aan het werk te zien!</li>
+        <li class="tidylist"><b>Eepsite Search Engine</b><br><a href="http://eepsites.i2p/" target="_blank">eepsites.i2p</a>: Een 
+        anonieme zoek machine.</li>
+      <li class="tidylist"><b>I2P Network Health</b><br><a href="http://stats.i2p/cgi-bin/dashboard.cgi" target="_blank">stats.i2p</a>: Bekijk verschillende aspecten van het netwerk en de prestaties met deze I2P netwerk monitor site, gedraaid door zzz.</li> 
+      <li class="tidylist"><b>Discover I2P</b><br>Er zijn nog vele andere eepsites, volg eenvoudig de links van diegene die je ziet en sla je favorieten op en bezoek ze regelmatig!<br></li>     
+    </ul>
+
+<h2>Problemen oplossen &amp; Verdere hulp</h2><a name="trouble"></a>
+    <ul class="links">
+      <li class="tidylist"><b>Wees geduldig!</b><br>I2P is mogelijk langzaam met het integreren in het netwerk als je deze de eerste keer start, de router probeert nu meerdere peers te vinden. Hoe langer de I2P router actief is, hoe beter de prestaties zullen worden, probeer dus de router zo lang mogelijk aan te laten, 24 uur per dag indien mogelijk! Als, na 30 minuten, je <i>Actieve: [connected/recent]</i> teller nogsteeds minder dan 10 peers heeft, of het totaal nummer van <i>Geintegreerde</i> peers minder is dan 5, zijn er verschillende dingen die je kan controleren op problemen: 
+  </li>
+
+  <li class="tidylist"><b>Controleer je configuratie &amp; Bandbreedte toewijzing</b><br>I2P functioneert het beste als je nauwkeurig de snelheid van je netwerk in het <a href="/config">bandbreedte configuratie gedeelte</a>. Standaard is I2P ingesteld op redelijk conservatieve waarden die veelal niet representatief zijn voor de meeste verbindingen, dus neem de tijd om deze instellingen juist aan te passen waar nodig. Hoe meer bandbreedte je toewijst, <i>specifiek</i> upstream bandbreedte, hoe meer je voordeel zult behalen van het netwerk. 
+  </li>
+
+    <li class="tidylist"><b>Firewalls, Modems &amp; Routers</b><br>Waar mogelijk, controleer dat I2P/Java toegestaan is wederzijds poort toegang van het Internet heeft door het correct instellen van de modem/router/firewall.
+Als je achter een verbiedende firewall zit maar wel onbeperkt uitgaande toegang, kan I2P alsnog functioneren; je kan inbound toegang uit zetten en vertrouwen op <a href="http://www.i2p2.i2p/udp.html" target="_blank">SSU IP Address Detection</a> (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Hole_punching" target="_blank">firewall hole punching</a>) om verbinding te maken naar het netwerk, je netwerk status in het zijpaneel zal nu aangeven "Netwerk: Firewalled". Voor optimale prestaties, zorg er voor dat I2P's <a href="/config">extere poort</a> zichtbaar is vanaf het Internet (zie hier onder voor meer informatie).</li>
+  
+  <li class="tidylist"><b>Controleer je proxy instellingen</b><br>Als
+  je helemaal geen eepsites kan zien (zelfs niet <a href="http://www.i2p2.i2p/" target="_blank">www.i2p2.i2p</a>), 
+  zorg er dan voor dat je browser's proxy is ingesteld op http proxy (<i>niet</i> https, <i>niet</i> socks) via <code>127.0.0.1 poort 4444</code>. Als je hulp nodig hebt is er een <a href="http://www.i2p2.i2p/htproxyports.html" target="_blank">handleiding</a> voor het configureren van je browser voor gebruik met I2P, ook <a href="http://www.i2p2.de/htproxyports.html" target="_blank">beschikbaar</a> op het normale Internet. </li>
+
+  <li class="tidylist"><b>Controleer je Logs</b><br><a href="/logs">Logs</a> kunnen je helpen met problemen oplossen. Je kan mogelijk fragmenten in een <a href="http://forum.i2p/viewforum.php?f=10" target="_blank">forum</a> posten voor hulp, of misschien <a href="http://paste.i2p2.i2p/" target="_blank">plakken</a> en als referentie link laten zien op IRC voor hulp.</li> 
+  <li class="tidylist"><b>Verifieer dat Java up-to-date is</b><br>Zorg er voor dat Java up-to-date is [versie 1.6 aanbevolen en vereist voor sommige functies]. Als je geen Java geinstalleerd hebt wil je waarschijnlijk een implementatie van de JRE (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/JRE" target="_blank">Java Runtime Environment</a>); als je een ontwikkelaar bent is de <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Java_SDK" target="_blank">SDK</a> mogelijk ook interessant, en misschien <a href="http://ant.apache.org/" target="_blank">Apache Ant</a> die  we gebruiken om de I2P Java binaries te compileren.
+  </li>
+ 
+  <li class="tidylist"><b>Problemen met draaien op verouderde hardware</b><br>[Linux/Unix/Solaris] Als je de router niet kan starten met  <code>i2p/i2prouter start</code> probeer het <code>runplain.sh</code> script in de zelfde directory. Root rechten zijn normaliter niet vereist voor het draaien van I2P. Als je de <a href="http://www.i2p2.i2p/jbigi.html" target="_blank">jBigi library</a> moet compileren (welke in zeldzame gevallen nodig is), raadpleeg de bijhorende documentatie, bezoek het forum of kom eens langs op ons <a href="irc://127.0.0.1:6668/i2p-dev">IRC developer kanaal</a>.
+
+  <li class="tidylist"><b>Inschakelen Universal Plug and Play (UPnP)</b><br>Mogelijk ondersteunt je modem of router  <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Universal_Plug_and_Play" target="_blank">Universal Plug &amp; Play</a> (UPnP), welke automatische port-forwarding verzorgt. Zorg er voor dat UPnP ondersteuning voor I2P is aangezet op de <a href="/config">configuratie pagina</a>, probeer daarna ook UPnP op je modem/router in te schakelen en eventueel ook op de computer. Herstart nu de <a href="/">I2P router</a>. Als dit succesvol lukt zal I2P de status "Network: OK" weergeven in het zijpaneel als de eerste verbindings tests gelukt zijn. 
+    </li>
+  <li class="tidylist"><b>Port Forwarding</b><br>Open <a href="/config">I2P's poort</a> op je modem, router en/of firewall(s) voor betere connectiviteit (bij voorkeur zowel UDP als TCP). Meer informatie over portforwarding kan gevonden worden op <a href="http://portforward.com/" target="_blank">portforward.com</a>, in toevoeging tot ons forum en IRC kanalen hier onder vermeld. Merk op dat I2P geen ondersteuning bied voor Internet toegang via http en socks proxy [patches welkom!].
+ </li>
+  <li class="tidylist"><b>Online support</b><br>Mogelijk wil je ook 
+  de informatie bekijken op de <a href="http://www.i2p2.i2p/" target="_blank">I2P website</a>, 
+  berichten plaatsen op het <a href="http://forum.i2p2.i2p/" target="_blank">I2P discussion forum</a>, 
+  of langs komen in 
+  <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> or <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> op I2P's Internet IRC netwerk (<code>irc.postman.i2p</code> or <code>irc.freshcoffee.i2p</code>). Deze kanalen zijn tevens beschikbaar buiten I2P's anonieme versleutelde netwerk via <a href="irc://irc.freenode.net/i2p">Freenode IRC</a>.</li> 
+  
+<li class="tidylist"><b>Bugs melden</b><br>Als je een bug wil melden, maak een ticket aan op <a href="http://trac.i2p2.i2p/" target="_blank">trac.i2p2.i2p</a>. Voor ontwikkelaar-gerelateerde discussies, bezoek <a href="http://zzz.i2p/" target="_blank">zzz's developer forums</a> of bezoek het <a href="irc://127.0.0.1:6668/i2p-dev">developer kanaal</a> op I2P's IRC netwerk. Ontwikkelaars kunnen de broncode doorbladeren op  <a href="http://stats.i2p/cgi-bin/viewmtn/" target="_blank">zzz's mtn repository viewer</a>, <a href="http://i2host.i2p/cgi-bin/view/branch/changes/i2p.i2p" target="_blank">Sponge's instance</a>, of via <a href="http://trac.i2p2.i2p/browser" target="_blank">trac.i2p2.i2p</a>. We gebruiken hoofdzakelijk <a href="http://www.i2p2.i2p/monotone.html" target="_blank">monotone</a> om de broncode bij te beheren.</li>
+
+<li class="tidylist"><b>Raak betrokken!</b><br>I2P word ontwikkeld en onderhouden door hoofdzakelijk ongefinancierde en vrijwillige community leden. We accepteren graag  <a href="http://www.i2p2.i2p/donate.html" target="_blank">donaties</a>, welke zullen besteed aan essentiele hosting en administratie kosten. We hebben <a href="http://www.i2p2.i2p/bounties.html" target="_blank">contante beloningen</a> voor aspecten van I2P voor ontwikkelaars welke graag mee willen ontwikkelen, we zijn altijd opzoek naar meer <a href="http://www.i2p2.i2p/newdevelopers.html" target="_blank">Java coders</a>, <a href="http://www.i2p2.i2p/newtranslators.html" target="_blank">vertalers</a>, promoters en gebruikers om I2P te helpen groeien. Hoe groter het I2P netwerk, hoe meer iedereen van de voordelen profiteert, simpelweg al je vrienden vertellen over I2P en ze helpen het te installeren is al een grote hulp. Voor meer informatie over hoe je betrokken kan raken, bezoek de <a href="http://www.i2p2.i2p/getinvolved.html" target="_blank">vrijwilligers pagina</a> op de website.</li>
+</ul><div class="topness"><a href="#top">[Naar Boven]</a></div>
+<div class="footnote"><hr>Document geupdate: December 2010</div>
 </div>
diff --git a/installer/resources/readme/readme_pt.html b/installer/resources/readme/readme_pt.html
index 333ae6ba4cb0a3201e593cec209323b615110486..6522ea8a94a225188ec5a077313e2cb7e1e84866 100644
--- a/installer/resources/readme/readme_pt.html
+++ b/installer/resources/readme/readme_pt.html
@@ -1,17 +1,5 @@
 <div lang="pt">
-<div align="right">
-<div class="langbox" align="right">
-	<a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> 
-	<a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="中文" alt="中文"></a> 
-	<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> 
-	<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> 
-	<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> 
-	<a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> 
-	<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> 
-	<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> 
-	<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
-</div></div>
-<div class="welcome"><h2>Bem-vindo a I2P!</h2></div>
+
 <p>Se você acaba de iniciar I2P, os n&uacute;meros à esquerda ao lado de "Active:" deberiam subir nos seguintes minutos e logo lá ver&aacute; uma Destinação chamada "shared clients". (se não, <a href="#trouble">veija embaixo!</a>) <br>Assim que apareça isto, você pode:</p>
 <ul>
  <li><b>visitar p&aacute;ginas I2P ("Eepsites")</b> - Na rede I2P tem p&aacute;ginas web anônimas: 
@@ -26,8 +14,7 @@
 	 <li><a href="http://echelon.i2p">echelon.i2p</a>: arquivo de software e informações sobre I2P (com aplicações de BitTorrent, iMule, I2PFox, I2P-Messenger, ...)</li>
          <li><a href="http://paste.i2p2.i2p">paste.i2p2.i2p</a>: pastebin anônimo</li>
 	</ul><br />
-     Ha muitas mais p&aacute;ginas I2P - simplesmente segue os links que encontre, ponhe marcadores para os seus favoritos e vis&iacute;te-los freqüentemente!</
-     li><br />
+     Ha muitas mais p&aacute;ginas I2P - simplesmente segue os links que encontre, ponhe marcadores para os seus favoritos e vis&iacute;te-los freqüentemente!</li>
  <li class="tidylist"><b>navegar na internet</b> - I2P dispõe de um "outproxy" http - para usâ-lo, tamb&eacute;m pode empregar o proxy http no porto 4444 - Se configurar o seu navegador web para usar este proxy, pode visitar as p&aacute;ginas web de maneira anônima e o trânsito ser&aacute; roteado atravez da rede I2P.</li>
  <li class="tidylist"><b>trocar dados</b> - Ha uma <a href="i2psnark/">adaptação</a> para I2P da aplicação <a href="http://www.bittorrent.com/">BitTorrent</a> 
      <a href="http://www.klomp.org/snark/">Snark</a>.</li>
@@ -75,5 +62,5 @@
    todos nos servidores irc.postman.i2p e irc.freshcoffee.i2p. 
    (A ambos pode acessar baixo <a href="irc://localhost:6668">irc://localhost:6668</a>; os dois servidores estão conectados.) 
    Se você ainda não tem acesso a I2P, tamb&eacute;m pode entrar em #i2p e #i2p-help do servidor <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a> - 
-   mas então de forma não anônima.</p><hr />
+   mas então de forma não anônima.</p>
 </div>
diff --git a/installer/resources/readme/readme_ru.html b/installer/resources/readme/readme_ru.html
index ffa8c435e4531d672ddf661e56bfc26cfb929fc7..85ebd6ca16d2d205a8611585ee590a272ea7bfc0 100644
--- a/installer/resources/readme/readme_ru.html
+++ b/installer/resources/readme/readme_ru.html
@@ -1,21 +1,7 @@
 <div lang="ru">
-<div align="right"> 
-  <div class="langbox" align="right">
-    <a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> 
-    <a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="中文" alt="中文"></a> 
-    <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> 
-    <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> 
-    <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a> 
-    <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> 
-    <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> 
-    <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> 
-    <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
-  </div>
-</div><a name="top"></a>
-<div class="welcome"><h2>Добро пожаловать в Невидимый Интернет</h2></div>
-<ul class="links"><li class="tidylist"><b>Начало&hellip;</b><br>Если вы только что запустили I2P, число <i>Активных пиров</i>, отображаемых под секцией <i>Пиры</i> на боковой панели должно начать увеличиваться через несколько минут, и вы так же увидите <i>Локальный туннель</i> с именем <i>Коллективные Клиенты</i>, и, возможно, другие клиентские и серверные туннели в зависимости от того, как настроен I2P (если нет, смотрите секцию по разрешению проблем <a href="#trouble">ниже</a>). Эти <i>Локальные туннели</i> предоставляют соединения на разных портах (и иногда разные протоколы) для сети I2P, позволяя функционировать вашим torrent, e-mail, прокси и другим сервисам. Ваша <a href="/netdb">База данных сети I2P</a> показывает всех известных роутеру пиров в сети. Больше информации доступно на <a href="/help">странице помощи</a>.</li>
 
-<li class="tidylist"><b>Сетевая интеграция</b><br> Когда вы впервые запускаете I2P, это может занять несколько минут, т.к. роутер выполняет процедуру начальной загрузки (bootstrap) для интеграции в сеть и поиска пиров для оптимизации интегрированности. Будте терпеливы. Когда возле ваших <i>Локальных туннелей</i> загорятся зелёные звёздочки, вы сможете делать с I2P разнообразные вещи, и ниже мы представим вам некоторые из них. </li></ul>
+<ul class="links"><li class="tidylist"><b>Начало&hellip;</b><br>Если вы только что запустили I2P, число <i>Активных пиров</i>, отображаемых под секцией <i>Пиры</i> на боковой панели должно начать увеличиваться через несколько минут, и вы так же увидите <i>Локальный туннель</i> с именем <i>Коллективные Клиенты</i>, и, возможно, другие клиентские и серверные туннели в зависимости от того, как настроен I2P (если нет, смотрите секцию по разрешению проблем <a href="#trouble">ниже</a>). Эти <i>Локальные туннели</i> предоставляют соединения на разных портах (и иногда разные протоколы) для сети I2P, позволяя функционировать вашим torrent, e-mail, прокси и другим сервисам. Ваша <a href="/netdb">База данных сети I2P</a> показывает всех известных роутеру пиров в сети. Больше информации доступно на <a href="/help">странице помощи</a>.</li>
+<li class="tidylist"><b>Сетевая интеграция</b><br> Когда вы впервые запускаете I2P, это может занять несколько минут, т.к. роутер выполняет процедуру начальной загрузки (bootstrap) для интеграции в сеть и поиска пиров для оптимизации интегрированности. Будте терпеливы. Когда I2P запускается, и во время нормальной работы, индикатор готовности к построению туннелей (прямо над секцией <i>Локальные туннели</i> на боковой панели) может показывать "Не принимаем туннели"; это нормальное поведение и не стоит слишком беспокоиться. Когда возле ваших <i>Локальных туннелей</i> загорятся зелёные звёздочки, вы сможете делать с I2P разнообразные вещи, и ниже мы представим вам некоторые из них. </li></ul>
   
 <h3>Сервисы в I2P</h3>
 <ul class="links">
@@ -25,7 +11,7 @@
 <li class="tidylist"><b>Анонимная электронная почта</b><br>Почтовая система Postman-а, расположенная в I2P, доступна через <a href="../../../../../../susimail/">встроенный почтовый клиент с веб-интерфейсом</a>
 (susimail), либо через любой почтовый клиент, поддерживающий smtp и pop3.
 Пользователи сервиса могут отправлять и получать почту из обычного интернета. Для
-получения аккаунта, посетите <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Так же, доступна <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> - новая безсерверная почтовая система со сквозным шифрованием с веб-интерфейсом и встроенной адресной книгой. Она разрабатывается HungryHobo и может быть установлена как <a href="readme.html#plugins">плагин</a>.</li>
+получения аккаунта, посетите <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Так же, доступна <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> - новая безсерверная почтовая система со сквозным шифрованием с веб-интерфейсом и встроенной адресной книгой. Она разрабатывается HungryHobo и может быть установлена как <a href="#plugins">плагин</a>.</li>
 
 <li class="tidylist"><b>Анонимная передача файлов</b><br><a href="/i2psnark" target="_blank">I2PSnark</a> - интегрированный в I2P <a href="https://secure.wikimedia.org/wikipedia/en/wiki/BitTorrent_%28protocol%29" target="_blank">торрент</a>-клиент, обеспечивающий анонимную и шифрованную передачу файлов. Помимо этого, Sponge разрабатывает битторрент-клиент <a href="http://bob.i2p/Robert.html">Robert</a>, написанный на Python. Так же имеется порт <a href="http://www.emule-project.net/" target="_blank">eMule</a> для I2P, именуемый <a href="http://echelon.i2p/imule">iMule</a> [нуждается в разработчиках!]; анонимная и безопасная реализация <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Gnutella" target="_blank">Gnutella network</a>, доступная через <a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a> [поддерживается Complication-ом, ищутся разработчики!], и прочие возможности, включая веб-обменники, для работы с которыми достаточно только браузера.</li>
 
@@ -34,7 +20,7 @@
 
       <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://i2plugins.i2p" target="_blank">i2plugins.i2p</a>. И, конечно, все обычные блоги, форумы и CMS будут работать через I2P, но будте аккуратны при их настройке, уделите должное внимание безопасности, в том числе и связанному софту (php, MySQL, Python, Apache и т.д.). Так же, в I2P есть несколько форумов на разных языках, поддерживаемых  сообществом; <a href="#eepsites">ниже</a> имеется несколько ссылок.</li>
 
-      <a name="plugins"></a><li class="tidylist"><b>Плагины для I2P</b><br>Повысьте полезность I2P установив плагины&hellip; блоггинг, чат, обмен файлами и другие плагины уже были написаны или портированы и ждут когда вы их <a href="http://i2plugins.i2p/plugins/" target="_blank">установите</a>! Смотрите плагины и сопутствующую информацию на <a href="http://i2plugins.i2p" target="_blank">i2plugins.i2p</a>. Если вы <a href="http://i2plugins.i2p/developers/" target="_blank">программист</a>, полный языконезависимый фреймворк для написания плагинов доступен и <a href="http://www.i2p2.i2p/plugins.html" target="_blank">документирован</a>; I2P плагины могут быть написаны на любом языке.</li>
+      <li class="tidylist"><a name="plugins"></a><b>Плагины для I2P</b><br>Повысьте полезность I2P установив плагины&hellip; блоггинг, чат, обмен файлами и другие плагины уже были написаны или портированы и ждут когда вы их <a href="http://i2plugins.i2p/plugins/" target="_blank">установите</a>! Смотрите плагины и сопутствующую информацию на <a href="http://i2plugins.i2p" target="_blank">i2plugins.i2p</a>. Если вы <a href="http://i2plugins.i2p/developers/" target="_blank">программист</a>, полный языконезависимый фреймворк для написания плагинов доступен и <a href="http://www.i2p2.i2p/plugins.html" target="_blank">документирован</a>; I2P плагины могут быть написаны на любом языке.</li>
 </ul>
 
 <h3>Анонимный шифрованный веб-хостинг в I2P</h3>
@@ -89,7 +75,7 @@
 
   <li class="tidylist"><b>Проверьте логи</b><br><a href="/logs">Логи</a> могут помочь решить проблему. У вас может возникнуть желание запостить часть логов на <a href="http://forum.i2p/viewforum.php?f=10" target="_blank">форум</a>, чтобы получить помощь, или, может быть, на <a href="http://paste.i2p2.i2p" target="_blank">pastebin</a>, чтобы дать ссылку на IRC.</li> 
 
-  <li class="tidylist"><b>Проверьте свежесть Java</b><br>Убедитесь, что у вас достаточно свежая Java [версия 1.6 рекомендуется и необходима для функционирования некоторых возможностей]. Если у вас не установлена Java, скорее всего, вам требуется какая-нибудь реализация JRE (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/JRE" target="_blank">Java Runtime Engine</a>); если вы программист, <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Java_SDK" target="_blank">SDK</a> так же может быть интересен, и, возможно, <a href="http://ant.apache.org/" target="_blank">Apache Ant</a>, который мы используем для сборки бинарников I2P.
+  <li class="tidylist"><b>Проверьте свежесть Java</b><br>Убедитесь, что у вас достаточно свежая Java [версия 1.6 рекомендуется и необходима для функционирования некоторых возможностей]. Если у вас не установлена Java, скорее всего, вам требуется какая-нибудь реализация JRE (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/JRE" target="_blank">Java Runtime Environment</a>); если вы программист, <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Java_SDK" target="_blank">SDK</a> так же может быть интересен, и, возможно, <a href="http://ant.apache.org/" target="_blank">Apache Ant</a>, который мы используем для сборки бинарников I2P.
   </li>
  
   <li class="tidylist"><b>Проблемы использования на устаревшем железе</b><br>[Linux/Unix/Solaris] Если вы не можете запустить роутер с помощью <code>i2p/i2prouter start</code>, попробуйте воспользоваться скриптом <code>runplain.sh</code>, который находится в той же директории. Root-привилегии обычно не требуются для запуска I2P. Если вам нужно скомпилировать <a href="http://www.i2p2.i2p/jbigi.html" target="_blank">библиотеку jBigi</a> (что необходимо в редких случаях), изучите соответствующую документацию, посетите форумы, или приходите на наш <a href="irc://127.0.0.1:6668/i2p-dev">IRC-канал для разработчиков</a>.
@@ -109,3 +95,4 @@
 <li class="tidylist"><b>Вовлекайтесь!</b><br>I2P разрабатывается и сопровождается в основном за счёт неоплачиваемого, добровольного участия членов сообщества. Мы рады принимать <a href="http://www.i2p2.i2p/donate.html" target="_blank">пожертвования</a>, которые идут на необходимые административные затраты и хостинг. Для разработчиков, ищущих материальные стимулы, у нас есть <a href="http://www.i2p2.i2p/bounties.html" target="_blank">денежные премии</a> за работу над некоторыми аспектами I2P, и мы всегда ищем <a href="http://www.i2p2.i2p/newdevelopers.html" target="_blank">Java программистов</a>, <a href="http://www.i2p2.i2p/newtranslators.html" target="_blank">переводчиков</a>, популяризаторов и пользователей, помогающих I2P расширяться. Чем больше I2P-сеть, тем больше общая выгода, поэтому простой рассказ об I2P своим друзьям (и помощь с установкой и настройкой если нужно) - уже большая помощь. Для получения дальнейшей информации о том, как вы можете принять участие, посетите <a href="http://www.i2p2.i2p/getinvolved.html" target="_blank">страницу для добровольцев</a> на официальном сайте.</li>
 </ul><div class="topness"><a href="#top">[Наверх]</a></div>
 <div class="footnote"><hr>Документ обновлён: декабрь 2010.</div>
+</div>
diff --git a/installer/resources/readme/readme_sv.html b/installer/resources/readme/readme_sv.html
index e5c3b9ecdd72b2dd4fc42c7cdf301ec3a4c44fc6..64beb5882618a600976b379ae58d176178d26555 100644
--- a/installer/resources/readme/readme_sv.html
+++ b/installer/resources/readme/readme_sv.html
@@ -1,17 +1,5 @@
 <div lang="sv">
-<div align="right">
-<div class="langbox" align="right">
-	<a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> 
-	<a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="中文" alt="中文"></a> 
-	<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> 
-	<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> 
-	<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> 
-	<a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> 
-	<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> 
-	<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> 
-	<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
-</div></div>
-<div class="welcome"><h2>Welcome to I2P!</h2></div>
+
 <p>Om du just har startat I2P kommer de "Aktiva: #/#" b&ouml;rja &ouml;ka inom 
 n&aring;gra f&aring; minuter och du kommer se en destination kallad "delade 
 klienter" p&aring; den v&auml;nstra listan (om inte <a href="#trouble">se 
@@ -38,7 +26,7 @@ Freenet proxy</li>
 	 <li><a href="http://paste.i2p2.i2p">paste.i2p2.i2p</a>: anonym och säker pastebin</li>
      </ul><br>
      Det finns m&aring;nga fler eepsidor - f&ouml;lj bara l&auml;nkarna fr&aring;n dom du ser,
-     spara dina favoriter och bes&ouml;k dom ofta!</li><br>
+     spara dina favoriter och bes&ouml;k dom ofta!</li>
  <li><b>surfa p&aring; n&auml;tet</b> - det finns f&ouml;r n&auml;rvarande en "utproxy" i I2P 
 som &auml;r ansluten
      till din egen HTTP proxt p&aring; port 4444 - st&auml;ll helt enkelt in din 
@@ -105,5 +93,5 @@ f&ouml;rbi
  <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> eller <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a>
 p&aring; IRC på <a 
 href="irc://irc.freenode.net/#i2p">irc.freenode.net</a>, irc.postman.i2p 
-eller irc.freshcoffee.i2p (de &auml;r alla sammankopplade).</p><hr />
+eller irc.freshcoffee.i2p (de &auml;r alla sammankopplade).</p>
 </div>
diff --git a/installer/resources/readme/readme_zh.html b/installer/resources/readme/readme_zh.html
index 8e2d7968fa0e7e07b90c84fb795005425c57a771..bc083dc8179af053492eff100f712b8c5ef517bd 100644
--- a/installer/resources/readme/readme_zh.html
+++ b/installer/resources/readme/readme_zh.html
@@ -1,15 +1,5 @@
 <div lang="zh">
-<div align="right"> 
-  <div class="langbox" align="right"><a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> 
-    <a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="中文" alt="中文"></a> 
-    <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> 
-    <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> 
-    <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> 
-    <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> 
-    <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> 
-    <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
-</div></div>
-<div class="welcome"><h2>欢迎使用 I2P!</h2></div>
+
 <p>I2P 运行后的几分钟里控制台左侧的【活动节点】数量会逐渐增加,
 <b>在【本地目标】中出现【共享客户端】后,表示I2P已建立连接</b>(没有出现?见 <a href="#trouble">疑难解答</a>)。
 然后您可以:</p>
@@ -23,7 +13,7 @@
          <li><a href="http://echelon.i2p/">echelon.i2p</a>:软件存档及有关I2P的相关文档&nbsp;(例如 I2P&nbsp;Messenger 基于I2P的匿名聊天工具等)&nbsp;</li>
          <li><a href="http://paste.i2p2.i2p/">paste.i2p2.i2p</a>:安全匿名的公共剪贴板</li>
      </ul> <br>
-      I2P网络中还有很多其他站点 - 访问上面的网站你会找到更多,别忘了收藏你喜爱的 I2P 网站方便访问。</li><br>
+      I2P网络中还有很多其他站点 - 访问上面的网站你会找到更多,别忘了收藏你喜爱的 I2P 网站方便访问。<br>
  <li><b>浏览 Web 网页</b> - 目前 IP2 网络中的出口代理("Outproxy")只有一个,它的HTTP代理映射在本机的4444端口上。- 将浏览器的代理设置指向为上述地址(127.0.0.1:4444)后,访问任何普通链接即可 - 您的HTTP请求将在 I2P 网络内部传递。</li>
  <li><b>文件交换</b> - I2P的其中一个本地&nbsp;<a href="/i2psnark">端口</a>&nbsp;用于内置的&nbsp;<a href="http://www.klomp.org/snark/">Snark</a> <a href="http://www.bittorrent.com/">BitTorrent</a> 客户端。</li>
  <li><b>匿名电邮</b> - 由POSTMAN维护的邮件系统支持普通邮件客户端(POP3 / SMTP),这个系统可以在 I2P 网络内部收发 Email 也可以收发来自外部 Internet 的邮件!建立I2P邮件帐户请到 <a href="http://hq.postman.i2p/">hq.postman.i2p</a> 申请。I2P中集成有Web界面的pop3/stmp邮件客户端 <a href="/susimail/susimail">SUSIMail</a>,并配置为使用POSTMAN 的邮件服务。</li>
@@ -42,5 +32,5 @@
  <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> 
 或 
 <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a>
-这两个 IRC 频道上询问。 (这些服务器上的这两个频道是相通的)。</p><hr>
+这两个 IRC 频道上询问。 (这些服务器上的这两个频道是相通的)。</p>
 </div>
diff --git a/installer/resources/set_config_dir_for_nt_service.bat b/installer/resources/set_config_dir_for_nt_service.bat
new file mode 100644
index 0000000000000000000000000000000000000000..adbabdad7d87f53bb4328271b0f477bd6879c09f
--- /dev/null
+++ b/installer/resources/set_config_dir_for_nt_service.bat
@@ -0,0 +1,4 @@
+@echo off
+cd /d %~dp0
+echo.
+echo wrapper.java.additional.5=-Di2p.dir.config="%APPDATA%\i2p">>wrapper.config
diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css
index 0d301a879f4f5843f828a720f8c7c551cfa1e7e1..d7484ad14c6f7dccfeb13d055aa488cd71ee9a09 100644
--- a/installer/resources/themes/console/classic/console.css
+++ b/installer/resources/themes/console/classic/console.css
@@ -258,16 +258,6 @@ div.tunnels table{
      margin-right: -2px;
 }    
      
-div.routersummary form {
-     margin-top: -6px !important;
-     margin-bottom: -4px !important;     
-}
-
-div.routersummary form:last-child {
-     padding-top: 3px !important;
-     margin-bottom: -10px !important;     
-}
-
 div.refresh {
      margin-top: 10px !important;
      margin-bottom: 10px !important;
@@ -303,7 +293,7 @@ div.main {
      border-top: 0;
      text-align: left;
      color: #001;
-     min-width: 500px;
+     min-width: 510px;
      -moz-border-radius: 0 0 3px 0;
      -khtml-border-radius: 0 0 3px 0;
      border-radius: 0 0 3px 0;
@@ -408,7 +398,19 @@ div.news li {
 }
 
 div.news h3 {
-     text-align: left !important;
+     background: none !important;
+     text-align: left;
+     border: none !important;
+     border-bottom: 1px dotted !important;
+     -moz-box-shadow: none;
+     -hktml-box-shadow: none;
+     box-shadow: none;
+     font-size: 10pt !important;
+     letter-spacing: 0.05em;
+     text-transform: capitalize !important;
+     text-shadow: none !important;
+     padding: 5px 10px 3px;
+     margin: 10px 10px -7px !important;
 }
 
 div.news p {
@@ -514,11 +516,11 @@ div.messages li, div.messages ul {
      margin: -10px 0 0 0;
 }
 
-div.messages span.error {
+div.error {
      color: #d00000;
 }
 
-div.messages span.notice {
+div.notice {
      font-style: italic;
 }
 
@@ -744,7 +746,7 @@ p {
 }
 
 .langbox {
-     margin: 18px -20px 0px 5px;
+     margin: 5px -20px 0px 5px;
      color: #001;
      font-size: 7pt;
      width: 280px;
diff --git a/installer/resources/themes/console/classic/ieshim.css b/installer/resources/themes/console/classic/ieshim.css
index 5bc3cb86be7e933818f642556a5cfee622bbd626..add6dae6ede10e6882ee4b2ae806d6450f9f4a97 100644
--- a/installer/resources/themes/console/classic/ieshim.css
+++ b/installer/resources/themes/console/classic/ieshim.css
@@ -232,7 +232,7 @@ div.warning {
 }
 
 .langbox {
-     margin: 20px -18px 0px 5px;
+     margin: 7px -18px 0px 5px;
 }
 
 td {
@@ -299,4 +299,4 @@ h1, h2, h3 {
 }
 
 .routersummary h2, .routersummary h3 {
-     background: #fff url(images/tinytitle.png) center right tile-x !important;     
\ No newline at end of file
+     background: #fff url(images/tinytitle.png) center right tile-x !important;     
diff --git a/installer/resources/themes/console/dark/console.css b/installer/resources/themes/console/dark/console.css
index 8921b88c985b3a5c77f7a4a6baeba5255fa75a8a..b1af23e74b79c880e480ad11b893bb60bc8c23c9 100644
--- a/installer/resources/themes/console/dark/console.css
+++ b/installer/resources/themes/console/dark/console.css
@@ -1,1083 +1,1072 @@
-/* I2P Theme: Camo aka Dark */
-/* Description: Military Grade. */
-/* Comment: Thanks to Florian Kuhlmann for the hatface images. [ http://www.flickr.com/photos/floriankuhlmann/]
-/* Author: dr|z3d */
-
-body {
-     margin: 5px 0px 0 0px;
-     padding: 0;
-     text-align: center;
-     background: #010 url('images/camotile.png') center bottom;
-     color: #EE9;
-     font: 9pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
-     
-}
-
-.hide {
-     display: none;
-}
-
-img {
-     border: none;
-}
-
-pre {
-     width: 98%;
-     overflow-x: scroll;
-     text-align: left;
-     font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
-     color: #EE9;
-}
-
-div.logo {
-     float: left;
-     padding: 10px;
-     text-align: center;
-     font-color: #EE9;
-     margin: 0 20px 0 20px;
-     border: 1px solid #494;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     border-radius: 4px;
- background: #000; /*url("images/camotile2.png");*/
-     width: 185px;
-     -moz-box-shadow: inset 0px 0px 1px 0px #009;
-     -khtml-box-shadow: inset 0px 0px 1px 0px #009;
-     box-shadow: inset 0px 0px 1px 0px #009;
-}
-
-div.logo hr {
-     color: #494;
-     background: #494;
-     height: 1px;
-     border: 0px solid #494;
-     margin: 10px 0 5px;
-}
-
-div.toolbar {
-     margin: 0;
-     padding: 10px;
-     font-weight: bold;
-     background: #000;
-     border: 1px solid #000;
-     display: none;
-}
-
-div.toolbar a:link {
-     border: 1px outset #ddddc0;
-     padding: 0px 5px 1px 5px;
-     background: #bbf;
-     text-decoration: none;
-     border-radius: 4px;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     color: #000;
-}
-
-div.toolbar a:visited {
-     background: #ddf;
-}
-
-div.toolbar a:hover, button:hover{
-     border: 1px solid #f60;
-     background: #030;
-     color: #f60;
-}
-
-a:active{
-     color: #900;
-}
-
-div.routersummaryouter {
-     float: left;
-     width: 200px;
-     margin: 0 0 10px 5px;
-     padding: 0;
-     border: 0;
-     clear: left;/* fixes a bug in Opera */
-     text-align: center;
-     display: block;
-}
-
-div.routersummary {
-     width: 173px;
-     padding: 10px;
-     text-align: center;
-     border: 1px solid #494;
-     background: #000 url(images/camotile2.png);
-     color: #EE9;
-     font-size: 8pt;
-     clear: left;/* fixes a bug in Opera */
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     border-radius: 4px;
-     float: left;
-     -moz-box-shadow: 0 1px 5px #000;
-     -khtml-box-shadow: 0 1px 5px #000;
-     box-shadow: 0 1px 5px #000;
-}
-
-div.routersummary input[type=text] {
-     text-align: right !important;
-     -moz-box-shadow: inset 1px 1px 1px 0px #000;
-     -khtml-box-shadow: inset 1px 1px 1px 0px #000;     
-     box-shadow: inset 1px 1px 1px 0px #000;     
-}
-
-div.routersummary hr {
-     color: #494;
-     background: #494;
-     height: 2px;
-     border-bottom: 1px solid #494;
-     margin: 8px -10px 7px -10px;
-     -moz-box-shadow: inset 0px 1px 1px 1px #000;
-     -khtml-box-shadow: inset 0px 1px 1px 1px #000;
-     box-shadow: inset 0px 1px 1px 1px #000;
-}
-
-div.routersummary h3 {
-     border: 0;
-     font-size: 9.5pt;
-     letter-spacing: 0.04em;
-     margin: -7px -10px -8px -10px;
-     padding: 3px 0 4px 0 !important;
-     text-transform: uppercase;
-     -moz-border-radius: 0;
-     -khtml-border-radius: 0;
-     border-radius: 0;
-     background: #000 url('images/header.png') center center ;
-     background-image: -moz-linear-gradient(top, bottom, from(#050), to(#030), color-stop(7%, #000), color-stop(100%, #050));
-}
-
-div.routersummary h4 {
-     border: 0;
-     border-bottom: 0 !important;
-     font-size: 8.5pt;
-     letter-spacing: 0.02em;
-     margin: -7px -9px -10px -9px !important;
-     padding: 6px 3px 9px 3px;
-     background: #000;
-     text-transform: capitalize;
-     text-decoration: none !important;
-     color: #2b2;
-     background-image: -moz-linear-gradient(top, bottom, from(#000), to(#050), color-stop(10%, #050), color-stop(100%, #004));
-     line-height: 100%;
-}
-
-div.routersummary table {
-     border: 0;
-     text-align: center !important;
-     margin: -5px -7px -5px -8px !important;
-     width: 188px !important;
-     overflow: hidden;
-     font-size: 8pt;
-     padding: 0 -10px;
-     background-image: none !important;
-     background-color: transparent !important;
-}
-
-div.routersummary tr {
-     background-image: none !important;
-     background-color: transparent !important;
-     border: 0 !important;
-}
-
-div.routersummary form {
-     margin: -6px 0 -7px;
-}
-
-div.routersummary form:first-child {
-     margin: 6px 0 -4px 0 !important;
-}
-
-div.routersummary p {
-     padding: 0;
-}     
-
-div.refresh {
-     margin-top: -10px !important;
-     margin-bottom: -4px !important;
-     padding: 2px 0 0px 0 !important;
-}
-
-div.routersummary a:link, div.routersummary a:visited {
-     text-shadow: 1px 1px 1px rgba(0, 16, 0, 0.8);
-     text-shadow: 0px 0px 2px #101 !important;
-}
-
-div.routersummary a:hover {
-     text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7);
-     color: #f60;
-}
-
-div.routersummary td {
-     padding: 0px 2px 0px 2px;
-     background-image: none !important;
-     border: 0 !important;
-}
-
-div routersummary hr:last-child {
-     margin-top: 5px;
-     margin-bottom: -5px !important;
-}
-
-div.tunnels {
-     padding-top: 3px !important;
-     margin-left: -4px;
-     text-align: center;
-}
-
-div.tunnels table {
-     margin: -5px 0 -5px -3px !important;
-}
-
-div.tunnels td {
-     padding: 1px 0px 1px 0px;
-}
-
-div.tunnels td:first-child {
-     width: 16px;
-     text-align: left;
-     padding-right: 2px;
-}
-
-div.tunnels td:last-child {
-     text-align: right;
-     padding-right: 1px;
-}
-
-div.tunnels tr {
-/*     border: 1px solid #494 !important;*/
-}
-
-div.warning {
-     margin: 20px 20px 20px 245px;
-     padding: 5px 25px 20px 75px;
-     background: #000;
-     border: 1px solid #494;
-     text-align: left;
-     color: #EE9;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     border-radius: 4px;
-     text-align: justify;
-     background-image:url("../images/itoopie_sm.png");
-     background-position:10px center;
-     background-repeat:no-repeat;
-     -moz-box-shadow: inset 0px 0px 0px 1px #f00;
-     -khtml-box-shadow: inset 0px 0px 0px 1px #f00;
-     box-shadow: inset 0px 0px 0px 1px #f00;          
-     word-wrap: break-word;
-}
-
-/* console error messages */
-
-div.sorry {
-     margin: -1px 5px 10px 205px;
-     padding: 20px 20px 20px 75px;
-     background: #020;
-     border: 1px solid #494;
-     -moz-border-radius: 0 0 4px 4px;
-     -khtml-border-radius: 0 0 4px 4px;
-     border-radius: 0 0 4px 4px;
-     text-align: justify;
-     background-image:url("images/errortriangle.png");
-     background-position:15px center;
-     background-repeat:no-repeat;
-     -moz-box-shadow: inset 0px 0px 0px 1px #d00;
-     word-wrap: break-word;
-     font-weight: bold;
-     color: #EE9;
-}
-
-div.sorry hr {
-     color: #EE9;
-     background: #EE9;
-     height: 1px;
-     border: 1px solid #EE9;
-     margin: 10px 0;
-}     
-
-div.main {
-     margin: -1px 5px 5px 205px;
-     padding: 0 15px 15px 15px;
-     text-align: left;
-     color: #EE9;
-     width: auto;
-/*  overflow-x: scroll; */
-     border: 1px solid #494;
-     -moz-border-radius: 0 0 4px 4px;
-     -khtml-border-radius: 0 0 4px 4px;
-     border-radius: 0 0 4px 4px;
-     background: #000 url(images/scarface.jpg) right bottom no-repeat !important;
-     min-width: 620px;
-     -moz-box-shadow: 0 1px 5px #000;
-}
-
-div.main textarea {
-     background: #000;
-     color: #EE9;
-     font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
-}
-
-div.news {
-     margin: -1px 5px 0px 205px;
-     padding: 5px 30px 5px 30px;
-     border: 1px solid #494;
-     background: #000;
-     background: #000 url("images/news.png")no-repeat scroll bottom right;
-     color: #7b7;
-/*     border-radius: 4px 4px 0 0;
-     -moz-border-radius: 4px 4px 0 0;
-     -khtml-border-radius: 4px 4px 0 0;*/
-     font-size: 7.5pt;
-     text-align: right;
-     -moz-box-shadow: 0 1px 5px #000;
-     -khtml-box-shadow: 0 1px 5px #000;
-     box-shadow: 0 1px 5px #000;
-     min-width: 580px;
-/*     height: 164px;
-     overflow-y: auto;*/
-}
-
-div.news li {
-     text-align: justify;
-     list-style: url('images/info_dark.png');
-     list-style: none;
-     margin: 0;
-     padding: 5px 5px 5px 0;
-     vertical-align: middle;
-     word-wrap: break-word;
-     color: #494;
-     font-weight: bold;
-     font-size: 9.5pt;
-     border-bottom: 1px dotted #494;
-     margin-bottom: 5px;
-     text-transform: capitalize;
-}
-
-div.news h3 {
-     text-align: left !important;
-}
-
-div.news h4 {
-     border-bottom: 1px;
-     border-bottom-style: dotted;
-     border-bottom-color: #494;
-     padding: 0 0 0px 0;
-     margin: 5px 0 10px 0;
-     font-size: 10pt;
-     opacity: 1;
-     text-transform: capitalize;
-}
-
-div.news h4:first-child {
-     background: url('../images/itoopbullet.png');
-     background-repeat: no-repeat;
-     background-position: right;   
-}
-
-div.news p {
-     margin-top: -5px;
-     font-size: 8.5pt;
-     color: #EE9;
-     margin-bottom: 0;
-}
-
-div.news p:nth-child(n+1) {
-     margin-top: 5px;
-}
-
-div.news hr {
-     margin: 8px 0 3px 0;
-}     
-
-div.confignav {
-     padding: 15px 10px !important;
-     margin: 15px 0;
-     background: #000 url('images/header.png') center center repeat-x ;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     border-radius: 4px;
-     border: 1px solid #494;
-     font-size: 9.5pt !important;
-     font-weight: bold !important;
-     line-height: 160% !important;
-
-}
-
-div.configure {
-/*     padding: 5px 15px 0 15px;
-     margin: 10px 0px;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     border-radius: 4px;
-     border: 1px solid #494; */
-     background: none;/* url(images/camotile2.png);*/
-}
-
-div.messages {
-     padding: 10px;
-     margin: 10px 0 15px 0;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     border-radius: 4px;
-     border: 1px solid #494;
-     background: #000  /*url('images/infotile.png') center left no-repeat;*/
-     font-weight: bold;
-     font-size: 9pt;
-     color: #4f4;
-}
-
-div.messages span.error {
-     color: #d90;
-}
-
-div.messages span.notice {
-     font-style: italic;
-}
-
-div.messages li {
-     text-align: justify !important;
-     font-weight: bold;
-     list-style: url(images/warning_dark.png) !important;
-     margin: 0 5px 0 50px !important;
-     padding: 0 10px 0 0 !important;
-     border: 0px !important;
-}
-
-div.graphspanel {
-     padding: 0;
-     margin: 15px 0px -15px 0;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     border-radius: 4px;
-/*     border: 1px solid #494;*/
-     background: none;/* url(images/camotile.png);*/
-     text-align: center;
-}
-
-div.widepanel h3 {
-     text-align: left !important;
-}
-
-div.graphspanel form {
-     text-align: left;
-     padding: 0 15px 0px 15px;
-}
-
-div.graphspanel hr {
-     margin: 10px -15px 10px -15px;
-}
-
-div.graphspanel img {
-     border: 1px solid #494;
-     padding: 3px;
-     margin: 5px;
-     text-align: center !important;
-     background: #000;
-
-     opacity: 0.8;
-}
-
-div.graphspanel img:hover {
-     border: 1px solid #000;
-     padding: 3px;
-     margin: 5px;
-     text-align: center !important;
-     background: #000;
-     -moz-box-shadow: inset 0px 0px 1px 1px #f60;
-     -khtml-box-shadow: inset 0px 0px 1px 1px #f60;
-     box-shadow: inset 0px 0px 1px 1px #f60;
-     opacity: 1;
-}
-
-table {
-     border-collapse: collapse;
-     width: 100%;
-     border: 1px solid #494;
-     cell-padding: 1px;
-     font-size: 7pt;
-     background: #030;
-     margin: 1px 0;
-}
-
-table hr {
-     padding: 0px 0;
-     color: #494;
-     background: #494;
-     border: 0px solid #494;
-     margin: 0px 0px;
-     height: 1px;
-     display: none;
-}
-
-th {
-     padding: 6px 2px;
-     color: #EE9;
-     text-align: center;
-     font-size: 9pt;
-     background: #000; /*url('images/tabletitledark.png') repeat-x;*/
-     background: #000 url('images/header.png') center center repeat-x ;
-     border-top: 1px solid #494;
-     border-bottom: 1px solid #494 !important;     
-     line-height: 110%;
-}
-
-tr {
-     vertical-align: middle;
-}
-
-tr:nth-child(even) {
-     background: #010;/* url('images/darkerbluetile.png') !important;*/
-     vertical-align: middle;
-}
-
-tr:nth-child(odd) {
-     background: #000800;/* url('images/darkbluetile.png') !important;*/
-     vertical-align: middle;
-}
-/*
-tr:last-child {
-     background: #004 url('images/lightbluetile.png') !important;
-     font-weight: bold;
-     border: 1px solid #494 !important;
-}
-*/
-td {
-     padding: 4px 6px;
-     color: #EE9;
-     vertical-align: middle;
-     border-top: 1px inset #494;
-     border-bottom: 1px outset #494;   
-}
-
-td img {
-     padding: 0 1px 0 2px;
-}
-
-tt {
-     font: bold 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
-     color: #FF0;
-     padding: 0 5px 2px 0;
-}
-
-div.main li {
-     text-align: left;
-     list-style: square;
-     margin: 2px 0px 2px 30px;
-     padding: 2px 20px 2px 0px;
-/*     line-height: 150%;*/
-     word-wrap: break-word;
-}
-
-
-div.main li b {
-     color: #b70 !important;
-     letter-spacing: 0.07em;
-     font-size: 9pt;
-     text-shadow: 0 1px 1px #700;
-}
-
-.tidylist {
-     text-align: justify !important;
-     line-height: 150%;
-}
-
-.tidylist:first-child {
-/*     padding-top: 5px;*/
-}
-
-.tidylist:last-child {
-     padding-bottom: 10px;
-}
-
-.tidylist code {
-     text-align: left;
-     font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
-     color: #dd0;
-     padding: 1px 2px;
-     background: #030;
-     margin: 0 2px;
-}
-
-ol {
-     display: inline;
-     margin: 1px 0 0 0;
-     padding: 1px 0 0 20px;
-}
-
-ul {
-/*     display: inline; */
-     margin: 0;
-     padding: 0;
-}
-
-code {
-     text-align: left;
-     font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
-     color: #dd0;
-     padding: 1px 2px;
-}
-
-a:link, h2 a:link{
-     color: #494;
-     text-decoration: none;
-     font-weight: bold;     
-     word-wrap: break-word;
-}
-
-a:visited{
-     color: #7b7;
-     text-decoration: none;
-     font-weight: bold;     
-     word-wrap: break-word;
-}
-
-a:hover{
-     color: #f60;
-     text-decoration: underline;
-     font-weight: bold;     
-     word-wrap: break-word;
-}
-
-.links {
-     padding-bottom: -2px;
-     text-align: justify;
-     margin-top: 10px;
-     margin-bottom: -10px;
-}
-
-.links li {
-     list-style-image: url("images/link.png") !important;
-}
-
-.links b{
-     color: #b70 !important;
-     letter-spacing: 0.07em;
-     font-size: 9.5pt;
-     line-height: 165%;
-     text-shadow: 0 1px 1px #700;
-}
-
-p {
-     text-align: justify;
-     line-height: 160%;
-}
-
-h1 {
-     text-align: left;
-     color: #EE9;
-     padding: 15px 15px 14px;
-     margin: 0 5px 0px 205px !important;
-     font-size: 17pt;
-     font-weight: bold;
-     font-style: normal;
-     text-transform: uppercase;
-     letter-spacing: 0.15em;
-     text-shadow: 0px 0px 2px #010;
-     white-space: normal;
-     background: #000 url("images/scope.png")no-repeat scroll right top;
-     background: #000 url("images/bg2.png")no-repeat scroll top right;
-     background: #000 url('images/header.png') center center;
-     background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000));
-     border: 1px solid #494;
-     border-radius: 4px 4px 0 0;
-     -moz-border-radius: 4px 4px 0 0;
-     -khtml-border-radius: 4px 4px 0 0;
-     line-height: 120%;
-     min-width: 620px;
-     -moz-box-shadow: 0 1px 5px #000;
-     -khtml-box-shadow: 0 1px 5px #000;
-     box-shadow: 0 1px 5px #000;
-}
-
-h2 {
-     font-size: 12pt;
-     color: #EE9;
-     text-shadow: 0px 0px 2px #010;
-     letter-spacing: 0.05em;
-     background: #000 url(images/camotile2.png);
-     background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000));
-     background: #000 url('images/header.png') center center ;
-     padding: 10px;
-     wordwrap: none;
-     border: 1px solid #494;
-     border-radius: 4px;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     vertical-align: middle;
-     margin: 15px 0 12px 0 !important;
-    text-transform: uppercase;
-     word-wrap: break-word;
-}
-
-h2 a:visited {
-     color: #191;
-}
-
-h2 a:hover {
-     color: #f60;
-     text-shadow: 0px 0px 1px rgba(255, 64, 0, 0.7);
-}
-
-h3 {
-     border: 1px solid #494;
-     border-left: 5px solid #494;
-     padding: 5px 6px;
-     margin: 12px 0 10px 0;
-     border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-     -khtml-border-radius: 0 4px 4px 0;
-     background: #000 url(images/camotile.png);
-     background: #000 url('images/header.png') center center ;
-     text-transform: uppercase;
-     text-shadow: 0px 0px 2px #010;
-}
-
-h4 {
-     border-bottom: 1px;
-     border-bottom-style: solid;
-     border-bottom-color: #494;
-     padding: 0 0 10px 0;
-     margin: 5px 0 10px 0;
-     font-size: 11pt;
-}
-
-button, button:visited {
-     font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
-     border: 1px outset #191;
-     padding: 1px 3px;
-     text-decoration: none;
-     border-radius: 4px;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     font-size: 8pt;
-     font-weight: bold;
-     margin: 2px 3px;
-     text-align: center;
-     vertical-align: middle;
-     min-width: 76px;
-     -moz-box-shadow: inset 0px 1px 1px 0px #494;
-     -khtml-box-shadow: inset 0px 1px 1px 0px #191;
-     box-shadow: inset 0px 1px 1px 0px #191;
-     background: #000;
-     color: #494;
-}
-
-button:hover {
-     border: 1px solid #f60;
-     -moz-box-shadow: inset 0px 1px 1px 0px #EE9;
-     -khtml-box-shadow: inset 0px 1px 1px 0px #EE9;
-     box-shadow: inset 0px 1px 1px 0px #EE9;
-     background: #000;
-     color: #f60;
-}     
-          
-button:active {
-     border: 1px inset #f60;
-     background: #f60;
-     color: #EE9;
-     -moz-box-shadow: inset 0px 0px 0px 0px #f60;
-     -khtml-box-shadow: inset 0px 0px 0px 0px #f60;
-     box-shadow: inset 0px 0px 0px 0px #f60;
-}
-
-.underline {
-     border-bottom: 1px solid #eeeeff;
-     padding: 5px 0px 5px 0px;
-     margin: 0px 0px 10px 0px;
-}
-
-.langbox {
-     margin: 21px 2px 2px 5px;
-     padding: 7px 10px 5px 10px;
-     color: #EE9;
-     font-size: 7pt;
-     width: 220px;
-     text-align: right;
-     float: right;
-     vertical-align: middle;
-}
-
-.langbox img {
-     opacity: 0.5;
-     -moz-box-shadow: 0 0 1px #000;
-}
-
-.langbox img:hover {
-     opacity: 1;
-     -moz-box-shadow: 0 0 1px #f60;
-}
-
-hr {
-     color: #494;
-     background: #494;
-     height: 1px;
-     border: 0px solid #494;
-     margin: 20px 0 10px;
-}
-
-hr:last-child {
-     margin-top: 20px;
-     margin-bottom: 20px;
-}
-
-sidebarlogo {
-     text-align: center;
-}
-
-input {
-     border: 1px outset #5f5;
-     -moz-box-shadow: inset 0px 1px 1px 0px #373;
-     -khtml-box-shadow: inset 0px 1px 1px 0px #373;
-     box-shadow: inset 0px 1px 1px 0px #373;
-     background: #000;
-     color: #494;
-     margin: 5px;
-     font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
-     padding: 1px 2px;
-     text-decoration: none;
-     min-width: 110px;
-     border-radius: 4px;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-}
-
-input:hover {
-     background: #000;
-     color: #f60;
-     border: 1px solid #f60;
-     -moz-box-shadow: inset 0px 1px 1px 0px #9e9;
-     -khtml-box-shadow: inset 0px 1px 1px 0px #9e9;
-     box-shadow: inset 0px 1px 1px 0px #9e9;
-}
-
-input:active {
-     background: #000;
-     color: #f30;
-     border: 1px solid #f30;
-}
-
-input:active {
-     border: 1px inset #f60;
-     background: #f60;
-     color: #EE9;
-}
-
-input[type=text], input[type=password] {
-     background: #000;
-     color: #EE9;
-     margin: 5px 10px;
-     padding: 4px 2px;
-     font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
-     border: 1px solid #494 !important;
-     text-decoration: none;
-     border-radius: 4px;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     -moz-box-shadow: inset 1px 1px 1px 0px #000;
-     -khtml-box-shadow: inset 1px 1px 1px 0px #000;
-     box-shadow: inset 1px 1px 1px 0px #000;
-}
-
-input[type=text]:active, input[type=text]:hover, input[type=password]:active, input[type=password]:hover {
-     background: #000;
-}
-
-fieldset {
-overflow: hidden;
-position: relative;
-}
-
-select {
-     background: #000;
-     color: #EE9;
-     margin: 5px 10px;
-     border: 1px solid #494;
-     border-radius: 4px;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     min-width: 110px;
-     font: 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
-     padding: 2px;
-}
-
-textarea {
-     background: #000;
-     color: #EE9;
-     padding: 5px;
-     margin: 10px;
-     border-radius: 4px;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
-     min-height: 100px;
-     min-width: 97%;
-     text-align: left;
-     border: 1px solid #494;
-}
-
-form {}
-
-.proxyfooter {
-     margin: 0 20px 10px 240px;
-     padding: 20px 25px 20px 75px;
-     font-color: #f00;
-     font-size: 7pt;
-     text-align: right !important;
-     border-radius: 4px;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     border: 1px solid #000;
-     display: none;
-}        
-
-.statusnotes {
-     font-style: italic;
-     font-size: 8pt;
-     color: #EE9;
-     text-align: center;
-     border: 1px solid #494 !important;
-/*     border-top: 0px !important;*/
-     margin: -3px 0 5px 0; 
-     padding: 7px;
-     background: #010;
-     -moz-box-shadow: inset 0px 0px 0px 1px #090;
-     -khtml-box-shadow: inset 0px 0px 0px 1px #090;
-     box-shadow: inset 0px 0px 0px 1px #090;
-/*     background: #000 url('images/header.png') repeat-x center center !important;*/
-}
-
-div.joblog {
-/*     margin: 	15px 0 15px 0;
-     padding: 5px 20px 10px 20px !important;
-     border: 1px solid #494;
-     background-color: #000;
-     background: #000; url("images/camotile.png");*/
-/*     color: #dfd;*/
-     border-radius: 4px 4px 0 0;
-     -moz-border-radius: 4px 4px 0 0;
-     -khtml-border-radius: 4px 4px 0 0;
-     text-align: justify !important;
-     overflow-x: auto; /* Opera fix */
- }
-
-div.main li {
-     text-align: left;
-     list-style: square;
-     margin: 2px 0px 2px 30px;
-     padding: 2px 20px 2px 0px;
-/*     line-height: 150%;*/
-     word-wrap: break-word;
-}
- 
-div.joblog li {
-     word-wrap: break-word !important;
-     text-align: justify !important;
-     line-height: 120% !important;
-     margin: 2px 0px 2px 30px;
-     padding: 2px 20px 2px 0px;
-}
-
-div.joblog ul {
-     word-wrap: break-word !important;
-     text-align: justify;
-     margin: 0px 0 10px;
-}
-
-div.joblog li:first-child {
-     margin-top: 0px;
-}
-
-div.joblog li:last-child {
-/*     margin-bottom: -25px;*/
-}
-
-div.joblog form:first-child {
-     margin-top: 10px;
-}
-
-div.joblog table {
-     margin-top: 15px;
-}
-
-div.joblog p {
-     line-height: 130%;
-}
-
-.smallhead {
-     font-size: 7pt
-}
-
-.mediumtags {
-     font-size: 9pt;
-}
-
-.optbox {
-     min-width: 16px !important;
-     max-width: 16px !important;     
-     width: 16px !important;
-     min-height: 16px;
-     max-height: 16px;     
-     height: 16px;
-     opacity: 1.0;
-     border: 0;
-     margin: 5px 5px 5px 10px;
-     padding: 2px;
-     overflow: hidden;
-     position: relative;
-}
-
-.optbox:hover {
-     min-width: 16px !important;
-     max-width: 16px !important;     
-     width: 16px !important;
-     min-height: 16px;
-     max-height: 16px;     
-     height: 16px;
-     opacity: 1.0;
-     border: 0;
-     margin: 5px 5px 5px 10px;
-     padding: 2px;
-}
-
-.cells {
-     border: 1px inset #494;
-     border-left: 1px outset #494;     
-}
-
-.tablefooter tr, .tablefooter td {
-     background: #000 url('images/header.png') repeat-x center center !important;
-     border-top: 1px solid #494;
-     border-bottom: 1px solid #494 !important;     
-     font-size: 7pt;
-     line-height: 110%;
-}
-
-.formaction {
-     text-align: right;
-}
-
-div.footnote {
-     text-align: right;
-     color: #494;
-     font-size: 7pt;
-     margin-bottom: -8px !important; 
-}
-
-div.footnote hr{
-     margin: 10px 0 5px 0 !important;
-     color: #494;
-     background: #494;
-     height: 1px;
-     border: 0px solid #494;
-}
-
-.topness {
-     font-size: 7.5pt;
-     text-align: right;
-     margin-top: -5px;
-     margin-bottom: -5px;
-     margin-right: 5px;
-}
+/* I2P Theme: Camo aka Dark */
+/* Description: Military Grade. */
+/* Comment: Thanks to Florian Kuhlmann for the hatface images. [ http://www.flickr.com/photos/floriankuhlmann/]
+/* Author: dr|z3d */
+
+body {
+     margin: 5px 0px 0 0px;
+     padding: 0;
+     text-align: center;
+     background: #010 url('images/camotile.png') center bottom;
+     color: #EE9;
+     font: 9pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
+     
+}
+
+.hide {
+     display: none;
+}
+
+img {
+     border: none;
+}
+
+pre {
+     width: 98%;
+     overflow-x: scroll;
+     text-align: left;
+     font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
+     color: #EE9;
+}
+
+div.logo {
+     float: left;
+     padding: 10px;
+     text-align: center;
+     font-color: #EE9;
+     margin: 0 20px 0 20px;
+     border: 1px solid #494;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     border-radius: 4px;
+ background: #000; /*url("images/camotile2.png");*/
+     width: 185px;
+     -moz-box-shadow: inset 0px 0px 1px 0px #009;
+     -khtml-box-shadow: inset 0px 0px 1px 0px #009;
+     box-shadow: inset 0px 0px 1px 0px #009;
+}
+
+div.logo hr {
+     color: #494;
+     background: #494;
+     height: 1px;
+     border: 0px solid #494;
+     margin: 10px 0 5px;
+}
+
+div.toolbar {
+     margin: 0;
+     padding: 10px;
+     font-weight: bold;
+     background: #000;
+     border: 1px solid #000;
+     display: none;
+}
+
+div.toolbar a:link {
+     border: 1px outset #ddddc0;
+     padding: 0px 5px 1px 5px;
+     background: #bbf;
+     text-decoration: none;
+     border-radius: 4px;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     color: #000;
+}
+
+div.toolbar a:visited {
+     background: #ddf;
+}
+
+div.toolbar a:hover, button:hover{
+     border: 1px solid #f60;
+     background: #030;
+     color: #f60;
+}
+
+a:active{
+     color: #900;
+}
+
+div.routersummaryouter {
+     float: left;
+     width: 200px;
+     margin: 0 0 10px 5px;
+     padding: 0;
+     border: 0;
+     clear: left;/* fixes a bug in Opera */
+     text-align: center;
+     display: block;
+}
+
+div.routersummary {
+     width: 173px;
+     padding: 10px;
+     text-align: center;
+     border: 1px solid #494;
+     background: #000 url(images/camotile2.png);
+     color: #EE9;
+     font-size: 8pt;
+     clear: left;/* fixes a bug in Opera */
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     border-radius: 4px;
+     float: left;
+     -moz-box-shadow: 0 1px 5px #000;
+     -khtml-box-shadow: 0 1px 5px #000;
+     box-shadow: 0 1px 5px #000;
+}
+
+div.routersummary input[type=text] {
+     text-align: right !important;
+     -moz-box-shadow: inset 1px 1px 1px 0px #000;
+     -khtml-box-shadow: inset 1px 1px 1px 0px #000;     
+     box-shadow: inset 1px 1px 1px 0px #000;     
+}
+
+div.routersummary hr {
+     color: #494;
+     background: #494;
+     height: 2px;
+     border-bottom: 1px solid #494;
+     margin: 8px -10px 7px -10px;
+     -moz-box-shadow: inset 0px 1px 1px 1px #000;
+     -khtml-box-shadow: inset 0px 1px 1px 1px #000;
+     box-shadow: inset 0px 1px 1px 1px #000;
+}
+
+div.routersummary h3 {
+     border: 0;
+     font-size: 9.5pt;
+     letter-spacing: 0.04em;
+     margin: -7px -10px -8px -10px;
+     padding: 3px 0 4px 0 !important;
+     text-transform: uppercase;
+     -moz-border-radius: 0;
+     -khtml-border-radius: 0;
+     border-radius: 0;
+     background: #000 url('images/header.png') center center ;
+     background-image: -moz-linear-gradient(top, bottom, from(#050), to(#030), color-stop(7%, #000), color-stop(100%, #050));
+}
+
+div.routersummary h4 {
+     border: 0;
+     border-bottom: 0 !important;
+     font-size: 8.5pt;
+     letter-spacing: 0.02em;
+     margin: -7px -9px -10px -9px !important;
+     padding: 6px 3px 9px 3px;
+     background: #000;
+     text-transform: capitalize;
+     text-decoration: none !important;
+     color: #2b2;
+     background-image: -moz-linear-gradient(top, bottom, from(#000), to(#050), color-stop(10%, #050), color-stop(100%, #004));
+     line-height: 100%;
+}
+
+div.routersummary table {
+     border: 0;
+     text-align: center !important;
+     margin: -5px -7px -5px -8px !important;
+     width: 188px !important;
+     overflow: hidden;
+     font-size: 8pt;
+     padding: 0 -10px;
+     background-image: none !important;
+     background-color: transparent !important;
+}
+
+div.routersummary tr {
+     background-image: none !important;
+     background-color: transparent !important;
+     border: 0 !important;
+}
+
+div.routersummary p {
+     padding: 0;
+}     
+
+div.refresh {
+     margin-top: 10px !important;
+     margin-bottom: 10px !important;
+     padding: 2px 0 !important;
+}
+
+div.routersummary a:link, div.routersummary a:visited {
+     text-shadow: 1px 1px 1px rgba(0, 16, 0, 0.8);
+     text-shadow: 0px 0px 2px #101 !important;
+}
+
+div.routersummary a:hover {
+     text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7);
+     color: #f60;
+}
+
+div.routersummary td {
+     padding: 0px 2px 0px 2px;
+     background-image: none !important;
+     border: 0 !important;
+}
+
+div routersummary hr:last-child {
+     margin-top: 5px;
+     margin-bottom: -5px !important;
+}
+
+div.tunnels {
+     padding-top: 3px !important;
+     margin-left: -4px;
+     text-align: center;
+}
+
+div.tunnels table {
+     margin: -5px 0 -5px -3px !important;
+}
+
+div.tunnels td {
+     padding: 1px 0px 1px 0px;
+}
+
+div.tunnels td:first-child {
+     width: 16px;
+     text-align: left;
+     padding-right: 2px;
+}
+
+div.tunnels td:last-child {
+     text-align: right;
+     padding-right: 1px;
+}
+
+div.tunnels tr {
+/*     border: 1px solid #494 !important;*/
+}
+
+div.warning {
+     margin: 20px 20px 20px 245px;
+     padding: 5px 25px 20px 75px;
+     background: #000;
+     border: 1px solid #494;
+     text-align: left;
+     color: #EE9;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     border-radius: 4px;
+     text-align: justify;
+     background-image:url("../images/itoopie_sm.png");
+     background-position:10px center;
+     background-repeat:no-repeat;
+     -moz-box-shadow: inset 0px 0px 0px 1px #f00;
+     -khtml-box-shadow: inset 0px 0px 0px 1px #f00;
+     box-shadow: inset 0px 0px 0px 1px #f00;          
+     word-wrap: break-word;
+}
+
+/* console error messages */
+
+div.sorry {
+     margin: -1px 5px 10px 205px;
+     padding: 20px 20px 20px 75px;
+     background: #020;
+     border: 1px solid #494;
+     -moz-border-radius: 0 0 4px 4px;
+     -khtml-border-radius: 0 0 4px 4px;
+     border-radius: 0 0 4px 4px;
+     text-align: justify;
+     background-image:url("images/errortriangle.png");
+     background-position:15px center;
+     background-repeat:no-repeat;
+     -moz-box-shadow: inset 0px 0px 0px 1px #d00;
+     word-wrap: break-word;
+     font-weight: bold;
+     color: #EE9;
+}
+
+div.sorry hr {
+     color: #EE9;
+     background: #EE9;
+     height: 1px;
+     border: 1px solid #EE9;
+     margin: 10px 0;
+}     
+
+div.main {
+     margin: -1px 5px 5px 205px;
+     padding: 0 15px 15px 15px;
+     text-align: left;
+     color: #EE9;
+     width: auto;
+/*  overflow-x: scroll; */
+     border: 1px solid #494;
+     -moz-border-radius: 0 0 4px 4px;
+     -khtml-border-radius: 0 0 4px 4px;
+     border-radius: 0 0 4px 4px;
+     background: #000 url(images/scarface.jpg) right bottom no-repeat !important;
+     min-width: 620px;
+     -moz-box-shadow: 0 1px 5px #000;
+}
+
+div.main textarea {
+     background: #000;
+     color: #EE9;
+     font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
+}
+
+div.news {
+     margin: -1px 5px 0px 205px;
+     padding: 5px 30px 5px 30px;
+     border: 1px solid #494;
+     background: #000;
+     background: #000 url("images/news.png")no-repeat scroll bottom right;
+     color: #7b7;
+     font-size: 7.5pt;
+     text-align: right;
+     -moz-box-shadow: 0 1px 5px #000;
+     -khtml-box-shadow: 0 1px 5px #000;
+     box-shadow: 0 1px 5px #000;
+     min-width: 590px;
+}
+
+div.news li {
+     text-align: justify;
+     list-style: url('images/info_dark.png');
+     list-style: none;
+     margin: 0;
+     padding: 5px 5px 5px 0;
+     vertical-align: middle;
+     word-wrap: break-word;
+     color: #494;
+     font-weight: bold;
+     font-size: 9.5pt;
+     border-bottom: 1px dotted #494;
+     margin-bottom: 5px;
+     text-transform: capitalize;
+}
+
+div.news h3 {
+     background: none;
+     text-align: left;
+     border: none;
+     padding-left: 0;
+     padding-top: 2px;
+     border-bottom: 1px dotted;
+}
+
+div.news h4 {
+     border-bottom: 1px;
+     border-bottom-style: dotted;
+     border-bottom-color: #494;
+     padding: 0 0 0px 0;
+     margin: 5px 0 10px 0;
+     font-size: 10pt;
+     opacity: 1;
+     text-transform: capitalize;
+}
+
+div.news h4:first-child {
+     background: url('../images/itoopbullet.png');
+     background-repeat: no-repeat;
+     background-position: right;   
+}
+
+div.news p {
+     margin-top: -5px;
+     font-size: 8.5pt;
+     color: #EE9;
+     margin-bottom: 0;
+}
+
+div.news p:nth-child(n+1) {
+     margin-top: 5px;
+}
+
+div.news hr {
+     margin: 8px 0 3px 0;
+}     
+
+div.confignav {
+     padding: 15px 10px !important;
+     margin: 15px 0;
+     background: #000 url('images/header.png') center center repeat-x ;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     border-radius: 4px;
+     border: 1px solid #494;
+     font-size: 9.5pt !important;
+     font-weight: bold !important;
+     line-height: 160% !important;
+
+}
+
+div.configure {
+/*     padding: 5px 15px 0 15px;
+     margin: 10px 0px;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     border-radius: 4px;
+     border: 1px solid #494; */
+     background: none;/* url(images/camotile2.png);*/
+}
+
+div.messages {
+     padding: 10px;
+     margin: 10px 0 15px 0;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     border-radius: 4px;
+     border: 1px solid #494;
+     background: #000  /*url('images/infotile.png') center left no-repeat;*/
+     font-weight: bold;
+     font-size: 9pt;
+     color: #4f4;
+}
+
+div.error {
+     color: #d90;
+}
+
+div.notice {
+     font-style: italic;
+}
+
+div.messages li {
+     text-align: justify !important;
+     font-weight: bold;
+     list-style: url(images/warning_dark.png) !important;
+     margin: 0 5px 0 50px !important;
+     padding: 0 10px 0 0 !important;
+     border: 0px !important;
+}
+
+div.graphspanel {
+     padding: 0;
+     margin: 15px 0px -15px 0;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     border-radius: 4px;
+/*     border: 1px solid #494;*/
+     background: none;/* url(images/camotile.png);*/
+     text-align: center;
+}
+
+div.widepanel h3 {
+     text-align: left !important;
+}
+
+div.graphspanel form {
+     text-align: left;
+     padding: 0 15px 0px 15px;
+}
+
+div.graphspanel hr {
+     margin: 10px -15px 10px -15px;
+}
+
+div.graphspanel img {
+     border: 1px solid #494;
+     padding: 3px;
+     margin: 5px;
+     text-align: center !important;
+     background: #000;
+
+     opacity: 0.8;
+}
+
+div.graphspanel img:hover {
+     border: 1px solid #000;
+     padding: 3px;
+     margin: 5px;
+     text-align: center !important;
+     background: #000;
+     -moz-box-shadow: inset 0px 0px 1px 1px #f60;
+     -khtml-box-shadow: inset 0px 0px 1px 1px #f60;
+     box-shadow: inset 0px 0px 1px 1px #f60;
+     opacity: 1;
+}
+
+table {
+     border-collapse: collapse;
+     width: 100%;
+     border: 1px solid #494;
+     cell-padding: 1px;
+     font-size: 7pt;
+     background: #030;
+     margin: 1px 0;
+}
+
+table hr {
+     padding: 0px 0;
+     color: #494;
+     background: #494;
+     border: 0px solid #494;
+     margin: 0px 0px;
+     height: 1px;
+     display: none;
+}
+
+th {
+     padding: 6px 2px;
+     color: #EE9;
+     text-align: center;
+     font-size: 9pt;
+     background: #000; /*url('images/tabletitledark.png') repeat-x;*/
+     background: #000 url('images/header.png') center center repeat-x ;
+     border-top: 1px solid #494;
+     border-bottom: 1px solid #494 !important;     
+     line-height: 110%;
+}
+
+tr {
+     vertical-align: middle;
+}
+
+tr:nth-child(even) {
+     background: #010;/* url('images/darkerbluetile.png') !important;*/
+     vertical-align: middle;
+}
+
+tr:nth-child(odd) {
+     background: #000800;/* url('images/darkbluetile.png') !important;*/
+     vertical-align: middle;
+}
+/*
+tr:last-child {
+     background: #004 url('images/lightbluetile.png') !important;
+     font-weight: bold;
+     border: 1px solid #494 !important;
+}
+*/
+td {
+     padding: 4px 6px;
+     color: #EE9;
+     vertical-align: middle;
+     border-top: 1px inset #494;
+     border-bottom: 1px outset #494;   
+}
+
+td img {
+     padding: 0 1px 0 2px;
+}
+
+tt {
+     font: bold 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
+     color: #FF0;
+     padding: 0 5px 2px 0;
+}
+
+div.main li {
+     text-align: left;
+     list-style: square;
+     margin: 2px 0px 2px 30px;
+     padding: 2px 20px 2px 0px;
+/*     line-height: 150%;*/
+     word-wrap: break-word;
+}
+
+
+div.main li b {
+     color: #b70 !important;
+     letter-spacing: 0.07em;
+     font-size: 9pt;
+     text-shadow: 0 1px 1px #700;
+}
+
+.tidylist {
+     text-align: justify !important;
+     line-height: 150%;
+}
+
+.tidylist:first-child {
+/*     padding-top: 5px;*/
+}
+
+.tidylist:last-child {
+     padding-bottom: 10px;
+}
+
+.tidylist code {
+     text-align: left;
+     font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
+     color: #dd0;
+     padding: 1px 2px;
+     background: #030;
+     margin: 0 2px;
+}
+
+ol {
+     display: inline;
+     margin: 1px 0 0 0;
+     padding: 1px 0 0 20px;
+}
+
+ul {
+/*     display: inline; */
+     margin: 0;
+     padding: 0;
+}
+
+code {
+     text-align: left;
+     font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
+     color: #dd0;
+/*     padding: 1px 2px;*/
+}
+
+a:link, h2 a:link{
+     color: #494;
+     text-decoration: none;
+     font-weight: bold;     
+     word-wrap: break-word;
+}
+
+a:visited{
+     color: #7b7;
+     text-decoration: none;
+     font-weight: bold;     
+     word-wrap: break-word;
+}
+
+a:hover{
+     color: #f60;
+     text-decoration: underline;
+     font-weight: bold;     
+     word-wrap: break-word;
+}
+
+.links {
+     padding-bottom: -2px;
+     text-align: justify;
+     margin-top: 10px;
+     margin-bottom: -10px;
+}
+
+.links li {
+     list-style-image: url("images/link.png") !important;
+}
+
+.links b{
+     color: #b70 !important;
+     letter-spacing: 0.07em;
+     font-size: 9.5pt;
+     line-height: 165%;
+     text-shadow: 0 1px 1px #700;
+}
+
+p {
+     text-align: justify;
+     line-height: 160%;
+}
+
+h1 {
+     text-align: left;
+     color: #EE9;
+     padding: 15px 15px 14px;
+     margin: 0 5px 0px 205px !important;
+     font-size: 17pt;
+     font-weight: bold;
+     font-style: normal;
+     text-transform: uppercase;
+     letter-spacing: 0.15em;
+     text-shadow: 0px 0px 2px #010;
+     white-space: normal;
+     background: #000 url("images/scope.png")no-repeat scroll right top;
+     background: #000 url("images/bg2.png")no-repeat scroll top right;
+     background: #000 url('images/header.png') center center;
+     background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000));
+     border: 1px solid #494;
+     border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+     -khtml-border-radius: 4px 4px 0 0;
+     line-height: 120%;
+     min-width: 620px;
+     -moz-box-shadow: 0 1px 5px #000;
+     -khtml-box-shadow: 0 1px 5px #000;
+     box-shadow: 0 1px 5px #000;
+}
+
+h2 {
+     font-size: 12pt;
+     color: #EE9;
+     text-shadow: 0px 0px 2px #010;
+     letter-spacing: 0.05em;
+     background: #000 url(images/camotile2.png);
+     background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000));
+     background: #000 url('images/header.png') center center ;
+     padding: 10px;
+     wordwrap: none;
+     border: 1px solid #494;
+     border-radius: 4px;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     vertical-align: middle;
+     margin: 15px 0 12px 0 !important;
+    text-transform: uppercase;
+     word-wrap: break-word;
+}
+
+h2 a:visited {
+     color: #191;
+}
+
+h2 a:hover {
+     color: #f60;
+     text-shadow: 0px 0px 1px rgba(255, 64, 0, 0.7);
+}
+
+h3 {
+     border: 1px solid #494;
+     border-left: 5px solid #494;
+     padding: 5px 6px;
+     margin: 12px 0 10px 0;
+     border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+     -khtml-border-radius: 0 4px 4px 0;
+     background: #000 url(images/camotile.png);
+     background: #000 url('images/header.png') center center ;
+     text-transform: uppercase;
+     text-shadow: 0px 0px 2px #010;
+}
+
+h4 {
+     border-bottom: 1px;
+     border-bottom-style: solid;
+     border-bottom-color: #494;
+     padding: 0 0 10px 0;
+     margin: 5px 0 10px 0;
+     font-size: 11pt;
+}
+
+button, button:visited {
+     font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
+     border: 1px outset #191;
+     padding: 1px 3px;
+     text-decoration: none;
+     border-radius: 4px;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     font-size: 8pt;
+     font-weight: bold;
+     margin: 2px 3px;
+     text-align: center;
+     vertical-align: middle;
+     min-width: 76px;
+     -moz-box-shadow: inset 0px 1px 1px 0px #494;
+     -khtml-box-shadow: inset 0px 1px 1px 0px #191;
+     box-shadow: inset 0px 1px 1px 0px #191;
+     background: #000;
+     color: #494;
+}
+
+button:hover {
+     border: 1px solid #f60;
+     -moz-box-shadow: inset 0px 1px 1px 0px #EE9;
+     -khtml-box-shadow: inset 0px 1px 1px 0px #EE9;
+     box-shadow: inset 0px 1px 1px 0px #EE9;
+     background: #000;
+     color: #f60;
+}     
+          
+button:active {
+     border: 1px inset #f60;
+     background: #f60;
+     color: #EE9;
+     -moz-box-shadow: inset 0px 0px 0px 0px #f60;
+     -khtml-box-shadow: inset 0px 0px 0px 0px #f60;
+     box-shadow: inset 0px 0px 0px 0px #f60;
+}
+
+.underline {
+     border-bottom: 1px solid #eeeeff;
+     padding: 5px 0px 5px 0px;
+     margin: 0px 0px 10px 0px;
+}
+
+.langbox {
+     margin: 8px 2px 2px 5px;
+     padding: 7px 10px 5px 10px;
+     color: #EE9;
+     font-size: 7pt;
+     width: 220px;
+     text-align: right;
+     float: right;
+     vertical-align: middle;
+}
+
+.langbox img {
+     opacity: 0.5;
+     -moz-box-shadow: 0 0 1px #000;
+}
+
+.langbox img:hover {
+     opacity: 1;
+     -moz-box-shadow: 0 0 1px #f60;
+}
+
+hr {
+     color: #494;
+     background: #494;
+     height: 1px;
+     border: 0px solid #494;
+     margin: 20px 0 10px;
+}
+
+hr:last-child {
+     margin-top: 20px;
+     margin-bottom: 20px;
+}
+
+sidebarlogo {
+     text-align: center;
+}
+
+input {
+     border: 1px outset #5f5;
+     -moz-box-shadow: inset 0px 1px 1px 0px #373;
+     -khtml-box-shadow: inset 0px 1px 1px 0px #373;
+     box-shadow: inset 0px 1px 1px 0px #373;
+     background: #000;
+     color: #494;
+     margin: 5px;
+     font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
+     padding: 1px 2px;
+     text-decoration: none;
+     border-radius: 4px;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+}
+
+input:hover {
+     background: #000;
+     color: #f60;
+     border: 1px solid #f60;
+     -moz-box-shadow: inset 0px 1px 1px 0px #9e9;
+     -khtml-box-shadow: inset 0px 1px 1px 0px #9e9;
+     box-shadow: inset 0px 1px 1px 0px #9e9;
+}
+
+input:active {
+     background: #000;
+     color: #f30;
+     border: 1px solid #f30;
+}
+
+input:active {
+     border: 1px inset #f60;
+     background: #f60;
+     color: #EE9;
+}
+
+input[type=text], input[type=password] {
+     background: #000;
+     color: #EE9;
+     margin: 5px 10px;
+     padding: 4px 2px;
+     font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
+     border: 1px solid #494 !important;
+     text-decoration: none;
+     border-radius: 4px;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     -moz-box-shadow: inset 1px 1px 1px 0px #000;
+     -khtml-box-shadow: inset 1px 1px 1px 0px #000;
+     box-shadow: inset 1px 1px 1px 0px #000;
+}
+
+input[type=text]:active, input[type=text]:hover, input[type=password]:active, input[type=password]:hover {
+     background: #000;
+}
+
+fieldset {
+overflow: hidden;
+position: relative;
+}
+
+select {
+     background: #000;
+     color: #EE9;
+     margin: 5px 10px;
+     border: 1px solid #494;
+     border-radius: 4px;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     min-width: 110px;
+     font: 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
+     padding: 2px;
+}
+
+textarea {
+     background: #000;
+     color: #EE9;
+     padding: 5px;
+     margin: 10px;
+     border-radius: 4px;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
+     min-height: 100px;
+     min-width: 97%;
+     text-align: left;
+     border: 1px solid #494;
+}
+
+.proxyfooter {
+     margin: 0 20px 10px 240px;
+     padding: 20px 25px 20px 75px;
+     font-color: #f00;
+     font-size: 7pt;
+     text-align: right !important;
+     border-radius: 4px;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     border: 1px solid #000;
+     display: none;
+}        
+
+.statusnotes {
+     font-style: italic;
+     font-size: 8pt;
+     color: #EE9;
+     text-align: center;
+     border: 1px solid #494 !important;
+/*     border-top: 0px !important;*/
+     margin: -3px 0 5px 0; 
+     padding: 7px;
+     background: #010;
+     -moz-box-shadow: inset 0px 0px 0px 1px #090;
+     -khtml-box-shadow: inset 0px 0px 0px 1px #090;
+     box-shadow: inset 0px 0px 0px 1px #090;
+/*     background: #000 url('images/header.png') repeat-x center center !important;*/
+}
+
+div.joblog {
+/*     margin: 	15px 0 15px 0;
+     padding: 5px 20px 10px 20px !important;
+     border: 1px solid #494;
+     background-color: #000;
+     background: #000; url("images/camotile.png");*/
+/*     color: #dfd;*/
+     border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+     -khtml-border-radius: 4px 4px 0 0;
+     text-align: justify !important;
+     overflow-x: auto; /* Opera fix */
+ }
+
+div.main li {
+     text-align: left;
+     list-style: square;
+     margin: 2px 0px 2px 30px;
+     padding: 2px 20px 2px 0px;
+/*     line-height: 150%;*/
+     word-wrap: break-word;
+}
+ 
+div.joblog li {
+     word-wrap: break-word !important;
+     text-align: justify !important;
+     line-height: 120% !important;
+     margin: 2px 0px 2px 30px;
+     padding: 2px 20px 2px 0px;
+}
+
+div.joblog ul {
+     word-wrap: break-word !important;
+     text-align: justify;
+     margin: 0px 0 10px;
+}
+
+div.joblog li:first-child {
+     margin-top: 0px;
+}
+
+div.joblog li:last-child {
+/*     margin-bottom: -25px;*/
+}
+
+div.joblog form:first-child {
+     margin-top: 10px;
+}
+
+div.joblog table {
+     margin-top: 15px;
+}
+
+div.joblog p {
+     line-height: 130%;
+}
+
+.smallhead {
+     font-size: 7pt
+}
+
+.mediumtags {
+     font-size: 9pt;
+}
+
+.optbox {
+     min-width: 16px !important;
+     max-width: 16px !important;     
+     width: 16px !important;
+     min-height: 16px;
+     max-height: 16px;     
+     height: 16px;
+     opacity: 1.0;
+     border: 0;
+     margin: 5px 5px 5px 10px;
+     padding: 2px;
+     overflow: hidden;
+     position: relative;
+}
+
+.optbox:hover {
+     min-width: 16px !important;
+     max-width: 16px !important;     
+     width: 16px !important;
+     min-height: 16px;
+     max-height: 16px;     
+     height: 16px;
+     opacity: 1.0;
+     border: 0;
+     margin: 5px 5px 5px 10px;
+     padding: 2px;
+}
+
+.cells {
+     border: 1px inset #494;
+     border-left: 1px outset #494;     
+}
+
+.tablefooter tr, .tablefooter td {
+     background: #000 url('images/header.png') repeat-x center center !important;
+     border-top: 1px solid #494;
+     border-bottom: 1px solid #494 !important;     
+     font-size: 7pt;
+     line-height: 110%;
+}
+
+.formaction {
+     text-align: right;
+}
+
+div.footnote {
+     text-align: right;
+     color: #494;
+     font-size: 7pt;
+     margin-bottom: -8px !important; 
+}
+
+div.footnote hr{
+     margin: 10px 0 5px 0 !important;
+     color: #494;
+     background: #494;
+     height: 1px;
+     border: 0px solid #494;
+}
+
+.topness {
+     font-size: 7.5pt;
+     text-align: right;
+     margin-top: -5px;
+     margin-bottom: -5px;
+     margin-right: 5px;
+}
diff --git a/installer/resources/themes/console/light/console.css b/installer/resources/themes/console/light/console.css
index fe8b61cb23db257ceb3c616278f8232a5ed88008..426086518d222e25116362ad2c0bdcb605fc61e3 100644
--- a/installer/resources/themes/console/light/console.css
+++ b/installer/resources/themes/console/light/console.css
@@ -38,7 +38,7 @@ div.logo {
      -moz-border-radius: 4px;
      -khtml-border-radius: 4px;
      border-radius: 4px;
-     background: #ffe; /*url('images/lightbluetile.png')*/
+     background: #ffe;
      width: 185px;
      -moz-box-shadow: inset 0px 0px 1px 1px #bbf;
 }
@@ -90,7 +90,6 @@ div.routersummaryouter {
 }
 
 div.routersummary {
-/*  margin: 0px 20px 20px 0px; */
      width: 180px;
      padding: 8px 8px 10px 8px;
      text-align: center !important;
@@ -101,10 +100,10 @@ div.routersummary {
      -moz-border-radius: 4px;
      -khtml-border-radius: 4px;
      border-radius: 4px;
-     background: #ffe url('images/magic.png') center bottom;/* 
-     float: left;
-*/     
+     background: #ffe url('images/magic.png') center bottom;
      -moz-box-shadow: inset 0px 0px 1px 1px #bbf;
+     -khtml-box-shadow: inset 0px 0px 1px 1px #bbf;
+     box-shadow: inset 0px 0px 1px 1px #bbf;
 }
 
 div.routersummary input[type=text] {
@@ -118,7 +117,7 @@ div.routersummary hr {
      border-bottom: 1px solid #99f;
      margin: 8px -7px 8px -7px;
      -moz-box-shadow: inset 0px 1px 1px 1px #fff;
-    -khtml-box-shadow: inset 0px 0px 1px #fff;
+    -khtml-box-shadow: inset 0px 1px 0px #fff;
      box-shadow: inset 0px 1px 1px 1px #fff;
 }
 
@@ -139,6 +138,9 @@ div.routersummary h3 {
      -khtml-border-radius: 3px;
      border-radius: 3px;
      -moz-box-shadow: 0px 1px 5px #bbf;
+     -moz-box-shadow: outset 0px 0px 2px 1px #bbf;
+     -khtml-box-shadow: outset 0px 0px 2px 1px #bbf;
+     box-shadow: outset 0px 0px 2px 1px #bbf;
 }
 
 div.routersummary h3 a {
@@ -148,6 +150,9 @@ div.routersummary h3 a {
 div.routersummary h3:hover {
      background: #ffa url('images/header.png') center center repeat-x !important;
      text-shadow: 0 0 0;
+     -moz-box-shadow: inset 0px 0px 2px 1px #ffa;
+     -khtml-box-shadow: inset 0px 0px 2px 1px #ffa;
+     box-shadow: inset 0px 0px 2px 1px #ffa;
 }
 
 div.routersummary h4 {
@@ -155,14 +160,16 @@ div.routersummary h4 {
      border-bottom: 0 !important;
      font-size: 8.5pt;
      letter-spacing: 0.02em;
-     margin: -5px -7px -5px -7px !important;
+     margin: -6px -6px -7px !important;
      padding: 3px 3px 5px 3px;
-     background: #eed url(images/magic.png);
+     background: #ddf url(images/magic.png);
      text-transform: capitalize;
      text-decoration: none !important;
      color: #2b2;
      line-height: 105%;
-/*     text-shadow: 0px 1px 1px #99f;*/
+     -moz-box-shadow: inset 0px 0px 1px 30px #dfd;
+     -khtml-box-shadow: 0px 0px 1px 1px #dfd;
+     box-shadow: 0px 0px 1px 1px #fdf;
 }
 
 div.routersummary table {
@@ -243,22 +250,13 @@ div.tunnels td, div.tunnels img:first-child {
      padding: 4px 0 !important;
 }
 
-div.routersummary form {
-     margin: -6px 0 -5px 0;
-}
-
-div.routersummary form:last-child {
-     margin: 6px 0 0 0 !important;
-     padding: 0;
-}
-
 div.routersummary p {
      padding: 0;
 }     
 
 div.refresh {
-     margin-top: -6px !important;
-     margin-bottom: 0px !important;
+     margin-top: 10px !important;
+     margin-bottom: 10px !important;
      padding: 2px 0 0px 0 !important;
 }
 
@@ -324,6 +322,8 @@ div.main {
      -khtml-border-radius: 4px;
      border-radius: 4px;
      -moz-box-shadow: inset 0px 0px 1px 1px #bbf;
+     -khtml-box-shadow: inset 0px 0px 1px 1px #bbf;
+     box-shadow: inset 0px 0px 1px 1px #bbf;
      background: #ffe url('images/magic.png') center bottom;}
 
 div.main hr, hr {
@@ -355,9 +355,11 @@ div.news {
      text-align: right !important;
      font-size: 7.5pt;
      line-height: 140%;
-     -moz-box-shadow: inset 0px 0px 1px 0px #410;
+     -moz-box-shadow: inset 0px 0px 1px 1px #bbf;
+     -khtml-box-shadow: inset 0px 0px 1px 1px #bbf;
+     box-shadow: inset 0px 0px 1px 1px #bbf;
      background: #ffe url('images/magic.png') center bottom;
-     min-width: 480px;
+     min-width: 490px;
 }
 
 div.news p {
@@ -368,37 +370,12 @@ div.news p {
      padding: 0 15px;
 }
 
-div.news h3 {
-     text-align: left !important;
-}
-
-/*
-div.news a:link{
-     color: #a30;
-     text-decoration: none;
-}
-
-div.news a:visited{
-     color: #930;
-}
-
-div.news a:hover{
-     color: #d20;
-     text-decoration: underline;
-}
-
-div.news a:active{
-     color: #c30;
-}
-*/
-
 div.news hr{
      color: #225;
      background: #225;
      height: 1px;
      border: 0px dotted #225;
      margin: 10px 0 5px;
-/*     -moz-box-shadow: 0px -1px 1px 1px #ffe;*/
      opacity: 0.6;
 }
 
@@ -426,12 +403,25 @@ div.news li:first-child {
      margin-top: 10px !important;
 }
 
-/*
-div.news  h4 a{
-     color: #910 !important;
-     opacity: 1 !important;
+div.news h3 {
+     background: none !important;
+     text-align: left;
+     border: none !important;
+     padding-left: 0;
+     padding-top: 0px;
+     border-bottom: 1px dotted #225 !important;
+     -moz-box-shadow: none;
+     -khtml-box-shadow: none;
+     box-shadow: none;
+     font-size: 10pt !important;
+     letter-spacing: 0.05em;
+     text-transform: capitalize !important;
+     text-shadow: 0px 0px 0px #77f;
+}
+
+div.news i {
+     font-style: normal;
 }
-*/
 
 div.news h4 {
      border-bottom: 0px;
@@ -443,34 +433,29 @@ div.news h4 {
 div.confignav {
      padding: 15px 10px !important;
      margin: 15px 0 15px 0;
-     background: #ffe url('images/header.png') center center repeat-x;
+     background: url('images/header.png') center center repeat-x;
      -moz-border-radius: 4px;
      -khtml-border-radius: 4px;
      border-radius: 4px;
-     border: 1px solid #113;
+     border: 1px solid #115;
      font-size: 9.5pt !important;
      font-weight: bold !important;
      line-height: 160% !important;
-     -moz-box-shadow: inset 0px 0px 1px 1px #bbf;
+     -moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
+     -khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
+     box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
+     opacity: 1;
      min-width: 400px;
 }
 
 div.configure {
-/*     padding: 5px 15px 0px 15px !important;
-     margin: 0px 0px 15px 0;
-     background: #ffe; url('images/lightbluetile.png')
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     border-radius: 4px;
-     border: 1px solid #447;
-     -moz-box-shadow: inset 0px 0px 1px 1px #bbf;*/
      min-width: 400px;
      margin-bottom: 0px;
 }
 
 div.configure h3, div.graphspanel h3 {
-     border: 1px solid #113;
-     border-left: 5px solid #113;
+     border: 1px solid #115;
+     border-left: 5px solid #115;
      padding: 5px;
      margin: 15px 0 15px 0;
      border-radius: 0 4px 4px 0;
@@ -481,14 +466,6 @@ div.configure h3, div.graphspanel h3 {
 }
 
 div.graphspanel {
-/*     padding: 12px;
-     margin: 10px 0px 25px 0;
-     background: #ffe url('images/lightbluetile.png');
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     border-radius: 4px;
-     border: 1px solid #447;
-     -moz-box-shadow: inset 0px 0px 1px 1px #bbf;*/
      text-align: center !important;
      margin: 15px 0px -15px;
 }
@@ -520,21 +497,22 @@ div.graphspanel form {
 div.messages {
      padding: 10px;
      margin: 10px 0 15px 0;
-     background: #ffe;
      -moz-border-radius: 4px;
      -khtml-border-radius: 4px;
      border-radius: 4px;
      border: 1px solid #447;
-     background: #ffe url('images/magic.png');
+     background: #fff url('images/magic.png');
      font-weight: bold;
-     -moz-box-shadow: inset 0px 0px 1px 1px #bbf;
+     -moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
+     -khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
+     box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
 }
 
-div.messages span.error {
+div.error {
      color: #d00000;
 }
 
-div.messages span.notice {
+div.notice {
      font-style: italic;
 }
 
@@ -591,13 +569,7 @@ tr:nth-child(even) {
 tr:nth-child(odd) {
      background: #fff url(images/magic.png);
 }
-/*
-tr:last-child {
-     background: #bbf url('images/tabletilelighter.png') !important;
-     font-weight: bold;
-     border: 1px solid #002 !important;
-}
-*/
+
 td {
      padding: 5px 3px;
      color: #000;
@@ -631,7 +603,8 @@ div.main li {
 }
 
 div.main li b {
-     color: #514!important;
+     color: #514 !important;
+     color: #003 !important;
      letter-spacing: 0.01em;
      font-size: 9.5pt;
      line-height: 170%;
@@ -657,9 +630,7 @@ div.main li:first-child {
      font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
      color: #910;
      padding: 2px 3px;
-     background: #fff;
      font-weight: bold;
-     background: #ffb url('images/magic.png') center bottom;
 }
 
 ol {
@@ -684,7 +655,6 @@ code {
      text-align: left;
      font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
      color: #390;
-     padding: 2px 3px;
      font-weight: bold;
 }
 
@@ -740,16 +710,17 @@ p {
 
 h1 {
      text-align: left;
-     color: #000;
+     color: #115;
      padding: 10px 15px;
      margin: 0 10px 10px 207px;
      font: normal bold 16pt/120% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
      letter-spacing: 0.15em;
      text-transform: uppercase;
-     text-shadow: 0px 0px 1px #77f;
      -moz-box-shadow: inset 0px 0px 1px 1px #bbf;
+     -khtml-box-shadow: inset 0px 0px 1px 1px #bbf;
+     box-shadow: inset 0px 0px 1px 1px #bbf;
      white-space: normal;
-     background: #ffe url('images/header.png') center center repeat-x;
+     background: #ffe url('images/magic.png') center center repeat;
      border: 1px solid #447;
      border-radius: 4px;
      -moz-border-radius: 4px;
@@ -759,22 +730,36 @@ h1 {
 
 h2 {
      font-size: 13pt;
-     color: #000;
-     letter-spacing: 0.05em;
-     background: #ffe url('images/header.png') center center repeat-x;
-     text-shadow: 0px 0px 1px rgba(0, 0, 64, 0.5);
-     padding: 10px 10px;
+     color: #115;
+     letter-spacing: 0.07em;
+     background: url('images/header.png') center center repeat-x;
+     padding: 10px;
      wordwrap: none;
-     border: 1px solid #113;
+     border: 1px solid #115;
      border-radius: 4px;
      -moz-border-radius: 4px;
      -khtml-border-radius: 4px;
      margin: 15px 0px 15px 0 !important;
-     -moz-box-shadow: 0 1px 1px 1px rgba(176, 176, 216, 0.4);
+     -moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
+     -khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
+     box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
      word-wrap: break-word;
      opacity: 1;
 }
 
+h2 a, h3 a {
+    text-transform: capitalize;
+    letter-spacing: 0.03em;
+}
+
+h2 a:hover, h3 a:hover {
+     text-shadow: none;
+}
+
+.routersummary h3 a{
+    text-transform: uppercase;
+}
+
 h2 a:hover {
      text-shadow: 0px 0px 1px rgba(255, 255, 72, 0.9);
      border-bottom: 1px #ff6600;
@@ -786,18 +771,21 @@ h2 img {
 }
 
 h3 {
-     border: 1px solid #113;
-     border-left: 5px solid #113;
-     padding: 5px 5px 5px 5px;
+     border: 1px solid #115;
+     border-left: 5px solid #115;
+     padding: 5px 5px 5px 8px;
      margin: 12px 0 15px 0;
      border-radius: 0 4px 4px 0;
      -moz-border-radius: 0 4px 4px 0;
      -khtml-border-radius: 0 4px 4px 0;
-     background: #ffe url('images/header.png') center center repeat-x !important;
+     background: url('images/header.png') center center repeat-x !important;
      font-size: 11pt;
-     color: #000;
-     -moz-box-shadow: 0 1px 1px 1px rgba(176, 176, 216, 0.4);
+     color: #115;
+     -moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
+     -khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
+     box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
      opacity: 1;
+     letter-spacing: 0.07em;
 }
 
 h4 {
@@ -811,7 +799,7 @@ h4 {
 
 button, button:visited{
      font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
-     border: 1px outset #999;
+     border: 1px outset #66a;
      padding: 1px 3px;
      background: #ffe !important;
      text-decoration: none;
@@ -823,7 +811,7 @@ button, button:visited{
      margin: 0 1px;
      text-align: center;
      min-width: 80px;
-     -moz-box-shadow: inset 0px 2px 8px 0px #fff;
+     -moz-box-shadow: inset 0px 0px 2px 1px #fff;
      -khtml-box-shadow: inset 0px 2px 8px 0px #fff;
      box-shadow: inset 0px 2px 8px 0px #fff;
      color: #316;
@@ -854,36 +842,23 @@ button:active{
 }
 
 .langbox {
-     margin: 20px 10px 4px 5px;
+     margin: 7px 10px 4px 5px;
      padding: 8px 5px;
      color: #001;
      font-size: 7pt;
      width: 260px;
      text-align: right;
      float: right;
-     valign: middle;
+     vertical-align: middle;
      opacity: 1 !important;
 }
 
 .langbox img {
      opacity: 0.8 !important;
-     -moz-box-shadow: 0 0 1px #447;
 }
 
 .langbox img:hover {
      opacity: 1 !important;
-     -moz-box-shadow: 0 0 1px #f60;
-}
-
-input {
-     background: #ffe;
-     color: #316;
-     margin: 5px 10px 5px 10px;
-     padding: 4px 2px;
-     font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
-     border: 1px solid #447;
-     text-decoration: none;
-     min-width: 110px;
 }
 
 input, input:visited {
@@ -894,7 +869,6 @@ input, input:visited {
      font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
      padding: 1px 2px;
      text-decoration: none;
-     min-width: 110px;
      border-radius: 4px;
      -moz-border-radius: 4px;
      -khtml-border-radius: 4px;
@@ -919,6 +893,8 @@ input:active {
      border: 1px solid #f60;
      opacity: 1.0;
      -moz-box-shadow: inset 0px 0px 0px 1px #f60;
+     -khtml-box-shadow: inset 0px 0px 0px 1px #f60;
+     box-shadow: inset 0px 0px 0px 1px #f60;
 }
 
 input[type=text], input[type=password] {
@@ -960,6 +936,12 @@ select {
      text-align: left !important;
 }
 
+select:active {
+     -moz-box-shadow: inset 0px 0px 0px 1px #f60;
+     -khtml-box-shadow: inset 0px 0px 0px 1px #f60;
+     box-shadow: inset 0px 0px 0px 1px #f60;     
+}
+
 textarea {
      padding: 5px;
      margin: 5px 15px 5px 10px;
@@ -974,7 +956,11 @@ textarea {
      border: 1px solid #447;
 }
 
-form {}
+textarea:active {
+     -moz-box-shadow: inset 0px 0px 0px 1px #f60;
+     -khtml-box-shadow: inset 0px 0px 0px 1px #f60;
+     box-shadow: inset 0px 0px 0px 1px #f60;     
+}
 
 .proxyfooter {
      margin: 0 20px 10px 240px;
@@ -990,59 +976,19 @@ form {}
 }    
 
 .statusnotes {
-     font-style: italic;
+     font-style: normal;
      font-size: 8pt;
-     font-color: #001 !important;
+     font-color: #225 !important;
      text-align: center;
      border: 1px solid #447 !important;
      border-top: 0 !important;
      margin: -5px 0 5px 0; 
      padding: 7px;
-     background: #ffe url('images/magic.png') center bottom;
-     -moz-box-shadow: inset 0px 0px 2px 1px #ffe;
-}
-
-/*
-.joblog {
-     margin: 15px 0;
-     padding: 10px 20px !important;
-     border: 1px solid #447;
-     background-color: #004;
-     background: #ffe url('images/lightbluetile.png');
-     color: #001;
-     border-radius: 4px;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     text-align: justify;
-     -moz-box-shadow: inset 0px 0px 1px 1px #bbf;
-     overflow: auto;
- }
- 
- div.joblog:li {
-     word-wrap: break-word !important;
-}
-
- .joblog:ul {
-     word-wrap: break-word !important;
+     background: url("images/header.png") repeat scroll center center #eef;
+     letter-spacing: 0em !important;
 }
 
-.joblog table {
-     margin-top: 10px;
-}
-*/
-
 div.joblog {
-/*     margin: 15px 0;
-     padding: 10px 20px !important;
-     border: 1px solid #447;
-     background-color: #004;
-     background: #ffe; /*url('images/lightbluetile.png')
-     color: #001;
-     border-radius: 4px;
-     -moz-border-radius: 4px;
-     -khtml-border-radius: 4px;
-     text-align: justify;
-     -moz-box-shadow: inset 0px 0px 1px 1px #bbf;*/
      overflow: auto;
      border: 0;
      margin-top: 5px;
diff --git a/installer/resources/themes/console/light/console_big.css b/installer/resources/themes/console/light/console_big.css
index ebc83a598741b8285af1195290f65e1c19f4ea58..8f3e3a3463be0e3db20912519003ba6b17520431 100644
--- a/installer/resources/themes/console/light/console_big.css
+++ b/installer/resources/themes/console/light/console_big.css
@@ -15,18 +15,19 @@ div.routersummary h3, div.routersummary h4, div.routersummary p, div.routersumma
 }
 
 
-div.routersummary h4 {
-     font-size: 11pt;
+div.routersummary h4, div.routersummary h4 a {
+     font-size: 11pt !important;
      letter-spacing: 0.1em;
+     -moz-box-shadow: inset 0px 0px 1px 15px #dfd;
 }
 div.routersummary b {
-     font-size: 9pt;
+     font-size: 9.5pt;
      font-weight: normal !important;
 }
 
 div.routersummary a {
-     word-spacing: 0.2em !important;
-     letter-spacing: 0.1em !important;
+     word-spacing: 0.1em !important;
+     letter-spacing: 0.05em !important;
      font-size: 10.5pt;
      line-height: 150%;
 }
@@ -48,7 +49,7 @@ button, button:visited {
 }
 
 b {
-     color: #505;
+     color: #152 !important;
 }
 
 div.news {
@@ -65,4 +66,28 @@ input, input:visited {
 
 table {
      font: 8.5pt/130% Verdana, "Bitstream Vera Sans", Tahoma, Helvetica, sans-serif;
+}
+
+td {
+     font-size: 9pt;
+}
+
+.statusnotes {
+     font-size: 10pt;
+     letter-spacing: 0.2em !important;
+     text-shadow: none !important;
+}
+
+.tablefooter tr, .tablefooter td {
+     font-size: 10pt !important;
+}
+
+div.tunnels a {
+     font-size: 9.5pt !important;
+     letter-spacing: 0 !important;
+     word-spacing: 0 !important;
+}
+
+code, tt {
+     font-size: 10pt !important;
 }
\ No newline at end of file
diff --git a/installer/resources/themes/console/light/default.css b/installer/resources/themes/console/light/default.css
index cbe675c2b63fc6381ab44ca15a504b1c43366b96..0c125086363993d30f7bea5cfa37e3d99e79e4e9 100644
--- a/installer/resources/themes/console/light/default.css
+++ b/installer/resources/themes/console/light/default.css
@@ -1,3 +1,7 @@
+/* I2P Tunnel Manager Theme: Light */
+/* Description: Light blue highlights. */
+/* Author: dr|z3d */
+    
 body {
      margin: 0px;
      padding: 0px;
@@ -39,19 +43,21 @@ label {
 }
 
 h4 {
-     font-size: 14px;
+     font-size: 11pt;
      font-weight: bold !important;
-     color: #001;
-     text-align: center;
-     border: 1px solid #225;
+     color: #115;
+     text-align: left;
+     border: 1px solid #115;
      margin: 5px 0 15px 0;
      padding: 5px 10px;
-     background: #eef url(images/header.png) repeat-x center center;
-     letter-spacing: 0.08em;
-     -moz-box-shadow: inset 0px 0px 4px 0px #bbf;
+     background: url(images/header.png) repeat-x center center;
+     letter-spacing: 0.07em;
      -moz-border-radius: 4px;
      -khtml-border-radius: 4px;
      border-radius: 4px;
+     -moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
+     -khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
+     box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4);
 }
 
 a {
@@ -65,7 +71,7 @@ form {
 textarea, input, select, button, a {
      -moz-box-sizing: border-box;
      box-sizing: border-box;
-     font-size: 9pt;
+     font-size: 8.5pt;
      float: left;
      vertical-align: middle;
 }
@@ -76,10 +82,18 @@ button {
 }
 
 textarea {
-     border: 1px solid #9999ff;
-     color: #001;
-     background: #ddf;
-     border: 1px solid #44d;
+     color: #003;
+     background: #fff;
+     border: 1px solid #447;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     border-radius: 4px;
+}
+
+textarea:active {
+     -moz-box-shadow: inset 0px 0px 0px 1px #f60;
+     -khtml-box-shadow: inset 0px 0px 0px 1px #f60;
+     box-shadow: inset 0px 0px 0px 1px #f60;     
 }
 
 br {
@@ -126,36 +140,42 @@ hr {
 .separator, .subdivider {
      clear: both;
      height: 1px;
-     margin: 1px 0px 1px 0px;
-     border-bottom: 1px solid #225;
+     margin: 10px 0px 10px 0px;
+     border-bottom: 1px dotted #447;
 /*
      display: none;
 */
 }
 
 .subdivider {
-     border-bottom: 1px solid #225;
-     padding: 5px 0px 0px 0px;
+     border-bottom: 1px dotted #447;
+     padding: 5px 0;
 }
 
 .freetext {
      width: 150px;
      height: 24px;
-     border: 1px solid #44d;
+     border: 1px solid #447;
      padding: 2px;
      margin: 4px 0 2px 0px;
-     font: 10pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
+     font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
      font-weight: bold;
-     background: #ddf;
-     color: #001;
-     -moz-border-radius: 0 4px 4px 0;
-     -khtml-border-radius: 0 4px 4px 0;
-     border-radius: 0 4px 4px 0;
+     background: #fff;
+     color: #003;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     border-radius: 4px;
 /*
      -moz-box-shadow: inset 0px -1px 1px 0px #fff;
 */
 }
 
+.freetext:active {
+     -moz-box-shadow: inset 0px 0px 0px 1px #f60;
+     -khtml-box-shadow: inset 0px 0px 0px 1px #f60;
+     box-shadow: inset 0px 0px 0px 1px #f60;     
+}
+
 .control, control:link, control:visited {
      margin: 4px 0 0 4px !important;
      padding: 2px;
@@ -164,7 +184,7 @@ hr {
      font-weight: bold;
      background: #ffe;
      color: #001;
-     border: 1px outset #ddddc0;
+     border: 1px outset #66a;
      text-align: center;
      white-space: nowrap;
      -moz-border-radius: 4px;
@@ -182,11 +202,17 @@ hr {
      text-decoration: none;
 }
 */
+
 .control:hover, control:visited:hover {
-     border: 1px solid #eef;
      background-color: #f60;
      color: #fff !important;
      text-decoration: none;
+     border: 1px solid #f60 !important;
+     background: #f60 !important;
+     color: #fff;
+     -moz-box-shadow: inset 0px 0px 0px 1px #fff !important;
+     -khtml-box-shadow: inset 0px 0px 0px 1px #fff !important;
+     box-shadow: inset 0px 0px 0px 1px #fff !important;
 }
 
 .control:link, control:visited {
@@ -196,7 +222,7 @@ hr {
      min-width: 60px;
      font-weight: bold;
      color: #001;
-     border: 1px outset #ddddc0;
+     border: 1px outset #66a;
      text-align: center;
      white-space: nowrap;
      -moz-border-radius: 4px;
@@ -220,7 +246,9 @@ hr {
      border-radius: 4px;
      border: 1px solid #002;
      padding: 10px 20px;
-     -moz-box-shadow: inset 0px 0px 1px 0px #002;
+     -moz-box-shadow: inset 0px 0px 1px 1px #bbf;
+     -khtml-box-shadow: inset 0px 0px 1px 1px #bbf;
+     box-shadow: inset 0px 0px 1px 1px #bbf;
     background: none repeat scroll 0 0 #EEEEFF;
     background: #fff url(images/magic.png);
     border: 1px solid #444477;
@@ -239,7 +267,7 @@ hr {
 .rowItem {
      width: 750px;
      float: left;
-     margin: 0px;
+     margin: 2px 0;
 }
 
 .comment {
@@ -255,7 +283,7 @@ hr {
      padding: 0 0 0 2px;
      float: left;
      margin: 0;
-     font-size: 9pt !important;
+     font-size: 8.5pt !important;
      font-weight: bold;
 }
 
@@ -267,17 +295,17 @@ hr {
      background-color: #fff;
      border: 1px solid #003;
      padding: 5px 20px 11px 10px;
-
      -moz-box-shadow: inset 0px 0px 0px 1px #f00;
      -moz-box-shadow: inset 0px 0px 1px 0px #f60;
      background: #fff url(images/magic.png);
      border: 1px solid #444477;
      color: #613;
-
 }
 
 #globalOperationsPanel .control {
      min-width: 120px;
+     font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
+     font-weight: bold;
 }
 
 #globalOperationsPanel .control:link {
@@ -346,27 +374,36 @@ globalOperationsPanel .control:hover {
 }
 
 select {
-     background-color: #eef;
-     color: #001;
+     background-color: #fff;
+     color: #003;
      margin: 4px;
      font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
      font-weight: bold;
-     border: 1px solid #001;
-     padding: 2px;
+     border: 1px solid #447;
+     padding: 3px 3px 3px 0;
      min-width: 270px;
      font-size: 8pt;
      max-height: 24px;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     border-radius: 4px;
+}
+
+select:active {
+     -moz-box-shadow: inset 0px 0px 0px 1px #f60;
+     -khtml-box-shadow: inset 0px 0px 0px 1px #f60;
+     box-shadow: inset 0px 0px 0px 1px #f60;     
 }
 
 a:link{
-     color: #613;
+     color: #359;
      text-decoration: none;
      font-weight: bold;
      word-wrap: break-word;
 }
 
 a:visited{
-     color: #606;
+     color: #218;
      text-decoration: none;
      font-weight: bold;
 }
diff --git a/installer/resources/themes/console/light/i2ptunnel.css b/installer/resources/themes/console/light/i2ptunnel.css
index f54cacfcab0dcafcfbeb64555d67e06e8ad4e539..050c7b28ac9d6b50fd82d053009c6788a73c7c54 100644
--- a/installer/resources/themes/console/light/i2ptunnel.css
+++ b/installer/resources/themes/console/light/i2ptunnel.css
@@ -82,19 +82,30 @@
      width: 100%;
      height: 100px;
      padding: 4px;
-     margin: 2px 0 3px 0;
+     margin: 2px 0 12px 0;
      background-color: #005;
-     color: #030;
+     color: #292;
      font-family: "Lucida Console", "DejaVu Sans Mono", "Andale Mono", "Courier New", Courier, mono;
-     border: 1px inset #002;
-     font-size: 9pt !important;
+     border: 1px solid #225;
+     font-size: 8pt !important;
      font-weight: bold;
      text-align: justify !important;
-     background: #ddf; /*url(images/tabletile.png);*/
+     background: #efe url(images/magic.png);
+     -moz-box-shadow: 0 0 0px 1px #7f7;
+     -khtml-box-shadow: 0 0 0px 1px #7f7;
+     box-shadow: 0 0 0px 1px #7f7;
+     opacity: 0.9;
 }
 
 #tunnelListPage .footer .control {
      margin-left: 2px;
+     font-family: "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
+     font-weight: bold;
+     color: #001 !important;
+}
+
+#tunnelListPage .footer .control:hover {
+     color: white !important;
 }
 
 #tunnelListPage .footer label {
@@ -140,6 +151,6 @@
 #tunnelListPage .descriptionField label, #tunnelListPage .destinationField label {
      text-align: right;
      width: 150px;
-     height: 24px;
+     height: 28px;
      float: left;
-}
+}
\ No newline at end of file
diff --git a/installer/resources/themes/console/midnight/console.css b/installer/resources/themes/console/midnight/console.css
index fbb7006f15470aacf9a7c235b6f7b9dc070b0f49..def9fad6dfe51c6fdb1d03b57d4d2cacf375ea81 100644
--- a/installer/resources/themes/console/midnight/console.css
+++ b/installer/resources/themes/console/midnight/console.css
@@ -169,10 +169,7 @@ div.routersummary {
      font-size: 9pt; 
      word-wrap: break-word; 
      font: 9pt/125%; 
-     -moz-box-shadow: inset 0px 0px 0px 1px #00000A; 
-/*     -moz-border-radius: 3px;
-     -khtml-border-radius: 3px;
-     border-radius: 3px;*/
+     -moz-box-shadow: inset 0px 0px 0px 1px #00000A;
 }
 
 div.routersummary input[type=text] {
@@ -283,16 +280,6 @@ div.tunnels table{
      padding-right: 0;
 }     
      
-div.routersummary form {
-     margin-top: -8px !important;
-     margin-bottom: -8px !important;     
-}
-
-div.routersummary form:last-child {
-     padding-top: 3px !important;
-     margin-bottom: -10px !important;     
-}
-
 div.refresh {
      margin-top: 10px !important;
      margin-bottom: 10px !important;
@@ -329,10 +316,7 @@ div.main {
      border-top: 0;
      text-align: left;
      color: #eef;
-     min-width: 570px;
-/*     -moz-border-radius: 0 0 3px 3px;
-     -khtml-border-radius: 0 0 3px 3px;
-     border-radius: 0 0 3px 3px;*/
+     min-width: 590px;
      background: #000 url(images/scarface.jpg) right bottom no-repeat !important;
 }
 
@@ -432,24 +416,29 @@ div.news li {
 }
 
 div.news h3 {
-     text-align: left !important;
+     background: none !important;
+     text-align: left;
+     border: none !important;
+     padding-left: 0;
+     padding-top: 0px;
+     border-bottom: 1px dotted !important;
+     -moz-box-shadow: none;
+     -hktml-box-shadow: none;
+     box-shadow: none;
+     font-size: 10pt !important;
+     letter-spacing: 0.05em;
+     text-transform: uppercase !important;
+     margin: 15px 10px -5px;
+     padding: 5px 0 5px;
 }
 
 div.news p {
      color: #eef;
      font-size: 9pt;
      margin-bottom: -10px;
-}
-/*
-div.news p:first-child {
-     padding-top: 15px !important;
+     margin-top: 10px;
 }
 
- 
-div.news p:nth-child(2n) {
-     padding-top: 15px !important;
-}
-*/
 div.news p:last-child {
      margin-bottom: 10px;
 }
@@ -544,11 +533,11 @@ div.main li b{
      font-size: 9.5pt;
 }
 
-div.messages span.error {
+div.error {
      color: #d00000;
 }
 
-div.messages span.notice {
+div.notice {
      font-style: italic;
 }
 
@@ -566,9 +555,6 @@ h1 {
      min-width: 600px;
      line-height: 100%;
      color: #fff;
-/*     -moz-border-radius: 3px 3px 0 0;
-     -khtml-border-radius: 3px 3px 0 0;
-     border-radius: 3px 3px 0 0; */
 }
 
 h2 {
@@ -578,12 +564,8 @@ h2 {
      border-top: 1px solid #99f;
      border-left: 1px solid #99f;
      background: #000008;
-/*     font-variant: small-caps; */
      text-transform: uppercase; 
      letter-spacing: 0.07em;
-/*     -moz-border-radius: 0 3px 0 0;
-     -khtml-border-radius: 0 3px 0 0;
-     border-radius: 0 3px 0 0;*/
 }
 
 h3 {
@@ -596,9 +578,6 @@ h3 {
      margin-bottom: 10px;
      font-weight: bold !important;
      text-transform: uppercase; 
-/*     -moz-border-radius: 0 3px 0 0;
-     -khtml-border-radius: 0 3px 0 0;
-     border-radius: 0 3px 0 0;*/
 }
 
 h3 a {
@@ -772,7 +751,7 @@ input[type=text], input[type=password] select {
 }
 submit {
      margin: 3px 5px 3px 5px;
-     padding 2px 0;
+     padding: 2px 0;
      font: 8pt/140% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
 }
 
@@ -787,13 +766,13 @@ p {
 }
 
 .langbox {
-     margin: 17px 0px 0px 5px;
+     margin: 4px 0px 0px 5px;
      color: #eef;
      font-size: 7pt;
      width: 240px;
      text-align: center;
      float: right;
-     valign: middle;
+     vertical-align: middle;
 }
 
 .langbox img {
@@ -940,7 +919,7 @@ code {
      text-align: left;
      font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
      color: #0d0;
-     padding: 0 2px;
+/*     padding: 0 2px;*/
 }
 
 div.footnote {
diff --git a/installer/resources/themes/console/midnight/ieshim.css b/installer/resources/themes/console/midnight/ieshim.css
index aa9f29f9fe7d6e8a1a222a630342a45e32391eab..55c8c8f17d1b4f56e2be506b576146e7e18cac88 100644
--- a/installer/resources/themes/console/midnight/ieshim.css
+++ b/installer/resources/themes/console/midnight/ieshim.css
@@ -195,7 +195,7 @@ div.warning {
 }
 
 .langbox {
-     margin: 22px -20px 0px 5px;
+     margin: 9px -20px 0px 5px;
 }
 
 td {
@@ -224,4 +224,4 @@ div.graphspanel img {
 
 div.graphspanel hr {
      margin: 20px 0;
-}
\ No newline at end of file
+}
diff --git a/installer/resources/uninstall_i2p_service_winnt.bat b/installer/resources/uninstall_i2p_service_winnt.bat
index e36af92a19b3fe2d03d8c2877887af95b465268b..6dfee7474815de499fc3e9c3f98b286618a38542 100644
--- a/installer/resources/uninstall_i2p_service_winnt.bat
+++ b/installer/resources/uninstall_i2p_service_winnt.bat
@@ -31,5 +31,6 @@ rem
 :startup
 "%_WRAPPER_EXE%" -r %_WRAPPER_CONF%
 if not errorlevel 1 goto :eof
+if "%2"=="--nopause" goto :eof
 pause
 
diff --git a/router/doc/net.png b/router/doc/net.png
deleted file mode 100644
index 6eac3784245e13c794795634b797ec2ea0a2eab1..0000000000000000000000000000000000000000
Binary files a/router/doc/net.png and /dev/null differ
diff --git a/router/doc/techintro.html b/router/doc/techintro.html
deleted file mode 100644
index 1574f5fa29186fa1b7946b86c1b96f10fd4fbc20..0000000000000000000000000000000000000000
--- a/router/doc/techintro.html
+++ /dev/null
@@ -1,994 +0,0 @@
-<html>
-<head>
- <title>Introducing I2P - a scalable framework for anonymous communication</title>
-<style>
-p { font-size: 10; text-align: left; font-family: sans-serif }
-h1 { font-size: 12; font-family: sans-serif }
-h2 { font-size: 10; font-family: sans-serif }
-h3 { font-size: 10; font-family: sans-serif }
-blockquote { font-size: 10; font-family: monospace, sans-serif }
-pre { font-size: 10; font-family: sans-serif }
-.title { font-size: 14; font-family: sans-serif }
-.subtitle { font-size: 12; font-family: sans-serif }
-</style>
-</head>
-<body>
-
-<center>
-<b class="title">Introducing I2P</b><br />
-<span class="subtitle">a scalable framework for anonymous communication</span><br />
-<i style="font-size: 8">$Id: techintro.html,v 1.8.2.1 2006/02/13 07:13:35 jrandom Exp $</i>
-<br />
-<br />
-
-<table border="0" width="50%">
-<tr><td valign="top" align="left">
-<pre>
-* <a href="#intro">Introduction</a>
-* <a href="#op">Operation</a>
-  * <a href="#op.overview">Overview</a>
-  * <a href="#op.tunnels">Tunnels</a>
-  * <a href="#op.netdb">Network Database</a>
-  * <a href="#op.transport">Transport protocols</a>
-  * <a href="#op.crypto">Cryptography</a>
-</pre>
-</td>
-<td valign="top" align="left">
-<pre>
-* <a href="#future">Future</a>
-  * <a href="#future.restricted">Restricted routes</a>
-  * <a href="#future.variablelatency">Variable latency</a>
-  * <a href="#future.open">Open questions</a>
-</pre>
-</td>
-<td valign="top" align="left">
-<pre>
-* <a href="#similar">Similar systems</a>
-  * <a href="#similar.tor">Tor</a>
-  * <a href="#similar.freenet">Freenet</a>
-* <a href="#app">Appendix A: Application layer</a>
-</pre>
-</td>
-</tr></table>
-</center>
-
-<hr />
-
-<h1 id="intro">Introduction</h1>
-<p>
-I2P is a scalable, self organizing, resilient packet switched anonymous network layer, 
-upon which any number of different anonymity or security conscious applications
-can operate.  Each of these applications may make their own anonymity, latency, and
-throughput tradeoffs without worrying about the proper implementation of a free
-route mixnet, allowing them to blend their activity with the larger anonymity set of
-users already running on top of I2P.  Applications available already provide the full
-range of typical Internet activities - anonymous web browsing, anonymous web hosting,
-anonymous blogging and content syndication (with <a href="#app.syndie">Syndie</a>),
-anonymous chat (via IRC or Jabber), anonymous swarming file transfers (with <a
-href="#app.i2pbt">i2p-bt</a>, <a href="#app.i2psnark">I2PSnark</a>, and 
-<a href="#app.azneti2p">Azureus</a>), anonymous file sharing (with
-<a href="#app.i2phex">I2Phex</a>), anonymous email (with <a href="#app.i2pmail">I2Pmail</a>
-and <a href="#app.i2pmail">susimail</a>), anonymous newsgroups, as well as several
-other applications under development.  Unlike web sites hosted within content
-distribution networks like <a href="#similar.freenet">Freenet</a> or
-<a href="http://www.ovmj.org/GNUnet/">GNUnet</a>, the services hosted on I2P are fully
-interactive - there are traditional web-style search engines, bulletin boards, blogs
-you can comment on, database driven sites, and bridges to query static systems like
-Freenet without needing to install it locally.
-</p>
-
-<p>
-With all of these anonymity enabled applications, I2P takes on the role of the message
-oriented middleware - applications say that they want to send some data to a cryptographic
-identifier (a "destination") and I2P takes care of making sure it gets there securely
-and anonymously.  I2P also bundles a simple <a href="#app.streaming">streaming</a> library
-to allow I2P's anonymous best-effort messages to transfer as reliable, in-order streams,
-transparently offering a TCP based congestion control algorithm tuned for the high
-bandwidth delay product of the network.  While there have been several simple SOCKS
-proxies available to tie existing applications into the network, their value has been
-limited as nearly every application routinely exposes what, in an anonymous context,
-is sensitive information.  The only safe way to go is to fully audit an application to
-ensure proper operation, and to assist in that we provide a series of APIs in various
-languages which can be used to make the most out of the network.
-</p>
-
-<!-- commented out because "The details [...] are " *NOT* " given later" -->
-<!--
-<p>
-The scope of I2P's anonymity protections varies upon the applications running on
-top of them, as well as the choices that each user makes.  The aim is to provide
-the options necessary so that a sufficient level of anonymity can be achieved while
-exposing the functionality that people facing up to state level adversaries require.
-At the same time, those facing less powerful adversaries are able to improve their 
-throughput and latency while reducing the resources required to provide the necessary
-level of cover.  The details of the techniques available for facing adversaries who
-are internal or external, passive or active, local, national, or global, are given
-later.
-</p>
--->
-
-<p>
-I2P is not a research project - academic, commercial, or governmental, but is instead
-an engineering effort aimed at doing whatever is necessary to provide a sufficient
-level of anonymity to those who need it.  It has been in active development since
-early 2003 with one full time developer and a dedicated group of part time contributors
-from all over the world.  All of the work done on I2P is open source and 
-freely available on the <a href="http://www.i2p.net/">website</a>, with the majority
-of the code released outright into the public domain, though making use of a few 
-cryptographic routines under BSD-style licenses.  The people working on I2P do not
-control what people release client applications under, and there are several GPL'ed
-applications available (<a href="#app.i2ptunnel">I2PTunnel</a>, 
-<a href="#app.i2pmail">susimail</a>, <a href="#app.i2psnark">I2PSnark</a>, <a href="#app.azneti2p">Azureus</a>, 
-<a href="#app.i2phex">I2Phex</a>).  <a href="http://www.i2p.net/halloffame">Funding</a>
-for I2P comes entirely from donations, and does not receive any tax breaks in any
-jurisdiction at this time, as many of the developers are themselves anonymous.
-</p>
-
-<h1 id="op">Operation</h1>
-<h2 id="op.overview">Overview</h2>
-
-<p>
-To understand I2P's operation, it is essential to understand a few key concepts.
-First, I2P makes a strict separation between the software participating
-in the network (a "router") and the anonymous endpoints ("destinations") associated
-with individual applications.  The fact that someone is running I2P is not usually
-a secret.  What is hidden is information on what the user is doing, if anything at
-all, as well as what router a particular destination is connected to.  End users 
-will typically have several local destinations on their router - for instance, one 
-proxying in to IRC servers, another supporting the user's anonymous webserver ("eepsite"),
-another for an I2Phex instance, another for torrents, etc.
-</p>
-
-<p>
-Another critical concept to understand is the "tunnel" - a directed path through
-an explicitly selected set of routers, making use of layered encryption so that
-the messages sent in the tunnel's "gateway" appear entirely random at each hop 
-along the path until it reaches the tunnel's "endpoint".  These unidirectional
-tunnels can be seen as either "inbound" tunnels or "outbound" tunnels, referring
-to whether they are bringing messages to the tunnel's creator or away from them,
-respectively.  The gateway of an inbound tunnel can receive messages from any
-peer and will forward them down through the tunnel until it reaches the (anonymous)
-endpoint (the creator).  On the other hand, the gateway of an outbound tunnel is
-the tunnel's creator, and messages sent through that tunnel are encoded so that
-when they reach the outbound tunnel's endpoint, that router has the instructions
-necessary to forward the message on to the appropriate location.
-</p>
-
-<p>
-A third critical concept to understand is I2P's "network database" (or "netDb")
-- a pair of algorithms used to share network metadata.  The two types of metadata
-carried are "routerInfo" and "leaseSets" - the routerInfo gives routers the data
-necessary for contacting a particular router (their public keys, transport
-addresses, etc), while the leaseSet gives routers the information necessary for
-contacting a particular destination.  Within each leaseSet, there are any number
-of "leases", each of which specifies the gateway for one of that destination's
-inbound tunnels as well as when that tunnel will expire.  The leaseSet also
-contains a pair of public keys which can be used for layered garlic encryption.
-</p>
-
-<!--
-<p>
-I2P's operation can be understood by putting those three concepts together:
-</p>
-
-<p><img src="net.png"></p>
-!-->
-
-<p>
-When Alice wants to send a message to Bob, she first does a lookup in the 
-netDb to find Bob's leaseSet, giving her his current inbound tunnel gateways.
-She then picks one of her outbound tunnels and sends the message
-down it with instructions for the outbound tunnel's endpoint to forward the 
-message on to one of Bob's inbound tunnel gateways.  When the outbound 
-tunnel endpoint receives those instructions, it forwards the message as 
-requested, and when Bob's inbound tunnel gateway receives it, it is 
-forwarded down the tunnel to Bob's router.  If Alice wants Bob to be able 
-to reply to the message, she needs to transmit her own destination explicitly 
-as part of the message itself (taken care of transparently in the 
-<a href="#app.streaming">streaming</a> library).  Alice may also cut down on 
-the response time by bundling her most recent leaseSet with the message so 
-that Bob doesn't need to do a netDb lookup for it when he wants to reply, but this 
-is optional.
-</p>
-
-<p>
-While the tunnels themselves have layered encryption to prevent unauthorized
-disclosure to peers inside the network (as the transport layer itself does to
-prevent unauthorized disclosure to peers outside the network), it is necessary
-to add an additional end to end layer of encryption to hide the message from the 
-outbound tunnel endpoint and the inbound tunnel gateway.  This
-"<a href="#op.garlic">garlic encryption</a>" lets Alice's router wrap up multiple
-messages into a single "garlic message", encrypted to a particular public key
-so that intermediary peers cannot determine either how many messages are within
-the garlic, what those messages say, or where those individual cloves are
-destined.  For typical end to end communication between Alice and Bob, the
-garlic will be encrypted to the public key published in Bob's leaseSet,
-allowing the message to be encrypted without giving out the public key to Bob's
-own router.
-</p>
-
-<p>
-Another important fact to keep in mind is that I2P is entirely message based
-and that some messages may be lost along the way.  Applications using I2P
-can use the message oriented interfaces and take care of their own congestion
-control and reliability needs, but most would be best served by reusing the
-provided <a href="#app.streaming">streaming</a> library to view I2P as a streams
-based network.
-</p>
-
-<h2 id="op.tunnels">Tunnels</h2>
-
-<p>
-Both inbound and outbound tunnels work along similar principles - the tunnel
-gateway accumulates a number of tunnel messages, eventually preprocessing them
-into something for tunnel delivery.  Next, the gateway encrypts that preprocessed
-data and forwards it to the first hop.  That peer and subsequent tunnel
-participants add on a layer of encryption after verifying that it isn't a
-duplicate before forward it on to the next peer. Eventually, the 
-message arrives at the endpoint where the messages are split out again and
-forwarded on as requested.  The difference arises in what
-the tunnel's creator does - for inbound tunnels, the creator is the endpoint
-and they simply decrypt all of the layers added, while for outbound tunnels,
-the creator is the gateway and they pre-decrypt all of the layers so that after
-all of the layers of per-hop encryption are added, the message arrives in the
-clear at the tunnel endpoint.
-</p>
-
-<p>
-The choice of specific peers to pass on messages as well as their particular
-ordering is important to understanding both I2P's anonymity and performance 
-characteristics.  While the network database (below) has its own criteria for
-picking what peers to query and store entries on, tunnels may use any peers in
-the network in any order (and even any number of times) in a single tunnel.  If
-perfect latency and capacity data were globally known, selection and ordering 
-would be driven by the particular needs of the client in tandem with their threat
-model.  Unfortunately, latency and capacity data is not trivial to gather
-anonymously, and depending upon untrusted peers to provide this information has
-its own serious anonymity implications.
-</p>
-
-<p>
-From an anonymity perspective, the simplest technique would be to pick peers
-randomly from the entire network, order them randomly, and use those peers
-in that order for all eternity.  From a performance perspective, the simplest
-technique would be to pick the fastest peers with the necessary spare capacity,
-spreading the load across different peers to handle transparent failover, and
-to rebuild the tunnel whenever capacity information changes.  While the former
-is both brittle and inefficient, the later requires inaccessible information
-and offers insufficient anonymity.  I2P is instead working on offering a range
-of peer selection strategies, coupled with anonymity aware measurement code to
-organize the peers by their profiles.
-</p>
-
-<p>
-As a base, I2P is constantly profiling the peers with which it interacts with
-by measuring their indirect behavior - for instance, when a peer responds to
-a netDb lookup in 1.3 seconds, that round trip latency is recorded in the 
-profiles for all of the routers involved in the two tunnels (inbound and 
-outbound) through which the request and response passed, as well as the queried
-peer's profile.  Direct measurement, such as transport layer latency or
-congestion, is not used as part of the profile, as it can be manipulated and 
-associated with the measuring router, exposing them to trivial attacks.  While
-gathering these profiles, a series of calculations are run on each to summarize
-its performance - its latency, capacity to handle lots of activity, whether they
-are currently overloaded, and how well integrated into the network they seem to
-be.  These calculations are then compared for active peers to organize the routers
-into four tiers - fast and high capacity, high capacity, not failing, and failing.
-The thresholds for those tiers are determined dynamically, and while they
-currently use fairly simple algorithms, alternatives exist.
-</p>
-
-<p>
-Using this profile data, the simplest reasonable peer selection strategy is to
-pick peers randomly from the top tier (fast and high capacity), and this is
-currently deployed for client tunnels.  Exploratory tunnels (used for netDb
-and tunnel management) pick peers randomly from the not failing tier (which 
-includes routers in 'better' tiers as well), allowing the peer to sample
-routers more widely, in effect optimizing the peer selection through randomized
-hill climbing.  These strategies alone do however leak information regarding the
-peers in the router's tip tier through predecessor and netDb harvesting attacks.  
-In turn, several alternatives exist which, while not balancing the load as evenly,
-will address the attacks mounted by particular classes of adversaries.
-</p>
-
-<p>
-By picking a random key and ordering the peers according to their XOR distance
-from it, the information leaked is reduced in predecessor and harvesting attacks
-according to the peers' failure rate and the tier's churn.  Another simple strategy
-for dealing with netDb harvesting attacks is to simply fix the inbound tunnel
-gateway(s) yet randomize the peers further on in the tunnels.  To deal with 
-predecessor attacks for adversaries which the client contacts, the outbound tunnel
-endpoints would also remain fixed.  The selection of which peer to fix on the most
-exposed point would of course need to have a limit to the duration, as all peers
-fail eventually, so it could either be reactively adjusted or proactively avoided
-to mimic a measured mean time between failures of other routers.  These two strategies
-can in turn be combined, using a fixed exposed peer and an XOR based ordering within
-the tunnels themselves.  A more rigid strategy would fix the exact peers and ordering
-of a potential tunnel, only using individual peers if all of them agree to participate
-in the same way each time.  This varies from the XOR based ordering in that the 
-predecessor and successor of each peer is always the same, while the XOR only makes 
-sure their order doesn't change.
-</p>
-
-<p>
-As mentioned before, I2P currently (release 0.6.1.1) includes the tiered random
-strategy above, but the others are planned for the 0.6.2 release.  A more detailed
-discussion of the mechanics involved in tunnel operation, management, and peer
-selection can be found in the 
-<a href="http://dev.i2p.net/cgi-bin/cvsweb.cgi/i2p/router/doc/tunnel-alt.html?rev=HEAD">tunnel spec</a>.
-</p>
-
-<h2 id="op.netdb">Network Database</h2>
-
-<p>
-As mentioned earlier, I2P's netDb works to share the network's metadata.  Two
-algorithms are used to accomplish this - primarily, a small set of routers are
-designated as "floodfill peers", while the rest of the routers participate in
-the <a href="http://en.wikipedia.org/wiki/Kademlia">Kademlia </a> derived
-distributed hash table for redundancy.  To integrate the two algorithms, each
-router always uses the Kademlia style store and fetch, but acts as if the
-floodfill peers are 'closest' to the key in question.  Additionally, when a
-peer publishes a key into the netDb, after a brief delay they query another
-random floodfill peer, asking them for the key, and if that peer does not have
-it, they move on and republish the key again.  Behind the scenes, when one of
-the floodfill peers receives a new valid key, they republish it to the other
-floodfill peers who then cache it locally.
-</p>
-
-<p>
-Each piece of data in the netDb is self authenticating - signed by the
-appropriate party and verified by anyone who uses or stores it.  In addition,
-the data has liveliness information within it, allowing irrelevant entries to be
-dropped, newer entries to replace older ones, and, for the paranoid, protection
-against certain classes of attack.  This is also why I2P bundles the necessary
-code for maintaining the correct time, occasionally querying some SNTP servers
-(the <a href="http://www.pool.ntp.org/">pool.ntp.org</a> round robin by default)
-and detecting skew between routers at the transport layer.
-</p>
-
-<p>
-The routerInfo structure itself contains all of the information that one router
-needs to know to securely send messages to another router.  This includes their
-identity (made up of a 2048bit ElGamal public key, a 1024bit DSA public key, and
-a certificate), the transport addresses which they can be reached on, such as
-an IP address and port, when the structure was published, and a set of arbitrary
-uninterpreted text options.  In addition, there is a signature against all of
-that data as generated by the included DSA public key.  The key for this routerInfo
-structure in the netDb is the SHA256 hash of the router's identity.  The options
-published are often filled with information helpful in debugging I2P's operation,
-but when I2P reaches the 1.0 release, the options will be disabled and kept blank.
-</p>
-
-<p>
-The leaseSet structure is similar, in that it includes the I2P destination
-(comprised of a 2048bit ElGamal public key, a 1024bit DSA public key, and a
-certificate), a list of "leases", and a pair of public keys for garlic encrypting
-messages to the destination.  Each of the leases specify one of the destination's
-inbound tunnel gateways by including the SHA256 of the gateway's identity, a 4
-byte tunnel id on that gateway, and when that tunnel will expire.  The key for
-the leaseSet in the netDb is the SHA256 of the destination itself.
-</p>
-
-<p>
-As the router currently automatically bundles the leaseSet for the sender inside
-a garlic message to the recipient, the leaseSet for destinations which will not
-receive unsolicited messages do not need to be published in the netDb at all.  If
-the destination itself is sensitive, the leaseSet could instead be transmitted 
-through other means without ever going into the netDb.
-</p>
-
-<p>
-Bootstrapping the netDb itself is simple - once a router has at least one routerInfo
-of a reachable peer, they query that router for references to other routers in the
-network with the Kademlia healing algorithm.  Each routerInfo reference is stored in
-an individual file in the router's netDb subdirectory, allowing people to easily
-share their references to bootstrap new users.
-</p>
-
-<p>
-Unlike traditional DHTs, the very act of conducting a search distributes the data
-as well, since rather passing Kademlia's standard IP+port pairs, references are given
-to the routers that the peer should query next (namely, the SHA256 of those routers'
-identities).  As such, iteratively searching for a particular destination's leaseSet
-or router's routerInfo will also provide you with the routerInfo of the peers along
-the way.  In addition, due to the time sensitivity of the data published, the information
-doesn't often need to migrate between peers - since a tunnel is only valid for 10
-minutes, the leaseSet can be dropped after that time has passed.  To take into 
-account Sybil attacks on the netDb, the Kademlia routing location used for any given
-key varies over time.  For instance, rather than storing a routerInfo on the peers
-closest to SHA256(routerInfo.identity), they are stored on the peers closest to 
-SHA256(routerInfo.identity + YYYYMMDD), requiring an adversary to remount the attack
-again daily so as to maintain their closeness to the current routing key.  As the
-very fact that a router is making a lookup for a given key may expose sensitive data
-(and the fact that a router is <i>publishing</i> a given key even more so), all netDb
-messages are transmitted through the router's exploratory tunnels.
-</p>
-
-<p>
-The netDb plays a very specific role in the I2P network, and the algorithms have 
-been tuned towards our needs.  This also means that it hasn't been tuned to address the
-needs we have yet to run into.  As the network grows, the primary floodfill algorithm
-will need to be refined to exploit the capacity available, or perhaps replaced with
-another technique for securely distributing the network metadata.
-</p>
-
-<h2 id="op.transport">Transport protocols</h2>
-
-<p>
-Communication between routers needs to provide confidentiality and integrity
-against external adversaries while authenticating that the router contacted
-is the one who should receive a given message.  The particulars of how routers
-communicate with other routers aren't critical - three separate protocols have
-been used at different points to provide those bare necessities.  To accommodate
-the need for high degree communication (as a number of routers will end up 
-speaking with many others), I2P moved from a TCP based transport
-to a UDP based one - "Secure Semireliable UDP", or "SSU".  As described in the
-<a href="http://dev.i2p.net/cgi-bin/cvsweb.cgi/i2p/router/doc/udp.html?rev=HEAD">SSU spec</a>:</p>
-
-<blockquote>
-The goal of this protocol is to provide secure, authenticated, 
-semireliable, and unordered message delivery, exposing only a minimal amount of 
-data easily discernible to third parties. It should support high degree 
-communication as well as TCP-friendly congestion control, and may include 
-PMTU detection. It should be capable of efficiently moving bulk data at rates 
-sufficient for home users. In addition, it should support techniques for 
-addressing network obstacles, like most NATs or firewalls.
-</blockquote>
-
-<h2 id="op.crypto">Cryptography</h2>
-
-<p>
-A bare minimum set of cryptographic primitives are combined together to provide I2P's
-layered defenses against a variety of adversaries.  At the lowest level, interrouter
-communication is protected by the transport layer security - SSU
-encrypts each packet with AES256/CBC with both an explicit IV and MAC (HMAC-MD5-128)
-after agreeing upon an ephemeral session key through a 2048bit Diffie-Hellman exchange,
-station-to-station authentication with the other router's DSA key, plus each network
-message has their own hash for local integrity checking. 
-<a href="#op.tunnels">Tunnel</a> messages passed over the transports have their own
-layered AES256/CBC encryption with an explicit IV and verified at the tunnel endpoint
-with an additional SHA256 hash.  Various other messages are passed along inside
-"garlic messages", which are encrypted with ElGamal/AES+SessionTags (explained below).  
-</p>
-
-<h3 id="op.garlic">Garlic messages</h3>
-
-<p>
-Garlic messages are an extension of "onion" layered encryption, allowing the contents
-of a single message to contain multiple "cloves" - fully formed messages alongside
-their own instructions for delivery.  Messages are wrapped into a garlic message whenever
-the message would otherwise be passing in cleartext through a peer who should not have
-access to the information - for instance, when a router wants to ask another router to
-participate in a tunnel, they wrap the request inside a garlic, encrypt that garlic to
-the receiving router's 2048bit ElGamal public key, and forward it through a tunnel. 
-Another example is when a client wants to send a message to a destination - the sender's
-router will wrap up that data message (alongside some other messages) into a garlic,
-encrypt that garlic to the 2048bit ElGamal public key published in the recipient's
-leaseSet, and forward it through the appropriate tunnels.
-</p>
-
-<p>
-The "instructions" attached to each clove inside the encryption layer includes the
-ability to request that the clove be forwarded locally, to a remote router, or to a 
-remote tunnel on a remote router.  There are fields in those instructions allowing a
-peer to request that the delivery be delayed until a certain time or condition has
-been met, though they won't be honored until the 
-<a href="#future.variablelatency">nontrivial delays</a> are deployed.  It is possible to
-explicitly route garlic messages any number of hops without building tunnels, or even
-to reroute tunnel messages by wrapping them in garlic messages and forwarding them a
-number of hops prior to delivering them to the next hop in the tunnel, but those 
-techniques are not currently used in the existing implementation.
-</p>
-
-<h3 id="op.sessiontags">Session tags</h3>
-
-<p>
-As an unreliable, unordered, message based system, I2P uses a simple combination of
-asymmetric and symmetric encryption algorithms to provide data confidentiality and
-integrity to garlic messages.  As a whole, the combination is referred to as
-ElGamal/AES+SessionTags, but that is an excessively verbose way to describe the simple
-use of 2048bit ElGamal, AES256, SHA256, and 32 byte nonces.
-</p>
-
-<p>
-The first time a router wants to encrypt a garlic message to another router, they encrypt 
-the keying material for an AES256 session key with ElGamal and append the AES256/CBC 
-encrypted payload after that encrypted ElGamal block.  In addition to the encrypted
-payload, the AES encrypted section contains the payload length, the SHA256 hash of the
-unencrypted payload, as well as a number of "session tags" - random 32 byte nonces.  The
-next time the sender wants to encrypt a garlic message to another router, rather than
-ElGamal encrypt a new session key they simply pick one of the previously delivered session
-tags and AES encrypt the payload like before, using the session key used with that
-session tag, prepended with the session tag itself.  When a router receives a garlic encrypted
-message, they check the first 32 bytes to see if it matches an available session tag - if
-it does, they simply AES decrypt the message, but if it does not, they ElGamal decrypt the
-first block.
-</p>
-
-<p>
-Each session tag can be used only once so as to prevent internal adversaries from unnecessarily
-correlating different messages as being between the same routers.  The sender of an 
-ElGamal/AES+SessionTag encrypted message chooses when and how many tags to deliver,
-prestocking the recipient with enough tags to cover a volley of messages.  Garlic messages 
-may detect the successful tag delivery by bundling a small additional message as a clove (a 
-"delivery status message") - when the garlic message arrives at the intended recipient and
-is decrypted successfully, this small delivery status message is one of the cloves exposed and 
-has instructions for the recipient to send the clove back to the original sender (through an
-inbound tunnel, of course).  When the original sender receives this delivery status message,
-they know that the session tags bundled in the garlic message were successfully delivered.
-</p>
-
-<p>
-Session tags themselves have a very short lifetime, after which they are discarded
-if not used.  In addition, the quantity stored for each key is limited, as are the
-number of keys themselves - if too many arrive, either new or old messages may be 
-dropped.  The sender keeps track whether messages using session tags are getting 
-through, and if there isn't sufficient communication it may drop the ones previously
-assumed to be properly delivered, reverting back to the full expensive ElGamal 
-encryption.
-</p>
-
-<p>
-One alternative is to transmit only a single session tag, and from that, seed a 
-deterministic PRNG for determining what tags to use or expect.  By keeping this
-PRNG roughly synchronized between the sender and recipient (the recipient precomputes a
-window of the next e.g. 50 tags), the overhead of periodically bundling a large number
-of tags is removed, allowing more options in the space/time tradeoff, and perhaps
-reducing the number of ElGamal encryptions necessary.  However, it would depend
-upon the strength of the PRNG to provide the necessary cover against internal
-adversaries, though perhaps by limiting the amount of times each PRNG is used, any
-weaknesses can be minimized.  At the moment, there are no immediate plans to move 
-towards these synchronized PRNGs.
-</p>
-
-<h1 id="future">Future</h1>
-<p>
-While I2P is currently functional and sufficient for many scenarios, there are
-several areas which require further improvement to meet the needs of those
-facing more powerful adversaries as well as substantial user experience optimization.
-</p>
-
-<h2 id="future.restricted">Restricted route operation</h2>
-
-<p>
-I2P is an overlay network designed to be run on top of a functional packet switched
-network, exploiting the end to end principle to offer anonymity and security.  
-While the Internet no longer fully embraces the end to end principle, I2P does require a
-substantial portion of the network to be reachable - there may be a number of peers
-along the edges running using restricted routes, but I2P does not include an
-appropriate routing algorithm for the degenerate case where most peers are 
-unreachable.  It would, however work on top of a network employing such an
-algorithm.
-</p>
-
-<p>
-Restricted route operation, where there are limits to what peers are
-reachable directly, has several different functional and anonymity
-implications, dependent upon how the restricted routes are handled.  At the most
-basic level, restricted routes exist when a peer is behind a NAT or firewall which
-does not allow inbound connections.  This was largely addressed in I2P 0.6.0.6 by
-integrating distributed hole punching into the transport layer, allowing people
-behind most NATs and firewalls to receive unsolicited connections without any
-configuration.  However, this does not limit the exposure of the peer's IP address to
-routers inside the network, as they can simply get introduced to the peer through
-the published introducer.
-</p>
-
-<p>
-Beyond the functional handling of restricted routes, there are two levels of 
-restricted operation that can be used to limit the exposure of one's IP address -
-using router-specific tunnels for communication, and offering 'client routers'.  For
-the former, routers can either build a new pool of tunnels or reuse their exploratory
-pool, publishing the inbound gateways to some of them as part of their routerInfo in
-place of their transport addresses.  When a peer wants to get in touch with them,
-they see those tunnel gateways in the netDb and simply send the relevant message to
-them through one of the published tunnels.  If the peer behind the restricted route
-wants to reply, it may do so either directly (if they are willing to expose their IP
-to the peer) or indirectly through their outbound tunnels.  When the routers that the
-peer has direct connections to want to reach it (to forward tunnel messages, for
-instance), they simply prioritize their direct connection over the published tunnel
-gateway.  The concept of 'client routers' simply extends the restricted route by not
-publishing any router addresses.  Such a router would not even need to publish their
-routerInfo in the netDb, merely providing their self signed routerInfo to the peers
-that it contacts (necessary to pass the router's public keys).  Both levels of
-restricted route operation are planned for I2P 2.0.
-</p>
-
-<p>
-There are tradeoffs for those behind restricted routes, as they would likely
-participate in other people's tunnels less frequently, and the routers which
-they are connected to would be able to infer traffic patterns that would not
-otherwise be exposed.  On the other hand, if the cost of that exposure is less
-than the cost of an IP being made available, it may be worthwhile.  This, of course,
-assumes that the peers that the router behind a restricted route contacts are not
-hostile - either the network is large enough that the probability of using a hostile
-peer to get connected is small enough, or trusted (and perhaps temporary) peers are
-used instead.
-</p>
-
-<h2 id="future.variablelatency">Variable latency</h2>
-
-<p>
-Even though the bulk of I2P's initial efforts have been on low latency communication,
-it was designed with variable latency services in mind from the beginning.  At the
-most basic level, applications running on top of I2P can offer the anonymity of 
-medium and high latency communication while still blending their traffic patterns
-in with low latency traffic.  Internally though, I2P can offer its own medium and
-high latency communication through the garlic encryption - specifying that the 
-message should be sent after a certain delay, at a certain time, after a certain
-number of messages have passed, or another mix strategy.  With the layered encryption,
-only the router that the clove exposed the delay request would know that the message
-requires high latency, allowing the traffic to blend in further with the low latency
-traffic.  Once the transmission precondition is met, the router holding on to the
-clove (which itself would likely be a garlic message) simply forwards it as 
-requested - to a router, to a tunnel, or, most likely, to a remote client destination.
-</p>
-
-<p>
-There are a substantial number of ways to exploit this capacity for high latency
-comm in I2P, but for the moment, doing so has been scheduled for the I2P 3.0 release.
-In the meantime, those requiring the anonymity that high latency comm can offer should
-look towards the application layer to provide it.
-</p>
-
-<h2 id="future.open">Open questions</h2>
-<pre>
-How to get rid of the timing constraint?
-Can we deal with the sessionTags more efficiently?
-What, if any, batching/mixing strategies should be made available on the tunnels?
-What other tunnel peer selection and ordering strategies should be available?
-</pre>
-
-<h1 id="similar">Similar systems</h1>
-<p>
-I2P's architecture builds on the concepts of message oriented middleware, the topology
-of DHTs, the anonymity and cryptography of free route mixnets, and the adaptability of
-packet switched networking.  The value comes not from novel concepts of algorithms
-though, but from careful engineering combining the research results of existing 
-systems and papers.  While there are a few similar efforts worth reviewing, both for 
-technical and functional comparisons, two in particular are pulled out here - Tor
-and Freenet.
-</p>
-
-<h2 id="similar.tor">Tor</h2>
-<p><i><a href="http://tor.eff.org/">website</a></i></p>
-
-<p>
-At first glance, Tor and I2P have many functional and anonymity related similarities.
-While I2P's development began before we were aware of the early stage efforts on Tor,
-many of the lessons of the original onion routing and ZKS efforts were integrated into
-I2P's design.  Rather than building an essentially trusted, centralized system with
-directory servers, I2P has a self organizing network database with each peer taking on
-the responsibility of profiling other routers to determine how best to exploit available
-resources.  Another key difference is that while both I2P and Tor use layered and
-ordered paths (tunnels and circuits/streams), I2P is fundamentally a packet switched
-network, while Tor is fundamentally a circuit switched one, allowing I2P to
-transparently route around congestion or other network failures, operate redundant
-pathways, and load balance the data across available resources.  While Tor offers
-the useful outproxy functionality by offering integrated outproxy discovery and
-selection, I2P leaves such application layer decisions up to applications running on
-top of I2P - in fact, I2P has even externalized the TCP-like streaming library itself
-to the application layer, allowing developers to experiment with different strategies,
-exploiting their domain specific knowledge to offer better performance.
-</p>
-
-<p>
-From an anonymity perspective, there is much similarity when the core networks are
-compared.  However, there are a few key differences.  When dealing with an internal
-adversary or most external adversaries, I2P's simplex tunnels expose half as much
-traffic data than would be exposed with Tor's duplex circuits by simply looking at
-the flows themselves - an HTTP request and response would follow the same path in
-Tor, while in I2P the packets making up the request would go out through one or 
-more outbound tunnels and the packets making up the response would come back through
-one or more different inbound tunnels.  While I2P's peer selection and ordering 
-strategies should sufficiently address predecessor attacks, I2P can trivially 
-mimic Tor's non-redundant duplex tunnels by simply building an inbound and
-outbound tunnel along the same routers.</p>
-
-<p>
-Another anonymity issue comes up in Tor's use of telescopic tunnel creation, as
-simple packet counting and timing measurements as the cells in a circuit pass
-through an adversary's node exposes statistical information regarding where the 
-adversary is within the circuit.  I2P's unidirectional tunnel creation with a
-single message so that this data is not exposed.  Protecting the position in a
-tunnel is important, as an adversary would otherwise be able to mounting a
-series of powerful predecessor, intersection, and traffic confirmation attacks.
-</p>
-
-<p>
-Tor's support for a second tier of "onion proxies" does offer a nontrivial degree
-of anonymity while requiring a low cost of entry, while I2P will not offer this 
-topology until <a href="#future.restricted">2.0</a>.
-</p>
-
-<p>
-On the whole, Tor and I2P complement each other in their focus - Tor works towards
-offering high speed anonymous Internet outproxying, while I2P works towards offering
-a decentralized resilient network in itself.  In theory, both can be used to achieve
-both purposes, but given limited development resources, they both have their
-strengths and weaknesses.  The I2P developers have considered the steps necessary to
-modify Tor to take advantage of I2P's design, but concerns of Tor's viability under
-resource scarcity suggest that I2P's packet switching architecture will be able to
-exploit scarce resources more effectively.
-</p>
-
-<h2 id="similar.freenet">Freenet</h2>
-<p><i><a href="http://www.freenetproject.org/">website</a></i></p>
-
-<p>
-Freenet played a large part in the initial stages of I2P's design - giving proof to
-the viability of a vibrant pseudonymous community completely contained within the
-network, demonstrating that the dangers inherent in outproxies could be avoided.
-The first seed of I2P began as a replacement communication layer for Freenet, 
-attempting to factor out the complexities of a scalable, anonymous and secure point
-to point communication from the complexities of a censorship resistant distributed
-data store.  Over time however, some of the anonymity and scalability issues
-inherent in Freenet's algorithms made it clear that I2P's focus should stay strictly
-on providing a generic anonymous communication layer, rather than as a component of
-Freenet.  Over the years, the Freenet developers have come to see the weaknesses
-in the older design, prompting them to suggest that they will require a "premix" 
-layer to offer substantial anonymity.  In other words, Freenet needs to run on top
-of a mixnet such as I2P or Tor, with "client nodes" requesting and publishing data
-through the mixnet to the "server nodes" which then fetch and store the data according
-to Freenet's heuristic distributed data storage algorithms.
-</p>
-
-<p>
-Freenet's functionality is very complementary to I2P's, as Freenet natively provides
-many of the tools for operating medium and high latency systems, while I2P natively
-provides the low latency mix network suitable for offering adequate anonymity.  The
-logic of separating the mixnet from the censorship resistant distributed data store
-still seems self evident from an engineering, anonymity, security, and resource
-allocation perspective, so hopefully the Freenet team will pursue efforts in that
-direction, if not simply reusing (or helping to improve, as necessary) existing
-mixnets like I2P or Tor.
-</p>
-
-<p>
-It is worth mentioning that there has recently been discussion and work by the
-Freenet developers on a "globally scalable darknet" using restricted routes between
-peers of various trust.  While insufficient information has been made publicly 
-available regarding how such a system would operate for a full review, from what
-has been said the anonymity and scalability claims seem highly dubious.  In
-particular, the appropriateness for use in hostile regimes against state level
-adversaries has been tremendously overstated, and any analysis on the implications
-of resource scarcity upon the scalability of the network has seemingly been avoided.
-Further questions regarding susceptibility to traffic analysis, trust, and other topics 
-do exist, but a more in-depth review of this "globally scalable darknet" will have
-to wait until the Freenet team makes more information available.
-</p>
-
-<h1 id="app">Appendix A: Application layer</h1>
-
-<p>
-I2P itself doesn't really do much - it simply sends messages to remote destinations 
-and receives messages targeting local destinations - most of the interesting work 
-goes on at the layers above it.  By itself, I2P could be seen as an anonymous and
-secure IP layer, and the bundled <a href="#app.streaming">streaming library</a> as
-an implementation of an anonymous and secure TCP layer on top of it.  Beyond that,
-<a href="#app.i2ptunnel">I2PTunnel</a> exposes a generic TCP proxying system for
-either getting into or out of the I2P network, plus a variety of network 
-applications provide further functionality for end users.
-</p>
-
-<h2 id="app.streaming">Streaming library</h2>
-
-<p>
-The streaming library has grown organically for I2P - first mihi implemented the
-"mini streaming library" as part of I2PTunnel, which was limited to a window
-size of 1 message (requiring an ACK before sending the next one), and then it was
-refactored out into a generic streaming interface (mirroring TCP sockets) and the
-full streaming implementation was deployed with a sliding window protocol and 
-optimizations to take into account the high bandwidth x delay product.  Individual
-streams may adjust the maximum packet size and other options, though the default
-of 4KB compressed seems a reasonable tradeoff between the bandwidth costs of 
-retransmitting lost messages and the latency of multiple messages.
-</p>
-
-<p>
-In addition, in consideration of the relatively high cost of subsequent messages, 
-the streaming library's protocol for scheduling and delivering messages has been optimized to
-allow individual messages passed to contain as much information as is available.
-For instance, a small HTTP transaction proxied through the streaming library can
-be completed in a single round trip - the first message bundles a SYN, FIN, and
-the small payload (an HTTP request typically fits) and the reply bundles the SYN,
-FIN, ACK, and the small payload (many HTTP responses fit).  While an additional
-ACK must be transmitted to tell the HTTP server that the SYN/FIN/ACK has been
-received, the local HTTP proxy can deliver the full response to the browser 
-immediately.  
-</p>
-
-<p>
-On the whole, however, the streaming library bears much resemblance to an 
-abstraction of TCP, with its sliding windows, congestion control algorithms
-(both slow start and congestion avoidance), and general packet behavior (ACK,
-SYN, FIN, RST, rto calculation, etc).  
-</p>
-
-<h2 id="app.naming">Naming library and addressbook</h2>
-<p><i>Developed by: mihi, Ragnarok</i></p>
-
-<p>
-Naming within I2P has been an oft-debated topic since the very beginning with
-advocates across the spectrum of possibilities.  However, given I2P's inherent
-demand for secure communication and decentralized operation, the traditional
-DNS-style naming system is clearly out, as are "majority rules" voting systems.
-Instead, I2P ships with a generic naming library and a base implementation 
-designed to work off a local name to destination mapping, as well as an optional
-add-on application called the "addressbook".  The addressbook is a web-of-trust
-driven secure, distributed, and human readable naming system, sacrificing only
-the call for all human readable names to be globally unique by mandating only
-local uniqueness.  While all messages in I2P are cryptographically addressed
-by their destination, different people can have local addressbook entries for
-"Alice" which refer to different destinations.  People can still discover new
-names by importing published addressbooks of peers specified in their web of trust,
-by adding in the entries provided through a third party, or (if some people organize
-a series of published addressbooks using a first come first serve registration
-system) people can choose to treat these addressbooks as name servers, emulating
-traditional DNS.
-</p>
-
-<p>
-I2P does not promote the use of DNS-like services though, as the damage done
-by hijacking a site can be tremendous - and insecure destinations have no
-value.  DNSsec itself still falls back on registrars and certificate authorities,
-while with I2P, requests sent to a destination cannot be intercepted or the reply
-spoofed, as they are encrypted to the destination's public keys, and a destination
-itself is just a pair of public keys and a certificate.  DNS-style systems on the
-other hand allow any of the name servers on the lookup path to mount simple denial
-of service and spoofing attacks.  Adding on a certificate authenticating the
-responses as signed by some centralized certificate authority would address many of
-the hostile nameserver issues but would leave open replay attacks as well as 
-hostile certificate authority attacks.
-</p>
-
-<p>
-Voting style naming is dangerous as well, especially given the effectiveness of
-Sybil attacks in anonymous systems - the attacker can simply create an arbitrarily
-high number of peers and "vote" with each to take over a given name.  Proof-of-work
-methods can be used to make identity non-free, but as the network grows the load
-required to contact everyone to conduct online voting is implausible, or if the
-full network is not queried, different sets of answers may be reachable.
-</p>
-
-<p>
-As with the Internet however, I2P is keeping the design and operation of a 
-naming system out of the (IP-like) communication layer.  The bundled naming library
-includes a simple service provider interface which alternate naming systems can
-plug into, allowing end users to drive what sort of naming tradeoffs they prefer.
-</p>
-
-<h2 id="app.syndie">Syndie</h2>
-
-<p>
-Syndie is a safe, anonymous blogging / content publication / content aggregation system.
-It lets you create information, share it with others, and read posts from those you're
-interested in, all while taking into consideration your needs for security and anonymity.
-Rather than building its own content distribution network, Syndie is designed to run on
-top of existing networks, syndicating content through eepsites, Tor hidden services,
-Freenet freesites, normal websites, usenet newgroups, email lists, RSS feeds, etc.  Data
-published with Syndie is done so as to offer pseudonymous authentication to anyone 
-reading or archiving it.
-</p>
-
-<h2 id="app.i2ptunnel">I2PTunnel</h2>
-<p><i>Developed by: mihi</i></p>
-
-<p>
-I2PTunnel is probably I2P's most popular and versatile client application, allowing
-generic proxying both into and out of the I2P network.  I2PTunnel can be viewed as
-four separate proxying applications - a "client" which receives inbound TCP connections
-and forwards them to a given I2P destination, an "httpclient" (aka "eepproxy") which 
-acts like an HTTP proxy and forwards the requests to the appropriate I2P destination 
-(after querying the naming service if necessary), a "server" which receives inbound I2P
-streaming connections on a destination and forwards them to a given TCP host+port,
-and an "httpserver" which extends the "server" by parsing the HTTP request and
-responses to allow safer operation.  There is an additional "socksclient" application,
-but its use is not encouraged for reasons previously mentioned.
-</p>
-
-<p>
-I2P itself is not an outproxy network - the anonymity and security concerns inherent
-in a mix net which forwards data into and out of the mix have kept I2P's design focused
-on providing an anonymous network which capable of meeting the user's needs without
-requiring external resources.  However, the I2PTunnel "httpclient" application offers
-a hook for outproxying - if the hostname requested doesn't end in ".i2p", it picks a
-random destination from a user-provided set of outproxies and forwards the request to
-them.  These destinations are simply I2PTunnel "server" instances run by volunteers 
-who have explicitly chosen to run outproxies - no one is an outproxy by default, and
-running an outproxy doesn't automatically tell other people to proxy through you.
-While outproxies do have inherent weaknesses, they offer a simple proof of concept for
-using I2P and provide some functionality under a threat model which may be sufficient
-for some users.
-</p>
-
-<p>
-I2PTunnel enables most of the applications in use.  An "httpserver" pointing at a
-webserver lets anyone run their own anonymous website (or "eepsite") - a webserver
-is bundled with I2P for this purpose, but any webserver can be used.  Anyone may 
-run a "client" pointing at one of the anonymously hosted IRC servers, each of which
-are running a "server" pointing at their local IRCd and communicating between IRCds
-over their own "client" tunnels.  End users also have "client" tunnels pointing at
-<a href="#app.i2pmail">I2Pmail's</a> POP3 and SMTP destinations (which in turn are 
-simply "server" instances pointing at POP3 and SMTP servers), as well as "client"
-tunnels pointing at I2P's CVS server, allowing anonymous development.  At times people have
-even run "client" proxies to access the "server" instances pointing at an NNTP server.
-</p>
-
-<h2 id="app.i2pbt">i2p-bt</h2>
-<p><i>Developed by: duck, et al</i></p>
-
-<p>
-i2p-bt is a port of the mainline python BitTorrent client to run both the tracker and
-peer communication over I2P.  Tracker requests are forwarded through the eepproxy to
-eepsites specified in the torrent file while tracker responses refer to peers by their
-destination explicitly, allowing i2p-bt to open up a 
-<a href="#app.streaming">streaming lib</a> connection to query them for blocks.
-</p>
-
-<p>
-In addition to i2p-bt, a port of bytemonsoon has been made to I2P, making a few
-modifications as necessary to strip any anonymity-compromising information from the
-application and to take into consideration the fact that IPs cannot be used for 
-identifying peers.  
-</p>
-
-<h2 id="app.i2psnark">I2PSnark</h2>
-<p><i>I2PSnark developed: jrandom, et al, ported from <a
-href="http://www.klomp.org/mark/">mjw</a>'s <a
-href="http://www.klomp.org/snark/">Snark</a> client</i></p>
-
-<p>
-Bundled with the I2P install, I2PSnark offers a simple anonymous bittorrent
-client with multitorrent capabilities, exposing all of the functionality through
-a plain HTML web interface.
-</p>
-
-<h2 id="app.azneti2p">Azureus/azneti2p</h2>
-<p><i>Developed by: parg, et al</i></p>
-
-<p>
-The developers of the <a href="http://azureus.sf.net/">Azureus</a> BitTorrent client
-have created an "azneti2p" plugin, allowing Azureus users to participate in anonymous
-swarms over I2P, or simply to access anonymously hosted trackers while contacting
-each peer directly.  In addition, Azureus' built in tracker lets people run their
-own anonymous trackers without running bytemonsoon (which has substantial prerequisites)
-or i2p-bt's tracker.  The plugin is currently (July 2005) fully functional, but is in early
-beta and has a fairly complicated configuration process, though it is hopefully going
-to be streamlined further.
-</p>
-
-<h2 id="app.i2phex">I2Phex</h2>
-<p><i>Developed by: sirup</i></p>
-
-<p>
-I2Phex is a fairly direct port of the Phex Gnutella filesharing client to run 
-entirely on top of I2P.  While it has disabled some of Phex's functionality,
-such as integration with Gnutella webcaches, the basic file sharing and chatting
-system is fully functional.
-</p>
-
-<h2 id="app.i2pmail">I2Pmail/susimail</h2>
-<p><i>Developed by: postman, susi23, mastiejaner</i></p>
-
-<p>
-I2Pmail is more a service than an application - postman offers both internal and
-external email with POP3 and SMTP service through I2PTunnel instances accessing a
-series of components developed with mastiejaner, allowing people to use their
-preferred mail clients to send and receive mail pseudonymously.  However, as most
-mail clients expose substantial identifying information, I2P bundles susi23's
-web based susimail client which has been built specifically with I2P's anonymity
-needs in mind. The I2Pmail/mail.i2p service offers transparent virus filtering as
-well as denial of service prevention with hashcash augmented quotas.
-In addition, each user has control of their batching strategy prior to delivery
-through the mail.i2p outproxies, which are separate from the mail.i2p SMTP and
-POP3 servers - both the outproxies and inproxies communicate with the mail.i2p
-SMTP and POP3 servers through I2P itself, so compromising those non-anonymous
-locations does not give access to the mail accounts or activity patterns of the
-user. At the moment the developers work on a decentralized mailsystem, called
-"v2mail". More information can be found on the eepsite 
-<a href="http://hq.postman.i2p/">hq.postman.i2p</a>.
-</p>
-
-</body>
-</html>
diff --git a/router/doc/tunnel-alt-creation.html b/router/doc/tunnel-alt-creation.html
deleted file mode 100644
index 0eb4a5d901c1e88f18786d9ea8981356d6d5d6d4..0000000000000000000000000000000000000000
--- a/router/doc/tunnel-alt-creation.html
+++ /dev/null
@@ -1,163 +0,0 @@
-<code>$Id: tunnel-alt-creation.html,v 1.1.2.1 2006/02/01 20:28:34 jrandom Exp $</code>
-<pre>
-1) <a href="#tunnelCreate.overview">Tunnel creation</a>
-1.1) <a href="#tunnelCreate.requestRecord">Tunnel creation request record</a>
-1.2) <a href="#tunnelCreate.hopProcessing">Hop processing</a>
-1.3) <a href="#tunnelCreate.replyRecord">Tunnel creation reply record</a>
-1.4) <a href="#tunnelCreate.requestPreparation">Request preparation</a>
-1.5) <a href="#tunnelCreate.requestDelivery">Request delivery</a>
-1.6) <a href="#tunnelCreate.endpointHandling">Endpoint handling</a>
-1.7) <a href="#tunnelCreate.replyProcessing">Reply processing</a>
-2) <a href="#tunnelCreate.notes">Notes</a>
-</pre>
-
-<h2 id="tunnelCreate.overview">1) Tunnel creation encryption:</h2>
-
-<p>The tunnel creation is accomplished by a single message passed along
-the path of peers in the tunnel, rewritten in place, and transmitted
-back to the tunnel creator.  This single tunnel message is made up
-of a fixed number of records (8) - one for each potential peer in
-the tunnel.   Individual records are asymmetrically encrypted to be
-read only by a specific peer along the path, while an additional
-symmetric layer of encryption is added at each hop so as to expose
-the asymmetrically encrypted record only at the appropriate time.</p>
-
-<h3 id="tunnelCreate.requestRecord">1.1) Tunnel creation request record</h3>
-
-<p>Cleartext of the record, visible only to the hop being asked:</p><pre>
-  bytes     0-3: tunnel ID to receive messages as
-  bytes    4-35: local router identity hash
-  bytes   36-39: next tunnel ID
-  bytes   40-71: next router identity hash
-  bytes  72-103: AES-256 tunnel layer key
-  bytes 104-135: AES-256 tunnel IV key
-  bytes 136-167: AES-256 reply key
-  bytes 168-183: reply IV
-  byte      184: flags
-  bytes 185-188: request time (in hours since the epoch)
-  bytes 189-192: next message ID
-  bytes 193-222: uninterpreted / random padding</pre>
-
-<p>The next tunnel ID and next router identity hash fields are used to
-specify the next hop in the tunnel, though for an outbound tunnel
-endpoint, they specify where the rewritten tunnel creation reply
-message should be sent.  In addition, the next message ID specifies the
-message ID that the message (or reply) should use.</p>
-
-<p>The flags field currently has two bits defined:</p><pre>
- bit 0: if set, allow messages from anyone
- bit 1: if set, allow messages to anyone, and send the reply to the
-        specified next hop in a tunnel message</pre>
-
-<p>That cleartext record is ElGamal 2048 encrypted with the hop's
-public encryption key and formatted into a 528 byte record:</p><pre>
-  bytes   0-15: SHA-256-128 of the current hop's router identity
-  bytes 16-527: ElGamal-2048 encrypted request record</pre>
-
-<p>Since the cleartext uses the full field, there is no need for
-additional padding beyond <code>SHA256(cleartext) + cleartext</code>.</p>
-
-<h3 id="tunnelCreate.hopProcessing">1.2) Hop processing</h3>
-
-<p>When a hop receives a TunnelBuildMessage, it looks through the 8
-records contained within it for one starting with their own identity
-hash (trimmed to 8 bytes).  It then decryptes the ElGamal block from
-that record and retrieves the protected cleartext.  At that point,
-they make sure the tunnel request is not a duplicate by feeding the 
-AES-256 reply key into a bloom filter and making sure the request
-time is within an hour of current.  Duplicates or invalid requests
-are dropped.</p>
-
-<p>After deciding whether they will agree to participate in the tunnel
-or not, they replace the record that had contained the request with
-an encrypted reply block.  All other records are AES-256/CBC
-encrypted with the included reply key and IV (though each is
-encrypted separately, rather than chained across records).</p>
-
-<h3 id="tunnelCreate.replyRecord">1.3) Tunnel creation reply record</h3>
-
-<p>After the current hop reads their record, they replace it with a
-reply record stating whether or not they agree to participate in the
-tunnel, and if they do not, they classify their reason for
-rejection.  This is simply a 1 byte value, with 0x0 meaning they
-agree to participate in the tunnel, and higher values meaning higher
-levels of rejection.  The reply is encrypted with the AES session
-key delivered to it in the encrypted block, padded with random data
-until it reaches the full record size:</p><pre>
-  AES-256-CBC(SHA-256(padding+status) + padding + status, key, IV)</pre>
-
-<h3 id="tunnelCreate.requestPreparation">1.4) Request preparation</h3>
-
-<p>When building a new request, all of the records must first be 
-built and asymmetrically encrypted.  Each record should then be
-decrypted with the reply keys and IVs of the hops earlier in the
-path.  That decryption should be run in reverse order so that the
-asymmetrically encrypted data will show up in the clear at the
-right hop after their predecessor encrypts it.</p>
-
-<p>The excess records not needed for individual requests are simply
-filled with random data by the creator.</p>
-
-<h3 id="tunnelCreate.requestDelivery">1.5) Request delivery</h3>
-
-<p>For outbound tunnels, the delivery is done directly from the tunnel
-creator to the first hop, packaging up the TunnelBuildMessage as if
-the creator was just another hop in the tunnel.  For inbound
-tunnels, the delivery is done through an existing outbound tunnel
-(and during startup, when no outbound tunnel exists yet, a fake 0
-hop outbound tunnel is used).</p>
-
-<h3 id="tunnelCreate.endpointHandling">1.6) Endpoint handling</h3>
-
-<p>When the request reaches an outbound endpoint (as determined by the
-'allow messages to anyone' flag), the hop is processed as usual,
-encrypting a reply in place of the record and encrypting all of the
-other records, but since there is no 'next hop' to forward the
-TunnelBuildMessage on to, it instead places the encrypted reply
-records into a TunnelBuildReplyMessage and delivers it to the
-reply tunnel specified within the request record.  That reply tunnel
-forwards the reply records down to the tunnel creator for
-processing, as below.</p>
-
-<p>When the request reaches the inbound endpoint (also known as the
-tunnel creator), the router processes each of the replies, as below.</p>
-
-<h3 id="tunnelCreate.replyProcessing">1.7) Reply processing</h3>
-
-<p>To process the reply records, the creator simply has to AES decrypt
-each record individually, using the reply key and IV of each hop in
-the tunnel after the peer (in reverse order).  This then exposes the
-reply specifying whether they agree to participate in the tunnel or
-why they refuse.  If they all agree, the tunnel is considered
-created and may be used immediately, but if anyone refuses, the
-tunnel is discarded.</p>
-
-<h2 id="tunnelCreate.notes">2) Notes</h2>
-<ul>
-<li>This does not prevent two hostile peers within a tunnel from
-tagging one or more request or reply records to detect that they are
-within the same tunnel, but doing so can be detected by the tunnel
-creator when reading the reply, causing the tunnel to be marked as 
-invalid.</li>
-<li>This does not include a proof of work on the asymmetrically
-encrypted section, though the 16 byte identity hash could be cut in
-half with the later replaced by a hashcash function of up to 2^64
-cost.  This will not immediately be pursued, however.</li>
-<li>This alone does not prevent two hostile peers within a tunnel from
-using timing information to determine whether they are in the same
-tunnel.  The use of batched and synchronized request delivery
-could help (batching up requests and sending them off on the
-(ntp-synchronized) minute).  However, doing so lets peers 'tag' the
-requests by delaying them and detecting the delay later in the
-tunnel, though perhaps dropping requests not delivered in a small
-window would work (though doing that would require a high degree of
-clock synchronization).  Alternately, perhaps individual hops could
-inject a random delay before forwarding on the request?</li>
-<li>Are there any nonfatal methods of tagging the request?</li>
-<li>This strategy came about during a discussion on the I2P mailing list
-    between Michael Rogers, Matthew Toseland (toad), and jrandom regarding
-    the predecessor attack.  See: <ul>
-    <li><a href="http://dev.i2p.net/pipermail/i2p/2005-October/001073.html">Summary</a></li>
-    <li><a href="http://dev.i2p.net/pipermail/i2p/2005-October/001064.html">Reasoning</a></li>
-    </ul></li>
-</ul>
diff --git a/router/doc/tunnel-alt.html b/router/doc/tunnel-alt.html
deleted file mode 100644
index 2d5f2be2ffe9e375322a9fcad0968ab53280e9f2..0000000000000000000000000000000000000000
--- a/router/doc/tunnel-alt.html
+++ /dev/null
@@ -1,467 +0,0 @@
-<code>$Id: tunnel-alt.html,v 1.9 2005/07/27 14:04:07 jrandom Exp $</code>
-<pre>
-1) <a href="#tunnel.overview">Tunnel overview</a>
-2) <a href="#tunnel.operation">Tunnel operation</a>
-2.1) <a href="#tunnel.preprocessing">Message preprocessing</a>
-2.2) <a href="#tunnel.gateway">Gateway processing</a>
-2.3) <a href="#tunnel.participant">Participant processing</a>
-2.4) <a href="#tunnel.endpoint">Endpoint processing</a>
-2.5) <a href="#tunnel.padding">Padding</a>
-2.6) <a href="#tunnel.fragmentation">Tunnel fragmentation</a>
-2.7) <a href="#tunnel.alternatives">Alternatives</a>
-2.7.1) <a href="#tunnel.reroute">Adjust tunnel processing midstream</a>
-2.7.2) <a href="#tunnel.bidirectional">Use bidirectional tunnels</a>
-2.7.3) <a href="#tunnel.backchannel">Backchannel communication</a>
-2.7.4) <a href="#tunnel.variablesize">Variable size tunnel messages</a>
-3) <a href="#tunnel.building">Tunnel building</a>
-3.1) <a href="#tunnel.peerselection">Peer selection</a>
-3.1.1) <a href="#tunnel.selection.exploratory">Exploratory tunnel peer selection</a>
-3.1.2) <a href="#tunnel.selection.client">Client tunnel peer selection</a>
-3.2) <a href="#tunnel.request">Request delivery</a>
-3.3) <a href="#tunnel.pooling">Pooling</a>
-3.4) <a href="#tunnel.building.alternatives">Alternatives</a>
-3.4.1) <a href="#tunnel.building.telescoping">Telescopic building</a>
-3.4.2) <a href="#tunnel.building.nonexploratory">Non-exploratory tunnels for management</a>
-4) <a href="#tunnel.throttling">Tunnel throttling</a>
-5) <a href="#tunnel.mixing">Mixing/batching</a>
-</pre>
-
-<h2>1) <a name="tunnel.overview">Tunnel overview</a></h2>
-
-<p>Within I2P, messages are passed in one direction through a virtual
-tunnel of peers, using whatever means are available to pass the 
-message on to the next hop.  Messages arrive at the tunnel's 
-gateway, get bundled up and/or fragmented into fixed sizes tunnel messages, 
-and are forwarded on to the next hop in the tunnel, which processes and verifies
-the validity of the message and sends it on to the next hop, and so on, until
-it reaches the tunnel endpoint.  That endpoint takes the messages
-bundled up by the gateway and forwards them as instructed - either
-to another router, to another tunnel on another router, or locally.</p>
-
-<p>Tunnels all work the same, but can be segmented into two different
-groups - inbound tunnels and outbound tunnels.  The inbound tunnels
-have an untrusted gateway which passes messages down towards the 
-tunnel creator, which serves as the tunnel endpoint.  For outbound 
-tunnels, the tunnel creator serves as the gateway, passing messages
-out to the remote endpoint.</p>
-
-<p>The tunnel's creator selects exactly which peers will participate
-in the tunnel, and provides each with the necessary configuration
-data.  They may have any number of hops, but may be constrained with various
-proof-of-work requests to add on additional steps.  It is the intent to make
-it hard for either participants or third parties to determine the length of 
-a tunnel, or even for colluding participants to determine whether they are a
-part of the same tunnel at all (barring the situation where colluding peers are
-next to each other in the tunnel).</p>
-
-<p>Beyond their length, there are additional configurable parameters
-for each tunnel that can be used, such as a throttle on the frequency of 
-messages delivered, how padding should be used, how long a tunnel should be 
-in operation, whether to inject chaff messages, and what, if any, batching
-strategies should be employed.</p>
-
-<p>In practice, a series of tunnel pools are used for different
-purposes - each local client destination has its own set of inbound
-tunnels and outbound tunnels, configured to meet its anonymity and
-performance needs.  In addition, the router itself maintains a series
-of pools for participating in the network database and for managing
-the tunnels themselves.</p>
-
-<p>I2P is an inherently packet switched network, even with these 
-tunnels, allowing it to take advantage of multiple tunnels running 
-in parallel, increasing resilience and balancing load.  Outside of
-the core I2P layer, there is an optional end to end streaming library 
-available for client applications, exposing TCP-esque operation,
-including message reordering, retransmission, congestion control, etc.</p>
-
-<h2>2) <a name="tunnel.operation">Tunnel operation</a></h2>
-
-<p>Tunnel operation has four distinct processes, taken on by various 
-peers in the tunnel.  First, the tunnel gateway accumulates a number
-of tunnel messages and preprocesses them into something for tunnel
-delivery.  Next, that gateway encrypts that preprocessed data, then
-forwards it to the first hop.  That peer, and subsequent tunnel 
-participants, unwrap a layer of the encryption, verifying that it isn't
-a duplicate, then forward it on to the next peer.  
-Eventually, the message arrives at the endpoint where the messages
-bundled by the gateway are split out again and forwarded on as 
-requested.</p>
-
-<p>Tunnel IDs are 4 byte numbers used at each hop - participants know what
-tunnel ID to listen for messages with and what tunnel ID they should be forwarded
-on as to the next hop, and each hop chooses the tunnel ID which they receive messages
-on.  Tunnels themselves are short lived (10 minutes at the 
-moment), and even if subsequent tunnels are built using the same sequence of 
-peers, each hop's tunnel ID will change.</p>
-
-<h3>2.1) <a name="tunnel.preprocessing">Message preprocessing</a></h3>
-
-<p>When the gateway wants to deliver data through the tunnel, it first
-gathers zero or more I2NP messages, selects how much padding will be used, 
-fragments it across the necessary number of 1KB tunnel messages, and decides how
-each I2NP message should be handled by the tunnel endpoint, encoding that
-data into the raw tunnel payload:</p>
-<ul>
-<li>the first 4 bytes of the SHA256 of the remaining preprocessed data concatenated 
-    with the IV, using the IV as will be seen on the tunnel endpoint (for
-    outbound tunnels) or the IV as was seen on the tunnel gateway (for inbound
-    tunnels) (see below for IV processing).</li>
-<li>0 or more bytes containing random nonzero integers</li>
-<li>1 byte containing 0x00</li>
-<li>a series of zero or more { instructions, message } pairs</li>
-</ul>
-
-<p>The instructions are encoded with a single control byte, followed by any
-necessary additional information.  The first bit in that control byte determines
-how the remainder of the header is interpreted - if it is not set, the message 
-is either not fragmented or this is the first fragment in the message.  If it is
-set, this is a follow on fragment.</p>
-
-<p>With the first bit being 0, the instructions are:</p>
-<ul>
-<li>1 byte control byte:<pre>
-      bit 0: is follow on fragment?  (1 = true, 0 = false, must be 0)
-   bits 1-2: delivery type
-             (0x0 = LOCAL, 0x01 = TUNNEL, 0x02 = ROUTER)
-      bit 3: delay included?  (1 = true, 0 = false)
-      bit 4: fragmented?  (1 = true, 0 = false)
-      bit 5: extended options?  (1 = true, 0 = false)
-   bits 6-7: reserved</pre></li>
-<li>if the delivery type was TUNNEL, a 4 byte tunnel ID</li>
-<li>if the delivery type was TUNNEL or ROUTER, a 32 byte router hash</li>
-<li>if the delay included flag is true, a 1 byte value:<pre>
-      bit 0: type (0 = strict, 1 = randomized)
-   bits 1-7: delay exponent (2^value minutes)</pre></li>
-<li>if the fragmented flag is true, a 4 byte message ID</li>
-<li>if the extended options flag is true:<pre>
-   = a 1 byte option size (in bytes)
-   = that many bytes</pre></li>
-<li>2 byte size of the I2NP message or this fragment</li>
-</ul>
-
-<p>If the first bit being 1, the instructions are:</p>
-<ul>
-<li>1 byte control byte:<pre>
-      bit 0: is follow on fragment?  (1 = true, 0 = false, must be 1)
-   bits 1-6: fragment number
-      bit 7: is last? (1 = true, 0 = false)</pre></li>
-<li>4 byte message ID (same one defined in the first fragment)</li>
-<li>2 byte size of this fragment</li>
-</ul>
-
-<p>The I2NP message is encoded in its standard form, and the 
-preprocessed payload must be padded to a multiple of 16 bytes.</p>
-
-<h3>2.2) <a name="tunnel.gateway">Gateway processing</a></h3>
-
-<p>After the preprocessing of messages into a padded payload, the gateway builds
-a random 16 byte IV value, iteratively encrypting it and the tunnel message as
-necessary, and forwards the tuple {tunnelID, IV, encrypted tunnel message} to the next hop.</p>
-
-<p>How encryption at the gateway is done depends on whether the tunnel is an
-inbound or an outbound tunnel.  For inbound tunnels, they simply select a random
-IV, postprocessing and updating it to generate the IV for the gateway and using 
-that IV along side their own layer key to encrypt the preprocessed data.  For outbound 
-tunnels they must iteratively decrypt the (unencrypted) IV and preprocessed 
-data with the IV and layer keys for all hops in the tunnel.  The result of the outbound
-tunnel encryption is that when each peer encrypts it, the endpoint will recover 
-the initial preprocessed data.</p>
-
-<h3>2.3) <a name="tunnel.participant">Participant processing</a></h3>
-
-<p>When a peer receives a tunnel message, it checks that the message came from
-the same previous hop as before (initialized when the first message comes through
-the tunnel).  If the previous peer is a different router, or if the message has
-already been seen, the message is dropped.  The participant then encrypts the 
-received IV with AES256/ECB using their IV key to determine the current IV, uses 
-that IV with the participant's layer key to encrypt the data, encrypts the 
-current IV with AES256/ECB using their IV key again, then forwards the tuple 
-{nextTunnelId, nextIV, encryptedData} to the next hop.  This double encryption
-of the IV (both before and after use) help address a certain class of
-confirmation attacks.</p>
-
-<p>Duplicate message detection is handled by a decaying Bloom filter on message
-IVs.  Each router maintains a single Bloom filter to contain the XOR of the IV and
-the first block of the message received for all of the tunnels it is participating
-in, modified to drop seen entries after 10-20 minutes (when the tunnels will have
-expired).  The size of the bloom filter and the parameters used are sufficient to
-more than saturate the router's network connection with a negligible chance of 
-false positive.  The unique value fed into the Bloom filter is the XOR of the IV 
-and the first block so as to prevent nonsequential colluding peers in the tunnel 
-from tagging a message by resending it with the IV and first block switched.</p>
-
-<h3>2.4) <a name="tunnel.endpoint">Endpoint processing</a></h3>
-
-<p>After receiving and validating a tunnel message at the last hop in the tunnel,
-how the endpoint recovers the data encoded by the gateway depends upon whether 
-the tunnel is an inbound or an outbound tunnel.  For outbound tunnels, the 
-endpoint encrypts the message with its layer key just like any other participant, 
-exposing the preprocessed data.  For inbound tunnels, the endpoint is also the 
-tunnel creator so they can merely iteratively decrypt the IV and message, using the 
-layer and IV keys of each step in reverse order.</p>
-
-<p>At this point, the tunnel endpoint has the preprocessed data sent by the gateway,
-which it may then parse out into the included I2NP messages and forwards them as
-requested in their delivery instructions.</p>
-
-<h3>2.5) <a name="tunnel.padding">Padding</a></h3>
-
-<p>Several tunnel padding strategies are possible, each with their own merits:</p>
-
-<ul>
-<li>No padding</li>
-<li>Padding to a random size</li>
-<li>Padding to a fixed size</li>
-<li>Padding to the closest KB</li>
-<li>Padding to the closest exponential size (2^n bytes)</li>
-</ul>
-
-<p>These padding strategies can be used on a variety of levels, addressing the
-exposure of message size information to different adversaries.  After gathering
-and reviewing some <a href="http://dev.i2p.net/~jrandom/messageSizes/">statistics</a>
-from the 0.4 network, as well as exploring the anonymity tradeoffs, we're starting
-with a fixed tunnel message size of 1024 bytes.  Within this however, the fragmented
-messages themselves are not padded by the tunnel at all (though for end to end 
-messages, they may be padded as part of the garlic wrapping).</p>
-
-<h3>2.6) <a name="tunnel.fragmentation">Tunnel fragmentation</a></h3>
-
-<p>To prevent adversaries from tagging the messages along the path by adjusting
-the message size, all tunnel messages are a fixed 1024 bytes in size.  To accommodate 
-larger I2NP messages as well as to support smaller ones more efficiently, the
-gateway splits up the larger I2NP messages into fragments contained within each
-tunnel message.  The endpoint will attempt to rebuild the I2NP message from the
-fragments for a short period of time, but will discard them as necessary.</p>
-
-<p>Routers have a lot of leeway as to how the fragments are arranged, whether 
-they are stuffed inefficiently as discrete units, batched for a brief period to
-fit more payload into the 1024 byte tunnel messages, or opportunistically padded
-with other messages that the gateway wanted to send out.</p>
-
-<h3>2.7) <a name="tunnel.alternatives">Alternatives</a></h3>
-
-<h4>2.7.1) <a name="tunnel.reroute">Adjust tunnel processing midstream</a></h4>
-
-<p>While the simple tunnel routing algorithm should be sufficient for most cases,
-there are three alternatives that can be explored:</p>
-<ul>
-<li>Have a peer other than the endpoint temporarily act as the termination 
-point for a tunnel by adjusting the encryption used at the gateway to give them
-the plaintext of the preprocessed I2NP messages.  Each peer could check to see 
-whether they had the plaintext, processing the message when received as if they
-did.</li>
-<li>Allow routers participating in a tunnel to remix the message before 
-forwarding it on - bouncing it through one of that peer's own outbound tunnels,
-bearing instructions for delivery to the next hop.</li>
-<li>Implement code for the tunnel creator to redefine a peer's "next hop" in
-the tunnel, allowing further dynamic redirection.</li>
-</ul>
-
-<h4>2.7.2) <a name="tunnel.bidirectional">Use bidirectional tunnels</a></h4>
-
-<p>The current strategy of using two separate tunnels for inbound and outbound
-communication is not the only technique available, and it does have anonymity
-implications.  On the positive side, by using separate tunnels it lessens the
-traffic data exposed for analysis to participants in a tunnel - for instance,
-peers in an outbound tunnel from a web browser would only see the traffic of
-an HTTP GET, while the peers in an inbound tunnel would see the payload 
-delivered along the tunnel.  With bidirectional tunnels, all participants would
-have access to the fact that e.g. 1KB was sent in one direction, then 100KB
-in the other.  On the negative side, using unidirectional tunnels means that
-there are two sets of peers which need to be profiled and accounted for, and
-additional care must be taken to address the increased speed of predecessor
-attacks.  The tunnel pooling and building process outlined below should
-minimize the worries of the predecessor attack, though if it were desired,
-it wouldn't be much trouble to build both the inbound and outbound tunnels
-along the same peers.</p>
-
-<h4>2.7.3) <a name="tunnel.backchannel">Backchannel communication</a></h4>
-
-<p>At the moment, the IV values used are random values.  However, it is 
-possible for that 16 byte value to be used to send control messages from the 
-gateway to the endpoint, or on outbound tunnels, from the gateway to any of the
-peers.  The inbound gateway could encode certain values in the IV once, which
-the endpoint would be able to recover (since it knows the endpoint is also the
-creator).  For outbound tunnels, the creator could deliver certain values to the 
-participants during the tunnel creation (e.g. "if you see 0x0 as the IV, that
-means X", "0x1 means Y", etc).  Since the gateway on the outbound tunnel is also
-the creator, they can build a IV so that any of the peers will receive the 
-correct value.  The tunnel creator could even give the inbound tunnel gateway
-a series of IV values which that gateway could use to communicate with 
-individual participants exactly one time (though this would have issues regarding
-collusion detection)</p>
-
-<p>This technique could later be used deliver message mid stream, or to allow the
-inbound gateway to tell the endpoint that it is being DoS'ed or otherwise soon
-to fail.  At the moment, there are no plans to exploit this backchannel.</p>
-
-<h4>2.7.4) <a name="tunnel.variablesize">Variable size tunnel messages</a></h4>
-
-<p>While the transport layer may have its own fixed or variable message size,
-using its own fragmentation, the tunnel layer may instead use variable size
-tunnel messages.  The difference is an issue of threat models - a fixed size 
-at the transport layer helps reduce the information exposed to external 
-adversaries (though overall flow analysis still works), but for internal 
-adversaries (aka tunnel participants) the message size is exposed.  Fixed size
-tunnel messages help reduce the information exposed to tunnel participants, but
-does not hide the information exposed to tunnel endpoints and gateways.  Fixed
-size end to end messages hide the information exposed to all peers in the 
-network.</p>
-
-<p>As always, its a question of who I2P is trying to protect against.  Variable 
-sized tunnel messages are dangerous, as they allow participants to use the 
-message size itself as a backchannel to other participants - e.g. if you see a 
-1337 byte message, you're on the same tunnel as another colluding peer.  Even 
-with a fixed set of allowable sizes (1024, 2048, 4096, etc), that backchannel 
-still exists as peers could use the frequency of each size as the carrier (e.g.
-two 1024 byte messages followed by an 8192).  Smaller messages do incur the 
-overhead of the headers (IV, tunnel ID, hash portion, etc), but larger fixed size
-messages either increase latency (due to batching) or dramatically increase 
-overhead (due to padding).  Fragmentation helps ammortize the overhead, at the
-cost of potential message loss due to lost fragments.</p>
-
-<p>Timing attacks are also relevent when reviewing the effectiveness of fixed 
-size messages, though they require a substantial view of network activity
-patterns to be effective.  Excessive artificial delays in the tunnel will be 
-detected by the tunnel's creator, due to periodic testing, causing that entire
-tunnel to be scrapped and the profiles for peers within it to be adjusted.</p>
-
-<h2>3) <a name="tunnel.building">Tunnel building</a></h2>
-
-<p>When building a tunnel, the creator must send a request with the necessary
-configuration data to each of the hops and wait for all of them to agree before
-enabling the tunnel.  The requests are encrypted so that only the peers who need
-to know a piece of information (such as the tunnel layer or IV key) has that
-data.  In addition, only the tunnel creator will have access to the peer's
-reply.  There are three important dimensions to keep in mind when producing
-the tunnels: what peers are used (and where), how the requests are sent (and 
-replies received), and how they are maintained.</p>
-
-<h3>3.1) <a name="tunnel.peerselection">Peer selection</a></h3>
-
-<p>Beyond the two types of tunnels - inbound and outbound - there are two styles
-of peer selection used for different tunnels - exploratory and client.
-Exploratory tunnels are used for both network database maintenance and tunnel
-maintenance, while client tunnels are used for end to end client messages.  </p>
-
-<h4>3.1.1) <a name="tunnel.selection.exploratory">Exploratory tunnel peer selection</a></h4>
-
-<p>Exploratory tunnels are built out of a random selection of peers from a subset
-of the network.  The particular subset varies on the local router and on what their
-tunnel routing needs are.  In general, the exploratory tunnels are built out of
-randomly selected peers who are in the peer's "not failing but active" profile
-category.  The secondary purpose of the tunnels, beyond merely tunnel routing,
-is to find underutilized high capacity peers so that they can be promoted for
-use in client tunnels.</p>
-
-<h4>3.1.2) <a name="tunnel.selection.client">Client tunnel peer selection</a></h4>
-
-<p>Client tunnels are built with a more stringent set of requirements - the local
-router will select peers out of its "fast and high capacity" profile category so
-that performance and reliability will meet the needs of the client application.
-However, there are several important details beyond that basic selection that 
-should be adhered to, depending upon the client's anonymity needs.</p>
-  
-<p>For some clients who are worried about adversaries mounting a predecessor 
-attack, the tunnel selection can keep the peers selected in a strict order -
-if A, B, and C are in a tunnel, the hop after A is always B, and the hop after
-B is always C.  A less strict ordering is also possible, assuring that while
-the hop after A may be B, B may never be before A.  Other configuration options
-include the ability for just the inbound tunnel gateways and outbound tunnel
-endpoints to be fixed, or rotated on an MTBF rate.</p>
-
-<p>In the initial implementation, only random ordering has been implemented, 
-though more strict ordering will be developed and deployed over time, as well
-as controls for the user to select which strategy to use for individual clients.</p>
-
-<h3>3.2) <a name="tunnel.request">Request delivery</a></h3>
-
-<p>A new tunnel request preparation, delivery, and response method has been
-<a href="tunnel-alt-creation.html">devised</a>, which reduces the number of
-predecessors exposed, cuts the number of messages transmitted, verifies proper
-connectivity, and avoids the message counting attack of traditional telescopic
-tunnel creation.  The old technique is listed below as an <a
-href="#tunnel.building.exploratory">alternative</a>.</p>
-
-<p>Peers may reject tunnel creation requests for a variety of reasons, though
-a series of four increasingly severe rejections are known: probabalistic rejection
-(due to approaching the router's capacity, or in response to a flood of requests), 
-transient overload, bandwidth overload, and critical failure.  When received, 
-those four are interpreted by the tunnel creator to help adjust their profile of
-the router in question.</p>
-
-<h3>3.3) <a name="tunnel.pooling">Pooling</a></h3>
-
-<p>To allow efficient operation, the router maintains a series of tunnel pools,
-each managing a group of tunnels used for a specific purpose with their own
-configuration.  When a tunnel is needed for that purpose, the router selects one
-out of the appropriate pool at random.  Overall, there are two exploratory tunnel
-pools - one inbound and one outbound - each using the router's exploration 
-defaults.  In addition, there is a pair of pools for each local destination -
-one inbound and one outbound tunnel.  Those pools use the configuration specified
-when the local destination connected to the router, or the router's defaults if
-not specified.</p>
-
-<p>Each pool has within its configuration a few key settings, defining how many
-tunnels to keep active, how many backup tunnels to maintain in case of failure,
-how frequently to test the tunnels, how long the tunnels should be, whether those
-lengths should be randomized, how often replacement tunnels should be built, as 
-well as any of the other settings allowed when configuring individual tunnels.</p>
-
-<h3>3.4) <a name="tunnel.building.alternatives">Alternatives</a></h3>
-
-<h4>3.4.1) <a name="tunnel.building.telescoping">Telescopic building</a></h4>
-
-<p>One question that may arise regarding the use of the exploratory tunnels for
-sending and receiving tunnel creation messages is how that impacts the tunnel's 
-vulnerability to predecessor attacks.  While the endpoints and gateways of 
-those tunnels will be randomly distributed across the network (perhaps even 
-including the tunnel creator in that set), another alternative is to use the
-tunnel pathways themselves to pass along the request and response, as is done
-in <a href="http://tor.eff.org/">TOR</a>.  This, however, may lead to leaks 
-during tunnel creation, allowing peers to discover how many hops there are later
-on in the tunnel by monitoring the timing or <a
-href="http://dev.i2p.net/pipermail/2005-October/001057.html">packet count</a> as
-the tunnel is built.</p>
-
-<h4>3.4.2) <a name="tunnel.building.nonexploratory">Non-exploratory tunnels for management</a></h4>
-
-<p>A second alternative to the tunnel building process is to give the router 
-an additional set of non-exploratory inbound and outbound pools, using those for
-the tunnel request and response.  Assuming the router has a well integrated view
-of the network, this should not be necessary, but if the router was partitioned
-in some way, using non-exploratory pools for tunnel management would reduce the
-leakage of information about what peers are in the router's partition.</p>
-
-<h4>3.4.3) <a name="tunnel.building.exploratory">Exploratory request delivery</a></h4>
-
-<p>A third alternative, used until I2P 0.6.2, garlic encrypts individual tunnel
-request messages and delivers them to the hops individually, transmitting them
-through exploratory tunnels with their reply coming back in a separate
-exploratory tunnel.  This strategy has been dropped in favor of the one outlined
-above.</p>
-
-<h2>4) <a name="tunnel.throttling">Tunnel throttling</a></h2>
-
-<p>Even though the tunnels within I2P bear a resemblance to a circuit switched
-network, everything within I2P is strictly message based - tunnels are merely
-accounting tricks to help organize the delivery of messages.  No assumptions are
-made regarding reliability or ordering of messages, and retransmissions are left
-to higher levels (e.g. I2P's client layer streaming library).  This allows I2P
-to take advantage of throttling techniques available to both packet switched and
-circuit switched networks.  For instance, each router may keep track of the 
-moving average of how much data each tunnel is using, combine that with all of 
-the averages used by other tunnels the router is participating in, and be able
-to accept or reject additional tunnel participation requests based on its 
-capacity and utilization.  On the other hand, each router can simply drop 
-messages that are beyond its capacity, exploiting the research used on the 
-normal internet.</p>
-
-<h2>5) <a name="tunnel.mixing">Mixing/batching</a></h2>
-
-<p>What strategies should be used at the gateway and at each hop for delaying,
-reordering, rerouting, or padding messages?  To what extent should this be done
-automatically, how much should be configured as a per tunnel or per hop setting,
-and how should the tunnel's creator (and in turn, user) control this operation?
-All of this is left as unknown, to be worked out for 
-<a href="http://www.i2p.net/roadmap#3.0">I2P 3.0</a></p>
diff --git a/router/doc/tunnel.html b/router/doc/tunnel.html
deleted file mode 100644
index a15d19c12f85f74908bdc7c253a68175ee279188..0000000000000000000000000000000000000000
--- a/router/doc/tunnel.html
+++ /dev/null
@@ -1,529 +0,0 @@
-<b>Note: NOT used!  see tunnel-alt.html</b>
-
-<code>$Id: tunnel.html,v 1.10 2005/01/16 01:07:07 jrandom Exp $</code>
-<pre>
-1) <a href="#tunnel.overview">Tunnel overview</a>
-2) <a href="#tunnel.operation">Tunnel operation</a>
-2.1) <a href="#tunnel.preprocessing">Message preprocessing</a>
-2.2) <a href="#tunnel.gateway">Gateway processing</a>
-2.3) <a href="#tunnel.participant">Participant processing</a>
-2.4) <a href="#tunnel.endpoint">Endpoint processing</a>
-2.5) <a href="#tunnel.padding">Padding</a>
-2.6) <a href="#tunnel.fragmentation">Tunnel fragmentation</a>
-2.7) <a href="#tunnel.alternatives">Alternatives</a>
-2.7.1) <a href="#tunnel.nochecksum">Don't use a checksum block</a>
-2.7.2) <a href="#tunnel.reroute">Adjust tunnel processing midstream</a>
-2.7.3) <a href="#tunnel.bidirectional">Use bidirectional tunnels</a>
-2.7.4) <a href="#tunnel.smallerhashes">Use smaller hashes</a>
-3) <a href="#tunnel.building">Tunnel building</a>
-3.1) <a href="#tunnel.peerselection">Peer selection</a>
-3.1.1) <a href="#tunnel.selection.exploratory">Exploratory tunnel peer selection</a>
-3.1.2) <a href="#tunnel.selection.client">Client tunnel peer selection</a>
-3.2) <a href="#tunnel.request">Request delivery</a>
-3.3) <a href="#tunnel.pooling">Pooling</a>
-3.4) <a href="#tunnel.building.alternatives">Alternatives</a>
-3.4.1) <a href="#tunnel.building.telescoping">Telescopic building</a>
-3.4.2) <a href="#tunnel.building.nonexploratory">Non-exploratory tunnels for management</a>
-4) <a href="#tunnel.throttling">Tunnel throttling</a>
-5) <a href="#tunnel.mixing">Mixing/batching</a>
-</pre>
-
-<h2>1) <a name="tunnel.overview">Tunnel overview</a></h2>
-
-<p>Within I2P, messages are passed in one direction through a virtual
-tunnel of peers, using whatever means are available to pass the 
-message on to the next hop.  Messages arrive at the tunnel's 
-gateway, get bundled up for the path, and are forwarded on to the
-next hop in the tunnel, which processes and verifies the validity
-of the message and sends it on to the next hop, and so on, until
-it reaches the tunnel endpoint.  That endpoint takes the messages
-bundled up by the gateway and forwards them as instructed - either
-to another router, to another tunnel on another router, or locally.</p>
-
-<p>Tunnels all work the same, but can be segmented into two different
-groups - inbound tunnels and outbound tunnels.  The inbound tunnels
-have an untrusted gateway which passes messages down towards the 
-tunnel creator, which serves as the tunnel endpoint.  For outbound 
-tunnels, the tunnel creator serves as the gateway, passing messages
-out to the remote endpoint.</p>
-
-<p>The tunnel's creator selects exactly which peers will participate
-in the tunnel, and provides each with the necessary confiruration
-data.  They may vary in length from 0 hops (where the gateway
-is also the endpoint) to 8 hops (where there are 6 peers after
-the gateway and before the endpoint).  It is the intent to make
-it hard for either participants or third parties to determine
-the length of a tunnel, or even for colluding participants to 
-determine whether they are a part of the same tunnel at all 
-(barring the situation where colluding peers are next to each other
-in the tunnel).  Messages that have been corrupted are also dropped
-as soon as possible, reducing network load.</p>
-
-<p>Beyond their length, there are additional configurable parameters
-for each tunnel that can be used, such as a throttle on the size or
-frequency of messages delivered, how padding should be used, how 
-long a tunnel should be in operation, whether to inject chaff 
-messages, whether to use fragmentation, and what, if any, batching
-strategies should be employed.</p>
-
-<p>In practice, a series of tunnel pools are used for different
-purposes - each local client destination has its own set of inbound
-tunnels and outbound tunnels, configured to meet its anonymity and
-performance needs.  In addition, the router itself maintains a series
-of pools for participating in the network database and for managing
-the tunnels themselves.</p>
-
-<p>I2P is an inherently packet switched network, even with these 
-tunnels, allowing it to take advantage of multiple tunnels running 
-in parallel, increasing resiliance and balancing load.  Outside of
-the core I2P layer, there is an optional end to end streaming library 
-available for client applications, exposing TCP-esque operation,
-including message reordering, retransmission, congestion control, etc.</p>
-
-<h2>2) <a name="tunnel.operation">Tunnel operation</a></h2>
-
-<p>Tunnel operation has four distinct processes, taken on by various 
-peers in the tunnel.  First, the tunnel gateway accumulates a number
-of tunnel messages and preprocesses them into something for tunnel
-delivery.  Next, that gateway encrypts that preprocessed data, then
-forwards it to the first hop.  That peer, and subsequent tunnel 
-participants, unwrap a layer of the encryption, verifying the 
-integrity of the message, then forward it on to the next peer.  
-Eventually, the message arrives at the endpoint where the messages
-bundled by the gateway are split out again and forwarded on as 
-requested.</p>
-
-<p>Tunnel IDs are 4 byte numbers used at each hop - participants know what
-tunnel ID to listen for messages with and what tunnel ID they should be forwarded
-on as to the next hop.  Tunnels themselves are short lived (10 minutes at the 
-moment), but depending upon the tunnel's purpose, and though subsequent tunnels 
-may be built using the same sequence of peers, each hop's tunnel ID will change.</p>
-
-<h3>2.1) <a name="tunnel.preprocessing">Message preprocessing</a></h3>
-
-<p>When the gateway wants to deliver data through the tunnel, it first
-gathers zero or more I2NP messages (no more than 32KB worth), 
-selects how much padding will be used, and decides how each I2NP
-message should be handled by the tunnel endpoint, encoding that
-data into the raw tunnel payload:</p>
-<ul>
-<li>2 byte unsigned integer specifying the # of padding bytes</li>
-<li>that many random bytes</li>
-<li>a series of zero or more { instructions, message } pairs</li>
-</ul>
-
-<p>The instructions are encoded as follows:</p>
-<ul>
-<li>1 byte value:<pre>
-   bits 0-1: delivery type
-             (0x0 = LOCAL, 0x01 = TUNNEL, 0x02 = ROUTER)
-      bit 2: delay included?  (1 = true, 0 = false)
-      bit 3: fragmented?  (1 = true, 0 = false)
-      bit 4: extended options?  (1 = true, 0 = false)
-   bits 5-7: reserved</pre></li>
-<li>if the delivery type was TUNNEL, a 4 byte tunnel ID</li>
-<li>if the delivery type was TUNNEL or ROUTER, a 32 byte router hash</li>
-<li>if the delay included flag is true, a 1 byte value:<pre>
-      bit 0: type (0 = strict, 1 = randomized)
-   bits 1-7: delay exponent (2^value minutes)</pre></li>
-<li>if the fragmented flag is true, a 4 byte message ID, and a 1 byte value:<pre>
-   bits 0-6: fragment number
-      bit 7: is last?  (1 = true, 0 = false)</pre></li>
-<li>if the extended options flag is true:<pre>
-   = a 1 byte option size (in bytes)
-   = that many bytes</pre></li>
-<li>2 byte size of the I2NP message</li>
-</ul>
-
-<p>The I2NP message is encoded in its standard form, and the 
-preprocessed payload must be padded to a multiple of 16 bytes.</p>
-
-<h3>2.2) <a name="tunnel.gateway">Gateway processing</a></h3>
-
-<p>After the preprocessing of messages into a padded payload, the gateway
-encrypts the payload with the eight keys, building a checksum block so
-that each peer can verify the integrity of the payload at any time, as
-well as an end to end verification block for the tunnel endpoint to
-verify the integrity of the checksum block.  The specific details follow.</p>
-
-<p>The encryption used is such that decryption
-merely requires running over the data with AES in CBC mode, calculating the
-SHA256 of a certain fixed portion of the message (bytes 16 through $size-144),
-and searching for the first 16 bytes of that hash in the checksum block.  There is a fixed number 
-of hops defined (8 peers) so that we can verify the message
-without either leaking the position in the tunnel or having the message 
-continually "shrink" as layers are peeled off.  For tunnels shorter than 8
-hops, the tunnel creator will take the place of the excess hops, decrypting 
-with their keys (for outbound tunnels, this is done at the beginning, and for
-inbound tunnels, the end).</p>
-
-<p>The hard part in the encryption is building that entangled checksum block, 
-which requires essentially finding out what the hash of the payload will look 
-like at each step, randomly ordering those hashes, then building a matrix of 
-what each of those randomly ordered hashes will look like at each step.  The
-gateway itself must pretend that it is one of the peers within the checksum
-block so that the first hop cannot tell that the previous hop was the gateway.
-To visualize this a bit:</p>
-
-<table border="1">
- <tr><td colspan="2"></td>
-     <td><b>IV</b></td><td><b>Payload</b></td>
-     <td><b>eH[0]</b></td><td><b>eH[1]</b></td>
-     <td><b>eH[2]</b></td><td><b>eH[3]</b></td>
-     <td><b>eH[4]</b></td><td><b>eH[5]</b></td>
-     <td><b>eH[6]</b></td><td><b>eH[7]</b></td>
-     <td><b>V</b></td>
- </tr>
- <tr><td rowspan="2"><b>peer0</b><br /><font size="-2">key=K[0]</font></td><td><b>recv</b></td>
-     <td colspan="11"><hr /></td>
- </tr>
- <tr><td><b>send</b></td>
-     <td rowspan="2">IV[0]</td><td rowspan="2">P[0]</td>
-     <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2">H(P[0])</td>
-     <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td>
-     <td rowspan="2">V[0]</td>
- </tr>
- <tr><td rowspan="2"><b>peer1</b><br /><font size="-2">key=K[1]</font></td><td><b>recv</b></td>
- </tr>
- <tr><td><b>send</b></td>
-     <td rowspan="2">IV[1]</td><td rowspan="2">P[1]</td>
-     <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td>
-     <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2">H(P[1])</td><td rowspan="2"></td>
-     <td rowspan="2">V[1]</td>
- </tr>
- <tr><td rowspan="2"><b>peer2</b><br /><font size="-2">key=K[2]</font></td><td><b>recv</b></td>
- </tr>
- <tr><td><b>send</b></td>
-     <td rowspan="2">IV[2]</td><td rowspan="2">P[2]</td>
-     <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td>
-     <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2">H(P[2])</td>
-     <td rowspan="2">V[2]</td>
- </tr>
- <tr><td rowspan="2"><b>peer3</b><br /><font size="-2">key=K[3]</font></td><td><b>recv</b></td>
- </tr>
- <tr><td><b>send</b></td>
-     <td rowspan="2">IV[3]</td><td rowspan="2">P[3]</td>
-     <td rowspan="2">H(P[3])</td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td>
-     <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td>
-     <td rowspan="2">V[3]</td>
- </tr>
- <tr><td rowspan="2"><b>peer4</b><br /><font size="-2">key=K[4]</font></td><td><b>recv</b></td>
- </tr>
- <tr><td><b>send</b></td>
-     <td rowspan="2">IV[4]</td><td rowspan="2">P[4]</td>
-     <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2">H(P[4])</td><td rowspan="2"></td>
-     <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td>
-     <td rowspan="2">V[4]</td>
- </tr>
- <tr><td rowspan="2"><b>peer5</b><br /><font size="-2">key=K[5]</font></td><td><b>recv</b></td>
- </tr>
- <tr><td><b>send</b></td>
-     <td rowspan="2">IV[5]</td><td rowspan="2">P[5]</td>
-     <td rowspan="2"></td><td rowspan="2">H(P[5])</td><td rowspan="2"></td><td rowspan="2"></td>
-     <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td>
-     <td rowspan="2">V[5]</td>
- </tr>
- <tr><td rowspan="2"><b>peer6</b><br /><font size="-2">key=K[6]</font></td><td><b>recv</b></td>
- </tr>
- <tr><td><b>send</b></td>
-     <td rowspan="2">IV[6]</td><td rowspan="2">P[6]</td>
-     <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td>
-     <td rowspan="2"></td><td rowspan="2">H(P[6])</td><td rowspan="2"></td><td rowspan="2"></td>
-     <td rowspan="2">V[6]</td>
- </tr>
- <tr><td rowspan="2"><b>peer7</b><br /><font size="-2">key=K[7]</font></td><td><b>recv</b></td>
- </tr>
- <tr><td><b>send</b></td>
-     <td>IV[7]</td><td>P[7]</td>
-     <td></td><td></td><td></td><td></td><td>H(P[7])</td><td></td><td></td><td></td>
-     <td>V[7]</td>
- </tr>
-</table>
-
-<p>In the above, P[7] is the same as the original data being passed through the
-tunnel (the preprocessed messages), and V[7] is the first 16 bytes of the SHA256 of eH[0-7] as seen on
-peer7 after decryption.  For
-cells in the matrix "higher up" than the hash, their value is derived by encrypting
-the cell below it with the key for the peer below it, using the end of the column 
-to the left of it as the IV.  For cells in the matrix "lower down" than the hash, 
-they're equal to the cell above them, decrypted by the current peer's key, using 
-the end of the previous encrypted block on that row.</p>
-
-<p>With this randomized matrix of checksum blocks, each peer will be able to find
-the hash of the payload, or if it is not there, know that the message is corrupt.
-The entanglement by using CBC mode increases the difficulty in tagging the 
-checksum blocks themselves, but it is still possible for that tagging to go 
-briefly undetected if the columns after the tagged data have already been used
-to check the payload at a peer.  In any case, the tunnel endpoint (peer 7) knows
-for certain whether any of the checksum blocks have been tagged, as that would
-corrupt the verification block (V[7]).</p>
-
-<p>The IV[0] is a random 16 byte value, and IV[i] is the first 16 bytes of 
-H(D(IV[i-1], K[i-1]) xor IV_WHITENER).  We don't use the same IV along the path, as that would
-allow trivial collusion, and we use the hash of the decrypted value to propogate 
-the IV so as to hamper key leakage.  IV_WHITENER is a fixed 16 byte value.</p>
-
-<p>When the gateway wants to send the message, they export the right row for the
-peer who is the first hop (usually the peer1.recv row) and forward that entirely.</p>
-
-<h3>2.3) <a name="tunnel.participant">Participant processing</a></h3>
-
-<p>When a participant in a tunnel receives a message, they decrypt a layer with their
-tunnel key using AES256 in CBC mode with the first 16 bytes as the IV.  They then
-calculate the hash of what they see as the payload (bytes 16 through $size-144) and
-search for that first 16 bytes of that hash within the decrypted checksum block.  If no match is found, the
-message is discarded.  Otherwise, the IV is updated by decrypting it, XORing that value
-with the IV_WHITENER, and replacing it with the first 16 bytes of its hash.  The 
-resulting message is then forwarded on to the next peer for processing.</p>
-
-<p>To prevent replay attacks at the tunnel level, each participant keeps track of
-the IVs received during the tunnel's lifetime, rejecting duplicates.  The memory 
-usage required should be minor, as each tunnel has only a very short lifespan (10m
-at the moment).  A constant 100KBps through a tunnel with full 32KB messages would
-give 1875 messages, requiring less than 30KB of memory.  Gateways and endpoints 
-handle replay by tracking the message IDs and expirations on the I2NP messages 
-contained in the tunnel.</p>
-
-<h3>2.4) <a name="tunnel.endpoint">Endpoint processing</a></h3>
-
-<p>When a message reaches the tunnel endpoint, they decrypts and verifies it like
-a normal participant.  If the checksum block has a valid match, the endpoint then
-computes the hash of the checksum block itself (as seen after decryption) and compares
-that to the decrypted verification hash (the last 16 bytes).  If that verification
-hash does not match, the endpoint takes note of the tagging attempt by one of the
-tunnel participants and perhaps discards the message.</p>
-
-<p>At this point, the tunnel endpoint has the preprocessed data sent by the gateway,
-which it may then parse out into the included I2NP messages and forwards them as
-requested in their delivery instructions.</p>
-
-<h3>2.5) <a name="tunnel.padding">Padding</a></h3>
-
-<p>Several tunnel padding strategies are possible, each with their own merits:</p>
-
-<ul>
-<li>No padding</li>
-<li>Padding to a random size</li>
-<li>Padding to a fixed size</li>
-<li>Padding to the closest KB</li>
-<li>Padding to the closest exponential size (2^n bytes)</li>
-</ul>
-
-<p><i>Which to use?  no padding is most efficient, random padding is what
-we have now, fixed size would either be an extreme waste or force us to
-implement fragmentation.  Padding to the closest exponential size (ala freenet)
-seems promising.  Perhaps we should gather some stats on the net as to what size
-messages are, then see what costs and benefits would arise from different 
-strategies?</i></p>
-
-<h3>2.6) <a name="tunnel.fragmentation">Tunnel fragmentation</a></h3>
-
-<p>For various padding and mixing schemes, it may be useful from an anonymity
-perspective to fragment a single I2NP message into multiple parts, each delivered
-seperately through different tunnel messages.  The endpoint may or may not 
-support that fragmentation (discarding or hanging on to fragments as needed),
-and handling fragmentation will not immediately be implemented.</p>
-
-<h3>2.7) <a name="tunnel.alternatives">Alternatives</a></h3>
-
-<h4>2.7.1) <a name="tunnel.nochecksum">Don't use a checksum block</a></h4>
-
-<p>One alternative to the above process is to remove the checksum block
-completely and replace the verification hash with a plain hash of the payload.
-This would simplify processing at the tunnel gateway and save 144 bytes of
-bandwidth at each hop.  On the other hand, attackers within the tunnel could
-trivially adjust the message size to one which is easily traceable by 
-colluding external observers in addition to later tunnel participants.  The
-corruption would also incur the waste of the entire bandwidth necessary to 
-pass on the message.  Without the per-hop validation, it would also be possible
-to consume excess network resources by building extremely long tunnels, or by
-building loops into the tunnel.</p>
-
-<h4>2.7.2) <a name="tunnel.reroute">Adjust tunnel processing midstream</a></h4>
-
-<p>While the simple tunnel routing algorithm should be sufficient for most cases,
-there are three alternatives that can be explored:</p>
-<ul>
-<li>Delay a message within a tunnel at an arbitrary hop for either a specified
-amount of time or a randomized period.  This could be achieved by replacing the
-hash in the checksum block with e.g. the first 8 bytes of the hash, followed by
-some delay instructions.  Alternately, the instructions could tell the 
-participant to actually interpret the raw payload as it is, and either discard
-the message or continue to forward it down the path (where it would be
-interpreted by the endpoint as a chaff message).  The later part of this would
-require the gateway to adjust its encryption algorithm to produce the cleartext
-payload on a different hop, but it shouldn't be much trouble.</li>
-<li>Allow routers participating in a tunnel to remix the message before 
-forwarding it on - bouncing it through one of that peer's own outbound tunnels,
-bearing instructions for delivery to the next hop.  This could be used in either
-a controlled manner (with en-route instructions like the delays above) or 
-probabalistically.</li>
-<li>Implement code for the tunnel creator to redefine a peer's "next hop" in
-the tunnel, allowing further dynamic redirection.</li>
-</ul>
-
-<h4>2.7.3) <a name="tunnel.bidirectional">Use bidirectional tunnels</a></h4>
-
-<p>The current strategy of using two seperate tunnels for inbound and outbound
-communication is not the only technique available, and it does have anonymity
-implications.  On the positive side, by using separate tunnels it lessens the
-traffic data exposed for analysis to participants in a tunnel - for instance,
-peers in an outbound tunnel from a web browser would only see the traffic of
-an HTTP GET, while the peers in an inbound tunnel would see the payload 
-delivered along the tunnel.  With bidirectional tunnels, all participants would
-have access to the fact that e.g. 1KB was sent in one direction, then 100KB
-in the other.  On the negative side, using unidirectional tunnels means that
-there are two sets of peers which need to be profiled and accounted for, and
-additional care must be taken to address the increased speed of predecessor
-attacks.  The tunnel pooling and building process outlined below should
-minimize the worries of the predecessor attack, though if it were desired,
-it wouldn't be much trouble to build both the inbound and outbound tunnels
-along the same peers.</p>
-
-<h4>2.7.4) <a name="tunnel.smallerhashes">Use smaller blocksize</a></h4>
-
-<p>At the moment, our use of AES limits our block size to 16 bytes, which
-in turn provides the minimum size for each of the checksum block columns.
-If another algorithm was used with a smaller block size, or could otherwise
-allow the safe building of the checksum block with smaller portions of the
-hash, it might be worth exploring.  The 16 bytes used now at each hop should
-be more than sufficient.</p>
-
-<h2>3) <a name="tunnel.building">Tunnel building</a></h2>
-
-<p>When building a tunnel, the creator must send a request with the necessary
-configuration data to each of the hops, then wait for the potential participant
-to reply stating that they either agree or do not agree.  These tunnel request
-messages and their replies are garlic wrapped so that only the router who knows
-the key can decrypt it, and the path taken in both directions is tunnel routed
-as well.  There are three important dimensions to keep in mind when producing
-the tunnels: what peers are used (and where), how the requests are sent (and 
-replies received), and how they are maintained.</p>
-
-<h3>3.1) <a name="tunnel.peerselection">Peer selection</a></h3>
-
-<p>Beyond the two types of tunnels - inbound and outbound - there are two styles
-of peer selection used for different tunnels - exploratory and client.
-Exploratory tunnels are used for both network database maintenance and tunnel
-maintenance, while client tunnels are used for end to end client messages.  </p>
-
-<h4>3.1.1) <a name="tunnel.selection.exploratory">Exploratory tunnel peer selection</a></h4>
-
-<p>Exploratory tunnels are built out of a random selection of peers from a subset
-of the network.  The particular subset varies on the local router and on what their
-tunnel routing needs are.  In general, the exploratory tunnels are built out of
-randomly selected peers who are in the peer's "not failing but active" profile
-category.  The secondary purpose of the tunnels, beyond merely tunnel routing,
-is to find underutilized high capacity peers so that they can be promoted for
-use in client tunnels.</p>
-
-<h4>3.1.2) <a name="tunnel.selection.client">Client tunnel peer selection</a></h4>
-
-<p>Client tunnels are built with a more stringent set of requirements - the local
-router will select peers out of its "fast and high capacity" profile category so
-that performance and reliability will meet the needs of the client application.
-However, there are several important details beyond that basic selection that 
-should be adhered to, depending upon the client's anonymity needs.</p>
-  
-<p>For some clients who are worried about adversaries mounting a predecessor 
-attack, the tunnel selection can keep the peers selected in a strict order -
-if A, B, and C are in a tunnel, the hop after A is always B, and the hop after
-B is always C.  A less strict ordering is also possible, assuring that while
-the hop after A may be B, B may never be before A.  Other configuration options
-include the ability for just the inbound tunnel gateways and outbound tunnel
-endpoints to be fixed, or rotated on an MTBF rate.</p>
-
-<h3>3.2) <a name="tunnel.request">Request delivery</a></h3>
-
-<p>As mentioned above, once the tunnel creator knows what peers should go into
-a tunnel and in what order, the creator builds a series of tunnel request 
-messages, each containing the necessary information for that peer.  For instance,
-participating tunnels will be given the 4 byte tunnel ID on which they are to
-receive messages, the 4 byte tunnel ID on which they are to send out the messages,
-the 32 byte hash of the next hop's identity, and the 32 byte layer key used to
-remove a layer from the tunnel.  Of course, outbound tunnel endpoints are not 
-given any "next hop" or "next tunnel ID" information.  Inbound tunnel gateways
-are however given the 8 layer keys in the order they should be encrypted (as 
-described above).  To allow replies, the request contains a random session tag
-and a random session key with which the peer may garlic encrypt their decision,
-as well as the tunnel to which that garlic should be sent.  In addition to the
-above information, various client specific options may be included, such as 
-what throttling to place on the tunnel, what padding or batch strategies to use, 
-etc.</p>
-
-<p>After building all of the request messages, they are garlic wrapped for the
-target router and sent out an exploratory tunnel.  Upon receipt, that peer 
-determines whether they can or will participate, creating a reply message and
-both garlic wrapping and tunnel routing the response with the supplied 
-information.  Upon receipt of the reply at the tunnel creator, the tunnel is
-considered valid on that hop (if accepted).  Once all peers have accepted, the
-tunnel is active.</p>
-
-<h3>3.3) <a name="tunnel.pooling">Pooling</a></h3>
-
-<p>To allow efficient operation, the router maintains a series of tunnel pools,
-each managing a group of tunnels used for a specific purpose with their own
-configuration.  When a tunnel is needed for that purpose, the router selects one
-out of the appropriate pool at random.  Overall, there are two exploratory tunnel
-pools - one inbound and one outbound - each using the router's exploration 
-defaults.  In addition, there is a pair of pools for each local destination -
-one inbound and one outbound tunnel.  Those pools use the configuration specified
-when the local destination connected to the router, or the router's defaults if
-not specified.</p>
-
-<p>Each pool has within its configuration a few key settings, defining how many
-tunnels to keep active, how many backup tunnels to maintain in case of failure,
-how frequently to test the tunnels, how long the tunnels should be, whether those
-lengths should be randomized, how often replacement tunnels should be built, as 
-well as any of the other settings allowed when configuring individual tunnels.</p>
-
-<h3>3.4) <a name="tunnel.building.alternatives">Alternatives</a></h3>
-
-<h4>3.4.1) <a name="tunnel.building.telescoping">Telescopic building</a></h4>
-
-<p>One question that may arise regarding the use of the exploratory tunnels for
-sending and receiving tunnel creation messages is how that impacts the tunnel's 
-vulnerability to predecessor attacks.  While the endpoints and gateways of 
-those tunnels will be randomly distributed across the network (perhaps even 
-including the tunnel creator in that set), another alternative is to use the
-tunnel pathways themselves to pass along the request and response, as is done
-in <a href="http://tor.eff.org/">TOR</a>.  This, however, may lead to leaks 
-during tunnel creation, allowing peers to discover how many hops there are later
-on in the tunnel by monitoring the timing or packet count as the tunnel is
-built.  Techniques could be used to minimize this issue, such as using each of 
-the hops as endpoints (per <a href="#tunnel.reroute">2.7.2</a>) for a random
-number of messages before continuing on to build the next hop.</p>
-
-<h4>3.4.2) <a name="tunnel.building.nonexploratory">Non-exploratory tunnels for management</a></h4>
-
-<p>A second alternative to the tunnel building process is to give the router 
-an additional set of non-exploratory inbound and outbound pools, using those for
-the tunnel request and response.  Assuming the router has a well integrated view
-of the network, this should not be necessary, but if the router was partitioned
-in some way, using non-exploratory pools for tunnel management would reduce the
-leakage of information about what peers are in the router's partition.</p>
-
-<h2>4) <a name="tunnel.throttling">Tunnel throttling</a></h2>
-
-<p>Even though the tunnels within I2P bear a resemblence to a circuit switched
-network, everything within I2P is strictly message based - tunnels are merely
-accounting tricks to help organize the delivery of messages.  No assumptions are
-made regarding reliability or ordering of messages, and retransmissions are left
-to higher levels (e.g. I2P's client layer streaming library).  This allows I2P
-to take advantage of throttling techniques available to both packet switched and
-circuit switched networks.  For instance, each router may keep track of the 
-moving average of how much data each tunnel is using, combine that with all of 
-the averages used by other tunnels the router is participating in, and be able
-to accept or reject additional tunnel participation requests based on its 
-capacity and utilization.  On the other hand, each router can simply drop 
-messages that are beyond its capacity, exploiting the research used on the 
-normal internet.</p>
-
-<h2>5) <a name="tunnel.mixing">Mixing/batching</a></h2>
-
-<p>What strategies should be used at the gateway and at each hop for delaying,
-reordering, rerouting, or padding messages?  To what extent should this be done
-automatically, how much should be configured as a per tunnel or per hop setting,
-and how should the tunnel's creator (and in turn, user) control this operation?
-All of this is left as unknown, to be worked out for 
-<a href="http://www.i2p.net/roadmap#3.0">I2P 3.0</a></p>
diff --git a/router/doc/udp.html b/router/doc/udp.html
deleted file mode 100644
index 4a855ece99cef2eb4650ed2c7d73296ba223e4b5..0000000000000000000000000000000000000000
--- a/router/doc/udp.html
+++ /dev/null
@@ -1,759 +0,0 @@
-<code>$Id: udp.html,v 1.19 2006/02/15 00:33:32 jrandom Exp $</code>
-
-<h1>Secure Semireliable UDP (SSU)</h1>
-<b>DRAFT</b>
-
-<p>
-The goal of this protocol is to provide secure, authenticated,
-semireliable, and unordered message delivery, exposing only a minimal
-amount of data easily discernible to third parties.  It should 
-support high degree communication as well as TCP-friendly congestion
-control, and may include PMTU detection.   It should be capable of
-efficiently moving bulk data at rates sufficient for home users.
-In addition, it should support techniques for addressing network 
-obstacles, like most NATs or firewalls.</p>
-
-<h2><a name="addressing">Addressing and introduction</a></h2>
-
-<p>To contact an SSU peer, one of two sets of information is necessary:
-a direct address, for when the peer is publicly reachable, or an 
-indirect address, for using a third party to introduce the peer.  
-There is no restriction on the number of addresses a peer may have.</p>
-
-<pre>
-    Direct: ssu://host:port/introKey[?opts=[A-Z]*]
-  Indirect: ssu://tag@relayhost:port/relayIntroKey/targetIntroKey[?opts=[A-Z]*]
-</pre>
-
-<p>These introduction keys are delivered through an external channel 
-and must be used when establishing a session key.  For the indirect
-address, the peer must first contact the relayhost and ask them for
-an introduction to the peer known at that relayhost under the given
-tag.  If possible, the relayhost sends a message to the addressed
-peer telling them to contact the requesting peer, and also gives 
-the requesting peer the IP and port on which the addressed peer is
-located.  In addition, the peer establishing the connection must 
-already know the public keys of the peer they are connecting to (but
-not necessary to any intermediary relay peer).</p>
-
-<p>Each of the addresses may also expose a series of options - special
-capabilities of that particular peer.  For a list of available
-capabilities, see <a href="#capabilities">below</a>.</p>
-
-<h2><a name="header">Header</a></h2>
-
-<p>All UDP datagrams begin with a MAC and an IV, followed by a variable
-size payload encrypted with the appropriate key.  The MAC used is 
-HMAC-MD5, truncated to 16 bytes, while the key is a full AES256 
-key.  The specific construct of the MAC is the first 16 bytes from:</p>
-<pre>
-  HMAC-MD5(payload || IV || (payloadLength ^ protocolVersion), macKey)
-</pre>
-
-<p>The payload itself is AES256/CBC encrypted with the IV and the 
-sessionKey, with replay prevention addressed within its body, 
-explained below.  The payloadLength in the MAC is a 2 byte unsigned 
-integer in 2s complement.</p>
-  
-<p>The protocolVersion is a 2 byte unsigned integer in 2s complement,
-and currently set to 0.  Peers using a different protocol version will
-not be able to communicate with this peer, though earlier versions not
-using this flag are.</p>
-
-<h2><a name="payload">Payload</a></h2>
-
-<p>Within the AES encrypted payload, there is a minimal common structure
-to the various messages - a one byte flag and a four byte sending 
-timestamp (*seconds* since the unix epoch).  The flag byte contains 
-the following bitfields:</p>
-<pre>
-  bits 0-3: payload type
-     bit 4: rekey?
-     bit 5: extended options included
-  bits 6-7: reserved
-</pre>
-
-<p>If the rekey flag is set, 64 bytes of keying material follow the 
-timestamp.  If the extended options flag is set, a one byte option 
-size value is appended to, followed by that many extended option 
-bytes, which are currently uninterpreted.</p>
-
-<p>When rekeying, the first 32 bytes of the keying material is fed 
-into a SHA256 to produce the new MAC key, and the next 32 bytes are
-fed into a SHA256 to produce the new session key, though the keys are
-not immediately used.  The other side should also reply with the 
-rekey flag set and that same keying material.  Once both sides have 
-sent and received those values, the new keys should be used and the 
-previous keys discarded.  It may be useful to keep the old keys 
-around briefly, to address packet loss and reordering.</p>
-
-<pre>
- Header: 37+ bytes
- +----+----+----+----+----+----+----+----+
- |                  MAC                  |
- |                                       |
- +----+----+----+----+----+----+----+----+
- |                   IV                  |
- |                                       |
- +----+----+----+----+----+----+----+----+
- |flag|        time       | (optionally  |
- +----+----+----+----+----+              |
- | this may have 64 byte keying material |
- | and/or a one+N byte extended options) |
- +---------------------------------------|
-</pre>
-
-<h2><a name="messages">Messages</a></h2>
-
-<h3><a name="sessionRequest">SessionRequest (type 0)</a></h3>
-<table border="1">
-<tr><td align="right" valign="top"><b>Peer:</b></td>
-    <td>Alice to Bob</td></tr>
-<tr><td align="right" valign="top"><b>Data:</b></td>
-    <td><ul>
-        <li>256 byte X, to begin the DH agreement</li>
-        <li>1 byte IP address size</li>
-        <li>that many byte representation of Bob's IP address</li>
-        <li>N bytes, currently uninterpreted (later, for challenges)</li>
-	</ul></td></tr>
-<tr><td align="right" valign="top"><b>Key used:</b></td>
-    <td>introKey</td></tr>
-</table>
-
-<pre>
- +----+----+----+----+----+----+----+----+
- |         X, as calculated from DH      |
- |                                       |
-                 .   .   .               
- |                                       |
- +----+----+----+----+----+----+----+----+
- |size| that many byte IP address (4-16) |
- +----+----+----+----+----+----+----+----+
- |           arbitrary amount            |
- |        of uninterpreted data          |
-                 .   .   .               
- |                                       |
- +----+----+----+----+----+----+----+----+
-</pre>
-
-<h3><a name="sessionCreated">SessionCreated (type 1)</a></h3>
-<table border="1">
-<tr><td align="right" valign="top"><b>Peer:</b></td>
-    <td>Bob to Alice</td></tr>
-<tr><td align="right" valign="top"><b>Data:</b></td>
-    <td><ul>
-        <li>256 byte Y, to complete the DH agreement</li>
-	<li>1 byte IP address size</li>
-	<li>that many byte representation of Alice's IP address</li>
-	<li>2 byte port number (unsigned, big endian 2s complement)</li>
-        <li>4 byte relay tag which Alice can publish (else 0x0)</li>
-        <li>4 byte timestamp (seconds from the epoch) for use in the DSA 
-            signature</li>
-        <li>40 byte DSA signature of the critical exchanged data 
-            (X + Y + Alice's IP + Alice's port + Bob's IP + Bob's port + Alice's
-            new relay tag + Bob's signed on time), encrypted with another 
-            layer of encryption using the negotiated sessionKey.  The IV 
-            is reused here.</li>
-        <li>8 bytes padding, encrypted with an additional layer of encryption
-            using the negotiated session key as part of the DSA block</li>
-        <li>N bytes, currently uninterpreted (later, for challenges)</li>
-	</ul></td></tr>
-<tr><td align="right" valign="top"><b>Key used:</b></td>
-    <td>introKey, with an additional layer of encryption over the 40 byte
-        signature and the following 8 bytes padding.</td></tr>
-</table>
-
-<pre>
- +----+----+----+----+----+----+----+----+
- |         Y, as calculated from DH      |
- |                                       |
-                 .   .   .               
- |                                       |
- +----+----+----+----+----+----+----+----+
- |size| that many byte IP address (4-16) |
- +----+----+----+----+----+----+----+----+
- | Port (A)| public relay tag  |  signed
- +----+----+----+----+----+----+----+----+
-   on time |                             |
- +----+----+                             |
- |              DSA signature            |
- |                                       |
- |                                       |
- |                                       |
- |         +----+----+----+----+----+----+
- |         |     (8 bytes of padding) 
- +----+----+----+----+----+----+----+----+
-           |                             |
- +----+----+                             |
- |           arbitrary amount            |
- |        of uninterpreted data          |
-                 .   .   .               
- |                                       |
- +----+----+----+----+----+----+----+----+
-</pre>
-
-<h3><a name="sessionConfirmed">SessionConfirmed (type 2)</a></h3>
-<table border="1">
-<tr><td align="right" valign="top"><b>Peer:</b></td>
-    <td>Alice to Bob</td></tr>
-<tr><td align="right" valign="top"><b>Data:</b></td>
-    <td><ul>
-        <li>1 byte identity fragment info:<pre>
-bits 0-3: current identity fragment #
-bits 4-7: total identity fragments</pre></li>
-        <li>2 byte size of the current identity fragment</li>
-        <li>that many byte fragment of Alice's identity.</li>
-        <li>on the last identity fragment, the signed on time is
-            included after the identity fragment, and the last 40 
-            bytes contain the DSA signature of the critical exchanged 
-            data (X + Y + Alice's IP + Alice's port + Bob's IP + Bob's port
-            + Alice's new relay key + Alice's signed on time)</li>
-        </ul></td></tr>
-<tr><td align="right" valign="top"><b>Key used:</b></td>
-    <td>sessionKey</td></tr>
-</table>
-
-<pre>
- <b>Fragment 1 through N-1</b>
- +----+----+----+----+----+----+----+----+
- |info| cursize |                        |
- +----+----+----+                        |
- |      fragment of Alice's full         |
- |            identity keys              |
-                 .   .   .               
- |                                       |
- +----+----+----+----+----+----+----+----+
- 
- <b>Fragment N:</b>
- +----+----+----+----+----+----+----+----+
- |info| cursize |                        |
- +----+----+----+                        |
- |      fragment of Alice's full         |
- |            identity keys              |
-                 .   .   .               
- |                                       |
- +----+----+----+----+----+----+----+----+
- |  signed on time   |                   |
- +----+----+----+----+                   |
- |  arbitrary amount of uninterpreted    |
- |        data, up from the end of the   |
- |  identity key to 40 bytes prior to    |
- |       end of the current packet       |
- +----+----+----+----+----+----+----+----+
- | DSA signature                         |
- |                                       |
- |                                       |
- |                                       |
- |                                       |
- +----+----+----+----+----+----+----+----+
-</pre>
- 
-<h3><a name="relayRequest">RelayRequest (type 3)</a></h3>
-<table border="1">
-<tr><td align="right" valign="top"><b>Peer:</b></td>
-    <td>Alice to Bob</td></tr>
-<tr><td align="right" valign="top"><b>Data:</b></td>
-    <td><ul>
-        <li>4 byte relay tag</li>
-        <li>1 byte IP address size</li>
-        <li>that many byte representation of Alice's IP address</li>
-        <li>2 byte port number (of Alice)</li>
-        <li>1 byte challenge size</li>
-        <li>that many bytes to be relayed to Charlie in the intro</li>
-        <li>Alice's intro key (so Bob can reply with Charlie's info)</li>
-        <li>4 byte nonce of alice's relay request</li>
-        <li>N bytes, currently uninterpreted</li>
-	</ul></td></tr>
-<tr><td align="right" valign="top"><b>Key used:</b></td>
-    <td>introKey (or sessionKey, if Alice/Bob is established)</td></tr>
-</table>
- 
-<pre>
- +----+----+----+----+----+----+----+----+
- |      relay tag    |size| that many    |
- +----+----+----+----+----+         +----|
- | bytes for Alice's IP address     |port
- +----+----+----+----+----+----+----+----+
-  (A) |size| that many challenge bytes   |
- +----+----+                             |
- | to be delivered to Charlie            |
- +----+----+----+----+----+----+----+----+
- | Alice's intro key                     |
- |                                       |
- |                                       |
- |                                       |
- +----+----+----+----+----+----+----+----+
- |       nonce       |                   |
- +----+----+----+----+                   |
- | arbitrary amount of uninterpreted data|
- +----+----+----+----+----+----+----+----+
-</pre>
-
-<h3><a name="relayResponse">RelayResponse (type 4)</a></h3>
-<table border="1">
-<tr><td align="right" valign="top"><b>Peer:</b></td>
-    <td>Bob to Alice</td></tr>
-<tr><td align="right" valign="top"><b>Data:</b></td>
-    <td><ul>
-        <li>1 byte IP address size</li>
-        <li>that many byte representation of Charlie's IP address</li>
-        <li>2 byte port number</li>
-        <li>1 byte IP address size</li>
-        <li>that many byte representation of Alice's IP address</li>
-        <li>2 byte port number</li>
-        <li>4 byte nonce sent by Alice</li>
-        <li>N bytes, currently uninterpreted</li>
-	</ul></td></tr>
-<tr><td align="right" valign="top"><b>Key used:</b></td>
-    <td>introKey (or sessionKey, if Alice/Bob is established)</td></tr>
-</table>
-
-<pre>
- +----+----+----+----+----+----+----+----+
- |size| that many bytes making up        |
- +----+                        +----+----+
- | Charlie's IP address        | Port (C)|
- +----+----+----+----+----+----+----+----+
- |size| that many bytes making up        |
- +----+                        +----+----+
- | Alice's IP address          | Port (A)|
- +----+----+----+----+----+----+----+----+
- |       nonce       |                   |
- +----+----+----+----+                   |
- | arbitrary amount of uninterpreted data|
- +----+----+----+----+----+----+----+----+
-</pre>
-
-<h3><a name="relayIntro">RelayIntro (type 5)</a></h3>
-<table border="1">
-<tr><td align="right" valign="top"><b>Peer:</b></td>
-    <td>Bob to Charlie</td></tr>
-<tr><td align="right" valign="top"><b>Data:</b></td>
-    <td><ul>
-        <li>1 byte IP address size</li>
-        <li>that many byte representation of Alice's IP address</li>
-        <li>2 byte port number (of Alice)</li>
-        <li>1 byte challenge size</li>
-        <li>that many bytes relayed from Alice</li>
-        <li>N bytes, currently uninterpreted</li>
-	</ul></td></tr>
-<tr><td align="right" valign="top"><b>Key used:</b></td>
-    <td>sessionKey</td></tr>
-</table>
-
-<pre>
- +----+----+----+----+----+----+----+----+
- |size| that many bytes making up        |
- +----+                        +----+----+
- | Alice's IP address          | Port (A)|
- +----+----+----+----+----+----+----+----+
- |size| that many bytes of challenge     |
- +----+                                  |
- | data relayed from Alice               |
- +----+----+----+----+----+----+----+----+
- | arbitrary amount of uninterpreted data|
- +----+----+----+----+----+----+----+----+
-</pre>
-
-<h3><a name="data">Data (type 6)</a></h3>
-<table border="1">
-<tr><td align="right" valign="top"><b>Peer:</b></td>
-    <td>Any</td></tr>
-<tr><td align="right" valign="top"><b>Data:</b></td>
-    <td><ul>
-        <li>1 byte flags:<pre>
-   bit 0: explicit ACKs included
-   bit 1: ACK bitfields included
-   bit 2: reserved
-   bit 3: explicit congestion notification
-   bit 4: request previous ACKs
-   bit 5: want reply
-   bit 6: extended data included
-   bit 7: reserved</pre></li>
-        <li>if explicit ACKs are included:<ul>
-	  <li>a 1 byte number of ACKs</li>
-          <li>that many 4 byte MessageIds being fully ACKed</li>
-	  </ul></li>
-        <li>if ACK bitfields are included:<ul>
-          <li>a 1 byte number of ACK bitfields</li>
-          <li>that many 4 byte MessageIds + a 1 or more byte ACK bitfield.
-              The bitfield uses the 7 low bits of each byte, with the high
-              bit specifying whether an additional bitfield byte follows it
-              (1 = true, 0 = the current bitfield byte is the last).  These
-              sequence of 7 bit arrays represent whether a fragment has been
-              received - if a bit is 1, the fragment has been received.  To 
-              clarify, assuming fragments 0, 2, 5, and 9 have been received,
-              the bitfield bytes would be as follows:<pre>
-byte 0
-   bit 0: 1 (further bitfield bytes follow)
-   bit 1: 1 (fragment 0 received)
-   bit 2: 0 (fragment 1 not received)
-   bit 3: 1 (fragment 2 received)
-   bit 4: 0 (fragment 3 not received)
-   bit 5: 0 (fragment 4 not received)
-   bit 6: 1 (fragment 5 received)
-   bit 7: 0 (fragment 6 not received)
-byte 1
-   bit 0: 0 (no further bitfield bytes)
-   bit 1: 0 (fragment 7 not received)
-   bit 1: 0 (fragment 8 not received)
-   bit 1: 1 (fragment 9 received)
-   bit 1: 0 (fragment 10 not received)
-   bit 1: 0 (fragment 11 not received)
-   bit 1: 0 (fragment 12 not received)
-   bit 1: 0 (fragment 13 not received)</pre></li>
-	  </ul></li>
-        <li>If extended data included:<ul>
-          <li>1 byte data size</li>
-          <li>that many bytes of extended data (currently uninterpreted)</li</ul></li>
-        <li>1 byte number of fragments</li>
-        <li>that many message fragments:<ul>
-          <li>4 byte messageId</li>
-          <li>3 byte fragment info:<pre>
-  bits 0-6: fragment #
-     bit 7: isLast (1 = true)
-  bits 8-9: unused
-bits 10-23: fragment size</pre></li>
-          <li>that many bytes</li></ul>
-        <li>N bytes padding, uninterpreted</li>
-	</ul></td></tr>
-<tr><td align="right" valign="top"><b>Key used:</b></td>
-    <td>sessionKey</td></tr>
-</table>
-
-<pre>
- +----+----+----+----+----+----+----+----+
- |flag| (additional headers, determined  |
- +----+                                  |
- | by the flags, such as ACKs or         |
- | bitfields                             |
- +----+----+----+----+----+----+----+----+
- |#frg|     messageId     |   frag info  |
- +----+----+----+----+----+----+----+----+
- | that many bytes of fragment data      |
-                  .  .  .                                       
- |                                       |
- +----+----+----+----+----+----+----+----+
- |     messageId     |   frag info  |    |
- +----+----+----+----+----+----+----+    |
- | that many bytes of fragment data      |
-                  .  .  .                                       
- |                                       |
- +----+----+----+----+----+----+----+----+
- |     messageId     |   frag info  |    |
- +----+----+----+----+----+----+----+    |
- | that many bytes of fragment data      |
-                  .  .  .                                       
- |                                       |
- +----+----+----+----+----+----+----+----+
- | arbitrary amount of uninterpreted data|
- +----+----+----+----+----+----+----+----+
-</pre>
-
-<h3><a name="peerTest">PeerTest (type 7)</a></h3>
-<table border="1">
-<tr><td align="right" valign="top"><b>Peer:</b></td>
-    <td><a href="#peerTesting">Any</a></td></tr>
-<tr><td align="right" valign="top"><b>Data:</b></td>
-    <td><ul>
-        <li>4 byte nonce</li>
-        <li>1 byte IP address size</li>
-        <li>that many byte representation of Alice's IP address</li>
-        <li>2 byte port number</li>
-        <li>Alice's introduction key</li>
-        <li>N bytes, currently uninterpreted</li>
-	</ul></td></tr>
-<tr><td align="right" valign="top"><b>Key used:</b></td>
-    <td>introKey (or sessionKey if the connection has already been established)</td></tr>
-</table>
-
-<pre>
- +----+----+----+----+----+----+----+----+
- |    test nonce     |size| that many    |
- +----+----+----+----+----+              |
- |bytes making up Alice's IP address     |
- |----+----+----+----+----+----+----+----+
- | Port (A)| Alice or Charlie's          |
- +----+----+                             |
- | introduction key (Alice's is sent to  |
- | Bob and Charlie, while Charlie's is   |                                      |
- | sent to Alice)                        |
- |         +----+----+----+----+----+----+
- |         | arbitrary amount of         |
- |----+----+                             |
- | uninterpreted data                    |
- +----+----+----+----+----+----+----+----+
-</pre>
-
-<h2><a name="congestioncontrol">Congestion control</a></h2>
-
-<p>SSU's need for only semireliable delivery, TCP-friendly operation,
-and the capacity for high throughput allows a great deal of latitude in
-congestion control.  The congestion control algorithm outlined below is
-meant to be both efficient in bandwidth as well as simple to implement.</p>
-
-<p>Packets are scheduled according to the the router's policy, taking care
-not to exceed the router's outbound capacity or to exceed the measured 
-capacity of the remote peer.  The measured capacity should operate along the
-lines of TCP's slow start and congestion avoidance, with additive increases
-to the sending capacity and multiplicative decreases in face of congestion.
-Veering away from TCP, however, routers may give up on some messages after
-a given period or number of retransmissions while continuing to transmit 
-other messages.</p>
-  
-<p>The congestion detection techniques vary from TCP as well, since each 
-message has its own unique and nonsequential identifier, and each message
-has a limited size - at most, 32KB.  To efficiently transmit this feedback
-to the sender, the receiver periodically includes a list of fully ACKed 
-message identifiers and may also include bitfields for partially received
-messages, where each bit represents the reception of a fragment.  If 
-duplicate fragments arrive, the message should be ACKed again, or if the
-message has still not been fully received, the bitfield should be 
-retransmitted with any new updates.</p>
-
-<p>The simplest possible implementation does not need to pad the packets to
-any particular size, but instead just places a single message fragment into
-a packet and sends it off (careful not to exceed the MTU).  A more efficient
-strategy would be to bundle multiple message fragments into the same packet,
-so long as it doesn't exceed the MTU, but this is not necessary.  Eventually,
-a set of fixed packet sizes may be appropriate to further hide the data 
-fragmentation to external adversaries, but the tunnel, garlic, and end to 
-end padding should be sufficient for most needs until then.</p>
-
-<h2><a name="keys">Keys</a></h2>
-
-<p>All encryption used is AES256/CBC with 32 byte keys and 16 byte IVs.
-The MAC and session keys are negotiated as part of the DH exchange, used
-for the HMAC and encryption, respectively.  Prior to the DH exchange, 
-the publicly knowable introKey is used for the MAC and encryption.</p>
-
-<p>When using the introKey, both the initial message and any subsequent
-reply use the introKey of the responder (Bob) - the responder does 
-not need to know the introKey of the requestor (Alice).  The DSA 
-signing key used by Bob should already be known to Alice when she 
-contacts him, though Alice's DSA key may not already be known by 
-Bob.</p>
-
-<p>Upon receiving a message, the receiver checks the from IP address 
-with any established sessions - if there is one or more matches,
-those session's MAC keys are tested sequentially in the HMAC.  If none
-of those verify or if there are no matching IP addresses, the 
-receiver tries their introKey in the MAC.  If that does not verify,
-the packet is dropped.  If it does verify, it is interpreted 
-according to the message type, though if the receiver is overloaded,
-it may be dropped anyway.</p>
-
-<p>If Alice and Bob have an established session, but Alice loses the 
-keys for some reason and she wants to contact Bob, she may at any 
-time simply establish a new session through the SessionRequest and
-related messages.  If Bob has lost the key but Alice does not know
-that, she will first attempt to prod him to reply, by sending a 
-DataMessage with the wantReply flag set, and if Bob continually 
-fails to reply, she will assume the key is lost and reestablish a 
-new one.</p>
-
-<p>For the DH key agreement,
-<a href="http://www.faqs.org/rfcs/rfc3526.html">RFC3526</a> 2048bit
-MODP group (#14) is used:</p>
-<pre>
-  p = 2^2048 - 2^1984 - 1 + 2^64 * { [2^1918 pi] + 124476 }
-  g = 2
-</pre>
-
-<p>The DSA p, q, and g are shared according to the scope of the 
-identity which created them.</p>
-
-<h2><a name="replay">Replay prevention</a></h2>
-
-<p>Replay prevention at the SSU layer occurs by rejecting packets 
-with exceedingly old timestamps or those which reuse an IV.  To
-detect duplicate IVs, a sequence of Bloom filters are employed to
-"decay" periodically so that only recently added IVs are detected.</p>
-
-<p>The messageIds used in DataMessages are defined at layers above
-the SSU transport and are passed through transparently.  These IDs
-are not in any particular order - in fact, they are likely to be
-entirely random.  The SSU layer makes no attempt at messageId 
-replay prevention - higher layers should take that into account.</p>
-
-<h2><a name="introduction">Introduction</a></h2>
-
-<p>Indirect session establishment by means of a third party introduction
-is necessary for efficient NAT traversal.  Charlie, a router behind a
-NAT or firewall which does not allow unsolicited inbound UDP packets,
-first contacts a few peers, choosing some to serve as introducers.  Each
-of these peers (Bob, Bill, Betty, etc) provide Charlie with an introduction
-tag - a 4 byte random number - which he then makes available to the public
-as methods of contacting him.  Alice, a router who has Charlie's published
-contact methods, first sends a RelayRequest packet to one or more of the 
-introducers, asking each to introduce her to Charlie (offering the 
-introduction tag to identify Charlie).  Bob then forwards a RelayIntro
-packet to Charlie including Alice's public IP and port number, then sends
-Alice back a RelayResponse packet containing Charlie's public IP and port
-number.  When Charlie receives the RelayIntro packet, he sends off a small
-random packet to Alice's IP and port (poking a hole in his NAT/firewall),
-and when Alice receive's Bob's RelayResponse packet, she begins a new 
-full direction session establishment with the specified IP and port.</p>
-
-<!-- 
-  should Bob wait for Charlie to ack the RelayIntro packet to avoid
-  situations where that packet is lost yet Alice gets Charlie's IP with
-  Charlie not yet punching a hole in his NAT for her to get through?  
-  Perhaps Alice should send to multiple Bobs at once, hoping that at
-  least one of them gets through
--->
-
-<h2><a name="peerTesting">Peer testing</a></h2>
-
-<p>The automation of collaborative reachability testing for peers is
-enabled by a sequence of PeerTest messages.  With its proper 
-execution, a peer will be able to determine their own reachability
-and may update its behavior accordingly.  The testing process is 
-quite simple:</p>
-
-<pre>
-        Alice                  Bob                  Charlie
-    PeerTest -------------------&gt;
-                             PeerTest--------------------&gt;
-                                &lt;-------------------PeerTest
-         &lt;-------------------PeerTest
-         &lt;------------------------------------------PeerTest
-    PeerTest------------------------------------------&gt;
-         &lt;------------------------------------------PeerTest
-</pre>
-
-<p>Each of the PeerTest messages carry a nonce identifying the
-test series itself, as initialized by Alice.  If Alice doesn't 
-get a particular message that she expects, she will retransmit
-accordingly, and based upon the data received or the messages
-missing, she will know her reachability.  The various end states
-that may be reached are as follows:</p>
-
-<ul>
-<li>If she doesn't receive a response from Bob, she will retransmit
-up to a certain number of times, but if no response ever arrives,
-she will know that her firewall or NAT is somehow misconfigured, 
-rejecting all inbound UDP packets even in direct response to an
-outbound packet.  Alternately, Bob may be down or unable to get 
-Charlie to reply.</li>
-
-<li>If Alice doesn't receive a PeerTest message with the 
-expected nonce from a third party (Charlie), she will retransmit
-her initial request to Bob up to a certain number of times, even
-if she has received Bob's reply already.  If Charlie's first message 
-still doesn't get through but Bob's does, she knows that she is
-behind a NAT or firewall that is rejecting unsolicited connection
-attempts and that port forwarding is not operating properly (the
-IP and port that Bob offered up should be forwarded).</li>
-
-<li>If Alice receives Bob's PeerTest message and both of Charlie's
-PeerTest messages but the enclosed IP and port numbers in Bob's 
-and Charlie's second messages don't match, she knows that she is 
-behind a symmetric NAT, rewriting all of her outbound packets with
-different 'from' ports for each peer contacted.  She will need to
-explicitly forward a port and always have that port exposed for 
-remote connectivity, ignoring further port discovery.</li>
-
-<li>If Alice receives Charlie's first message but not his second,
-she will retransmit her PeerTest message to Charlie up to a 
-certain number of times, but if no response is received she knows
-that Charlie is either confused or no longer online.</li>
-</ul>
-
-<p>Alice should choose Bob arbitrarily from known peers who seem
-to be capable of participating in peer tests.  Bob in turn should
-choose Charlie arbitrarily from peers that he knows who seem to be
-capable of participating in peer tests and who are on a different
-IP from both Bob and Alice.  If the first error condition occurs
-(Alice doesn't get PeerTest messages from Bob), Alice may decide
-to designate a new peer as Bob and try again with a different nonce.</p>
-
-<p>Alice's introduction key is included in all of the PeerTest 
-messages so that she doesn't need to already have an established
-session with Bob and so that Charlie can contact her without knowing
-any additional information.  Alice may go on to establish a session
-with either Bob or Charlie, but it is not required.</p>
-
-<h2><a name="messageSequences">Message sequences</a></h2>
-
-<h3><a name="establishDirect">Connection establishment (direct)</a></h3>
-
-<pre>
-        Alice                         Bob
-    SessionRequest---------------------&gt;
-          &lt;---------------------SessionCreated
-    SessionConfirmed-------------------&gt;
-    SessionConfirmed-------------------&gt;
-    SessionConfirmed-------------------&gt;
-    SessionConfirmed-------------------&gt;
-          &lt;--------------------------Data
-</pre>
-
-<h3><a name="establishIndirect">Connection establishment (indirect)</a></h3>
-
-<pre>
-        Alice                         Bob                  Charlie
-    RelayRequest ----------------------&gt;
-         &lt;--------------RelayResponse    RelayIntro-----------&gt;
-         &lt;--------------------------------------------Data (ignored)
-    SessionRequest--------------------------------------------&gt;
-         &lt;--------------------------------------------SessionCreated
-    SessionConfirmed------------------------------------------&gt;
-    SessionConfirmed------------------------------------------&gt;
-    SessionConfirmed------------------------------------------&gt;
-    SessionConfirmed------------------------------------------&gt;
-         &lt;---------------------------------------------------Data
-</pre>
-
-<h2><a name="sampleDatagrams">Sample datagrams</a></h2>
-
-<b>Minimal data message (no fragments, no ACKs, no NACKs, etc)</b><br />
-<i>(Size: 39 bytes)</i>
-
-<pre>
- +----+----+----+----+----+----+----+----+
- |                  MAC                  |
- |                                       |
- +----+----+----+----+----+----+----+----+
- |                   IV                  |
- |                                       |
- +----+----+----+----+----+----+----+----+
- |flag|        time       |flag|#frg|    |
- +----+----+----+----+----+----+----+    |
- |  padding to fit a full AES256 block   |
- +----+----+----+----+----+----+----+----+
-</pre>
-
-<b>Minimal data message with payload</b><br />
-<i>(Size: 46+fragmentSize bytes)</i>
-
-<pre>
- +----+----+----+----+----+----+----+----+
- |                  MAC                  |
- |                                       |
- +----+----+----+----+----+----+----+----+
- |                   IV                  |
- |                                       |
- +----+----+----+----+----+----+----+----+
- |flag|        time       |flag|#frg| 
- +----+----+----+----+----+----+----+----+
-   messageId    |   frag info  |         |
- +----+----+----+----+----+----+         |
- | that many bytes of fragment data      |
-                  .  .  .                                       
- |                                       |
- +----+----+----+----+----+----+----+----+
-</pre> 
-
-<h2><a name="capabilities">Peer capabilities</a></h2>
-
-<dl>
- <dt>B</dt>
- <dd>If the peer address contains the 'B' capability, that means 
-     they are willing and able to participate in peer tests as
-     a 'Bob' or 'Charlie'.</dd>
- <dt>C</dt>
- <dd>If the peer address contains the 'C' capability, that means
-     they are willing and able to serve as an introducer - serving
-     as a Bob for an otherwise unreachable Alice.</dd>
-</dl>
diff --git a/router/doc/udp.png b/router/doc/udp.png
deleted file mode 100644
index b4fd6241a1b9bc666f5e71fa498882ca60303cba..0000000000000000000000000000000000000000
Binary files a/router/doc/udp.png and /dev/null differ
diff --git a/router/java/build.xml b/router/java/build.xml
index 69f6b410946b8d74bab6cab22054a8073b49a9fa..e157dd25557d0a41488777e98634ccd5100a15fd 100644
--- a/router/java/build.xml
+++ b/router/java/build.xml
@@ -35,20 +35,51 @@
     <target name="compile" depends="depend, dependVersion">
         <mkdir dir="./build" />
         <mkdir dir="./build/obj" />
-        <javac srcdir="./src" debug="true" source="1.5" target="1.5" deprecation="on" destdir="./build/obj" classpath="../../core/java/build/i2p.jar" >
+        <javac srcdir="./src" debug="true" source="1.5" target="1.5" deprecation="on"
+               includeAntRuntime="false"
+               destdir="./build/obj" classpath="../../core/java/build/i2p.jar" >
             <compilerarg line="${javac.compilerargs}" />
         </javac>
     </target>
+
     <target name="compileTest" depends="builddeptest">
         <mkdir dir="./build" />
         <mkdir dir="./build/obj" />
-        <javac srcdir="./src:./test" debug="true" source="1.5" target="1.5" deprecation="on" destdir="./build/obj" classpath="../../core/java/build/i2ptest.jar" >
+        <!-- junit classes are in ant runtime -->
+        <javac srcdir="./src:./test" debug="true" source="1.5" target="1.5" deprecation="on"
+               includeAntRuntime="true"
+               destdir="./build/obj" classpath="../../core/java/build/i2ptest.jar" >
             <compilerarg line="${javac.compilerargs}" />
         </javac>
     </target>
-    <target name="jar" depends="compile">
-        <jar destfile="./build/router.jar" basedir="./build/obj" includes="**/*.class" />
-    </target>
+
+    <target name="jar" depends="compile, jarUpToDate" unless="jar.uptodate" >
+        <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="list" />
+            <arg value="changed" />
+            <arg value="." />
+        </exec>
+        <!-- \n in an attribute value generates an invalid manifest -->
+        <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" >
+            <arg value="-s" />
+            <arg value="[:space:]" />
+            <arg value="," />
+        </exec>
+        <jar destfile="./build/router.jar" basedir="./build/obj" includes="**/*.class" >
+            <manifest>
+                <attribute name="Build-Date" value="${build.timestamp}" />
+                <attribute name="Base-Revision" value="${workspace.version}" />
+                <attribute name="Workspace-Changes" value="${workspace.changes.tr}" />
+            </manifest>
+        </jar>
+    </target>
+
+    <target name="jarUpToDate">
+        <uptodate property="jar.uptodate" targetfile="build/router.jar" >
+            <srcfiles dir= "." includes="build/obj/**/*.class" />
+        </uptodate>
+    </target>
+
     <target name="jarTest" depends="compileTest">
         <jar destfile="./build/routertest.jar" basedir="./build/obj" includes="**/*.class" />
     </target>
diff --git a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java
index 0a2ee498b7c163c13292cbe7cda582c0044bfe92..b0a4cfc6d1ddbfdf9b781f74ff3f9493e35d6b97 100644
--- a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java
@@ -12,6 +12,7 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 
 import net.i2p.I2PAppContext;
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Hash;
@@ -28,59 +29,39 @@ import net.i2p.data.TunnelId;
 public class DatabaseStoreMessage extends I2NPMessageImpl {
     public final static int MESSAGE_TYPE = 1;
     private Hash _key;
-    private int _type;
-    private LeaseSet _leaseSet;
-    private RouterInfo _info;
-    private byte[] _leaseSetCache;
-    private byte[] _routerInfoCache;
+    private DatabaseEntry _dbEntry;
+    private byte[] _byteCache;
     private long _replyToken;
     private TunnelId _replyTunnel;
     private Hash _replyGateway;
     
-    public final static int KEY_TYPE_ROUTERINFO = 0;
-    public final static int KEY_TYPE_LEASESET = 1;
-    
     public DatabaseStoreMessage(I2PAppContext context) {
         super(context);
-        setValueType(-1);
     }
     
     /**
      * Defines the key in the network database being stored
      *
      */
-    public Hash getKey() { return _key; }
-    public void setKey(Hash key) { _key = key; }
-    
-    /**
-     * Defines the router info value in the network database being stored
-     *
-     */
-    public RouterInfo getRouterInfo() { return _info; }
-    public void setRouterInfo(RouterInfo routerInfo) {
-        _info = routerInfo;
-        if (_info != null)
-            setValueType(KEY_TYPE_ROUTERINFO);
+    public Hash getKey() {
+        if (_key != null)
+            return _key;   // receive
+        if (_dbEntry != null)
+            return _dbEntry.getHash();   // create
+        return null;
     }
     
     /**
-     * Defines the lease set value in the network database being stored
-     *
+     * Defines the entry in the network database being stored
      */
-    public LeaseSet getLeaseSet() { return _leaseSet; }
-    public void setLeaseSet(LeaseSet leaseSet) {
-        _leaseSet = leaseSet;
-        if (_leaseSet != null)
-            setValueType(KEY_TYPE_LEASESET);
-    }
-    
+    public DatabaseEntry getEntry() { return _dbEntry; }
+
     /**
-     * Defines type of key being stored in the network database -
-     * either KEY_TYPE_ROUTERINFO or KEY_TYPE_LEASESET
-     *
+     * This also sets the key
      */
-    public int getValueType() { return _type; }
-    public void setValueType(int type) { _type = type; }
+    public void setEntry(DatabaseEntry entry) {
+        _dbEntry = entry;
+    }
     
     /**
      * If a reply is desired, this token specifies the message ID that should
@@ -90,6 +71,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl {
      * @return positive reply token ID, or 0 if no reply is necessary.
      */
     public long getReplyToken() { return _replyToken; }
+
     /**
      * Update the reply token.
      *
@@ -113,13 +95,10 @@ public class DatabaseStoreMessage extends I2NPMessageImpl {
         if (type != MESSAGE_TYPE) throw new I2NPMessageException("Message type is incorrect for this message");
         int curIndex = offset;
         
-        //byte keyData[] = new byte[Hash.HASH_LENGTH];
-        //System.arraycopy(data, curIndex, keyData, 0, Hash.HASH_LENGTH);
         _key = Hash.create(data, curIndex);
         curIndex += Hash.HASH_LENGTH;
-        //_key = new Hash(keyData);
         
-        _type = (int)DataHelper.fromLong(data, curIndex, 1);
+        type = (int)DataHelper.fromLong(data, curIndex, 1);
         curIndex++;
         
         _replyToken = DataHelper.fromLong(data, curIndex, 4);
@@ -131,39 +110,38 @@ public class DatabaseStoreMessage extends I2NPMessageImpl {
                 _replyTunnel = new TunnelId(tunnel);
             curIndex += 4;
             
-            //byte gw[] = new byte[Hash.HASH_LENGTH];
-            //System.arraycopy(data, curIndex, gw, 0, Hash.HASH_LENGTH);
             _replyGateway = Hash.create(data, curIndex);
             curIndex += Hash.HASH_LENGTH;
-            //_replyGateway = new Hash(gw);
         } else {
             _replyTunnel = null;
             _replyGateway = null;
         }
         
-        if (_type == KEY_TYPE_LEASESET) {
-            _leaseSet = new LeaseSet();
+        if (type == DatabaseEntry.KEY_TYPE_LEASESET) {
+            _dbEntry = new LeaseSet();
             try {
-                _leaseSet.readBytes(new ByteArrayInputStream(data, curIndex, data.length-curIndex));
+                _dbEntry.readBytes(new ByteArrayInputStream(data, curIndex, data.length-curIndex));
             } catch (DataFormatException dfe) {
                 throw new I2NPMessageException("Error reading the leaseSet", dfe);
             }
-        } else if (_type == KEY_TYPE_ROUTERINFO) {
-            _info = new RouterInfo();
+        } else if (type == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
+            _dbEntry = new RouterInfo();
             int compressedSize = (int)DataHelper.fromLong(data, curIndex, 2);
             curIndex += 2;
             
             try {
                 byte decompressed[] = DataHelper.decompress(data, curIndex, compressedSize);
-                _info.readBytes(new ByteArrayInputStream(decompressed));
+                _dbEntry.readBytes(new ByteArrayInputStream(decompressed));
             } catch (DataFormatException dfe) {
                 throw new I2NPMessageException("Error reading the routerInfo", dfe);
             } catch (IOException ioe) {
                 throw new I2NPMessageException("Compressed routerInfo was corrupt", ioe);
             }
         } else {
-            throw new I2NPMessageException("Invalid type of key read from the structure - " + _type);
+            throw new I2NPMessageException("Invalid type of key read from the structure - " + type);
         }
+        //if (!key.equals(_dbEntry.getHash()))
+        //    throw new I2NPMessageException("Hash mismatch in DSM");
     }
     
     
@@ -172,28 +150,28 @@ public class DatabaseStoreMessage extends I2NPMessageImpl {
         int len = Hash.HASH_LENGTH + 1 + 4; // key+type+replyToken
         if (_replyToken > 0) 
             len += 4 + Hash.HASH_LENGTH; // replyTunnel+replyGateway
-        if (_type == KEY_TYPE_LEASESET) {
-            _leaseSetCache = _leaseSet.toByteArray();
-            len += _leaseSetCache.length;
-        } else if (_type == KEY_TYPE_ROUTERINFO) {
-            byte uncompressed[] = _info.toByteArray();
-            byte compressed[] = DataHelper.compress(uncompressed);
-            _routerInfoCache = compressed;
-            len += compressed.length + 2;
+        if (_dbEntry.getType() == DatabaseEntry.KEY_TYPE_LEASESET) {
+            _byteCache = _dbEntry.toByteArray();
+        } else if (_dbEntry.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
+            byte uncompressed[] = _dbEntry.toByteArray();
+            _byteCache = DataHelper.compress(uncompressed);
+            len += 2;
         }
+        len += _byteCache.length;
         return len;
     }
+
     /** write the message body to the output array, starting at the given index */
     protected int writeMessageBody(byte out[], int curIndex) throws I2NPMessageException {
-        if (_key == null) throw new I2NPMessageException("Invalid key");
-        if ( (_type != KEY_TYPE_LEASESET) && (_type != KEY_TYPE_ROUTERINFO) ) throw new I2NPMessageException("Invalid key type");
-        if ( (_type == KEY_TYPE_LEASESET) && (_leaseSet == null) ) throw new I2NPMessageException("Missing lease set");
-        if ( (_type == KEY_TYPE_ROUTERINFO) && (_info == null) ) throw new I2NPMessageException("Missing router info");
+        if (_dbEntry == null) throw new I2NPMessageException("Missing entry");
+        int type = _dbEntry.getType();
+        if (type != DatabaseEntry.KEY_TYPE_LEASESET && type != DatabaseEntry.KEY_TYPE_ROUTERINFO)
+            throw new I2NPMessageException("Invalid key type");
         
-        System.arraycopy(_key.getData(), 0, out, curIndex, Hash.HASH_LENGTH);
+        // Use the hash of the DatabaseEntry
+        System.arraycopy(getKey().getData(), 0, out, curIndex, Hash.HASH_LENGTH);
         curIndex += Hash.HASH_LENGTH;
-        byte type[] = DataHelper.toLong(1, _type);
-        out[curIndex++] = type[0];
+        out[curIndex++] = (byte) type;
         byte tok[] = DataHelper.toLong(4, _replyToken);
         System.arraycopy(tok, 0, out, curIndex, 4);
         curIndex += 4;
@@ -209,17 +187,14 @@ public class DatabaseStoreMessage extends I2NPMessageImpl {
             curIndex += Hash.HASH_LENGTH;
         }
         
-        if (_type == KEY_TYPE_LEASESET) {
-            // initialized in calculateWrittenLength
-            System.arraycopy(_leaseSetCache, 0, out, curIndex, _leaseSetCache.length);
-            curIndex += _leaseSetCache.length;
-        } else if (_type == KEY_TYPE_ROUTERINFO) {
-            byte len[] = DataHelper.toLong(2, _routerInfoCache.length);
+        // _byteCache initialized in calculateWrittenLength
+        if (type == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
+            byte len[] = DataHelper.toLong(2, _byteCache.length);
             out[curIndex++] = len[0];
             out[curIndex++] = len[1];
-            System.arraycopy(_routerInfoCache, 0, out, curIndex, _routerInfoCache.length);
-            curIndex += _routerInfoCache.length;
         }
+        System.arraycopy(_byteCache, 0, out, curIndex, _byteCache.length);
+        curIndex += _byteCache.length;
         return curIndex;
     }
     
@@ -228,9 +203,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl {
     @Override
     public int hashCode() {
         return DataHelper.hashCode(getKey()) +
-               DataHelper.hashCode(getLeaseSet()) +
-               DataHelper.hashCode(getRouterInfo()) +
-               getValueType() +
+               DataHelper.hashCode(_dbEntry) +
                (int)getReplyToken() +
                DataHelper.hashCode(getReplyTunnel()) +
                DataHelper.hashCode(getReplyGateway());
@@ -241,9 +214,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl {
         if ( (object != null) && (object instanceof DatabaseStoreMessage) ) {
             DatabaseStoreMessage msg = (DatabaseStoreMessage)object;
             return DataHelper.eq(getKey(),msg.getKey()) &&
-                   DataHelper.eq(getLeaseSet(),msg.getLeaseSet()) &&
-                   DataHelper.eq(getRouterInfo(),msg.getRouterInfo()) &&
-                   _type == msg.getValueType() &&
+                   DataHelper.eq(_dbEntry,msg.getEntry()) &&
                    getReplyToken() == msg.getReplyToken() &&
                    DataHelper.eq(getReplyTunnel(), msg.getReplyTunnel()) &&
                    DataHelper.eq(getReplyGateway(), msg.getReplyGateway());
@@ -259,9 +230,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl {
         buf.append("\n\tExpiration: ").append(getMessageExpiration());
         buf.append("\n\tUnique ID: ").append(getUniqueId());
         buf.append("\n\tKey: ").append(getKey());
-        buf.append("\n\tValue Type: ").append(getValueType());
-        buf.append("\n\tRouter Info: ").append(getRouterInfo());
-        buf.append("\n\tLease Set: ").append(getLeaseSet());
+        buf.append("\n\tEntry: ").append(_dbEntry);
         buf.append("\n\tReply token: ").append(getReplyToken());
         buf.append("\n\tReply tunnel: ").append(getReplyTunnel());
         buf.append("\n\tReply gateway: ").append(getReplyGateway());
diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
index 6b4ab71f4048065751cea8174b3d6d164b25ceee..eebb05f7e4ebdbf4c1fd618fdf7deaa76444535e 100644
--- a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
+++ b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
@@ -20,6 +20,7 @@ import net.i2p.data.DataHelper;
 import net.i2p.data.DataStructureImpl;
 import net.i2p.data.Hash;
 import net.i2p.util.Log;
+import net.i2p.util.SimpleByteCache;
 
 /**
  * Defines the base message implementation.
@@ -72,6 +73,7 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
      *  Read the header, then read the rest into buffer, then call
      *  readMessage in the implemented message type
      *
+     *<pre>
      *  Specifically:
      *    1 byte type (if caller didn't read already, as specified by the type param
      *    4 byte ID
@@ -79,9 +81,11 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
      *    2 byte size
      *    1 byte checksum
      *    size bytes of payload (read by readMessage() in implementation)
+     *</pre>
      *
      *  @param type the message type or -1 if we should read it here
      *  @param buffer temp buffer to use
+     *  @return total length of the message
      */
     public int readBytes(InputStream in, int type, byte buffer[]) throws I2NPMessageException, IOException {
         try {
@@ -110,24 +114,44 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
                 cur += numRead;
             }
             
-            Hash calc = _context.sha().calculateHash(buffer, 0, size);
+            byte[] calc = SimpleByteCache.acquire(Hash.HASH_LENGTH);
+            _context.sha().calculateHash(buffer, 0, size, calc, 0);
             //boolean eq = calc.equals(h);
-            boolean eq = DataHelper.eq(checksum, 0, calc.getData(), 0, CHECKSUM_LENGTH);
+            boolean eq = DataHelper.eq(checksum, 0, calc, 0, CHECKSUM_LENGTH);
+            SimpleByteCache.release(calc);
             if (!eq)
                 throw new I2NPMessageException("Hash does not match for " + getClass().getName());
 
-            long start = _context.clock().now();
+            //long start = _context.clock().now();
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Reading bytes: type = " + type + " / uniqueId : " + _uniqueId + " / expiration : " + _expiration);
             readMessage(buffer, 0, size, type);
             //long time = _context.clock().now() - start;
             //if (time > 50)
             //    _context.statManager().addRateData("i2np.readTime", time, time);
-            return size + Hash.HASH_LENGTH + 1 + 4 + DataHelper.DATE_LENGTH;
+            return CHECKSUM_LENGTH + 1 + 2 + 4 + DataHelper.DATE_LENGTH + size;
         } catch (DataFormatException dfe) {
             throw new I2NPMessageException("Error reading the message header", dfe);
         }
     }
+
+    /**
+     *  Read the header, then read the rest into buffer, then call
+     *  readMessage in the implemented message type
+     *
+     *<pre>
+     *  Specifically:
+     *    1 byte type (if caller didn't read already, as specified by the type param
+     *    4 byte ID
+     *    8 byte expiration
+     *    2 byte size
+     *    1 byte checksum
+     *    size bytes of payload (read by readMessage() in implementation)
+     *</pre>
+     *
+     *  @param type the message type or -1 if we should read it here
+     *  @return total length of the message
+     */
     public int readBytes(byte data[], int type, int offset) throws I2NPMessageException, IOException {
         int cur = offset;
         if (type < 0) {
@@ -153,13 +177,14 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
                                            + " cur=" + cur 
                                            + " wanted=" + size + "]: " + getClass().getName());
 
-        Hash calc = _context.sha().calculateHash(data, cur, size);
-        //boolean eq = calc.equals(h);
-        boolean eq = DataHelper.eq(hdata, 0, calc.getData(), 0, CHECKSUM_LENGTH);
+        byte[] calc = SimpleByteCache.acquire(Hash.HASH_LENGTH);
+        _context.sha().calculateHash(data, cur, size, calc, 0);
+        boolean eq = DataHelper.eq(hdata, 0, calc, 0, CHECKSUM_LENGTH);
+        SimpleByteCache.release(calc);
         if (!eq)
             throw new I2NPMessageException("Hash does not match for " + getClass().getName());
 
-        long start = _context.clock().now();
+        //long start = _context.clock().now();
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Reading bytes: type = " + type + " / uniqueId : " + _uniqueId + " / expiration : " + _expiration);
         readMessage(data, cur, size, type);
@@ -215,7 +240,7 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
     }
     
     public int toByteArray(byte buffer[]) {
-        long start = _context.clock().now();
+        //long start = _context.clock().now();
 
         int prefixLen = 1 // type
                         + 4 // uniqueId
@@ -231,7 +256,8 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
         try {
             int writtenLen = writeMessageBody(buffer, prefixLen);
             int payloadLen = writtenLen - prefixLen;
-            Hash h = _context.sha().calculateHash(buffer, prefixLen, payloadLen);
+            byte[] h = SimpleByteCache.acquire(Hash.HASH_LENGTH);
+            _context.sha().calculateHash(buffer, prefixLen, payloadLen, h, 0);
 
             int off = 0;
             DataHelper.toLong(buffer, off, 1, getType());
@@ -242,7 +268,8 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
             off += DataHelper.DATE_LENGTH;
             DataHelper.toLong(buffer, off, 2, payloadLen);
             off += 2;
-            System.arraycopy(h.getData(), 0, buffer, off, CHECKSUM_LENGTH);
+            System.arraycopy(h, 0, buffer, off, CHECKSUM_LENGTH);
+            SimpleByteCache.release(h);
 
             //long time = _context.clock().now() - start;
             //if (time > 50)
diff --git a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java
index 1ac01d0a6c87772a14604d72716473522ef07d2e..ef4930594f0f0491d17e18341dfb6803370b8d72 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java
@@ -160,7 +160,7 @@ public class TunnelDataMessage extends I2NPMessageImpl {
     /** write the message body to the output array, starting at the given index */
     protected int writeMessageBody(byte out[], int curIndex) throws I2NPMessageException {
         if ( (_tunnelId <= 0) || (_data == null) )
-            throw new I2NPMessageException("Not enough data to write out (id=" + _tunnelId + " data=" + _data + ")");
+            throw new I2NPMessageException("Not enough data to write out (id=" + _tunnelId + ")");
         if (_data.length <= 0) 
             throw new I2NPMessageException("Not enough data to write out (data.length=" + _data.length + ")");
 
diff --git a/router/java/src/net/i2p/router/Blocklist.java b/router/java/src/net/i2p/router/Blocklist.java
index d401f1532ee9352acc207664662ba1b44e71eaa5..8027ac007dbbb080495c93196032ad5fd25cf813 100644
--- a/router/java/src/net/i2p/router/Blocklist.java
+++ b/router/java/src/net/i2p/router/Blocklist.java
@@ -59,7 +59,7 @@ import net.i2p.util.Log;
  *
  */
 public class Blocklist {
-    private Log _log;
+    private final Log _log;
     private RouterContext _context;
     private long _blocklist[];
     private int _blocklistSize;
@@ -72,15 +72,11 @@ public class Blocklist {
     public Blocklist(RouterContext context) {
         _context = context;
         _log = context.logManager().getLog(Blocklist.class);
-        _blocklist = null;
-        _blocklistSize = 0;
-        _wrapSave = null;
     }
     
+    /** only for testing with main() */
     public Blocklist() {
         _log = new Log(Blocklist.class);
-        _blocklist = null;
-        _blocklistSize = 0;
     }
     
     static final String PROP_BLOCKLIST_ENABLED = "router.blocklist.enable";
@@ -683,7 +679,7 @@ public class Blocklist {
             return;
         Job job = new ShitlistJob(peer);
         if (number > 0)
-            job.getTiming().setStartAfter(_context.clock().now() + (number * 30*1000));
+            job.getTiming().setStartAfter(_context.clock().now() + (30*1000l * number));
         _context.jobQueue().addJob(job);
     }
 
diff --git a/router/java/src/net/i2p/router/ClientMessage.java b/router/java/src/net/i2p/router/ClientMessage.java
index ec7820d696a47e8ff065f216e025b85d208d5c91..5b5a228a199c2e0117afcca2937e68265ed405dc 100644
--- a/router/java/src/net/i2p/router/ClientMessage.java
+++ b/router/java/src/net/i2p/router/ClientMessage.java
@@ -28,16 +28,10 @@ public class ClientMessage {
     private Hash _destinationHash;
     private MessageId _messageId;
     private long _expiration;
+    /** only for outbound messages */
+    private int _flags;
     
     public ClientMessage() {
-	setPayload(null);
-	setDestination(null);
-	setFromDestination(null);
-	setReceptionInfo(null);
-	setSenderConfig(null);
-	setDestinationHash(null);
-	setMessageId(null);
-        setExpiration(0);
     }
     
     /**
@@ -101,4 +95,17 @@ public class ClientMessage {
      */
     public long getExpiration() { return _expiration; }
     public void setExpiration(long e) { _expiration = e; }
+
+    /**
+     * Flags requested by the client that sent the message.  This will only be available
+     * for locally originated messages.
+     *
+     * @since 0.8.4
+     */
+    public int getFlags() { return _flags; }
+
+    /**
+     * @since 0.8.4
+     */
+    public void setFlags(int f) { _flags = f; }
 }
diff --git a/router/java/src/net/i2p/router/ClientMessagePool.java b/router/java/src/net/i2p/router/ClientMessagePool.java
index f4dfd0e4402b1a4e802bff5fda1f2312a9d4e554..750c76915eea8188661749d542d7a8bebbe3f005 100644
--- a/router/java/src/net/i2p/router/ClientMessagePool.java
+++ b/router/java/src/net/i2p/router/ClientMessagePool.java
@@ -23,12 +23,13 @@ import net.i2p.util.Log;
  *
  */
 public class ClientMessagePool {
-    private Log _log;
-    private RouterContext _context;
+    private final Log _log;
+    private final RouterContext _context;
     
     public ClientMessagePool(RouterContext context) {
         _context = context;
         _log = _context.logManager().getLog(ClientMessagePool.class);
+        OutboundClientMessageOneShotJob.init(_context);
     }
   
     /**
@@ -65,6 +66,7 @@ public class ClientMessagePool {
         }
     }
     
+/******
     private boolean isGuaranteed(ClientMessage msg) {
         Properties opts = null;
         if (msg.getSenderConfig() != null)
@@ -76,4 +78,5 @@ public class ClientMessagePool {
             return false;
         }
     }
+******/
 }
diff --git a/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java
index 6031cf630e26c2a64f424c2c28ce593951e5e74e..0f06f507cc854b7fd1557f8c150af8f71052cbda 100644
--- a/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java
@@ -16,6 +16,7 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterInfo;
@@ -36,6 +37,7 @@ class DummyNetworkDatabaseFacade extends NetworkDatabaseFacade {
         _routers.put(info.getIdentity().getHash(), info);
     }
     
+    public DatabaseEntry lookupLocally(Hash key) { return null; }
     public void lookupLeaseSet(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs) {}
     public LeaseSet lookupLeaseSetLocally(Hash key) { return null; }
     public void lookupRouterInfo(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs) {
diff --git a/router/java/src/net/i2p/router/InNetMessagePool.java b/router/java/src/net/i2p/router/InNetMessagePool.java
index 47b799da5cc09c1d5a93836f866cc20eaeb2ff37..d6067b2b3690aaab90a1f84f9bb9adc00562be52 100644
--- a/router/java/src/net/i2p/router/InNetMessagePool.java
+++ b/router/java/src/net/i2p/router/InNetMessagePool.java
@@ -30,15 +30,17 @@ import net.i2p.util.Log;
  *
  */
 public class InNetMessagePool implements Service {
-    private Log _log;
-    private RouterContext _context;
-    private HandlerJobBuilder _handlerJobBuilders[];
+    private final Log _log;
+    private final RouterContext _context;
+    private final HandlerJobBuilder _handlerJobBuilders[];
+
     /** following 5 unused unless DISPATCH_DIRECT == false */
     private final List _pendingDataMessages;
     private final List _pendingDataMessagesFrom;
     private final List _pendingGatewayMessages;
     private SharedShortCircuitDataJob _shortCircuitDataJob;
     private SharedShortCircuitGatewayJob _shortCircuitGatewayJob;
+
     private boolean _alive;
     private boolean _dispatchThreaded;
     
@@ -79,7 +81,6 @@ public class InNetMessagePool implements Service {
             _shortCircuitGatewayJob = new SharedShortCircuitGatewayJob(context);
         }
         _log = _context.logManager().getLog(InNetMessagePool.class);
-        _alive = false;
         _context.statManager().createRateStat("inNetPool.dropped", "How often do we drop a message", "InNetPool", new long[] { 60*60*1000l });
         _context.statManager().createRateStat("inNetPool.droppedDeliveryStatusDelay", "How long after a delivery status message is created do we receive it back again (for messages that are too slow to be handled)", "InNetPool", new long[] { 60*60*1000l });
         _context.statManager().createRateStat("inNetPool.duplicate", "How often do we receive a duplicate message", "InNetPool", new long[] { 60*60*1000l });
@@ -87,12 +88,20 @@ public class InNetMessagePool implements Service {
         _context.statManager().createRateStat("inNetPool.droppedDbLookupResponseMessage", "How often we drop a slow-to-arrive db search response", "InNetPool", new long[] { 60*60*1000l });
     }
   
+    /**
+     * @return previous builder for this message type, or null
+     * @throws AIOOBE if i2npMessageType is greater than MAX_I2NP_MESSAGE_TYPE
+     */
     public HandlerJobBuilder registerHandlerJobBuilder(int i2npMessageType, HandlerJobBuilder builder) {
         HandlerJobBuilder old = _handlerJobBuilders[i2npMessageType];
         _handlerJobBuilders[i2npMessageType] = builder;
         return old;
     }
   
+    /**
+     * @return previous builder for this message type, or null
+     * @throws AIOOBE if i2npMessageType is greater than MAX_I2NP_MESSAGE_TYPE
+     */
     public HandlerJobBuilder unregisterHandlerJobBuilder(int i2npMessageType) {
         HandlerJobBuilder old = _handlerJobBuilders[i2npMessageType];
         _handlerJobBuilders[i2npMessageType] = null;
@@ -100,12 +109,14 @@ public class InNetMessagePool implements Service {
     }
     
     /**
-     * Add a new message to the pool, returning the number of messages in the 
-     * pool so that the comm system can throttle inbound messages.  If there is 
+     * Add a new message to the pool.
+     * If there is 
      * a HandlerJobBuilder for the inbound message type, the message is loaded
      * into a job created by that builder and queued up for processing instead
      * (though if the builder doesn't create a job, it is added to the pool)
      *
+     * @return -1 for some types of errors but not all; 0 otherwise
+     *         (was queue length, long ago)
      */
     public int add(I2NPMessage messageBody, RouterIdentity fromRouter, Hash fromRouterHash) {
         long exp = messageBody.getMessageExpiration();
diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java
index f56b25f9edb35a091c33a6750165be187b8d52ad..7f5cb008fe2fb53dbc4dbab50b393059f7c1afc4 100644
--- a/router/java/src/net/i2p/router/JobQueue.java
+++ b/router/java/src/net/i2p/router/JobQueue.java
@@ -34,22 +34,22 @@ import net.i2p.util.Log;
  *
  */
 public class JobQueue {
-    private Log _log;
-    private RouterContext _context;
+    private final Log _log;
+    private final RouterContext _context;
     
     /** Integer (runnerId) to JobQueueRunner for created runners */
     private final Map<Integer, JobQueueRunner> _queueRunners;
     /** a counter to identify a job runner */
     private volatile static int _runnerId = 0;
     /** list of jobs that are ready to run ASAP */
-    private BlockingQueue<Job> _readyJobs;
+    private final BlockingQueue<Job> _readyJobs;
     /** list of jobs that are scheduled for running in the future */
-    private List<Job> _timedJobs;
+    private final List<Job> _timedJobs;
     /** job name to JobStat for that job */
     private final Map<String, JobStats> _jobStats;
     /** how many job queue runners can go concurrently */
     private int _maxRunners = 1; 
-    private QueuePumper _pumper;
+    private final QueuePumper _pumper;
     /** will we allow the # job runners to grow beyond 1? */
     private boolean _allowParallelOperation;
     /** have we been killed or are we alive? */
@@ -61,6 +61,8 @@ public class JobQueue {
     private static final int RUNNERS;
     static {
         long maxMemory = Runtime.getRuntime().maxMemory();
+        if (maxMemory == Long.MAX_VALUE)
+            maxMemory = 128*1024*1024l;
         if (maxMemory < 64*1024*1024)
             RUNNERS = 3;
         else if (maxMemory < 256*1024*1024)
@@ -208,7 +210,7 @@ public class JobQueue {
      * <code>false</code> if the job is finished or doesn't exist in the queue.
      */
     public boolean isJobActive(Job job) {
-        if (_readyJobs.contains(job) | _timedJobs.contains(job))
+        if (_readyJobs.contains(job) || _timedJobs.contains(job))
             return true;
         for (JobQueueRunner runner: _queueRunners.values())
             if (runner.getCurrentJob() == job)
@@ -227,10 +229,14 @@ public class JobQueue {
     }
 
     public long getMaxLag() { 
+            // first job is the one that has been waiting the longest
             Job j = _readyJobs.peek();
             if (j == null) return 0;
-            // first job is the one that has been waiting the longest
-            long startAfter = j.getTiming().getStartAfter();
+            JobTiming jt = j.getTiming();
+            // PoisonJob timing is null, prevent NPE at shutdown
+            if (jt == null)
+                return 0;
+            long startAfter = jt.getStartAfter();
             return _context.clock().now() - startAfter;
     }
     
@@ -689,7 +695,7 @@ public class JobQueue {
         TreeMap<Long, Job> ordered = new TreeMap();
         for (int i = 0; i < timedJobs.size(); i++) {
             Job j = timedJobs.get(i);
-            ordered.put(new Long(j.getTiming().getStartAfter()), j);
+            ordered.put(Long.valueOf(j.getTiming().getStartAfter()), j);
         }
         for (Iterator<Job> iter = ordered.values().iterator(); iter.hasNext(); ) {
             Job j = iter.next();
diff --git a/router/java/src/net/i2p/router/JobQueueRunner.java b/router/java/src/net/i2p/router/JobQueueRunner.java
index ca0ee3f1bccf7a71e80f1f4bedc438bf2dc1ef12..e9b0d08fb99d921a166be0c944e7d20be9d28eb0 100644
--- a/router/java/src/net/i2p/router/JobQueueRunner.java
+++ b/router/java/src/net/i2p/router/JobQueueRunner.java
@@ -4,10 +4,10 @@ import net.i2p.util.Log;
 
 /** a do run run run a do run run */
 class JobQueueRunner implements Runnable {
-    private Log _log;
-    private RouterContext _context;
+    private final Log _log;
+    private final RouterContext _context;
     private boolean _keepRunning;
-    private int _id;
+    private final int _id;
     private long _numJobs;
     private Job _currentJob;
     private Job _lastJob;
@@ -19,9 +19,6 @@ class JobQueueRunner implements Runnable {
         _context = context;
         _id = id;
         _keepRunning = true;
-        _numJobs = 0;
-        _currentJob = null;
-        _lastJob = null;
         _log = _context.logManager().getLog(JobQueueRunner.class);
         _context.statManager().createRateStat("jobQueue.jobRun", "How long jobs take", "JobQueue", new long[] { 60*60*1000l, 24*60*60*1000l });
         _context.statManager().createRateStat("jobQueue.jobRunSlow", "How long jobs that take over a second take", "JobQueue", new long[] { 60*60*1000l, 24*60*60*1000l });
diff --git a/router/java/src/net/i2p/router/JobStats.java b/router/java/src/net/i2p/router/JobStats.java
index 19362cff371a623abc7a16067756f965fda0c775..f9cfdc9cc753e40b42351456ddbdf3dcffa867d2 100644
--- a/router/java/src/net/i2p/router/JobStats.java
+++ b/router/java/src/net/i2p/router/JobStats.java
@@ -4,7 +4,7 @@ import net.i2p.data.DataHelper;
 
 /** glorified struct to contain basic job stats */
 class JobStats {
-    private String _job;
+    private final String _job;
     private volatile long _numRuns;
     private volatile long _totalTime;
     private volatile long _maxTime;
diff --git a/router/java/src/net/i2p/router/JobTiming.java b/router/java/src/net/i2p/router/JobTiming.java
index d979074a6968c70f79e2d368caed3c9e565ba492..fd410f131d35dfd5a071a5aa4837860ba7045463 100644
--- a/router/java/src/net/i2p/router/JobTiming.java
+++ b/router/java/src/net/i2p/router/JobTiming.java
@@ -18,7 +18,7 @@ public class JobTiming implements Clock.ClockUpdateListener {
     private long _start;
     private long _actualStart;
     private long _actualEnd;
-    private RouterContext _context;
+    private final RouterContext _context;
     
     public JobTiming(RouterContext context) {
         _context = context;
diff --git a/router/java/src/net/i2p/router/KeyManager.java b/router/java/src/net/i2p/router/KeyManager.java
index fd0e85a9eb6f31cefeac96dbc5cff92e4bc22564..0e0b4e5d6faee67e8866690d33da1dc140be538c 100644
--- a/router/java/src/net/i2p/router/KeyManager.java
+++ b/router/java/src/net/i2p/router/KeyManager.java
@@ -12,9 +12,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import net.i2p.data.DataFormatException;
@@ -37,14 +35,14 @@ import net.i2p.util.SecureFileOutputStream;
  *
  */
 public class KeyManager {
-    private Log _log;
-    private RouterContext _context;
+    private final Log _log;
+    private final RouterContext _context;
     private PrivateKey _privateKey;
     private PublicKey _publicKey;
     private SigningPrivateKey _signingPrivateKey;
     private SigningPublicKey _signingPublicKey;
     private final Map<Hash, LeaseSetKeys> _leaseSetKeys; // Destination --> LeaseSetKeys
-    private SynchronizeKeysJob _synchronizeJob;
+    private final SynchronizeKeysJob _synchronizeJob;
     
     public final static String PROP_KEYDIR = "router.keyBackupDir";
     public final static String DEFAULT_KEYDIR = "keyBackup";
@@ -61,10 +59,6 @@ public class KeyManager {
         _context = context;
         _log = _context.logManager().getLog(KeyManager.class);	
         _synchronizeJob = new SynchronizeKeysJob();
-        setPrivateKey(null);
-        setPublicKey(null);
-        setSigningPrivateKey(null);
-        setSigningPublicKey(null);
         _leaseSetKeys = new ConcurrentHashMap();
     }
     
@@ -132,12 +126,6 @@ public class KeyManager {
             return _leaseSetKeys.get(dest);
     }
     
-    public Set<LeaseSetKeys> getAllKeys() {
-        HashSet keys = new HashSet();
-        keys.addAll(_leaseSetKeys.values());
-        return keys;
-    }
-    
     private class SynchronizeKeysJob extends JobImpl {
         public SynchronizeKeysJob() {
             super(KeyManager.this._context);
diff --git a/router/java/src/net/i2p/router/MessageValidator.java b/router/java/src/net/i2p/router/MessageValidator.java
index b673702a1f777dc2adbb12d93d7ec1f0a269c227..b619166122885a9c4508584c6929be35a0537c5a 100644
--- a/router/java/src/net/i2p/router/MessageValidator.java
+++ b/router/java/src/net/i2p/router/MessageValidator.java
@@ -13,14 +13,13 @@ import net.i2p.util.Log;
  *
  */
 public class MessageValidator {
-    private Log _log;
-    private RouterContext _context;
+    private final Log _log;
+    private final RouterContext _context;
     private DecayingBloomFilter _filter;
     
     
     public MessageValidator(RouterContext context) {
         _log = context.logManager().getLog(MessageValidator.class);
-        _filter = null;
         _context = context;
         context.statManager().createRateStat("router.duplicateMessageId", "Note that a duplicate messageId was received", "Router", 
                                              new long[] { 10*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000l });
diff --git a/router/java/src/net/i2p/router/MultiRouter.java b/router/java/src/net/i2p/router/MultiRouter.java
index d8d316ae8aa0291d51e3ce370f0fb7aea4d553b6..43f618bc2209725b75e6edd356fcff49cd6f2c6f 100644
--- a/router/java/src/net/i2p/router/MultiRouter.java
+++ b/router/java/src/net/i2p/router/MultiRouter.java
@@ -90,13 +90,17 @@ public class MultiRouter {
     
     private static Properties getEnv(String filename) {
         Properties props = new Properties();
+        FileInputStream in = null;
         try {
-            props.load(new FileInputStream(filename));
+            in = new FileInputStream(filename);
+            props.load(in);
             props.setProperty("time.disabled", "true");
             return props;
         } catch (IOException ioe) {
             ioe.printStackTrace();
             return null;
+        } finally {
+            if (in != null) try { in.close(); } catch (IOException ioe) {}
         }
     }
     
diff --git a/router/java/src/net/i2p/router/NetworkDatabaseFacade.java b/router/java/src/net/i2p/router/NetworkDatabaseFacade.java
index 50b9d5364cc88f5bab7ada626721217509fa6e6b..741f9495347dd04ef6bec10af6dc107863c9f77e 100644
--- a/router/java/src/net/i2p/router/NetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/NetworkDatabaseFacade.java
@@ -13,6 +13,7 @@ import java.io.Writer;
 import java.util.Collections;
 import java.util.Set;
 
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterInfo;
@@ -32,6 +33,11 @@ public abstract class NetworkDatabaseFacade implements Service {
      */
     public abstract Set<Hash> findNearestRouters(Hash key, int maxNumRouters, Set<Hash> peersToIgnore);
     
+    /**
+     *  @return RouterInfo, LeaseSet, or null
+     *  @since 0.8.3
+     */
+    public abstract DatabaseEntry lookupLocally(Hash key);
     public abstract void lookupLeaseSet(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs);
     public abstract LeaseSet lookupLeaseSetLocally(Hash key);
     public abstract void lookupRouterInfo(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs);
diff --git a/router/java/src/net/i2p/router/OutNetMessage.java b/router/java/src/net/i2p/router/OutNetMessage.java
index 72f262cc5613084f9a6ecbdd78d057757854f4a1..07fd8259c558ae654f34c79342d0a5d3a1650fb2 100644
--- a/router/java/src/net/i2p/router/OutNetMessage.java
+++ b/router/java/src/net/i2p/router/OutNetMessage.java
@@ -29,8 +29,8 @@ import net.i2p.util.Log;
  *
  */
 public class OutNetMessage {
-    private Log _log;
-    private RouterContext _context;
+    private final Log _log;
+    private final RouterContext _context;
     private RouterInfo _target;
     private I2NPMessage _message;
     /** cached message class name, for use after we discard the message */
@@ -50,7 +50,7 @@ public class OutNetMessage {
     private long _sendBegin;
     private long _transmitBegin;
     private Exception _createdBy;
-    private long _created;
+    private final long _created;
     /** for debugging, contains a mapping of even name to Long (e.g. "begin sending", "handleOutbound", etc) */
     private HashMap<String, Long> _timestamps;
     /**
@@ -89,15 +89,18 @@ public class OutNetMessage {
             // only timestamp if we are debugging
             synchronized (this) {
                 locked_initTimestamps();
-                while (_timestamps.containsKey(eventName)) {
-                    eventName = eventName + '.';
-                }
-                _timestamps.put(eventName, new Long(now));
+                // ???
+                //while (_timestamps.containsKey(eventName)) {
+                //    eventName = eventName + '.';
+                //}
+                _timestamps.put(eventName, Long.valueOf(now));
                 _timestampOrder.add(eventName);
             }
         }
         return now - _created;
     }
+
+    /** @deprecated unused */
     public Map<String, Long> getTimestamps() {
         if (_log.shouldLog(Log.INFO)) {
             synchronized (this) {
@@ -107,6 +110,8 @@ public class OutNetMessage {
         }
         return Collections.EMPTY_MAP;
     }
+
+    /** @deprecated unused */
     public Long getTimestamp(String eventName) {
         if (_log.shouldLog(Log.INFO)) {
             synchronized (this) {
@@ -220,7 +225,7 @@ public class OutNetMessage {
     
     public void transportFailed(String transportStyle) { 
         if (_failedTransports == null)
-            _failedTransports = new HashSet(1);
+            _failedTransports = new HashSet(2);
         _failedTransports.add(transportStyle); 
     }
     /** not thread safe - dont fail transports and iterate over this at the same time */
@@ -368,7 +373,7 @@ public class OutNetMessage {
     @Override
     public boolean equals(Object obj) {
         if(obj == null) return false;
-        if(obj.getClass() != OutNetMessage.class) return false;
+        if(!(obj instanceof OutNetMessage)) return false;
         return obj == this; // two OutNetMessages are different even if they contain the same message
     }
 }
diff --git a/router/java/src/net/i2p/router/OutNetMessagePool.java b/router/java/src/net/i2p/router/OutNetMessagePool.java
index 8e057ff4982a99f6cd2bd45832ba1149988ec993..6b5ddfaab67aab47fa2d4790028e81cbbfff5b28 100644
--- a/router/java/src/net/i2p/router/OutNetMessagePool.java
+++ b/router/java/src/net/i2p/router/OutNetMessagePool.java
@@ -18,24 +18,18 @@ import net.i2p.util.Log;
  * that wants to send a message, and the communication subsystem periodically 
  * retrieves messages for delivery.
  *
+ * Actually, this doesn't 'pool' anything, it calls the comm system directly.
+ * Nor does it organize by priority. But perhaps it could someday.
  */
 public class OutNetMessagePool {
-    private Log _log;
-    private RouterContext _context;
+    private final Log _log;
+    private final RouterContext _context;
     
     public OutNetMessagePool(RouterContext context) {
         _context = context;
         _log = _context.logManager().getLog(OutNetMessagePool.class);
     }
     
-    /**
-     * Remove the highest priority message, or null if none are available.
-     *
-     */
-    public OutNetMessage getNext() {
-        return null;
-    }
-    
     /**
      * Add a new message to the pool
      *
@@ -47,8 +41,8 @@ public class OutNetMessagePool {
             return;
         }        
         
-        if (_log.shouldLog(Log.INFO))
-                _log.info("Adding outbound message to " 
+        if (_log.shouldLog(Log.DEBUG))
+                _log.debug("Adding outbound message to " 
                           + msg.getTarget().getIdentity().getHash().toBase64().substring(0,6)
                           + " with id " + msg.getMessage().getUniqueId()
                           + " expiring on " + msg.getMessage().getMessageExpiration()
@@ -70,7 +64,7 @@ public class OutNetMessagePool {
             return false;
         }
         if (msg.getTarget() == null) {
-            _log.error("No target in the OutNetMessage: " + msg, new Exception("Definitely a fuckup"));
+            _log.error("No target in the OutNetMessage: " + msg, new Exception());
             return false;
         }
         if (msg.getPriority() < 0) {
@@ -83,38 +77,4 @@ public class OutNetMessagePool {
         }
         return true;
     }
-    
-    /**
-     * Clear any messages that have expired, enqueuing any appropriate jobs
-     *
-     */
-    public void clearExpired() {
-        // noop
-    }
-    
-    /**
-     * Retrieve the number of messages, regardless of priority.
-     *
-     */
-    public int getCount() {  return 0; }
-    
-    /**
-     * Retrieve the number of messages at the given priority.  This can be used for
-     * subsystems that maintain a pool of messages to be sent whenever there is spare time, 
-     * where all of these 'spare' messages are of the same priority.
-     *
-     */
-    public int getCount(int priority) { return 0; }
-    
-    public void dumpPoolInfo() { return; }
-    
-    private static class ReverseIntegerComparator implements Comparator {
-        public int compare(Object lhs, Object rhs) {
-            if ( (lhs == null) || (rhs == null) ) return 0; // invalid, but never used
-            if ( !(lhs instanceof Integer) || !(rhs instanceof Integer)) return 0; 
-            Integer lv = (Integer)lhs;
-            Integer rv = (Integer)rhs;
-            return - (lv.compareTo(rv));
-        }
-    }
 }
diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java
index 5904d04ea0b6bc0412086b16ff3e98d1a7844696..eee3ac866bd84d0a4fb9bb287265d5f2fb0cb129 100644
--- a/router/java/src/net/i2p/router/Router.java
+++ b/router/java/src/net/i2p/router/Router.java
@@ -539,16 +539,14 @@ public class Router {
             return true;
         return Boolean.valueOf(_context.getProperty(PROP_HIDDEN_HIDDEN)).booleanValue();
     }
+
+    /**
+     *  @return the certificate for a new RouterInfo - probably a null cert.
+     */
     public Certificate createCertificate() {
-        Certificate cert = new Certificate();
-        if (isHidden()) {
-            cert.setCertificateType(Certificate.CERTIFICATE_TYPE_HIDDEN);
-            cert.setPayload(null);
-        } else {
-            cert.setCertificateType(Certificate.CERTIFICATE_TYPE_NULL);
-            cert.setPayload(null);
-        }
-        return cert;
+        if (isHidden())
+            return new Certificate(Certificate.CERTIFICATE_TYPE_HIDDEN, null);
+        return Certificate.NULL_CERT;
     }
     
     /**
@@ -1432,7 +1430,10 @@ private static class CoalesceStatsEvent implements SimpleTimer.TimedEvent {
         ctx.statManager().createRateStat("router.highCapacityPeers", "How many high capacity peers we know", "Throttle", new long[] { 5*60*1000, 60*60*1000 });
         ctx.statManager().createRateStat("router.fastPeers", "How many fast peers we know", "Throttle", new long[] { 5*60*1000, 60*60*1000 });
         _maxMemory = Runtime.getRuntime().maxMemory();
-        ctx.statManager().createRateStat("router.memoryUsed", "(Bytes) Max is " + (_maxMemory / (1024*1024)) + "MB", "Router", new long[] { 60*1000 });
+        String legend = "(Bytes)";
+        if (_maxMemory < Long.MAX_VALUE)
+            legend += " Max is " + DataHelper.formatSize(_maxMemory) + 'B';
+        ctx.statManager().createRateStat("router.memoryUsed", legend, "Router", new long[] { 60*1000 });
     }
     private RouterContext getContext() { return _ctx; }
     public void timeReached() {
diff --git a/router/java/src/net/i2p/router/RouterClock.java b/router/java/src/net/i2p/router/RouterClock.java
index 06337f5a6eb055856ae5f2793227162dc685a382..3f7b629606838d51c7e8e0e7acee74af0fb9020f 100644
--- a/router/java/src/net/i2p/router/RouterClock.java
+++ b/router/java/src/net/i2p/router/RouterClock.java
@@ -24,7 +24,7 @@ public class RouterClock extends Clock {
      *  All of this is @since 0.7.12
      */
     private static final long MAX_SLEW = 50;
-    private static final int DEFAULT_STRATUM = 8;
+    public static final int DEFAULT_STRATUM = 8;
     private static final int WORST_STRATUM = 16;
     /** the max NTP Timestamper delay is 30m right now, make this longer than that */
     private static final long MIN_DELAY_FOR_WORSE_STRATUM = 45*60*1000;
@@ -34,7 +34,7 @@ public class RouterClock extends Clock {
     private long _lastChanged;
     private int _lastStratum;
 
-    RouterContext _contextRC; // LINT field hides another field
+    private final RouterContext _contextRC;
 
     public RouterClock(RouterContext context) {
         super(context);
@@ -44,20 +44,27 @@ public class RouterClock extends Clock {
 
     /**
      * Specify how far away from the "correct" time the computer is - a positive
-     * value means that we are slow, while a negative value means we are fast.
+     * value means that the system time is slow, while a negative value means the system time is fast.
      *
+     * @param offsetMs the delta from System.currentTimeMillis() (NOT the delta from now())
      */
     @Override
     public void setOffset(long offsetMs, boolean force) {
          setOffset(offsetMs, force, DEFAULT_STRATUM);
     }
 
-    /** @since 0.7.12 */
+    /**
+     * @since 0.7.12
+     * @param offsetMs the delta from System.currentTimeMillis() (NOT the delta from now())
+     */
     private void setOffset(long offsetMs, int stratum) {
          setOffset(offsetMs, false, stratum);
     }
 
-    /** @since 0.7.12 */
+    /**
+     * @since 0.7.12
+     * @param offsetMs the delta from System.currentTimeMillis() (NOT the delta from now())
+     */
     private void setOffset(long offsetMs, boolean force, int stratum) {
         long delta = offsetMs - _offset;
         if (!force) {
@@ -91,7 +98,7 @@ public class RouterClock extends Clock {
             }
             
             // If so configured, check sanity of proposed clock offset
-            if (Boolean.valueOf(_contextRC.getProperty("router.clockOffsetSanityCheck","true")).booleanValue() &&
+            if (_contextRC.getBooleanPropertyDefaultTrue("router.clockOffsetSanityCheck") &&
                 _alreadyChanged) {
 
                 // Try calculating peer clock skew
@@ -192,6 +199,7 @@ public class RouterClock extends Clock {
     /*
      *  How far we still have to slew, for diagnostics
      *  @since 0.7.12
+     *  @deprecated for debugging only
      */
     public long getDeltaOffset() {
         return _desiredOffset - _offset;
diff --git a/router/java/src/net/i2p/router/RouterContext.java b/router/java/src/net/i2p/router/RouterContext.java
index cb3c6366251378c0cf50972d197c446bc6d960f3..4ac21fce55f35f924779be56bfac6d662d53e22c 100644
--- a/router/java/src/net/i2p/router/RouterContext.java
+++ b/router/java/src/net/i2p/router/RouterContext.java
@@ -6,16 +6,13 @@ import java.util.Properties;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.Hash;
+import net.i2p.data.RouterInfo;
 import net.i2p.internal.InternalClientManager;
 import net.i2p.router.client.ClientManagerFacadeImpl;
 import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
-import net.i2p.router.peermanager.Calculator;
-import net.i2p.router.peermanager.CapacityCalculator;
-import net.i2p.router.peermanager.IntegrationCalculator;
 import net.i2p.router.peermanager.PeerManagerFacadeImpl;
 import net.i2p.router.peermanager.ProfileManagerImpl;
 import net.i2p.router.peermanager.ProfileOrganizer;
-import net.i2p.router.peermanager.SpeedCalculator;
 import net.i2p.router.transport.CommSystemFacadeImpl;
 import net.i2p.router.transport.FIFOBandwidthLimiter;
 import net.i2p.router.transport.OutboundMessageRegistry;
@@ -24,6 +21,7 @@ import net.i2p.router.tunnel.TunnelDispatcher;
 import net.i2p.router.tunnel.pool.TunnelPoolManager;
 import net.i2p.util.Clock;
 import net.i2p.util.KeyRing;
+import net.i2p.util.I2PProperties.I2PPropertyCallback;
 
 /**
  * Build off the core I2P context to provide a root for a router instance to
@@ -57,11 +55,6 @@ public class RouterContext extends I2PAppContext {
     private MessageValidator _messageValidator;
     private MessageStateMonitor _messageStateMonitor;
     private RouterThrottle _throttle;
-    private RouterClock _clockX;  // LINT field hides another field, hope rename won't break anything.
-    private Calculator _integrationCalc;
-    private Calculator _speedCalc;
-    private Calculator _capacityCalc;
-
 
     private static List<RouterContext> _contexts = new ArrayList(1);
     
@@ -100,11 +93,31 @@ public class RouterContext extends I2PAppContext {
             // or about 2 seconds per buffer - so about 200x faster
             // to fill than to drain - so we don't need too many
             long maxMemory = Runtime.getRuntime().maxMemory();
+            if (maxMemory == Long.MAX_VALUE)
+                maxMemory = 96*1024*1024l;
             long buffs = Math.min(16, Math.max(2, maxMemory / (14 * 1024 * 1024)));
             envProps.setProperty("prng.buffers", "" + buffs);
         }
         return envProps;
     }
+    
+    /**
+     * Modify the configuration attributes of this context, changing
+     * one of the properties provided during the context construction.
+     * @param propName The name of the property.
+     * @param value The new value for the property.
+     */
+    public void setProperty(String propName, String value) {
+    	if(_overrideProps != null) {
+    		_overrideProps.setProperty(propName, value);
+    	}
+    }
+
+    
+    public void addPropertyCallback(I2PPropertyCallback callback) {
+    	_overrideProps.addCallBack(callback);
+    }
+
 
     public void initAll() {
         if (getBooleanProperty("i2p.dummyClientFacade"))
@@ -147,9 +160,6 @@ public class RouterContext extends I2PAppContext {
         _messageValidator = new MessageValidator(this);
         _throttle = new RouterThrottleImpl(this);
         //_throttle = new RouterDoSThrottle(this);
-        _integrationCalc = new IntegrationCalculator(this);
-        _speedCalc = new SpeedCalculator(this);
-        _capacityCalc = new CapacityCalculator(this);
     }
     
     /**
@@ -163,8 +173,20 @@ public class RouterContext extends I2PAppContext {
     
     /** what router is this context working for? */
     public Router router() { return _router; }
-    /** convenience method for querying the router's ident */
-    public Hash routerHash() { return _router.getRouterInfo().getIdentity().getHash(); }
+
+    /**
+     *  Convenience method for getting the router hash.
+     *  Equivalent to context.router().getRouterInfo().getIdentity().getHash()
+     *  @return may be null if called very early
+     */
+    public Hash routerHash() {
+        if (_router == null)
+            return null;
+        RouterInfo ri = _router.getRouterInfo();
+        if (ri == null)
+            return null;
+        return ri.getIdentity().getHash();
+    }
 
     /**
      * How are we coordinating clients for the router?
@@ -271,13 +293,6 @@ public class RouterContext extends I2PAppContext {
      */
     public RouterThrottle throttle() { return _throttle; }
     
-    /** how do we rank the integration of profiles? */
-    public Calculator integrationCalculator() { return _integrationCalc; }
-    /** how do we rank the speed of profiles? */
-    public Calculator speedCalculator() { return _speedCalc; } 
-    /** how do we rank the capacity of profiles? */
-    public Calculator capacityCalculator() { return _capacityCalc; }
-    
     @Override
     public String toString() {
         StringBuilder buf = new StringBuilder(512);
@@ -301,8 +316,6 @@ public class RouterContext extends I2PAppContext {
         buf.append(_statPublisher).append('\n');
         buf.append(_shitlist).append('\n');
         buf.append(_messageValidator).append('\n');
-        buf.append(_integrationCalc).append('\n');
-        buf.append(_speedCalc).append('\n');
         return buf.toString();
     }
     
@@ -352,23 +365,22 @@ public class RouterContext extends I2PAppContext {
     }
 
     /**
-     * The context's synchronized clock, which is kept context specific only to
-     * enable simulators to play with clock skew among different instances.
-     *
-     * It wouldn't be necessary to override clock(), except for the reason
-     * that it triggers initializeClock() of which we definitely
-     * need the local version to run.
+     * @return new Properties with system and context properties
+     * @since 0.8.4
      */
     @Override
-    public Clock clock() {
-        if (!_clockInitialized) initializeClock();
-        return _clockX;
+    public Properties getProperties() { 
+        Properties rv = super.getProperties();
+        if (_router != null)
+            rv.putAll(_router.getConfigMap());
+        return rv;
     }
+    
     @Override
     protected void initializeClock() {
         synchronized (this) {
-            if (_clockX == null)
-                _clockX = new RouterClock(this);
+            if (_clock == null)
+                _clock = new RouterClock(this);
             _clockInitialized = true;
         }
     }
diff --git a/router/java/src/net/i2p/router/RouterThrottleImpl.java b/router/java/src/net/i2p/router/RouterThrottleImpl.java
index d3d3129af31a263dde6fc0aa88a1c4f8bf802d93..777cc1a6afd0439945ea9c4a5f763fc8be925608 100644
--- a/router/java/src/net/i2p/router/RouterThrottleImpl.java
+++ b/router/java/src/net/i2p/router/RouterThrottleImpl.java
@@ -12,12 +12,12 @@ import net.i2p.util.Log;
  *
  */
 class RouterThrottleImpl implements RouterThrottle {
-    private RouterContext _context;
-    private Log _log;
+    private final RouterContext _context;
+    private final Log _log;
     private String _tunnelStatus;
     
     /** 
-     * arbitrary hard limit of 10 seconds - if its taking this long to get 
+     * arbitrary hard limit - if it's taking this long to get 
      * to a job, we're congested.
      *
      */
@@ -98,7 +98,7 @@ class RouterThrottleImpl implements RouterThrottle {
         if (_context.router().getUptime() < 20*60*1000)
             return TunnelHistory.TUNNEL_REJECT_BANDWIDTH;
 
-        long lag = _context.jobQueue().getMaxLag();
+        //long lag = _context.jobQueue().getMaxLag();
         // reject here if lag too high???
         
         RateStat rs = _context.statManager().getRate("transport.sendProcessingTime");
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index f2522cd4ed540000a936a603d4922f4a287ece1f..a411b009986dc5f1f6384384ad98aeea42885422 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -18,7 +18,7 @@ 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 = 0;
 
     /** for example "-test" */
     public final static String EXTRA = "";
diff --git a/router/java/src/net/i2p/router/RouterWatchdog.java b/router/java/src/net/i2p/router/RouterWatchdog.java
index 14dc01c1e65deb8735ff9b89c89d81a2ddce0d04..482f3b3edd7d95a308828568adfe803da4130f5d 100644
--- a/router/java/src/net/i2p/router/RouterWatchdog.java
+++ b/router/java/src/net/i2p/router/RouterWatchdog.java
@@ -12,8 +12,8 @@ import net.i2p.util.Log;
  *
  */
 class RouterWatchdog implements Runnable {
-    private Log _log;
-    private RouterContext _context;
+    private final Log _log;
+    private final RouterContext _context;
     private int _consecutiveErrors;
     
     private static final long MAX_JOB_RUN_LAG = 60*1000;
diff --git a/router/java/src/net/i2p/router/Shitlist.java b/router/java/src/net/i2p/router/Shitlist.java
index f675d1056578151db6f8c55a560de209d1d9b793..a5c1c1c42c44efb557253ba52ddc6905ceac1c06 100644
--- a/router/java/src/net/i2p/router/Shitlist.java
+++ b/router/java/src/net/i2p/router/Shitlist.java
@@ -10,13 +10,13 @@ package net.i2p.router;
 
 import java.io.IOException;
 import java.io.Writer;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 import net.i2p.data.DataHelper;
 import net.i2p.data.Hash;
@@ -31,9 +31,9 @@ import net.i2p.util.Log;
  * shitlist.
  */
 public class Shitlist {
-    private Log _log;
-    private RouterContext _context;
-    private Map<Hash, Entry> _entries;
+    private final Log _log;
+    private final RouterContext _context;
+    private final Map<Hash, Entry> _entries;
     
     public static class Entry {
         /** when it should expire, per the i2p clock */
@@ -156,7 +156,7 @@ public class Shitlist {
         e.causeCode = reasonCode;
         e.transports = null;
         if (transport != null) {
-            e.transports = new ConcurrentHashSet(1);
+            e.transports = new ConcurrentHashSet(2);
             e.transports.add(transport);
         }
         
diff --git a/router/java/src/net/i2p/router/StatisticsManager.java b/router/java/src/net/i2p/router/StatisticsManager.java
index 5a00f154c84bbb299408be373b5eb789532676b7..86cbef8fe8ec0a1f723ab34059bcc0a935073d20 100644
--- a/router/java/src/net/i2p/router/StatisticsManager.java
+++ b/router/java/src/net/i2p/router/StatisticsManager.java
@@ -157,9 +157,12 @@ public class StatisticsManager implements Service {
         return stats;
     }
     
+/*****
     private void includeRate(String rateName, Properties stats, long selectedPeriods[]) {
         includeRate(rateName, stats, selectedPeriods, false);
     }
+*****/
+
     /**
      * @param fudgeQuantity the data being published in this stat is too sensitive to, uh
      *                      publish, so we're kludge the quantity (allowing the fairly safe
@@ -258,7 +261,6 @@ public class StatisticsManager implements Service {
             // bah saturation
             buf.append("0;0;0;0;");
         }
-        long numPeriods = rate.getLifetimePeriods();
         buf.append(num(fudgeQuantity)).append(';');
         return buf.toString();
     }
diff --git a/router/java/src/net/i2p/router/TunnelPoolSettings.java b/router/java/src/net/i2p/router/TunnelPoolSettings.java
index ae894cf14f694e1c960d24bfe3ccb075a874c0ef..64fa30d0d663b60bc50810254ad1d9671d8e2115 100644
--- a/router/java/src/net/i2p/router/TunnelPoolSettings.java
+++ b/router/java/src/net/i2p/router/TunnelPoolSettings.java
@@ -16,7 +16,7 @@ public class TunnelPoolSettings {
     private int _quantity;
     private int _backupQuantity;
     // private int _rebuildPeriod;
-    private int _duration;
+    //private int _duration;
     private int _length;
     private int _lengthVariance;
     private int _lengthOverride;
@@ -24,8 +24,8 @@ public class TunnelPoolSettings {
     private boolean _isExploratory;
     private boolean _allowZeroHop;
     private int _IPRestriction;
-    private Properties _unknownOptions;
-    private Hash _randomKey;
+    private final Properties _unknownOptions;
+    private final Hash _randomKey;
     
     /** prefix used to override the router's defaults for clients */
     public static final String  PREFIX_DEFAULT = "router.defaultPool.";
@@ -57,7 +57,7 @@ public class TunnelPoolSettings {
         _quantity = DEFAULT_QUANTITY;
         _backupQuantity = DEFAULT_BACKUP_QUANTITY;
         // _rebuildPeriod = DEFAULT_REBUILD_PERIOD;
-        _duration = DEFAULT_DURATION;
+        //_duration = DEFAULT_DURATION;
         _length = DEFAULT_LENGTH;
         _lengthVariance = DEFAULT_LENGTH_VARIANCE;
         _allowZeroHop = DEFAULT_ALLOW_ZERO_HOP;
@@ -107,8 +107,9 @@ public class TunnelPoolSettings {
     public boolean isExploratory() { return _isExploratory; }
     public void setIsExploratory(boolean isExploratory) { _isExploratory = isExploratory; }
     
-    public int getDuration() { return _duration; }
-    public void setDuration(int ms) { _duration = ms; }
+    // Duration is hardcoded
+    //public int getDuration() { return _duration; }
+    //public void setDuration(int ms) { _duration = ms; }
     
     /** what destination is this a tunnel for (or null if none) */
     public Hash getDestination() { return _destination; }
@@ -141,8 +142,8 @@ public class TunnelPoolSettings {
                     _allowZeroHop = getBoolean(value, DEFAULT_ALLOW_ZERO_HOP);
                 else if (name.equalsIgnoreCase(prefix + PROP_BACKUP_QUANTITY))
                     _backupQuantity = getInt(value, DEFAULT_BACKUP_QUANTITY);
-                else if (name.equalsIgnoreCase(prefix + PROP_DURATION))
-                    _duration = getInt(value, DEFAULT_DURATION);
+                //else if (name.equalsIgnoreCase(prefix + PROP_DURATION))
+                //    _duration = getInt(value, DEFAULT_DURATION);
                 else if (name.equalsIgnoreCase(prefix + PROP_LENGTH))
                     _length = getInt(value, DEFAULT_LENGTH);
                 else if (name.equalsIgnoreCase(prefix + PROP_LENGTH_VARIANCE))
@@ -165,7 +166,7 @@ public class TunnelPoolSettings {
         if (props == null) return;
         props.setProperty(prefix + PROP_ALLOW_ZERO_HOP, ""+_allowZeroHop);
         props.setProperty(prefix + PROP_BACKUP_QUANTITY, ""+_backupQuantity);
-        props.setProperty(prefix + PROP_DURATION, ""+_duration);
+        //props.setProperty(prefix + PROP_DURATION, ""+_duration);
         props.setProperty(prefix + PROP_LENGTH, ""+_length);
         props.setProperty(prefix + PROP_LENGTH_VARIANCE, ""+_lengthVariance);
         if (_destinationNickname != null)
diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
index 8bef2776d5a5a3687da21a6fe72eb35049adcddb..88c1a8ededdbbfe199253993639f1f5f3ed4cc16 100644
--- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
+++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
@@ -51,11 +51,11 @@ import net.i2p.util.SimpleTimer;
  * @author jrandom
  */
 class ClientConnectionRunner {
-    private Log _log;
+    private final Log _log;
     protected final RouterContext _context;
-    private ClientManager _manager;
+    private final ClientManager _manager;
     /** socket for this particular peer connection */
-    private Socket _socket;
+    private final Socket _socket;
     /** output stream of the socket that I2CP messages bound to the client should be written to */
     private OutputStream _out;
     /** session ID of the current client */
@@ -63,13 +63,13 @@ class ClientConnectionRunner {
     /** user's config */
     private SessionConfig _config;
     /** static mapping of MessageId to Payload, storing messages for retrieval */
-    private Map<MessageId, Payload> _messages; 
+    private final Map<MessageId, Payload> _messages; 
     /** lease set request state, or null if there is no request pending on at the moment */
     private LeaseRequestState _leaseRequest;
     /** currently allocated leaseSet, or null if none is allocated */
     private LeaseSet _currentLeaseSet;
     /** set of messageIds created but not yet ACCEPTED */
-    private Set<MessageId> _acceptedPending;
+    private final Set<MessageId> _acceptedPending;
     /** thingy that does stuff */
     protected I2CPMessageReader _reader;
     /** just for this destination */
@@ -137,15 +137,14 @@ class ClientConnectionRunner {
         _messages.clear();
         if (_sessionKeyManager != null)
             _sessionKeyManager.shutdown();
-        if (_manager != null)
-            _manager.unregisterConnection(this);
+        _manager.unregisterConnection(this);
         if (_currentLeaseSet != null)
             _context.netDb().unpublish(_currentLeaseSet);
         _leaseRequest = null;
         synchronized (_alreadyProcessed) {
             _alreadyProcessed.clear();
         }
-        _config = null;
+        //_config = null;
         //_manager = null;
     }
     
@@ -280,8 +279,12 @@ class ClientConnectionRunner {
         MessageId id = new MessageId();
         id.setMessageId(getNextMessageId()); 
         long expiration = 0;
-        if (message instanceof SendMessageExpiresMessage)
-            expiration = ((SendMessageExpiresMessage) message).getExpiration().getTime();
+        int flags = 0;
+        if (message.getType() == SendMessageExpiresMessage.MESSAGE_TYPE) {
+            SendMessageExpiresMessage msg = (SendMessageExpiresMessage) message;
+            expiration = msg.getExpirationTime();
+            flags = msg.getFlags();
+        }
         if (!_dontSendMSM)
             _acceptedPending.add(id);
 
@@ -289,16 +292,17 @@ class ClientConnectionRunner {
             _log.debug("** Receiving message [" + id.getMessageId() + "] with payload of size [" 
                        + payload.getSize() + "]" + " for session [" + _sessionId.getSessionId() 
                        + "]");
-        long beforeDistribute = _context.clock().now();
+        //long beforeDistribute = _context.clock().now();
         // the following blocks as described above
         SessionConfig cfg = _config;
         if (cfg != null)
-            _manager.distributeMessage(cfg.getDestination(), dest, payload, id, expiration);
-        long timeToDistribute = _context.clock().now() - beforeDistribute;
-        if (_log.shouldLog(Log.DEBUG))
-            _log.warn("Time to distribute in the manager to " 
-                      + dest.calculateHash().toBase64() + ": " 
-                      + timeToDistribute);
+            _manager.distributeMessage(cfg.getDestination(), dest, payload, id, expiration, flags);
+        // else log error?
+        //long timeToDistribute = _context.clock().now() - beforeDistribute;
+        //if (_log.shouldLog(Log.DEBUG))
+        //    _log.warn("Time to distribute in the manager to " 
+        //              + dest.calculateHash().toBase64() + ": " 
+        //              + timeToDistribute);
         return id;
     }
     
diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java
index a534bdfb19627fb9b9acab93d67a061167159959..6f4d4414f5c2644e31afeb7fda5c3ae5cf590885 100644
--- a/router/java/src/net/i2p/router/client/ClientManager.java
+++ b/router/java/src/net/i2p/router/client/ClientManager.java
@@ -193,7 +193,11 @@ class ClientManager {
         }
     }
     
-    void distributeMessage(Destination fromDest, Destination toDest, Payload payload, MessageId msgId, long expiration) { 
+    /**
+     * Distribute message to a local or remote destination.
+     * @param flags ignored for local
+     */
+    void distributeMessage(Destination fromDest, Destination toDest, Payload payload, MessageId msgId, long expiration, int flags) { 
         // check if there is a runner for it
         ClientConnectionRunner runner = getRunner(toDest);
         if (runner != null) {
@@ -204,6 +208,7 @@ class ClientManager {
                 // sender went away
                 return;
             }
+            // TODO can we just run this inline instead?
             _ctx.jobQueue().addJob(new DistributeLocal(toDest, runner, sender, fromDest, payload, msgId));
         } else {
             // remote.  w00t
@@ -217,22 +222,22 @@ class ClientManager {
             ClientMessage msg = new ClientMessage();
             msg.setDestination(toDest);
             msg.setPayload(payload);
-            msg.setReceptionInfo(null);
             msg.setSenderConfig(runner.getConfig());
             msg.setFromDestination(runner.getConfig().getDestination());
             msg.setMessageId(msgId);
             msg.setExpiration(expiration);
+            msg.setFlags(flags);
             _ctx.clientMessagePool().add(msg, true);
         }
     }
     
     private class DistributeLocal extends JobImpl {
-        private Destination _toDest;
-        private ClientConnectionRunner _to;
-        private ClientConnectionRunner _from;
-        private Destination _fromDest;
-        private Payload _payload;
-        private MessageId _msgId;
+        private final Destination _toDest;
+        private final ClientConnectionRunner _to;
+        private final ClientConnectionRunner _from;
+        private final Destination _fromDest;
+        private final Payload _payload;
+        private final MessageId _msgId;
         
         public DistributeLocal(Destination toDest, ClientConnectionRunner to, ClientConnectionRunner from, Destination fromDest, Payload payload, MessageId id) {
             super(_ctx);
@@ -433,7 +438,9 @@ class ClientManager {
         }
     }
     
+    /** @deprecated unused */
     public void renderStatusHTML(Writer out) throws IOException {
+/******
         StringBuilder buf = new StringBuilder(8*1024);
         buf.append("<u><b>Local destinations</b></u><br>");
         
@@ -479,6 +486,7 @@ class ClientManager {
         buf.append("\n<hr>\n");
         out.write(buf.toString());
         out.flush();
+******/
     }
     
     public void messageReceived(ClientMessage msg) {
diff --git a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java
index e4b6b2a36d38edf3a2560bd1cedf83b401f96c3b..35492936c4a9ef02a7f787458ce2670212ec0079 100644
--- a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java
+++ b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java
@@ -207,6 +207,7 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade implements Inte
         }
     }
     
+    /** @deprecated unused */
     @Override
     public void renderStatusHTML(Writer out) throws IOException { 
         if (_manager != null)
diff --git a/router/java/src/net/i2p/router/client/QueuedClientConnectionRunner.java b/router/java/src/net/i2p/router/client/QueuedClientConnectionRunner.java
index 758e8221e76e1956f1ed9596f3be895513e27414..aac9b68e0cfa528e23bd4d3105837678a1d410ce 100644
--- a/router/java/src/net/i2p/router/client/QueuedClientConnectionRunner.java
+++ b/router/java/src/net/i2p/router/client/QueuedClientConnectionRunner.java
@@ -46,6 +46,7 @@ class QueuedClientConnectionRunner extends ClientConnectionRunner {
     void stopRunning() {
         super.stopRunning();
         queue.close();
+        // queue = null;
     }
     
     /**
diff --git a/router/java/src/net/i2p/router/client/SSLClientListenerRunner.java b/router/java/src/net/i2p/router/client/SSLClientListenerRunner.java
index 0dc053a3361e3b57d2d6d7931712cbe10d307b8a..8d423ef0b31d2183f29bd0f830de84b8c54672fc 100644
--- a/router/java/src/net/i2p/router/client/SSLClientListenerRunner.java
+++ b/router/java/src/net/i2p/router/client/SSLClientListenerRunner.java
@@ -142,12 +142,12 @@ class SSLClientListenerRunner extends ClientListenerRunner {
     private void exportCert(File ks) {
         File sdir = new SecureDirectory(_context.getConfigDir(), "certificates");
         if (sdir.exists() || sdir.mkdir()) {
+            InputStream fis = null;
             try {
                 KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
-                InputStream fis = new FileInputStream(ks);
+                fis = new FileInputStream(ks);
                 String ksPass = _context.getProperty(PROP_KEYSTORE_PASSWORD, DEFAULT_KEYSTORE_PASSWORD);
                 keyStore.load(fis, ksPass.toCharArray());
-                fis.close();
                 Certificate cert = keyStore.getCertificate(KEY_ALIAS);
                 if (cert != null) {
                     File certFile = new File(sdir, ASCII_KEYFILE);
@@ -159,6 +159,8 @@ class SSLClientListenerRunner extends ClientListenerRunner {
                 _log.error("Error saving ASCII SSL keys", gse);
             } catch (IOException ioe) {
                 _log.error("Error saving ASCII SSL keys", ioe);
+            } finally {
+                if (fis != null) try { fis.close(); } catch (IOException ioe) {}
             }
         } else {
             _log.error("Error saving ASCII SSL keys");
@@ -208,12 +210,12 @@ class SSLClientListenerRunner extends ClientListenerRunner {
                        " in " + (new File(_context.getConfigDir(), "router.config")).getAbsolutePath());
             return false;
         }
+        InputStream fis = null;
         try {
             SSLContext sslc = SSLContext.getInstance("TLS");
             KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
-            InputStream fis = new FileInputStream(ks);
+            fis = new FileInputStream(ks);
             keyStore.load(fis, ksPass.toCharArray());
-            fis.close();
             KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
             kmf.init(keyStore, keyPass.toCharArray());
             sslc.init(kmf.getKeyManagers(), null, _context.random());
@@ -223,6 +225,8 @@ class SSLClientListenerRunner extends ClientListenerRunner {
             _log.error("Error loading SSL keys", gse);
         } catch (IOException ioe) {
             _log.error("Error loading SSL keys", ioe);
+        } finally {
+            if (fis != null) try { fis.close(); } catch (IOException ioe) {}
         }
         return false;
     }
diff --git a/router/java/src/net/i2p/router/message/CloveSet.java b/router/java/src/net/i2p/router/message/CloveSet.java
index 8c414edcdedd861d9f2ef2fd3d348610a8b80819..5df37525688678b3e5b8d80bdc4dc659e00d6122 100644
--- a/router/java/src/net/i2p/router/message/CloveSet.java
+++ b/router/java/src/net/i2p/router/message/CloveSet.java
@@ -18,15 +18,14 @@ import net.i2p.data.i2np.GarlicClove;
  * Wrap up the data contained in a CloveMessage after being decrypted
  *
  */
-public class CloveSet {
-    private List _cloves;
+class CloveSet {
+    private final List _cloves;
     private Certificate _cert;
     private long _msgId;
     private long _expiration;
     
     public CloveSet() {
-	_cloves = new ArrayList();
-	_cert = null;
+	_cloves = new ArrayList(4);
 	_msgId = -1;
 	_expiration = -1;
     }
diff --git a/router/java/src/net/i2p/router/message/GarlicConfig.java b/router/java/src/net/i2p/router/message/GarlicConfig.java
index b23d4ac9a34836a5599991d9ae8cfa75debfb1eb..93af2714c21cad9d613c02174d32d4cf281dbaa6 100644
--- a/router/java/src/net/i2p/router/message/GarlicConfig.java
+++ b/router/java/src/net/i2p/router/message/GarlicConfig.java
@@ -21,13 +21,13 @@ import net.i2p.data.i2np.DeliveryInstructions;
  * Define the contents of a garlic chunk that contains 1 or more sub garlics
  *
  */
-public class GarlicConfig {
+class GarlicConfig {
     private RouterInfo _recipient;
     private PublicKey _recipientPublicKey;
     private Certificate _cert;
     private long _id;
     private long _expiration;
-    private List _cloveConfigs;
+    private final List _cloveConfigs;
     private DeliveryInstructions _instructions;
     private boolean _requestAck;
     private RouterInfo _replyThroughRouter; // router through which any replies will be sent before delivery to us
@@ -39,7 +39,7 @@ public class GarlicConfig {
     public GarlicConfig() {
 	_id = -1;
 	_expiration = -1;
-	_cloveConfigs = new ArrayList();
+	_cloveConfigs = new ArrayList(4);
 	_replyBlockMessageId = -1;
 	_replyBlockExpiration = -1;
     }
diff --git a/router/java/src/net/i2p/router/message/GarlicMessageHandler.java b/router/java/src/net/i2p/router/message/GarlicMessageHandler.java
index 1db82eddbd7dce73f100f7291be054849ce04d1f..9f435c3bd55a4163da2c060827ea1bb4d9fde675 100644
--- a/router/java/src/net/i2p/router/message/GarlicMessageHandler.java
+++ b/router/java/src/net/i2p/router/message/GarlicMessageHandler.java
@@ -21,7 +21,7 @@ import net.i2p.router.RouterContext;
  *
  */
 public class GarlicMessageHandler implements HandlerJobBuilder {
-    private RouterContext _context;
+    private final RouterContext _context;
     
     public GarlicMessageHandler(RouterContext context) {
         _context = context;
diff --git a/router/java/src/net/i2p/router/message/GarlicMessageParser.java b/router/java/src/net/i2p/router/message/GarlicMessageParser.java
index 31192dbcf113e08e236deaebe92f9733f8a1e584..b56ed291c1d842b0dea6b1032372218ebabba8c9 100644
--- a/router/java/src/net/i2p/router/message/GarlicMessageParser.java
+++ b/router/java/src/net/i2p/router/message/GarlicMessageParser.java
@@ -24,9 +24,9 @@ import net.i2p.util.Log;
  * Read a GarlicMessage, decrypt it, and return the resulting CloveSet
  *
  */
-public class GarlicMessageParser {
-    private Log _log;
-    private RouterContext _context;
+class GarlicMessageParser {
+    private final Log _log;
+    private final RouterContext _context;
     
     public GarlicMessageParser(RouterContext context) { 
         _context = context;
@@ -47,7 +47,7 @@ public class GarlicMessageParser {
         }
         if (decrData == null) {
             if (_log.shouldLog(Log.WARN))
-                _log.warn("Decryption of garlic message failed (data = " + encData + ")", new Exception("Decrypt fail"));
+                _log.warn("Decryption of garlic message failed", new Exception("Decrypt fail"));
             return null;
         } else {
             try {
diff --git a/router/java/src/net/i2p/router/message/GarlicMessageReceiver.java b/router/java/src/net/i2p/router/message/GarlicMessageReceiver.java
index 5013ab409efbdfe51ebabba97d0a2ffb375cf473..def373cf7a825d31cc0996a0994edef3be09f27a 100644
--- a/router/java/src/net/i2p/router/message/GarlicMessageReceiver.java
+++ b/router/java/src/net/i2p/router/message/GarlicMessageReceiver.java
@@ -26,11 +26,11 @@ import net.i2p.util.Log;
  *
  */
 public class GarlicMessageReceiver {
-    private RouterContext _context;
-    private Log _log;
-    private CloveReceiver _receiver;
-    private Hash _clientDestination;
-    private GarlicMessageParser _parser;
+    private final RouterContext _context;
+    private final Log _log;
+    private final CloveReceiver _receiver;
+    private final Hash _clientDestination;
+    private final GarlicMessageParser _parser;
    
     private final static int FORWARD_PRIORITY = 50;
     
diff --git a/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java b/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java
index 32959b3a4107a1c55b8ac3719d0167a375ccaa51..d879cb5fc5bd52816cbbde948ddf2afc26de834d 100644
--- a/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java
+++ b/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java
@@ -28,9 +28,9 @@ import net.i2p.util.Log;
  * need to be. soon)
  *
  */
-public class HandleGarlicMessageJob extends JobImpl implements GarlicMessageReceiver.CloveReceiver {
-    private Log _log;
-    private GarlicMessage _message;
+class HandleGarlicMessageJob extends JobImpl implements GarlicMessageReceiver.CloveReceiver {
+    private final Log _log;
+    private final GarlicMessage _message;
     //private RouterIdentity _from;
     //private Hash _fromHash;
     //private Map _cloves; // map of clove Id --> Expiration of cloves we've already seen
diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageJobHelper.java b/router/java/src/net/i2p/router/message/OutboundClientMessageJobHelper.java
index 9025fd22b35a77b537411359d43a3f340ca540cc..0ba55213e07003edb2d4e634ead4ec06d0a3fada 100644
--- a/router/java/src/net/i2p/router/message/OutboundClientMessageJobHelper.java
+++ b/router/java/src/net/i2p/router/message/OutboundClientMessageJobHelper.java
@@ -227,9 +227,8 @@ class OutboundClientMessageJobHelper {
         clove.setExpiration(expiration);
         clove.setId(ctx.random().nextLong(I2NPMessage.MAX_ID_VALUE));
         DatabaseStoreMessage msg = new DatabaseStoreMessage(ctx);
-        msg.setLeaseSet(replyLeaseSet);
+        msg.setEntry(replyLeaseSet);
         msg.setMessageExpiration(expiration);
-        msg.setKey(replyLeaseSet.getDestination().calculateHash());
         clove.setPayload(msg);
         clove.setRecipientPublicKey(null);
         clove.setRequestAck(false);
diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java
index bfa09419932f6ac049f5358597f54e7de4289c1e..fc22cadfacabc3d2d517c4571c696f0494d67fdc 100644
--- a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java
+++ b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java
@@ -47,21 +47,21 @@ import net.i2p.util.SimpleTimer;
  *
  */
 public class OutboundClientMessageOneShotJob extends JobImpl {
-    private Log _log;
+    private final Log _log;
     private long _overallExpiration;
     private ClientMessage _clientMessage;
-    private MessageId _clientMessageId;
-    private int _clientMessageSize;
-    private Destination _from;
-    private Destination _to;
-    private String _toString;
+    private final MessageId _clientMessageId;
+    private final int _clientMessageSize;
+    private final Destination _from;
+    private final Destination _to;
+    private final String _toString;
     /** target destination's leaseSet, if known */
     private LeaseSet _leaseSet;
     /** Actual lease the message is being routed through */
     private Lease _lease;
     private PayloadGarlicConfig _clove;
     private long _cloveId;
-    private long _start;
+    private final long _start;
     private boolean _finished;
     private long _leaseSetLookupBegin;
     private TunnelInfo _outTunnel;
@@ -103,8 +103,6 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
      */
     private static final int BUNDLE_PROBABILITY_DEFAULT = 100;
     
-    private static final Object _initializeLock = new Object();
-    private static boolean _initialized = false;
     private static final int CLEAN_INTERVAL = 5*60*1000;
     private static final int REPLY_REQUEST_INTERVAL = 60*1000;
 
@@ -115,26 +113,6 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
         super(ctx);
         _log = ctx.logManager().getLog(OutboundClientMessageOneShotJob.class);
         
-        synchronized (_initializeLock) {
-            if (!_initialized) {
-                SimpleScheduler.getInstance().addPeriodicEvent(new OCMOSJCacheCleaner(ctx), CLEAN_INTERVAL, CLEAN_INTERVAL);
-                ctx.statManager().createFrequencyStat("client.sendMessageFailFrequency", "How often does a client fail to send a message?", "ClientMessages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
-                ctx.statManager().createRateStat("client.sendMessageSize", "How large are messages sent by the client?", "ClientMessages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
-                ctx.statManager().createRateStat("client.sendAckTime", "Message round trip time", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
-                ctx.statManager().createRateStat("client.timeoutCongestionTunnel", "How lagged our tunnels are when a send times out?", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
-                ctx.statManager().createRateStat("client.timeoutCongestionMessage", "How fast we process messages locally when a send times out?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
-                ctx.statManager().createRateStat("client.timeoutCongestionInbound", "How much faster we are receiving data than our average bps when a send times out?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
-                ctx.statManager().createRateStat("client.leaseSetFoundLocally", "How often we tried to look for a leaseSet and found it locally?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
-                ctx.statManager().createRateStat("client.leaseSetFoundRemoteTime", "How long we tried to look for a remote leaseSet (when we succeeded)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
-                ctx.statManager().createRateStat("client.leaseSetFailedRemoteTime", "How long we tried to look for a remote leaseSet (when we failed)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
-                ctx.statManager().createRateStat("client.dispatchPrepareTime", "How long until we've queued up the dispatch job (since we started)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
-                ctx.statManager().createRateStat("client.dispatchTime", "How long until we've dispatched the message (since we started)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
-                ctx.statManager().createRateStat("client.dispatchSendTime", "How long the actual dispatching takes?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
-                ctx.statManager().createRateStat("client.dispatchNoTunnels", "How long after start do we run out of tunnels to send/receive with?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
-                ctx.statManager().createRateStat("client.dispatchNoACK", "Repeated message sends to a peer (no ack required)", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l });
-                _initialized = true;
-            }
-        }
         long timeoutMs = OVERALL_TIMEOUT_MS_DEFAULT;
         _clientMessage = msg;
         _clientMessageId = msg.getMessageId();
@@ -149,10 +127,17 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
         // otherwise router config, otherwise default
         _overallExpiration = msg.getExpiration();
         if (_overallExpiration > 0) {
-           _overallExpiration = Math.max(_overallExpiration, _start + OVERALL_TIMEOUT_MS_MIN);
-           _overallExpiration = Math.min(_overallExpiration, _start + OVERALL_TIMEOUT_MS_DEFAULT);
-           if (_log.shouldLog(Log.INFO))
-               _log.info(getJobId() + ": Message Expiration (ms): " + (_overallExpiration - _start));
+            // Unless it's already expired, set a min and max expiration
+            if (_overallExpiration <= _start) {
+                _overallExpiration = Math.max(_overallExpiration, _start + OVERALL_TIMEOUT_MS_MIN);
+                _overallExpiration = Math.min(_overallExpiration, _start + OVERALL_TIMEOUT_MS_DEFAULT);
+                if (_log.shouldLog(Log.INFO))
+                    _log.info(getJobId() + ": Message Expiration (ms): " + (_overallExpiration - _start));
+            } else {
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn(getJobId() + ": Expired before we got to it");
+                // runJob() will call dieFatal()
+            }
         } else {
             String param = msg.getSenderConfig().getOptions().getProperty(OVERALL_TIMEOUT_MS_PARAM);
             if (param == null)
@@ -171,15 +156,38 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
            if (_log.shouldLog(Log.INFO))
                _log.info(getJobId() + " Default Expiration (ms): " + timeoutMs);
         }
-        _finished = false;
     }
     
+    /** call once only */
+    public static void init(RouterContext ctx) {
+        SimpleScheduler.getInstance().addPeriodicEvent(new OCMOSJCacheCleaner(ctx), CLEAN_INTERVAL, CLEAN_INTERVAL);
+        ctx.statManager().createFrequencyStat("client.sendMessageFailFrequency", "How often does a client fail to send a message?", "ClientMessages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
+        ctx.statManager().createRateStat("client.sendMessageSize", "How large are messages sent by the client?", "ClientMessages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
+        ctx.statManager().createRateStat("client.sendAckTime", "Message round trip time", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
+        ctx.statManager().createRateStat("client.timeoutCongestionTunnel", "How lagged our tunnels are when a send times out?", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
+        ctx.statManager().createRateStat("client.timeoutCongestionMessage", "How fast we process messages locally when a send times out?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
+        ctx.statManager().createRateStat("client.timeoutCongestionInbound", "How much faster we are receiving data than our average bps when a send times out?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
+        ctx.statManager().createRateStat("client.leaseSetFoundLocally", "How often we tried to look for a leaseSet and found it locally?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
+        ctx.statManager().createRateStat("client.leaseSetFoundRemoteTime", "How long we tried to look for a remote leaseSet (when we succeeded)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
+        ctx.statManager().createRateStat("client.leaseSetFailedRemoteTime", "How long we tried to look for a remote leaseSet (when we failed)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
+        ctx.statManager().createRateStat("client.dispatchPrepareTime", "How long until we've queued up the dispatch job (since we started)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
+        ctx.statManager().createRateStat("client.dispatchTime", "How long until we've dispatched the message (since we started)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
+        ctx.statManager().createRateStat("client.dispatchSendTime", "How long the actual dispatching takes?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
+        ctx.statManager().createRateStat("client.dispatchNoTunnels", "How long after start do we run out of tunnels to send/receive with?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
+        ctx.statManager().createRateStat("client.dispatchNoACK", "Repeated message sends to a peer (no ack required)", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l });
+    }
+
     public String getName() { return "Outbound client message"; }
     
     public void runJob() {
+        long now = getContext().clock().now();
+        if (now >= _overallExpiration) {
+            dieFatal();
+            return;
+        }
         if (_log.shouldLog(Log.DEBUG))
             _log.debug(getJobId() + ": Send outbound client message job beginning");
-        long timeoutMs = _overallExpiration - getContext().clock().now();
+        long timeoutMs = _overallExpiration - now;
         if (_log.shouldLog(Log.DEBUG))
             _log.debug(getJobId() + ": preparing to search for the leaseSet for " + _toString);
         Hash key = _to.calculateHash();
@@ -249,7 +257,6 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
         }
 
         // If the last leaseSet we sent him is still good, don't bother sending again
-        long now = getContext().clock().now();
         synchronized (_leaseSetCache) {
             if (!force) {
                 LeaseSet ls = _leaseSetCache.get(hashPair());
@@ -326,7 +333,6 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
                 _log.warn(getJobId() + ": Lookup locally didn't find the leaseSet for " + _toString);
             return false;
         } 
-        long now = getContext().clock().now();
 
         // Use the same lease if it's still good
         // Even if _leaseSet changed, _leaseSet.getEncryptionKey() didn't...
@@ -373,7 +379,7 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
         
         // randomize the ordering (so leases with equal # of failures per next 
         // sort are randomly ordered)
-        Collections.shuffle(leases);
+        Collections.shuffle(leases, getContext().random());
         
 /****
         if (false) {
@@ -793,7 +799,6 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
 
     private TunnelInfo selectOutboundTunnel(Destination to) {
         TunnelInfo tunnel;
-        long now = getContext().clock().now();
         synchronized (_tunnelCache) {
             /**
              * If old tunnel is valid and no longer backlogged, use it.
diff --git a/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java b/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java
index a5e8368d3438355c4773bd3c64f32e05f6657679..fb92898c816ec711c95c03ef6cfd1c7bb1558520 100644
--- a/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java
+++ b/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java
@@ -19,7 +19,6 @@ public class PayloadGarlicConfig extends GarlicConfig {
 
     public PayloadGarlicConfig() {
 	super();
-	_payload = null;
     }
     
     /**
diff --git a/router/java/src/net/i2p/router/message/SendMessageDirectJob.java b/router/java/src/net/i2p/router/message/SendMessageDirectJob.java
index c67eeaa4ad986d0fa6cd57f8a512c791176ae4f7..5ded790ab8150840ac4469b19932e25e2fd09d1b 100644
--- a/router/java/src/net/i2p/router/message/SendMessageDirectJob.java
+++ b/router/java/src/net/i2p/router/message/SendMessageDirectJob.java
@@ -22,16 +22,16 @@ import net.i2p.router.RouterContext;
 import net.i2p.util.Log;
 
 public class SendMessageDirectJob extends JobImpl {
-    private Log _log;
-    private I2NPMessage _message;
-    private Hash _targetHash;
+    private final Log _log;
+    private final I2NPMessage _message;
+    private final Hash _targetHash;
     private RouterInfo _router;
-    private long _expiration;
-    private int _priority;
-    private Job _onSend;
-    private ReplyJob _onSuccess;
-    private Job _onFail;
-    private MessageSelector _selector;
+    private final long _expiration;
+    private final int _priority;
+    private final Job _onSend;
+    private final ReplyJob _onSuccess;
+    private final Job _onFail;
+    private final MessageSelector _selector;
     private boolean _alreadySearched;
     private boolean _sent;
     private long _searchOn;
@@ -47,7 +47,6 @@ public class SendMessageDirectJob extends JobImpl {
         _log = getContext().logManager().getLog(SendMessageDirectJob.class);
         _message = message;
         _targetHash = toPeer;
-        _router = null;
         if (timeoutMs < 10*1000) {
             if (_log.shouldLog(Log.WARN))
                 _log.warn("Very little time given [" + timeoutMs + "], resetting to 5s", new Exception("stingy bastard"));
@@ -56,8 +55,6 @@ public class SendMessageDirectJob extends JobImpl {
             _expiration = timeoutMs + ctx.clock().now();
         }
         _priority = priority;
-        _searchOn = 0;
-        _alreadySearched = false;
         _onSend = onSend;
         _onSuccess = onSuccess;
         _onFail = onFail;
@@ -66,7 +63,6 @@ public class SendMessageDirectJob extends JobImpl {
             throw new IllegalArgumentException("Attempt to send a null message");
         if (_targetHash == null)
             throw new IllegalArgumentException("Attempt to send a message to a null peer");
-        _sent = false;
     }
     
     public String getName() { return "Send Message Direct"; }
diff --git a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java
index ce907ae719a6101353db3467396cb8a4f8f7ae55..8cdc87e6f97eb7be0ae2bb4a40d09d29183e64d4 100644
--- a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java
+++ b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java
@@ -12,7 +12,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
-import net.i2p.data.DataStructure;
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterIdentity;
@@ -227,20 +227,19 @@ public class HandleDatabaseLookupMessageJob extends JobImpl {
         return routerHashSet.contains(getContext().routerHash());
     }
     
-    private void sendData(Hash key, DataStructure data, Hash toPeer, TunnelId replyTunnel) {
+    private void sendData(Hash key, DatabaseEntry data, Hash toPeer, TunnelId replyTunnel) {
+        if (!key.equals(data.getHash())) {
+            _log.error("Hash mismatch HDLMJ");
+            return;
+        }
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Sending data matching key " + key.toBase64() + " to peer " + toPeer.toBase64() 
                        + " tunnel " + replyTunnel);
         DatabaseStoreMessage msg = new DatabaseStoreMessage(getContext());
-        msg.setKey(key);
-        if (data instanceof LeaseSet) {
-            msg.setLeaseSet((LeaseSet)data);
-            msg.setValueType(DatabaseStoreMessage.KEY_TYPE_LEASESET);
+        if (data.getType() == DatabaseEntry.KEY_TYPE_LEASESET) {
             getContext().statManager().addRateData("netDb.lookupsMatchedLeaseSet", 1, 0);
-        } else if (data instanceof RouterInfo) {
-            msg.setRouterInfo((RouterInfo)data);
-            msg.setValueType(DatabaseStoreMessage.KEY_TYPE_ROUTERINFO);
         }
+        msg.setEntry(data);
         getContext().statManager().addRateData("netDb.lookupsMatched", 1, 0);
         getContext().statManager().addRateData("netDb.lookupsHandled", 1, 0);
         sendMessage(msg, toPeer, replyTunnel);
diff --git a/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java b/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java
index a61f947a59565ada3f5a83175f02b773f58c8e23..183d1da04754613c6c2054861ee00c580c8a3bf7 100644
--- a/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java
+++ b/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java
@@ -10,9 +10,11 @@ package net.i2p.router.networkdb;
 
 import java.util.Date;
 
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterIdentity;
+import net.i2p.data.RouterInfo;
 import net.i2p.data.i2np.DatabaseStoreMessage;
 import net.i2p.data.i2np.DeliveryStatusMessage;
 import net.i2p.router.JobImpl;
@@ -59,16 +61,17 @@ public class HandleDatabaseStoreMessageJob extends JobImpl {
 
         String invalidMessage = null;
         boolean wasNew = false;
-        if (_message.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) {
+        DatabaseEntry entry = _message.getEntry();
+        if (entry.getType() == DatabaseEntry.KEY_TYPE_LEASESET) {
             getContext().statManager().addRateData("netDb.storeLeaseSetHandled", 1, 0);
    
             try {
-                LeaseSet ls = _message.getLeaseSet();
+                LeaseSet ls = (LeaseSet) entry;
                 // mark it as something we received, so we'll answer queries 
                 // for it.  this flag does NOT get set on entries that we 
                 // receive in response to our own lookups.
                 ls.setReceivedAsPublished(true);
-                LeaseSet match = getContext().netDb().store(_message.getKey(), _message.getLeaseSet());
+                LeaseSet match = getContext().netDb().store(_message.getKey(), ls);
                 if (match == null) {
                     wasNew = true;
                 } else {
@@ -78,13 +81,14 @@ public class HandleDatabaseStoreMessageJob extends JobImpl {
             } catch (IllegalArgumentException iae) {
                 invalidMessage = iae.getMessage();
             }
-        } else if (_message.getValueType() == DatabaseStoreMessage.KEY_TYPE_ROUTERINFO) {
+        } else if (entry.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
+            RouterInfo ri = (RouterInfo) entry;
             getContext().statManager().addRateData("netDb.storeRouterInfoHandled", 1, 0);
             if (_log.shouldLog(Log.INFO))
                 _log.info("Handling dbStore of router " + _message.getKey() + " with publishDate of " 
-                          + new Date(_message.getRouterInfo().getPublished()));
+                          + new Date(ri.getPublished()));
             try {
-                Object match = getContext().netDb().store(_message.getKey(), _message.getRouterInfo());
+                Object match = getContext().netDb().store(_message.getKey(), ri);
                 wasNew = (null == match);
                 getContext().profileManager().heardAbout(_message.getKey());
             } catch (IllegalArgumentException iae) {
@@ -92,7 +96,7 @@ public class HandleDatabaseStoreMessageJob extends JobImpl {
             }
         } else {
             if (_log.shouldLog(Log.ERROR))
-                _log.error("Invalid DatabaseStoreMessage data type - " + _message.getValueType() 
+                _log.error("Invalid DatabaseStoreMessage data type - " + entry.getType() 
                            + ": " + _message);
         }
         
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java
index b4b55f3f8e77477cb805a71271b1ad28ccefae9c..ab064e2b0b1214565e3b696a0cadbd9570be7782 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java
@@ -8,21 +8,27 @@ package net.i2p.router.networkdb.kademlia;
  *
  */
 
+import java.util.Collection;
+import java.util.Map;
 import java.util.Set;
 
-import net.i2p.data.DataStructure;
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
 
 public interface DataStore {
     public boolean isInitialized();
     public boolean isKnown(Hash key);
-    public DataStructure get(Hash key);
-    public DataStructure get(Hash key, boolean persist);
-    public boolean put(Hash key, DataStructure data);
-    public boolean put(Hash key, DataStructure data, boolean persist);
-    public DataStructure remove(Hash key);
-    public DataStructure remove(Hash key, boolean persist);
+    public DatabaseEntry get(Hash key);
+    public DatabaseEntry get(Hash key, boolean persist);
+    public boolean put(Hash key, DatabaseEntry data);
+    public boolean put(Hash key, DatabaseEntry data, boolean persist);
+    public DatabaseEntry remove(Hash key);
+    public DatabaseEntry remove(Hash key, boolean persist);
     public Set<Hash> getKeys();
+    /** @since 0.8.3 */
+    public Collection<DatabaseEntry> getEntries();
+    /** @since 0.8.3 */
+    public Set<Map.Entry<Hash, DatabaseEntry>> getMapEntries();
     public void stop();
     public void restart();
     public void rescan();
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireLeasesJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireLeasesJob.java
index 7d4be13367b4f3678bff6817d9b29d58016290c0..6ea401d6671b145288eecadc20dba0e3288c72e3 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireLeasesJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireLeasesJob.java
@@ -9,9 +9,10 @@ package net.i2p.router.networkdb.kademlia;
  */
 
 import java.util.HashSet;
-import java.util.Iterator;
+import java.util.Map;
 import java.util.Set;
 
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.router.JobImpl;
@@ -26,8 +27,8 @@ import net.i2p.util.Log;
  *
  */
 class ExpireLeasesJob extends JobImpl {
-    private Log _log;
-    private KademliaNetworkDatabaseFacade _facade;
+    private final Log _log;
+    private final KademliaNetworkDatabaseFacade _facade;
     
     private final static long RERUN_DELAY_MS = 1*60*1000;
     
@@ -38,11 +39,11 @@ class ExpireLeasesJob extends JobImpl {
     }
     
     public String getName() { return "Expire Lease Sets Job"; }
+
     public void runJob() {
-        Set toExpire = selectKeysToExpire();
+        Set<Hash> toExpire = selectKeysToExpire();
         _log.info("Leases to expire: " + toExpire);
-        for (Iterator iter = toExpire.iterator(); iter.hasNext(); ) {
-            Hash key = (Hash)iter.next();
+        for (Hash key : toExpire) {
             _facade.fail(key);
             //_log.info("Lease " + key + " is expiring, so lets look for it again", new Exception("Expire and search"));
             //_facade.lookupLeaseSet(key, null, null, RERUN_DELAY_MS);
@@ -56,17 +57,15 @@ class ExpireLeasesJob extends JobImpl {
      * don't have any leases that haven't yet passed, even with the CLOCK_FUDGE_FACTOR)
      *
      */
-    private Set selectKeysToExpire() {
-        Set keys = _facade.getDataStore().getKeys();
-        Set toExpire = new HashSet(128);
-        for (Iterator iter = keys.iterator(); iter.hasNext(); ) {
-            Hash key = (Hash)iter.next();
-            Object obj = _facade.getDataStore().get(key);
-            if (obj instanceof LeaseSet) {
+    private Set<Hash> selectKeysToExpire() {
+        Set<Hash> toExpire = new HashSet(128);
+        for (Map.Entry<Hash, DatabaseEntry> entry : _facade.getDataStore().getMapEntries()) {
+            DatabaseEntry obj = entry.getValue();
+            if (obj.getType() == DatabaseEntry.KEY_TYPE_LEASESET) {
                 LeaseSet ls = (LeaseSet)obj;
                 if (!ls.isCurrent(Router.CLOCK_FUDGE_FACTOR))
-                    toExpire.add(key);
-                else
+                    toExpire.add(entry.getKey());
+                else if (_log.shouldLog(Log.DEBUG))
                     _log.debug("Lease " + ls.getDestination().calculateHash() + " is current, no need to expire");
             }
         }
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java
index 1d7de01389c0308d2084724805705e7b7e26772b..60bfb6e3aa02cff389b38004326c83849f235bb5 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java
@@ -9,7 +9,6 @@ package net.i2p.router.networkdb.kademlia;
  */
 
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.Set;
 
 import net.i2p.data.Hash;
@@ -28,8 +27,8 @@ import net.i2p.util.Log;
  *
  */
 class ExpireRoutersJob extends JobImpl {
-    private Log _log;
-    private KademliaNetworkDatabaseFacade _facade;
+    private final Log _log;
+    private final KademliaNetworkDatabaseFacade _facade;
     
     /** rerun fairly often, so the fails don't queue up too many netdb searches at once */
     private final static long RERUN_DELAY_MS = 120*1000;
@@ -41,11 +40,13 @@ class ExpireRoutersJob extends JobImpl {
     }
     
     public String getName() { return "Expire Routers Job"; }
+
     public void runJob() {
-        Set toExpire = selectKeysToExpire();
-        _log.info("Routers to expire (drop and try to refetch): " + toExpire);
-        for (Iterator iter = toExpire.iterator(); iter.hasNext(); ) {
-            Hash key = (Hash)iter.next();
+        // this always returns an empty set (see below)
+        Set<Hash> toExpire = selectKeysToExpire();
+        if (_log.shouldLog(Log.INFO))
+            _log.info("Routers to expire (drop and try to refetch): " + toExpire);
+        for (Hash key : toExpire) {
             _facade.fail(key);
         }
         _facade.queueForExploration(toExpire);
@@ -61,9 +62,8 @@ class ExpireRoutersJob extends JobImpl {
      *
      * @return nothing for now
      */
-    private Set selectKeysToExpire() {
-        for (Iterator iter = _facade.getAllRouters().iterator(); iter.hasNext(); ) {
-            Hash key = (Hash)iter.next();
+    private Set<Hash> selectKeysToExpire() {
+        for (Hash key : _facade.getAllRouters()) {
             // Don't expire anybody we are connected to
             if (!getContext().commSystem().isEstablished(key)) {
                 // This does a _facade.validate() and fail() which is sufficient...
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupMatchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupMatchJob.java
index 20572667e7f3c3d1ecd8d3f2bb71a99fa5ad82bd..34b0e4e2b9c67f8621ac4ae09303df3a2f0e255b 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupMatchJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupMatchJob.java
@@ -1,5 +1,8 @@
 package net.i2p.router.networkdb.kademlia;
 
+import net.i2p.data.DatabaseEntry;
+import net.i2p.data.LeaseSet;
+import net.i2p.data.RouterInfo;
 import net.i2p.data.i2np.DatabaseSearchReplyMessage;
 import net.i2p.data.i2np.DatabaseStoreMessage;
 import net.i2p.data.i2np.I2NPMessage;
@@ -61,14 +64,15 @@ class FloodOnlyLookupMatchJob extends JobImpl implements ReplyJob {
             // We do it here first to make sure it is in the DB before
             // runJob() and search.success() is called???
             // Should we just pass the DataStructure directly back to somebody?
-            if (dsm.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) {
+            if (dsm.getEntry().getType() == DatabaseEntry.KEY_TYPE_LEASESET) {
                 // Since HFDSMJ wants to setReceivedAsPublished(), we have to
                 // set a flag saying this was really the result of a query,
                 // so don't do that.
-                dsm.getLeaseSet().setReceivedAsReply();
-                getContext().netDb().store(dsm.getKey(), dsm.getLeaseSet());
+                LeaseSet ls = (LeaseSet) dsm.getEntry();
+                ls.setReceivedAsReply();
+                getContext().netDb().store(dsm.getKey(), ls);
             } else {
-                getContext().netDb().store(dsm.getKey(), dsm.getRouterInfo());
+                getContext().netDb().store(dsm.getKey(), (RouterInfo) dsm.getEntry());
             }
         } catch (IllegalArgumentException iae) {
             if (_log.shouldLog(Log.WARN))
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodSearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodSearchJob.java
index bfa5c59ead02121e2f0a5c49870140b6ae7c6a58..1cecc2074137a32bf040825f19e34ab7cb6b0ce6 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodSearchJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodSearchJob.java
@@ -182,8 +182,7 @@ public class FloodSearchJob extends JobImpl {
             _search = job;
         }
         public void runJob() { 
-            if ( (getContext().netDb().lookupLeaseSetLocally(_search.getKey()) != null) ||
-                 (getContext().netDb().lookupRouterInfoLocally(_search.getKey()) != null) ) {
+            if (getContext().netDb().lookupLocally(_search.getKey()) != null) {
                 _search.success();
             } else {
                 int remaining = _search.getLookupsRemaining();
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java
index 3964b3a1ea49246f856362ed52a7c05662335e39..04683309a6c3b9145fdde066c46354357691409a 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java
@@ -26,8 +26,8 @@ class FloodfillMonitorJob extends JobImpl {
     private static final int REQUEUE_DELAY = 60*60*1000;
     private static final long MIN_UPTIME = 2*60*60*1000;
     private static final long MIN_CHANGE_DELAY = 6*60*60*1000;
-    private static final int MIN_FF = 60;
-    private static final int MAX_FF = 100;
+    private static final int MIN_FF = 75;
+    private static final int MAX_FF = 150;
     private static final String PROP_FLOODFILL_PARTICIPANT = "router.floodfillParticipant";
     
     public FloodfillMonitorJob(RouterContext context, FloodfillNetworkDatabaseFacade facade) {
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
index 540173ed63404457315894cf71bd784db7bc8788..5ba6701353326c768197adec60af97b8d0890d82 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
@@ -7,8 +7,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.DataFormatException;
-import net.i2p.data.DataStructure;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterInfo;
@@ -93,11 +93,11 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
     }
     
     @Override
-    public void sendStore(Hash key, DataStructure ds, Job onSuccess, Job onFailure, long sendTimeout, Set toIgnore) {
+    public void sendStore(Hash key, DatabaseEntry ds, Job onSuccess, Job onFailure, long sendTimeout, Set toIgnore) {
         // if we are a part of the floodfill netDb, don't send out our own leaseSets as part 
         // of the flooding - instead, send them to a random floodfill peer so *they* can flood 'em out.
         // perhaps statistically adjust this so we are the source every 1/N times... or something.
-        if (floodfillEnabled() && (ds instanceof RouterInfo)) {
+        if (floodfillEnabled() && (ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO)) {
             flood(ds);
             if (onSuccess != null) 
                 _context.jobQueue().addJob(onSuccess);
@@ -129,12 +129,8 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
      *  We do this to implement Kademlia within the floodfills, i.e.
      *  we flood to those closest to the key.
      */
-    public void flood(DataStructure ds) {
-        Hash key;
-        if (ds instanceof LeaseSet)
-            key = ((LeaseSet)ds).getDestination().calculateHash();
-        else
-            key = ((RouterInfo)ds).getIdentity().calculateHash();
+    public void flood(DatabaseEntry ds) {
+        Hash key = ds.getHash();
         Hash rkey = _context.routingKeyGenerator().getRoutingKey(key);
         FloodfillPeerSelector sel = (FloodfillPeerSelector)getPeerSelector();
         List peers = sel.selectFloodfillParticipants(rkey, MAX_TO_FLOOD, getKBuckets());
@@ -151,12 +147,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
             if (peer.equals(_context.routerHash()))
                 continue;
             DatabaseStoreMessage msg = new DatabaseStoreMessage(_context);
-            if (ds instanceof LeaseSet) {
-                msg.setLeaseSet((LeaseSet)ds);
-            } else {
-                msg.setRouterInfo((RouterInfo)ds);
-            }
-            msg.setKey(key);
+            msg.setEntry(ds);
             msg.setReplyGateway(null);
             msg.setReplyToken(0);
             msg.setReplyTunnel(null);
@@ -242,13 +233,9 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
         List<RouterInfo> rv = new ArrayList();
         DataStore ds = getDataStore();
         if (ds != null) {
-            Set keys = ds.getKeys();
-            if (keys != null) {
-                for (Iterator iter = keys.iterator(); iter.hasNext(); ) {
-                    Object o = ds.get((Hash)iter.next());
-                    if (o instanceof RouterInfo)
-                        rv.add((RouterInfo)o);
-                }
+            for (DatabaseEntry o : ds.getEntries()) {
+                if (o.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO)
+                    rv.add((RouterInfo)o);
             }
         }
         return rv;
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java
index 4eb4e482540127990ba30a6f407da9b0530974a9..9c4093899d2b15ba017629ee2ef50534bc02ac0e 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java
@@ -11,6 +11,7 @@ package net.i2p.router.networkdb.kademlia;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
@@ -19,6 +20,7 @@ import net.i2p.data.Hash;
 import net.i2p.data.RouterInfo;
 import net.i2p.router.RouterContext;
 import net.i2p.router.peermanager.PeerProfile;
+import net.i2p.router.util.RandomIterator;
 import net.i2p.stat.Rate;
 import net.i2p.util.Log;
 
@@ -72,8 +74,10 @@ class FloodfillPeerSelector extends PeerSelector {
      */
     List<Hash> selectNearestExplicitThin(Hash key, int maxNumRouters, Set<Hash> peersToIgnore, KBucketSet kbuckets, boolean preferConnected) { 
         if (peersToIgnore == null)
-            peersToIgnore = new HashSet(1);
-        peersToIgnore.add(_context.routerHash());
+            peersToIgnore = Collections.singleton(_context.routerHash());
+        else
+            peersToIgnore.add(_context.routerHash());
+        // TODO this is very slow
         FloodfillSelectionCollector matches = new FloodfillSelectionCollector(key, peersToIgnore, maxNumRouters);
         if (kbuckets == null) return new ArrayList();
         kbuckets.getAll(matches);
@@ -91,8 +95,7 @@ class FloodfillPeerSelector extends PeerSelector {
      *  List is not sorted and not shuffled.
      */
     List<Hash> selectFloodfillParticipants(KBucketSet kbuckets) {
-        Set<Hash> ignore = new HashSet(1);
-        ignore.add(_context.routerHash());
+        Set<Hash> ignore = Collections.singleton(_context.routerHash());
         return selectFloodfillParticipants(ignore, kbuckets);
     }
 
@@ -104,6 +107,8 @@ class FloodfillPeerSelector extends PeerSelector {
      */
     private List<Hash> selectFloodfillParticipants(Set<Hash> toIgnore, KBucketSet kbuckets) {
         if (kbuckets == null) return Collections.EMPTY_LIST;
+        // TODO this is very slow - use profile getPeersByCapability('f') instead
+        _context.statManager().addRateData("netDb.newFSC", 0, 0);
         FloodfillSelectionCollector matches = new FloodfillSelectionCollector(null, toIgnore, 0);
         kbuckets.getAll(matches);
         return matches.getFloodfillParticipants();
@@ -127,8 +132,7 @@ class FloodfillPeerSelector extends PeerSelector {
      *  Group 3: All others
      */
     List<Hash> selectFloodfillParticipants(Hash key, int maxNumRouters, KBucketSet kbuckets) {
-        Set<Hash> ignore = new HashSet(1);
-        ignore.add(_context.routerHash());
+        Set<Hash> ignore = Collections.singleton(_context.routerHash());
         return selectFloodfillParticipants(key, maxNumRouters, ignore, kbuckets);
     }
 
@@ -147,8 +151,7 @@ class FloodfillPeerSelector extends PeerSelector {
      */
     List<Hash> selectFloodfillParticipants(Hash key, int howMany, Set<Hash> toIgnore, KBucketSet kbuckets) {
         if (toIgnore == null) {
-            toIgnore = new HashSet(1);
-            toIgnore.add(_context.routerHash());
+            toIgnore = Collections.singleton(_context.routerHash());
         } else if (!toIgnore.contains(_context.routerHash())) {
             // copy the Set so we don't confuse StoreJob
             toIgnore = new HashSet(toIgnore);
@@ -320,7 +323,6 @@ class FloodfillPeerSelector extends PeerSelector {
          *  Group 4: Non-floodfills, sorted by closest-to-the-key
          */
         public List<Hash> get(int howMany, boolean preferConnected) {
-            Collections.shuffle(_floodfillMatches, _context.random());
             List<Hash> rv = new ArrayList(howMany);
             List<Hash> badff = new ArrayList(howMany);
             List<Hash> unconnectedff = new ArrayList(howMany);
@@ -329,8 +331,8 @@ class FloodfillPeerSelector extends PeerSelector {
             // Only add in "good" floodfills here...
             // Let's say published in last 3h and no failed sends in last 30m
             // (Forever shitlisted ones are excluded in add() above)
-            for (int i = 0; found < howMany && i < _floodfillMatches.size(); i++) {
-                Hash entry = (Hash) _floodfillMatches.get(i);
+            for (Iterator<Hash> iter = new RandomIterator(_floodfillMatches); (found < howMany) && iter.hasNext(); ) {
+                Hash entry = iter.next();
                 RouterInfo info = _context.netDb().lookupRouterInfoLocally(entry);
                 if (info != null && now - info.getPublished() > 3*60*60*1000) {
                     badff.add(entry);
@@ -391,6 +393,7 @@ class FloodfillPeerSelector extends PeerSelector {
         if (peersToIgnore != null && peersToIgnore.contains(Hash.FAKE_HASH)) {
             // return non-ff
             peersToIgnore.addAll(selectFloodfillParticipants(peersToIgnore, kbuckets));
+            // TODO this is very slow
             FloodfillSelectionCollector matches = new FloodfillSelectionCollector(rkey, peersToIgnore, maxNumRouters);
             kbuckets.getAll(matches);
             return matches.get(maxNumRouters);
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java
index 14969df83a0ac39b86ac99f425a6166c594ddf46..babd35dd258497a6cb44c85db5c3ed2dac9b8b50 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java
@@ -12,7 +12,7 @@ import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.Set;
 
-import net.i2p.data.DataStructure;
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterInfo;
@@ -30,7 +30,7 @@ class FloodfillStoreJob extends StoreJob {
      * Send a data structure to the floodfills
      * 
      */
-    public FloodfillStoreJob(RouterContext context, FloodfillNetworkDatabaseFacade facade, Hash key, DataStructure data, Job onSuccess, Job onFailure, long timeoutMs) {
+    public FloodfillStoreJob(RouterContext context, FloodfillNetworkDatabaseFacade facade, Hash key, DatabaseEntry data, Job onSuccess, Job onFailure, long timeoutMs) {
         this(context, facade, key, data, onSuccess, onFailure, timeoutMs, null);
     }
     
@@ -38,7 +38,7 @@ class FloodfillStoreJob extends StoreJob {
      * @param toSkip set of peer hashes of people we dont want to send the data to (e.g. we
      *               already know they have it).  This can be null.
      */
-    public FloodfillStoreJob(RouterContext context, FloodfillNetworkDatabaseFacade facade, Hash key, DataStructure data, Job onSuccess, Job onFailure, long timeoutMs, Set<Hash> toSkip) {
+    public FloodfillStoreJob(RouterContext context, FloodfillNetworkDatabaseFacade facade, Hash key, DatabaseEntry data, Job onSuccess, Job onFailure, long timeoutMs, Set<Hash> toSkip) {
         super(context, facade, key, data, onSuccess, onFailure, timeoutMs, toSkip);
         _facade = facade;
     }
@@ -63,15 +63,12 @@ class FloodfillStoreJob extends StoreJob {
             }
             // Get the time stamp from the data we sent, so the Verify job can meke sure that
             // it finds something stamped with that time or newer.
-            long published = 0;
-            DataStructure data = _state.getData();
-            boolean isRouterInfo = data instanceof RouterInfo;
+            DatabaseEntry data = _state.getData();
+            boolean isRouterInfo = data.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO;
+            long published = data.getDate();
             if (isRouterInfo) {
-                published = ((RouterInfo) data).getPublished();
                 // Temporarily disable
                 return;
-            } else if (data instanceof LeaseSet) {
-                published = ((LeaseSet) data).getEarliestLeaseDate();
             }
             // we should always have exactly one successful entry
             Hash sentTo = null;
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java
index fa944f384dafc0c53a653f3b593532597ac692bb..c7dca12718bb448d6d912d764c82edb6a2bfd63e 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java
@@ -4,7 +4,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import net.i2p.data.DataStructure;
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
 import net.i2p.data.RouterInfo;
 import net.i2p.data.i2np.DatabaseLookupMessage;
@@ -201,10 +201,7 @@ public class FloodfillVerifyStoreJob extends JobImpl {
                 // Verify it's as recent as the one we sent
                 boolean success = false;
                 DatabaseStoreMessage dsm = (DatabaseStoreMessage)_message;
-                if (_isRouterInfo && dsm.getValueType() == DatabaseStoreMessage.KEY_TYPE_ROUTERINFO)
-                    success = dsm.getRouterInfo().getPublished() >= _published;
-                else if ((!_isRouterInfo) && dsm.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET)
-                    success = dsm.getLeaseSet().getEarliestLeaseDate() >= _published;
+                success = dsm.getEntry().getDate() >= _published;
                 if (success) {
                     // store ok, w00t!
                     getContext().profileManager().dbLookupSuccessful(_target, delay);
@@ -218,7 +215,7 @@ public class FloodfillVerifyStoreJob extends JobImpl {
                 if (_log.shouldLog(Log.WARN))
                     _log.warn("Verify failed (older) for " + _key);
                 if (_log.shouldLog(Log.INFO))
-                    _log.info("Rcvd older lease: " + dsm.getLeaseSet());
+                    _log.info("Rcvd older lease: " + dsm.getEntry());
             } else if (_message instanceof DatabaseSearchReplyMessage) {
                 // assume 0 old, all new, 0 invalid, 0 dup
                 getContext().profileManager().dbLookupReply(_target,  0,
@@ -245,11 +242,7 @@ public class FloodfillVerifyStoreJob extends JobImpl {
      *  So at least we'll try THREE ffs round-robin if things continue to fail...
      */
     private void resend() {
-        DataStructure ds;
-        if (_isRouterInfo)
-            ds = _facade.lookupRouterInfoLocally(_key);
-        else
-            ds = _facade.lookupLeaseSetLocally(_key);
+        DatabaseEntry ds = _facade.lookupLocally(_key);
         if (ds != null) {
             Set<Hash> toSkip = new HashSet(2);
             if (_sentTo != null)
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java
index 4e3c9c30ce377d539a505fd699df345d7aee8ea9..1409ecc2a153716777587490f0e21d49edbf600d 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java
@@ -57,9 +57,7 @@ public class HandleFloodfillDatabaseLookupMessageJob extends HandleDatabaseLooku
             // that would increment the netDb.lookupsHandled and netDb.lookupsMatched stats
             DatabaseStoreMessage msg = new DatabaseStoreMessage(getContext());
             RouterInfo me = getContext().router().getRouterInfo();
-            msg.setKey(me.getIdentity().getHash());
-            msg.setRouterInfo(me);
-            msg.setValueType(DatabaseStoreMessage.KEY_TYPE_ROUTERINFO);
+            msg.setEntry(me);
             sendMessage(msg, toPeer, replyTunnel);
         }
     }
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java
index ea53c15667726b8dcf212e1fabcbfcee5d8921b1..a546ad7a27e2467322e1ce8eb500c644c3f6bed0 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java
@@ -11,6 +11,7 @@ package net.i2p.router.networkdb.kademlia;
 import java.util.Date;
 import java.util.Set;
 
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterIdentity;
@@ -55,7 +56,8 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
         boolean wasNew = false;
         RouterInfo prevNetDb = null;
         Hash key = _message.getKey();
-        if (_message.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) {
+        DatabaseEntry entry = _message.getEntry();
+        if (entry.getType() == DatabaseEntry.KEY_TYPE_LEASESET) {
             getContext().statManager().addRateData("netDb.storeLeaseSetHandled", 1, 0);
             if (_log.shouldLog(Log.INFO))
                 _log.info("Handling dbStore of leaseset " + _message);
@@ -75,7 +77,7 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
                     throw new IllegalArgumentException("Peer attempted to store local leaseSet: " +
                                                        key.toBase64().substring(0, 4));
                 }
-                LeaseSet ls = _message.getLeaseSet();
+                LeaseSet ls = (LeaseSet) entry;
                 //boolean oldrar = ls.getReceivedAsReply();
                 //boolean oldrap = ls.getReceivedAsPublished();
                 // If this was received as a response to a query,
@@ -91,10 +93,10 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
                 //boolean rap = ls.getReceivedAsPublished();
                 //if (_log.shouldLog(Log.INFO))
                 //    _log.info("oldrap? " + oldrap + " oldrar? " + oldrar + " newrap? " + rap);
-                LeaseSet match = getContext().netDb().store(key, _message.getLeaseSet());
+                LeaseSet match = getContext().netDb().store(key, ls);
                 if (match == null) {
                     wasNew = true;
-                } else if (match.getEarliestLeaseDate() < _message.getLeaseSet().getEarliestLeaseDate()) {
+                } else if (match.getEarliestLeaseDate() < ls.getEarliestLeaseDate()) {
                     wasNew = true;
                     // If it is in our keyspace and we are talking to it
 
@@ -117,11 +119,12 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
             } catch (IllegalArgumentException iae) {
                 invalidMessage = iae.getMessage();
             }
-        } else if (_message.getValueType() == DatabaseStoreMessage.KEY_TYPE_ROUTERINFO) {
+        } else if (entry.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
+            RouterInfo ri = (RouterInfo) entry;
             getContext().statManager().addRateData("netDb.storeRouterInfoHandled", 1, 0);
             if (_log.shouldLog(Log.INFO))
                 _log.info("Handling dbStore of router " + key + " with publishDate of " 
-                          + new Date(_message.getRouterInfo().getPublished()));
+                          + new Date(ri.getPublished()));
             try {
                 // Never store our RouterInfo received from somebody else.
                 // This generally happens from a FloodfillVerifyStoreJob.
@@ -132,8 +135,8 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
                     // throw rather than return, so that we send the ack below (prevent easy attack)
                     throw new IllegalArgumentException("Peer attempted to store our RouterInfo");
                 }
-                prevNetDb = getContext().netDb().store(key, _message.getRouterInfo());
-                wasNew = ((null == prevNetDb) || (prevNetDb.getPublished() < _message.getRouterInfo().getPublished()));
+                prevNetDb = getContext().netDb().store(key, ri);
+                wasNew = ((null == prevNetDb) || (prevNetDb.getPublished() < ri.getPublished()));
                 // Check new routerinfo address against blocklist
                 if (wasNew) {
                     if (prevNetDb == null) {
@@ -143,7 +146,7 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
                                 _log.warn("Blocklisting new peer " + key);
                     } else {
                         Set oldAddr = prevNetDb.getAddresses();
-                        Set newAddr = _message.getRouterInfo().getAddresses();
+                        Set newAddr = ri.getAddresses();
                         if (newAddr != null && (!newAddr.equals(oldAddr)) &&
                             (!getContext().shitlist().isShitlistedForever(key)) &&
                             getContext().blocklist().isBlocklisted(key) &&
@@ -157,7 +160,7 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
             }
         } else {
             if (_log.shouldLog(Log.ERROR))
-                _log.error("Invalid DatabaseStoreMessage data type - " + _message.getValueType() 
+                _log.error("Invalid DatabaseStoreMessage data type - " + entry.getType() 
                            + ": " + _message);
         }
         
@@ -198,12 +201,9 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
                     return;
                 }
                 long floodBegin = System.currentTimeMillis();
-                if (_message.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET)
-                    _facade.flood(_message.getLeaseSet());
+                _facade.flood(_message.getEntry());
                 // ERR: see comment in HandleDatabaseLookupMessageJob regarding hidden mode
                 //else if (!_message.getRouterInfo().isHidden())
-                else
-                    _facade.flood(_message.getRouterInfo());
                 long floodEnd = System.currentTimeMillis();
                 getContext().statManager().addRateData("netDb.storeFloodNew", floodEnd-floodBegin, 0);
             } else {
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java
index 7ced65ed0fa8ca33e84462df758d0db23145b8bc..48ddc4f2c79fbd5e761944222e284181d72965a0 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java
@@ -85,9 +85,9 @@ class HarvesterJob extends JobImpl {
                 long when = info.getPublished();
                 if (when + MIN_UPDATE_FREQUENCY > now)
                     continue;
-                while (routersByAge.containsKey(new Long(when)))
+                while (routersByAge.containsKey(Long.valueOf(when)))
                     when++;
-               routersByAge.put(new Long(when), info.getIdentity().getHash());
+               routersByAge.put(Long.valueOf(when), info.getIdentity().getHash());
             }
         }
         
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java
index 568a283f9b17eabda7f203bf2a03ecdc81cb0b19..bd7c62fdeb5399644a99fc6da5b503df0514ca67 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java
@@ -387,15 +387,15 @@ class KBucketImpl implements KBucket {
         local.prepareCache();
         KBucketImpl bucket = new KBucketImpl(I2PAppContext.getGlobalContext(), local);
         bucket.setRange(low, high);
-        Hash lowerBoundKey = bucket.getRangeBeginKey();
-        Hash upperBoundKey = bucket.getRangeEndKey();
+        //Hash lowerBoundKey = bucket.getRangeBeginKey();
+        //Hash upperBoundKey = bucket.getRangeEndKey();
         for (int i = 0; i < 100000; i++) {
             Hash rnd = bucket.generateRandomKey();
             //buf.append(toString(rnd.getData())).append('\n');
             boolean ok = bucket.shouldContain(rnd);
             if (!ok) {
                 byte diff[] = bucket.getLocal().cachedXor(rnd);
-                BigInteger dv = new BigInteger(1, diff);
+                //BigInteger dv = new BigInteger(1, diff);
                 //log.error("WTF! bucket doesn't want: \n" + toString(rnd.getData()) 
                 //          + "\nDelta: \n" + toString(diff) + "\nDelta val: \n" + dv.toString(2) 
                 //          + "\nBucket: \n"+bucket, new Exception("WTF"));
@@ -403,7 +403,7 @@ class KBucketImpl implements KBucket {
                 log.error("\nLow: " + DataHelper.toHexString(bucket.getRangeBeginKey().getData()) 
                            + "\nVal: " + DataHelper.toHexString(rnd.getData())
                            + "\nHigh:" + DataHelper.toHexString(bucket.getRangeEndKey().getData()));
-                try { Thread.sleep(1000); } catch (Exception e) {}
+                try { Thread.sleep(1000); } catch (InterruptedException e) {}
                 System.exit(0);
             } else {
                 //_log.debug("Ok, bucket wants: \n" + toString(rnd.getData()));
@@ -415,7 +415,6 @@ class KBucketImpl implements KBucket {
     
     private static void testRand2() {
         Log log = I2PAppContext.getGlobalContext().logManager().getLog(KBucketImpl.class);
-        StringBuilder buf = new StringBuilder(1024*1024*16);
         int low = 1;
         int high = 200;
         byte hash[] = new byte[Hash.HASH_LENGTH];
@@ -424,15 +423,15 @@ class KBucketImpl implements KBucket {
         local.prepareCache();
         KBucketImpl bucket = new KBucketImpl(I2PAppContext.getGlobalContext(), local);
         bucket.setRange(low, high);
-        Hash lowerBoundKey = bucket.getRangeBeginKey();
-        Hash upperBoundKey = bucket.getRangeEndKey();
+        //Hash lowerBoundKey = bucket.getRangeBeginKey();
+        //Hash upperBoundKey = bucket.getRangeEndKey();
         for (int i = 0; i < 100000; i++) {
             Hash rnd = bucket.generateRandomKey();
             //buf.append(toString(rnd.getData())).append('\n');
             boolean ok = bucket.shouldContain(rnd);
             if (!ok) {
                 byte diff[] = bucket.getLocal().cachedXor(rnd);
-                BigInteger dv = new BigInteger(1, diff);
+                //BigInteger dv = new BigInteger(1, diff);
                 //log.error("WTF! bucket doesn't want: \n" + toString(rnd.getData()) 
                 //          + "\nDelta: \n" + toString(diff) + "\nDelta val: \n" + dv.toString(2) 
                 //          + "\nBucket: \n"+bucket, new Exception("WTF"));
@@ -440,13 +439,13 @@ class KBucketImpl implements KBucket {
                 log.error("\nLow: " + DataHelper.toHexString(bucket.getRangeBeginKey().getData()) 
                            + "\nVal: " + DataHelper.toHexString(rnd.getData())
                            + "\nHigh:" + DataHelper.toHexString(bucket.getRangeEndKey().getData()));
-                try { Thread.sleep(1000); } catch (Exception e) {}
+                try { Thread.sleep(1000); } catch (InterruptedException e) {}
                 System.exit(0);
             } else {
                 //_log.debug("Ok, bucket wants: \n" + toString(rnd.getData()));
             }
         }
-        log.info("Passed 100,000 random key generations against a random hash\n" + buf.toString());
+        log.info("Passed 100,000 random key generations against a random hash");
     }
     
     private final static String toString(byte b[]) {
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java
index f576d967c7952b7f79a913fce4ddc0128016be6a..c630e2e9d1e4e27ac6216fbaaab89bc55cf8a099 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java
@@ -42,6 +42,7 @@ class KBucketSet {
         _context = context;
         _log = context.logManager().getLog(KBucketSet.class);
         createBuckets();
+        context.statManager().createRateStat("netDb.KBSGetAllTime", "Time to add all Hashes to the Collector", "NetworkDatabase", new long[] { 60*60*1000 });
     }
     
     /**
@@ -99,8 +100,10 @@ class KBucketSet {
     }
     
     public void getAll(SelectionCollector collector) {
+        long start = _context.clock().now();
         for (int i = 0; i < _buckets.length; i++)
             _buckets[i].getEntries(collector);
+        _context.statManager().addRateData("netDb.KBSGetAllTime", _context.clock().now() - start, 0);
     }
     
     public int pickBucket(Hash key) {
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
index 0ae7181044be256dd93959cfdfa3139a0dedbbb1..7a3b7741a93f2b29c858fbdda91259c0b63083dd 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
@@ -24,8 +24,8 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.TreeSet;
 
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.DataHelper;
-import net.i2p.data.DataStructure;
 import net.i2p.data.Destination;
 import net.i2p.data.Hash;
 import net.i2p.data.Lease;
@@ -88,9 +88,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     void searchComplete(Hash key) {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("search Complete: " + key);
-        SearchJob removed = null;
         synchronized (_activeRequests) {
-            removed = (SearchJob)_activeRequests.remove(key);
+            _activeRequests.remove(key);
         }
     }
     
@@ -121,7 +120,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
      * know anyone or just started up) -- see validate() below
      */
     private final static long ROUTER_INFO_EXPIRATION = 3*24*60*60*1000l;
-    private final static long ROUTER_INFO_EXPIRATION_MIN = 150*60*1000l;
+    private final static long ROUTER_INFO_EXPIRATION_MIN = 120*60*1000l;
     private final static long ROUTER_INFO_EXPIRATION_SHORT = 90*60*1000l;
     private final static long ROUTER_INFO_EXPIRATION_FLOODFILL = 60*60*1000l;
     
@@ -235,11 +234,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     public void startup() {
         _log.info("Starting up the kademlia network database");
         RouterInfo ri = _context.router().getRouterInfo();
-        String dbDir = _context.router().getConfigSetting(PROP_DB_DIR);
-        if (dbDir == null) {
-            _log.info("No DB dir specified [" + PROP_DB_DIR + "], using [" + DEFAULT_DB_DIR + "]");
-            dbDir = DEFAULT_DB_DIR;
-        }
+        String dbDir = _context.getProperty(PROP_DB_DIR, DEFAULT_DB_DIR);
         String enforce = _context.getProperty(PROP_ENFORCE_NETID);
         if (enforce != null) 
             _enforceNetId = Boolean.valueOf(enforce).booleanValue();
@@ -247,7 +242,11 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
             _enforceNetId = DEFAULT_ENFORCE_NETID;
         
         _kb = new KBucketSet(_context, ri.getIdentity().getHash());
-        _ds = new PersistentDataStore(_context, dbDir, this);
+        try {
+            _ds = new PersistentDataStore(_context, dbDir, this);
+        } catch (IOException ioe) {
+            throw new RuntimeException("Unable to initialize netdb storage", ioe);
+        }
         //_ds = new TransientDataStore();
 //        _exploreKeys = new HashSet(64);
         _dbDir = dbDir;
@@ -350,21 +349,11 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     /** get the hashes for all known routers */
     public Set<Hash> getAllRouters() {
         if (!_initialized) return Collections.EMPTY_SET;
-        Set<Hash> keys = _ds.getKeys();
-        Set<Hash> rv = new HashSet(keys.size());
-        if (_log.shouldLog(Log.DEBUG))
-            _log.debug("getAllRouters(): # keys in the datastore: " + keys.size());
-        for (Hash key : keys) {
-            DataStructure ds = _ds.get(key);
-            if (ds == null) {
-                if (_log.shouldLog(Log.INFO))
-                    _log.info("Selected hash " + key.toBase64() + " is not stored locally");
-            } else if ( !(ds instanceof RouterInfo) ) {
-                // leaseSet 
-            } else {
-                if (_log.shouldLog(Log.DEBUG))
-                    _log.debug("getAllRouters(): key is router: " + key.toBase64());
-                rv.add(key);
+        Set<Map.Entry<Hash, DatabaseEntry>> entries = _ds.getMapEntries();
+        Set<Hash> rv = new HashSet(entries.size());
+        for (Map.Entry<Hash, DatabaseEntry> entry : entries) {
+            if (entry.getValue().getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
+                rv.add(entry.getKey());
             }
         }
         return rv;
@@ -383,8 +372,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         public int size() { return _count; }
         public void add(Hash entry) {
             if (_ds == null) return;
-            Object o = _ds.get(entry);
-            if (o instanceof RouterInfo)
+            DatabaseEntry o = _ds.get(entry);
+            if (o != null && o.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO)
                 _count++;
         }
     }
@@ -400,12 +389,9 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     public int getKnownLeaseSets() {  
         if (_ds == null) return 0;
         //return _ds.countLeaseSets();
-        Set<Hash> keys = _ds.getKeys();
         int rv = 0;
-        for (Hash key : keys) {
-            DataStructure ds = _ds.get(key);
-            if (ds != null &&
-                ds instanceof LeaseSet &&
+        for (DatabaseEntry ds : _ds.getEntries()) {
+            if (ds.getType() == DatabaseEntry.KEY_TYPE_LEASESET &&
                 ((LeaseSet)ds).getReceivedAsPublished())
                 rv++;
         }
@@ -418,8 +404,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         public int size() { return _count; }
         public void add(Hash entry) {
             if (_ds == null) return;
-            Object o = _ds.get(entry);
-            if (o instanceof LeaseSet)
+            DatabaseEntry o = _ds.get(entry);
+            if (o != null && o.getType() == DatabaseEntry.KEY_TYPE_LEASESET)
                 _count++;
         }
     }
@@ -434,6 +420,32 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         return _kb.size();
     }
     
+    /**
+     *  @return RouterInfo, LeaseSet, or null, validated
+     *  @since 0.8.3
+     */
+    public DatabaseEntry lookupLocally(Hash key) {
+        if (!_initialized)
+            return null;
+        DatabaseEntry rv = _ds.get(key);
+        if (rv == null)
+            return null;
+        if (rv.getType() == DatabaseEntry.KEY_TYPE_LEASESET) {
+            LeaseSet ls = (LeaseSet)rv;
+            if (ls.isCurrent(Router.CLOCK_FUDGE_FACTOR))
+                return rv;
+            else
+                fail(key);
+        } else if (rv.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
+            try {
+                if (validate(key, (RouterInfo)rv) == null)
+                    return rv;
+            } catch (IllegalArgumentException iae) {}
+            fail(key);
+        }
+        return null;
+    }
+
     public void lookupLeaseSet(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs) {
         if (!_initialized) return;
         LeaseSet ls = lookupLeaseSetLocally(key);
@@ -453,9 +465,9 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     
     public LeaseSet lookupLeaseSetLocally(Hash key) {
         if (!_initialized) return null;
-        if (_ds.isKnown(key)) {
-            DataStructure ds = _ds.get(key);
-            if (ds instanceof LeaseSet) {
+        DatabaseEntry ds = _ds.get(key);
+        if (ds != null) {
+            if (ds.getType() == DatabaseEntry.KEY_TYPE_LEASESET) {
                 LeaseSet ls = (LeaseSet)ds;
                 if (ls.isCurrent(Router.CLOCK_FUDGE_FACTOR)) {
                     return ls;
@@ -489,9 +501,9 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     
     public RouterInfo lookupRouterInfoLocally(Hash key) {
         if (!_initialized) return null;
-        DataStructure ds = _ds.get(key);
+        DatabaseEntry ds = _ds.get(key);
         if (ds != null) {
-            if (ds instanceof RouterInfo) {
+            if (ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
                 // more aggressive than perhaps is necessary, but makes sure we
                 // drop old references that we had accepted on startup (since 
                 // startup allows some lax rules).
@@ -610,6 +622,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
      * Determine whether this leaseSet will be accepted as valid and current
      * given what we know now.
      *
+     * TODO this is called several times, only check the key and signature once
+     *
      * @return reason why the entry is not valid, or null if it is valid
      */
     String validate(Hash key, LeaseSet leaseSet) {
@@ -692,6 +706,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
      * Determine whether this routerInfo will be accepted as valid and current
      * given what we know now.
      *
+     * TODO this is called several times, only check the key and signature once
      */
     String validate(Hash key, RouterInfo routerInfo) throws IllegalArgumentException {
         long now = _context.clock().now();
@@ -807,30 +822,26 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     
     public void fail(Hash dbEntry) {
         if (!_initialized) return;
-        boolean isRouterInfo = false;
-        Object o = _ds.get(dbEntry);
-        if (o instanceof RouterInfo)
-            isRouterInfo = true;
-        
-        if (isRouterInfo) {
-            lookupBeforeDropping(dbEntry, (RouterInfo)o);
-            return;
-        } else {
-            // we always drop leaseSets that are failed [timed out],
-            // regardless of how many routers we have.  this is called on a lease if
-            // it has expired *or* its tunnels are failing and we want to see if there
-            // are any updates
-            if (_log.shouldLog(Log.INFO))
-                _log.info("Dropping a lease: " + dbEntry);
-        }
-        
+        DatabaseEntry o = _ds.get(dbEntry);
         if (o == null) {
+            // if we dont know the key, lets make sure it isn't a now-dead peer
             _kb.remove(dbEntry);
             _context.peerManager().removeCapabilities(dbEntry);
-            // if we dont know the key, lets make sure it isn't a now-dead peer
+            return;
         }
-        
-        _ds.remove(dbEntry, isRouterInfo);
+
+        if (o.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
+            lookupBeforeDropping(dbEntry, (RouterInfo)o);
+            return;
+        }
+
+        // we always drop leaseSets that are failed [timed out],
+        // regardless of how many routers we have.  this is called on a lease if
+        // it has expired *or* its tunnels are failing and we want to see if there
+        // are any updates
+        if (_log.shouldLog(Log.INFO))
+            _log.info("Dropping a lease: " + dbEntry);
+        _ds.remove(dbEntry, false);
     }
     
     /** don't use directly - see F.N.D.F. override */
@@ -852,7 +863,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     public void unpublish(LeaseSet localLeaseSet) {
         if (!_initialized) return;
         Hash h = localLeaseSet.getDestination().calculateHash();
-        DataStructure data = _ds.remove(h);
+        DatabaseEntry data = _ds.remove(h);
         
         if (data == null) {
             if (_log.shouldLog(Log.WARN))
@@ -906,8 +917,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         Set keys = getDataStore().getKeys();
         for (Iterator iter = keys.iterator(); iter.hasNext(); ) {
             Hash key = (Hash)iter.next();
-            Object o = getDataStore().get(key);
-            if (o instanceof LeaseSet)
+            DatabaseEntry o = getDataStore().get(key);
+            if (o.getType() == DatabaseEntry.KEY_TYPE_LEASESET)
                 leases.add(o);
         }
         return leases;
@@ -920,8 +931,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         Set keys = getDataStore().getKeys();
         for (Iterator iter = keys.iterator(); iter.hasNext(); ) {
             Hash key = (Hash)iter.next();
-            Object o = getDataStore().get(key);
-            if (o instanceof RouterInfo)
+            DatabaseEntry o = getDataStore().get(key);
+            if (o.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO)
                 routers.add(o);
         }
         return routers;
@@ -953,7 +964,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     }
 
     /** unused (overridden in FNDF) */
-    public void sendStore(Hash key, DataStructure ds, Job onSuccess, Job onFailure, long sendTimeout, Set toIgnore) {
+    public void sendStore(Hash key, DatabaseEntry ds, Job onSuccess, Job onFailure, long sendTimeout, Set toIgnore) {
         if ( (ds == null) || (key == null) ) {
             if (onFailure != null) 
                 _context.jobQueue().addJob(onFailure);
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/LookupThrottler.java b/router/java/src/net/i2p/router/networkdb/kademlia/LookupThrottler.java
index b4cef3621e5db85747462ed1281e38be05f0a3d1..3c82810e1f52fab03550ff70d6686ec3be355db4 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/LookupThrottler.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/LookupThrottler.java
@@ -58,13 +58,15 @@ class LookupThrottler {
 
         @Override
         public boolean equals(Object obj) {
+            if (obj == null || !(obj instanceof ReplyTunnel))
+                return false;
             return this.h.equals(((ReplyTunnel)obj).h) &&
                    this.id.equals(((ReplyTunnel)obj).id);
         }
     
         @Override
         public int hashCode() {
-            return this.h.hashCode() + this.id.hashCode(); 
+            return this.h.hashCode() ^ this.id.hashCode(); 
         }
     }
 }
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java
index 2a6d889003b25054dfb02a6a86180ee05e3373b3..49dbc8b8fd7c2eadfdcd3c5460b26dc2a85b9660 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java
@@ -31,8 +31,8 @@ import net.i2p.util.Log;
  *  Mostly unused, see overrides in FloodfillPeerSelector
  */
 class PeerSelector {
-    protected Log _log;
-    protected RouterContext _context;
+    protected final Log _log;
+    protected final RouterContext _context;
     
     public PeerSelector(RouterContext ctx) {
         _context = ctx;
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java
index 429489cf08bfe5d8452f29bc65ba7ba02296f817..ad938e7ed37ba65a9df2c4e8a3f5939c973dc25a 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java
@@ -19,8 +19,8 @@ import java.util.NoSuchElementException;
 import java.util.concurrent.ConcurrentHashMap;
 
 import net.i2p.data.Base64;
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.DataFormatException;
-import net.i2p.data.DataStructure;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterInfo;
@@ -39,19 +39,22 @@ import net.i2p.util.SecureFileOutputStream;
  *
  */
 class PersistentDataStore extends TransientDataStore {
-    private Log _log;
-    private String _dbDir;
-    private KademliaNetworkDatabaseFacade _facade;
-    private Writer _writer;
-    private ReadJob _readJob;
+    private final Log _log;
+    private final File _dbDir;
+    private final KademliaNetworkDatabaseFacade _facade;
+    private final Writer _writer;
+    private final ReadJob _readJob;
     private boolean _initialized;
     
     private final static int READ_DELAY = 60*1000;
     
-    public PersistentDataStore(RouterContext ctx, String dbDir, KademliaNetworkDatabaseFacade facade) {
+    /**
+     *  @param dbDir relative path
+     */
+    public PersistentDataStore(RouterContext ctx, String dbDir, KademliaNetworkDatabaseFacade facade) throws IOException {
         super(ctx);
         _log = ctx.logManager().getLog(PersistentDataStore.class);
-        _dbDir = dbDir;
+        _dbDir = getDbDir(dbDir);
         _facade = facade;
         _readJob = new ReadJob();
         _context.jobQueue().addJob(_readJob);
@@ -79,7 +82,6 @@ class PersistentDataStore extends TransientDataStore {
     @Override
     public void restart() {
         super.restart();
-        _dbDir = _facade.getDbDir();
     }
     
     @Override
@@ -89,7 +91,7 @@ class PersistentDataStore extends TransientDataStore {
     }
 
     @Override
-    public DataStructure get(Hash key) {
+    public DatabaseEntry get(Hash key) {
         return get(key, true);
     }
 
@@ -98,8 +100,8 @@ class PersistentDataStore extends TransientDataStore {
      *  @param persist if false, call super only, don't access disk
      */
     @Override
-    public DataStructure get(Hash key, boolean persist) {
-        DataStructure rv =  super.get(key);
+    public DatabaseEntry get(Hash key, boolean persist) {
+        DatabaseEntry rv =  super.get(key);
 /*****
         if (rv != null || !persist)
             return rv;
@@ -114,7 +116,7 @@ class PersistentDataStore extends TransientDataStore {
     }
 
     @Override
-    public DataStructure remove(Hash key) {
+    public DatabaseEntry remove(Hash key) {
         return remove(key, true);
     }
 
@@ -122,7 +124,7 @@ class PersistentDataStore extends TransientDataStore {
      *  @param persist if false, call super only, don't access disk
      */
     @Override
-    public DataStructure remove(Hash key, boolean persist) {
+    public DatabaseEntry remove(Hash key, boolean persist) {
         if (persist) {
             _writer.remove(key);
             _context.jobQueue().addJob(new RemoveJob(key));
@@ -131,7 +133,7 @@ class PersistentDataStore extends TransientDataStore {
     }
     
     @Override
-    public boolean put(Hash key, DataStructure data) {
+    public boolean put(Hash key, DatabaseEntry data) {
         return put(key, data, true);
     }
 
@@ -140,11 +142,11 @@ class PersistentDataStore extends TransientDataStore {
      *  @return success
      */
     @Override
-    public boolean put(Hash key, DataStructure data, boolean persist) {
+    public boolean put(Hash key, DatabaseEntry data, boolean persist) {
         if ( (data == null) || (key == null) ) return false;
         boolean rv = super.put(key, data);
         // Don't bother writing LeaseSets to disk
-        if (rv && persist && data instanceof RouterInfo)
+        if (rv && persist && data.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO)
             _writer.queue(key, data);
         return rv;
     }
@@ -160,8 +162,7 @@ class PersistentDataStore extends TransientDataStore {
             if (_log.shouldLog(Log.INFO))
                 _log.info("Removing key " + _key /* , getAddedBy() */);
             try {
-                File dbDir = getDbDir();
-                removeFile(_key, dbDir);
+                removeFile(_key, _dbDir);
             } catch (IOException ioe) {
                 _log.error("Error removing key " + _key, ioe);
             }
@@ -180,10 +181,10 @@ class PersistentDataStore extends TransientDataStore {
      * We store a reference to the data here too,
      * rather than simply pull it from super.get(), because
      * we will soon have to implement a scheme for keeping only
-     * a subset of all DataStructures in memory and keeping the rest on disk.
+     * a subset of all DatabaseEntrys in memory and keeping the rest on disk.
      */
     private class Writer implements Runnable {
-        private final Map<Hash, DataStructure>_keys;
+        private final Map<Hash, DatabaseEntry>_keys;
         private final Object _waitLock;
         private volatile boolean _quit;
 
@@ -192,7 +193,7 @@ class PersistentDataStore extends TransientDataStore {
             _waitLock = new Object();
         }
 
-        public void queue(Hash key, DataStructure data) {
+        public void queue(Hash key, DatabaseEntry data) {
             int pending = _keys.size();
             boolean exists = (null != _keys.put(key, data));
             if (exists)
@@ -201,7 +202,7 @@ class PersistentDataStore extends TransientDataStore {
         }
 
         /** check to see if it's in the write queue */
-        public DataStructure get(Hash key) {
+        public DatabaseEntry get(Hash key) {
             return _keys.get(key);
         }
 
@@ -212,16 +213,16 @@ class PersistentDataStore extends TransientDataStore {
         public void run() {
             _quit = false;
             Hash key = null;
-            DataStructure data = null;
+            DatabaseEntry data = null;
             int count = 0;
             int lastCount = 0;
             long startTime = 0;
             while (true) {
                 // get a new iterator every time to get a random entry without
                 // having concurrency issues or copying to a List or Array
-                Iterator<Map.Entry<Hash, DataStructure>> iter = _keys.entrySet().iterator();
+                Iterator<Map.Entry<Hash, DatabaseEntry>> iter = _keys.entrySet().iterator();
                 try {
-                    Map.Entry<Hash, DataStructure> entry = iter.next();
+                    Map.Entry<Hash, DatabaseEntry> entry = iter.next();
                     key = entry.getKey();
                     data = entry.getValue();
                     iter.remove();
@@ -236,7 +237,10 @@ class PersistentDataStore extends TransientDataStore {
 
                 if (key != null) {
                     if (data != null) {
-                        write(key, data);
+                        // synch with the reader job
+                        synchronized (_dbDir) {
+                            write(key, data);
+                        }
                         data = null;
                     }
                     key = null;
@@ -271,23 +275,22 @@ class PersistentDataStore extends TransientDataStore {
         }
     }
     
-    private void write(Hash key, DataStructure data) {
+    private void write(Hash key, DatabaseEntry data) {
         if (_log.shouldLog(Log.INFO))
             _log.info("Writing key " + key);
         FileOutputStream fos = null;
         File dbFile = null;
         try {
             String filename = null;
-            File dbDir = getDbDir();
 
-            if (data instanceof LeaseSet)
+            if (data.getType() == DatabaseEntry.KEY_TYPE_LEASESET)
                 filename = getLeaseSetName(key);
-            else if (data instanceof RouterInfo)
+            else if (data.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO)
                 filename = getRouterInfoName(key);
             else
                 throw new IOException("We don't know how to write objects of type " + data.getClass().getName());
 
-            dbFile = new File(dbDir, filename);
+            dbFile = new File(_dbDir, filename);
             long dataPublishDate = getPublishDate(data);
             if (dbFile.lastModified() < dataPublishDate) {
                 // our filesystem is out of date, lets replace it
@@ -313,27 +316,33 @@ class PersistentDataStore extends TransientDataStore {
             if (fos != null) try { fos.close(); } catch (IOException ioe) {}
         }
     }
-    private long getPublishDate(DataStructure data) {
-        if (data instanceof RouterInfo) {
-            return ((RouterInfo)data).getPublished();
-        } else if (data instanceof LeaseSet) {
-            return ((LeaseSet)data).getEarliestLeaseDate();
-        } else {
-            return -1;
-        }
+    private long getPublishDate(DatabaseEntry data) {
+        return data.getDate();
     }
     
     /** This is only for manual reseeding? Why bother every 60 sec??? */
     private class ReadJob extends JobImpl {
         private boolean _alreadyWarned;
+        private long _lastModified;
+
         public ReadJob() {
             super(PersistentDataStore.this._context);
             _alreadyWarned = false;
         }
+
         public String getName() { return "DB Read Job"; }
+
         public void runJob() {
-            _log.info("Rereading new files");
-            readFiles();
+            // check directory mod time to save a lot of object churn in scanning all the file names
+            long lastMod = _dbDir.lastModified();
+            if (lastMod > _lastModified) {
+                _lastModified = lastMod;
+                _log.info("Rereading new files");
+                // synch with the writer job
+                synchronized (_dbDir) {
+                    readFiles();
+                }
+            }
             requeue(READ_DELAY);
         }
         
@@ -343,9 +352,8 @@ class PersistentDataStore extends TransientDataStore {
         
         private void readFiles() {
             int routerCount = 0;
-            try {
-                File dbDir = getDbDir();
-                File routerInfoFiles[] = dbDir.listFiles(RouterInfoFilter.getInstance());
+
+                File routerInfoFiles[] = _dbDir.listFiles(RouterInfoFilter.getInstance());
                 if (routerInfoFiles != null) {
                     routerCount += routerInfoFiles.length;
                     if (routerInfoFiles.length > 5)
@@ -360,9 +368,6 @@ class PersistentDataStore extends TransientDataStore {
                         }
                     }
                 }
-            } catch (IOException ioe) {
-                _log.error("Error reading files in the db dir", ioe);
-            }
             
             if (!_alreadyWarned) {
                 ReseedChecker.checkReseed(_context, routerCount);
@@ -384,9 +389,9 @@ class PersistentDataStore extends TransientDataStore {
         
         private boolean shouldRead() {
             // persist = false to call only super.get()
-            DataStructure data = get(_key, false);
+            DatabaseEntry data = get(_key, false);
             if (data == null) return true;
-            if (data instanceof RouterInfo) {
+            if (data.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
                 long knownDate = ((RouterInfo)data).getPublished();
                 long fileDate = _routerFile.lastModified();
                 if (fileDate > knownDate)
@@ -442,8 +447,8 @@ class PersistentDataStore extends TransientDataStore {
     }
     
     
-    private File getDbDir() throws IOException {
-        File f = new SecureDirectory(_context.getRouterDir(), _dbDir);
+    private File getDbDir(String dbDir) throws IOException {
+        File f = new SecureDirectory(_context.getRouterDir(), dbDir);
         if (!f.exists()) {
             boolean created = f.mkdirs();
             if (!created)
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java
index 223dd70f851faa8436891db3203685bc4e7f0bfd..239fd4772e5cfad9e7d5f8a2cf2e0453775ebc0c 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java
@@ -89,7 +89,7 @@ public class RepublishLeaseSetJob extends JobImpl {
         return _lastPublished;
     }
 
-    class OnRepublishSuccess extends JobImpl {
+    private static class OnRepublishSuccess extends JobImpl {
         public OnRepublishSuccess(RouterContext ctx) { super(ctx); }
         public String getName() { return "Publish leaseSet successful"; }
         public void runJob() { 
@@ -98,7 +98,7 @@ public class RepublishLeaseSetJob extends JobImpl {
         }
     }
 
-    class OnRepublishFailure extends JobImpl {
+    private static class OnRepublishFailure extends JobImpl {
         private RepublishLeaseSetJob _job;
         public OnRepublishFailure(RouterContext ctx, RepublishLeaseSetJob job) { 
             super(ctx); 
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
index 9400a17f696394d1d2be36ce0a432afc00c5f1cc..739a7c14827b4c5b9c969159e8284a4805775f3f 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
@@ -9,13 +9,13 @@ package net.i2p.router.networkdb.kademlia;
  */
 
 import java.util.ArrayList;
-import java.util.HashSet;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.DataHelper;
-import net.i2p.data.DataStructure;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterInfo;
@@ -293,12 +293,12 @@ class SearchJob extends JobImpl {
                 attempted.addAll(closestHashes);
                 for (Iterator iter = closestHashes.iterator(); iter.hasNext(); ) {
                     Hash peer = (Hash)iter.next();
-                    DataStructure ds = _facade.getDataStore().get(peer);
+                    DatabaseEntry ds = _facade.getDataStore().get(peer);
                     if (ds == null) {
                         if (_log.shouldLog(Log.INFO))
                             _log.info("Next closest peer " + peer + " was only recently referred to us, sending a search for them");
                         getContext().netDb().lookupRouterInfo(peer, null, null, _timeoutMs);
-                    } else if (!(ds instanceof RouterInfo)) {
+                    } else if (!(ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO)) {
                         if (_log.shouldLog(Log.WARN))
                             _log.warn(getJobId() + ": Error selecting closest hash that wasnt a router! " 
                                       + peer + " : " + ds.getClass().getName());
@@ -635,7 +635,7 @@ class SearchJob extends JobImpl {
      *
      */
     private void resend() {
-        DataStructure ds = _facade.lookupLeaseSetLocally(_state.getTarget());
+        DatabaseEntry ds = _facade.lookupLeaseSetLocally(_state.getTarget());
         if (ds == null) {
             if (SHOULD_RESEND_ROUTERINFO) {
                 ds = _facade.lookupRouterInfoLocally(_state.getTarget());
@@ -665,8 +665,7 @@ class SearchJob extends JobImpl {
      */
     private boolean resend(RouterInfo toPeer, LeaseSet ls) {
         DatabaseStoreMessage msg = new DatabaseStoreMessage(getContext());
-        msg.setKey(ls.getDestination().calculateHash());
-        msg.setLeaseSet(ls);
+        msg.setEntry(ls);
         msg.setMessageExpiration(getContext().clock().now() + RESEND_TIMEOUT);
 
         TunnelInfo outTunnel = getContext().tunnelManager().selectOutboundTunnel();
@@ -801,8 +800,7 @@ class SearchJob extends JobImpl {
         if (rv) {
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug(getJobId() + ": Queueing up for next time: " + peer);
-            Set s = new HashSet(1);
-            s.add(peer);
+            Set<Hash> s = Collections.singleton(peer);
             _facade.queueForExploration(s);
         }
         return rv;
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java
index 6fe5831ddfa2b83bf1e59342a0fd9a09a35cd3a7..25d86acf180af6be2f296e9fccff3402c097cc2d 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java
@@ -98,7 +98,7 @@ class SearchState {
         synchronized (_pendingPeers) {
             _pendingPeers.addAll(pending);
             for (Iterator iter = pending.iterator(); iter.hasNext(); )
-                _pendingPeerTimes.put(iter.next(), new Long(_context.clock().now()));
+                _pendingPeerTimes.put(iter.next(), Long.valueOf(_context.clock().now()));
         }
         synchronized (_attemptedPeers) {
             _attemptedPeers.addAll(pending);
@@ -107,7 +107,7 @@ class SearchState {
     public void addPending(Hash peer) {
         synchronized (_pendingPeers) {
             _pendingPeers.add(peer);
-            _pendingPeerTimes.put(peer, new Long(_context.clock().now()));
+            _pendingPeerTimes.put(peer, Long.valueOf(_context.clock().now()));
         }
         synchronized (_attemptedPeers) {
             _attemptedPeers.add(peer);
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java
index b5a824472a8cd8fb0b59bcb9cd9fbd41fcfb03e4..22602b497a6d7d787dceab1f2145be80e6955a55 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java
@@ -2,7 +2,9 @@ package net.i2p.router.networkdb.kademlia;
 
 import java.util.Date;
 
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
+import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterInfo;
 import net.i2p.data.i2np.DatabaseSearchReplyMessage;
 import net.i2p.data.i2np.DatabaseStoreMessage;
@@ -78,22 +80,23 @@ class SearchUpdateReplyFoundJob extends JobImpl implements ReplyJob {
             long timeToReply = _state.dataFound(_peer);
             
             DatabaseStoreMessage msg = (DatabaseStoreMessage)message;
-            if (msg.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) {
+            DatabaseEntry entry = msg.getEntry();
+            if (entry.getType() == DatabaseEntry.KEY_TYPE_LEASESET) {
                 try {
-                    _facade.store(msg.getKey(), msg.getLeaseSet());
+                    _facade.store(msg.getKey(), (LeaseSet) entry);
                     getContext().profileManager().dbLookupSuccessful(_peer, timeToReply);
                 } catch (IllegalArgumentException iae) {
                     if (_log.shouldLog(Log.ERROR))
                         _log.warn("Peer " + _peer + " sent us an invalid leaseSet: " + iae.getMessage());
                     getContext().profileManager().dbLookupReply(_peer, 0, 0, 1, 0, timeToReply);
                 }
-            } else if (msg.getValueType() == DatabaseStoreMessage.KEY_TYPE_ROUTERINFO) {
+            } else if (entry.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
                 if (_log.shouldLog(Log.INFO))
                     _log.info(getJobId() + ": dbStore received on search containing router " 
                               + msg.getKey() + " with publishDate of " 
-                              + new Date(msg.getRouterInfo().getPublished()));
+                              + new Date(entry.getDate()));
                 try {
-                    _facade.store(msg.getKey(), msg.getRouterInfo());
+                    _facade.store(msg.getKey(), (RouterInfo) entry);
                     getContext().profileManager().dbLookupSuccessful(_peer, timeToReply);
                 } catch (IllegalArgumentException iae) {
                     if (_log.shouldLog(Log.ERROR))
@@ -102,7 +105,7 @@ class SearchUpdateReplyFoundJob extends JobImpl implements ReplyJob {
                 }
             } else {
                 if (_log.shouldLog(Log.ERROR))
-                    _log.error(getJobId() + ": Unknown db store type?!@ " + msg.getValueType());
+                    _log.error(getJobId() + ": Unknown db store type?!@ " + entry.getType());
             }
         } else if (message instanceof DatabaseSearchReplyMessage) {
             _job.replyFound((DatabaseSearchReplyMessage)message, _peer);
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 ad8217c6a7944319b2ee195015501445c4a456c8..c1a8494290d3be1bb1573b2d6bd3ebcc6eab8b51 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
@@ -13,7 +13,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
-import net.i2p.data.DataStructure;
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterInfo;
@@ -61,7 +61,7 @@ class StoreJob extends JobImpl {
      * 
      */
     public StoreJob(RouterContext context, KademliaNetworkDatabaseFacade facade, Hash key, 
-                    DataStructure data, Job onSuccess, Job onFailure, long timeoutMs) {
+                    DatabaseEntry data, Job onSuccess, Job onFailure, long timeoutMs) {
         this(context, facade, key, data, onSuccess, onFailure, timeoutMs, null);
     }
     
@@ -70,7 +70,7 @@ class StoreJob extends JobImpl {
      *               already know they have it).  This can be null.
      */
     public StoreJob(RouterContext context, KademliaNetworkDatabaseFacade facade, Hash key, 
-                    DataStructure data, Job onSuccess, Job onFailure, long timeoutMs, Set<Hash> toSkip) {
+                    DatabaseEntry data, Job onSuccess, Job onFailure, long timeoutMs, Set<Hash> toSkip) {
         super(context);
         _log = context.logManager().getLog(StoreJob.class);
         _facade = facade;
@@ -167,8 +167,8 @@ class StoreJob extends JobImpl {
                 _log.info(getJobId() + ": Continue sending key " + _state.getTarget() + " after " + _state.getAttempted().size() + " tries to " + closestHashes);
             for (Iterator<Hash> iter = closestHashes.iterator(); iter.hasNext(); ) {
                 Hash peer = iter.next();
-                DataStructure ds = _facade.getDataStore().get(peer);
-                if ( (ds == null) || !(ds instanceof RouterInfo) ) {
+                DatabaseEntry ds = _facade.getDataStore().get(peer);
+                if ( (ds == null) || !(ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) ) {
                     if (_log.shouldLog(Log.INFO))
                         _log.info(getJobId() + ": Error selecting closest hash that wasnt a router! " + peer + " : " + ds);
                     _state.addSkipped(peer);
@@ -255,16 +255,19 @@ class StoreJob extends JobImpl {
      *
      */
     private void sendStore(RouterInfo router, int responseTime) {
+        if (!_state.getTarget().equals(_state.getData().getHash())) {
+            _log.error("Hash mismatch StoreJob");
+            return;
+        }
         DatabaseStoreMessage msg = new DatabaseStoreMessage(getContext());
-        msg.setKey(_state.getTarget());
-        if (_state.getData() instanceof RouterInfo) {
-            msg.setRouterInfo((RouterInfo)_state.getData());
+        if (_state.getData().getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
             if (responseTime > MAX_DIRECT_EXPIRATION)
                 responseTime = MAX_DIRECT_EXPIRATION;
-        } else if (_state.getData() instanceof LeaseSet) 
-            msg.setLeaseSet((LeaseSet)_state.getData());
-        else
+        } else if (_state.getData().getType() == DatabaseEntry.KEY_TYPE_LEASESET) {
+        } else {
             throw new IllegalArgumentException("Storing an unknown data type! " + _state.getData());
+        }
+        msg.setEntry(_state.getData());
         msg.setMessageExpiration(getContext().clock().now() + _timeoutMs);
 
         if (router.getIdentity().equals(getContext().router().getRouterInfo().getIdentity())) {
@@ -286,7 +289,7 @@ class StoreJob extends JobImpl {
      *
      */
     private void sendStore(DatabaseStoreMessage msg, RouterInfo peer, long expiration) {
-        if (msg.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) {
+        if (msg.getEntry().getType() == DatabaseEntry.KEY_TYPE_LEASESET) {
             getContext().statManager().addRateData("netDb.storeLeaseSetSent", 1, 0);
             // if it is an encrypted leaseset...
             if (getContext().keyRing().get(msg.getKey()) != null)
@@ -440,7 +443,6 @@ class StoreJob extends JobImpl {
                 sent = wm.getMessage();
                 _state.addPending(to, wm);
             } else {
-                sent = msg;
                 _state.addPending(to);
                 // now that almost all floodfills are at 0.7.10,
                 // just refuse to store unencrypted to older ones.
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java
index eb131fdfc5c5608bbe1e05aeb53cb58d498fec6a..9666c09be520533526c44e46a9621b9b6dce8f37 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java
@@ -9,7 +9,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
-import net.i2p.data.DataStructure;
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
 import net.i2p.router.RouterContext;
 
@@ -19,7 +19,7 @@ import net.i2p.router.RouterContext;
 class StoreState {
     private RouterContext _context;
     private Hash _key;
-    private DataStructure _data;
+    private DatabaseEntry _data;
     private final HashSet<Hash> _pendingPeers;
     private Map<Hash, Long> _pendingPeerTimes;
     private Map<Hash, MessageWrapper.WrappedMessage> _pendingMessages;
@@ -31,10 +31,10 @@ class StoreState {
     private volatile long _completed;
     private volatile long _started;
 
-    public StoreState(RouterContext ctx, Hash key, DataStructure data) {
+    public StoreState(RouterContext ctx, Hash key, DatabaseEntry data) {
         this(ctx, key, data, null);
     }
-    public StoreState(RouterContext ctx, Hash key, DataStructure data, Set<Hash> toSkip) {
+    public StoreState(RouterContext ctx, Hash key, DatabaseEntry data, Set<Hash> toSkip) {
         _context = ctx;
         _key = key;
         _data = data;
@@ -54,7 +54,7 @@ class StoreState {
     }
 
     public Hash getTarget() { return _key; }
-    public DataStructure getData() { return _data; }
+    public DatabaseEntry getData() { return _data; }
     public Set<Hash> getPending() { 
         synchronized (_pendingPeers) {
             return (Set<Hash>)_pendingPeers.clone(); 
@@ -114,7 +114,7 @@ class StoreState {
     public void addPending(Hash peer) {
         synchronized (_pendingPeers) {
             _pendingPeers.add(peer);
-            _pendingPeerTimes.put(peer, new Long(_context.clock().now()));
+            _pendingPeerTimes.put(peer, Long.valueOf(_context.clock().now()));
         }
         synchronized (_attemptedPeers) {
             _attemptedPeers.add(peer);
@@ -124,7 +124,7 @@ class StoreState {
         synchronized (_pendingPeers) {
             _pendingPeers.addAll(pending);
             for (Iterator<Hash> iter = pending.iterator(); iter.hasNext(); ) 
-                _pendingPeerTimes.put(iter.next(), new Long(_context.clock().now()));
+                _pendingPeerTimes.put(iter.next(), Long.valueOf(_context.clock().now()));
         }
         synchronized (_attemptedPeers) {
             _attemptedPeers.addAll(pending);
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java
index d5e10738c26c560ed97169bf4d4d4f296336288b..e0a3a2a633762639891abf69b4697fb0143dafff 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java
@@ -8,14 +8,15 @@ package net.i2p.router.networkdb.kademlia;
  *
  */
 
+import java.util.Collection;
 import java.util.Date;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.DataHelper;
-import net.i2p.data.DataStructure;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterInfo;
@@ -24,7 +25,7 @@ import net.i2p.util.Log;
 
 class TransientDataStore implements DataStore {
     private Log _log;
-    private ConcurrentHashMap<Hash, DataStructure> _data;
+    private ConcurrentHashMap<Hash, DatabaseEntry> _data;
     protected RouterContext _context;
     
     public TransientDataStore(RouterContext ctx) {
@@ -51,12 +52,28 @@ class TransientDataStore implements DataStore {
         return new HashSet(_data.keySet());
     }
     
+    /**
+     *  @return not a copy
+     *  @since 0.8.3
+     */
+    public Collection<DatabaseEntry> getEntries() {
+        return _data.values();
+    }
+
+    /**
+     *  @return not a copy
+     *  @since 0.8.3
+     */
+    public Set<Map.Entry<Hash, DatabaseEntry>> getMapEntries() {
+        return _data.entrySet();
+    }
+
     /** for PersistentDataStore only - don't use here @throws IAE always */
-    public DataStructure get(Hash key, boolean persist) {
+    public DatabaseEntry get(Hash key, boolean persist) {
         throw new IllegalArgumentException("no");
     }
 
-    public DataStructure get(Hash key) {
+    public DatabaseEntry get(Hash key) {
         return _data.get(key);
     }
     
@@ -66,15 +83,15 @@ class TransientDataStore implements DataStore {
 
     public int countLeaseSets() {
         int count = 0;
-        for (DataStructure d : _data.values()) {
-            if (d instanceof LeaseSet)
+        for (DatabaseEntry d : _data.values()) {
+            if (d.getType() == DatabaseEntry.KEY_TYPE_LEASESET)
                 count++;
         }
         return count;
     }
     
     /** for PersistentDataStore only - don't use here @throws IAE always */
-    public boolean put(Hash key, DataStructure data, boolean persist) {
+    public boolean put(Hash key, DatabaseEntry data, boolean persist) {
         throw new IllegalArgumentException("no");
     }
 
@@ -82,14 +99,14 @@ class TransientDataStore implements DataStore {
      *  @param data must be validated before here
      *  @return success
      */
-    public boolean put(Hash key, DataStructure data) {
+    public boolean put(Hash key, DatabaseEntry data) {
         if (data == null) return false;
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Storing key " + key);
-        DataStructure old = null;
+        DatabaseEntry old = null;
         old = _data.putIfAbsent(key, data);
         boolean rv = false;
-        if (data instanceof RouterInfo) {
+        if (data.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
             // Don't do this here so we don't reset it at router startup;
             // the StoreMessageJob calls this
             //_context.profileManager().heardAbout(key);
@@ -113,7 +130,7 @@ class TransientDataStore implements DataStore {
                     _log.info("New router for " + key + ": published on " + new Date(ri.getPublished()));
                 rv = true;
             }
-        } else if (data instanceof LeaseSet) {
+        } else if (data.getType() == DatabaseEntry.KEY_TYPE_LEASESET) {
             LeaseSet ls = (LeaseSet)data;
             if (old != null) {
                 LeaseSet ols = (LeaseSet)old;
@@ -144,23 +161,13 @@ class TransientDataStore implements DataStore {
         return rv;
     }
     
-    @Override
-    public int hashCode() {
-        return DataHelper.hashCode(_data);
-    }
-    @Override
-    public boolean equals(Object obj) {
-        if ( (obj == null) || (obj.getClass() != getClass()) ) return false;
-        TransientDataStore ds = (TransientDataStore)obj;
-        return DataHelper.eq(ds._data, _data);
-    }
     @Override
     public String toString() {
         StringBuilder buf = new StringBuilder();
         buf.append("Transient DataStore: ").append(_data.size()).append("\nKeys: ");
-        for (Map.Entry<Hash, DataStructure> e : _data.entrySet()) {
+        for (Map.Entry<Hash, DatabaseEntry> e : _data.entrySet()) {
             Hash key = e.getKey();
-            DataStructure dp = e.getValue();
+            DatabaseEntry dp = e.getValue();
             buf.append("\n\t*Key:   ").append(key.toString()).append("\n\tContent: ").append(dp.toString());
         }
         buf.append("\n");
@@ -168,11 +175,11 @@ class TransientDataStore implements DataStore {
     }
     
     /** for PersistentDataStore only - don't use here */
-    public DataStructure remove(Hash key, boolean persist) {
+    public DatabaseEntry remove(Hash key, boolean persist) {
         throw new IllegalArgumentException("no");
     }
 
-    public DataStructure remove(Hash key) {
+    public DatabaseEntry remove(Hash key) {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Removing key " + key.toBase64());
         return _data.remove(key);
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/XORComparator.java b/router/java/src/net/i2p/router/networkdb/kademlia/XORComparator.java
index 3c2b9d2d2c8c8f5b2e11909f2714077c9484f685..71dbefc6e2c4b1e53f6aac9e7b8311bd3efd2a71 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/XORComparator.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/XORComparator.java
@@ -9,7 +9,7 @@ import net.i2p.data.Hash;
  * Help sort Hashes in relation to a base key using the XOR metric
  *
  */
-class XORComparator implements Comparator {
+class XORComparator implements Comparator<Hash> {
     private Hash _base;
     /**
      * @param target key to compare distances with
@@ -17,15 +17,11 @@ class XORComparator implements Comparator {
     public XORComparator(Hash target) {
         _base = target;
     }
-    public int compare(Object lhs, Object rhs) {
+    public int compare(Hash lhs, Hash rhs) {
         if (lhs == null) throw new NullPointerException("LHS is null");
         if (rhs == null) throw new NullPointerException("RHS is null");
-        if ( (lhs instanceof Hash) && (rhs instanceof Hash) ) {
-            byte lhsDelta[] = DataHelper.xor(((Hash)lhs).getData(), _base.getData());
-            byte rhsDelta[] = DataHelper.xor(((Hash)rhs).getData(), _base.getData());
-            return DataHelper.compareTo(lhsDelta, rhsDelta);
-        } else {
-            throw new ClassCastException(lhs.getClass().getName() + " / " + rhs.getClass().getName());
-        }
+        byte lhsDelta[] = DataHelper.xor(lhs.getData(), _base.getData());
+        byte rhsDelta[] = DataHelper.xor(rhs.getData(), _base.getData());
+        return DataHelper.compareTo(lhsDelta, rhsDelta);
     }
 }
diff --git a/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java b/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java
index dd11c4ae2145178c5fc1fbc75cd5d1f86c12c5db..6bb816985da20e829434de112d4e815c3b47fc43 100644
--- a/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java
+++ b/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java
@@ -35,9 +35,9 @@ public class ReseedChecker {
         if (!noReseedFile.exists() && !noReseedFileAlt1.exists() && !noReseedFileAlt2.exists() && !noReseedFileAlt3.exists()) {
             Log _log = context.logManager().getLog(ReseedChecker.class);
             if (count <= 1)
-                _log.error("Downloading peer router information for a new I2P installation");
+                _log.logAlways(Log.INFO, "Downloading peer router information for a new I2P installation");
             else
-                _log.error("Very few routerInfo files remaining - reseeding now");
+                _log.logAlways(Log.WARN, "Very few known peers remaining - reseeding now");
             Reseeder reseeder = new Reseeder(context);
             reseeder.requestReseed();
         }
diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java
index 4f225ec977ddfc59cc2508744d9da3bcb3043f4d..3e1c0b0753c533f69ba5eff10d29cecb2c53647a 100644
--- a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java
+++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java
@@ -3,6 +3,7 @@ package net.i2p.router.networkdb.reseed;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -13,7 +14,10 @@ import java.util.Set;
 import java.util.StringTokenizer;
 
 import net.i2p.I2PAppContext;
+import net.i2p.data.DataHelper;
+import net.i2p.router.RouterClock;
 import net.i2p.router.RouterContext;
+import net.i2p.router.util.RFC822Date;
 import net.i2p.util.EepGet;
 import net.i2p.util.I2PAppThread;
 import net.i2p.util.Log;
@@ -33,21 +37,32 @@ import net.i2p.util.Translate;
  * the router log, and the wrapper log.
  */
 public class Reseeder {
+    /** FIXME don't keep a static reference, store _isRunning some other way */
     private static ReseedRunner _reseedRunner;
-    private RouterContext _context;
-    private Log _log;
+    private final RouterContext _context;
+    private final Log _log;
 
     // Reject unreasonably big files, because we download into a ByteArrayOutputStream.
     private static final long MAX_RESEED_RESPONSE_SIZE = 1024 * 1024;
+    /** limit to spend on a single host, to avoid getting stuck on one that is seriously overloaded */
+    private static final int MAX_TIME_PER_HOST = 7 * 60 * 1000;
 
+    /**
+     *  NOTE - URLs in both the standard and SSL groups should use the same hostname and path,
+     *         so the reseed process will not download from both.
+     *
+     *  NOTE - Each seedURL must be a directory, it must end with a '/',
+     *         it can't end with 'index.html', for example. Both because of how individual file
+     *         URLs are constructed, and because SSLEepGet doesn't follow redirects.
+     */
     public static final String DEFAULT_SEED_URL =
-              "http://a.netdb.i2p2.de/,http://b.netdb.i2p2.de/,http://c.netdb.i2p2.de/," +
-              "http://reseed.i2p-projekt.de/,http://www.i2pbote.net/netDb/,http://r31453.ovh.net/static_media/files/netDb/";
+              "http://a.netdb.i2p2.de/,http://c.netdb.i2p2.de/," +
+              "http://reseed.i2p-projekt.de/,http://forum.i2p2.de/netdb/,http://www.i2pbote.net/netDb/,http://r31453.ovh.net/static_media/files/netDb/";
 
     /** @since 0.8.2 */
     public static final String DEFAULT_SSL_SEED_URL =
               "https://a.netdb.i2p2.de/,https://c.netdb.i2p2.de/," +
-              "https://www.i2pbote.net/netDb/," +
+              "https://forum.i2p2.de/netdb/,https://www.i2pbote.net/netDb/," +
               "https://r31453.ovh.net/static_media/files/netDb/";
 
     private static final String PROP_INPROGRESS = "net.i2p.router.web.ReseedHandler.reseedInProgress";
@@ -91,13 +106,13 @@ public class Reseeder {
         private String _proxyHost;
         private int _proxyPort;
         private SSLEepGet.SSLState _sslState;
+        private int _gotDate;
+        private long _attemptStarted;
+        private static final int MAX_DATE_SETS = 2;
 
         public ReseedRunner() {
-            _isRunning = false; 
-            System.clearProperty(PROP_ERROR);
-            System.setProperty(PROP_STATUS, _("Reseeding"));
-            System.setProperty(PROP_INPROGRESS, "true");
         }
+
         public boolean isRunning() { return _isRunning; }
 
         /*
@@ -106,6 +121,11 @@ public class Reseeder {
          */
         public void run() {
             _isRunning = true;
+            System.clearProperty(PROP_ERROR);
+            System.setProperty(PROP_STATUS, _("Reseeding"));
+            System.setProperty(PROP_INPROGRESS, "true");
+            _attemptStarted = 0;
+            _gotDate = 0;
             _sslState = null;  // start fresh
             if (_context.getBooleanProperty(PROP_PROXY_ENABLE)) {
                 _proxyHost = _context.getProperty(PROP_PROXY_HOST);
@@ -145,8 +165,48 @@ public class Reseeder {
         public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url) {}
         public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) {}
         public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt) {}
-        public void headerReceived(String url, int attemptNum, String key, String val) {}
-        public void attempting(String url) {}
+
+        /**
+         *  Use the Date header as a backup time source
+         */
+        public void headerReceived(String url, int attemptNum, String key, String val) {
+            // We do this more than once, because
+            // the first SSL handshake may take a while, and it may take the server
+            // a while to render the index page.
+            if (_gotDate < MAX_DATE_SETS && "date".equalsIgnoreCase(key) && _attemptStarted > 0) {
+                long timeRcvd = System.currentTimeMillis();
+                long serverTime = RFC822Date.parse822Date(val);
+                if (serverTime > 0) {
+                    // add 500ms since it's 1-sec resolution, and add half the RTT
+                    long now = serverTime + 500 + ((timeRcvd - _attemptStarted) / 2);
+                    long offset = now - _context.clock().now();
+                    if (_context.clock().getUpdatedSuccessfully()) {
+                        // 2nd time better than the first
+                        if (_gotDate > 0)
+                            _context.clock().setNow(now, RouterClock.DEFAULT_STRATUM - 2);
+                        else
+                            _context.clock().setNow(now, RouterClock.DEFAULT_STRATUM - 1);
+                        if (_log.shouldLog(Log.WARN))
+                            _log.warn("Reseed adjusting clock by " +
+                                      DataHelper.formatDuration(Math.abs(offset)));
+                    } else {
+                        // No peers or NTP yet, this is probably better than the peer average will be for a while
+                        // default stratum - 1, so the peer average is a worse stratum
+                        _context.clock().setNow(now, RouterClock.DEFAULT_STRATUM - 1);
+                        _log.logAlways(Log.WARN, "NTP failure, Reseed adjusting clock by " +
+                                                 DataHelper.formatDuration(Math.abs(offset)));
+                    }
+                    _gotDate++;
+                }
+            }
+        }
+
+        /** save the start time */
+        public void attempting(String url) {
+            if (_gotDate < MAX_DATE_SETS)
+                _attemptStarted = System.currentTimeMillis();
+        }
+
         // End of EepGet status listeners
 
         /**
@@ -166,7 +226,7 @@ public class Reseeder {
             List<String> URLList = new ArrayList();
             String URLs = _context.getProperty(PROP_RESEED_URL);
             boolean defaulted = URLs == null;
-            boolean SSLDisable = _context.getBooleanProperty(PROP_SSL_DISABLE);
+            boolean SSLDisable = _context.getBooleanPropertyDefaultTrue(PROP_SSL_DISABLE);
             if (defaulted) {
                 if (SSLDisable)
                     URLs = DEFAULT_SEED_URL;
@@ -176,14 +236,14 @@ public class Reseeder {
             StringTokenizer tok = new StringTokenizer(URLs, " ,");
             while (tok.hasMoreTokens())
                 URLList.add(tok.nextToken().trim());
-            Collections.shuffle(URLList);
+            Collections.shuffle(URLList, _context.random());
             if (defaulted && !SSLDisable) {
                 // put the non-SSL at the end of the SSL
                 List<String> URLList2 = new ArrayList();
                 tok = new StringTokenizer(DEFAULT_SEED_URL, " ,");
                 while (tok.hasMoreTokens())
                     URLList2.add(tok.nextToken().trim());
-                Collections.shuffle(URLList2);
+                Collections.shuffle(URLList2, _context.random());
                 URLList.addAll(URLList2);
             }
             int total = 0;
@@ -228,6 +288,8 @@ public class Reseeder {
          **/
         private int reseedOne(String seedURL, boolean echoStatus) {
             try {
+                // Don't use context clock as we may be adjusting the time
+                final long timeLimit = System.currentTimeMillis() + MAX_TIME_PER_HOST;
                 System.setProperty(PROP_STATUS, _("Reseeding: fetching seed URL."));
                 System.err.println("Reseeding from " + seedURL);
                 URL dir = new URL(seedURL);
@@ -262,11 +324,12 @@ public class Reseeder {
                 }
 
                 List<String> urlList = new ArrayList(urls);
-                Collections.shuffle(urlList);
+                Collections.shuffle(urlList, _context.random());
                 int fetched = 0;
                 int errors = 0;
                 // 200 max from one URL
-                for (Iterator<String> iter = urlList.iterator(); iter.hasNext() && fetched < 200; ) {
+                for (Iterator<String> iter = urlList.iterator();
+                     iter.hasNext() && fetched < 200 && System.currentTimeMillis() < timeLimit; ) {
                     try {
                         System.setProperty(PROP_STATUS,
                             _("Reseeding: fetching router info from seed URL ({0} successful, {1} errors).", fetched, errors));
@@ -278,7 +341,7 @@ public class Reseeder {
                             if (fetched % 60 == 0)
                                 System.out.println();
                         }
-                    } catch (Exception e) {
+                    } catch (IOException e) {
                         errors++;
                     }
                 }
@@ -298,20 +361,20 @@ public class Reseeder {
         }
     
         /* Since we don't return a value, we should always throw an exception if something fails. */
-        private void fetchSeed(String seedURL, String peer) throws Exception {
+        private void fetchSeed(String seedURL, String peer) throws IOException {
             URL url = new URL(seedURL + (seedURL.endsWith("/") ? "" : "/") + "routerInfo-" + peer + ".dat");
 
             byte data[] = readURL(url);
             if (data == null) {
                 // Logging deprecated here since attemptFailed() provides better info
                 _log.debug("Failed fetching seed: " + url.toString());
-                throw new Exception ("Failed fetching seed.");
+                throw new IOException("Failed fetching seed.");
             }
             //System.out.println("read: " + (data != null ? data.length : -1));
             writeSeed(peer, data);
         }
 
-        private byte[] readURL(URL url) throws Exception {
+        private byte[] readURL(URL url) throws IOException {
             ByteArrayOutputStream baos = new ByteArrayOutputStream(4*1024);
 
             EepGet get;
@@ -338,15 +401,21 @@ public class Reseeder {
             return null;
         }
     
-        private void writeSeed(String name, byte data[]) throws Exception {
+        private void writeSeed(String name, byte data[]) throws IOException {
             String dirName = "netDb"; // _context.getProperty("router.networkDatabase.dbDir", "netDb");
             File netDbDir = new SecureDirectory(_context.getRouterDir(), dirName);
             if (!netDbDir.exists()) {
                 boolean ok = netDbDir.mkdirs();
             }
-            FileOutputStream fos = new SecureFileOutputStream(new File(netDbDir, "routerInfo-" + name + ".dat"));
-            fos.write(data);
-            fos.close();
+            FileOutputStream fos = null;
+            try {
+                fos = new SecureFileOutputStream(new File(netDbDir, "routerInfo-" + name + ".dat"));
+                fos.write(data);
+            } finally {
+                try {
+                    if (fos != null) fos.close();
+                } catch (IOException ioe) {}
+            }
         }
 
     }
diff --git a/router/java/src/net/i2p/router/peermanager/Calculator.java b/router/java/src/net/i2p/router/peermanager/Calculator.java
deleted file mode 100644
index 99fb99fd8240a28600e2d96ddb5663c983bdc091..0000000000000000000000000000000000000000
--- a/router/java/src/net/i2p/router/peermanager/Calculator.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package net.i2p.router.peermanager;
-
-
-/**
- * Provide a means of quantifying a profiles fitness in some particular aspect, as well
- * as to coordinate via statics the four known aspects.
- *
- */
-public class Calculator {
-    /**
-     * Evaluate the profile according to the current metric
-     */
-    public double calc(PeerProfile profile) { return 0.0d; }
-    /**
-     * Evaluate the profile according to the current metric
-     */
-    public boolean calcBoolean(PeerProfile profile) { return false; }
-}
diff --git a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java
index 891ca88c47596d167dfb19c44701a16e0f106335..96570260c5de43c09b24efe897e8ca963b4a0b8c 100644
--- a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java
+++ b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java
@@ -1,30 +1,22 @@
 package net.i2p.router.peermanager;
 
-import net.i2p.router.RouterContext;
+import net.i2p.I2PAppContext;
 import net.i2p.stat.Rate;
 import net.i2p.stat.RateStat;
-import net.i2p.util.Log;
 
 /**
  * Estimate how many of our tunnels the peer can join per hour.
  */
-public class CapacityCalculator extends Calculator {
-    private Log _log;
-    private RouterContext _context;
-    
-    public CapacityCalculator(RouterContext context) {
-        _context = context;
-        _log = context.logManager().getLog(CapacityCalculator.class);
-    }
+class CapacityCalculator {
+    private static final I2PAppContext _context = I2PAppContext.getGlobalContext();
     
     /** used to adjust each period so that we keep trying to expand the peer's capacity */
-    static long GROWTH_FACTOR = 5;
+    static final long GROWTH_FACTOR = 5;
     
     /** the calculator estimates over a 1 hour period */
     private static long ESTIMATE_PERIOD = 60*60*1000;
     
-    @Override
-    public double calc(PeerProfile profile) {
+    public static double calc(PeerProfile profile) {
         double capacity;
 
         if (tooOld(profile)) { 
@@ -91,37 +83,42 @@ public class CapacityCalculator extends Calculator {
      *
      * Let A = accects, R = rejects, F = fails
      * @return estimated and adjusted accepts per hour, for the given period
-     *         which is, more or less, max(0, 5 + (A * (A / (A + R))) - (4 * F))
+     *         which is, more or less, max(0, 5 + (A * (A / (A + 2R))) - (4 * F))
      */
     private static double estimateCapacity(RateStat acceptStat, RateStat rejectStat, RateStat failedStat, int period) {
         Rate curAccepted = acceptStat.getRate(period);
         Rate curRejected = rejectStat.getRate(period);
         Rate curFailed = failedStat.getRate(period);
 
-        long eventCount = 0;
-        if (curAccepted != null)
+        double eventCount = 0;
+        if (curAccepted != null) {
             eventCount = curAccepted.getCurrentEventCount() + curAccepted.getLastEventCount();
-        // Punish for rejections.
-        // We don't want to simply do eventCount -= rejected or we get to zero with 50% rejection,
-        // and we don't want everybody to be at zero during times of congestion.
-        if (eventCount > 0) {
-            long rejected = curRejected.getCurrentEventCount() + curRejected.getLastEventCount();
-            eventCount = eventCount * eventCount / (eventCount + rejected);
+            // Punish for rejections.
+            // We don't want to simply do eventCount -= rejected or we get to zero with 50% rejection,
+            // and we don't want everybody to be at zero during times of congestion.
+            if (eventCount > 0 && curRejected != null) {
+                long rejected = curRejected.getCurrentEventCount() + curRejected.getLastEventCount();
+                if (rejected > 0)
+                    eventCount *= eventCount / (eventCount + (2 * rejected));
+            }
         }
+
         double stretch = ((double)ESTIMATE_PERIOD) / period;
         double val = eventCount * stretch;
-        long failed = 0;
+
         // Let's say a failure is 4 times worse than a rejection.
         // It's actually much worse than that, but with 2-hop tunnels and a 8-peer
         // fast pool, for example, you have a 1/7 chance of being falsely blamed.
         // We also don't want to drive everybody's capacity to zero, that isn't helpful.
-        if (curFailed != null)
-            failed = (long) (0.5 + (4.0 * (curFailed.getCurrentTotalValue() + curFailed.getLastTotalValue()) / 100.0));
-        if (failed > 0) {
-            //if ( (period <= 10*60*1000) && (curFailed.getCurrentEventCount() > 0) )
-            //    return 0.0d; // their tunnels have failed in the last 0-10 minutes
-            //else
-            val -= failed * stretch;
+        if (curFailed != null) {
+            double failed = curFailed.getCurrentTotalValue() + curFailed.getLastTotalValue();
+            if (failed > 0) {
+                //if ( (period <= 10*60*1000) && (curFailed.getCurrentEventCount() > 0) )
+                //    return 0.0d; // their tunnels have failed in the last 0-10 minutes
+                //else
+                // .04 = 4.0 / 100.0 adjustment to failed
+                val -= 0.04 * failed * stretch;
+            }
         }
         
         val += GROWTH_FACTOR;
diff --git a/router/java/src/net/i2p/router/peermanager/DBHistory.java b/router/java/src/net/i2p/router/peermanager/DBHistory.java
index 36b9bc9a3015d08fa1e1f3689a2292fd7d726571..3c5eb077efe8c8149d2c34e961a7e1a78c865579 100644
--- a/router/java/src/net/i2p/router/peermanager/DBHistory.java
+++ b/router/java/src/net/i2p/router/peermanager/DBHistory.java
@@ -13,8 +13,8 @@ import net.i2p.util.Log;
  *
  */
 public class DBHistory {
-    private Log _log;
-    private RouterContext _context;
+    private final Log _log;
+    private final RouterContext _context;
     private long _successfulLookups;
     private long _failedLookups;
     private RateStat _failedLookupRate;
@@ -32,25 +32,13 @@ public class DBHistory {
     private long _lastStoreFailed;
     private long _unpromptedDbStoreNew;
     private long _unpromptedDbStoreOld;
-    private String _statGroup;
+    private final String _statGroup;
     
     public DBHistory(RouterContext context, String statGroup) {
         _context = context;
         _log = context.logManager().getLog(DBHistory.class);
         _statGroup = statGroup;
-        _successfulLookups = 0;
-        _failedLookups = 0;
-        _failedLookupRate = null;
-        _invalidReplyRate = null;
-        _lookupReplyNew = 0;
-        _lookupReplyOld = 0;
-        _lookupReplyDuplicate = 0;
-        _lookupReplyInvalid = 0;
-        _lookupsReceived = 0;
-        _avgDelayBetweenLookupsReceived = 0;
         _lastLookupReceived = -1;
-        _unpromptedDbStoreNew = 0;
-        _unpromptedDbStoreOld = 0;
         createRates(statGroup);
     }
     
diff --git a/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java b/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java
index f306b199573ceead4a7c635d9953cc35d1dba7cf..14437e4bf01fddcbef6d64816d7c96da7564aea1 100644
--- a/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java
+++ b/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java
@@ -1,24 +1,13 @@
 package net.i2p.router.peermanager;
 
-import net.i2p.router.RouterContext;
-import net.i2p.util.Log;
-
 /**
  * Determine how well integrated the peer is - how likely they will be useful
  * to us if we are trying to get further connected.
  *
  */
-public class IntegrationCalculator extends Calculator {
-    private Log _log;
-    private RouterContext _context;
-    
-    public IntegrationCalculator(RouterContext context) {
-        _context = context;
-        _log = context.logManager().getLog(IntegrationCalculator.class);
-    }
+class IntegrationCalculator {
     
-    @Override
-    public double calc(PeerProfile profile) {
+    public static double calc(PeerProfile profile) {
         long val = 0;
         if (profile.getIsExpandedDB()) {
             // give more weight to recent counts
diff --git a/router/java/src/net/i2p/router/peermanager/PeerManager.java b/router/java/src/net/i2p/router/peermanager/PeerManager.java
index bfe038e8c50266c7eaaab0d4ad11f5f1f4fe756d..8a7ea723d131d02e889619055715409937533e46 100644
--- a/router/java/src/net/i2p/router/peermanager/PeerManager.java
+++ b/router/java/src/net/i2p/router/peermanager/PeerManager.java
@@ -23,10 +23,9 @@ import net.i2p.data.RouterInfo;
 import net.i2p.router.PeerSelectionCriteria;
 import net.i2p.router.RouterContext;
 import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
-import net.i2p.util.Log;
-import net.i2p.util.SimpleScheduler;
-import net.i2p.util.SimpleTimer;
 import net.i2p.util.ConcurrentHashSet;
+import net.i2p.util.Log;
+import net.i2p.util.SimpleTimer2;
 
 /**
  * Manage the current state of the statistics
@@ -43,12 +42,15 @@ import net.i2p.util.ConcurrentHashSet;
  *
  */
 class PeerManager {
-    private Log _log;
-    private RouterContext _context;
-    private ProfileOrganizer _organizer;
-    private ProfilePersistenceHelper _persistenceHelper;
-    private Set<Hash> _peersByCapability[];
+    private final Log _log;
+    private final RouterContext _context;
+    private final ProfileOrganizer _organizer;
+    private final ProfilePersistenceHelper _persistenceHelper;
+    private final Set<Hash> _peersByCapability[];
     private final Map<Hash, String> _capabilitiesByPeer;
+    private static final long REORGANIZE_TIME = 45*1000;
+    private static final long REORGANIZE_TIME_MEDIUM = 123*1000;
+    private static final long REORGANIZE_TIME_LONG = 551*1000;
     
     public PeerManager(RouterContext context) {
         _context = context;
@@ -62,17 +64,30 @@ class PeerManager {
             _peersByCapability[i] = new ConcurrentHashSet();
         loadProfiles();
         ////_context.jobQueue().addJob(new EvaluateProfilesJob(_context));
-        SimpleScheduler.getInstance().addPeriodicEvent(new Reorg(), 0, 45*1000);
+        //SimpleScheduler.getInstance().addPeriodicEvent(new Reorg(), 0, REORGANIZE_TIME);
+        new Reorg();
         //_context.jobQueue().addJob(new PersistProfilesJob(_context, this));
     }
     
-    private class Reorg implements SimpleTimer.TimedEvent {
+    private class Reorg extends SimpleTimer2.TimedEvent {
+        public Reorg() {
+            super(SimpleTimer2.getInstance(), REORGANIZE_TIME);
+        }
         public void timeReached() {
             try {
                 _organizer.reorganize(true);
             } catch (Throwable t) {
                 _log.log(Log.CRIT, "Error evaluating profiles", t);
             }
+            long uptime = _context.router().getUptime();
+            long delay;
+            if (uptime > 2*60*60*1000)
+                delay = REORGANIZE_TIME_LONG;
+            else if (uptime > 10*60*1000)
+                delay = REORGANIZE_TIME_MEDIUM;
+            else
+                delay = REORGANIZE_TIME;
+            schedule(delay);
         }
     }
     
@@ -115,6 +130,7 @@ class PeerManager {
      */
     List<Hash> selectPeers(PeerSelectionCriteria criteria) {
         Set<Hash> peers = new HashSet(criteria.getMinimumRequired());
+        // not a singleton, SANFP adds to it
         Set<Hash> exclude = new HashSet(1);
         exclude.add(_context.routerHash());
         switch (criteria.getPurpose()) {
diff --git a/router/java/src/net/i2p/router/peermanager/PeerProfile.java b/router/java/src/net/i2p/router/peermanager/PeerProfile.java
index 6f7fe54bbe8acd7bdddd5f0ddccb98a85c26ad67..034f559ae43f4e045d2c19afb7b35aa9d4e174b5 100644
--- a/router/java/src/net/i2p/router/peermanager/PeerProfile.java
+++ b/router/java/src/net/i2p/router/peermanager/PeerProfile.java
@@ -24,10 +24,10 @@ import net.i2p.util.Log;
  */
 
 public class PeerProfile {
-    private Log _log;
-    private RouterContext _context;
+    private final Log _log;
+    private final RouterContext _context;
     // whoozaat?
-    private Hash _peer;
+    private final Hash _peer;
     // general peer stats
     private long _firstHeardAbout;
     private long _lastHeardAbout;
@@ -62,16 +62,13 @@ public class PeerProfile {
     public PeerProfile(RouterContext context, Hash peer) {
         this(context, peer, true);
     }
+
+    /**
+     *  @param expand must be true (see below)
+     */
     public PeerProfile(RouterContext context, Hash peer, boolean expand) {
         _context = context;
         _log = context.logManager().getLog(PeerProfile.class);
-        _expanded = false;
-        _speedValue = 0;
-        _capacityValue = 0;
-        _integrationValue = 0;
-        _isFailing = false;
-        _consecutiveShitlists = 0;
-        _tunnelTestResponseTimeAvg = 0.0d;
         _peer = peer;
         // this is always true, and there are several places in the router that will NPE
         // if it is false, so all need to be fixed before we can have non-expanded profiles
@@ -81,7 +78,6 @@ public class PeerProfile {
     
     /** what peer is being profiled */
     public Hash getPeer() { return _peer; }
-    public void setPeer(Hash peer) { _peer = peer; }
     
     /**
      * are we keeping an expanded profile on the peer, or just the bare minimum.
@@ -133,7 +129,10 @@ public class PeerProfile {
     }
     
     
-    /** when did we first hear about this peer? */
+    /**
+     *  When did we first hear about this peer?
+     *  Currently unused, candidate for removal.
+     */
     public long getFirstHeardAbout() { return _firstHeardAbout; }
     public void setFirstHeardAbout(long when) { _firstHeardAbout = when; }
     
@@ -474,9 +473,9 @@ public class PeerProfile {
             _log.debug("Coalesced: speed [" + _speedValue + "] capacity [" + _capacityValue + "] integration [" + _integrationValue + "] failing? [" + _isFailing + "]");
     }
     
-    private double calculateSpeed() { return _context.speedCalculator().calc(this); }
-    private double calculateCapacity() { return _context.capacityCalculator().calc(this); }
-    private double calculateIntegration() { return _context.integrationCalculator().calc(this); }
+    private double calculateSpeed() { return SpeedCalculator.calc(this); }
+    private double calculateCapacity() { return CapacityCalculator.calc(this); }
+    private double calculateIntegration() { return IntegrationCalculator.calc(this); }
     /** deprecated - unused - always false */
     private boolean calculateIsFailing() { return false; }
     /** deprecated - unused - always false */
@@ -484,14 +483,17 @@ public class PeerProfile {
     
     @Override
     public int hashCode() { return (_peer == null ? 0 : _peer.hashCode()); }
+
     @Override
     public boolean equals(Object obj) {
-        if (obj == null) return false;
-        if (obj.getClass() != PeerProfile.class) return false;
-        if (_peer == null) return false;
+        if (obj == null ||
+            (!(obj instanceof PeerProfile)) ||
+            _peer == null)
+            return false;
         PeerProfile prof = (PeerProfile)obj;
         return _peer.equals(prof.getPeer());
     }
+
     @Override
     public String toString() { return "Profile: " + getPeer().toBase64(); }
     
diff --git a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java
index 11e8cacb86c8d9137beeea0e495959b96a1b10e1..1d5fe3a849ac1dc098c434dc07ffe83ff316cc3f 100644
--- a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java
+++ b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java
@@ -178,8 +178,7 @@ public class PeerTestJob extends JobImpl {
      */
     private DatabaseStoreMessage buildMessage(RouterInfo peer, TunnelId replyTunnel, Hash replyGateway, long nonce, long expiration) {
         DatabaseStoreMessage msg = new DatabaseStoreMessage(getContext());
-        msg.setKey(peer.getIdentity().getHash());
-        msg.setRouterInfo(peer);
+        msg.setEntry(peer);
         msg.setReplyGateway(replyGateway);
         msg.setReplyTunnel(replyTunnel);
         msg.setReplyToken(nonce);
diff --git a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java
index 712a3cba65b643c4bcf71537c6ce69c98bf857a7..5a0a69f0be2e5cc1d2e1a00e53824b22d35f90f3 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java
@@ -341,6 +341,7 @@ public class ProfileManagerImpl implements ProfileManager {
         PeerProfile prof = _context.profileOrganizer().getProfile(peer);
         if (prof == null) {
             prof = new PeerProfile(_context, peer);
+            prof.setFirstHeardAbout(_context.clock().now());
             _context.profileOrganizer().addProfile(prof);
         }
         return prof;
diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
index 03b49269f46b3813a05382d9ca2455bfef26baf7..a63dd97699151becb03bc130c5f76bf928d70e50 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
@@ -2,7 +2,6 @@ package net.i2p.router.peermanager;
 
 import java.io.IOException;
 import java.io.OutputStream;
-import java.io.Writer;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.text.DecimalFormat;
@@ -22,12 +21,14 @@ import java.util.TreeSet;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
+import net.i2p.crypto.SHA256Generator;
 import net.i2p.data.Hash;
 import net.i2p.data.RouterAddress;
 import net.i2p.data.RouterInfo;
 import net.i2p.router.NetworkDatabaseFacade;
 import net.i2p.router.RouterContext;
 import net.i2p.router.tunnel.pool.TunnelPeerSelector;
+import net.i2p.router.util.RandomIterator;
 import net.i2p.stat.Rate;
 import net.i2p.stat.RateStat;
 import net.i2p.util.Log;
@@ -39,23 +40,23 @@ import net.i2p.util.Log;
  * should be used to add new profiles (placing them into the appropriate groupings).
  */
 public class ProfileOrganizer {
-    private Log _log;
-    private RouterContext _context;
+    private final Log _log;
+    private final RouterContext _context;
     /** H(routerIdentity) to PeerProfile for all peers that are fast and high capacity*/
-    private Map<Hash, PeerProfile> _fastPeers;
+    private final Map<Hash, PeerProfile> _fastPeers;
     /** H(routerIdentity) to PeerProfile for all peers that have high capacities */
-    private Map<Hash, PeerProfile> _highCapacityPeers;
+    private final Map<Hash, PeerProfile> _highCapacityPeers;
     /** H(routerIdentity) to PeerProfile for all peers that well integrated into the network and not failing horribly */
-    private Map<Hash, PeerProfile> _wellIntegratedPeers;
+    private final Map<Hash, PeerProfile> _wellIntegratedPeers;
     /** H(routerIdentity) to PeerProfile for all peers that are not failing horribly */
-    private Map<Hash, PeerProfile> _notFailingPeers;
+    private final Map<Hash, PeerProfile> _notFailingPeers;
     /** H(routerIdnetity), containing elements in _notFailingPeers */
-    private List<Hash> _notFailingPeersList;
+    private final List<Hash> _notFailingPeersList;
     /** H(routerIdentity) to PeerProfile for all peers that ARE failing horribly (but that we haven't dropped reference to yet) */
-    private Map<Hash, PeerProfile> _failingPeers;
+    private final Map<Hash, PeerProfile> _failingPeers;
     /** who are we? */
     private Hash _us;
-    private ProfilePersistenceHelper _persistenceHelper;
+    private final ProfilePersistenceHelper _persistenceHelper;
     
     /** PeerProfile objects for all peers profiled, orderd by the ones with the highest capacity first */
     private Set<PeerProfile> _strictCapacityOrder;
@@ -67,7 +68,7 @@ public class ProfileOrganizer {
     /** integration value, seperating well integrated from not well integrated */
     private double _thresholdIntegrationValue;
     
-    private InverseCapacityComparator _comp;
+    private final InverseCapacityComparator _comp;
 
     /**
      * Defines the minimum number of 'fast' peers that the organizer should select.  See
@@ -77,7 +78,9 @@ public class ProfileOrganizer {
     public static final String PROP_MINIMUM_FAST_PEERS = "profileOrganizer.minFastPeers";
     public static final int DEFAULT_MINIMUM_FAST_PEERS = 8;
     /** this is misnamed, it is really the max minimum number. */
-    private static final int DEFAULT_MAXIMUM_FAST_PEERS = 16;
+    private static final int DEFAULT_MAXIMUM_FAST_PEERS = 18;
+    private static final int ABSOLUTE_MAX_FAST_PEERS = 60;
+
     /**
      * Defines the minimum number of 'high capacity' peers that the organizer should 
      * select when using the mean - if less than this many are available, select the 
@@ -86,13 +89,11 @@ public class ProfileOrganizer {
      */
     public static final String PROP_MINIMUM_HIGH_CAPACITY_PEERS = "profileOrganizer.minHighCapacityPeers";
     public static final int DEFAULT_MINIMUM_HIGH_CAPACITY_PEERS = 10;
+    private static final int ABSOLUTE_MAX_HIGHCAP_PEERS = 150;
     
     /** synchronized against this lock when updating the tier that peers are located in (and when fetching them from a peer) */
     private final ReentrantReadWriteLock _reorganizeLock = new ReentrantReadWriteLock(true);
     
-    /** incredibly weak PRNG, just used for shuffling peers.  no need to waste the real PRNG on this */
-    private Random _random = new Random();
-    
     public ProfileOrganizer(RouterContext context) {
         _context = context;
         _log = context.logManager().getLog(ProfileOrganizer.class);
@@ -104,9 +105,6 @@ public class ProfileOrganizer {
         _notFailingPeersList = new ArrayList(256);
         _failingPeers = new HashMap(16);
         _strictCapacityOrder = new TreeSet(_comp);
-        _thresholdSpeedValue = 0.0d;
-        _thresholdCapacityValue = 0.0d;
-        _thresholdIntegrationValue = 0.0d;
         _persistenceHelper = new ProfilePersistenceHelper(_context);
         
         _context.statManager().createRateStat("peer.profileSortTime", "How long the reorg takes sorting peers", "Peers", new long[] { 10*60*1000 });
@@ -255,10 +253,15 @@ public class ProfileOrganizer {
         return false;
     }
     
-    public void exportProfile(Hash profile, OutputStream out) throws IOException {
+    /**
+     *  @return true if successful, false if not found
+     */
+    public boolean exportProfile(Hash profile, OutputStream out) throws IOException {
         PeerProfile prof = getProfile(profile);
-        if (prof != null)
+        boolean rv = prof != null;
+        if (rv)
             _persistenceHelper.writeProfile(prof, out);
+        return rv;
     }
     
     /**
@@ -275,6 +278,20 @@ public class ProfileOrganizer {
     public void selectFastPeers(int howMany, Set<Hash> exclude, Set<Hash> matches) {
         selectFastPeers(howMany, exclude, matches, 0);
     }
+
+    /**
+     * Return a set of Hashes for peers that are both fast and reliable.  If an insufficient
+     * number of peers are both fast and reliable, fall back onto high capacity peers, and if that
+     * doesn't contain sufficient peers, fall back onto not failing peers, and even THAT doesn't
+     * have sufficient peers, fall back onto failing peers.
+     *
+     * @param howMany how many peers are desired
+     * @param exclude set of Hashes for routers that we don't want selected
+     * @param matches set to store the return value in
+     * @param mask 0-4 Number of bytes to match to determine if peers in the same IP range should
+     *             not be in the same tunnel. 0 = disable check; 1 = /8; 2 = /16; 3 = /24; 4 = exact IP match
+     *
+     */
     public void selectFastPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, int mask) {
         getReadLock();
         try {
@@ -291,6 +308,51 @@ public class ProfileOrganizer {
         return;
     }
     
+    /**
+     * Return a set of Hashes for peers that are both fast and reliable.  If an insufficient
+     * number of peers are both fast and reliable, fall back onto high capacity peers, and if that
+     * doesn't contain sufficient peers, fall back onto not failing peers, and even THAT doesn't
+     * have sufficient peers, fall back onto failing peers.
+     *
+     * @param howMany how many peers are desired
+     * @param exclude set of Hashes for routers that we don't want selected
+     * @param matches set to store the return value in
+     * @param randomKey used for deterministic random partitioning into subtiers
+     * @param subTierMode 0 or 2-7:
+     *<pre>
+     *    0: no partitioning, use entire tier
+     *    2: return only from group 0 or 1
+     *    3: return only from group 2 or 3
+     *    4: return only from group 0
+     *    5: return only from group 1
+     *    6: return only from group 2
+     *    7: return only from group 3
+     *</pre>
+     */
+    public void selectFastPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, Hash randomKey, int subTierMode) {
+        getReadLock();
+        try {
+            if (subTierMode > 0) {
+                int sz = _fastPeers.size();
+                if (sz < 6 || (subTierMode >= 4 && sz < 12))
+                    subTierMode = 0;
+            }
+            if (subTierMode > 0)
+                locked_selectPeers(_fastPeers, howMany, exclude, matches, randomKey, subTierMode);
+            else
+                locked_selectPeers(_fastPeers, howMany, exclude, matches, 2);
+        } finally { releaseReadLock(); }
+        if (matches.size() < howMany) {
+            if (_log.shouldLog(Log.INFO))
+                _log.info("selectFastPeers("+howMany+"), not enough fast (" + matches.size() + ") going on to highCap");
+            selectHighCapacityPeers(howMany, exclude, matches, 2);
+        } else {
+            if (_log.shouldLog(Log.INFO))
+                _log.info("selectFastPeers("+howMany+"), found enough fast (" + matches.size() + ")");
+        }
+        return;
+    }
+    
     /**
      * Return a set of Hashes for peers that have a high capacity
      *
@@ -298,6 +360,11 @@ public class ProfileOrganizer {
     public void selectHighCapacityPeers(int howMany, Set<Hash> exclude, Set<Hash> matches) {
         selectHighCapacityPeers(howMany, exclude, matches, 0);
     }
+
+    /**
+     * @param mask 0-4 Number of bytes to match to determine if peers in the same IP range should
+     *             not be in the same tunnel. 0 = disable check; 1 = /8; 2 = /16; 3 = /24; 4 = exact IP match
+     */
     public void selectHighCapacityPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, int mask) {
         getReadLock();
         try {
@@ -322,6 +389,7 @@ public class ProfileOrganizer {
         }
         return;
     }
+
     /**
      * Return a set of Hashes for peers that are well integrated into the network.
      *
@@ -329,6 +397,13 @@ public class ProfileOrganizer {
     public void selectWellIntegratedPeers(int howMany, Set<Hash> exclude, Set<Hash> matches) {
         selectWellIntegratedPeers(howMany, exclude, matches, 0);
     }
+
+    /**
+     * Return a set of Hashes for peers that are well integrated into the network.
+     *
+     * @param mask 0-4 Number of bytes to match to determine if peers in the same IP range should
+     *             not be in the same tunnel. 0 = disable check; 1 = /8; 2 = /16; 3 = /24; 4 = exact IP match
+     */
     public void selectWellIntegratedPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, int mask) {
         getReadLock();
         try {
@@ -345,6 +420,7 @@ public class ProfileOrganizer {
         
         return;
     }
+
     /**
      * Return a set of Hashes for peers that are not failing, preferring ones that
      * we are already talking with
@@ -353,12 +429,18 @@ public class ProfileOrganizer {
     public void selectNotFailingPeers(int howMany, Set<Hash> exclude, Set<Hash> matches) {
         selectNotFailingPeers(howMany, exclude, matches, false, 0);
     }
+
+    /**
+     * @param mask ignored, should call locked_selectPeers, to be fixed
+     */
     public void selectNotFailingPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, int mask) {
         selectNotFailingPeers(howMany, exclude, matches, false, mask);
     }
+
     public void selectNotFailingPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, boolean onlyNotFailing) {
         selectNotFailingPeers(howMany, exclude, matches, onlyNotFailing, 0);
     }
+
     /**
      * Return a set of Hashes for peers that are not failing, preferring ones that
      * we are already talking with
@@ -367,6 +449,7 @@ public class ProfileOrganizer {
      * @param exclude what peers to skip (may be null)
      * @param matches set to store the matches in
      * @param onlyNotFailing if true, don't include any high capacity peers
+     * @param mask ignored, should call locked_selectPeers, to be fixed
      */
     public void selectNotFailingPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, boolean onlyNotFailing, int mask) {
         if (matches.size() < howMany)
@@ -411,6 +494,9 @@ public class ProfileOrganizer {
      * and we're using this to try and limit connections.
      *
      * This DOES cascade further to non-connected peers.
+     *
+     * @param mask 0-4 Number of bytes to match to determine if peers in the same IP range should
+     *             not be in the same tunnel. 0 = disable check; 1 = /8; 2 = /16; 3 = /24; 4 = exact IP match
      */
     private void selectActiveNotFailingPeers2(int howMany, Set<Hash> exclude, Set<Hash> matches, int mask) {
         if (matches.size() < howMany) {
@@ -442,6 +528,7 @@ public class ProfileOrganizer {
     public void selectAllNotFailingPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, boolean onlyNotFailing) {
         selectAllNotFailingPeers(howMany, exclude, matches, onlyNotFailing, 0);
     }
+
     /**
      * @param mask ignored, should call locked_selectPeers, to be fixed
      *
@@ -491,6 +578,7 @@ public class ProfileOrganizer {
         }
         return;
     }
+
     /**
      * I'm not quite sure why you'd want this... (other than for failover from the better results)
      *
@@ -608,6 +696,7 @@ public class ProfileOrganizer {
      *
      */
     public void reorganize() { reorganize(false); }
+
     public void reorganize(boolean shouldCoalesce) {
         long sortTime = 0;
         int coalesceTime = 0;
@@ -1028,10 +1117,10 @@ public class ProfileOrganizer {
     
     /** called after locking the reorganizeLock */
     private PeerProfile locked_getProfile(Hash peer) {
-        PeerProfile cur = (PeerProfile)_notFailingPeers.get(peer);
+        PeerProfile cur = _notFailingPeers.get(peer);
         if (cur != null) 
             return cur;
-        cur = (PeerProfile)_failingPeers.get(peer);
+        cur = _failingPeers.get(peer);
         return cur;
     }
     
@@ -1043,17 +1132,23 @@ public class ProfileOrganizer {
     private void locked_selectPeers(Map<Hash, PeerProfile> peers, int howMany, Set<Hash> toExclude, Set<Hash> matches) {
         locked_selectPeers(peers, howMany, toExclude, matches, 0);
     }
+
+    /**
+     * @param mask 0-4 Number of bytes to match to determine if peers in the same IP range should
+     *             not be in the same tunnel. 0 = disable check; 1 = /8; 2 = /16; 3 = /24; 4 = exact IP match
+     */
     private void locked_selectPeers(Map<Hash, PeerProfile> peers, int howMany, Set<Hash> toExclude, Set<Hash> matches, int mask) {
-        List all = new ArrayList(peers.keySet());
-        if (toExclude != null)
-            all.removeAll(toExclude);
-        
-        all.removeAll(matches);
-        all.remove(_us);
-        Collections.shuffle(all, _random);
+        List<Hash> all = new ArrayList(peers.keySet());
         Set<Integer> IPSet = new HashSet(8);
-        for (int i = 0; (matches.size() < howMany) && (i < all.size()); i++) {
-            Hash peer = (Hash)all.get(i);
+        // use RandomIterator to avoid shuffling the whole thing
+        for (Iterator<Hash> iter = new RandomIterator(all); (matches.size() < howMany) && iter.hasNext(); ) {
+            Hash peer = iter.next();
+            if (toExclude != null && toExclude.contains(peer))
+                continue;
+            if (matches.contains(peer))
+                continue;
+            if (_us.equals(peer))
+                continue;
             boolean ok = isSelectable(peer);
             if (ok) {
                 ok = mask <= 0 || notRestricted(peer, IPSet, mask);
@@ -1117,7 +1212,7 @@ public class ProfileOrganizer {
     }
 
     /** generate an arbitrary unique value for this ip/mask (mask = 1-4) */
-    private Integer maskedIP(byte[] ip, int mask) {
+    private static Integer maskedIP(byte[] ip, int mask) {
         int rv = 0;
         for (int i = 0; i < mask; i++)
              rv = (rv << 8) | (ip[i] & 0xff);
@@ -1125,7 +1220,7 @@ public class ProfileOrganizer {
     }
 
     /** does a contain any of the elements in b? */
-    private boolean containsAny(Set a, Set b) {
+    private static boolean containsAny(Set a, Set b) {
         for (Object o : b) {
             if (a.contains(o))
                 return true;
@@ -1133,6 +1228,58 @@ public class ProfileOrganizer {
         return false;
     }
 
+    /**
+     * @param randomKey used for deterministic random partitioning into subtiers
+     * @param subTierMode 2-7:
+     *<pre>
+     *    2: return only from group 0 or 1
+     *    3: return only from group 2 or 3
+     *    4: return only from group 0
+     *    5: return only from group 1
+     *    6: return only from group 2
+     *    7: return only from group 3
+     *</pre>
+     */
+    private void locked_selectPeers(Map<Hash, PeerProfile> peers, int howMany, Set<Hash> toExclude, Set<Hash> matches, Hash randomKey, int subTierMode) {
+        List<Hash> all = new ArrayList(peers.keySet());
+        // use RandomIterator to avoid shuffling the whole thing
+        for (Iterator<Hash> iter = new RandomIterator(all); (matches.size() < howMany) && iter.hasNext(); ) {
+            Hash peer = iter.next();
+            if (toExclude != null && toExclude.contains(peer))
+                continue;
+            if (matches.contains(peer))
+                continue;
+            if (_us.equals(peer))
+                continue;
+            int subTier = getSubTier(peer, randomKey);
+            if (subTierMode >= 4) {
+                if (subTier != (subTierMode & 0x03))
+                    continue;
+            } else {
+                if ((subTier >> 1) != (subTierMode & 0x01))
+                    continue;
+            }
+            boolean ok = isSelectable(peer);
+            if (ok)
+                matches.add(peer);
+            else
+                matches.remove(peer);
+        }
+    }
+    
+    /**
+     *  Implement a random, deterministic split into 4 groups that cannot be predicted by
+     *  others.
+     *  @return 0-3
+     */
+    private static int getSubTier(Hash peer, Hash randomKey) {
+        byte[] data = new byte[Hash.HASH_LENGTH + 4];
+        System.arraycopy(peer.getData(), 0, data, 0, Hash.HASH_LENGTH);
+        System.arraycopy(randomKey.getData(), 0, data, Hash.HASH_LENGTH, 4);
+        Hash rh = SHA256Generator.getInstance().calculateHash(data);
+        return rh.getData()[0] & 0x03;
+    }
+
     public boolean isSelectable(Hash peer) {
         NetworkDatabaseFacade netDb = _context.netDb();
         // the CLI shouldn't depend upon the netDb
@@ -1247,18 +1394,18 @@ public class ProfileOrganizer {
      */
     protected int getMinimumFastPeers() {
         int def = Math.min(DEFAULT_MAXIMUM_FAST_PEERS,
-                           (2 *_context.clientManager().listClients().size()) + DEFAULT_MINIMUM_FAST_PEERS - 2);
+                           (6 *_context.clientManager().listClients().size()) + DEFAULT_MINIMUM_FAST_PEERS - 2);
         return _context.getProperty(PROP_MINIMUM_FAST_PEERS, def);
     }
     
     /** fixme add config  @since 0.7.10 */
     protected int getMaximumFastPeers() {
-        return 30;
+        return ABSOLUTE_MAX_FAST_PEERS;
     }
     
     /** fixme add config  @since 0.7.11 */
     protected int getMaximumHighCapPeers() {
-        return 75;
+        return ABSOLUTE_MAX_HIGHCAP_PEERS;
     }
     
     /**
diff --git a/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java b/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java
index e012fab4906c9a19694a6bd84710429f0028a6df..af0167f20ab447359dbcf19aeaaf3ee38a9c0a47 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java
@@ -1,11 +1,14 @@
 package net.i2p.router.peermanager;
 
+import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FilenameFilter;
+import java.io.InputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Properties;
@@ -22,13 +25,24 @@ import net.i2p.util.Log;
 import net.i2p.util.SecureDirectory;
 import net.i2p.util.SecureFileOutputStream;
 
+/**
+ *  Write profiles to disk at shutdown,
+ *  read at startup.
+ *  The files are gzip compressed, we previously stored them
+ *  with a ".dat" extension instead of ".txt.gz", so it wasn't apparent.
+ *  Now migrated to a ".txt.gz" extension.
+ */
 class ProfilePersistenceHelper {
-    private Log _log;
-    private RouterContext _context;
+    private final Log _log;
+    private final RouterContext _context;
     
     public final static String PROP_PEER_PROFILE_DIR = "router.profileDir";
     public final static String DEFAULT_PEER_PROFILE_DIR = "peerProfiles";
     private final static String NL = System.getProperty("line.separator");
+    private static final String PREFIX = "profile-";
+    private static final String SUFFIX = ".txt.gz";
+    private static final String UNCOMPRESSED_SUFFIX = ".txt";
+    private static final String OLD_SUFFIX = ".dat";
     
     /**
      * If we haven't been able to get a message through to the peer in 3 days,
@@ -74,58 +88,49 @@ class ProfilePersistenceHelper {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Writing the profile to " + f.getName() + " took " + delay + "ms");
     }
+
     /** write out the data from the profile to the stream */
     public void writeProfile(PeerProfile profile, OutputStream out) throws IOException {
         String groups = null;
         if (_context.profileOrganizer().isFailing(profile.getPeer())) {
-            groups = "failing";
+            groups = "Failing";
         } else if (!_context.profileOrganizer().isHighCapacity(profile.getPeer())) {
-            groups = "not failing";
+            groups = "Standard";
         } else {
             if (_context.profileOrganizer().isFast(profile.getPeer()))
-                groups = "fast and high capacity";
+                groups = "Fast, High Capacity";
             else
-                groups = "high capacity";
+                groups = "High Capacity";
             
             if (_context.profileOrganizer().isWellIntegrated(profile.getPeer()))
-                groups = groups + ", well integrated";
+                groups = groups + ", Integrated";
         }
         
         StringBuilder buf = new StringBuilder(512);
         buf.append("########################################################################").append(NL);
-        buf.append("# profile for ").append(profile.getPeer().toBase64()).append(NL);
+        buf.append("# Profile for peer ").append(profile.getPeer().toBase64()).append(NL);
         if (_us != null)
             buf.append("# as calculated by ").append(_us.toBase64()).append(NL);
         buf.append("#").append(NL);
-        buf.append("# capacity: ").append(profile.getCapacityValue()).append(NL);
-        buf.append("# integration: ").append(profile.getIntegrationValue()).append(NL);
-        buf.append("# speedValue: ").append(profile.getSpeedValue()).append(NL);
-        buf.append("#").append(NL);
+        buf.append("# Speed: ").append(profile.getSpeedValue()).append(NL);
+        buf.append("# Capacity: ").append(profile.getCapacityValue()).append(NL);
+        buf.append("# Integration: ").append(profile.getIntegrationValue()).append(NL);
         buf.append("# Groups: ").append(groups).append(NL);
+        buf.append("#").append(NL);
         buf.append("########################################################################").append(NL);
         buf.append("##").append(NL);
-        buf.append("# Capacity bonus: used to affect the capacity score after all other calculations are done").append(NL);
-        buf.append("capacityBonus=").append(profile.getCapacityBonus()).append(NL);
-        buf.append("# Integration bonus: used to affect the integration score after all other calculations are done").append(NL);
-        buf.append("integrationBonus=").append(profile.getIntegrationBonus()).append(NL);
-        buf.append("# Speed bonus: used to affect the speed score after all other calculations are done").append(NL);
-        buf.append("speedBonus=").append(profile.getSpeedBonus()).append(NL);
-        buf.append(NL).append(NL);
-        buf.append("# Last heard about: when did we last get a reference to this peer?  (milliseconds since the epoch)").append(NL);
-        buf.append("lastHeardAbout=").append(profile.getLastHeardAbout()).append(NL);
-        buf.append("# First heard about: when did we first get a reference to this peer?  (milliseconds since the epoch)").append(NL);
-        buf.append("firstHeardAbout=").append(profile.getFirstHeardAbout()).append(NL);
-        buf.append("# Last sent to successfully: when did we last send the peer a message successfully?  (milliseconds from the epoch)").append(NL);
-        buf.append("lastSentToSuccessfully=").append(profile.getLastSendSuccessful()).append(NL);
-        buf.append("# Last failed send: when did we last fail to send a message to the peer?  (milliseconds from the epoch)").append(NL);
-        buf.append("lastFailedSend=").append(profile.getLastSendFailed()).append(NL);
-        buf.append("# Last heard from: when did we last get a message from the peer?  (milliseconds from the epoch)").append(NL);
-        buf.append("lastHeardFrom=").append(profile.getLastHeardFrom()).append(NL);
-        buf.append("# moving average as to how fast the peer replies").append(NL);
-        buf.append("tunnelTestTimeAverage=").append(profile.getTunnelTestTimeAverage()).append(NL);
-        buf.append("tunnelPeakThroughput=").append(profile.getPeakThroughputKBps()).append(NL);
-        buf.append("tunnelPeakTunnelThroughput=").append(profile.getPeakTunnelThroughputKBps()).append(NL);
-        buf.append("tunnelPeakTunnel1mThroughput=").append(profile.getPeakTunnel1mThroughputKBps()).append(NL);
+        add(buf, "speedBonus", profile.getSpeedBonus(), "Manual adjustment to the speed score");
+        add(buf, "capacityBonus", profile.getCapacityBonus(), "Manual adjustment to the capacity score");
+        add(buf, "integrationBonus", profile.getIntegrationBonus(), "Manual adjustment to the integration score");
+        addDate(buf, "firstHeardAbout", profile.getFirstHeardAbout(), "When did we first get a reference to this peer?");
+        addDate(buf, "lastHeardAbout", profile.getLastHeardAbout(), "When did we last get a reference to this peer?");
+        addDate(buf, "lastHeardFrom", profile.getLastHeardFrom(), "When did we last get a message from the peer?");
+        addDate(buf, "lastSentToSuccessfully", profile.getLastSendSuccessful(), "When did we last send the peer a message successfully?");
+        addDate(buf, "lastFailedSend", profile.getLastSendFailed(), "When did we last fail to send a message to the peer?");
+        add(buf, "tunnelTestTimeAverage", profile.getTunnelTestTimeAverage(), "Moving average as to how fast the peer replies");
+        add(buf, "tunnelPeakThroughput", profile.getPeakThroughputKBps(), "KBytes/sec");
+        add(buf, "tunnelPeakTunnelThroughput", profile.getPeakTunnelThroughputKBps(), "KBytes/sec");
+        add(buf, "tunnelPeakTunnel1mThroughput", profile.getPeakTunnel1mThroughputKBps(), "KBytes/sec");
         buf.append(NL);
         
         out.write(buf.toString().getBytes());
@@ -146,12 +151,29 @@ class ProfilePersistenceHelper {
         }
     }
     
-    public Set readProfiles() {
+    /** @since 0.8.5 */
+    private static void addDate(StringBuilder buf, String name, long val, String description) {
+        String when = val > 0 ? (new Date(val)).toString() : "Never";
+        add(buf, name, val, description + ' ' + when);
+    }
+    
+    /** @since 0.8.5 */
+    private static void add(StringBuilder buf, String name, long val, String description) {
+        buf.append("# ").append(name).append(NL).append("# ").append(description).append(NL);
+        buf.append(name).append('=').append(val).append(NL).append(NL);
+    }
+    
+    /** @since 0.8.5 */
+    private static void add(StringBuilder buf, String name, double val, String description) {
+        buf.append("# ").append(name).append(NL).append("# ").append(description).append(NL);
+        buf.append(name).append('=').append(val).append(NL).append(NL);
+    }
+    
+    public Set<PeerProfile> readProfiles() {
         long start = _context.clock().now();
-        Set files = selectFiles();
-        Set profiles = new HashSet(files.size());
-        for (Iterator iter = files.iterator(); iter.hasNext();) {
-            File f = (File)iter.next();
+        Set<File> files = selectFiles();
+        Set<PeerProfile> profiles = new HashSet(files.size());
+        for (File f :  files) {
             PeerProfile profile = readProfile(f);
             if (profile != null)
                 profiles.add(profile);
@@ -162,10 +184,11 @@ class ProfilePersistenceHelper {
         return profiles;
     }
     
-    private Set selectFiles() {
+    private Set<File> selectFiles() {
         File files[] = getProfileDir().listFiles(new FilenameFilter() {
             public boolean accept(File dir, String filename) {
-                return (filename.startsWith("profile-") && filename.endsWith(".dat"));
+                return (filename.startsWith(PREFIX) &&
+                        (filename.endsWith(SUFFIX) || filename.endsWith(OLD_SUFFIX) || filename.endsWith(UNCOMPRESSED_SUFFIX)));
             }
         });
         Set rv = new HashSet(files.length);
@@ -198,6 +221,14 @@ class ProfilePersistenceHelper {
                               ", since we haven't heard from them in a long time");
                 file.delete();
                 return null;
+            } else if (file.getName().endsWith(OLD_SUFFIX)) {
+                // migrate to new file name, ignore failure
+                String newName = file.getAbsolutePath();
+                newName = newName.substring(0, newName.length() - OLD_SUFFIX.length()) + SUFFIX;
+                boolean success = file.renameTo(new File(newName));
+                if (!success)
+                    // new file exists and on Windows?
+                    file.delete();
             }
             
             profile.setCapacityBonus(getLong(props, "capacityBonus"));
@@ -270,11 +301,12 @@ class ProfilePersistenceHelper {
     }
     
     private void loadProps(Properties props, File file) {
+        InputStream fin = null;
         try {
-            FileInputStream fin = new FileInputStream(file);
+            fin = new BufferedInputStream(new FileInputStream(file), 1);
+            fin.mark(1);
             int c = fin.read(); 
-            fin.close();
-            fin = new FileInputStream(file); // ghetto mark+reset
+            fin.reset();
             if (c == '#') {
                 // uncompressed
                 if (_log.shouldLog(Log.INFO))
@@ -289,12 +321,16 @@ class ProfilePersistenceHelper {
         } catch (IOException ioe) {
             if (_log.shouldLog(Log.WARN))
                 _log.warn("Error loading properties from " + file.getName(), ioe);
+        } finally {
+            try {
+                if (fin != null) fin.close();
+            } catch (IOException e) {}
         }
     }
 
     private Hash getHash(String name) {
-        String key = name.substring("profile-".length());
-        key = key.substring(0, key.length() - ".dat".length());
+        String key = name.substring(PREFIX.length());
+        key = key.substring(0, 44);
         //Hash h = new Hash();
         try {
             //h.fromBase64(key);
@@ -310,7 +346,7 @@ class ProfilePersistenceHelper {
     }
     
     private File pickFile(PeerProfile profile) {
-        return new File(getProfileDir(), "profile-" + profile.getPeer().toBase64() + ".dat");
+        return new File(getProfileDir(), PREFIX + profile.getPeer().toBase64() + SUFFIX);
     }
     
     private File getProfileDir() {
@@ -332,7 +368,7 @@ class ProfilePersistenceHelper {
             rnd.nextBytes(data);
             Hash peer = new Hash(data);
             try {
-                File f = new File(dir, "profile-" + peer.toBase64() + ".dat");
+                File f = new File(dir, PREFIX + peer.toBase64() + SUFFIX);
                 f.createNewFile();
                 System.out.println("Created " + peer.toBase64());
             } catch (IOException ioe) {}
diff --git a/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java b/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java
index c5ac1c3c56d26871dc33beec002063983fd5c70b..cf1b7f069d707db8ab8666ab404bbde97c2cf4cb 100644
--- a/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java
+++ b/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java
@@ -1,7 +1,5 @@
 package net.i2p.router.peermanager;
 
-import net.i2p.router.RouterContext;
-
 /**
  * Quantify how fast the peer is - how fast they respond to our requests, how fast
  * they pass messages on, etc.  This should be affected both by their bandwidth/latency,
@@ -13,13 +11,9 @@ import net.i2p.router.RouterContext;
  * see the previous versions in change control to get 400+ lines of old code.
  *
  */
-public class SpeedCalculator extends Calculator {
-    
-    public SpeedCalculator(RouterContext context) {
-    }
+class SpeedCalculator {
     
-    @Override
-    public double calc(PeerProfile profile) {
+    public static double calc(PeerProfile profile) {
         // measures 1 minute throughput of individual tunnels
         double d = (profile.getPeakTunnel1mThroughputKBps()*1024d) + profile.getSpeedBonus();
         if (d >= 0) return d;
diff --git a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java
index 208415ca0b3f0e5e5e911c037522ebc109a9eeba..63f3741d481f6b08c63c4e439ee24239cbc3a656 100644
--- a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java
+++ b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java
@@ -2,6 +2,7 @@ package net.i2p.router.peermanager;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.Date;
 import java.util.Properties;
 
 import net.i2p.router.RouterContext;
@@ -13,8 +14,8 @@ import net.i2p.util.Log;
  *
  */
 public class TunnelHistory {
-    private RouterContext _context;
-    private Log _log;
+    private final RouterContext _context;
+    private final Log _log;
     private volatile long _lifetimeAgreedTo;
     private volatile long _lifetimeRejected;
     private volatile long _lastAgreedTo;
@@ -26,7 +27,7 @@ public class TunnelHistory {
     private volatile long _lastFailed;
     private RateStat _rejectRate;
     private RateStat _failRate;
-    private String _statGroup;
+    private final String _statGroup;
     
     /** probabalistic tunnel rejection due to a flood of requests - essentially unused */
     public static final int TUNNEL_REJECT_PROBABALISTIC_REJECT = 10;
@@ -110,6 +111,7 @@ public class TunnelHistory {
         _lastFailed = _context.clock().now();
     }
     
+/*****  all unused
     public void setLifetimeAgreedTo(long num) { _lifetimeAgreedTo = num; }
     public void setLifetimeRejected(long num) { _lifetimeRejected = num; }
     public void setLifetimeFailed(long num) { _lifetimeFailed = num; }
@@ -119,6 +121,7 @@ public class TunnelHistory {
     public void setLastRejectedTransient(long when) { _lastRejectedTransient = when; }
     public void setLastRejectedProbabalistic(long when) { _lastRejectedProbabalistic = when; }
     public void setLastFailed(long when) { _lastFailed = when; }
+******/
     
     public RateStat getRejectionRate() { return _rejectRate; }
     public RateStat getFailedRate() { return _failRate; }
@@ -138,12 +141,12 @@ public class TunnelHistory {
         buf.append("#################").append(NL);
         buf.append("# Tunnel history").append(NL);
         buf.append("###").append(NL);
-        add(buf, "lastAgreedTo", _lastAgreedTo, "When did the peer last agree to participate in a tunnel?  (milliseconds since the epoch)");
-        add(buf, "lastFailed", _lastFailed, "When was the last time a tunnel that the peer agreed to participate failed?  (milliseconds since the epoch)");
-        add(buf, "lastRejectedCritical", _lastRejectedCritical, "When was the last time the peer refused to participate in a tunnel?  (milliseconds since the epoch)");
-        add(buf, "lastRejectedBandwidth", _lastRejectedBandwidth, "When was the last time the peer refused to participate in a tunnel?  (milliseconds since the epoch)");
-        add(buf, "lastRejectedTransient", _lastRejectedTransient, "When was the last time the peer refused to participate in a tunnel?  (milliseconds since the epoch)");
-        add(buf, "lastRejectedProbabalistic", _lastRejectedProbabalistic, "When was the last time the peer refused to participate in a tunnel?  (milliseconds since the epoch)");
+        addDate(buf, "lastAgreedTo", _lastAgreedTo, "When did the peer last agree to participate in a tunnel?");
+        addDate(buf, "lastFailed", _lastFailed, "When was the last time a tunnel that the peer agreed to participate failed?");
+        addDate(buf, "lastRejectedCritical", _lastRejectedCritical, "When was the last time the peer refused to participate in a tunnel (Critical response code)?");
+        addDate(buf, "lastRejectedBandwidth", _lastRejectedBandwidth, "When was the last time the peer refused to participate in a tunnel (Bandwidth response code)?");
+        addDate(buf, "lastRejectedTransient", _lastRejectedTransient, "When was the last time the peer refused to participate in a tunnel (Transient load response code)?");
+        addDate(buf, "lastRejectedProbabalistic", _lastRejectedProbabalistic, "When was the last time the peer refused to participate in a tunnel (Probabalistic response code)?");
         add(buf, "lifetimeAgreedTo", _lifetimeAgreedTo, "How many tunnels has the peer ever agreed to participate in?");
         add(buf, "lifetimeFailed", _lifetimeFailed, "How many tunnels has the peer ever agreed to participate in that failed prematurely?");
         add(buf, "lifetimeRejected", _lifetimeRejected, "How many tunnels has the peer ever refused to participate in?");
@@ -152,8 +155,13 @@ public class TunnelHistory {
         _failRate.store(out, "tunnelHistory.failRate");
     }
     
+    private static void addDate(StringBuilder buf, String name, long val, String description) {
+        String when = val > 0 ? (new Date(val)).toString() : "Never";
+        add(buf, name, val, description + ' ' + when);
+    }
+    
     private static void add(StringBuilder buf, String name, long val, String description) {
-        buf.append("# ").append(name.toUpperCase()).append(NL).append("# ").append(description).append(NL);
+        buf.append("# ").append(name).append(NL).append("# ").append(description).append(NL);
         buf.append("tunnels.").append(name).append('=').append(val).append(NL).append(NL);
     }
     
diff --git a/router/java/src/net/i2p/router/startup/WorkingDir.java b/router/java/src/net/i2p/router/startup/WorkingDir.java
index 1a8249798a8d338312192a305abd480ece53f2ed..a1f414ac29869470e3c41dfcad2250a779dddc0e 100644
--- a/router/java/src/net/i2p/router/startup/WorkingDir.java
+++ b/router/java/src/net/i2p/router/startup/WorkingDir.java
@@ -164,14 +164,22 @@ public class WorkingDir {
         }
     }
 
-    /** Returns <code>false</code> if a directory is empty, or contains nothing besides a subdirectory named plugins */
+    /**
+     * Tests if <code>dir</code> has been set up as a I2P working directory.<br/>
+     * Returns <code>false</code> if a directory is empty, or contains nothing besides
+     * subdirectories named <code>plugins</code> and/or <code>logs</code>.<br/>
+     * Returns <code>true</code> if the directory contains something not named
+     * <code>plugins</code> or <code>logs</code>.</br>
+     * This allows to pre-install plugins before the first router start.
+     */
     private static boolean isSetup(File dir) {
         if (dir.isDirectory()) {
             String[] files = dir.list();
-            if (files.length == 0)
+            if (files == null)
                 return false;
-            if (files.length>1 || !"plugins".equals(files[0]))
-                return true;
+            for (String file: files)
+                if (!"plugins".equals(file) && !"logs".equals(file))
+                    return true;
         }
         return false;
     }
diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
index 094f526c79913e433bfa53e178bee6d2f0b22725..780a25d6b28b24af9ab23cd4a57dea484fb2e212 100644
--- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
+++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
@@ -36,15 +36,14 @@ import net.i2p.util.SimpleTimer;
 import net.i2p.util.Translate;
 
 public class CommSystemFacadeImpl extends CommSystemFacade {
-    private Log _log;
-    private RouterContext _context;
+    private final Log _log;
+    private final RouterContext _context;
     private TransportManager _manager;
     private GeoIP _geoIP;
     
     public CommSystemFacadeImpl(RouterContext context) {
         _context = context;
         _log = _context.logManager().getLog(CommSystemFacadeImpl.class);
-        _manager = null;
         _context.statManager().createRateStat("transport.getBidsJobTime", "How long does it take?", "Transport", new long[] { 10*60*1000l });
         startGeoIP();
     }
@@ -215,7 +214,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
      * This should really be moved to ntcp/NTCPTransport.java, why is it here?
      */
     public static RouterAddress createNTCPAddress(RouterContext ctx) {
-        if (!TransportManager.enableNTCP(ctx)) return null;
+        if (!TransportManager.isNTCPEnabled(ctx)) return null;
         String name = ctx.router().getConfigSetting(PROP_I2NP_NTCP_HOSTNAME);
         String port = ctx.router().getConfigSetting(PROP_I2NP_NTCP_PORT);
         /*
@@ -510,7 +509,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
         buf.append("<tt>");
         boolean found = _context.netDb().lookupRouterInfoLocally(peer) != null;
         if (found)
-            buf.append("<a title=\"").append(_("NetDb entry")).append("\" href=\"netdb.jsp?r=").append(h).append("\">");
+            buf.append("<a title=\"").append(_("NetDb entry")).append("\" href=\"netdb?r=").append(h).append("\">");
         buf.append(h);
         if (found)
             buf.append("</a>");
diff --git a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java
index 112d3660140285009f309d4c48794e7f02721472..c0245478314bde43ae73920ef5f8e91545b265a3 100644
--- a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java
+++ b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java
@@ -31,18 +31,18 @@ import net.i2p.util.Log;
  *
  */
 public class FIFOBandwidthLimiter {
-    private Log _log;
-    private I2PAppContext _context;
+    private final Log _log;
+    private final I2PAppContext _context;
     private final List<Request> _pendingInboundRequests;
     private final List<Request> _pendingOutboundRequests;
     /** how many bytes we can consume for inbound transmission immediately */
-    private AtomicInteger _availableInbound = new AtomicInteger();
+    private final AtomicInteger _availableInbound = new AtomicInteger();
     /** how many bytes we can consume for outbound transmission immediately */
-    private AtomicInteger _availableOutbound = new AtomicInteger();
+    private final AtomicInteger _availableOutbound = new AtomicInteger();
     /** how many bytes we can queue up for bursting */
-    private AtomicInteger _unavailableInboundBurst = new AtomicInteger();
+    private final AtomicInteger _unavailableInboundBurst = new AtomicInteger();
     /** how many bytes we can queue up for bursting */
-    private AtomicInteger _unavailableOutboundBurst = new AtomicInteger();
+    private final AtomicInteger _unavailableOutboundBurst = new AtomicInteger();
     /** how large _unavailableInbound can get */
     private int _maxInboundBurst;
     /** how large _unavailableInbound can get */
@@ -56,14 +56,14 @@ public class FIFOBandwidthLimiter {
     /** shortcut of whether our inbound rate is unlimited */
     private boolean _inboundUnlimited;
     /** lifetime counter of bytes received */
-    private AtomicLong _totalAllocatedInboundBytes = new AtomicLong();
+    private final AtomicLong _totalAllocatedInboundBytes = new AtomicLong();
     /** lifetime counter of bytes sent */
-    private AtomicLong _totalAllocatedOutboundBytes = new AtomicLong();
+    private final AtomicLong _totalAllocatedOutboundBytes = new AtomicLong();
     /** lifetime counter of tokens available for use but exceeded our maxInboundBurst size */
-    private AtomicLong _totalWastedInboundBytes = new AtomicLong();
+    private final AtomicLong _totalWastedInboundBytes = new AtomicLong();
     /** lifetime counter of tokens available for use but exceeded our maxOutboundBurst size */
-    private AtomicLong _totalWastedOutboundBytes = new AtomicLong();
-    private FIFOBandwidthRefiller _refiller;
+    private final AtomicLong _totalWastedOutboundBytes = new AtomicLong();
+    private final FIFOBandwidthRefiller _refiller;
     
     private long _lastTotalSent;
     private long _lastTotalReceived;
@@ -73,8 +73,6 @@ public class FIFOBandwidthLimiter {
     private float _sendBps15s;
     private float _recvBps15s;
     
-    private static int __id = 0;
-    
     public /* static */ long now() {
         // dont use the clock().now(), since that may jump
         return System.currentTimeMillis(); 
@@ -98,13 +96,9 @@ public class FIFOBandwidthLimiter {
         _pendingOutboundRequests = new ArrayList(16);
         _lastTotalSent = _totalAllocatedOutboundBytes.get();
         _lastTotalReceived = _totalAllocatedInboundBytes.get();
-        _sendBps = 0;
-        _recvBps = 0;
         _lastStatsUpdated = now();
         _refiller = new FIFOBandwidthRefiller(_context, this);
-        I2PThread t = new I2PThread(_refiller);
-        t.setName("BWRefiller" + (++__id));
-        t.setDaemon(true);
+        I2PThread t = new I2PThread(_refiller, "BWRefiller", true);
         t.setPriority(I2PThread.NORM_PRIORITY-1);
         t.start();
     }
@@ -753,7 +747,7 @@ public class FIFOBandwidthLimiter {
         private int _allocationsSinceWait;
         private boolean _aborted;
         private boolean _waited;
-        List<Request> satisfiedBuffer;
+        final List<Request> satisfiedBuffer;
         private CompleteListener _lsnr;
         private Object _attachment;
         
diff --git a/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java b/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java
index 2065cdc28ce0647cbc6f9b0569c80601807d20e2..bc8dd18520d070240311e869528fdb888f6b6b7f 100644
--- a/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java
+++ b/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java
@@ -7,9 +7,9 @@ import net.i2p.I2PAppContext;
 import net.i2p.util.Log;
 
 public class FIFOBandwidthRefiller implements Runnable {
-    private Log _log;
-    private I2PAppContext _context;
-    private FIFOBandwidthLimiter _limiter;
+    private final Log _log;
+    private final I2PAppContext _context;
+    private final FIFOBandwidthLimiter _limiter;
     /** how many KBps do we want to allow? */
     private int _inboundKBytesPerSecond;
     /** how many KBps do we want to allow? */
diff --git a/router/java/src/net/i2p/router/transport/GeoIP.java b/router/java/src/net/i2p/router/transport/GeoIP.java
index 85a89b3c6410b5eeaf471a37ace4812e5bc0fc58..1593487cf9d950d0f9fd413e0b8eab21bb6466b8 100644
--- a/router/java/src/net/i2p/router/transport/GeoIP.java
+++ b/router/java/src/net/i2p/router/transport/GeoIP.java
@@ -16,6 +16,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import net.i2p.data.DataHelper;
+import net.i2p.data.Hash;
 import net.i2p.router.RouterContext;
 import net.i2p.util.ConcurrentHashSet;
 import net.i2p.util.Log;
@@ -35,7 +36,7 @@ import net.i2p.util.Log;
  *
  * @author zzz
  */
-public class GeoIP {
+class GeoIP {
     private Log _log;
     private RouterContext _context;
     private final Map<String, String> _codeToName;
@@ -251,7 +252,11 @@ public class GeoIP {
      */
     private void updateOurCountry() {
         String oldCountry = _context.router().getConfigSetting(PROP_IP_COUNTRY);
-        String country = _context.commSystem().getCountry(_context.routerHash());
+        Hash ourHash = _context.routerHash();
+        // we should always have a RouterInfo by now, but we had one report of an NPE here
+        if (ourHash == null)
+            return;
+        String country = _context.commSystem().getCountry(ourHash);
         if (country != null && !country.equals(oldCountry)) {
             _context.router().setConfigSetting(PROP_IP_COUNTRY, country);
             _context.router().saveConfig();
diff --git a/router/java/src/net/i2p/router/transport/GetBidsJob.java b/router/java/src/net/i2p/router/transport/GetBidsJob.java
index 55f8cdb7961bf1c4d27ea53abd5639c2a875d158..e014cc6411842a66f29305ee85f72004f74168ce 100644
--- a/router/java/src/net/i2p/router/transport/GetBidsJob.java
+++ b/router/java/src/net/i2p/router/transport/GetBidsJob.java
@@ -21,10 +21,10 @@ import net.i2p.util.Log;
  * pass it on to the transport for processing
  *
  */
-public class GetBidsJob extends JobImpl {
-    private Log _log;
-    private CommSystemFacadeImpl _facade;
-    private OutNetMessage _msg;
+class GetBidsJob extends JobImpl {
+    private final Log _log;
+    private final CommSystemFacadeImpl _facade;
+    private final OutNetMessage _msg;
     
     public GetBidsJob(RouterContext ctx, CommSystemFacadeImpl facade, OutNetMessage msg) {
         super(ctx);
diff --git a/router/java/src/net/i2p/router/transport/TransportImpl.java b/router/java/src/net/i2p/router/transport/TransportImpl.java
index 7ac7d05b2c7189742e5ebf39483614571bca4cdb..fef5850227f52736d06eebeb5c9217669ec8c149 100644
--- a/router/java/src/net/i2p/router/transport/TransportImpl.java
+++ b/router/java/src/net/i2p/router/transport/TransportImpl.java
@@ -512,7 +512,7 @@ public abstract class TransportImpl implements Transport {
     public void markUnreachable(Hash peer) {
         long now = _context.clock().now();
         synchronized (_unreachableEntries) {
-            _unreachableEntries.put(peer, new Long(now));
+            _unreachableEntries.put(peer, Long.valueOf(now));
         }
         markWasUnreachable(peer, true);
     }
diff --git a/router/java/src/net/i2p/router/transport/TransportManager.java b/router/java/src/net/i2p/router/transport/TransportManager.java
index a682840b1780fa28749d2e0d52870fa4f36983eb..81cf89340fb946f8c9b15085d4698a43323545fe 100644
--- a/router/java/src/net/i2p/router/transport/TransportManager.java
+++ b/router/java/src/net/i2p/router/transport/TransportManager.java
@@ -37,19 +37,19 @@ import net.i2p.util.Log;
 import net.i2p.util.Translate;
 
 public class TransportManager implements TransportEventListener {
-    private Log _log;
+    private final Log _log;
     /**
      * Converted from List to prevent concurrent modification exceptions.
      * If we want more than one transport with the same style we will have to change this.
      */
-    private Map<String, Transport> _transports;
-    private RouterContext _context;
-    private UPnPManager _upnpManager;
+    private final Map<String, Transport> _transports;
+    private final RouterContext _context;
+    private final UPnPManager _upnpManager;
 
+    /** default true */
     public final static String PROP_ENABLE_UDP = "i2np.udp.enable";
+    /** default true */
     public final static String PROP_ENABLE_NTCP = "i2np.ntcp.enable";
-    public final static String DEFAULT_ENABLE_NTCP = "true";
-    public final static String DEFAULT_ENABLE_UDP = "true";
     /** default true */
     public final static String PROP_ENABLE_UPNP = "i2np.upnp.enable";
     
@@ -63,8 +63,10 @@ public class TransportManager implements TransportEventListener {
         _context.statManager().createRateStat("transport.bidFailNoTransports", "Could not attempt to bid on message, as none of the transports could attempt it", "Transport", new long[] { 60*1000, 10*60*1000, 60*60*1000 });
         _context.statManager().createRateStat("transport.bidFailAllTransports", "Could not attempt to bid on message, as all of the transports had failed", "Transport", new long[] { 60*1000, 10*60*1000, 60*60*1000 });
         _transports = new ConcurrentHashMap(2);
-        if (Boolean.valueOf(_context.getProperty(PROP_ENABLE_UPNP, "true")).booleanValue())
+        if (_context.getBooleanPropertyDefaultTrue(PROP_ENABLE_UPNP))
             _upnpManager = new UPnPManager(context, this);
+        else
+            _upnpManager = null;
     }
     
     public void addTransport(Transport transport) {
@@ -80,37 +82,33 @@ public class TransportManager implements TransportEventListener {
     }
 
     private void configTransports() {
-        String enableUDP = _context.router().getConfigSetting(PROP_ENABLE_UDP);
-        if (enableUDP == null)
-            enableUDP = DEFAULT_ENABLE_UDP;
-        if ("true".equalsIgnoreCase(enableUDP)) {
+        boolean enableUDP = _context.getBooleanPropertyDefaultTrue(PROP_ENABLE_UDP);
+        if (enableUDP) {
             UDPTransport udp = new UDPTransport(_context);
             addTransport(udp);
             initializeAddress(udp);
         }
-        if (enableNTCP(_context))
+        if (isNTCPEnabled(_context))
             addTransport(new NTCPTransport(_context));
         if (_transports.isEmpty())
             _log.log(Log.CRIT, "No transports are enabled");
     }
     
-    public static boolean enableNTCP(RouterContext ctx) {
-        String enableNTCP = ctx.router().getConfigSetting(PROP_ENABLE_NTCP);
-        if (enableNTCP == null)
-            enableNTCP = DEFAULT_ENABLE_NTCP;
-        return "true".equalsIgnoreCase(enableNTCP);
+    public static boolean isNTCPEnabled(RouterContext ctx) {
+        return ctx.getBooleanPropertyDefaultTrue(PROP_ENABLE_NTCP);
     }
     
-    private static void initializeAddress(Transport t) {
+    private void initializeAddress(Transport t) {
         String ips = Addresses.getAnyAddress();
         if (ips == null)
             return;
-        InetAddress ia = null;
+        InetAddress ia;
         try {
             ia = InetAddress.getByName(ips);
-        } catch (UnknownHostException e) {return;}
-        if (ia == null)
+        } catch (UnknownHostException e) {
+            _log.error("UDP failed to bind to local address", e);
             return;
+        }
         byte[] ip = ia.getAddress();
         t.externalAddressReceived(Transport.SOURCE_INTERFACE, ip, 0);
     }
@@ -461,9 +459,9 @@ public class TransportManager implements TransportEventListener {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("I2NPMessage received: " + message.getClass().getName(), new Exception("Where did I come from again?"));
         try {
-            int num = _context.inNetMessagePool().add(message, fromRouter, fromRouterHash);
+            _context.inNetMessagePool().add(message, fromRouter, fromRouterHash);
             if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Added to in pool: "+ num);
+                _log.debug("Added to in pool");
         } catch (IllegalArgumentException iae) {
             if (_log.shouldLog(Log.WARN))
                 _log.warn("Error receiving message", iae);
diff --git a/router/java/src/net/i2p/router/transport/UPnP.java b/router/java/src/net/i2p/router/transport/UPnP.java
index d13a51cecdc97acdd9d9b1ff096492f250a0586d..fe3ad037766eae862544fb9da5c88a31a73367a1 100644
--- a/router/java/src/net/i2p/router/transport/UPnP.java
+++ b/router/java/src/net/i2p/router/transport/UPnP.java
@@ -10,8 +10,10 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
-import net.i2p.util.Log;
 import net.i2p.I2PAppContext;
+import net.i2p.data.DataHelper;
+import net.i2p.util.Log;
+import net.i2p.util.Translate;
 
 import org.cybergarage.upnp.Action;
 import org.cybergarage.upnp.ArgumentList;
@@ -52,9 +54,9 @@ import org.freenetproject.ForwardPortStatus;
  * TODO: Advertise the node like the MDNS plugin does
  * TODO: Implement EventListener and react on ip-change
  */ 
-public class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
-	private Log _log;
-	private I2PAppContext _context;
+class UPnP extends ControlPoint implements DeviceChangeListener, EventListener {
+	private final Log _log;
+	private final I2PAppContext _context;
 	
 	/** some schemas */
 	private static final String ROUTER_DEVICE = "urn:schemas-upnp-org:device:InternetGatewayDevice:1";
@@ -73,7 +75,7 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis
 	/** List of ports we want to forward */
 	private Set<ForwardPort> portsToForward;
 	/** List of ports we have actually forwarded */
-	private Set<ForwardPort> portsForwarded;
+	private final Set<ForwardPort> portsForwarded;
 	/** Callback to call when a forward fails or succeeds */
 	private ForwardPortCallback forwardCallback;
 	
@@ -397,31 +399,31 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis
 		for(int i=0; i<sl.size(); i++) {
 			Service serv = sl.getService(i);
 			if(serv == null) continue;
-			sb.append("<li>Service: ");
+			sb.append("<li>").append(_("Service")).append(": ");
 			if("urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1".equals(serv.getServiceType())){
-				sb.append("WAN Common Interface Config<ul>");
-				sb.append("<li>Status: " + toString("GetCommonLinkProperties", "NewPhysicalLinkStatus", serv));
-				sb.append("<li>Type: " + toString("GetCommonLinkProperties", "NewWANAccessType", serv));
-				sb.append("<li>Upstream: " + toString("GetCommonLinkProperties", "NewLayer1UpstreamMaxBitRate", serv));
-				sb.append("<li>Downstream: " + toString("GetCommonLinkProperties", "NewLayer1DownstreamMaxBitRate", serv) + "<br>");
+				sb.append(_("WAN Common Interface Configuration"));
+				sb.append("<ul><li>").append(_("Status")).append(": " + toString("GetCommonLinkProperties", "NewPhysicalLinkStatus", serv));
+				sb.append("<li>").append(_("Type")).append(": " + toString("GetCommonLinkProperties", "NewWANAccessType", serv));
+				sb.append("<li>").append(_("Upstream")).append(": " + toString("GetCommonLinkProperties", "NewLayer1UpstreamMaxBitRate", serv));
+				sb.append("<li>").append(_("Downstream")).append(": " + toString("GetCommonLinkProperties", "NewLayer1DownstreamMaxBitRate", serv) + "<br>");
 			}else if("urn:schemas-upnp-org:service:WANPPPConnection:1".equals(serv.getServiceType())){
-				sb.append("WAN PPP Connection<ul>");
-				sb.append("<li>Status: " + toString("GetStatusInfo", "NewConnectionStatus", serv));
-				sb.append("<li>Type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv));
-				sb.append("<li>Upstream: " + toString("GetLinkLayerMaxBitRates", "NewUpstreamMaxBitRate", serv));
-				sb.append("<li>Downstream: " + toString("GetLinkLayerMaxBitRates", "NewDownstreamMaxBitRate", serv) + "<br>");
-				sb.append("<li>External IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "<br>");
+				sb.append(_("WAN PPP Connection"));
+				sb.append("<ul><li>").append(_("Status")).append(": " + toString("GetStatusInfo", "NewConnectionStatus", serv));
+				sb.append("<li>").append(_("Type")).append(": " + toString("GetConnectionTypeInfo", "NewConnectionType", serv));
+				sb.append("<li>").append(_("Upstream")).append(": " + toString("GetLinkLayerMaxBitRates", "NewUpstreamMaxBitRate", serv));
+				sb.append("<li>").append(_("Downstream")).append(": " + toString("GetLinkLayerMaxBitRates", "NewDownstreamMaxBitRate", serv) + "<br>");
+				sb.append("<li>").append(_("External IP")).append(": " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "<br>");
 			}else if("urn:schemas-upnp-org:service:Layer3Forwarding:1".equals(serv.getServiceType())){
-				sb.append("Layer 3 Forwarding<ul>");
-				sb.append("<li>Default Connection Service: " + toString("GetDefaultConnectionService", "NewDefaultConnectionService", serv));
+				sb.append(_("Layer 3 Forwarding"));
+				sb.append("<ul><li>").append(_("Default Connection Service")).append(": " + toString("GetDefaultConnectionService", "NewDefaultConnectionService", serv));
 			}else if(WAN_IP_CONNECTION.equals(serv.getServiceType())){
-				sb.append("WAN IP Connection<ul>");
-				sb.append("<li>Status: " + toString("GetStatusInfo", "NewConnectionStatus", serv));
-				sb.append("<li>Type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv));
-				sb.append("<li>External IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "<br>");
+				sb.append(_("WAN IP Connection"));
+				sb.append("<ul><li>").append(_("Status")).append(": " + toString("GetStatusInfo", "NewConnectionStatus", serv));
+				sb.append("<li>").append(_("Type")).append(": " + toString("GetConnectionTypeInfo", "NewConnectionType", serv));
+				sb.append("<li>").append(_("External IP")).append(": " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "<br>");
 			}else if("urn:schemas-upnp-org:service:WANEthernetLinkConfig:1".equals(serv.getServiceType())){
-				sb.append("WAN Ethernet Link Config<ol>");
-				sb.append("<li>Status: " + toString("GetEthernetLinkStatus", "NewEthernetLinkStatus", serv) + "<br>");
+				sb.append(_("WAN Ethernet Link Configuration"));
+				sb.append("<ul><li>").append(_("Status")).append(": " + toString("GetEthernetLinkStatus", "NewEthernetLinkStatus", serv) + "<br>");
 			}else
 				sb.append("~~~~~~~ "+serv.getServiceType() + "<ul>");
 			//listActions(serv, sb);
@@ -433,10 +435,12 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis
 	
 	private void listSubDev(String prefix, Device dev, StringBuilder sb){
                 if (prefix == null)
-			sb.append("Device: ");
+			sb.append("<p>").append(_("Found Device")).append(": ");
 		else
-			sb.append("<li>Subdevice: ");
+			sb.append("<li>").append(_("Subdevice")).append(": ");
 		sb.append(dev.getFriendlyName());
+                if (prefix == null)
+			sb.append("</p>");
 		listSubServices(dev, sb);
 		
 		DeviceList dl = dev.getDeviceList();
@@ -454,38 +458,40 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis
 	/** warning - slow */
 	public String renderStatusHTML() {
 		final StringBuilder sb = new StringBuilder();
-		sb.append("<h3><a name=\"upnp\"></a>UPnP Status</h3>");
+		sb.append("<h3><a name=\"upnp\"></a>").append(_("UPnP Status")).append("</h3>");
 		
 		if(isDisabled) {
-			sb.append("UPnP has been disabled; Do you have more than one UPnP Internet Gateway Device on your LAN ?");
+			sb.append(_("UPnP has been disabled; Do you have more than one UPnP Internet Gateway Device on your LAN ?"));
 			return sb.toString();
 		} else if(!isNATPresent()) {
-			sb.append("UPnP has not found any UPnP-aware, compatible device on your LAN.");
+			sb.append(_("UPnP has not found any UPnP-aware, compatible device on your LAN."));
 			return sb.toString();
 		}
 		
-		// FIXME L10n!
-		sb.append("<p>Found ");
 		listSubDev(null, _router, sb);
 		String addr = getNATAddress();
+		sb.append("<p>");
 		if (addr != null)
-		    sb.append("<br>The current external IP address reported by UPnP is " + addr);
+		    sb.append(_("The current external IP address reported by UPnP is {0}", addr));
 		else
-		    sb.append("<br>The current external IP address is not available.");
+		    sb.append(_("The current external IP address is not available."));
 		int downstreamMaxBitRate = getDownstreamMaxBitRate();
 		int upstreamMaxBitRate = getUpstreamMaxBitRate();
 		if(downstreamMaxBitRate > 0)
-			sb.append("<br>UPnP reports the max downstream bit rate is : " + downstreamMaxBitRate+ " bits/sec\n");
+			sb.append("<br>").append(_("UPnP reports the maximum downstream bit rate is {0}bits/sec", DataHelper.formatSize2(downstreamMaxBitRate)));
 		if(upstreamMaxBitRate > 0)
-			sb.append("<br>UPnP reports the max upstream bit rate is : " + upstreamMaxBitRate+ " bits/sec\n");
+			sb.append("<br>").append(_("UPnP reports the maximum upstream bit rate is {0}bits/sec", DataHelper.formatSize2(upstreamMaxBitRate)));
 		synchronized(lock) {
 			if(portsToForward != null) {
 				for(ForwardPort port : portsToForward) {
-					sb.append("<br>" + protoToString(port.protocol) + " port " + port.portNumber + " for " + port.name);
+					sb.append("<br>");
 					if(portsForwarded.contains(port))
-						sb.append(" has been forwarded successfully by UPnP.\n");
+						// {0} is TCP or UDP
+						// {1,number,#####} prevents 12345 from being output as 12,345 in the English locale.
+						// If you want the digit separator in your locale, translate as {1}.
+						sb.append(_("{0} port {1,number,#####} was successfully forwarded by UPnP.", protoToString(port.protocol), port.portNumber));
 					else
-						sb.append(" has not been forwarded by UPnP.\n");
+						sb.append(_("{0} port {1,number,#####} was not forwarded by UPnP.", protoToString(port.protocol), port.portNumber));
 				}
 			}
 		}
@@ -554,7 +560,10 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis
 		return retval;
 	}
 
-	/** non-blocking */
+	/**
+	 *  non-blocking
+	 *  @param ports non-null
+	 */
 	public void onChangePublicPorts(Set<ForwardPort> ports, ForwardPortCallback cb) {
 		Set<ForwardPort> portsToDumpNow = null;
 		Set<ForwardPort> portsToForwardNow = null;
@@ -568,7 +577,7 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis
 				portsToForward = ports;
 				portsToForwardNow = ports;
 				portsToDumpNow = null;
-			} else if(ports == null || ports.isEmpty()) {
+			} else if(ports.isEmpty()) {
 				portsToDumpNow = portsToForward;
 				portsToForward = ports;
 				portsToForwardNow = null;
@@ -708,4 +717,27 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis
 			Thread.sleep(2000);
 		}
 	}
+
+    private static final String BUNDLE_NAME = "net.i2p.router.web.messages";
+
+    /**
+     *  Translate
+     */
+    private final String _(String s) {
+        return Translate.getString(s, _context, BUNDLE_NAME);
+    }
+
+    /**
+     *  Translate
+     */
+    private final String _(String s, Object o) {
+        return Translate.getString(s, o, _context, BUNDLE_NAME);
+    }
+
+    /**
+     *  Translate
+     */
+    private final String _(String s, Object o, Object o2) {
+        return Translate.getString(s, o, o2, _context, BUNDLE_NAME);
+    }
 }
diff --git a/router/java/src/net/i2p/router/transport/UPnPManager.java b/router/java/src/net/i2p/router/transport/UPnPManager.java
index 7996a45562aa26021141f9ca916a19f2288d5ca0..40829c1e5be95cde1c400577d8f9bd8214e2ae16 100644
--- a/router/java/src/net/i2p/router/transport/UPnPManager.java
+++ b/router/java/src/net/i2p/router/transport/UPnPManager.java
@@ -11,6 +11,7 @@ import java.util.Set;
 
 import net.i2p.router.RouterContext;
 import net.i2p.util.Log;
+import net.i2p.util.Translate;
 
 import org.cybergarage.util.Debug;
 import org.freenetproject.DetectedIP;
@@ -24,14 +25,14 @@ import org.freenetproject.ForwardPortStatus;
  *
  * @author zzz
  */
-public class UPnPManager {
-    private Log _log;
-    private RouterContext _context;
-    private UPnP _upnp;
-    private UPnPCallback _upnpCallback;
+class UPnPManager {
+    private final Log _log;
+    private final RouterContext _context;
+    private final UPnP _upnp;
+    private final UPnPCallback _upnpCallback;
     private volatile boolean _isRunning;
     private InetAddress _detectedAddress;
-    private TransportManager _manager;
+    private final TransportManager _manager;
     /**
      *  This is the TCP HTTP Event listener
      *  We move these so we don't conflict with other users of the same upnp library
@@ -56,7 +57,6 @@ public class UPnPManager {
         _upnp.setHTTPPort(_context.getProperty(PROP_HTTP_PORT, DEFAULT_HTTP_PORT));
         _upnp.setSSDPPort(_context.getProperty(PROP_SSDP_PORT, DEFAULT_SSDP_PORT));
         _upnpCallback = new UPnPCallback();
-        _isRunning = false;
     }
     
     public synchronized void start() {
@@ -87,8 +87,9 @@ public class UPnPManager {
         if (!_isRunning)
             return;
         Set<ForwardPort> forwards = new HashSet(ports.size());
-        for (String style : ports.keySet()) {
-            int port = ports.get(style).intValue();
+        for (Map.Entry<String, Integer> entry : ports.entrySet()) {
+            String style = entry.getKey();
+            int port = entry.getValue().intValue();
             int protocol = -1;
             if ("SSU".equals(style))
                 protocol = ForwardPort.PROTOCOL_UDP_IPV4;
@@ -136,8 +137,9 @@ public class UPnPManager {
                     _log.debug("No external address returned");
             }
 
-            for (ForwardPort fp : statuses.keySet()) {
-                ForwardPortStatus fps = statuses.get(fp);
+            for (Map.Entry<ForwardPort, ForwardPortStatus> entry : statuses.entrySet()) {
+                ForwardPort fp = entry.getKey();
+                ForwardPortStatus fps = entry.getValue();
                 if (_log.shouldLog(Log.DEBUG))
                     _log.debug(fp.name + " " + fp.protocol + " " + fp.portNumber +
                                " status: " + fps.status + " reason: " + fps.reasonString + " ext port: " + fps.externalPort);
@@ -156,7 +158,17 @@ public class UPnPManager {
 
     public String renderStatusHTML() {
         if (!_isRunning)
-            return "<h3><a name=\"upnp\"></a>UPnP is not enabled</h3>\n";
+            return "<h3><a name=\"upnp\"></a>" + _("UPnP is not enabled") + "</h3>\n";
         return _upnp.renderStatusHTML();
     }
+
+    private static final String BUNDLE_NAME = "net.i2p.router.web.messages";
+
+    /**
+     *  Translate
+     */
+    private final String _(String s) {
+        return Translate.getString(s, _context, BUNDLE_NAME);
+    }
+
 }
diff --git a/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java b/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java
index 8de07fe6eac85eac1cef236f05c52b9370fc76ca..3dfc1b89342fb1a4689f1bcf4fea299cc0b22fed 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java
@@ -69,7 +69,7 @@ import net.i2p.util.Log;
  * NOTE: Check info is unused.
  *
  */
-public class EstablishState {
+class EstablishState {
     private RouterContext _context;
     private Log _log;
 
@@ -399,7 +399,7 @@ public class EstablishState {
                     _context.clock().setOffset(1000 * (_tsB - _tsA), true);
                     _tsA = _tsB;
                     if (diff != 0)
-                        _log.error("NTP failure, NTCP adjusting clock by " + DataHelper.formatDuration(diff));
+                        _log.logAlways(Log.WARN, "NTP failure, NTCP adjusting clock by " + DataHelper.formatDuration(diff));
                 } else if (diff >= Router.CLOCK_FUDGE_FACTOR) {
                     _context.statManager().addRateData("ntcp.invalidOutboundSkew", diff, 0);
                     _transport.markReachable(_con.getRemotePeer().calculateHash(), false);
@@ -617,7 +617,7 @@ public class EstablishState {
                     _context.clock().setOffset(1000 * (_tsB - tsA), true);
                     tsA = _tsB;
                     if (diff != 0)
-                        _log.error("NTP failure, NTCP adjusting clock by " + DataHelper.formatDuration(diff));
+                        _log.logAlways(Log.WARN, "NTP failure, NTCP adjusting clock by " + DataHelper.formatDuration(diff));
                 } else if (diff >= Router.CLOCK_FUDGE_FACTOR) {
                     _context.statManager().addRateData("ntcp.invalidInboundSkew", diff, 0);
                     _transport.markReachable(alice.calculateHash(), true);
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 29592bf524cba24bca0a45221e5a7a1c0ee4b2cc..eeeef56c1a3f723758bd149ea316cbd12f6c2e2a 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
@@ -26,7 +26,7 @@ import net.i2p.util.Log;
 /**
  *
  */
-public class EventPumper implements Runnable {
+class EventPumper implements Runnable {
     private RouterContext _context;
     private Log _log;
     private volatile boolean _alive;
diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java
index 3fb4c6b375de7908765779a87244a2c95947488f..a24b3d9728c0e0374b689f5ca0a3641a7175f3c9 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java
@@ -53,9 +53,9 @@ import net.i2p.util.Log;
  *</pre>
  *
  */
-public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
-    private RouterContext _context;
-    private Log _log;
+class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
+    private final RouterContext _context;
+    private final Log _log;
     private SocketChannel _chan;
     private SelectionKey _conKey;
     /** list of ByteBuffer containing data we have read and are ready to process, oldest first */
@@ -71,7 +71,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
     private long _establishedOn;
     private EstablishState _establishState;
     private NTCPTransport _transport;
-    private boolean _isInbound;
+    private final boolean _isInbound;
     private boolean _closed;
     private NTCPAddress _remAddr;
     private RouterIdentity _remotePeer;
@@ -87,17 +87,17 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
     private byte _curReadBlock[];
     /** next byte to which data should be placed in the _curReadBlock */
     private int _curReadBlockIndex;
-    private byte _decryptBlockBuf[];
+    private final byte _decryptBlockBuf[];
     /** last AES block of the encrypted I2NP message (to serve as the next block's IV) */
     private byte _prevReadBlock[];
     private byte _prevWriteEnd[];
     /** current partially read I2NP message */
-    private ReadState _curReadState;
+    private final ReadState _curReadState;
     private long _messagesRead;
     private long _messagesWritten;
     private long _lastSendTime;
     private long _lastReceiveTime;
-    private long _created;
+    private final long _created;
     private long _nextMetaTime;
     /** unencrypted outbound metadata buffer */
     private final byte _meta[] = new byte[16];
@@ -127,28 +127,21 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         _context = ctx;
         _log = ctx.logManager().getLog(getClass());
         _created = System.currentTimeMillis();
-        _lastSendTime = _created;
-        _lastReceiveTime = _created;
         _transport = transport;
         _chan = chan;
         _readBufs = new LinkedBlockingQueue();
         _writeBufs = new LinkedBlockingQueue();
         _bwRequests = new ConcurrentHashSet(2);
         _outbound = new LinkedBlockingQueue();
-        _established = false;
         _isInbound = true;
-        _closed = false;
         _decryptBlockBuf = new byte[16];
-        _curReadBlock = new byte[16];
-        _prevReadBlock = new byte[16];
         _curReadState = new ReadState();
         _establishState = new EstablishState(ctx, transport, this);
         _conKey = key;
         _conKey.attach(this);
-        _sendingMeta = false;
-        _consecutiveBacklog = 0;
-        transport.establishing(this);
+        initialize();
     }
+
     /**
      * Create an outbound unconnected NTCP connection
      *
@@ -157,26 +150,25 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         _context = ctx;
         _log = ctx.logManager().getLog(getClass());
         _created = System.currentTimeMillis();
-        _lastSendTime = _created;
-        _lastReceiveTime = _created;
         _transport = transport;
+        _remotePeer = remotePeer;
         _remAddr = remAddr;
         _readBufs = new LinkedBlockingQueue();
         _writeBufs = new LinkedBlockingQueue();
         _bwRequests = new ConcurrentHashSet(2);
         _outbound = new LinkedBlockingQueue();
-        _established = false;
         _isInbound = false;
-        _closed = false;
         _decryptBlockBuf = new byte[16];
+        _curReadState = new ReadState();
+        initialize();
+    }
+
+    private void initialize() {
+        _lastSendTime = _created;
+        _lastReceiveTime = _created;
         _curReadBlock = new byte[16];
         _prevReadBlock = new byte[16];
-        _curReadState = new ReadState();
-        _remotePeer = remotePeer;
-        _sendingMeta = false;
-        _consecutiveBacklog = 0;
-        //_establishState = new EstablishState(ctx, transport, this);
-        transport.establishing(this);
+        _transport.establishing(this);
     }
     
     public SocketChannel getChannel() { return _chan; }
@@ -207,13 +199,18 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         _nextMetaTime = System.currentTimeMillis() + _context.random().nextInt(META_FREQUENCY);
         _nextInfoTime = System.currentTimeMillis() + (INFO_FREQUENCY / 2) + _context.random().nextInt(INFO_FREQUENCY);
     }
+
+    /** @return seconds */
     public long getClockSkew() { return _clockSkew; }
+
+    /** @return milliseconds */
     public long getUptime() { 
         if (!_established)
             return getTimeSinceCreated();
         else
             return System.currentTimeMillis()-_establishedOn; 
     }
+
     public long getMessagesSent() { return _messagesWritten; }
     public long getMessagesReceived() { return _messagesRead; }
     public long getOutboundQueueSize() { 
@@ -222,9 +219,16 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
                 queued++;
             return queued;
     }
+
+    /** @return milliseconds */
     public long getTimeSinceSend() { return System.currentTimeMillis()-_lastSendTime; }
+
+    /** @return milliseconds */
     public long getTimeSinceReceive() { return System.currentTimeMillis()-_lastReceiveTime; }
+
+    /** @return milliseconds */
     public long getTimeSinceCreated() { return System.currentTimeMillis()-_created; }
+
     public int getConsecutiveBacklog() { return _consecutiveBacklog; }
     
     public boolean isClosed() { return _closed; }
@@ -344,8 +348,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         OutNetMessage infoMsg = new OutNetMessage(_context);
         infoMsg.setExpiration(_context.clock().now()+10*1000);
         DatabaseStoreMessage dsm = new DatabaseStoreMessage(_context);
-        dsm.setKey(_context.routerHash());
-        dsm.setRouterInfo(_context.router().getRouterInfo());
+        dsm.setEntry(_context.router().getRouterInfo());
         infoMsg.setMessage(dsm);
         infoMsg.setPriority(100);
         RouterInfo target = _context.netDb().lookupRouterInfoLocally(_remotePeer.calculateHash());
@@ -625,26 +628,26 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         }
         
         msg.beginTransmission();
-        long begin = System.currentTimeMillis();
+        //long begin = System.currentTimeMillis();
         PrepBuffer buf = (PrepBuffer)msg.releasePreparationBuffer();
         if (buf == null)
             throw new RuntimeException("buf is null for " + msg);
         _context.aes().encrypt(buf.unencrypted, 0, buf.encrypted, 0, _sessionKey, _prevWriteEnd, 0, buf.unencryptedLength);
         System.arraycopy(buf.encrypted, buf.encrypted.length-16, _prevWriteEnd, 0, _prevWriteEnd.length);
-        long encryptedTime = System.currentTimeMillis();
+        //long encryptedTime = System.currentTimeMillis();
         //if (_log.shouldLog(Log.DEBUG))
         //    _log.debug("Encrypting " + msg + " [" + System.identityHashCode(msg) + "] crc=" + crc.getValue() + "\nas: " 
         //               + Base64.encode(encrypted, 0, 16) + "...\ndecrypted: " 
         //               + Base64.encode(unencrypted, 0, 16) + "..." + "\nIV=" + Base64.encode(_prevWriteEnd, 0, 16));
         _transport.getPumper().wantsWrite(this, buf.encrypted);
-        long wantsTime = System.currentTimeMillis();
+        //long wantsTime = System.currentTimeMillis();
         releaseBuf(buf);
-        long releaseTime = System.currentTimeMillis();
-        if (_log.shouldLog(Log.DEBUG))
-            _log.debug("prepared outbound " + System.identityHashCode(msg) 
-                       + " encrypted=" + (encryptedTime-begin)
-                       + " wantsWrite=" + (wantsTime-encryptedTime)
-                       + " releaseBuf=" + (releaseTime-wantsTime));
+        //long releaseTime = System.currentTimeMillis();
+        //if (_log.shouldLog(Log.DEBUG))
+        //    _log.debug("prepared outbound " + System.identityHashCode(msg) 
+        //               + " encrypted=" + (encryptedTime-begin)
+        //               + " wantsWrite=" + (wantsTime-encryptedTime)
+        //               + " releaseBuf=" + (releaseTime-wantsTime));
 
         // for every 6-12 hours that we are connected to a peer, send them
 	// our updated netDb info (they may not accept it and instead query
@@ -667,9 +670,9 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         //if (!_isInbound && !_established)
         //    return;
         msg.beginPrepare();
-        long begin = System.currentTimeMillis();
+        //long begin = System.currentTimeMillis();
         PrepBuffer buf = acquireBuf();
-        long alloc = System.currentTimeMillis();
+        //long alloc = System.currentTimeMillis();
         
         I2NPMessage m = msg.getMessage();
         buf.baseLength = m.toByteArray(buf.base);
@@ -689,7 +692,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
             _context.random().nextBytes(buf.pad); // maybe more than necessary, but its only the prng
         System.arraycopy(buf.pad, 0, buf.unencrypted, 2+sz, buf.padLength);
         
-        long serialized = System.currentTimeMillis();
+        //long serialized = System.currentTimeMillis();
         buf.crc.update(buf.unencrypted, 0, buf.unencryptedLength-4);
         
         long val = buf.crc.getValue();
@@ -700,11 +703,11 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         DataHelper.toLong(buf.unencrypted, buf.unencryptedLength-4, 4, val);
         buf.encrypted = new byte[buf.unencryptedLength];
         
-        long crced = System.currentTimeMillis();
+        //long crced = System.currentTimeMillis();
         msg.prepared(buf);
-        if (_log.shouldLog(Log.DEBUG))
-            _log.debug("Buffered prepare took " + (crced-begin) + ", alloc=" + (alloc-begin)
-                       + " serialize=" + (serialized-alloc) + " crc=" + (crced-serialized));
+        //if (_log.shouldLog(Log.DEBUG))
+        //    _log.debug("Buffered prepare took " + (crced-begin) + ", alloc=" + (alloc-begin)
+        //               + " serialize=" + (serialized-alloc) + " crc=" + (crced-serialized));
     }
     
     private static final int MIN_PREP_BUFS = 5;
@@ -828,14 +831,16 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
      * contents have been fully allocated
      */
     public void queuedRecv(ByteBuffer buf, FIFOBandwidthLimiter.Request req) {
-        addRequest(req);
         req.attach(buf);
         req.setCompleteListener(this);
+        addRequest(req);
     }
+
+    /** ditto for writes */
     public void queuedWrite(ByteBuffer buf, FIFOBandwidthLimiter.Request req) {
-        addRequest(req);
         req.attach(buf);
         req.setCompleteListener(this);
+        addRequest(req);
     }
     
     /**
@@ -1083,15 +1088,6 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         // enqueueInfoMessage(); // this often?
     }
     
-    @Override
-    public int hashCode() { return System.identityHashCode(this); }
-    @Override
-    public boolean equals(Object obj) {
-        if(obj == null) return false;
-        if(obj.getClass() != NTCPConnection.class) return false;
-        return obj == this;
-    }
-
     private static final int MAX_HANDLERS = 4;
     private final static LinkedBlockingQueue<I2NPMessageHandler> _i2npHandlers = new LinkedBlockingQueue(MAX_HANDLERS);
 
diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java
index 374c7a5ba0dbf89fca890c991106a7209377476d..630036204d5402a6f0c9c7a339265fc27397a88a 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java
@@ -23,7 +23,7 @@ import net.i2p.util.Log;
  *
  * @author zzz
  */
-public class NTCPSendFinisher {
+class NTCPSendFinisher {
     private static final int MIN_THREADS = 1;
     private static final int MAX_THREADS = 4;
     private final I2PAppContext _context;
@@ -31,7 +31,13 @@ public class NTCPSendFinisher {
     private final Log _log;
     private static int _count;
     private ThreadPoolExecutor _executor;
-    private static int _threads;
+    private static final int THREADS;
+    static {
+        long maxMemory = Runtime.getRuntime().maxMemory();
+        if (maxMemory == Long.MAX_VALUE)
+            maxMemory = 96*1024*1024l;
+        THREADS = (int) Math.max(MIN_THREADS, Math.min(MAX_THREADS, 1 + (maxMemory / (32*1024*1024))));
+    }
 
     public NTCPSendFinisher(I2PAppContext context, NTCPTransport transport) {
         _context = context;
@@ -42,9 +48,7 @@ public class NTCPSendFinisher {
     
     public void start() {
         _count = 0;
-        long maxMemory = Runtime.getRuntime().maxMemory();
-        _threads = (int) Math.max(MIN_THREADS, Math.min(MAX_THREADS, 1 + (maxMemory / (32*1024*1024))));
-        _executor = new CustomThreadPoolExecutor(_threads);
+        _executor = new CustomThreadPoolExecutor(THREADS);
     }
 
     public void stop() {
@@ -73,7 +77,7 @@ public class NTCPSendFinisher {
     private static class CustomThreadFactory implements ThreadFactory {
         public Thread newThread(Runnable r) {
             Thread rv = Executors.defaultThreadFactory().newThread(r);
-            rv.setName("NTCPSendFinisher " + (++_count) + '/' + _threads);
+            rv.setName("NTCPSendFinisher " + (++_count) + '/' + THREADS);
             rv.setDaemon(true);
             return rv;
         }
diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
index 62d57810e87fedab50b873093eeecc325d5c4e28..326f659effbf2b8fdf193edb155af88edc86c88a 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
@@ -491,6 +491,8 @@ public class NTCPTransport extends TransportImpl {
         _pumper.startPumping();
 
         long maxMemory = Runtime.getRuntime().maxMemory();
+        if (maxMemory == Long.MAX_VALUE)
+            maxMemory = 128*1024*1024l;
         int nr, nw;
         if (maxMemory < 32*1024*1024) {
             nr = nw = 1;
diff --git a/router/java/src/net/i2p/router/transport/udp/ACKSender.java b/router/java/src/net/i2p/router/transport/udp/ACKSender.java
index d6035766db1410fbf757b842ce3e52ce6bca2b02..33fd401df1d2b24f9370bd811e0a7bfb28604ced 100644
--- a/router/java/src/net/i2p/router/transport/udp/ACKSender.java
+++ b/router/java/src/net/i2p/router/transport/udp/ACKSender.java
@@ -2,6 +2,7 @@ package net.i2p.router.transport.udp;
 
 import java.util.HashSet;
 import java.util.List;
+import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
@@ -120,7 +121,7 @@ class ACKSender implements Runnable {
                             try {
                                 // bulk operations may throw an exception
                                 _peersToACK.addAll(notYet);
-                            } catch (Exception e) {}
+                            } catch (NoSuchElementException nsee) {}
                             notYet.clear();
                             break;
                         } else { 
diff --git a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
index d19f929c275b22df983e31aef2655689e376140f..24e0efe87720e18fa00108da7712ef1d153bc623 100644
--- a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
@@ -577,8 +577,7 @@ class EstablishmentManager {
                       (isInbound ? " inbound con from " + peer : "outbound con to " + peer));
         
         DatabaseStoreMessage m = new DatabaseStoreMessage(_context);
-        m.setKey(_context.routerHash());
-        m.setRouterInfo(_context.router().getRouterInfo());
+        m.setEntry(_context.router().getRouterInfo());
         m.setMessageExpiration(_context.clock().now() + 10*1000);
         _transport.send(m, peer);
     }
@@ -642,7 +641,7 @@ class EstablishmentManager {
     private void handlePendingIntro(OutboundEstablishState state) {
         long nonce = _context.random().nextLong(MAX_NONCE);
         while (true) {
-                OutboundEstablishState old = _liveIntroductions.putIfAbsent(new Long(nonce), state);
+                OutboundEstablishState old = _liveIntroductions.putIfAbsent(Long.valueOf(nonce), state);
                 if (old != null) {
                     nonce = _context.random().nextLong(MAX_NONCE);
                 } else {
@@ -670,7 +669,7 @@ class EstablishmentManager {
         }
         public void timeReached() {
             // remove only if value equal to state
-            boolean removed = _liveIntroductions.remove(new Long(_nonce), _state);
+            boolean removed = _liveIntroductions.remove(Long.valueOf(_nonce), _state);
             if (removed) {
                 if (_log.shouldLog(Log.DEBUG))
                     _log.debug("Send intro for " + _state.getRemoteHostId().toString() + " timed out");
@@ -682,7 +681,7 @@ class EstablishmentManager {
     
     void receiveRelayResponse(RemoteHostId bob, UDPPacketReader reader) {
         long nonce = reader.getRelayResponseReader().readNonce();
-        OutboundEstablishState state = _liveIntroductions.remove(new Long(nonce));
+        OutboundEstablishState state = _liveIntroductions.remove(Long.valueOf(nonce));
         if (state == null) 
             return; // already established
         
diff --git a/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java b/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java
index bc0ddc5f5e1fdc0fabec9c8a0d520028b05e2617..f685c9e787e6a1dbc522ee8d9ff23757814f0353 100644
--- a/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java
+++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java
@@ -100,7 +100,7 @@ class InboundMessageFragments /*implements UDPTransport.PartialACKSource */{
 
         for (int i = 0; i < fragments; i++) {
             long mid = data.readMessageId(i);
-            Long messageId = new Long(mid);
+            Long messageId = Long.valueOf(mid);
 
             if (_recentlyCompletedMessages.isKnown(mid)) {
                 _context.statManager().addRateData("udp.ignoreRecentDuplicate", 1, 0);
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 326c43f15d1b4721d641b7a9db81df3e5d6619ad..b39f44de9ad7f7803ee406e620a64f29e7d33a55 100644
--- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
@@ -53,7 +53,7 @@ class IntroductionManager {
             _log.debug("Adding peer " + peer.getRemoteHostId() + ", weRelayToThemAs " 
                        + peer.getWeRelayToThemAs() + ", theyRelayToUsAs " + peer.getTheyRelayToUsAs());
         if (peer.getWeRelayToThemAs() > 0) 
-            _outbound.put(new Long(peer.getWeRelayToThemAs()), peer);
+            _outbound.put(Long.valueOf(peer.getWeRelayToThemAs()), peer);
         if (peer.getTheyRelayToUsAs() > 0) {
                     _inbound.add(peer);
         }
@@ -65,14 +65,14 @@ class IntroductionManager {
             _log.debug("removing peer " + peer.getRemoteHostId() + ", weRelayToThemAs " 
                        + peer.getWeRelayToThemAs() + ", theyRelayToUsAs " + peer.getTheyRelayToUsAs());
         if (peer.getWeRelayToThemAs() > 0) 
-            _outbound.remove(new Long(peer.getWeRelayToThemAs()));
+            _outbound.remove(Long.valueOf(peer.getWeRelayToThemAs()));
         if (peer.getTheyRelayToUsAs() > 0) {
             _inbound.remove(peer);
         }
     }
     
     public PeerState get(long id) {
-        return _outbound.get(new Long(id));
+        return _outbound.get(Long.valueOf(id));
     }
     
     /**
diff --git a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java
index 4988a06851a463b3b9abd9367c623741e185e96c..dede98ef7dc1c629f2f4ddc7796f54a8f56a66a5 100644
--- a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java
+++ b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java
@@ -39,6 +39,8 @@ class MessageReceiver {
         _completeMessages = new LinkedBlockingQueue();
 
         long maxMemory = Runtime.getRuntime().maxMemory();
+        if (maxMemory == Long.MAX_VALUE)
+            maxMemory = 96*1024*1024l;
         if (maxMemory < 32*1024*1024)
             _threadCount = 1;
         else if (maxMemory < 64*1024*1024)
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 98daaecf981e36220259e5a4ad482f5a841bdcfd..cc43c4b2e3cb2d6091cb7100e9514bc9f50b68c3 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
@@ -661,7 +661,6 @@ class PacketBuilder {
      */
     public UDPPacket buildSessionDestroyPacket(PeerState peer) {
         UDPPacket packet = buildPacketHeader((byte)(UDPPacket.PAYLOAD_TYPE_SESSION_DESTROY << 4));
-        byte data[] = packet.getPacket().getData();
         int off = HEADER_SIZE;
         
         StringBuilder msg = null;
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 2c0138228d728d69a854573718659232a03526bc..824f4a9285eab2e3a3d65c5e5c4e626621832bfd 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
@@ -20,14 +20,14 @@ import net.i2p.util.Log;
  *
  */
 class PacketHandler {
-    private RouterContext _context;
-    private Log _log;
-    private UDPTransport _transport;
-    private UDPEndpoint _endpoint;
-    private EstablishmentManager _establisher;
-    private InboundMessageFragments _inbound;
-    private PeerTestManager _testManager;
-    private IntroductionManager _introManager;
+    private final RouterContext _context;
+    private final Log _log;
+    private final UDPTransport _transport;
+    private final UDPEndpoint _endpoint;
+    private final EstablishmentManager _establisher;
+    private final InboundMessageFragments _inbound;
+    private final PeerTestManager _testManager;
+    private final IntroductionManager _introManager;
     private boolean _keepReading;
     private final Handler[] _handlers;
     
@@ -48,6 +48,8 @@ class PacketHandler {
         _introManager = introManager;
 
         long maxMemory = Runtime.getRuntime().maxMemory();
+        if (maxMemory == Long.MAX_VALUE)
+            maxMemory = 96*1024*1024l;
         int num_handlers;
         if (maxMemory < 32*1024*1024)
             num_handlers = 1;
@@ -337,6 +339,9 @@ class PacketHandler {
             _state = 30;
         }
 
+        /**
+         * @param state non-null
+         */
         private void receivePacket(UDPPacketReader reader, UDPPacket packet, InboundEstablishState state) {
             receivePacket(reader, packet, state, true);
         }
@@ -345,11 +350,12 @@ class PacketHandler {
          * Inbound establishing conn
          * Decrypt and validate the packet then call handlePacket()
          *
+         * @param state non-null
          * @param allowFallback if it isn't valid for this establishment state, try as a non-establishment packet
          */
         private void receivePacket(UDPPacketReader reader, UDPPacket packet, InboundEstablishState state, boolean allowFallback) {
             _state = 31;
-            if ( (state != null) && (_log.shouldLog(Log.DEBUG)) ) {
+            if (_log.shouldLog(Log.DEBUG)) {
                 StringBuilder buf = new StringBuilder(128);
                 buf.append("Attempting to receive a packet on a known inbound state: ");
                 buf.append(state);
@@ -388,10 +394,12 @@ class PacketHandler {
         /**
          * Outbound establishing conn
          * Decrypt and validate the packet then call handlePacket()
+         *
+         * @param state non-null
          */
         private void receivePacket(UDPPacketReader reader, UDPPacket packet, OutboundEstablishState state) {
             _state = 35;
-            if ( (state != null) && (_log.shouldLog(Log.DEBUG)) ) {
+            if (_log.shouldLog(Log.DEBUG)) {
                 StringBuilder buf = new StringBuilder(128);
                 buf.append("Attempting to receive a packet on a known outbound state: ");
                 buf.append(state);
@@ -467,7 +475,7 @@ class PacketHandler {
                 // so we have to wait for NTCP to do it
                 _context.clock().setOffset(0 - skew, true);
                 if (skew != 0)
-                    _log.error("NTP failure, UDP adjusting clock by " + DataHelper.formatDuration(Math.abs(skew)));
+                    _log.logAlways(Log.WARN, "NTP failure, UDP adjusting clock by " + DataHelper.formatDuration(Math.abs(skew)));
             }
 
             if (skew > GRACE_PERIOD) {
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 a3211a5a620f065212fe56117fb747f59d889b78..46b1e4666884af6891487359a1f8bab4d41d8eb3 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
@@ -153,7 +153,7 @@ class PeerTestManager {
             _log.debug("Running test with bob = " + bobIP + ":" + bobPort + " " + test.getNonce());
         while (_recentTests.size() > 16)
             _recentTests.poll();
-        _recentTests.offer(new Long(test.getNonce()));
+        _recentTests.offer(Long.valueOf(test.getNonce()));
         
         sendTestToBob();
         
@@ -432,7 +432,7 @@ class PeerTestManager {
             testInfo.readIP(testIP, 0);
         }
        
-        PeerTestState state = _activeTests.get(new Long(nonce));
+        PeerTestState state = _activeTests.get(Long.valueOf(nonce));
         
         if (state == null) {
             if ( (testIP == null) || (testPort <= 0) ) {
@@ -441,7 +441,7 @@ class PeerTestManager {
                     _log.debug("test IP/port are blank coming from " + from + ", assuming we are Bob and they are alice");
                 receiveFromAliceAsBob(from, testInfo, nonce, null);
             } else {
-                if (_recentTests.contains(new Long(nonce))) {
+                if (_recentTests.contains(Long.valueOf(nonce))) {
                     // ignore the packet, as its a holdover from a recently completed locally
                     // initiated test
                 } else {
@@ -536,7 +536,7 @@ class PeerTestManager {
                 _log.debug("Receive from bob (" + from + ") as charlie, sending back to bob and sending to alice @ " + aliceIP + ":" + alicePort);
             
             if (isNew) {
-                _activeTests.put(new Long(nonce), state);
+                _activeTests.put(Long.valueOf(nonce), state);
                 SimpleScheduler.getInstance().addEvent(new RemoveTest(nonce), MAX_CHARLIE_LIFETIME);
             }
 
@@ -615,7 +615,7 @@ class PeerTestManager {
             }
             
             if (isNew) {
-                _activeTests.put(new Long(nonce), state);
+                _activeTests.put(Long.valueOf(nonce), state);
                 SimpleScheduler.getInstance().addEvent(new RemoveTest(nonce), MAX_CHARLIE_LIFETIME);
             }
             
@@ -691,7 +691,7 @@ class PeerTestManager {
             _nonce = nonce;
         }
         public void timeReached() {
-                _activeTests.remove(new Long(_nonce));
+                _activeTests.remove(Long.valueOf(_nonce));
         }
     }
 }
diff --git a/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java b/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java
index 510d712a0bb478838e0e6a3977ca823b4ce6e9dc..837a50268e62d94a68855eb59bf7232498a4f57b 100644
--- a/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java
+++ b/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java
@@ -28,21 +28,15 @@ final class RemoteHostId {
     
     @Override
     public int hashCode() {
-        int rv = 0;
-        for (int i = 0; _ip != null && i < _ip.length; i++)
-            rv += _ip[i] << i;
-        for (int i = 0; _peerHash != null && i < _peerHash.length; i++)
-            rv += _peerHash[i] << i;
-        rv += _port;
-        return rv;
+        return DataHelper.hashCode(_ip) ^ DataHelper.hashCode(_peerHash) ^ _port;
     }
     
     @Override
     public boolean equals(Object obj) {
         if (obj == null) 
-            throw new NullPointerException("obj is null");
+            return false;
         if (!(obj instanceof RemoteHostId)) 
-            throw new ClassCastException("obj is a " + obj.getClass().getName());
+            return false;
         RemoteHostId id = (RemoteHostId)obj;
         return (_port == id.getPort()) && DataHelper.eq(_ip, id.getIP()) && DataHelper.eq(_peerHash, id.getPeerHash());
     }
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPAddress.java b/router/java/src/net/i2p/router/transport/udp/UDPAddress.java
index 6db0b1c6c2d840106582216896634306eeaff141..bcee07605e44a222faed26f1fc4c4b3b7f957d29 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPAddress.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPAddress.java
@@ -10,6 +10,7 @@ import net.i2p.data.SessionKey;
 
 /**
  * basic helper to parse out peer info from a udp address
+ * FIXME public for ConfigNetHelper
  */
 public class UDPAddress {
     private String _host;
@@ -152,7 +153,7 @@ public class UDPAddress {
     }
     
     public String getHost() { return _host; }
-    public InetAddress getHostAddress() {
+    InetAddress getHostAddress() {
         if (_hostAddress == null) {
             try {
                 _hostAddress = InetAddress.getByName(_host);
@@ -163,10 +164,10 @@ public class UDPAddress {
         return _hostAddress;
     }
     public int getPort() { return _port; }
-    public byte[] getIntroKey() { return _introKey; }
+    byte[] getIntroKey() { return _introKey; }
     
-    public int getIntroducerCount() { return (_introAddresses == null ? 0 : _introAddresses.length); }
-    public InetAddress getIntroducerHost(int i) { 
+    int getIntroducerCount() { return (_introAddresses == null ? 0 : _introAddresses.length); }
+    InetAddress getIntroducerHost(int i) { 
         if (_introAddresses[i] == null) {
             try {
                 _introAddresses[i] = InetAddress.getByName(_introHosts[i]);
@@ -176,8 +177,8 @@ public class UDPAddress {
         }
         return _introAddresses[i];
     }
-    public int getIntroducerPort(int i) { return _introPorts[i]; }
-    public byte[] getIntroducerKey(int i) { return _introKeys[i]; }
-    public long getIntroducerTag(int i) { return _introTags[i]; }
+    int getIntroducerPort(int i) { return _introPorts[i]; }
+    byte[] getIntroducerKey(int i) { return _introKeys[i]; }
+    long getIntroducerTag(int i) { return _introTags[i]; }
         
 }
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java
index 0a1937db10d8c7c59e9c21da37b49536e6e7a563..ded71f8a2abe350980aa06ca08cefa5bf2ca0ff6 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java
@@ -20,16 +20,16 @@ import net.i2p.util.SimpleTimer;
  *
  */
 class UDPReceiver {
-    private RouterContext _context;
-    private Log _log;
+    private final RouterContext _context;
+    private final Log _log;
     private DatagramSocket _socket;
     private String _name;
     private final BlockingQueue<UDPPacket> _inboundQueue;
     private boolean _keepRunning;
-    private Runner _runner;
-    private UDPTransport _transport;
+    private final Runner _runner;
+    private final UDPTransport _transport;
     private static int __id;
-    private int _id;
+    private final int _id;
     private static final int TYPE_POISON = -99999;
     
     public UDPReceiver(RouterContext ctx, UDPTransport transport, DatagramSocket socket, String name) {
@@ -179,8 +179,7 @@ class UDPReceiver {
             msg.append(queueSize);
             msg.append(" queued for ");
             msg.append(headPeriod);
-            if (_transport != null)
-                msg.append(" packet handlers: ").append(_transport.getPacketHandlerStatus());
+            msg.append(" packet handlers: ").append(_transport.getPacketHandlerStatus());
             _log.warn(msg.toString());
         }
         return queueSize;
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 b55d845adcd276ab5e0fb8a78b627e4a1f29e7a3..b8f1d35ee4b38d8268533f68164256be884e1f2f 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -18,6 +18,7 @@ import java.util.TreeSet;
 import java.util.Vector;
 import java.util.concurrent.ConcurrentHashMap;
 
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Hash;
 import net.i2p.data.RouterAddress;
@@ -33,6 +34,7 @@ import net.i2p.router.RouterContext;
 import net.i2p.router.transport.Transport;
 import net.i2p.router.transport.TransportBid;
 import net.i2p.router.transport.TransportImpl;
+import net.i2p.router.util.RandomIterator;
 import net.i2p.util.ConcurrentHashSet;
 import net.i2p.util.Log;
 import net.i2p.util.SimpleScheduler;
@@ -52,16 +54,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private PacketHandler _handler;
     private EstablishmentManager _establisher;
     private final MessageQueue _outboundMessages;
-    private OutboundMessageFragments _fragments;
+    private final OutboundMessageFragments _fragments;
     private final OutboundMessageFragments.ActiveThrottle _activeThrottle;
     private OutboundRefiller _refiller;
     private PacketPusher _pusher;
-    private InboundMessageFragments _inboundFragments;
+    private final InboundMessageFragments _inboundFragments;
     private UDPFlooder _flooder;
     private PeerTestManager _testManager;
     private final IntroductionManager _introManager;
-    private ExpirePeerEvent _expireEvent;
-    private PeerTestEvent _testEvent;
+    private final ExpirePeerEvent _expireEvent;
+    private final PeerTestEvent _testEvent;
     private short _reachabilityStatus;
     private long _reachabilityStatusLastUpdated;
     private long _introducersSelectedOn;
@@ -156,7 +158,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     
     public static final int DEFAULT_COST = 5;
     private static final int TEST_FREQUENCY = 13*60*1000;
-    public static final long[] RATES = { 10*60*1000 };
+    static final long[] RATES = { 10*60*1000 };
     
     private static final int[] BID_VALUES = { 15, 20, 50, 65, 80, 95, 100, 115, TransportBid.TRANSIENT_FAIL };
     private static final int FAST_PREFERRED_BID = 0;
@@ -227,8 +229,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     }
     
     public void startup() {
-        if (_fragments != null)
-            _fragments.shutdown();
+        _fragments.shutdown();
         if (_pusher != null)
             _pusher.shutdown();
         if (_handler != null) 
@@ -239,8 +240,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             _establisher.shutdown();
         if (_refiller != null)
             _refiller.shutdown();
-        if (_inboundFragments != null)
-            _inboundFragments.shutdown();
+        _inboundFragments.shutdown();
         if (_flooder != null)
             _flooder.shutdown();
         _introManager.reset();
@@ -345,14 +345,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             _refiller.shutdown();
         if (_handler != null)
             _handler.shutdown();
-        if (_fragments != null)
-            _fragments.shutdown();
+        _fragments.shutdown();
         if (_pusher != null)
             _pusher.shutdown();
         if (_establisher != null)
             _establisher.shutdown();
-        if (_inboundFragments != null)
-            _inboundFragments.shutdown();
+        _inboundFragments.shutdown();
         _expireEvent.setIsAlive(false);
         _testEvent.setIsAlive(false);
     }
@@ -773,8 +771,11 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     public void messageReceived(I2NPMessage inMsg, RouterIdentity remoteIdent, Hash remoteIdentHash, long msToReceive, int bytesReceived) {
         if (inMsg.getType() == DatabaseStoreMessage.MESSAGE_TYPE) {
             DatabaseStoreMessage dsm = (DatabaseStoreMessage)inMsg;
-            if ( (dsm.getRouterInfo() != null) && 
-                 (dsm.getRouterInfo().getNetworkId() != Router.NETWORK_ID) ) {
+            DatabaseEntry entry = dsm.getEntry();
+            if (entry == null)
+                return;
+            if (entry.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO &&
+                ((RouterInfo) entry).getNetworkId() != Router.NETWORK_ID) {
                 // this is pre-0.6.1.10, so it isn't going to happen any more
 
                 /*
@@ -792,7 +793,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
                                    + " because they are in the wrong net");
                 }
                  */
-                Hash peerHash = dsm.getRouterInfo().getIdentity().calculateHash();
+                Hash peerHash = entry.getHash();
                 PeerState peer = getPeerState(peerHash);
                 if (peer != null) {
                     RemoteHostId remote = peer.getRemoteHostId();
@@ -801,14 +802,14 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
                     SimpleScheduler.getInstance().addEvent(new RemoveDropList(remote), DROPLIST_PERIOD);
                 }
                 markUnreachable(peerHash);
-                _context.shitlist().shitlistRouter(peerHash, "Part of the wrong network, version = " + dsm.getRouterInfo().getOption("router.version"));
+                _context.shitlist().shitlistRouter(peerHash, "Part of the wrong network, version = " + ((RouterInfo) entry).getOption("router.version"));
                 //_context.shitlist().shitlistRouter(peerHash, "Part of the wrong network", STYLE);
                 dropPeer(peerHash, false, "wrong network");
                 if (_log.shouldLog(Log.WARN))
-                    _log.warn("Dropping the peer " + peerHash.toBase64() + " because they are in the wrong net: " + dsm.getRouterInfo());
+                    _log.warn("Dropping the peer " + peerHash.toBase64() + " because they are in the wrong net: " + entry);
                 return;
             } else {
-                if (dsm.getRouterInfo() != null) {
+                if (entry.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
                     if (_log.shouldLog(Log.INFO))
                         _log.info("Received an RI from the same net");
                 } else {
@@ -1116,7 +1117,11 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         if (msg == null) return;
         if (msg.getTarget() == null) return;
         if (msg.getTarget().getIdentity() == null) return;
-    
+        if (_establisher == null) {
+            failed(msg, "UDP not up yet");
+            return;    
+        }
+
         msg.timestamp("sending on UDP transport");
         Hash to = msg.getTarget().getIdentity().calculateHash();
         PeerState peer = getPeerState(to);
@@ -1443,11 +1448,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         if (_log.shouldLog(Log.INFO))
             _log.info("Sending message failed: " + msg, new Exception("failed from"));
         
-        if (!_context.messageHistory().getDoLog())
+        if (_context.messageHistory().getDoLog())
             _context.messageHistory().sendMessage(msg.getMessageType(), msg.getMessageId(), msg.getExpiration(), 
                                               msg.getTarget().getIdentity().calculateHash(), false, reason);
         super.afterSend(msg, false);
     }
+
     public void succeeded(OutboundMessageState msg) {
         if (msg == null) return;
         if (_log.shouldLog(Log.DEBUG))
@@ -1633,7 +1639,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final IdleInComparator _instance = new IdleInComparator();
         public static final IdleInComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = r.getLastReceiveTime() - l.getLastReceiveTime();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1645,7 +1651,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final IdleOutComparator _instance = new IdleOutComparator();
         public static final IdleOutComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = r.getLastSendTime() - l.getLastSendTime();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1657,7 +1663,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final RateInComparator _instance = new RateInComparator();
         public static final RateInComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = l.getReceiveBps() - r.getReceiveBps();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1669,7 +1675,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final RateOutComparator _instance = new RateOutComparator();
         public static final RateOutComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = l.getSendBps() - r.getSendBps();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1681,7 +1687,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final UptimeComparator _instance = new UptimeComparator();
         public static final UptimeComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = r.getKeyEstablishedTime() - l.getKeyEstablishedTime();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1693,7 +1699,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final SkewComparator _instance = new SkewComparator();
         public static final SkewComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = Math.abs(l.getClockSkew()) - Math.abs(r.getClockSkew());
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1705,7 +1711,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final CwndComparator _instance = new CwndComparator();
         public static final CwndComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = l.getSendWindowBytes() - r.getSendWindowBytes();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1717,7 +1723,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final SsthreshComparator _instance = new SsthreshComparator();
         public static final SsthreshComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = l.getSlowStartThreshold() - r.getSlowStartThreshold();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1729,7 +1735,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final RTTComparator _instance = new RTTComparator();
         public static final RTTComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = l.getRTT() - r.getRTT();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1741,7 +1747,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final DevComparator _instance = new DevComparator();
         public static final DevComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = l.getRTTDeviation() - r.getRTTDeviation();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1753,7 +1759,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final RTOComparator _instance = new RTOComparator();
         public static final RTOComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = l.getRTO() - r.getRTO();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1765,7 +1771,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final MTUComparator _instance = new MTUComparator();
         public static final MTUComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = l.getMTU() - r.getMTU();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1777,7 +1783,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final SendCountComparator _instance = new SendCountComparator();
         public static final SendCountComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = l.getPacketsTransmitted() - r.getPacketsTransmitted();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1789,7 +1795,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final RecvCountComparator _instance = new RecvCountComparator();
         public static final RecvCountComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = l.getPacketsReceived() - r.getPacketsReceived();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1801,7 +1807,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final ResendComparator _instance = new ResendComparator();
         public static final ResendComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = l.getPacketsRetransmitted() - r.getPacketsRetransmitted();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1813,7 +1819,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         private static final DupComparator _instance = new DupComparator();
         public static final DupComparator instance() { return _instance; }
         @Override
-        protected int compare(PeerState l, PeerState r) {
+        public int compare(PeerState l, PeerState r) {
             long rv = l.getPacketsReceivedDuplicate() - r.getPacketsReceivedDuplicate();
             if (rv == 0) // fallback on alpha
                 return super.compare(l, r);
@@ -1822,17 +1828,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         }
     }
     
-    private static class PeerComparator implements Comparator {
-        public int compare(Object lhs, Object rhs) {
-            if ( (lhs == null) || (rhs == null) || !(lhs instanceof PeerState) || !(rhs instanceof PeerState)) 
-                throw new IllegalArgumentException("rhs = " + rhs + " lhs = " + lhs);
-            return compare((PeerState)lhs, (PeerState)rhs);
-        }
-        protected int compare(PeerState l, PeerState r) {
-            // base64 retains binary ordering
-            return l.getRemotePeer().toBase64().compareTo(r.getRemotePeer().toBase64());
+    private static class PeerComparator implements Comparator<PeerState> {
+        public int compare(PeerState l, PeerState r) {
+            return DataHelper.compareTo(l.getRemotePeer().getData(), r.getRemotePeer().getData());
         }
     }
+
     private static class InverseComparator implements Comparator {
         private Comparator _comp;
         public InverseComparator(Comparator comp) { _comp = comp; }
@@ -2327,9 +2328,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     
     PeerState pickTestPeer(RemoteHostId dontInclude) {
         List<PeerState> peers = new ArrayList(_peersByIdent.values());
-        Collections.shuffle(peers, _context.random());
-        for (int i = 0; i < peers.size(); i++) {
-            PeerState peer = peers.get(i);
+        for (Iterator<PeerState> iter = new RandomIterator(peers); iter.hasNext(); ) {
+            PeerState peer = iter.next();
             if ( (dontInclude != null) && (dontInclude.equals(peer.getRemoteHostId())) )
                 continue;
             RouterInfo peerInfo = _context.netDb().lookupRouterInfoLocally(peer.getRemotePeer());
diff --git a/router/java/src/net/i2p/router/tunnel/BuildMessageGenerator.java b/router/java/src/net/i2p/router/tunnel/BuildMessageGenerator.java
index da169db7517f3125aa930af617244f605ac2dfbc..1790669890f1d1abea6c1d49a44f4e71bfdd2221 100644
--- a/router/java/src/net/i2p/router/tunnel/BuildMessageGenerator.java
+++ b/router/java/src/net/i2p/router/tunnel/BuildMessageGenerator.java
@@ -21,9 +21,6 @@ import net.i2p.util.Log;
  *
  */
 public class BuildMessageGenerator {
-    // cached, rather than creating lots of temporary Integer objects whenever we build a tunnel
-    public static final Integer ORDER[] = new Integer[TunnelBuildMessage.MAX_RECORD_COUNT];
-    static { for (int i = 0; i < ORDER.length; i++) ORDER[i] = Integer.valueOf(i); }
     
     /** return null if it is unable to find a router's public key (etc) */
 /****
diff --git a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java
index 7948c5387b7ac4917df0d89841dc5afab4014331..a0a2f2edacdf2fe8d93cf450001547614215c987 100644
--- a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java
+++ b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java
@@ -15,6 +15,7 @@ import net.i2p.data.i2np.I2NPMessageHandler;
 import net.i2p.router.RouterContext;
 import net.i2p.util.ByteCache;
 import net.i2p.util.Log;
+import net.i2p.util.SimpleByteCache;
 import net.i2p.util.SimpleTimer;
 
 /**
@@ -241,19 +242,21 @@ public class FragmentHandler {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("endpoint IV: " + Base64.encode(preV, validLength - HopProcessor.IV_LENGTH, HopProcessor.IV_LENGTH));
         
-        Hash v = _context.sha().calculateHash(preV, 0, validLength);
+        byte[] v = SimpleByteCache.acquire(Hash.HASH_LENGTH);
+        _context.sha().calculateHash(preV, 0, validLength, v, 0);
         _validateCache.release(ba);
         
-        boolean eq = DataHelper.eq(v.getData(), 0, preprocessed, offset + HopProcessor.IV_LENGTH, 4);
+        boolean eq = DataHelper.eq(v, 0, preprocessed, offset + HopProcessor.IV_LENGTH, 4);
         if (!eq) {
             if (_log.shouldLog(Log.WARN)) {
                 _log.warn("Corrupt tunnel message - verification fails: " + Base64.encode(preprocessed, offset+HopProcessor.IV_LENGTH, 4)
-                           + " != " + Base64.encode(v.getData(), 0, 4));
+                           + " != " + Base64.encode(v, 0, 4));
                 _log.warn("No matching endpoint: # pad bytes: " + (paddingEnd-(HopProcessor.IV_LENGTH+4)-1)
                            + " offset=" + offset + " length=" + length + " paddingEnd=" + paddingEnd + ' '
                            + Base64.encode(preprocessed, offset, length), new Exception("trace"));
             }
         }
+        SimpleByteCache.release(v);
         
         if (eq) {
             int excessPadding = paddingEnd - (HopProcessor.IV_LENGTH + 4 + 1);
@@ -360,10 +363,10 @@ public class FragmentHandler {
         FragmentedMessage msg = null;
         if (fragmented) {
             synchronized (_fragmentedMessages) {
-                msg = _fragmentedMessages.get(new Long(messageId));
+                msg = _fragmentedMessages.get(Long.valueOf(messageId));
                 if (msg == null) {
                     msg = new FragmentedMessage(_context);
-                    _fragmentedMessages.put(new Long(messageId), msg);
+                    _fragmentedMessages.put(Long.valueOf(messageId), msg);
                 }
             }
         } else {
@@ -377,7 +380,7 @@ public class FragmentHandler {
                 if (!ok) return -1;
                 if (msg.isComplete()) {
                     synchronized (_fragmentedMessages) {
-                        _fragmentedMessages.remove(new Long(messageId));
+                        _fragmentedMessages.remove(Long.valueOf(messageId));
                     }
                     if (msg.getExpireEvent() != null)
                         SimpleTimer.getInstance().removeEvent(msg.getExpireEvent());
@@ -432,10 +435,10 @@ public class FragmentHandler {
         
         FragmentedMessage msg = null;
         synchronized (_fragmentedMessages) {
-            msg = _fragmentedMessages.get(new Long(messageId));
+            msg = _fragmentedMessages.get(Long.valueOf(messageId));
             if (msg == null) {
                 msg = new FragmentedMessage(_context);
-                _fragmentedMessages.put(new Long(messageId), msg);
+                _fragmentedMessages.put(Long.valueOf(messageId), msg);
             }
         }
         
@@ -446,7 +449,7 @@ public class FragmentHandler {
             
             if (msg.isComplete()) {
                 synchronized (_fragmentedMessages) {
-                    _fragmentedMessages.remove(new Long(messageId));
+                    _fragmentedMessages.remove(Long.valueOf(messageId));
                 }
                 if (msg.getExpireEvent() != null)
                     SimpleTimer.getInstance().removeEvent(msg.getExpireEvent());
@@ -529,7 +532,7 @@ public class FragmentHandler {
         public void timeReached() {
             boolean removed = false;
             synchronized (_fragmentedMessages) {
-                removed = (null != _fragmentedMessages.remove(new Long(_msg.getMessageId())));
+                removed = (null != _fragmentedMessages.remove(Long.valueOf(_msg.getMessageId())));
             }
             synchronized (_msg) {
                 if (removed && !_msg.getReleased()) {
diff --git a/router/java/src/net/i2p/router/tunnel/HopConfig.java b/router/java/src/net/i2p/router/tunnel/HopConfig.java
index 532bdfe20c5157f28d16dcca4c9c47a871363862..3ac96bf280c78a2a45bea08e22a770cd81620f9c 100644
--- a/router/java/src/net/i2p/router/tunnel/HopConfig.java
+++ b/router/java/src/net/i2p/router/tunnel/HopConfig.java
@@ -73,7 +73,7 @@ public class HopConfig {
     }
     public void setSendTunnelId(byte id[]) { _sendTunnelId = id; }
     
-    private TunnelId getTunnel(byte id[]) {
+    private static TunnelId getTunnel(byte id[]) {
         if (id == null)
             return null;
         else
diff --git a/router/java/src/net/i2p/router/tunnel/HopProcessor.java b/router/java/src/net/i2p/router/tunnel/HopProcessor.java
index 205339d7f4076f1556aaf30178a9d91dfc3bd991..eac1f71dae8230111519d3c7110932a792acf481 100644
--- a/router/java/src/net/i2p/router/tunnel/HopProcessor.java
+++ b/router/java/src/net/i2p/router/tunnel/HopProcessor.java
@@ -77,7 +77,7 @@ public class HopProcessor {
         boolean okIV = _validator.receiveIV(orig, offset, orig, offset + IV_LENGTH);
         if (!okIV) {
             if (_log.shouldLog(Log.WARN)) 
-                _log.warn("Invalid IV received on tunnel " + _config.getReceiveTunnelId());
+                _log.warn("Invalid IV received on tunnel " + _config.getReceiveTunnel());
             return false;
         }
         
diff --git a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java
index fcdb77ea9ea47868f0e23f65d9f4aec9ec68e171..82fdc47c60ef2bbd56c881a1d427deaa209e7495 100644
--- a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java
+++ b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java
@@ -1,8 +1,10 @@
 package net.i2p.router.tunnel;
 
+import net.i2p.data.DatabaseEntry;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.Payload;
+import net.i2p.data.RouterInfo;
 import net.i2p.data.TunnelId;
 import net.i2p.data.i2np.DataMessage;
 import net.i2p.data.i2np.DatabaseSearchReplyMessage;
@@ -71,7 +73,7 @@ public class InboundMessageDistributor implements GarlicMessageReceiver.CloveRec
             msg = newMsg;
         } else if ( (_client != null) && 
              (msg.getType() == DatabaseStoreMessage.MESSAGE_TYPE) &&
-             (((DatabaseStoreMessage)msg).getValueType() == DatabaseStoreMessage.KEY_TYPE_ROUTERINFO)) {
+             (((DatabaseStoreMessage)msg).getEntry().getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO)) {
             // FVSJ may result in an unsolicited RI store if the peer went non-ff.
             // Maybe we can figure out a way to handle this safely, so we don't ask him again.
             // For now, just hope we eventually find out through other means.
@@ -165,7 +167,7 @@ public class InboundMessageDistributor implements GarlicMessageReceiver.CloveRec
                         // unnecessarily
                         DatabaseStoreMessage dsm = (DatabaseStoreMessage)data;
                         try {
-                            if (dsm.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) {
+                            if (dsm.getEntry().getType() == DatabaseEntry.KEY_TYPE_LEASESET) {
                                 // If it was stored to us before, don't undo the
                                 // receivedAsPublished flag so we will continue to respond to requests
                                 // for the leaseset. That is, we don't want this to change the
@@ -173,10 +175,11 @@ public class InboundMessageDistributor implements GarlicMessageReceiver.CloveRec
                                 // When the keyspace rotates at midnight, and this leaseset moves out
                                 // of our keyspace, maybe we shouldn't do this?
                                 // Should we do this whether ff or not?
-                                LeaseSet old = _context.netDb().store(dsm.getKey(), dsm.getLeaseSet());
+                                LeaseSet ls = (LeaseSet) dsm.getEntry();
+                                LeaseSet old = _context.netDb().store(dsm.getKey(), ls);
                                 if (old != null && old.getReceivedAsPublished()
                                     /** && ((FloodfillNetworkDatabaseFacade)_context.netDb()).floodfillEnabled() **/ )
-                                    dsm.getLeaseSet().setReceivedAsPublished(true);
+                                    ls.setReceivedAsPublished(true);
                                 if (_log.shouldLog(Log.INFO))
                                     _log.info("Storing LS for: " + dsm.getKey() + " sent to: " + _client);
                             } else {                                        
@@ -189,7 +192,7 @@ public class InboundMessageDistributor implements GarlicMessageReceiver.CloveRec
                                     _log.error("Dropped dangerous message down a tunnel for " + _client.toBase64() + ": " + dsm, new Exception("cause"));
                                     return;
                                 }
-                                _context.netDb().store(dsm.getKey(), dsm.getRouterInfo());
+                                _context.netDb().store(dsm.getKey(), (RouterInfo) dsm.getEntry());
                             }
                         } catch (IllegalArgumentException iae) {
                             if (_log.shouldLog(Log.WARN))
diff --git a/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java b/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java
index c9b28b85629fe8a448115d21b7da411deba14b95..ae120c18f83a79cd58aef434a2a3be452377b7d4 100644
--- a/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java
+++ b/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java
@@ -52,92 +52,11 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor {
      * NOTE: Unused here, see BatchedPreprocessor override, super is not called.
      */
     public boolean preprocessQueue(List<TunnelGateway.Pending> pending, TunnelGateway.Sender sender, TunnelGateway.Receiver rec) {
-        if (true) throw new IllegalArgumentException("unused, right?");
-        long begin = System.currentTimeMillis();
-        StringBuilder buf = null;
-        if (_log.shouldLog(Log.DEBUG)) {
-            buf = new StringBuilder(256);
-            buf.append("Trivial preprocessing of ").append(pending.size()).append(" ");
-        }
-        while (!pending.isEmpty()) {
-            TunnelGateway.Pending msg = pending.remove(0);
-            long beforePreproc = System.currentTimeMillis();
-            byte preprocessed[][] = preprocess(msg);
-            long afterPreproc = System.currentTimeMillis();
-            if (buf != null)
-                buf.append("preprocessed into " + preprocessed.length + " fragments after " + (afterPreproc-beforePreproc) + ". ");
-            for (int i = 0; i < preprocessed.length; i++) {
-                if (_log.shouldLog(Log.DEBUG))
-                    _log.debug("Preprocessed: fragment " + i + "/" + (preprocessed.length-1) + " in " 
-                               + msg.getMessageId() + ": "
-                               + " send through " + sender + " receive with " + rec);
-                               //Base64.encode(preprocessed[i]));
-                long beforeSend = System.currentTimeMillis();
-                long id = sender.sendPreprocessed(preprocessed[i], rec);
-                long afterSend = System.currentTimeMillis();
-                if (buf != null)
-                    buf.append("send of " + msg.getMessageId() + " took " + (afterSend-beforeSend) + ". ");
-                msg.addMessageId(id);
-            }
-            notePreprocessing(msg.getMessageId(), msg.getFragmentNumber(), preprocessed.length, msg.getMessageIds(), null);
-            if (preprocessed.length != msg.getFragmentNumber() + 1) {
-                throw new RuntimeException("wtf, preprocessed " + msg.getMessageId() + " into " 
-                                           + msg.getFragmentNumber() + "/" + preprocessed.length + " fragments, size = "
-                                           + msg.getData().length);
-            }
-            if (buf != null)
-                buf.append("all fragments sent after " + (System.currentTimeMillis()-afterPreproc) + ". ");
-        }
-        if (buf != null) {
-            buf.append("queue preprocessed after " + (System.currentTimeMillis()-begin) + ".");
-            _log.debug(buf.toString());
-        }
-        return false;
+        throw new IllegalArgumentException("unused, right?");
     }
     
     protected void notePreprocessing(long messageId, int numFragments, int totalLength, List<Long> messageIds, String msg) {}
     
-    /*
-     * @deprecated unused except by above
-     */
-    private byte[][] preprocess(TunnelGateway.Pending msg) {
-        List<byte[]> fragments = new ArrayList(1);
-
-        while (msg.getOffset() < msg.getData().length) {
-            fragments.add(preprocessFragment(msg));
-            //if (_log.shouldLog(Log.DEBUG))
-            //    _log.debug("\n\nafter preprocessing fragment\n\n");
-        }
-
-        byte rv[][] = new byte[fragments.size()][];
-        for (int i = 0; i < fragments.size(); i++)
-            rv[i] = fragments.get(i);
-        return rv;
-    }
-    
-    /**
-     * Preprocess the next available fragment off the given one in phases:
-     * First, write it out as { instructions + payload + random IV }, calculate the 
-     * SHA256 of that, then move the instructions + payload to the end 
-     * of the target, setting IV as the beginning.  Then add the necessary random pad
-     * bytes after the IV, followed by the first 4 bytes of that SHA256, lining up
-     * exactly to meet the beginning of the instructions. (i hope)
-     *
-     * @deprecated unused except by above
-     */
-    private byte[] preprocessFragment(TunnelGateway.Pending msg) {
-        byte target[] = _dataCache.acquire().getData();
-
-        int offset = 0;
-        if (msg.getOffset() <= 0)
-            offset = writeFirstFragment(msg, target, offset);
-        else
-            offset = writeSubsequentFragment(msg, target, offset);
-        
-        preprocess(target, offset);
-        return target;
-    }
-    
     /**
      * Wrap the preprocessed fragments with the necessary padding / checksums 
      * to act as a tunnel message.
@@ -189,16 +108,9 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor {
 
         //_log.debug("# pad bytes:  " + numPadBytes + " payloadLength: " + payloadLength + " instructions: " + instructionsLength);
 
-        int paddingRemaining = numPadBytes;
-        // FIXME inefficient, waste of 3/4 of the entropy
-        // Should get a byte array of random, change all the zeros to something else, and ArrayCopy
-        while (paddingRemaining > 0) {
-            byte b = (byte)(_context.random().nextInt() & 0xFF);
-            if (b != 0x00) {
-                fragments[offset] = b;
-                offset++;
-                paddingRemaining--;
-            }
+        if (numPadBytes > 0) {
+            fillRandomNonZero(fragments, offset, numPadBytes);
+            offset += numPadBytes;
         }
        
         fragments[offset] = 0x0; // no more padding
@@ -207,6 +119,28 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor {
             _log.debug("Preprocessing beginning of the fragment instructions at " + offset);
     }
 
+    /**
+     *  Efficiently fill with nonzero random data
+     *  Don't waste too much entropy or call random() too often.
+     *  @since 0.8.5
+     */
+    private void fillRandomNonZero(byte[] b, int off, int len) {
+        // get about as much as we think we will need, overestimate some
+        final int est = len + (len / 128) + 3;
+        final byte[] tmp = new byte[est];
+        _context.random().nextBytes(tmp);
+        int extra = len;
+        for (int i = 0; i < len; i++) {
+            while (tmp[i] == 0) {
+                if (extra < est)
+                    tmp[i] = tmp[extra++];  // use from the extra we have at the end
+                else
+                    tmp[i] = (byte)(_context.random().nextInt() & 0xFF);  // waste 3/4 of the entropy
+            }
+        }
+        System.arraycopy(tmp, 0, b, off, len);
+    }
+
     /** is this a follw up byte? */
     private static final byte MASK_IS_SUBSEQUENT = FragmentHandler.MASK_IS_SUBSEQUENT;
     /** how should this be delivered?  shift this 5 the right and get TYPE_* */
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java
index 99b612dd271770bb6a668a3f1ce45888ece70395..497e8ddcdfc1234e9c584c59a87ccc23dc750c6d 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java
@@ -18,17 +18,17 @@ import net.i2p.router.TunnelInfo;
  *
  */
 public class TunnelCreatorConfig implements TunnelInfo {
-    protected RouterContext _context;
+    protected final RouterContext _context;
     /** only necessary for client tunnels */
-    private Hash _destination;
+    private final Hash _destination;
     /** gateway first */
-    private HopConfig _config[];
+    private final HopConfig _config[];
     /** gateway first */
-    private Hash _peers[];
+    private final Hash _peers[];
     private long _expiration;
     private List<Integer> _order;
     private long _replyMessageId;
-    private boolean _isInbound;
+    private final boolean _isInbound;
     private long _messagesProcessed;
     private volatile long _verifiedBytesTransferred;
     private boolean _failed;
@@ -48,10 +48,6 @@ public class TunnelCreatorConfig implements TunnelInfo {
         }
         _isInbound = isInbound;
         _destination = destination;
-        _messagesProcessed = 0;
-        _verifiedBytesTransferred = 0;
-        _failed = false;
-        _failures = 0;
     }
     
     /**
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java
index c8424d8533807a09c6af276e6500b33c64280e62..8669f8cb53c532a1d8ca1e2d86f8c70826b8b4a5 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java
@@ -623,7 +623,7 @@ public class TunnelDispatcher implements Service {
         // drop in proportion to size w.r.t. a standard 1024-byte message
         // this is a little expensive but we want to adjust the curve between 0 and 1
         // Most messages are 1024, only at the OBEP do we see other sizes
-        if (len != 1024d)
+        if ((int)len != 1024)
             pctDrop = (float) Math.pow(pctDrop, 1024d / len);
         float rand = _context.random().nextFloat();
         boolean reject = rand <= pctDrop;
@@ -709,7 +709,8 @@ public class TunnelDispatcher implements Service {
         _validator = new BloomFilterIVValidator(_context, getShareBandwidth(_context));
     }
 
-    private static int getShareBandwidth(RouterContext ctx) {
+    /** @return in KBps */
+    public static int getShareBandwidth(RouterContext ctx) {
         int irateKBps = ctx.bandwidthLimiter().getInboundKBytesPerSecond();
         int orateKBps = ctx.bandwidthLimiter().getOutboundKBytesPerSecond();
         double pct = ctx.router().getSharePercentage();
@@ -743,7 +744,7 @@ public class TunnelDispatcher implements Service {
         
         private static final int LEAVE_BATCH_TIME = 10*1000;
         public void add(HopConfig cfg) {
-            Long dropTime = new Long(cfg.getExpiration() + 2*Router.CLOCK_FUDGE_FACTOR + LEAVE_BATCH_TIME);
+            Long dropTime = Long.valueOf(cfg.getExpiration() + 2*Router.CLOCK_FUDGE_FACTOR + LEAVE_BATCH_TIME);
             boolean noTunnels;
             synchronized (LeaveTunnel.this) {
                 noTunnels = _configs.isEmpty();
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelGateway.java b/router/java/src/net/i2p/router/tunnel/TunnelGateway.java
index 3ec567098a91de813dde6e564b73eab7e797564b..a7673f1b6df20276498193271de64252a3b193c8 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelGateway.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelGateway.java
@@ -229,7 +229,7 @@ public class TunnelGateway {
             synchronized (Pending.this) {
                 if (_messageIds == null)
                     _messageIds = new ArrayList();
-                _messageIds.add(new Long(id));
+                _messageIds.add(Long.valueOf(id));
             }
         }
         /**
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java b/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java
index 7f29f5743d09b94aaf127dcba64c73bd030393f4..38c72dfaf842bdb37f583ff1b302912ab1ddb44f 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java
@@ -26,6 +26,8 @@ public class TunnelGatewayPumper implements Runnable {
         _wantsPumping = new LinkedBlockingQueue();
         _stop = false;
         long maxMemory = Runtime.getRuntime().maxMemory();
+        if (maxMemory == Long.MAX_VALUE)
+            maxMemory = 96*1024*1024l;
         _pumpers = (int) Math.max(MIN_PUMPERS, Math.min(MAX_PUMPERS, 1 + (maxMemory / (32*1024*1024))));
         for (int i = 0; i < _pumpers; i++)
             new I2PThread(this, "Tunnel GW pumper " + (i+1) + '/' + _pumpers, true).start();
diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
index 8b08b6ec8cf5ed3d4e296e42bc609d243f7950fb..62e47bfe552c2d8ebcccd433718a4968aab2ce7c 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
@@ -27,9 +27,9 @@ import net.i2p.util.Log;
  */
 class BuildExecutor implements Runnable {
     private final ArrayList<Long> _recentBuildIds = new ArrayList(100);
-    private RouterContext _context;
-    private Log _log;
-    private TunnelPoolManager _manager;
+    private final RouterContext _context;
+    private final Log _log;
+    private final TunnelPoolManager _manager;
     /** list of TunnelCreatorConfig elements of tunnels currently being built */
     private final Object _currentlyBuilding;
     /** indexed by ptcc.getReplyMessageId() */
@@ -37,7 +37,7 @@ class BuildExecutor implements Runnable {
     /** indexed by ptcc.getReplyMessageId() */
     private final ConcurrentHashMap<Long, PooledTunnelCreatorConfig> _recentlyBuildingMap;
     private boolean _isRunning;
-    private BuildHandler _handler;
+    private final BuildHandler _handler;
     private boolean _repoll;
     private static final int MAX_CONCURRENT_BUILDS = 10;
     /** accept replies up to a minute after we gave up on them */
@@ -248,8 +248,6 @@ class BuildExecutor implements Runnable {
         int pendingRemaining = 0;
         
         //long loopBegin = 0;
-        //long beforeHandleInboundReplies = 0;
-        //long afterHandleInboundReplies = 0;
         //long afterBuildZeroHop = 0;
         long afterBuildReal = 0;
         long afterHandleInbound = 0;
@@ -268,10 +266,6 @@ class BuildExecutor implements Runnable {
                         wanted.add(pool);
                 }
 
-                //beforeHandleInboundReplies = System.currentTimeMillis();
-                _handler.handleInboundReplies();
-                //afterHandleInboundReplies = System.currentTimeMillis();
-                
                 // allowed() also expires timed out requests (for new style requests)
                 int allowed = allowed();
                 
@@ -294,7 +288,9 @@ class BuildExecutor implements Runnable {
                         if (!_repoll) {
                             if (_log.shouldLog(Log.DEBUG))
                                 _log.debug("No tunnel to build with (allowed=" + allowed + ", wanted=" + wanted.size() + ", pending=" + pendingRemaining + "), wait for a while");
-                            _currentlyBuilding.wait(1*1000+_context.random().nextInt(1*1000));
+                            try {
+                                _currentlyBuilding.wait(1*1000+_context.random().nextInt(1*1000));
+                            } catch (InterruptedException ie) {}
                         }
                     }
                 } else {
@@ -325,9 +321,6 @@ class BuildExecutor implements Runnable {
                                     _log.debug("Configuring new tunnel " + i + " for " + pool + ": " + cfg);
                                 buildTunnel(pool, cfg);
                                 realBuilt++;
-                                
-                                // we want replies to go to the top of the queue
-                                _handler.handleInboundReplies();
                             } else {
                                 i--;
                             }
@@ -369,7 +362,7 @@ class BuildExecutor implements Runnable {
                 
                 wanted.clear();
                 pools.clear();
-            } catch (Exception e) {
+            } catch (RuntimeException e) {
                 if (_log.shouldLog(Log.CRIT))
                     _log.log(Log.CRIT, "B0rked in the tunnel builder", e);
             }
@@ -389,10 +382,8 @@ class BuildExecutor implements Runnable {
      *  This prevents a large number of client pools from starving the exploratory pool.
      *
      */
-    private static class TunnelPoolComparator implements Comparator {
-        public int compare(Object l, Object r) {
-            TunnelPool tpl = (TunnelPool) l;
-            TunnelPool tpr = (TunnelPool) r;
+    private static class TunnelPoolComparator implements Comparator<TunnelPool> {
+        public int compare(TunnelPool tpl, TunnelPool tpr) {
             if (tpl.getSettings().isExploratory() && !tpr.getSettings().isExploratory())
                 return -1;
             if (tpr.getSettings().isExploratory() && !tpl.getSettings().isExploratory())
@@ -459,11 +450,15 @@ class BuildExecutor implements Runnable {
                     for (int i = 0; i < 32; i++)
                         _recentBuildIds.remove(0);
                 }
-                _recentBuildIds.add(new Long(id));
+                _recentBuildIds.add(Long.valueOf(id));
             }
         }
     }
     
+    /**
+     *  This wakes up the executor, so call this after TunnelPool.addTunnel()
+     *  so we don't build too many.
+     */
     public void buildComplete(PooledTunnelCreatorConfig cfg, TunnelPool pool) {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Build complete for " + cfg);
@@ -483,7 +478,7 @@ class BuildExecutor implements Runnable {
     
     public boolean wasRecentlyBuilding(long replyId) {
         synchronized (_recentBuildIds) {
-            return _recentBuildIds.contains(new Long(replyId));
+            return _recentBuildIds.contains(Long.valueOf(replyId));
         }
     }
     
diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
index 7be46e0c73e555fe707c23c3178b775eb9b34e08..ad6805002c12e8d9630a662c5402aeba36b944fd 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
@@ -1,7 +1,7 @@
 package net.i2p.router.tunnel.pool;
 
-import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.LinkedBlockingQueue;
 
 import net.i2p.data.Base64;
 import net.i2p.data.ByteArray;
@@ -27,43 +27,42 @@ import net.i2p.router.peermanager.TunnelHistory;
 import net.i2p.router.tunnel.BuildMessageProcessor;
 import net.i2p.router.tunnel.BuildReplyHandler;
 import net.i2p.router.tunnel.HopConfig;
+import net.i2p.router.tunnel.TunnelDispatcher;
 import net.i2p.stat.Rate;
 import net.i2p.stat.RateStat;
 import net.i2p.util.Log;
 
 /**
+ * Handle the received tunnel build message requests and replies,
+ * including sending responsses to requests, updating the
+ * lists of our tunnels and participating tunnels,
+ * and updating stats.
  *
- * Note that 10 minute tunnel expiration is hardcoded in here.
+ * Replies are handled immediately on reception; requests are queued.
  *
+ * Note that 10 minute tunnel expiration is hardcoded in here.
  */
 class BuildHandler {
-    private RouterContext _context;
-    private Log _log;
-    private BuildExecutor _exec;
-    private Job _buildMessageHandlerJob;
-    private Job _buildReplyMessageHandlerJob;
-    /** list of BuildMessageState, oldest first */
-    private final List<BuildMessageState> _inboundBuildMessages;
-    /** list of BuildReplyMessageState, oldest first - unused unless HANDLE_REPLIES_INLINE == false */
-    private final List<BuildReplyMessageState> _inboundBuildReplyMessages;
-    /** list of BuildEndMessageState, oldest first - unused unless HANDLE_REPLIES_INLINE == false */
-    private final List<BuildEndMessageState> _inboundBuildEndMessages;
-    private BuildMessageProcessor _processor;
-
-    private static final boolean HANDLE_REPLIES_INLINE = true;
-    
+    private final RouterContext _context;
+    private final Log _log;
+    private final BuildExecutor _exec;
+    private final Job _buildMessageHandlerJob;
+    private final Job _buildReplyMessageHandlerJob;
+    private final LinkedBlockingQueue<BuildMessageState> _inboundBuildMessages;
+    private final BuildMessageProcessor _processor;
+    private final ParticipatingThrottler _throttler;
+
+    /** TODO these may be too high, review and adjust */
+    private static final int MIN_QUEUE = 12;
+    private static final int MAX_QUEUE = 96;
+
     public BuildHandler(RouterContext ctx, BuildExecutor exec) {
         _context = ctx;
         _log = ctx.logManager().getLog(getClass());
         _exec = exec;
-        _inboundBuildMessages = new ArrayList(16);
-        if (HANDLE_REPLIES_INLINE) {
-            _inboundBuildEndMessages = null;
-            _inboundBuildReplyMessages = null;
-        } else {
-            _inboundBuildEndMessages = new ArrayList(16);
-            _inboundBuildReplyMessages = new ArrayList(16);
-        }
+        // Queue size = 12 * share BW / 48K
+        int sz = Math.min(MAX_QUEUE, Math.max(MIN_QUEUE, TunnelDispatcher.getShareBandwidth(ctx) * MIN_QUEUE / 48));
+        _inboundBuildMessages = new LinkedBlockingQueue(sz);
     
         _context.statManager().createRateStat("tunnel.reject.10", "How often we reject a tunnel probabalistically", "Tunnels", new long[] { 60*1000, 10*60*1000 });
         _context.statManager().createRateStat("tunnel.reject.20", "How often we reject a tunnel because of transient overload", "Tunnels", new long[] { 60*1000, 10*60*1000 });
@@ -93,6 +92,7 @@ class BuildHandler {
         _context.statManager().createRateStat("tunnel.corruptBuildReply", "", "Tunnels", new long[] { 24*60*60*1000l });
         
         _processor = new BuildMessageProcessor(ctx);
+        _throttler = new ParticipatingThrottler(ctx);
         _buildMessageHandlerJob = new TunnelBuildMessageHandlerJob(ctx);
         _buildReplyMessageHandlerJob = new TunnelBuildReplyMessageHandlerJob(ctx);
         TunnelBuildMessageHandlerJobBuilder tbmhjb = new TunnelBuildMessageHandlerJobBuilder();
@@ -108,122 +108,37 @@ class BuildHandler {
     
     /**
      * Blocking call to handle a few of the pending inbound requests, returning how many
-     * requests remain after this pass
+     * requests remain after this pass. This is called by BuildExecutor.
      */
     int handleInboundRequests() {
-        int dropExpired = 0;
-        int remaining = 0;
-        List handled = null;
-        long beforeFindHandled = System.currentTimeMillis();
-        synchronized (_inboundBuildMessages) {
-            int toHandle = _inboundBuildMessages.size();
-            if (toHandle > 0) {
-                if (toHandle > MAX_HANDLE_AT_ONCE)
-                    toHandle = MAX_HANDLE_AT_ONCE;
-                handled = new ArrayList(toHandle);
-                //if (false) {
-                //    for (int i = 0; i < toHandle; i++) // LIFO for lower response time (should we RED it for DoS?)
-                //        handled.add(_inboundBuildMessages.remove(_inboundBuildMessages.size()-1));
-                //} else {
-                    // drop any expired messages
-                    long dropBefore = System.currentTimeMillis() - (BuildRequestor.REQUEST_TIMEOUT/4);
-                    do {
-                        BuildMessageState state = (BuildMessageState)_inboundBuildMessages.get(0);
-                        if (state.recvTime <= dropBefore) {
-                            _inboundBuildMessages.remove(0);
-                            dropExpired++;
-                            if (_log.shouldLog(Log.WARN))
-                                _log.warn("Not even trying to handle/decrypt the request " + state.msg.getUniqueId() 
-                                           + ", since we received it a long time ago: " + (System.currentTimeMillis() - state.recvTime));
-                            _context.statManager().addRateData("tunnel.dropLoadDelay", System.currentTimeMillis() - state.recvTime, 0);
-                        } else {
-                            break;
-                        }
-                    } while (!_inboundBuildMessages.isEmpty());
-                    
-                    if (dropExpired > 0)
-                        _context.throttle().setTunnelStatus(_x("Dropping tunnel requests: Too slow"));
-
-                    // now pull off the oldest requests first (we're doing a tail-drop
-                    // when adding)
-                    for (int i = 0; i < toHandle && !_inboundBuildMessages.isEmpty(); i++)
-                        handled.add(_inboundBuildMessages.remove(0));
-                //}
-            }
-            remaining = _inboundBuildMessages.size();
-        }
-        if (handled != null) {
-            if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Handling " + handled.size() + " requests (took " + (System.currentTimeMillis()-beforeFindHandled) + "ms to find them)");
-            
-            for (int i = 0; i < handled.size(); i++) {
-                BuildMessageState state = (BuildMessageState)handled.get(i);
-                long beforeHandle = System.currentTimeMillis();
-                long actualTime = handleRequest(state);
-                if (_log.shouldLog(Log.DEBUG))
-                    _log.debug("Handle took " + (System.currentTimeMillis()-beforeHandle) + "/" + actualTime + " (" + i + " out of " + handled.size() + " with " + remaining + " remaining)");
-            }
-            handled.clear();
-        }
-        if (!HANDLE_REPLIES_INLINE) {
-            synchronized (_inboundBuildEndMessages) {
-                int toHandle = _inboundBuildEndMessages.size();
-                if (toHandle > 0) {
-                    if (handled == null)
-                        handled = new ArrayList(_inboundBuildEndMessages);
-                    else
-                        handled.addAll(_inboundBuildEndMessages);
-                    _inboundBuildEndMessages.clear();
-                }
-            }
-        }
-        if (handled != null) {
+        for (int i = 0; i < MAX_HANDLE_AT_ONCE; ) {
+            BuildMessageState state = _inboundBuildMessages.poll();
+            if (state == null)
+                return 0;
+            long dropBefore = System.currentTimeMillis() - (BuildRequestor.REQUEST_TIMEOUT/4);
+            if (state.recvTime <= dropBefore) {
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn("Not even trying to handle/decrypt the request " + state.msg.getUniqueId() 
+                              + ", since we received it a long time ago: " + (System.currentTimeMillis() - state.recvTime));
+                _context.statManager().addRateData("tunnel.dropLoadDelay", System.currentTimeMillis() - state.recvTime, 0);
+                _context.throttle().setTunnelStatus(_x("Dropping tunnel requests: Too slow"));
+                continue;
+            }       
+
+            i++;
+            long beforeHandle = System.currentTimeMillis();
+            long actualTime = handleRequest(state);
             if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Handling " + handled.size() + " requests that are actually replies");
-            // these are inbound build messages that actually contain the full replies, since
-            // they are for inbound tunnels we have created
-            for (int i = 0; i < handled.size(); i++) {
-                BuildEndMessageState state = (BuildEndMessageState)handled.get(i);
-                handleRequestAsInboundEndpoint(state);
-            }
-        }
-        
-        // anything else?
-        /*
-        synchronized (_inboundBuildMessages) {
-            int remaining = _inboundBuildMessages.size();
-            return remaining;
+                _log.debug("Handle took " + (System.currentTimeMillis()-beforeHandle) + "/" + actualTime +
+                           " (" + i + " with " + _inboundBuildMessages.size() + " remaining)");
         }
-         */
+
+        int remaining = _inboundBuildMessages.size();
         if (remaining > 0)
             _context.statManager().addRateData("tunnel.handleRemaining", remaining, 0);
         return remaining;
     }
     
-    /** Warning - noop if HANDLE_REPLIES_INLINE == true */
-    void handleInboundReplies() {
-        if (HANDLE_REPLIES_INLINE)
-            return;
-        List handled = null;
-        synchronized (_inboundBuildReplyMessages) {
-            int toHandle = _inboundBuildReplyMessages.size();
-            if (toHandle > 0) {
-                // always handle all of them - they're replies that we were waiting for!
-                handled = new ArrayList(_inboundBuildReplyMessages);
-                _inboundBuildReplyMessages.clear();
-            }
-        }
-        if (handled != null) {
-            if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Handling " + handled.size() + " replies");
-            
-            for (int i = 0; i < handled.size(); i++) {
-                BuildReplyMessageState state = (BuildReplyMessageState)handled.get(i);
-                handleReply(state);
-            }
-        }
-    }
-    
     private void handleReply(BuildReplyMessageState state) {
         // search through the tunnels for a reply
         long replyMessageId = state.msg.getUniqueId();
@@ -308,7 +223,7 @@ class BuildHandler {
                     _context.messageHistory().tunnelParticipantRejected(peer, "peer rejected after " + rtt + " with " + howBad + ": " + cfg.toString());
                 }
             }
-            _exec.buildComplete(cfg, cfg.getTunnelPool());
+
             if (allAgree) {
                 // wikked, completely build
                 if (cfg.isInbound())
@@ -316,6 +231,8 @@ class BuildHandler {
                 else
                     _context.tunnelDispatcher().joinOutbound(cfg);
                 cfg.getTunnelPool().addTunnel(cfg); // self.self.self.foo!
+                // call buildComplete() after addTunnel() so we don't try another build.
+                _exec.buildComplete(cfg, cfg.getTunnelPool());
                 _exec.buildSuccessful(cfg);
                 
                 ExpireJob expireJob = new ExpireJob(_context, cfg, cfg.getTunnelPool());
@@ -327,6 +244,7 @@ class BuildHandler {
                     _context.statManager().addRateData("tunnel.buildClientSuccess", rtt, rtt);
             } else {
                 // someone is no fun
+                _exec.buildComplete(cfg, cfg.getTunnelPool());
                 if (cfg.getDestination() == null)
                     _context.statManager().addRateData("tunnel.buildExploratoryReject", rtt, rtt);
                 else
@@ -341,7 +259,7 @@ class BuildHandler {
         }
     }
     
-    /** @return handle time or -1 */
+    /** @return handle time or -1 if it wasn't completely handled */
     private long handleRequest(BuildMessageState state) {
         long timeSinceReceived = System.currentTimeMillis()-state.recvTime;
         if (_log.shouldLog(Log.DEBUG))
@@ -363,7 +281,7 @@ class BuildHandler {
         BuildRequestRecord req = _processor.decrypt(_context, state.msg, _context.routerHash(), _context.keyManager().getPrivateKey());
         long decryptTime = System.currentTimeMillis() - beforeDecrypt;
         _context.statManager().addRateData("tunnel.decryptRequestTime", decryptTime, decryptTime);
-        if (decryptTime > 500)
+        if (decryptTime > 500 && _log.shouldLog(Log.WARN))
             _log.warn("Took too long to decrypt the request: " + decryptTime + " for message " + state.msg.getUniqueId() + " received " + (timeSinceReceived+decryptTime) + " ago");
         if (req == null) {
             // no records matched, or the decryption failed.  bah
@@ -377,7 +295,7 @@ class BuildHandler {
         long readPeerTime = System.currentTimeMillis()-beforeLookup;
         RouterInfo nextPeerInfo = _context.netDb().lookupRouterInfoLocally(nextPeer);
         long lookupTime = System.currentTimeMillis()-beforeLookup;
-        if (lookupTime > 500)
+        if (lookupTime > 500 && _log.shouldLog(Log.WARN))
             _log.warn("Took too long to lookup the request: " + lookupTime + "/" + readPeerTime + " for message " + state.msg.getUniqueId() + " received " + (timeSinceReceived+decryptTime) + " ago");
         if (nextPeerInfo == null) {
             if (_log.shouldLog(Log.DEBUG))
@@ -414,9 +332,9 @@ class BuildHandler {
     }
     
     private class HandleReq extends JobImpl {
-        private BuildMessageState _state;
-        private BuildRequestRecord _req;
-        private Hash _nextPeer;
+        private final BuildMessageState _state;
+        private final BuildRequestRecord _req;
+        private final Hash _nextPeer;
         HandleReq(RouterContext ctx, BuildMessageState state, BuildRequestRecord req, Hash nextPeer) {
             super(ctx);
             _state = state;
@@ -437,9 +355,9 @@ class BuildHandler {
     }
 
     private static class TimeoutReq extends JobImpl {
-        private BuildMessageState _state;
-        private BuildRequestRecord _req;
-        private Hash _nextPeer;
+        private final BuildMessageState _state;
+        private final BuildRequestRecord _req;
+        private final Hash _nextPeer;
         TimeoutReq(RouterContext ctx, BuildMessageState state, BuildRequestRecord req, Hash nextPeer) {
             super(ctx);
             _state = state;
@@ -498,6 +416,36 @@ class BuildHandler {
         long nextId = req.readNextTunnelId();
         boolean isInGW = req.readIsInboundGateway();
         boolean isOutEnd = req.readIsOutboundEndpoint();
+
+        // Loop checks
+        if ((!isOutEnd) && _context.routerHash().equals(nextPeer)) {
+            // We are 2 hops in a row? Drop it without a reply.
+            // No way to recognize if we are every other hop, but see below
+            _log.error("Dropping build request, we the next hop");
+            return;
+        }
+        // previous test should be sufficient to keep it from getting here but maybe not?
+        if (!isInGW) {
+            Hash from = state.fromHash;
+            if (from == null)
+                from = state.from.calculateHash();
+            if (_context.routerHash().equals(from)) {
+                _log.error("Dropping build request, we are the previous hop");
+                return;
+            }
+        }
+        if ((!isOutEnd) && (!isInGW)) {
+            Hash from = state.fromHash;
+            if (from == null)
+                from = state.from.calculateHash();
+            // Previous and next hop the same? Don't help somebody be evil. Drop it without a reply.
+            // A-B-C-A is not preventable
+            if (nextPeer.equals(from)) {
+                _log.error("Dropping build request with the same previous and next hop");
+                return;
+            }
+        }
+
         // time is in hours, and only for log below - what's the point?
         // tunnel-alt-creation.html specifies that this is enforced +/- 1 hour but it is not.
         long time = req.readRequestTime();
@@ -531,7 +479,7 @@ class BuildHandler {
                 _context.statManager().addRateData("tunnel.acceptLoad", recvDelay, recvDelay);
             }
         }
-        
+
         /*
          * Being a IBGW or OBEP generally leads to more connections, so if we are
          * approaching our connection limit (i.e. !haveCapacity()),
@@ -550,6 +498,28 @@ class BuildHandler {
                 _context.throttle().setTunnelStatus(_x("Rejecting tunnels: Connection limit"));
                 response = TunnelHistory.TUNNEL_REJECT_BANDWIDTH;
         }
+        
+        // Check participating throttle counters for previous and next hops
+        // This is at the end as it compares to a percentage of created tunnels.
+        // We may need another counter above for requests.
+        if (response == 0 && !isInGW) {
+            Hash from = state.fromHash;
+            if (from == null)
+                from = state.from.calculateHash();
+            if (from != null && _throttler.shouldThrottle(from)) {
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn("Rejecting tunnel (hop throttle), previous hop: " + from);
+                // no setTunnelStatus() indication
+                response = TunnelHistory.TUNNEL_REJECT_BANDWIDTH;
+            }
+        }
+        if (response == 0 && (!isOutEnd) &&
+            _throttler.shouldThrottle(nextPeer)) {
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("Rejecting tunnel (hop throttle), next hop: " + nextPeer);
+            // no setTunnelStatus() indication
+            response = TunnelHistory.TUNNEL_REJECT_BANDWIDTH;
+        }
 
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Responding to " + state.msg.getUniqueId() + "/" + ourId
@@ -581,7 +551,7 @@ class BuildHandler {
                 cfg.setSendTo(null);
                 cfg.setSendTunnelId(null);
             } else {
-                cfg.setSendTo(req.readNextIdentity());
+                cfg.setSendTo(nextPeer);
                 cfg.setSendTunnelId(DataHelper.toLong(4, nextId));
             }
 
@@ -597,7 +567,7 @@ class BuildHandler {
                 _context.tunnelDispatcher().joinParticipant(cfg);
         } else {
             _context.statManager().addRateData("tunnel.reject." + response, 1, 1);
-            _context.messageHistory().tunnelRejected(state.fromHash, new TunnelId(ourId), req.readNextIdentity(), 
+            _context.messageHistory().tunnelRejected(state.fromHash, new TunnelId(ourId), nextPeer, 
                                                      "rejecting for " + response + ": " +
                                                      state.msg.getUniqueId() + "/" + ourId + "/" + req.readNextTunnelId() + " delay " +
                                                      recvDelay + " as " +
@@ -687,9 +657,7 @@ class BuildHandler {
     }
     
     public int getInboundBuildQueueSize() {
-        synchronized (_inboundBuildMessages) {
             return _inboundBuildMessages.size();
-        }
     }
     
     /**
@@ -712,14 +680,7 @@ class BuildHandler {
                     _log.error("received it, but its not inbound? " + cfg);
                 }
                 BuildEndMessageState state = new BuildEndMessageState(cfg, receivedMessage);
-                if (HANDLE_REPLIES_INLINE) {
-                    handleRequestAsInboundEndpoint(state);
-                } else {
-                    synchronized (_inboundBuildEndMessages) {
-                        _inboundBuildEndMessages.add(state);
-                    }
-                    _exec.repoll();
-                }
+                handleRequestAsInboundEndpoint(state);
             } else {
                 if (_exec.wasRecentlyBuilding(reqId)) {
                     // we are the IBEP but we already gave up?
@@ -727,52 +688,53 @@ class BuildHandler {
                         _log.warn("Dropping the reply " + reqId + ", as we used to be building that");
                     _context.statManager().addRateData("tunnel.buildReplyTooSlow", 1, 0);
                 } else {
-                    synchronized (_inboundBuildMessages) {
-                        boolean removed = false;
-                        int dropped = 0;
-                        for (int i = 0; i < _inboundBuildMessages.size(); i++) {
-                            BuildMessageState cur = (BuildMessageState)_inboundBuildMessages.get(i);
-                            long age = System.currentTimeMillis() - cur.recvTime;
-                            if (age >= BuildRequestor.REQUEST_TIMEOUT/4) {
-                                _inboundBuildMessages.remove(i);
-                                i--;
-                                dropped++;
-                                _context.statManager().addRateData("tunnel.dropLoad", age, _inboundBuildMessages.size());
-                            }
-                        }
-                        if (dropped > 0) {
+                    int sz = _inboundBuildMessages.size();
+                    BuildMessageState cur = _inboundBuildMessages.peek();
+                    boolean accept = true;
+                    if (cur != null) {
+                        long age = System.currentTimeMillis() - cur.recvTime;
+                        if (age >= BuildRequestor.REQUEST_TIMEOUT/4) {
+                            _context.statManager().addRateData("tunnel.dropLoad", age, sz);
                             _context.throttle().setTunnelStatus(_x("Dropping tunnel requests: High load"));
                             // if the queue is backlogged, stop adding new messages
-                            _context.statManager().addRateData("tunnel.dropLoadBacklog", _inboundBuildMessages.size(), _inboundBuildMessages.size());
+                            _context.statManager().addRateData("tunnel.dropLoadBacklog", sz, sz);
+                            accept = false;
+                        }
+                    }
+                    if (accept) {
+                        int queueTime = estimateQueueTime(sz);
+                        float pDrop = queueTime/((float)BuildRequestor.REQUEST_TIMEOUT*3);
+                        pDrop = (float)Math.pow(pDrop, 16); // steeeep
+                        float f = _context.random().nextFloat();
+                        //if ( (pDrop > f) && (allowProactiveDrop()) ) {
+                        if (pDrop > f) {
+                            _context.throttle().setTunnelStatus(_x("Dropping tunnel requests: Queue time"));
+                            _context.statManager().addRateData("tunnel.dropLoadProactive", queueTime, sz);
                         } else {
-                            int queueTime = estimateQueueTime(_inboundBuildMessages.size());
-                            float pDrop = queueTime/((float)BuildRequestor.REQUEST_TIMEOUT*3);
-                            pDrop = (float)Math.pow(pDrop, 16); // steeeep
-                            float f = _context.random().nextFloat();
-                            if ( (pDrop > f) && (allowProactiveDrop()) ) {
-                                _context.throttle().setTunnelStatus(_x("Dropping tunnel requests: Queue time"));
-                                _context.statManager().addRateData("tunnel.dropLoadProactive", queueTime, _inboundBuildMessages.size());
+                            accept = _inboundBuildMessages.offer(new BuildMessageState(receivedMessage, from, fromHash));
+                            if (accept) {
+                                // wake up the Executor to call handleInboundRequests()
+                                _exec.repoll();
                             } else {
-                                _inboundBuildMessages.add(new BuildMessageState(receivedMessage, from, fromHash));
+                                _context.throttle().setTunnelStatus(_x("Dropping tunnel requests: High load"));
+                                _context.statManager().addRateData("tunnel.dropLoadBacklog", sz, sz);
                             }
                         }
                     }
-                    _exec.repoll();
                 }
             }
             return _buildMessageHandlerJob;
         }
     }
     
+/****
     private boolean allowProactiveDrop() {
-        String allow = _context.getProperty("router.allowProactiveDrop", "true");
-        boolean rv = false;
-        if ( (allow == null) || (Boolean.valueOf(allow).booleanValue()) )
-            rv = true;
+        boolean rv = _context.getBooleanPropertyDefaultTrue("router.allowProactiveDrop");
         if (!rv)
             _context.statManager().addRateData("tunnel.dropLoadProactiveAbort", 1, 0);
         return rv;
     }
+****/
     
     private int estimateQueueTime(int numPendingMessages) {
         int decryptTime = 200;
@@ -801,24 +763,17 @@ class BuildHandler {
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Receive tunnel build reply message " + receivedMessage.getUniqueId() + " from "
                            + (fromHash != null ? fromHash.toBase64() : from != null ? from.calculateHash().toBase64() : "a tunnel"));
-            if (HANDLE_REPLIES_INLINE) {
-                handleReply(new BuildReplyMessageState(receivedMessage));
-            } else {
-                synchronized (_inboundBuildReplyMessages) {
-                    _inboundBuildReplyMessages.add(new BuildReplyMessageState(receivedMessage));
-                }
-                _exec.repoll();
-            }
+            handleReply(new BuildReplyMessageState(receivedMessage));
             return _buildReplyMessageHandlerJob;
         }
     }
     
     /** normal inbound requests from other people */
     private static class BuildMessageState {
-        TunnelBuildMessage msg;
-        RouterIdentity from;
-        Hash fromHash;
-        long recvTime;
+        final TunnelBuildMessage msg;
+        final RouterIdentity from;
+        final Hash fromHash;
+        final long recvTime;
         public BuildMessageState(I2NPMessage m, RouterIdentity f, Hash h) {
             msg = (TunnelBuildMessage)m;
             from = f;
@@ -828,8 +783,8 @@ class BuildHandler {
     }
     /** replies for outbound tunnels that we have created */
     private static class BuildReplyMessageState {
-        TunnelBuildReplyMessage msg;
-        long recvTime;
+        final TunnelBuildReplyMessage msg;
+        final long recvTime;
         public BuildReplyMessageState(I2NPMessage m) {
             msg = (TunnelBuildReplyMessage)m;
             recvTime = System.currentTimeMillis();
@@ -837,9 +792,9 @@ class BuildHandler {
     }
     /** replies for inbound tunnels we have created */
     private static class BuildEndMessageState {
-        TunnelBuildMessage msg;
-        PooledTunnelCreatorConfig cfg;
-        long recvTime;
+        final TunnelBuildMessage msg;
+        final PooledTunnelCreatorConfig cfg;
+        final long recvTime;
         public BuildEndMessageState(PooledTunnelCreatorConfig c, I2NPMessage m) {
             cfg = c;
             msg = (TunnelBuildMessage)m;
@@ -847,13 +802,14 @@ class BuildHandler {
         }
     }
 
-    // noop
+    /** noop */
     private static class TunnelBuildMessageHandlerJob extends JobImpl {
         private TunnelBuildMessageHandlerJob(RouterContext ctx) { super(ctx); }
         public void runJob() {}
         public String getName() { return "Receive tunnel build message"; }
     }
-    // noop
+
+    /** noop */
     private static class TunnelBuildReplyMessageHandlerJob extends JobImpl {
         private TunnelBuildReplyMessageHandlerJob(RouterContext ctx) { super(ctx); }
         public void runJob() {}
@@ -866,7 +822,7 @@ class BuildHandler {
      *  but it affects capacity calculations
      */
     private static class TunnelBuildNextHopFailJob extends JobImpl {
-        HopConfig _cfg;
+        final HopConfig _cfg;
         private TunnelBuildNextHopFailJob(RouterContext ctx, HopConfig cfg) {
             super(ctx);
             _cfg = cfg;
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 7a79f927c658e35b5fd60551b8d9111276e5ed08..6d10994100abbc25f7b1a6c076ca02392b88ccf0 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java
@@ -22,12 +22,12 @@ import net.i2p.util.Log;
 import net.i2p.util.VersionComparator;
 
 /**
- *
+ *  Methods for creating Tunnel Build Messages, i.e. requests
  */
-class BuildRequestor {
-    private static final List<Integer> ORDER = new ArrayList(BuildMessageGenerator.ORDER.length);
+abstract class BuildRequestor {
+    private static final List<Integer> ORDER = new ArrayList(TunnelBuildMessage.MAX_RECORD_COUNT);
     static {
-        for (int i = 0; i < BuildMessageGenerator.ORDER.length; i++)
+        for (int i = 0; i < TunnelBuildMessage.MAX_RECORD_COUNT; i++)
             ORDER.add(Integer.valueOf(i));
     }
     private static final int PRIORITY = 500;
@@ -37,7 +37,7 @@ class BuildRequestor {
      *  expl. vs. client, uptime, and network conditions.
      *  Put the expiration in the PTCC.
      *
-     *  Also, perhaps, save the PTCC even after expiration for an extended time,
+     *  Also, we now save the PTCC even after expiration for an extended time,
      *  so can we use a successfully built tunnel anyway.
      *
      */
@@ -49,12 +49,16 @@ class BuildRequestor {
     /** some randomization is added on to this */
     private static final int BUILD_MSG_TIMEOUT = 60*1000;
 
+    /**
+     *  "paired tunnels" means using a client's own inbound tunnel to receive the
+     *  reply for an outbound build request, and using a client's own outbound tunnel
+     *  to send an inbound build request.
+     *  This is more secure than using the router's exploratory tunnels, as it
+     *  makes correlation of multiple clients more difficult.
+     */
     private static boolean usePairedTunnels(RouterContext ctx) {
-        String val = ctx.getProperty("router.usePairedTunnels");
-        if ( (val == null) || (Boolean.valueOf(val).booleanValue()) )
-            return true;
-        else
-            return false;
+        return true;
+        //return ctx.getBooleanPropertyDefaultTrue("router.usePairedTunnels");
     }
     
     /** new style requests need to fill in the tunnel IDs before hand */
@@ -321,9 +325,9 @@ class BuildRequestor {
      *  Can't do this for inbound tunnels since the msg goes out an expl. tunnel.
      */
     private static class TunnelBuildFirstHopFailJob extends JobImpl {
-        TunnelPool _pool;
-        PooledTunnelCreatorConfig _cfg;
-        BuildExecutor _exec;
+        final TunnelPool _pool;
+        final PooledTunnelCreatorConfig _cfg;
+        final BuildExecutor _exec;
         private TunnelBuildFirstHopFailJob(RouterContext ctx, TunnelPool pool, PooledTunnelCreatorConfig cfg, BuildExecutor exec) {
             super(ctx);
             _cfg = cfg;
diff --git a/router/java/src/net/i2p/router/tunnel/pool/ClientPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/ClientPeerSelector.java
index f4042feee9f30014416dc1f96aa1f1f47e432ba2..24e6966a12841eb368e10072bee474dbecb0cff6 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/ClientPeerSelector.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/ClientPeerSelector.java
@@ -21,20 +21,57 @@ class ClientPeerSelector extends TunnelPeerSelector {
             return null;
         if ( (length == 0) && (settings.getLength()+settings.getLengthVariance() > 0) )
             return null;
-        HashSet matches = new HashSet(length);
+
+        List<Hash> rv;
     
         if (length > 0) {
             if (shouldSelectExplicit(settings))
                 return selectExplicit(ctx, settings, length);
-        }
         
-        Set exclude = getExclude(ctx, settings.isInbound(), settings.isExploratory());
-        ctx.profileOrganizer().selectFastPeers(length, exclude, matches, settings.getIPRestriction());
+            Set<Hash> exclude = getExclude(ctx, settings.isInbound(), settings.isExploratory());
+            Set<Hash> matches = new HashSet(length);
+            if (length == 1) {
+                ctx.profileOrganizer().selectFastPeers(length, exclude, matches, 0);
+                matches.remove(ctx.routerHash());
+                rv = new ArrayList(matches);
+            } else {
+                // build a tunnel using 4 subtiers.
+                // For a 2-hop tunnel, the first hop comes from subtiers 0-1 and the last from subtiers 2-3.
+                // For a longer tunnels, the first hop comes from subtier 0, the middle from subtiers 2-3, and the last from subtier 1.
+                rv = new ArrayList(length + 1);
+                // OBEP or IB last hop
+                // group 0 or 1 if two hops, otherwise group 0
+                ctx.profileOrganizer().selectFastPeers(1, exclude, matches, settings.getRandomKey(), length == 2 ? 2 : 4);
+                matches.remove(ctx.routerHash());
+                exclude.addAll(matches);
+                rv.addAll(matches);
+                matches.clear();
+                if (length > 2) {
+                    // middle hop(s)
+                    // group 2 or 3
+                    ctx.profileOrganizer().selectFastPeers(length - 2, exclude, matches, settings.getRandomKey(), 3);
+                    matches.remove(ctx.routerHash());
+                    if (matches.size() > 1) {
+                        // order the middle peers for tunnels >= 4 hops
+                        List<Hash> ordered = new ArrayList(matches);
+                        orderPeers(ordered, settings.getRandomKey());
+                        rv.addAll(ordered);
+                    } else {
+                        rv.addAll(matches);
+                    }
+                    exclude.addAll(matches);
+                    matches.clear();
+                }
+                // IBGW or OB first hop
+                // group 2 or 3 if two hops, otherwise group 1
+                ctx.profileOrganizer().selectFastPeers(1, exclude, matches, settings.getRandomKey(), length == 2 ? 3 : 5);
+                matches.remove(ctx.routerHash());
+                rv.addAll(matches);
+            }
+        } else {
+            rv = new ArrayList(1);
+        }
         
-        matches.remove(ctx.routerHash());
-        ArrayList<Hash> rv = new ArrayList(matches);
-        if (rv.size() > 1)
-            orderPeers(rv, settings.getRandomKey());
         if (settings.isInbound())
             rv.add(0, ctx.routerHash());
         else
diff --git a/router/java/src/net/i2p/router/tunnel/pool/ExpireJob.java b/router/java/src/net/i2p/router/tunnel/pool/ExpireJob.java
index e2271ec90f66529d9c65e839a074c966fd2a4e9c..e82c4a8b0f78e810e72f5b8405d53b5dc9c48f9f 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/ExpireJob.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/ExpireJob.java
@@ -5,16 +5,21 @@ import net.i2p.router.Router;
 import net.i2p.router.RouterContext;
 import net.i2p.router.tunnel.TunnelCreatorConfig;
 
+/**
+ *  This runs twice for each tunnel.
+ *  The first time, remove it from the LeaseSet.
+ *  The second time, stop accepting data for it.
+ */
 class ExpireJob extends JobImpl {
-    private TunnelPool _pool;
-    private TunnelCreatorConfig _cfg;
+    private final TunnelPool _pool;
+    private final TunnelCreatorConfig _cfg;
     private boolean _leaseUpdated;
-    private long _dropAfter;
+    private final long _dropAfter;
+
     public ExpireJob(RouterContext ctx, TunnelCreatorConfig cfg, TunnelPool pool) {
         super(ctx);
         _pool = pool;
         _cfg = cfg;
-        _leaseUpdated = false;
         // we act as if this tunnel expires a random skew before it actually does
         // so we rebuild out of sync.  otoh, we will honor tunnel messages on it
         // up through the full lifetime of the tunnel, plus a clock skew, since
@@ -28,9 +33,11 @@ class ExpireJob extends JobImpl {
         cfg.setExpiration(expire);
         getTiming().setStartAfter(expire);
     }
+
     public String getName() {
         return "Expire tunnel";
     }
+
     public void runJob() {
         if (!_leaseUpdated) {
             _pool.removeTunnel(_cfg);
diff --git a/router/java/src/net/i2p/router/tunnel/pool/ParticpatingThrottler.java b/router/java/src/net/i2p/router/tunnel/pool/ParticpatingThrottler.java
new file mode 100644
index 0000000000000000000000000000000000000000..cf07ec954f925d2325c7e7536672aa7bac911d76
--- /dev/null
+++ b/router/java/src/net/i2p/router/tunnel/pool/ParticpatingThrottler.java
@@ -0,0 +1,60 @@
+package net.i2p.router.tunnel.pool;
+
+import net.i2p.data.Hash;
+import net.i2p.router.RouterContext;
+import net.i2p.util.ObjectCounter;
+import net.i2p.util.SimpleScheduler;
+import net.i2p.util.SimpleTimer;
+
+/**
+ * Count how often we have accepted a tunnel with the peer
+ * as the previous or next hop.
+ * We limit each peer to a percentage of all participating tunnels,
+ * subject to minimum and maximum values for the limit.
+ *
+ * This offers basic protection against simple attacks
+ * but is not a complete solution, as by design, we don't know
+ * the originator of a tunnel request.
+ *
+ * This also effectively limits the number of tunnels between
+ * any given pair of routers, which probably isn't a bad thing.
+ *
+ * Note that the actual limits will be higher than specified
+ * by up to 1 / LIFETIME_PORTION because the counter window resets.
+ *
+ * Note that the counts are of previous + next hops, so the total will
+ * be higher than the participating tunnel count, and will also grow
+ * as the network uses more 3-hop tunnels.
+ *
+ * @since 0.8.4
+ */
+class ParticipatingThrottler {
+    private final RouterContext context;
+    private final ObjectCounter<Hash> counter;
+
+    /** portion of the tunnel lifetime */
+    private static final int LIFETIME_PORTION = 3;
+    private static final int MIN_LIMIT = 18 / LIFETIME_PORTION;
+    private static final int MAX_LIMIT = 66 / LIFETIME_PORTION;
+    private static final int PERCENT_LIMIT = 12 / LIFETIME_PORTION;
+    private static final long CLEAN_TIME = 11*60*1000 / LIFETIME_PORTION;
+
+    ParticipatingThrottler(RouterContext ctx) {
+        this.context = ctx;
+        this.counter = new ObjectCounter();
+        SimpleScheduler.getInstance().addPeriodicEvent(new Cleaner(), CLEAN_TIME);
+    }
+
+    /** increments before checking */
+    boolean shouldThrottle(Hash h) {
+        int numTunnels = this.context.tunnelManager().getParticipatingCount();
+        int limit = Math.max(MIN_LIMIT, Math.min(MAX_LIMIT, numTunnels * PERCENT_LIMIT / 100));
+        return this.counter.increment(h) > limit;
+    }
+
+    private class Cleaner implements SimpleTimer.TimedEvent {
+        public void timeReached() {
+            ParticipatingThrottler.this.counter.clear();
+        }
+    }
+}
diff --git a/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java b/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java
index cbe7948150a8897b3b5b26c891ac95504f5d096d..d66bf6f6c6ce7866f57ecca0e0c4bfa7b078cd01 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java
@@ -26,8 +26,6 @@ class PooledTunnelCreatorConfig extends TunnelCreatorConfig {
     }
     public PooledTunnelCreatorConfig(RouterContext ctx, int length, boolean isInbound, Hash destination) {
         super(ctx, length, isInbound, destination);
-        _pool = null;
-        _live = false;
     }
     
     // calls TestJob
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TestJob.java b/router/java/src/net/i2p/router/tunnel/pool/TestJob.java
index 74910cbcbbc805f0da9e31b7e5f80275c9ce1f3c..e63e681b37cbd83b7eae3cec4eee2b3358e252be 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TestJob.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TestJob.java
@@ -22,9 +22,9 @@ import net.i2p.router.message.PayloadGarlicConfig;
 import net.i2p.util.Log;
 
 class TestJob extends JobImpl {
-    private Log _log;
-    private TunnelPool _pool;
-    private PooledTunnelCreatorConfig _cfg;
+    private final Log _log;
+    private final TunnelPool _pool;
+    private final PooledTunnelCreatorConfig _cfg;
     private boolean _found;
     private TunnelInfo _outTunnel;
     private TunnelInfo _replyTunnel;
@@ -39,9 +39,10 @@ class TestJob extends JobImpl {
     public TestJob(RouterContext ctx, PooledTunnelCreatorConfig cfg, TunnelPool pool) {
         super(ctx);
         _log = ctx.logManager().getLog(TestJob.class);
-        _pool = pool;
         _cfg = cfg;
-        if (_pool == null)
+        if (pool != null)
+            _pool = pool;
+        else
             _pool = cfg.getTunnelPool();
         if ( (_pool == null) && (_log.shouldLog(Log.ERROR)) )
             _log.error("Invalid tunnel test configuration: no pool for " + cfg, new Exception("origin"));
@@ -61,7 +62,9 @@ class TestJob extends JobImpl {
         ctx.statManager().createRateStat("tunnel.testAborted", "Tunnel test could not occur, since there weren't any tunnels to test with", "Tunnels", 
                                          RATES);
     }
+
     public String getName() { return "Test tunnel"; }
+
     public void runJob() {
         if (_pool == null)
             return;
@@ -144,6 +147,7 @@ class TestJob extends JobImpl {
             scheduleRetest();
             return;
         }
+        // can't be a singleton, the SKM modifies it
         Set encryptTags = new HashSet(1);
         encryptTags.add(encryptTag);
         // Register the single tag with the appropriate SKM
@@ -245,9 +249,10 @@ class TestJob extends JobImpl {
     }
     
     private class ReplySelector implements MessageSelector {
-        private RouterContext _context;
-        private long _id;
-        private long _expiration;
+        private final RouterContext _context;
+        private final long _id;
+        private final long _expiration;
+
         public ReplySelector(RouterContext ctx, long id, long expiration) {
             _context = ctx;
             _id = id;
@@ -256,7 +261,9 @@ class TestJob extends JobImpl {
         }
         
         public boolean continueMatching() { return !_found && _context.clock().now() < _expiration; }
+
         public long getExpiration() { return _expiration; }
+
         public boolean isMatch(I2NPMessage message) {
             if (message instanceof DeliveryStatusMessage) {
                 return ((DeliveryStatusMessage)message).getMessageId() == _id;
@@ -279,9 +286,13 @@ class TestJob extends JobImpl {
     private class OnTestReply extends JobImpl implements ReplyJob {
         private long _successTime;
         private OutNetMessage _sentMessage;
+
         public OnTestReply(RouterContext ctx) { super(ctx); }
+
         public String getName() { return "Tunnel test success"; }
+
         public void setSentMessage(OutNetMessage m) { _sentMessage = m; }
+
         public void runJob() { 
             if (_sentMessage != null)
                 getContext().messageRegistry().unregisterPending(_sentMessage);
@@ -291,6 +302,7 @@ class TestJob extends JobImpl {
                 testFailed(_successTime);
             _found = true;
         }
+
         // who cares about the details...
         public void setMessage(I2NPMessage message) {
             _successTime = getContext().clock().now() - ((DeliveryStatusMessage)message).getArrival();
@@ -309,12 +321,15 @@ class TestJob extends JobImpl {
      * Test failed (boo, hiss)
      */
     private class OnTestTimeout extends JobImpl {
-        private long _started;
+        private final long _started;
+
         public OnTestTimeout(RouterContext ctx) { 
             super(ctx); 
             _started = ctx.clock().now();
         }
+
         public String getName() { return "Tunnel test timeout"; }
+
         public void runJob() {
             if (_log.shouldLog(Log.WARN))
                 _log.warn("Timeout: found? " + _found);
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
index 083e2501ae05f75dd087e6da942d1f4298be1f91..25b6ed9332bec05f3155ff7ecfa2c7b9c74d8be1 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
@@ -34,13 +34,16 @@ public abstract class TunnelPeerSelector {
      * Which peers should go into the next tunnel for the given settings?  
      * 
      * @return ordered list of Hash objects (one per peer) specifying what order
-     *         they should appear in a tunnel (endpoint first).  This includes
+     *         they should appear in a tunnel (ENDPOINT FIRST).  This includes
      *         the local router in the list.  If there are no tunnels or peers
      *         to build through, and the settings reject 0 hop tunnels, this will
      *         return null.
      */
     public abstract List<Hash> selectPeers(RouterContext ctx, TunnelPoolSettings settings);
     
+    /**
+     *  @return randomized number of hops 0-7, not including ourselves
+     */
     protected int getLength(RouterContext ctx, TunnelPoolSettings settings) {
         int length = settings.getLength();
         int override = settings.getLengthOverride();
@@ -61,8 +64,8 @@ public abstract class TunnelPeerSelector {
         }
         if (length < 0)
             length = 0;
-        if (length > 8) // as documented in tunnel.html
-            length = 8;
+        else if (length > 7) // as documented in tunnel.html
+            length = 7;
         /*
         if ( (ctx.tunnelManager().getOutboundTunnelCount() <= 0) || 
              (ctx.tunnelManager().getFreeTunnelCount() <= 0) ) {
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 e6f3e599e8bf4c70b16c7f282529b748cdb476c5..00eded47de13045c9ac24da64f455101db2d6069 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
@@ -22,21 +22,21 @@ import net.i2p.stat.RateStat;
 import net.i2p.util.Log;
 
 /**
- *
+ *  A group of tunnels for the router or a particular client, in a single direction.
  */
 public class TunnelPool {
-    private final List _inProgress = new ArrayList();
-    private RouterContext _context;
-    private Log _log;
+    private final List<PooledTunnelCreatorConfig> _inProgress = new ArrayList();
+    private final RouterContext _context;
+    private final Log _log;
     private TunnelPoolSettings _settings;
-    private final ArrayList<TunnelInfo> _tunnels;
-    private TunnelPeerSelector _peerSelector;
-    private TunnelPoolManager _manager;
+    private final List<TunnelInfo> _tunnels;
+    private final TunnelPeerSelector _peerSelector;
+    private final TunnelPoolManager _manager;
     private boolean _alive;
     private long _lifetimeProcessed;
     private TunnelInfo _lastSelected;
     private long _lastSelectionPeriod;
-    private int _expireSkew;
+    private final int _expireSkew;
     private long _started;
     private long _lastRateUpdate;
     private long _lastLifetimeProcessed;
@@ -50,14 +50,9 @@ public class TunnelPool {
         _settings = settings;
         _tunnels = new ArrayList(settings.getLength() + settings.getBackupQuantity());
         _peerSelector = sel;
-        _alive = false;
-        _lastSelectionPeriod = 0;
-        _lastSelected = null;
-        _lifetimeProcessed = 0;
         _expireSkew = _context.random().nextInt(90*1000);
         _started = System.currentTimeMillis();
         _lastRateUpdate = _started;
-        _lastLifetimeProcessed = 0;
         _rateName = "tunnel.Bps." +
                     (_settings.isExploratory() ? "exploratory" : _settings.getDestinationNickname()) +
                     (_settings.isInbound() ? ".in" : ".out");
@@ -281,9 +276,12 @@ public class TunnelPool {
         }
     }
     
-    public void addTunnel(TunnelInfo info) {
+    /**
+     *  Add to the pool.
+     */
+    void addTunnel(TunnelInfo info) {
         if (_log.shouldLog(Log.DEBUG))
-            _log.debug(toString() + ": Adding tunnel " + info, new Exception("Creator"));
+            _log.debug(toString() + ": Adding tunnel " + info /* , new Exception("Creator") */ );
         LeaseSet ls = null;
         synchronized (_tunnels) {
             _tunnels.add(info);
@@ -295,7 +293,10 @@ public class TunnelPool {
             _context.clientManager().requestLeaseSet(_settings.getDestination(), ls);
     }
     
-    public void removeTunnel(TunnelInfo info) {
+    /**
+     *  Remove from the pool.
+     */
+    void removeTunnel(TunnelInfo info) {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug(toString() + ": Removing tunnel " + info);
         int remaining = 0;
@@ -412,11 +413,12 @@ public class TunnelPool {
         }
     }
 
+    /** noop for outbound */
     void refreshLeaseSet() {
-        if (_log.shouldLog(Log.DEBUG))
-            _log.debug(toString() + ": refreshing leaseSet on tunnel expiration (but prior to grace timeout)");
-        LeaseSet ls = null;
         if (_settings.isInbound() && (_settings.getDestination() != null) ) {
+            if (_log.shouldLog(Log.DEBUG))
+                _log.debug(toString() + ": refreshing leaseSet on tunnel expiration (but prior to grace timeout)");
+            LeaseSet ls = null;
             synchronized (_tunnels) {
                 ls = locked_buildNewLeaseSet();
             }
@@ -427,7 +429,7 @@ public class TunnelPool {
     }
 
     /**
-     * Return true if a fallback tunnel is built
+     * @return true if a fallback tunnel is built
      *
      */
     boolean buildFallback() {
@@ -464,15 +466,17 @@ public class TunnelPool {
      * but we use latest expiration first, since we need to sort them by that anyway.
      *
      */
-    class LeaseComparator implements Comparator {
-         public int compare(Object l, Object r) {
-             return ((Lease)r).getEndDate().compareTo(((Lease)l).getEndDate());
+    private static class LeaseComparator implements Comparator<Lease> {
+         public int compare(Lease l, Lease r) {
+             return r.getEndDate().compareTo(l.getEndDate());
         }
     }
 
     /**
-     * Build a leaseSet with the required tunnels that aren't about to expire
+     * Build a leaseSet with the required tunnels that aren't about to expire.
+     * Caller must synchronize on _tunnels.
      *
+     * @return null on failure
      */
     private LeaseSet locked_buildNewLeaseSet() {
         if (!_alive)
@@ -728,8 +732,8 @@ public class TunnelPool {
         int inProgress = 0;
         synchronized (_inProgress) {
             inProgress = _inProgress.size();
-            for (int i = 0; i < _inProgress.size(); i++) {
-                PooledTunnelCreatorConfig cfg = (PooledTunnelCreatorConfig)_inProgress.get(i);
+            for (int i = 0; i < inProgress; i++) {
+                PooledTunnelCreatorConfig cfg = _inProgress.get(i);
                 if (cfg.getLength() <= 1)
                     fallback++;
             }
@@ -850,16 +854,25 @@ public class TunnelPool {
         return rv;
     }
     
+    /**
+     *  @return null on failure
+     */
     PooledTunnelCreatorConfig configureNewTunnel() { return configureNewTunnel(false); }
+
+    /**
+     *  @return null on failure
+     */
     private PooledTunnelCreatorConfig configureNewTunnel(boolean forceZeroHop) {
         TunnelPoolSettings settings = getSettings();
-        List peers = null;
-        long expiration = _context.clock().now() + settings.getDuration();
+        // peers for new tunnel, including us, ENDPOINT FIRST
+        List<Hash> peers = null;
+        long expiration = _context.clock().now() + TunnelPoolSettings.DEFAULT_DURATION;
 
         if (!forceZeroHop) {
             peers = _peerSelector.selectPeers(_context, settings);
+
             if ( (peers == null) || (peers.isEmpty()) ) {
-                // no inbound or outbound tunnels to send the request through, and 
+                // no peers to build the tunnel with, and 
                 // the pool is refusing 0 hop tunnels
                 if (peers == null) {
                     if (_log.shouldLog(Log.WARN))
@@ -874,12 +887,13 @@ public class TunnelPool {
             peers = new ArrayList(1);
             peers.add(_context.routerHash());
         }
+
         PooledTunnelCreatorConfig cfg = new PooledTunnelCreatorConfig(_context, peers.size(), settings.isInbound(), settings.getDestination());
         cfg.setTunnelPool(this);
-        // peers[] is ordered endpoint first, but cfg.getPeer() is ordered gateway first
+        // peers list is ordered endpoint first, but cfg.getPeer() is ordered gateway first
         for (int i = 0; i < peers.size(); i++) {
             int j = peers.size() - 1 - i;
-            cfg.setPeer(j, (Hash)peers.get(i));
+            cfg.setPeer(j, peers.get(i));
             HopConfig hop = cfg.getConfig(j);
             hop.setCreation(_context.clock().now());
             hop.setExpiration(expiration);
@@ -898,6 +912,9 @@ public class TunnelPool {
         return cfg;
     }
     
+    /**
+     *  Remove from the _inprogress list
+     */
     void buildComplete(PooledTunnelCreatorConfig cfg) {
         synchronized (_inProgress) { _inProgress.remove(cfg); }
         cfg.setTunnelPool(this);
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
index 3a53be55268765cad58df32105b17e70ac0e0dc0..3f289b1657f9b420804721966c1aacbcb64f7a2b 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
@@ -37,8 +37,8 @@ import net.i2p.util.SimpleTimer;
  * 
  */
 public class TunnelPoolManager implements TunnelManagerFacade {
-    private RouterContext _context;
-    private Log _log;
+    private final RouterContext _context;
+    private final Log _log;
     /** Hash (destination) to TunnelPool */
     private final Map<Hash, TunnelPool> _clientInboundPools;
     /** Hash (destination) to TunnelPool */
@@ -61,7 +61,6 @@ public class TunnelPoolManager implements TunnelManagerFacade {
         _clientInboundPools = new ConcurrentHashMap(4);
         _clientOutboundPools = new ConcurrentHashMap(4);
         
-        _isShutdown = false;
         _executor = new BuildExecutor(ctx, this);
         I2PThread execThread = new I2PThread(_executor, "BuildExecutor");
         execThread.setDaemon(true);
@@ -330,7 +329,6 @@ public class TunnelPoolManager implements TunnelManagerFacade {
     
     /** queue a recurring test job if appropriate */
     void buildComplete(PooledTunnelCreatorConfig cfg) {
-        //buildComplete();
         if (cfg.getLength() > 1 &&
             (!_context.router().gracefulShutdownInProgress()) &&
             !Boolean.valueOf(_context.getProperty("router.disableTunnelTesting")).booleanValue()) {
@@ -358,9 +356,6 @@ public class TunnelPoolManager implements TunnelManagerFacade {
         }
     }
 
-    /** ?? */
-    void buildComplete() {}
-    
     public void startup() { 
         _isShutdown = false;
         if (!_executor.isRunning()) {
diff --git a/router/java/src/net/i2p/router/util/RFC822Date.java b/router/java/src/net/i2p/router/util/RFC822Date.java
new file mode 100644
index 0000000000000000000000000000000000000000..6635bca8cfa3cc02e0500c8e6447ec7502d5189f
--- /dev/null
+++ b/router/java/src/net/i2p/router/util/RFC822Date.java
@@ -0,0 +1,51 @@
+package net.i2p.router.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ *  Moved from NewsFetcher
+ *  @since 0.8.5
+ */
+public abstract class RFC822Date {
+
+    /**
+     * http://jimyjoshi.com/blog/2007/08/rfc822dateparsinginjava.html
+     * Apparently public domain
+     * Probably don't need all of these...
+     */
+    private static final SimpleDateFormat rfc822DateFormats[] = new SimpleDateFormat[] {
+                 new SimpleDateFormat("EEE, d MMM yy HH:mm:ss z", Locale.US),
+                 new SimpleDateFormat("EEE, d MMM yy HH:mm z", Locale.US),
+                 new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US),
+                 new SimpleDateFormat("EEE, d MMM yyyy HH:mm z", Locale.US),
+                 new SimpleDateFormat("d MMM yy HH:mm z", Locale.US),
+                 new SimpleDateFormat("d MMM yy HH:mm:ss z", Locale.US),
+                 new SimpleDateFormat("d MMM yyyy HH:mm z", Locale.US),
+                 new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US)
+    };
+
+    /**
+     * new Date(String foo) is deprecated, so let's do this the hard way
+     *
+     * @param s non-null
+     * @return -1 on failure
+     */
+    public static long parse822Date(String s) {
+        for (int i = 0; i < rfc822DateFormats.length; i++) {
+            try {
+                Date date = rfc822DateFormats[i].parse(s);
+                if (date != null)
+                    return date.getTime();
+            } catch (ParseException pe) {}
+        }
+        return -1;
+    }
+
+    /** @since 0.8.2 */
+    public static String to822Date(long t) {
+        return (new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US)).format(new Date(t));
+    }
+}
diff --git a/router/java/src/net/i2p/router/util/RandomIterator.java b/router/java/src/net/i2p/router/util/RandomIterator.java
new file mode 100644
index 0000000000000000000000000000000000000000..db8a560b80a3125727953a9864a52f6edfa6dde0
--- /dev/null
+++ b/router/java/src/net/i2p/router/util/RandomIterator.java
@@ -0,0 +1,178 @@
+package net.i2p.router.util;
+
+/*
+ * Modified from:
+ * http://www.lockergnome.com/awarberg/2007/04/22/random-iterator-in-java/
+ * No license, free to use
+ */
+
+//import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.List;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Random;
+
+import net.i2p.util.RandomSource;
+
+/**
+ *
+ *
+ * This is some Java code I wrote for a school project to save some time when iterating in
+ * random order over a part of list (until some condition becomes true):
+ *
+ * Here is a sample on how to use the code:
+ *
+    <pre>
+        for(Iterator<Object> iter = new RandomIterator<Object>(myObjList); iter.hasNext();){
+            Object o = iter.next();
+            if(someCondition(o) )
+                return o; // iteration stopped early
+        }
+    </pre>
+ *
+ * I wrote it to replace a Collection.shuffle call and this code gave us an overall increase in program execution speed of about 25%.
+ * As the javadoc description says, you are better off calling Collection.shuffle if you need to iterate over the entire list. But if you may stop early this class can save you some time, as it did in our case.
+ *
+ * Provides a random iteration over the given list.
+ *
+ * This effect can be achieved by using Collections.shuffle,
+ * which shuffles the entire collection in linear time.
+ *
+ * If the iteration process may end before all items
+ * are processed, this class may give a speed increase
+ * because the shuffling process is performed as items are requested
+ * rather than in the beginning.
+ *
+ * I2P changes:
+ *<pre>
+ *   - Use BitSet instead of boolean[]
+ *   - Use I2P RandomSource
+ *   - Done check in next(), throw NSEE
+ *   - Ensure lower and upper bounds are always clear
+ *   - Replace unbounded loop in next(). It is now O(N) time, but now
+ *     the iterator will tend to "clump" results and thus is not truly random.
+ *     *** This class is not recommended for small Lists,
+ *     *** or for iterating through a large portion of a List.
+ *     *** Use Collections.shuffle() instead.
+ *   - Add test code
+ *</pre>
+ *
+ */
+public class RandomIterator<E> implements Iterator<E> {
+    /**
+     * Mapping indicating which items were served (by index).
+     * if served[i] then the item with index i in the list
+     * has already been served.
+     *
+     * Note it is possible to save memory here by using
+     * BitSet rather than a boolean array, however it will
+     * increase the running time slightly.
+     */
+    private final BitSet served;
+
+    /** The amount of items served so far */
+    private int servedCount = 0;
+    private final List<E> list;
+    private final int LIST_SIZE;
+
+    /**
+    * The random number generator has a great influence
+    * on the running time of this iterator.
+    *
+    * See, for instance,
+    * <a href="http://www.qbrundage.com/michaelb/pubs/essays/random_number_generation" title="http://www.qbrundage.com/michaelb/pubs/essays/random_number_generation" target="_blank">http://www.qbrundage.com/michaelb/pubs/e&#8230;</a>
+    * for some implementations, which are faster than java.util.Random.
+    */
+    private static final Random rand = RandomSource.getInstance();
+
+    /** Used to narrow the range to take random indexes from */
+    private int lower, upper;
+
+    public RandomIterator(List<E> list){
+        this.list = list;
+        LIST_SIZE = list.size();
+        served = new BitSet(LIST_SIZE);
+        upper = LIST_SIZE - 1;
+    }
+
+    public boolean hasNext() {
+        return servedCount < LIST_SIZE;
+    }
+
+    public E next() {
+        if (!hasNext())
+            throw new NoSuchElementException();
+        int range = upper - lower + 1;
+
+        // This has unbounded behavior, even with lower/upper
+        //int index;
+        //do {
+        //    index = lower + rand.nextInt(range);
+        //} while (served.get(index));
+
+        // This tends to "clump" results, escpecially toward the end of the iteration.
+        // It also tends to leave the first and last few elements until the end.
+        int start = lower + rand.nextInt(range);
+        int index;
+        if ((start % 2) == 0)  // coin flip
+            index = served.nextClearBit(start);
+        else
+            index = previousClearBit(start);
+        if (index < 0)
+            throw new NoSuchElementException("shouldn't happen");
+        servedCount++;
+        served.set(index);
+
+        // check if the range from which random values
+        // are taken can be reduced
+        // I2P - ensure lower and upper are always clear
+        if (hasNext()) {
+            if (index == lower)
+                lower = served.nextClearBit(lower);
+            else if (index == upper)
+                upper = previousClearBit(upper - 1);
+        }
+        return list.get(index);
+    }
+
+    /** just like nextClearBit() */
+    private int previousClearBit(int n) {
+        for (int i = n; i >= lower; i--) {
+            if (!served.get(i)) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    /**
+     *  @throws UnsupportedOperationException always
+     */
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
+
+/*****
+    public static void main(String[] args) {
+        System.out.println("\n testing with 0");
+        test(0);
+        System.out.println("\n testing with 1");
+        test(1);
+        System.out.println("\n testing with 2");
+        test(2);
+        System.out.println("\n testing with 1000");
+        test(1000);
+    }
+
+    public static void test(int n) {
+        List<Integer> l = new ArrayList(n);
+        for (int i = 0; i < n; i++) {
+            l.add(Integer.valueOf(i));
+        }
+        for (Iterator<Integer> iter = new RandomIterator(l); iter.hasNext(); ) {
+            System.out.println(iter.next().toString());
+        }
+    }
+*****/
+}
diff --git a/router/java/src/net/i2p/router/util/package.html b/router/java/src/net/i2p/router/util/package.html
new file mode 100644
index 0000000000000000000000000000000000000000..bf81eb3fafa814d31ee55ea1466b4a707f742fef
--- /dev/null
+++ b/router/java/src/net/i2p/router/util/package.html
@@ -0,0 +1,6 @@
+<html><body>
+<p>
+These classes define the several useful utilities used
+throughout the router.
+</p>
+</body></html>
diff --git a/router/java/src/org/cybergarage/http/HTTPRequest.java b/router/java/src/org/cybergarage/http/HTTPRequest.java
index c1c3b50f6ce6ed81c6faa3ead33ff63ad105334d..938450c939e6bea2b9d1d6895166a4eab380ded1 100644
--- a/router/java/src/org/cybergarage/http/HTTPRequest.java
+++ b/router/java/src/org/cybergarage/http/HTTPRequest.java
@@ -388,10 +388,10 @@ public class HTTPRequest extends HTTPPacket
 				// Set the timeout to be nice and short, the device should be local and fast.
 				// Yeah, the UPnP standard is a minute or something, too bad.
 				// If he can't get back to us in a few seconds, forget it.
-				// And set the soTimeout to 1 second (for reads).
+				// And set the soTimeout to 2 second (for reads).
 				//postSocket = new Socket(host, port);
 				postSocket = new Socket();
-				postSocket.setSoTimeout(1000);
+				postSocket.setSoTimeout(2000);
 				SocketAddress sa = new InetSocketAddress(host, port);
 				postSocket.connect(sa, 3000);
 			}
diff --git a/router/java/src/org/cybergarage/util/Debug.java b/router/java/src/org/cybergarage/util/Debug.java
index 5b01ac43ab2a8cced2cb40ddb5378e195d27fc62..c6415591ef2687966fd99f7af2f5fec345aa9c8a 100644
--- a/router/java/src/org/cybergarage/util/Debug.java
+++ b/router/java/src/org/cybergarage/util/Debug.java
@@ -52,14 +52,14 @@ public final class Debug
 	}
 	public static final void warning(String s) {
 		if (_log != null)
-			_log.error(s);
+			_log.warn(s);
 	}
 	public static final void warning(String m, Exception e) {
 		if (_log != null)
-			_log.error(m, e);
+			_log.warn(m, e);
 	}
 	public static final void warning(Exception e) {
 		if (_log != null)
-			_log.error("", e);
+			_log.warn("", e);
 	}
 }
diff --git a/router/java/src/org/cybergarage/xml/parser/JaxpParser.java b/router/java/src/org/cybergarage/xml/parser/JaxpParser.java
index 8de6b06b89869a47ebda8d4bd68800cdafea753e..7b220ef0c43ad5bf5c5cf7c9aa54572adb8ebc81 100644
--- a/router/java/src/org/cybergarage/xml/parser/JaxpParser.java
+++ b/router/java/src/org/cybergarage/xml/parser/JaxpParser.java
@@ -17,6 +17,8 @@
 
 package org.cybergarage.xml.parser;
 
+import java.io.FilterInputStream;
+import java.io.IOException;
 import java.io.InputStream;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -102,7 +104,7 @@ public class JaxpParser extends Parser
 		try {
 			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 			DocumentBuilder builder = factory.newDocumentBuilder();
-			InputSource inSrc = new InputSource(inStream);
+			InputSource inSrc = new InputSource(new NullFilterInputStream(inStream));
 			Document doc = builder.parse(inSrc);
 
 			org.w3c.dom.Element docElem = doc.getDocumentElement();
@@ -124,4 +126,27 @@ public class JaxpParser extends Parser
 		return root;
 	}
 
+	/**
+	 *  I2P -
+	 *  Filter out nulls, hopefully to avoid
+	 *  SAXParserException "Content not allowed in trailing section",
+	 *  which is apparently caused by nulls.
+	 *  Alternative is to remove all stuff between '>' and '<',
+         *  which isn't so hard if we assume no CDATA.
+	 */
+	private static class NullFilterInputStream extends FilterInputStream {
+
+		public NullFilterInputStream(InputStream is) {
+			super(is);
+		}
+
+		@Override
+		public int read() throws IOException {
+			int rv;
+			while ((rv = super.read()) == 0) {
+				// try again
+			}
+			return rv;
+		}
+	}
 }
diff --git a/tests/scripts/checkpo.sh b/tests/scripts/checkpo.sh
new file mode 100755
index 0000000000000000000000000000000000000000..13f080833bca6a553d6ddf0047905c5251898ce9
--- /dev/null
+++ b/tests/scripts/checkpo.sh
@@ -0,0 +1,36 @@
+#
+# Run 'msgfmt -c' on all .po files
+# Returns nonzero on failure
+#
+# zzz 2011-02
+# public domain
+#
+
+cd `dirname $0`/../..
+
+DIRS="\
+  apps/routerconsole/locale \
+  apps/i2ptunnel/locale \
+  apps/i2psnark/locale \
+  apps/susidns/locale \
+  apps/susimail/locale \
+  apps/desktopgui/locale"
+
+for i in `find $DIRS -maxdepth 1 -type f -name *.po`
+do
+	echo "Checking $i ..."
+	msgfmt -c $i
+        if [ $? -ne 0 ]
+	then
+		echo "********* FAILED CHECK FOR $i *************"
+		FAIL=1
+	fi
+done
+
+if [ "$FAIL" != "" ]
+then
+	echo "******** At least one file failed check *********"
+else
+	echo "All files passed"
+fi
+exit $FAIL
diff --git a/tests/scripts/checkutf8.sh b/tests/scripts/checkutf8.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4753cbd30035084027fcc18f17051eeea7cfc159
--- /dev/null
+++ b/tests/scripts/checkutf8.sh
@@ -0,0 +1,58 @@
+#
+# Check for UTF-8 problems in all files where they might appear
+# Also check all Java source files
+# Returns nonzero on failure
+#
+# zzz 2010-12
+# public domain
+#
+
+cd `dirname $0`/../..
+
+# apps/routerconsole/jsp/ should only have UTF8 in help_xx.jsp
+
+DIRS="\
+  apps/routerconsole/locale \
+  apps/i2ptunnel/locale \
+  apps/i2psnark/locale \
+  apps/susidns/locale \
+  apps/susimail/locale \
+  apps/desktopgui/locale \
+  installer/resources/eepsite.help/help \
+  installer/resources/initialNews \
+  installer/resources/proxy \
+  installer/resources/readme \
+  apps/routerconsole/jsp \
+  apps/i2ptunnel/jsp \
+  apps/susidns/src/jsp"
+
+for i in `find $DIRS -maxdepth 1 -type f`
+do
+	echo "Checking $i ..."
+	iconv -f UTF8 -t UTF8 $i -o /dev/null
+        if [ $? -ne 0 ]
+	then
+		echo "********* FAILED CHECK FOR $i *************"
+		FAIL=1
+	fi
+done
+
+echo "Checking all Java files ..."
+for i in `find . -name \*.java -type f`
+do
+	#echo "Checking $i ..."
+	iconv -f UTF8 -t UTF8 $i -o /dev/null
+        if [ $? -ne 0 ]
+	then
+		echo "********* FAILED CHECK FOR $i *************"
+		FAIL=1
+	fi
+done
+
+if [ "$FAIL" != "" ]
+then
+	echo "******** At least one file failed check *********"
+else
+	echo "All files passed"
+fi
+exit $FAIL
diff --git a/tests/scripts/checkxml.sh b/tests/scripts/checkxml.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d6524476d1b247268948a8b75a9cf27125510f67
--- /dev/null
+++ b/tests/scripts/checkxml.sh
@@ -0,0 +1,144 @@
+#
+# Validate XML and HTML files using xmllint
+# Returns nonzero on failure
+#
+# Note that the news.xml and initialNews*.xml files are really HTML
+#
+# zzz 2011-03
+# public domain
+#
+
+cd `dirname $0`/../..
+
+XMLFILES="\
+./android/AndroidManifest.xml \
+./android/build.xml \
+./android/res/layout/main.xml \
+./android/res/values/strings.xml \
+./apps/addressbook/build.xml \
+./apps/addressbook/web.xml \
+./apps/BOB/build.xml \
+./apps/BOB/Demos/echo/echoclient/build.xml \
+./apps/BOB/Demos/echo/echoclient/nbproject/build-impl.xml \
+./apps/BOB/Demos/echo/echoclient/nbproject/private/private.xml \
+./apps/BOB/Demos/echo/echoclient/nbproject/project.xml \
+./apps/BOB/Demos/echo/echoserver/build.xml \
+./apps/BOB/Demos/echo/echoserver/nbproject/build-impl.xml \
+./apps/BOB/Demos/echo/echoserver/nbproject/private/private.xml \
+./apps/BOB/Demos/echo/echoserver/nbproject/project.xml \
+./apps/BOB/nbproject/build-impl.xml \
+./apps/BOB/nbproject/project.xml \
+./apps/desktopgui/build.xml \
+./apps/fortuna/build.xml \
+./apps/i2psnark/java/build.xml \
+./apps/i2psnark/jetty-i2psnark.xml \
+./apps/i2psnark/web.xml \
+./apps/i2ptunnel/java/build.xml \
+./apps/i2ptunnel/jsp/web.xml \
+./apps/jetty/build.xml \
+./apps/ministreaming/java/build.xml \
+./apps/routerconsole/java/build.xml \
+./apps/routerconsole/jsp/web.xml \
+./apps/sam/java/build.xml \
+./apps/streaming/java/build.xml \
+./apps/susidns/src/build.xml \
+./apps/susidns/src/WEB-INF/web-template.xml \
+./apps/susimail/build.xml \
+./apps/susimail/src/WEB-INF/web.xml \
+./apps/systray/java/build.xml \
+./build.xml \
+./core/java/build.xml \
+./core/java/nbproject/project.xml \
+./installer/i2pinstaller.xml \
+./installer/i2pstandalone.xml \
+./installer/install.xml \
+./installer/lib/launch4j/build.xml \
+./installer/resources/jetty.xml \
+./installer/resources/shortcutSpec.xml \
+./router/java/build.xml \
+./Slackware/i2p-base/build.xml \
+./Slackware/i2p/build.xml"
+
+HTMLFILES="\
+./installer/resources/initialNews/*.xml \
+./installer/resources/news.xml \
+./apps/BOB/src/net/i2p/BOB/package.html \
+./apps/desktopgui/src/net/i2p/desktopgui/package.html \
+./apps/ministreaming/java/src/net/i2p/client/streaming/package.html \
+./apps/routerconsole/jsp/i2psnark/index.html \
+./apps/susidns/src/index.html \
+./apps/susimail/src/index.html \
+./core/java/src/net/i2p/client/datagram/package.html \
+./core/java/src/net/i2p/client/naming/package.html \
+./core/java/src/net/i2p/client/package.html \
+./core/java/src/net/i2p/crypto/package.html \
+./core/java/src/net/i2p/data/i2cp/package.html \
+./core/java/src/net/i2p/data/package.html \
+./core/java/src/net/i2p/internal/package.html \
+./core/java/src/net/i2p/package.html \
+./core/java/src/net/i2p/stat/package.html \
+./core/java/src/net/i2p/time/package.html \
+./core/java/src/net/i2p/util/package.html \
+./installer/resources/eepsite.help/help/index_de.html \
+./installer/resources/eepsite.help/help/index_fr.html \
+./installer/resources/eepsite.help/help/index.html \
+./installer/resources/eepsite.help/help/index_na.html \
+./installer/resources/eepsite.help/help/index_nl.html \
+./installer/resources/eepsite.help/help/index_ru.html \
+./installer/resources/eepsite.help/help/index_sv.html \
+./installer/resources/eepsite.help/help/pagetemplate.html \
+./installer/resources/eepsite.help/index.html \
+./installer/resources/readme/readme_ar.html \
+./installer/resources/readme/readme_de.html \
+./installer/resources/readme/readme_es.html \
+./installer/resources/readme/readme_fr.html \
+./installer/resources/readme/readme.html \
+./installer/resources/readme/readme_nl.html \
+./installer/resources/readme/readme_pt.html \
+./installer/resources/readme/readme_ru.html \
+./installer/resources/readme/readme_sv.html \
+./installer/resources/readme/readme_zh.html \
+./installer/resources/small/toolbar.html \
+./installer/resources/startconsole.html \
+./router/java/src/net/i2p/data/i2np/package.html \
+./router/java/src/net/i2p/router/package.html \
+./router/java/src/net/i2p/router/peermanager/package.html \
+./router/java/src/net/i2p/router/startup/package.html \
+./router/java/src/net/i2p/router/transport/ntcp/package.html \
+./router/java/src/net/i2p/router/transport/package.html \
+./router/java/src/net/i2p/router/transport/udp/package.html \
+./router/java/src/net/i2p/router/util/package.html"
+
+echo 'Checking XML files....................'
+for i in $XMLFILES
+do
+	echo "Checking $i ..."
+	xmllint --noout $i
+        if [ $? -ne 0 ]
+	then
+		echo "********* FAILED CHECK FOR $i *************"
+		FAIL=1
+	fi
+done
+
+echo 'Checking HTML files....................'
+for i in $HTMLFILES
+do
+	echo "Checking $i ..."
+	xmllint --html --noout $i
+	# FIXME html mode never exits with an error code
+	# ... but it does output errors
+        if [ $? -ne 0 ]
+	then
+		echo "********* FAILED CHECK FOR $i *************"
+		FAIL=1
+	fi
+done
+
+if [ "$FAIL" != "" ]
+then
+	echo "******** At least one file failed check *********"
+else
+	echo "All files passed"
+fi
+exit $FAIL