diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java
index 38d9b2074ef801a6f4306f3f852c701b0669175f..0ddcd58a9dfad23964665658e7cd3f9fc83d425b 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java
@@ -3,6 +3,7 @@ package net.i2p.router.web;
 import net.i2p.data.RouterInfo;
 import net.i2p.router.LoadTestManager;
 import net.i2p.router.Router;
+import net.i2p.router.transport.FIFOBandwidthRefiller;
 import net.i2p.router.transport.udp.UDPTransport;
 import net.i2p.router.web.ConfigServiceHandler.UpdateWrapperManagerAndRekeyTask;
 import net.i2p.time.Timestamper;
@@ -110,26 +111,6 @@ public class ConfigNetHandler extends FormHandler {
         boolean restartRequired = false;
         
         if (!_ratesOnly) {
-            if ( (_hostname != null) && (_hostname.length() > 0) ) {
-                String oldHost = _context.router().getConfigSetting(ConfigNetHelper.PROP_I2NP_TCP_HOSTNAME);
-                if ( (oldHost == null) || (!oldHost.equalsIgnoreCase(_hostname)) ) {
-                    _context.router().setConfigSetting(ConfigNetHelper.PROP_I2NP_TCP_HOSTNAME, _hostname);
-                    addFormNotice("Updating hostname from " + oldHost + " to " + _hostname);
-                    restartRequired = true;
-                }
-            }
-            if ( (_tcpPort != null) && (_tcpPort.length() > 0) ) {
-                String oldPort = _context.router().getConfigSetting(ConfigNetHelper.PROP_I2NP_TCP_PORT);
-                if ( (oldPort == null) && (_tcpPort.equals("8887")) ) {
-                    // still on default.. noop
-                } else if ( (oldPort == null) || (!oldPort.equalsIgnoreCase(_tcpPort)) ) {
-                    // its not the default OR it has changed
-                    _context.router().setConfigSetting(ConfigNetHelper.PROP_I2NP_TCP_PORT, _tcpPort);
-                    addFormNotice("Updating TCP port from " + oldPort + " to " + _tcpPort);
-                    restartRequired = true;
-                }
-            }
-            
             // Normalize some things to make the following code a little easier...
             String oldNHost = _context.router().getConfigSetting(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME);
             if (oldNHost == null) oldNHost = "";
@@ -181,7 +162,7 @@ public class ConfigNetHandler extends FormHandler {
                     // still on default.. noop
                 } else if ( (oldPort == null) || (!oldPort.equalsIgnoreCase(_udpPort)) ) {
                     // its not the default OR it has changed
-                    _context.router().setConfigSetting(ConfigNetHelper.PROP_I2NP_TCP_PORT, _udpPort);
+                    _context.router().setConfigSetting(ConfigNetHelper.PROP_I2NP_UDP_PORT, _udpPort);
                     addFormNotice("Updating UDP port from " + oldPort + " to " + _udpPort);
                     restartRequired = true;
                 }
@@ -193,9 +174,9 @@ public class ConfigNetHandler extends FormHandler {
         
         if (!_ratesOnly) {
             if (_sharePct != null) {
-                String old = _context.router().getConfigSetting(ConfigNetHelper.PROP_SHARE_PERCENTAGE);
+                String old = _context.router().getConfigSetting(Router.PROP_BANDWIDTH_SHARE_PERCENTAGE);
                 if ( (old == null) || (!old.equalsIgnoreCase(_sharePct)) ) {
-                    _context.router().setConfigSetting(ConfigNetHelper.PROP_SHARE_PERCENTAGE, _sharePct);
+                    _context.router().setConfigSetting(Router.PROP_BANDWIDTH_SHARE_PERCENTAGE, _sharePct);
                     addFormNotice("Updating bandwidth share percentage");
                 }
             }
@@ -263,23 +244,23 @@ public class ConfigNetHandler extends FormHandler {
     private void updateRates() {
         boolean updated = false;
         if ( (_inboundRate != null) && (_inboundRate.length() > 0) ) {
-            _context.router().setConfigSetting(ConfigNetHelper.PROP_INBOUND_KBPS, _inboundRate);
+            _context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH, _inboundRate);
             updated = true;
         }
         if ( (_outboundRate != null) && (_outboundRate.length() > 0) ) {
-            _context.router().setConfigSetting(ConfigNetHelper.PROP_OUTBOUND_KBPS, _outboundRate);
+            _context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH, _outboundRate);
             updated = true;
         }
         if ( (_inboundBurstRate != null) && (_inboundBurstRate.length() > 0) ) {
-            _context.router().setConfigSetting(ConfigNetHelper.PROP_INBOUND_BURST_KBPS, _inboundBurstRate);
+            _context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BURST_BANDWIDTH, _inboundBurstRate);
             updated = true;
         }
         if ( (_outboundBurstRate != null) && (_outboundBurstRate.length() > 0) ) {
-            _context.router().setConfigSetting(ConfigNetHelper.PROP_OUTBOUND_BURST_KBPS, _outboundBurstRate);
+            _context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BURST_BANDWIDTH, _outboundBurstRate);
             updated = true;
         }
         
-        String inBurstRate = _context.router().getConfigSetting(ConfigNetHelper.PROP_INBOUND_BURST_KBPS);
+        String inBurstRate = _context.router().getConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BURST_BANDWIDTH);
         
         if (_inboundBurst != null) {
             int rateKBps = 0;
@@ -292,12 +273,12 @@ public class ConfigNetHandler extends FormHandler {
             }
             if ( (rateKBps > 0) && (burstSeconds > 0) ) {
                 int kb = rateKBps * burstSeconds;
-                _context.router().setConfigSetting(ConfigNetHelper.PROP_INBOUND_BURST, "" + kb);
+                _context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH_PEAK, "" + kb);
                 updated = true;
             }
         }
         
