diff --git a/apps/routerconsole/java/src/net/i2p/router/web/WebAppConfiguration.java b/apps/routerconsole/java/src/net/i2p/router/web/WebAppConfiguration.java
index 249ae4582e97cbd4a8108351ffe3b771280a7e16..ac84d937a1983864447301f13a22f63504be12af 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/WebAppConfiguration.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/WebAppConfiguration.java
@@ -7,6 +7,7 @@ import java.util.StringTokenizer;
 import net.i2p.I2PAppContext;
 
 import org.mortbay.jetty.webapp.Configuration;
+import org.mortbay.jetty.webapp.WebAppClassLoader;
 import org.mortbay.jetty.webapp.WebAppContext;
 
 
@@ -45,7 +46,10 @@ public class WebAppConfiguration implements Configuration {
         return _wac;
     }
 
-    public void configureClassPath() throws Exception {
+    /**
+     *  This was the interface in Jetty 5, now it's configureClassLoader()
+     */
+    private void configureClassPath() throws Exception {
         String ctxPath = _wac.getContextPath();
         //System.err.println("Configure Class Path " + ctxPath);
         if (ctxPath.equals("/"))
@@ -78,7 +82,10 @@ public class WebAppConfiguration implements Configuration {
         if (cp == null)
             return;
         StringTokenizer tok = new StringTokenizer(cp, " ,");
+        StringBuilder buf = new StringBuilder();
         while (tok.hasMoreTokens()) {
+            if (buf.length() > 0)
+                buf.append(',');
             String elem = tok.nextToken().trim();
             String path;
             if (elem.startsWith("$I2P"))
@@ -88,7 +95,17 @@ public class WebAppConfiguration implements Configuration {
             else
                 path = dir.getAbsolutePath() + '/' + elem;
             System.err.println("Adding " + path + " to classpath for " + appName);
-            _wac.setExtraClasspath(path);
+            buf.append(path);
+        }
+        ClassLoader cl = _wac.getClassLoader();
+        if (cl != null && cl instanceof WebAppClassLoader) {
+            WebAppClassLoader wacl = (WebAppClassLoader) cl;
+            wacl.addClassPath(buf.toString());
+        } else {
+            // This was not working because the WebAppClassLoader already exists
+            // and it calls getExtraClasspath in its constructor
+            // Not sure why WACL already exists...
+            _wac.setExtraClasspath(buf.toString());
         }
     }
 
@@ -99,5 +116,7 @@ public class WebAppConfiguration implements Configuration {
     public void deconfigureWebApp() {}
 
     /** @since Jetty 6 */
-    public void configureClassLoader() {}
+    public void configureClassLoader() throws Exception {
+        configureClassPath();
+    }
 }
diff --git a/apps/routerconsole/jsp/configclients.jsp b/apps/routerconsole/jsp/configclients.jsp
index 6a700dedaa8b3985fcf5b7043e84893a703c6d12..9034d909e11570925ac53ae4af851d92ce3f557b 100644
--- a/apps/routerconsole/jsp/configclients.jsp
+++ b/apps/routerconsole/jsp/configclients.jsp
@@ -101,7 +101,7 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
  </p><p>
  <%=intl._("A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method.")%>
  </p><div class="wideload">
-<form action="" method="POST">
+<form action="configclients" method="POST">
 <input type="hidden" name="nonce" value="<%=pageNonce%>" >
  <jsp:getProperty name="clientshelper" property="form2" />
  <p><i><%=intl._("All changes require restart to take effect.")%></i>
@@ -125,7 +125,7 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
 <h3><a name="plugin"></a><%=intl._("Plugin Installation")%></h3><p>
  <%=intl._("To install a plugin, enter the download URL:")%>
  </p><div class="wideload">
-<form action="" method="POST">
+<form action="configclients" method="POST">
 <input type="hidden" name="nonce" value="<%=pageNonce%>" >
 <p>
  <input type="text" size="60" name="pluginURL" >
diff --git a/apps/routerconsole/jsp/viewstat.jsp b/apps/routerconsole/jsp/viewstat.jsp
index af7b2944cd2fcc542b932135928bdf9e5c447352..0a716cb9dbff4deb3a026cbfa094ede8e24e4147 100644
--- a/apps/routerconsole/jsp/viewstat.jsp
+++ b/apps/routerconsole/jsp/viewstat.jsp
@@ -44,6 +44,10 @@ if ( !rendered && ((rs != null) || fakeBw) ) {
         response.setContentType("image/png");
         // very brief 45 sec expire
         response.setDateHeader("Expires", net.i2p.I2PAppContext.getGlobalContext().clock().now() + (45*1000));
+        // http://jira.codehaus.org/browse/JETTY-1346
+        // This doesn't actually appear in the response, but it fixes the problem,
+        // so Jetty must look for this header and close the connection.
+        response.setHeader("Connection", "Close");
         int width = -1;
         int height = -1;
         int periodCount = -1;
diff --git a/build.xml b/build.xml
index 2d4f85caef6ad2483cc5f736c2750c50898e7b33..57bb5bccedcabc207a13122fda672c9a3dae3041 100644
--- a/build.xml
+++ b/build.xml
@@ -1141,7 +1141,7 @@
              basedir="${basedir}/installer/lib/izpack/patches" />
     </target>
 
-    <target name="installer" depends="preppkg, buildProperties, util-list-changes, izpack-patches" >
+    <target name="utility-jars" depends="buildCore" >
         <mkdir dir="pkg-temp/installer" />
         <!-- set if unset -->
         <property name="workspace.changes.util.tr" value="" />
@@ -1172,6 +1172,9 @@
                 <attribute name="Workspace-Changes" value="${workspace.changes.util.tr}" />
             </manifest>
         </jar>
+    </target>
+
+    <target name="installer" depends="preppkg, buildProperties, util-list-changes, izpack-patches, utility-jars" >
         <!--
           Force 1.5 pack200 output
           Doesnt work!
@@ -1259,37 +1262,7 @@
 	</exec>
     </target>
 
-    <target name="installer-windows" depends="clean, preppkg-windows-only, util-list-changes, izpack-patches" >
-        <mkdir dir="pkg-temp/installer" />
-        <!-- set if unset -->
-        <property name="workspace.changes.util.tr" value="" />
-        <jar destfile="./pkg-temp/installer/copy.jar" basedir="./core/java/build/obj" includes="net/i2p/util/Copy.class net/i2p/util/FileUtil.class">
-            <manifest>
-                <attribute name="Main-Class" value="net.i2p.util.Copy" />
-                <attribute name="Built-By" value="${build.built-by}" />
-                <attribute name="Build-Date" value="${build.timestamp}" />
-                <attribute name="Base-Revision" value="${workspace.version}" />
-                <attribute name="Workspace-Changes" value="${workspace.changes.util.tr}" />
-            </manifest>
-        </jar>
-        <jar destfile="./pkg-temp/installer/delete.jar" basedir="./core/java/build/obj" includes="net/i2p/util/Delete.class net/i2p/util/FileUtil.class">
-            <manifest>
-                <attribute name="Main-Class" value="net.i2p.util.Delete" />
-                <attribute name="Built-By" value="${build.built-by}" />
-                <attribute name="Build-Date" value="${build.timestamp}" />
-                <attribute name="Base-Revision" value="${workspace.version}" />
-                <attribute name="Workspace-Changes" value="${workspace.changes.util.tr}" />
-            </manifest>
-        </jar>
-        <jar destfile="./pkg-temp/installer/exec.jar" basedir="./core/java/build/obj" includes="net/i2p/util/Exec.class">
-            <manifest>
-                <attribute name="Main-Class" value="net.i2p.util.Exec" />
-                <attribute name="Built-By" value="${build.built-by}" />
-                <attribute name="Build-Date" value="${build.timestamp}" />
-                <attribute name="Base-Revision" value="${workspace.version}" />
-                <attribute name="Workspace-Changes" value="${workspace.changes.util.tr}" />
-            </manifest>
-        </jar>
+    <target name="installer-windows" depends="clean, preppkg-windows-only, util-list-changes, izpack-patches, utility-jars" >
 	<izpack input="${basedir}/installer/install.xml" output="${basedir}/install.jar" installerType="standard" basedir="${basedir}" />
         <ant target="installerexe" />
         <delete file="${basedir}/install.jar" />
@@ -1388,7 +1361,7 @@
 <!--
     <target name="release" depends="distclean, updaterWithJettyFixesAndJbigi , updater200WithJettyFixes, preppkg, installer, getReleaseNumber" >
 -->
-    <target name="release" depends="verifyReleaseBuildNumbers, distclean, testscripts, updaterRepack, updater200, preppkgRepack, installer" >
+    <target name="release" depends="verifyReleaseBuildNumbers, distclean, testscripts, updaterWithJettyRepack, updater200WithJetty, preppkgRepack, installer-nowindows, installer-windows" >
         <echo message="================================================================" />
         <echo message="Did you update these files?" />
         <exec executable="ls" failonerror="true">
@@ -1407,7 +1380,8 @@
 
         <echo message="New version number is ${release.number}" />
         <copy file="i2pupdate.zip" tofile="i2pupdate_${release.number}.zip" />
-        <copy file="i2pinstall.exe" tofile="i2pinstall_${release.number}.exe" />
+        <copy file="i2pinstall_${full.version}_windows-only.exe" tofile="i2pinstall_${release.number}.exe" />
+        <copy file="i2pinstall_${full.version}.jar" tofile="i2pinstall_${release.number}.jar" />
         <delete file="i2pupdate.sud" />
         <delete file="i2pupdate.su2" />
         <!-- make this a lot easier by putting release.privkey=/path/to/privkey in override.properties -->
@@ -1506,12 +1480,17 @@
         </exec>
         <echo message="Sign the files:" />
         <delete file="i2pinstall_${release.number}.exe.sig" />
+        <delete file="i2pinstall_${release.number}.jar.sig" />
         <delete file="i2psource_${release.number}.tar.bz2.sig" />
         <delete file="i2pupdate_${release.number}.zip.sig" />
         <exec executable="gpg" failonerror="true">
             <arg value="-b" />
             <arg value="i2pinstall_${release.number}.exe" />
         </exec>
+        <exec executable="gpg" failonerror="true">
+            <arg value="-b" />
+            <arg value="i2pinstall_${release.number}.jar" />
+        </exec>
         <exec executable="gpg" failonerror="true">
             <arg value="-b" />
             <arg value="i2psource_${release.number}.tar.bz2" />
@@ -1523,11 +1502,13 @@
         <exec executable="chmod" failonerror="true">
             <arg value="444" />
             <arg value="i2pinstall_${release.number}.exe" />
+            <arg value="i2pinstall_${release.number}.jar" />
             <arg value="i2psource_${release.number}.tar.bz2" />
             <arg value="i2pupdate_${release.number}.zip" />
             <arg value="i2pupdate.su2" />
             <arg value="i2pupdate.sud" />
             <arg value="i2pinstall_${release.number}.exe.sig" />
+            <arg value="i2pinstall_${release.number}.jar.sig" />
             <arg value="i2psource_${release.number}.tar.bz2.sig" />
             <arg value="i2pupdate_${release.number}.zip.sig" />
         </exec>
@@ -1535,17 +1516,20 @@
         <exec executable="ls" failonerror="true">
             <arg value="-l" />
             <arg value="i2pinstall_${release.number}.exe" />
+            <arg value="i2pinstall_${release.number}.jar" />
             <arg value="i2psource_${release.number}.tar.bz2" />
             <arg value="i2pupdate_${release.number}.zip" />
             <arg value="i2pupdate.su2" />
             <arg value="i2pupdate.sud" />
             <arg value="i2pinstall_${release.number}.exe.sig" />
+            <arg value="i2pinstall_${release.number}.jar.sig" />
             <arg value="i2psource_${release.number}.tar.bz2.sig" />
             <arg value="i2pupdate_${release.number}.zip.sig" />
         </exec>
         <echo message="SHA256 sums:" />
         <exec executable="sha256sum" failonerror="true">
             <arg value="i2pinstall_${release.number}.exe" />
+            <arg value="i2pinstall_${release.number}.jar" />
             <arg value="i2psource_${release.number}.tar.bz2" />
             <arg value="i2pupdate_${release.number}.zip" />
             <arg value="i2pupdate.su2" />
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java
index 55829cb5d1451911caf50d51306ece537250acfc..314f8253b06dcc852bf8a75d4271824144ceccea 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java
@@ -26,7 +26,7 @@ class FloodfillMonitorJob extends JobImpl {
     private static final int REQUEUE_DELAY = 60*60*1000;
     private static final long MIN_UPTIME = 2*60*60*1000;
     private static final long MIN_CHANGE_DELAY = 6*60*60*1000;
-    private static final int MIN_FF = 200;
+    private static final int MIN_FF = 250;
     private static final int MAX_FF = 999999;
     private static final String PROP_FLOODFILL_PARTICIPANT = "router.floodfillParticipant";
     
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
index 11b3e29d08e16a5648ab0489e0a188b978f75941..e049c0a919b9505a9c4407edefe60535fc7ddfcc 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -477,7 +477,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         boolean explicitSpecified = explicitAddressSpecified();
         boolean inboundRecent = _lastInboundReceivedOn + ALLOW_IP_CHANGE_INTERVAL > System.currentTimeMillis();
         if (_log.shouldLog(Log.INFO))
-            _log.info("External address received: " + RemoteHostId.toString(ourIP) + ":" + ourPort + " from " 
+            _log.info("External address received: " + Addresses.toString(ourIP, ourPort) + " from " 
                       + from.toBase64() + ", isValid? " + isValid + ", explicitSpecified? " + explicitSpecified 
                       + ", receivedInboundRecent? " + inboundRecent + " status " + _reachabilityStatus);
         
@@ -491,7 +491,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             // ignore them 
             if (_log.shouldLog(Log.ERROR))
                 _log.error("The router " + from.toBase64() + " told us we have an invalid IP - " 
-                           + RemoteHostId.toString(ourIP) + " port " +  ourPort + ".  Lets throw tomatoes at them");
+                           + Addresses.toString(ourIP, ourPort) + ".  Lets throw tomatoes at them");
             markUnreachable(from);
             //_context.shitlist().shitlistRouter(from, "They said we had an invalid IP", STYLE);
             return;
@@ -506,13 +506,13 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             _lastFrom = from;
             _lastOurIP = ourIP;
             _lastOurPort = ourPort;
-            if (_log.shouldLog(Log.WARN))
-                _log.warn("The router " + from.toBase64() + " told us we have a new IP - " 
-                           + RemoteHostId.toString(ourIP) + " port " +  ourPort + ".  Wait until somebody else tells us the same thing.");
+            if (_log.shouldLog(Log.INFO))
+                _log.info("The router " + from.toBase64() + " told us we have a new IP - " 
+                           + Addresses.toString(ourIP, ourPort) + ".  Wait until somebody else tells us the same thing.");
         } else {
-            if (_log.shouldLog(Log.WARN))
-                _log.warn(from.toBase64() + " and " + _lastFrom.toBase64() + " agree we have a new IP - " 
-                           + RemoteHostId.toString(ourIP) + " port " +  ourPort + ".  Changing address.");
+            if (_log.shouldLog(Log.INFO))
+                _log.info(from.toBase64() + " and " + _lastFrom.toBase64() + " agree we have a new IP - " 
+                           + Addresses.toString(ourIP, ourPort) + ".  Changing address.");
             _lastFrom = from;
             _lastOurIP = ourIP;
             _lastOurPort = ourPort;
@@ -530,11 +530,11 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         boolean updated = false;
         boolean fireTest = false;
 
-        if (_log.shouldLog(Log.WARN))
-            _log.warn("Change address? status = " + _reachabilityStatus +
+        if (_log.shouldLog(Log.INFO))
+            _log.info("Change address? status = " + _reachabilityStatus +
                       " diff = " + (_context.clock().now() - _reachabilityStatusLastUpdated) +
                       " old = " + _externalListenHost + ':' + _externalListenPort +
-                      " new = " + RemoteHostId.toString(ourIP) + ':' + ourPort);
+                      " new = " + Addresses.toString(ourIP, ourPort));
 
             synchronized (this) {
                 if ( (_externalListenHost == null) ||
@@ -544,13 +544,14 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
                     //     (_externalListenHost == null) || (_externalListenPort <= 0) ||
                     //     (_context.clock().now() - _reachabilityStatusLastUpdated > 2*TEST_FREQUENCY) ) {
                         // they told us something different and our tests are either old or failing
-                        if (_log.shouldLog(Log.WARN))
-                            _log.warn("Trying to change our external address...");
                         try {
                             _externalListenHost = InetAddress.getByAddress(ourIP);
                             // fixed port defaults to true so we never do this
                             if (ourPort >= MIN_EXTERNAL_PORT && !fixedPort)
                                 _externalListenPort = ourPort;
+                            if (_log.shouldLog(Log.WARN))
+                                _log.warn("Trying to change our external address to " +
+                                          Addresses.toString(ourIP, _externalListenPort));
                             if (_externalListenPort > 0)  {
                                 rebuildExternalAddress();
                                 replaceAddress(_externalAddress);
@@ -559,7 +560,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
                         } catch (UnknownHostException uhe) {
                             _externalListenHost = null;
                             if (_log.shouldLog(Log.WARN))
-                                _log.warn("Error trying to change our external address", uhe);
+                                _log.warn("Error trying to change our external address to " +
+                                          Addresses.toString(ourIP, ourPort), uhe);
                         }
                     //} else {
                     //    // they told us something different, but our tests are recent and positive,