diff --git a/README.txt b/README.txt
index 6c1e22f177e0b71e3b44ed2e0e38a29d3125c50e..683ef2da1774c5e0fc70c3d33a5d106f4f1393ad 100644
--- a/README.txt
+++ b/README.txt
@@ -39,6 +39,9 @@ The i2p source must be installed in ../i2p.i2p
 ../android-sdk-linux_86/tools/emulator -avd i2p &
 
 # or to talk to a real phone in debug mode:
+# You have to do this if you get a permission error -
+# Stop ddms, unplug the phone, do the following,
+# then plug in the phone, then start ddms
 adb kill-server
 sudo adb start-server
 adb devices
diff --git a/res/raw/i2ptunnel_config b/res/raw/i2ptunnel_config
index 378a6277c574f0003bfb612522938e5167bec3f7..cd9c662970e59e24f2238368b01bbbb949b9b153 100644
--- a/res/raw/i2ptunnel_config
+++ b/res/raw/i2ptunnel_config
@@ -2,14 +2,14 @@
 tunnel.0.name=I2P HTTP Proxy
 tunnel.0.description=HTTP proxy for browsing eepsites and the web
 tunnel.0.type=httpclient
-tunnel.0.sharedClient=true
+tunnel.0.sharedClient=false
 tunnel.0.interface=127.0.0.1
 tunnel.0.listenPort=4444
 tunnel.0.proxyList=false.i2p
 tunnel.0.i2cpHost=127.0.0.1
 tunnel.0.i2cpPort=7654
-tunnel.0.option.inbound.nickname=shared clients
-tunnel.0.option.outbound.nickname=shared clients
+tunnel.0.option.inbound.nickname=HTTP Proxy
+tunnel.0.option.outbound.nickname=HTTP Proxy
 #tunnel.0.option.i2cp.delayOpen=true
 tunnel.0.option.i2cp.reduceIdleTime=600000
 tunnel.0.option.i2cp.reduceOnIdle=true
@@ -25,7 +25,7 @@ tunnel.0.startOnLoad=true
 tunnel.1.name=IRC Proxy
 tunnel.1.description=IRC proxy to access anonymous IRC servers
 tunnel.1.type=ircclient
-tunnel.1.sharedClient=true
+tunnel.1.sharedClient=false
 tunnel.1.interface=127.0.0.1
 tunnel.1.listenPort=6668
 tunnel.1.targetDestination=irc.postman.i2p,irc.freshcoffee.i2p
diff --git a/res/raw/logger_config b/res/raw/logger_config
index 86651d8807093bf38f118a7f83b4fa8b746e5404..e87fa2b5d62488267708f0a208f7bf743bce228f 100644
--- a/res/raw/logger_config
+++ b/res/raw/logger_config
@@ -1,8 +1,17 @@
+logger.dateFormat=MM/dd HH:mm:ss.SSS
 logger.defaultLevel=INFO
-logger.record.net.i2p.router.peerManager.ProfileOrganizer=WARN
+logger.displayOnScreen=true
+logger.logFileSize=64k
+logger.logRotationLimit=2
+logger.minimumOnScreenLevel=WARN
+logger.record.net.i2p.router.networkdb=WARN
+logger.record.net.i2p.router.peermanager=WARN
+logger.record.net.i2p.router.peermanager.ProfileOrganizer=WARN
 logger.record.net.i2p.router.transport=WARN
 logger.record.net.i2p.router.transport.FIFOBandwidthRefiller=ERROR
+logger.record.net.i2p.router.tunnel=WARN
 logger.record.net.i2p.stat.Rate=ERROR
 logger.record.net.i2p.util.LogManager=WARN
 logger.record.net.i2p.util.LogWriter=WARN
 logger.record.net.i2p.util.NativeBigInteger=DEBUG