-        String outBurstRate = _context.router().getConfigSetting(ConfigNetHelper.PROP_OUTBOUND_BURST_KBPS);
+        String outBurstRate = _context.router().getConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BURST_BANDWIDTH);
         
         if (_outboundBurst != null) {
             int rateKBps = 0;
@@ -310,12 +291,13 @@ public class ConfigNetHandler extends FormHandler {
             }
             if ( (rateKBps > 0) && (burstSeconds > 0) ) {
                 int kb = rateKBps * burstSeconds;
-                _context.router().setConfigSetting(ConfigNetHelper.PROP_OUTBOUND_BURST, "" + kb);
+                _context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH_PEAK, "" + kb);
                 updated = true;
             }
         }
         
         if (updated && !_ratesOnly)
+            _context.bandwidthLimiter().reinitialize();
             addFormNotice("Updated bandwidth limits");
     }
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java
index 0b6a7b65df010d7e193642575c87f30844395fe4..b648d960753bd6e52108f11896cb2e80535510c7 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java
@@ -5,6 +5,7 @@ import net.i2p.router.CommSystemFacade;
 import net.i2p.router.LoadTestManager;
 import net.i2p.router.Router;
 import net.i2p.router.RouterContext;
+import net.i2p.router.transport.TransportManager;
 import net.i2p.router.transport.udp.UDPAddress;
 import net.i2p.router.transport.udp.UDPTransport;
 import net.i2p.time.Timestamper;
