diff --git a/apps/desktopgui/README b/apps/desktopgui/README
new file mode 100644
index 0000000000000000000000000000000000000000..2a4f3a40cb46bdef09e3397de496b3863432764b
--- /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=--startWithI2P --I2PLocation=/SOME_LOCATION
+    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..98e768db99a021952d315db1c89b54f0aa15ec6c
--- /dev/null
+++ b/apps/desktopgui/TODO
@@ -0,0 +1,24 @@
+HIGH PRIORITY:
+- Allow desktopgui to start, stop and restart I2P. - DONE
+- Correct logging system - DONE
+- Internationalisation:
+    * Add strings - DONE
+    * Add Windows support
+    * Might need some kind of trigger to reload the menu (for live language switching)
+    * 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.
+- Modify installer to set I2P directory parameter; or use $I2P?
+- Fix tabs versus spaces ;-)
+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..f8de8042806c80870edc8c4d4accf7035a738d34 100644
--- a/apps/desktopgui/build.xml
+++ b/apps/desktopgui/build.xml
@@ -1,119 +1,86 @@
 <?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" 
+                       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>
 
+		<jar basedir="${build}" destfile="${dist}/${jar}">
+			<manifest>
+				<attribute name="Main-Class" value="net.i2p.desktopgui.Main"/>
+			</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>
     </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..4762e9a8bf53c9e6ef90be3eebd008329ba8e6f6