+logger.record.net.org.cybergarage.util.debug=DEBUG
diff --git a/res/raw/router_config b/res/raw/router_config
index a48e139e0bb56297bdb128ec12bd9b8b47cef1db..b448224c28b6e19df2b29e7959e6d9cfb7da6803 100644
--- a/res/raw/router_config
+++ b/res/raw/router_config
@@ -37,7 +37,7 @@ i2np.bandwidth.outboundKBytesPerSecond=30
 # NTCP
 #
 #i2np.ntcp.enable=false
-i2np.ntcp.maxConnections=12
+i2np.ntcp.maxConnections=24
 #
 # UDP disabled for now
 #
@@ -48,5 +48,5 @@ i2np.udp.maxConnections=12
 #i2p.vmCommSystem=true
 #
 # not on android
-i2np.upnp.enable=false
+i2np.upnp.enable=true
 routerconsole.geoip.enable=false
diff --git a/src/net/i2p/android/router/receiver/I2PReceiver.java b/src/net/i2p/android/router/receiver/I2PReceiver.java
index 307ff8ee3e56c0eebf3bcc81f272e1103224aae2..6a9c2186163f0d91a5b074a87182c24594bd3986 100644
--- a/src/net/i2p/android/router/receiver/I2PReceiver.java
+++ b/src/net/i2p/android/router/receiver/I2PReceiver.java
@@ -8,6 +8,7 @@ import android.content.IntentFilter;
 import android.content.ServiceConnection;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
+import android.os.Build;
 import android.os.IBinder;
 
 import net.i2p.android.router.binder.RouterBinder;