@@ -27,37 +28,23 @@ public class ConfigNetHelper {
 
     public ConfigNetHelper() {}
     
-    /** copied from various private TCP components */
-    public final static String PROP_I2NP_TCP_HOSTNAME = "i2np.tcp.hostname";
-    public final static String PROP_I2NP_TCP_PORT = "i2np.tcp.port";
+    /** 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 String getHostname() {
-        return _context.getProperty(PROP_I2NP_TCP_HOSTNAME);
-    }
-    public String getTcpPort() {
-        int port = 8887;
-        String val = _context.getProperty(PROP_I2NP_TCP_PORT);
-        if (val != null) {
-            try {
-                port = Integer.parseInt(val);
-            } catch (NumberFormatException nfe) {
-                // ignore, use default from above
-            }
-        }
-        return "" + port;
-    }
     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.autoip";
     public final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoport";
     public String getNtcphostname() {
+        if (!TransportManager.enableNTCP(_context))
+            return "\" disabled=\"true";
         String hostname = _context.getProperty(PROP_I2NP_NTCP_HOSTNAME); 
         if (hostname == null) return "";
         return hostname;
     }
     public String getNtcpport() { 
+        if (!TransportManager.enableNTCP(_context))
+            return "\" disabled=\"true";
         String port = _context.getProperty(PROP_I2NP_NTCP_PORT); 
         if (port == null) return "";
         return port;
@@ -116,6 +103,8 @@ public class ConfigNetHelper {
     }
 
     public String getTcpAutoPortChecked() {
+        if (!TransportManager.enableNTCP(_context))
+            return " disabled=\"true\" ";
         String enabled = _context.getProperty(PROP_I2NP_NTCP_AUTO_PORT, "false");
         if ( (enabled != null) && ("true".equalsIgnoreCase(enabled)) )
             return " checked ";
@@ -124,6 +113,8 @@ public class ConfigNetHelper {
     }
 
     public String getTcpAutoIPChecked() {
+        if (!TransportManager.enableNTCP(_context))
+            return " disabled=\"true\" ";
         String enabled = _context.getProperty(PROP_I2NP_NTCP_AUTO_IP, "false");
         if ( (enabled != null) && ("true".equalsIgnoreCase(enabled)) )
             return " checked ";
@@ -150,80 +141,33 @@ public class ConfigNetHelper {
         }
     }
     
-    public static final String PROP_INBOUND_KBPS = "i2np.bandwidth.inboundKBytesPerSecond";
-    public static final String PROP_OUTBOUND_KBPS = "i2np.bandwidth.outboundKBytesPerSecond";
-    public static final String PROP_INBOUND_BURST_KBPS = "i2np.bandwidth.inboundBurstKBytesPerSecond";
-    public static final String PROP_OUTBOUND_BURST_KBPS = "i2np.bandwidth.outboundBurstKBytesPerSecond";
-    public static final String PROP_INBOUND_BURST = "i2np.bandwidth.inboundBurstKBytes";
-    public static final String PROP_OUTBOUND_BURST = "i2np.bandwidth.outboundBurstKBytes";
-    public static final String PROP_SHARE_PERCENTAGE = "router.sharePercentage";
-    public static final int DEFAULT_SHARE_PERCENTAGE = 80;
-
     public String getInboundRate() {
-        String rate = _context.getProperty(PROP_INBOUND_KBPS);
-        if (rate != null)
-            return rate;
-        else
-            return "32";
+        return "" + _context.bandwidthLimiter().getInboundKBytesPerSecond();
     }
     public String getOutboundRate() {
-        String rate = _context.getProperty(PROP_OUTBOUND_KBPS);
-        if (rate != null)
-            return rate;
-        else
-            return "16";
+        return "" + _context.bandwidthLimiter().getOutboundKBytesPerSecond();
     }
     public String getInboundBurstRate() {
-        String rate = _context.getProperty(PROP_INBOUND_BURST_KBPS);
-        if (rate != null)
-            return rate;
-        else
-            return "48";
+        return "" + _context.bandwidthLimiter().getInboundBurstKBytesPerSecond();
     }
     public String getOutboundBurstRate() {
-        String rate = _context.getProperty(PROP_OUTBOUND_BURST_KBPS);
-        if (rate != null)
-            return rate;
-        else
-            return "32";
+        return "" + _context.bandwidthLimiter().getOutboundBurstKBytesPerSecond();
     }
     public String getInboundBurstFactorBox() {
-        String rate = _context.getProperty(PROP_INBOUND_BURST_KBPS);
-        String burst = _context.getProperty(PROP_INBOUND_BURST);
         int numSeconds = 1;
-        if ( (burst != null) && (rate != null) ) {
-            int rateKBps = 0;
-            int burstKB = 0;
-            try {
-                rateKBps = Integer.parseInt(rate);
-                burstKB = Integer.parseInt(burst);
-            } catch (NumberFormatException nfe) {
-                // ignore
-            }
-            if ( (rateKBps > 0) && (burstKB > 0) ) {
-                numSeconds = burstKB / rateKBps;
-            }
-        }
+        int rateKBps = _context.bandwidthLimiter().getInboundBurstKBytesPerSecond();
+        int burstKB = _context.bandwidthLimiter().getInboundBurstBytes() * 1024;
+        if ( (rateKBps > 0) && (burstKB > 0) )
+            numSeconds = burstKB / rateKBps;
         return getBurstFactor(numSeconds, "inboundburstfactor");
     }
     
     public String getOutboundBurstFactorBox() {
-        String rate = _context.getProperty(PROP_OUTBOUND_BURST_KBPS);
-        String burst = _context.getProperty(PROP_OUTBOUND_BURST);
         int numSeconds = 1;
-        if ( (burst != null) && (rate != null) ) {
-            int rateKBps = 0;
-            int burstKB = 0;
-            try {
-                rateKBps = Integer.parseInt(rate);
-                burstKB = Integer.parseInt(burst);
-            } catch (NumberFormatException nfe) {
-                // ignore
-            }
-            if ( (rateKBps > 0) && (burstKB > 0) ) {
-                numSeconds = burstKB / rateKBps;
-            }
-        }
+        int rateKBps = _context.bandwidthLimiter().getOutboundBurstKBytesPerSecond();
+        int burstKB = _context.bandwidthLimiter().getOutboundBurstBytes() * 1024;
+        if ( (rateKBps > 0) && (burstKB > 0) )
+            numSeconds = burstKB / rateKBps;
         return getBurstFactor(numSeconds, "outboundburstfactor");
     }
     
@@ -254,43 +198,36 @@ public class ConfigNetHelper {
     }
     
     public String getSharePercentageBox() {
-        String pctStr = _context.getProperty(PROP_SHARE_PERCENTAGE);
-        int pct = DEFAULT_SHARE_PERCENTAGE;
-        if (pctStr != null)
-            try { pct = Integer.parseInt(pctStr); } catch (NumberFormatException nfe) {}
+        int pct = (int) (100 * _context.router().getSharePercentage());
         StringBuffer buf = new StringBuffer(256);
         buf.append("<select name=\"sharePercentage\">\n");
         boolean found = false;
-        for (int i = 30; i <= 100; i += 10) {
-            buf.append("<option value=\"").append(i).append("\" ");
-            if (pct == i) {
+        for (int i = 30; i <= 110; i += 10) {
+            int val = i;
+            if (i == 110) {
+                if (found)
+                    break;
+                else
+                    val = pct;
+            }
+            buf.append("<option value=\"").append(val).append("\" ");
+            if (pct == val) {
                 buf.append("selected=\"true\" ");
                 found = true;
-            } else if ( (i == DEFAULT_SHARE_PERCENTAGE) && (!found) ) {
-                buf.append("selected=\"true\" ");
             }
-            buf.append(">Up to ").append(i).append("%</option>\n");
+            buf.append(">Up to ").append(val).append("%</option>\n");
         }
         buf.append("</select>\n");
         return buf.toString();
     }
 
+    public static final int DEFAULT_SHARE_KBPS = 12;
     public int getShareBandwidth() {
-        String irate = _context.getProperty(PROP_INBOUND_KBPS, "32");
-        String orate = _context.getProperty(PROP_OUTBOUND_KBPS, "16");
-        String pctStr = _context.getProperty(PROP_SHARE_PERCENTAGE, "" + DEFAULT_SHARE_PERCENTAGE);
-        if ( (irate != null) && (orate != null) && (pctStr != null)) {
-            try {
-                int irateKBps = Integer.parseInt(irate);
-                int orateKBps = Integer.parseInt(orate);
-                if (irateKBps < 0 || orateKBps < 0)
-                    return 12;
-                int pct = Integer.parseInt(pctStr);
-                return (int) (((float) pct) * Math.min(irateKBps, orateKBps) / 100);
-            } catch (NumberFormatException nfe) {
-                // ignore
-            }
-        }
-        return 12;
+        int irateKBps = _context.bandwidthLimiter().getInboundKBytesPerSecond();
+        int orateKBps = _context.bandwidthLimiter().getOutboundKBytesPerSecond();
+        double pct = _context.router().getSharePercentage();
+        if (irateKBps < 0 || orateKBps < 0)
+            return DEFAULT_SHARE_KBPS;
+        return (int) (pct * Math.min(irateKBps, orateKBps));
     }
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
index e728086be05e9dcfe4efaf72c8f98964cec45746..279650ebb758f47b72584d9856bf33473e38f9d7 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
@@ -143,6 +143,14 @@ public class SummaryHelper {
                 return "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart";
             case CommSystemFacade.STATUS_UNKNOWN: // fallthrough
             default:
+                ra = _context.router().getRouterInfo().getTargetAddress("UDP");
+                if (ra == null) {
+                    if (_context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME) == null ||
+                        _context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_PORT) == null)
+                        return "ERR-UDP Disabled and Inbound TCP host/port not set";
+                    else
+                        return "WARN-Firewalled with UDP Disabled";
+                }
                 return "Testing";
         }
     }
diff --git a/apps/routerconsole/jsp/config.jsp b/apps/routerconsole/jsp/config.jsp
index 058229b2af0643b36da19ab267b566204e37d3b6..0d9573fe6c01a29774160ac96dd6daf2c6453f53 100644
--- a/apps/routerconsole/jsp/config.jsp
+++ b/apps/routerconsole/jsp/config.jsp
@@ -40,8 +40,7 @@
     <input name="outboundburstrate" type="text" size="2" value="<jsp:getProperty name="nethelper" property="outboundBurstRate" />" /> KBps for
   <jsp:getProperty name="nethelper" property="outboundBurstFactorBox" /><br />
  <i>KBps = kilobytes per second = 1024 bytes per second = 8192 bits per second.<br />
-    A negative inbound rate means a default limit of 32KBytes per second.
-    A negative outbound rate means a default limit of 16KBytes per second.</i><br />
+    A negative rate sets the default.</i><br />
  Bandwidth share percentage:
    <jsp:getProperty name="nethelper" property="sharePercentageBox" /><br />
  <% int share = nethelper.getShareBandwidth();
@@ -130,6 +129,11 @@
      your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well.
      If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact
      you via TCP, which will hurt the network. Please open your firewall or disable inbound TCP above.
+ <li><b>WARN - Firewalled with UDP Disabled</b> -
+     You have configured inbound TCP, however
+     you have disabled UDP. You appear to be firewalled on TCP, therefore your router cannot
+     accept inbound connections.
+     Please open your firewall or enable UDP.
  <li><b>ERR - Clock Skew</b> - Your system's clock is skewed, which will make it difficult
      to participate in the network. Correct your clock setting if this error persists.
  <li><b>ERR - Private TCP Address</b> - You must never advertise an unroutable IP address such as
@@ -141,6 +145,10 @@
      Check to see if another program is using port 8887. If so, stop that program or configure
      I2P to use a different port. This may be a transient error, if the other program is no longer
      using the port. However, a restart is always required after this error.
+ <li><b>ERR - UDP Disabled and Inbound TCP host/port not set</b> -
+     You have not configured inbound TCP with a hostname and port above, however
+     you have disabled UDP. Therefore your router cannot accept inbound connections.
+     Please configure a TCP host and port above or enable UDP.
  </ul>
  </p>
  <hr />
diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java
index 98fb1fccdef33c435f15a3979f822265c81467e9..40ecc31be43e738326689ad22277db1f790991d7 100644
--- a/router/java/src/net/i2p/router/Router.java
+++ b/router/java/src/net/i2p/router/Router.java
@@ -1072,11 +1072,13 @@ public class Router {
         return true;
     }
     
-    private static final String PROP_BANDWIDTH_SHARE_PERCENTAGE = "router.sharePercentage";
+    public static final String PROP_BANDWIDTH_SHARE_PERCENTAGE = "router.sharePercentage";
+    public static final int DEFAULT_SHARE_PERCENTAGE = 80;
     
     /** 
      * What fraction of the bandwidth specified in our bandwidth limits should
      * we allow to be consumed by participating tunnels?
+     * @returns a number less than one, not a percentage!
      *
      */
     public double getSharePercentage() {
@@ -1095,7 +1097,7 @@ public class Router {
                     _log.info("Unable to get the share percentage");
             }
         }
-        return 0.8;
+        return DEFAULT_SHARE_PERCENTAGE / 100.0d;
     }
 
     public int get1sRate() { return get1sRate(false); }