--- /dev/null
+++ b/apps/desktopgui/bundle-messages.sh
@@ -0,0 +1,95 @@
+#
+# 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
+
+# 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}
+
+	if [ "$POUPDATE" = "1" ]
+	then
+		# make list of java files newer than the .po file
+		find $JPATHS -name *.java -newer $i > $TMPFILE
+	fi
+
+    echo $LG
+	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
+
+	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
+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_nl.po b/apps/desktopgui/locale/messages_nl.po
new file mode 100644
index 0000000000000000000000000000000000000000..f994059d219277d3fd13858fc2b039ea014d0f87
--- /dev/null
+++ b/apps/desktopgui/locale/messages_nl.po
@@ -0,0 +1,31 @@
+#: src/net/i2p/desktopgui/TrayManager.java:73
+msgid "Launch I2P Browser"
+msgstr "Start I2P Browser"
+
+#: src/net/i2p/desktopgui/TrayManager.java:99
+msgid "Browser not found"
+msgstr "Browser niet gevonden"
+
+#: src/net/i2p/desktopgui/TrayManager.java:100
+msgid "The default browser for your system was not found."
+msgstr "De standaard webbrowser voor je systeem werd niet gevonden."
+
+#: src/net/i2p/desktopgui/TrayManager.java:111
+msgid "Start I2P"
+msgstr "I2P starten"
+
+#: src/net/i2p/desktopgui/TrayManager.java:126
+msgid "I2P is starting!"
+msgstr "I2P is aan het starten!"
+
+#: src/net/i2p/desktopgui/TrayManager.java:126
+msgid "Starting"
+msgstr "Bezig met starten"
+
+#: src/net/i2p/desktopgui/TrayManager.java:140
+msgid "Restart I2P"
+msgstr "I2P herstarten"
+
+#: src/net/i2p/desktopgui/TrayManager.java:161
+msgid "Stop I2P"
+msgstr "I2P stoppen"
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/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..702807ba2a16f37fd750de36139c21beecb28a9d
--- /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..efa7e31a1b5dfeba8fc6f5f340e3856ba028e53b
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java
@@ -0,0 +1,93 @@
+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.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 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(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..540807adacd42588e3e26acc10fb2bb124820e6f
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/Main.java
@@ -0,0 +1,85 @@
+package net.i2p.desktopgui;
+
+/*
+ * Main.java
+ */
+
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+import net.i2p.desktopgui.util.*;
+import net.i2p.util.Log;
+
+/**
+ * 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).
+	 */
+    private void startUp() {
+        trayManager = TrayManager.getInstance();
+        trayManager.startManager();
+    }
+
+    /**
+     * Main method launching the application.
+     */
+    public static void main(String[] args) {
+    	System.setProperty("java.awt.headless", "false");
+        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() {
+                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();
+    }
+    
+}
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..1bc8b1b055146df80b607ffb15e589bb6dfe4a8d
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java
@@ -0,0 +1,92 @@
+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() {}
+    
+    public static TrayManager getInstance() {
+    	if(instance == null) {
+    		boolean inI2P = ConfigurationManager.getInstance().getBooleanConfiguration("startWithI2P", false);
+    		if(inI2P) {
+    			instance = new InternalTrayManager();
+    		}
+    		else {
+    			instance = new ExternalTrayManager();
+    		}
+    	}
+    	return instance;
+    }
+
+    /**
+     * Add the tray icon to the system tray and start everything up.
+     */
+    public void startManager() {
+        if(SystemTray.isSupported()) {
+            tray = SystemTray.getSystemTray();
+            trayIcon = new TrayIcon(getTrayImage(), "I2P", getMainMenu());
+            try {
+                tray.add(trayIcon);
+            } catch (AWTException e) {
+            	log.log(Log.WARN, "Problem creating system tray icon!", e);
+            }
+        }
+    }
+    
+    /**
+     * Build a popup menu, adding callbacks to the different items.
+     * @return popup menu
+     */
+    public abstract PopupMenu getMainMenu();
+    
+    /**
+     * Get tray icon image from the desktopgui resources in the jar file.
+     * @return image used for the tray icon
+     */
+    public Image getTrayImage() {
+        URL url = getClass().getResource("/desktopgui/resources/images/logo.jpg");
+        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/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..e6b091eb0ef6324f54f9234c2e1dd709f678fd6b
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java
@@ -0,0 +1,26 @@
+package net.i2p.desktopgui.i18n;
+
+import net.i2p.router.RouterContext;
+import net.i2p.util.Translate;
+
+public class DesktopguiTranslator {
+	
+    private static final String BUNDLE_NAME = "net.i2p.desktopgui.messages";
+	
+	private static RouterContext ctx;
+	
+	private static RouterContext getRouterContext() {
+		if(ctx == null) {
+			ctx = RouterContext.listContexts().get(0);
+		}
+		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..d838eef272ba8178c604e7d17858d309b03d54bc
--- /dev/null
+++ b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java
@@ -0,0 +1,64 @@
+package net.i2p.desktopgui.router;
+
+import java.io.IOException;
+
+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 Router getRouter() {
+		return RouterContext.listContexts().get(0).router();
+	}
+	
+	/**
+	 * Start an I2P router instance.
+	 * This method has limited knowledge
+	 * (there is no I2P instance running to collect information from).
+	 * 
+	 * It needs to determine itself where the I2P instance is located,
+	 * except if the location has been given through command-line arguments.
+	 */
+	public static void start() {
+		try {
+			//TODO: detect I2P directory
+			//TODO: set/get PID
+			String separator = System.getProperty("file.separator");
+			String homeDirectory = System.getProperty("user.home");
+			String location = ConfigurationManager.getInstance()
+				.getStringConfiguration("I2PLocation", homeDirectory + separator + "i2p");
+			
+			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() {
+		getRouter().restart();
+	}
+
+	/**
+	 * Stop the running I2P instance.
+	 */
+	public static void shutDown() {
+		getRouter().shutdownGracefully();
+    }
+
+    private static String _(String s) {
+        return DesktopguiTranslator._(s);
+    }
+}
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..ec120a416ae1d5a11ec5be9e2c3c5fdef5ccbb6b
--- /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..3a35d5c31831a2e3e36faf7240b3f0572a32d8c2
--- /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/build.xml b/build.xml
index 7c75e857aeaa5d2e1dbe523463552a89bcafff2a..a25d9e77922a98529a2c71e831de22a2c9543e1b 100644
--- a/build.xml
+++ b/build.xml
@@ -34,6 +34,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" />
@@ -42,10 +43,6 @@
         <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>
     <target name="debianhowto">
@@ -738,6 +735,10 @@
 		<ant dir="core/java/" target="fullclovertest" />
 		<ant dir="router/java/" target="fullclovertest" />
     </target>
+    <target name="desktopgui" depends="builddepSmall">
+        <ant dir="apps/desktopgui" target="jar" />
+        <copy file="apps/desktopgui/dist/desktopgui.jar" todir="." />
+    </target>
     <target name="syndie" >
         <ant dir="apps/syndie/java/" target="standalone" />
         <copy file="apps/syndie/java/syndie-standalone.zip" todir="." />
@@ -791,34 +792,6 @@
         </exec>
         <echo message="Findbugs output stored in findbugs.xml" />
     </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 -->