@@ -20,6 +21,7 @@ public class I2PReceiver extends BroadcastReceiver {
     private int _unconnectedCount;
     private RouterService _routerService;
     private ServiceConnection _connection;
+    private static final boolean _isEmulator = Build.MODEL.equals("sdk");
 
     /**
      *  Registers itself
@@ -78,6 +80,9 @@ public class I2PReceiver extends BroadcastReceiver {
     }
 
     public boolean isConnected() {
+        // emulator always returns null NetworkInfo
+        if (_isEmulator)
+            return true;
         NetworkInfo current = getInfo();
         return current != null && current.isConnected();
     }
diff --git a/src/net/i2p/android/router/service/Init.java b/src/net/i2p/android/router/service/Init.java
index 7eb98ef5b464e61281359f072318909dae937c7a..4c95a49527bb54db454fe1c08efe4a0a1319b4f3 100644
--- a/src/net/i2p/android/router/service/Init.java
+++ b/src/net/i2p/android/router/service/Init.java
@@ -83,6 +83,8 @@ class Init {
         mergeResourceToFile(R.raw.hosts_txt, "hosts.txt", null);
         copyResourceToFile(R.raw.blocklist_txt, "blocklist.txt");
 
+        (new File(myDir, "wrapper.log")).delete();
+
         // Set up the locations so Router and WorkingDir can find them
         System.setProperty("i2p.dir.base", myDir);
         System.setProperty("i2p.dir.config", myDir);
diff --git a/src/net/i2p/android/router/service/LoadClientsJob.java b/src/net/i2p/android/router/service/LoadClientsJob.java
index e74bf744e787e7ab4879641518f75a0dd28262fe..d680e804573615fa789eb7fffb1e2c1e1403ff5a 100644
--- a/src/net/i2p/android/router/service/LoadClientsJob.java
+++ b/src/net/i2p/android/router/service/LoadClientsJob.java
@@ -30,8 +30,8 @@ class LoadClientsJob extends JobImpl {
     
     private Thread _fetcherThread;
 
-    /** this is the delay to load the clients. There are additional delays e.g. in i2ptunnel.config */
-    private static final long LOAD_DELAY = 10*1000;
+    /** this is the delay to load (and start) the clients. */
+    private static final long LOAD_DELAY = 2*60*1000;
 
 
     public LoadClientsJob(RouterContext ctx) {
@@ -62,8 +62,9 @@ class LoadClientsJob extends JobImpl {
 
         public void runJob() {
             System.err.println("Starting i2ptunnel");
-            TunnelControllerGroup.main(null);
-            System.err.println("i2ptunnel started");
+            TunnelControllerGroup tcg = TunnelControllerGroup.getInstance();
+            int sz = tcg.getControllers().size();
+            System.err.println("i2ptunnel started " + sz + " clients");
             getContext().addShutdownTask(new I2PTunnelShutdownHook());
 
         }
@@ -74,7 +75,6 @@ class LoadClientsJob extends JobImpl {
             System.err.println("i2ptunnel shutdown hook");
             if (_fetcherThread != null)
                 _fetcherThread.interrupt();
-            TunnelControllerGroup.getInstance().unloadControllers();
         }
     }
 }
diff --git a/src/net/i2p/android/router/service/RouterService.java b/src/net/i2p/android/router/service/RouterService.java
index c34888442cd0bcbf330f4e3fb4d9ffa66856cab9..ae3f830ace8ccf7a3f2088ba0ed7759df8af0858 100644
--- a/src/net/i2p/android/router/service/RouterService.java
+++ b/src/net/i2p/android/router/service/RouterService.java
@@ -47,6 +47,7 @@ public class RouterService extends Service {
         System.err.println(this + " onCreate called" +
                            " Current state is: " + _state);
 
+        (new File(getFilesDir(), "wrapper.log")).delete();
         _myDir = getFilesDir().getAbsolutePath();
         Init init = new Init(this);
         init.debugStuff();
@@ -138,17 +139,16 @@ public class RouterService extends Service {
         }
     }
 
+    /** TODO change to a handler */
     private class StatusThread implements Runnable {
         public void run() {
             System.err.println(MARKER + this + " status thread started" +
                                " Current state is: " + _state);
+            try {
+                Thread.sleep(5*1000);
+            } catch (InterruptedException ie) {}
             Router router = _context.router();
             while (_state == State.RUNNING && router.isAlive()) {
-                try {
-                    Thread.sleep(15*1000);
-                } catch (InterruptedException ie) {
-                    break;
-                }
                 int active = _context.commSystem().countActivePeers();
                 int known = Math.max(_context.netDb().getKnownRouters() - 1, 0);
                 int inEx = _context.tunnelManager().getFreeTunnelCount();
@@ -186,8 +186,12 @@ public class RouterService extends Service {
                        " Up " + uptime;
 
                 _statusBar.update(status, details);
+                try {
+                    Thread.sleep(15*1000);
+                } catch (InterruptedException ie) {
+                    break;
+                }
             }
-            _statusBar.update("Status thread died");
             System.err.println(MARKER + this + " status thread finished" +
                                " Current state is: " + _state);
         }
diff --git a/src/net/i2p/util/LogWriter.java b/src/net/i2p/util/LogWriter.java
index 8de25019946723394aeac3a320c9e27b822ed96c..be06b7c0c96c4f2723ebe2198cd687f0bec83968 100644
--- a/src/net/i2p/util/LogWriter.java
+++ b/src/net/i2p/util/LogWriter.java
@@ -45,7 +45,8 @@ class LogWriter implements Runnable {
         try {
             while (_write) {
                 flushRecords();
-                rereadConfig();
+                if (_write)
+                    rereadConfig();
             }
         } catch (Exception e) {
             System.err.println("Error writing the logs: " + e.getMessage());
@@ -103,6 +104,14 @@ class LogWriter implements Runnable {
             log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage());
         else
             log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage(), rec.getThrowable());
+
+        // we always add to the console buffer, but only sometimes write to stdout
+        if (_manager.getDisplayOnScreenLevel() <= rec.getPriority()) {
+            if (_manager.displayOnScreen()) {
+                // android log already does time stamps, so reformat without the date
+                System.out.print(LogRecordFormatter.formatRecord(_manager, rec, false));
+            }
+        }
     }
 
     public void log(int priority, Class src, String name, String threadName, String msg) {