diff --git a/router/java/src/net/i2p/router/RouterThrottleImpl.java b/router/java/src/net/i2p/router/RouterThrottleImpl.java
index 61d83f30e10dd4185ac435d44d27dbfda9694689..2c3f2114e58836880aff3f843c9c35162ea6875b 100644
--- a/router/java/src/net/i2p/router/RouterThrottleImpl.java
+++ b/router/java/src/net/i2p/router/RouterThrottleImpl.java
@@ -411,7 +411,10 @@ class RouterThrottleImpl implements RouterThrottle {
     }
     
     public long getMessageDelay() {
-        Rate delayRate = _context.statManager().getRate("transport.sendProcessingTime").getRate(60*1000);
+        RateStat rs = _context.statManager().getRate("transport.sendProcessingTime");
+        if (rs == null)
+            return 0;
+        Rate delayRate = rs.getRate(60*1000);
         return (long)delayRate.getAverageValue();
     }
     
@@ -422,6 +425,8 @@ class RouterThrottleImpl implements RouterThrottle {
     
     public double getInboundRateDelta() {
         RateStat receiveRate = _context.statManager().getRate("transport.sendMessageSize");
+        if (receiveRate == null)
+            return 0;
         double nowBps = getBps(receiveRate.getRate(60*1000));
         double fiveMinBps = getBps(receiveRate.getRate(5*60*1000));
         double hourBps = getBps(receiveRate.getRate(60*60*1000));
diff --git a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java
index 0a51e754d0838ae353aab5a5dde246aa0e9a7780..86ba394e4b27f7436fd81f4dca39bb3d75384795 100644
--- a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java
+++ b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java
@@ -107,8 +107,11 @@ public class FIFOBandwidthLimiter {
     public float getSendBps15s() { return _sendBps15s; }
     public float getReceiveBps15s() { return _recvBps15s; }
     
+    /** These are the configured maximums, not the current rate */
     public int getOutboundKBytesPerSecond() { return _refiller.getOutboundKBytesPerSecond(); } 
     public int getInboundKBytesPerSecond() { return _refiller.getInboundKBytesPerSecond(); } 
+    public int getOutboundBurstKBytesPerSecond() { return _refiller.getOutboundBurstKBytesPerSecond(); } 
+    public int getInboundBurstKBytesPerSecond() { return _refiller.getInboundBurstKBytesPerSecond(); } 
     
     public void reinitialize() {
         _pendingInboundRequests.clear();
@@ -191,8 +194,8 @@ public class FIFOBandwidthLimiter {
     void setOutboundBurstKBps(int kbytesPerSecond) {
         _maxOutbound = kbytesPerSecond * 1024;
     }
-    int getInboundBurstBytes() { return _maxInboundBurst; }
-    int getOutboundBurstBytes() { return _maxOutboundBurst; }
+    public int getInboundBurstBytes() { return _maxInboundBurst; }
+    public int getOutboundBurstBytes() { return _maxOutboundBurst; }
     void setInboundBurstBytes(int bytes) { _maxInboundBurst = bytes; }
     void setOutboundBurstBytes(int bytes) { _maxOutboundBurst = bytes; }
     
diff --git a/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java b/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java
index 6a116126ebd60f4113891c24de1bfacb298ad181..0210f8da5266113cae7a0bbb483fb37069d7b2ac 100644
--- a/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java
+++ b/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java
@@ -6,7 +6,7 @@ import java.util.List;
 import net.i2p.I2PAppContext;
 import net.i2p.util.Log;
 
-class FIFOBandwidthRefiller implements Runnable {
+public class FIFOBandwidthRefiller implements Runnable {
     private Log _log;
     private I2PAppContext _context;
     private FIFOBandwidthLimiter _limiter;
@@ -34,9 +34,9 @@ class FIFOBandwidthRefiller implements Runnable {
     //public static final String PROP_REPLENISH_FREQUENCY = "i2np.bandwidth.replenishFrequencyMs";
 
     // no longer allow unlimited bandwidth - the user must specify a value, and if they do not, it is 32/16KBps
-    public static final int DEFAULT_INBOUND_BANDWIDTH = 32;
-    public static final int DEFAULT_OUTBOUND_BANDWIDTH = 16;
-    public static final int DEFAULT_INBOUND_BURST_BANDWIDTH = 48;
+    public static final int DEFAULT_INBOUND_BANDWIDTH = 48;
+    public static final int DEFAULT_OUTBOUND_BANDWIDTH = 24;
+    public static final int DEFAULT_INBOUND_BURST_BANDWIDTH = 64;
     public static final int DEFAULT_OUTBOUND_BURST_BANDWIDTH = 32;
 
     public static final int DEFAULT_BURST_SECONDS = 60;
@@ -217,10 +217,10 @@ class FIFOBandwidthRefiller implements Runnable {
             // bandwidth was specified *and* changed
             try {
                 int in = Integer.parseInt(inBwStr);
-                if ( (in <= 0) || (in > MIN_INBOUND_BANDWIDTH) ) 
+                if ( (in <= 0) || (in >= _inboundKBytesPerSecond) ) 
                     _inboundBurstKBytesPerSecond = in;
                 else
-                    _inboundBurstKBytesPerSecond = MIN_INBOUND_BANDWIDTH;
+                    _inboundBurstKBytesPerSecond = _inboundKBytesPerSecond;
                 if (_log.shouldLog(Log.DEBUG))
                     _log.debug("Updating inbound burst rate to " + _inboundBurstKBytesPerSecond);
             } catch (NumberFormatException nfe) {
@@ -247,10 +247,10 @@ class FIFOBandwidthRefiller implements Runnable {
             // bandwidth was specified *and* changed
             try {
                 int out = Integer.parseInt(outBwStr);
-                if ( (out <= 0) || (out >= MIN_OUTBOUND_BANDWIDTH) )
+                if ( (out <= 0) || (out >= _outboundKBytesPerSecond) )
                     _outboundBurstKBytesPerSecond = out;
                 else
-                    _outboundBurstKBytesPerSecond = MIN_OUTBOUND_BANDWIDTH;
+                    _outboundBurstKBytesPerSecond = _outboundKBytesPerSecond;
                 if (_log.shouldLog(Log.DEBUG))
                     _log.debug("Updating outbound burst rate to " + _outboundBurstKBytesPerSecond);
             } catch (NumberFormatException nfe) {
@@ -335,4 +335,6 @@ class FIFOBandwidthRefiller implements Runnable {
     
     int getOutboundKBytesPerSecond() { return _outboundKBytesPerSecond; } 
     int getInboundKBytesPerSecond() { return _inboundKBytesPerSecond; } 
+    int getOutboundBurstKBytesPerSecond() { return _outboundBurstKBytesPerSecond; } 
+    int getInboundBurstKBytesPerSecond() { return _inboundBurstKBytesPerSecond; } 
 }
diff --git a/router/java/src/net/i2p/router/transport/TransportManager.java b/router/java/src/net/i2p/router/transport/TransportManager.java
index 5979961bb9ac430f3eaaa9113c8e4291134c9ef6..3d49780c3eeb6456f82391e5f7efa5c141142b32 100644
--- a/router/java/src/net/i2p/router/transport/TransportManager.java
+++ b/router/java/src/net/i2p/router/transport/TransportManager.java
@@ -36,7 +36,6 @@ public class TransportManager implements TransportEventListener {
     private List _transports;
     private RouterContext _context;
 
-    private final static String PROP_DISABLE_TCP = "i2np.tcp.disable";
     private final static String PROP_ENABLE_UDP = "i2np.udp.enable";
     private final static String PROP_ENABLE_NTCP = "i2np.ntcp.enable";
     private final static String DEFAULT_ENABLE_NTCP = "true";
@@ -66,8 +65,6 @@ public class TransportManager implements TransportEventListener {
         transport.setListener(null);
     }
 
-    static final boolean ALLOW_TCP = false;
-    
     private void configTransports() {
         String enableUDP = _context.router().getConfigSetting(PROP_ENABLE_UDP);
         if (enableUDP == null)
@@ -77,13 +74,16 @@ public class TransportManager implements TransportEventListener {
             udp.setListener(this);
             _transports.add(udp);
         }
-        enableNTCP(_context);
-        NTCPTransport ntcp = new NTCPTransport(_context);
-        ntcp.setListener(this);
-        _transports.add(ntcp);
+        if (enableNTCP(_context)) {
+            NTCPTransport ntcp = new NTCPTransport(_context);
+            ntcp.setListener(this);
+            _transports.add(ntcp);
+        }
+        if (_transports.size() <= 0)
+            _log.log(Log.CRIT, "No transports are enabled");
     }
     
-    static boolean enableNTCP(RouterContext ctx) {
+    public static boolean enableNTCP(RouterContext ctx) {
         String enableNTCP = ctx.router().getConfigSetting(PROP_ENABLE_NTCP);
         if (enableNTCP == null)
             enableNTCP = DEFAULT_ENABLE_NTCP;