diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e1fbe15a77c96fef505ee39ddc07b2eba9e0ca22..d4a86d9cb750565370c0fcb1b230359a1d146381 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -67,6 +67,7 @@
         </activity>
         <activity android:name=".activity.PeersActivity"
                   android:label="I2P Peers and Transport Status"
+                  android:configChanges="orientation|keyboardHidden"
                   android.theme="@android:style/Theme.NoTitleBar"
                   android:launchMode="singleTop" >
         </activity>
diff --git a/build.xml b/build.xml
index 7cc7aec234ed9a35ff779880bd6bbd0fec567eb7..2ce91e8318d703a455e591a048045b6e5cf6e47b 100644
--- a/build.xml
+++ b/build.xml
@@ -165,6 +165,8 @@
         <copy file="LICENSE.txt" tofile="res/raw/license_app_txt" />
         <copy file="licenses/LICENSE-Apache2.0.txt" tofile="res/raw/license_apache20_txt" />
         <copy file="${i2pbase}/installer/resources/themes/console/images/i2plogo.png" todir="res/drawable/" />
+        <copy file="${i2pbase}/installer/resources/themes/console/images/outbound.png" todir="res/drawable/" />
+        <copy file="${i2pbase}/installer/resources/themes/console/images/inbound.png" todir="res/drawable/" />
         <copy file="${i2pbase}/installer/resources/themes/console/light/images/header.png" todir="res/drawable/" />
         <copy file="${i2pbase}/installer/resources/themes/console/light/console.css" tofile="res/raw/console_css" />
         <copy file="${i2pbase}/installer/resources/blocklist.txt" tofile="res/raw/blocklist_txt" />
@@ -210,6 +212,8 @@
     <target name="distclean" depends="clean">
         <delete dir="${jar.libs.dir}" verbose="${verbose}" />
         <delete file="res/drawable/i2plogo.png" verbose="${verbose}"/>
+        <delete file="res/drawable/outbound.png" verbose="${verbose}"/>
+        <delete file="res/drawable/inbound.png" verbose="${verbose}"/>
         <delete file="res/drawable/header.png" verbose="${verbose}"/>
         <delete file="res/raw/console_css" verbose="${verbose}"/>
         <delete file="res/raw/blocklist_txt" verbose="${verbose}" />
diff --git a/res/drawable/ic_launcher_itoopie_120.png b/res/drawable/ic_launcher_itoopie_120.png
new file mode 100644
index 0000000000000000000000000000000000000000..c58050aa3959772b4af6d3ab2301281b52bd69ae
Binary files /dev/null and b/res/drawable/ic_launcher_itoopie_120.png differ
diff --git a/res/drawable/ic_launcher_itoopie_150.png b/res/drawable/ic_launcher_itoopie_150.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ac17ab32d977f36bb13fb70066e9752dcfe6f15
Binary files /dev/null and b/res/drawable/ic_launcher_itoopie_150.png differ
diff --git a/res/drawable/ic_launcher_itoopie_180.png b/res/drawable/ic_launcher_itoopie_180.png
new file mode 100644
index 0000000000000000000000000000000000000000..b8087a5e0afa4612f7ae48a459230993580a101c
Binary files /dev/null and b/res/drawable/ic_launcher_itoopie_180.png differ
diff --git a/res/drawable/ic_launcher_itoopie_300.png b/res/drawable/ic_launcher_itoopie_300.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5c291314014bbb0396d27b68792e9fbc0bc91ae
Binary files /dev/null and b/res/drawable/ic_launcher_itoopie_300.png differ
diff --git a/res/drawable/ic_launcher_itoopie_330.png b/res/drawable/ic_launcher_itoopie_330.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6c393b251bb12d75a9817c4f2be19f925328e92
Binary files /dev/null and b/res/drawable/ic_launcher_itoopie_330.png differ
diff --git a/res/raw/logger_config b/res/raw/logger_config
index b83d079e0dc8938ea4a30da412e141f9c281f4d8..13b9d615425468cb61e8d598ebcf3565ce16509a 100644
--- a/res/raw/logger_config
+++ b/res/raw/logger_config
@@ -1,13 +1,13 @@
 logger.consoleBufferSize=250
 logger.dateFormat=MM/dd HH:mm:ss.SSS
-logger.defaultLevel=INFO
+logger.defaultLevel=WARN
 logger.displayOnScreen=true
 logger.logFileSize=64k
 logger.logRotationLimit=2
 logger.minimumOnScreenLevel=WARN
 logger.record.net.i2p.crypto=WARN
 logger.record.net.i2p.router.InNetMessagePool=WARN
-logger.record.net.i2p.router.Router=INFO
+logger.record.net.i2p.router.Router=WARN
 logger.record.net.i2p.router.Shitlist=WARN
 logger.record.net.i2p.router.networkdb=WARN
 logger.record.net.i2p.router.peermanager=WARN
@@ -19,5 +19,5 @@ logger.record.net.i2p.stat.Rate=ERROR
 logger.record.net.i2p.util.I2PThread=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.i2p.util.NativeBigInteger=ERROR
 logger.record.net.org.cybergarage.util.Debug=DEBUG
diff --git a/src/net/i2p/android/router/activity/I2PActivityBase.java b/src/net/i2p/android/router/activity/I2PActivityBase.java
index 7b1ad7e1294b8bd23ddf3e9935034f2ca42940a3..e56dc41c02c7c0be35f200b4dc786d3ee6cab7d0 100644
--- a/src/net/i2p/android/router/activity/I2PActivityBase.java
+++ b/src/net/i2p/android/router/activity/I2PActivityBase.java
@@ -41,7 +41,7 @@ public abstract class I2PActivityBase extends Activity {
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
-        System.err.println(this + " onCreate called");
+        Util.i(this + " onCreate called");
         super.onCreate(savedInstanceState);
         _myDir = getFilesDir().getAbsolutePath();
     }
@@ -49,14 +49,14 @@ public abstract class I2PActivityBase extends Activity {
     @Override
     public void onRestart()
     {
-        System.err.println(this + " onRestart called");
+        Util.i(this + " onRestart called");
         super.onRestart();
     }
 
     @Override
     public void onStart()
     {
-        System.err.println(this + " onStart called");
+        Util.i(this + " onStart called");
         super.onStart();
         _sharedPrefs = getSharedPreferences(SHARED_PREFS, 0);
         if (_sharedPrefs.getBoolean(PREF_AUTO_START, DEFAULT_AUTO_START))
@@ -87,28 +87,28 @@ public abstract class I2PActivityBase extends Activity {
     @Override
     public void onResume()
     {
-        System.err.println(this + " onResume called");
+        Util.i(this + " onResume called");
         super.onResume();
     }
 
     @Override
     public void onPause()
     {
-        System.err.println(this + " onPause called");
+        Util.i(this + " onPause called");
         super.onPause();
     }
 
     @Override
     public void onSaveInstanceState(Bundle outState)
     {
-        System.err.println(this + " onSaveInstanceState called");
+        Util.i(this + " onSaveInstanceState called");
         super.onSaveInstanceState(outState);
     }
 
     @Override
     public void onStop()
     {
-        System.err.println(this + " onStop called");
+        Util.i(this + " onStop called");
         unbindRouter();
         super.onStop();
     }
@@ -116,7 +116,7 @@ public abstract class I2PActivityBase extends Activity {
     @Override
     public void onDestroy()
     {
-        System.err.println(this + " onDestroy called");
+        Util.i(this + " onDestroy called");
         super.onDestroy();
     }
 
@@ -151,9 +151,11 @@ public abstract class I2PActivityBase extends Activity {
         MenuItem addressbook = menu.findItem(R.id.menu_addressbook);
         addressbook.setVisible(showAddressbook);
         addressbook.setEnabled(showAddressbook);
+
+        boolean showReload = showAddressbook || (this instanceof PeersActivity);
         MenuItem reload = menu.findItem(R.id.menu_reload);
-        reload.setVisible(showAddressbook);
-        reload.setEnabled(showAddressbook);
+        reload.setVisible(showReload);
+        reload.setEnabled(showReload);
 
         return super.onPrepareOptionsMenu(menu);
     }
@@ -208,14 +210,14 @@ public abstract class I2PActivityBase extends Activity {
     protected boolean startRouter() {
         Intent intent = new Intent();
         intent.setClassName(this, "net.i2p.android.router.service.RouterService");
-        System.err.println(this + " calling startService");
+        Util.i(this + " calling startService");
         ComponentName name = startService(intent);
         if (name == null)
-            System.err.println(this + " XXXXXXXXXXXXXXXXXXXX got from startService: " + name);
-        System.err.println(this + " got from startService: " + name);
+            Util.i(this + " XXXXXXXXXXXXXXXXXXXX got from startService: " + name);
+        Util.i(this + " got from startService: " + name);
         boolean success = bindRouter(true);
         if (!success)
-            System.err.println(this + " Bind router failed");
+            Util.i(this + " Bind router failed");
         return success;
     }
 
@@ -225,10 +227,10 @@ public abstract class I2PActivityBase extends Activity {
     protected boolean bindRouter(boolean autoCreate) {
         Intent intent = new Intent();
         intent.setClassName(this, "net.i2p.android.router.service.RouterService");
-        System.err.println(this + " calling bindService");
+        Util.i(this + " calling bindService");
         _connection = new RouterConnection();
         boolean success = bindService(intent, _connection, autoCreate ? BIND_AUTO_CREATE : 0);
-        System.err.println(this + " bindService: auto create? " + autoCreate + " success? " + success);
+        Util.i(this + " bindService: auto create? " + autoCreate + " success? " + success);
         return success;
     }
 
@@ -243,7 +245,7 @@ public abstract class I2PActivityBase extends Activity {
     protected class RouterConnection implements ServiceConnection {
 
         public void onServiceConnected(ComponentName name, IBinder service) {
-            System.err.println(this + " connected to router service");
+            Util.i(this + " connected to router service");
             RouterBinder binder = (RouterBinder) service;
             RouterService svc = binder.getService();
             _routerService = svc;
@@ -252,7 +254,7 @@ public abstract class I2PActivityBase extends Activity {
         }
 
         public void onServiceDisconnected(ComponentName name) {
-            System.err.println(this + " disconnected from router service!!!!!!!");
+            Util.i(this + " disconnected from router service!!!!!!!");
             // save memory
             _routerService = null;
             _isBound = false;
diff --git a/src/net/i2p/android/router/activity/I2PWebViewClient.java b/src/net/i2p/android/router/activity/I2PWebViewClient.java
index a458346e412139e633c72d8f5491def0529e2139..5129d2f836081a32b04bb25937539635a6476a61 100644
--- a/src/net/i2p/android/router/activity/I2PWebViewClient.java
+++ b/src/net/i2p/android/router/activity/I2PWebViewClient.java
@@ -9,6 +9,7 @@ import android.net.Uri;
 import android.os.AsyncTask;
 import android.view.Gravity;
 import android.view.View;
+import android.webkit.HttpAuthHandler;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 import android.widget.Toast;
@@ -173,6 +174,12 @@ class I2PWebViewClient extends WebViewClient {
         super.onPageFinished(view, url);
     }
 
+    @Override
+    public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
+        Util.e("ORHAR URL: " + host);
+        super.onReceivedHttpAuthRequest(view, handler, host, realm);
+    }
+
 /******
   API 11 :(
 
diff --git a/src/net/i2p/android/router/activity/MainActivity.java b/src/net/i2p/android/router/activity/MainActivity.java
index 7aed83e59a67d42e4a61e1846b4278cf8d67e1f3..9eb863f9bcd9875913fa2ced87b2a0e886c68006 100644
--- a/src/net/i2p/android/router/activity/MainActivity.java
+++ b/src/net/i2p/android/router/activity/MainActivity.java
@@ -256,11 +256,11 @@ public class MainActivity extends I2PActivityBase {
     private void updateStatus() {
         RouterContext ctx = getRouterContext();
         TextView tv = (TextView) findViewById(R.id.main_status_text);
-/***
+
         if (!Util.isConnected(this)) {
             tv.setText("No Internet connection is available");
             tv.setVisibility(View.VISIBLE);
-        } else ****/ if (ctx != null) {
+        } else if (ctx != null) {
             int active = ctx.commSystem().countActivePeers();
             int known = Math.max(ctx.netDb().getKnownRouters() - 1, 0);
             int inEx = ctx.tunnelManager().getFreeTunnelCount();
@@ -303,7 +303,9 @@ public class MainActivity extends I2PActivityBase {
             tv.setText(_savedStatus);
             tv.setVisibility(View.VISIBLE);
         } else {
-            //tv.setVisibility(View.INVISIBLE);
+            // network but no router context
+            tv.setVisibility(View.INVISIBLE);
+         /****
             RouterService svc = _routerService;
             String status =
                             "connected? " + Util.isConnected(this) +
@@ -317,6 +319,7 @@ public class MainActivity extends I2PActivityBase {
                             "\ncan stop? " + (svc == null ? "null" : svc.canManualStop());
             tv.setText(status);
             tv.setVisibility(View.VISIBLE);
+          ****/
         }
     }
 
diff --git a/src/net/i2p/android/router/activity/PeersActivity.java b/src/net/i2p/android/router/activity/PeersActivity.java
index f775ee146f59953eb95a44d0da009d10cbf63234..2bbc3e664117f24c7d4db70643524e3c8dddded6 100644
--- a/src/net/i2p/android/router/activity/PeersActivity.java
+++ b/src/net/i2p/android/router/activity/PeersActivity.java
@@ -2,6 +2,7 @@ package net.i2p.android.router.activity;
 
 import android.os.Bundle;
 import android.view.KeyEvent;
+import android.view.MenuItem;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 import android.widget.TextView;
@@ -70,6 +71,9 @@ public class PeersActivity extends I2PActivityBase {
         }
         try {
             wv.loadData(data, "text/html", "UTF-8");
+            // figure out a way to get /themes/console/images/outbound.png to load
+            //String url = "file://" + _myDir + "/docs/";
+            //wv.loadDataWithBaseURL(url, data, "text/html", "UTF-8", url);
         } catch (Exception e) {
         }
     }
@@ -87,4 +91,17 @@ public class PeersActivity extends I2PActivityBase {
         }
         return super.onKeyDown(keyCode, event);
     }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        WebView wv = (WebView) findViewById(R.id.peers_webview);
+        switch (item.getItemId()) {
+        case R.id.menu_reload:
+            update();
+            return true;
+
+        default:
+            return super.onOptionsItemSelected(item);
+        }
+    }
 }
diff --git a/src/net/i2p/android/router/receiver/I2PReceiver.java b/src/net/i2p/android/router/receiver/I2PReceiver.java
index 4db24f1bdbb881ba81eddf614027e7bc0e140c23..cbfa6354f4bce2c0de72dfbcec341a604b24dc73 100644
--- a/src/net/i2p/android/router/receiver/I2PReceiver.java
+++ b/src/net/i2p/android/router/receiver/I2PReceiver.java
@@ -38,7 +38,7 @@ public class I2PReceiver extends BroadcastReceiver {
 
     public void onReceive(Context context, Intent intent) {
         String action = intent.getAction();
-        System.err.println("Got broadcast: " + action);
+        Util.w("Got broadcast: " + action);
 
         if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
             boolean failover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);
@@ -47,7 +47,7 @@ public class I2PReceiver extends BroadcastReceiver {
             NetworkInfo other = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);
 
          /*****
-            System.err.println("No conn? " + noConn + " failover? " + failover + 
+            Util.w("No conn? " + noConn + " failover? " + failover + 
                                " info: " + info + " other: " + other);
             printInfo(info);
             printInfo(other);
@@ -63,10 +63,10 @@ public class I2PReceiver extends BroadcastReceiver {
                 if (++_unconnectedCount >= 3) {
                     RouterService svc = _routerService;
                     if (_isBound && svc != null) {
-                        System.err.println("********* Network down, already bound");
+                        Util.w("********* Network down, already bound");
                         svc.networkStop();
                     } else {
-                        System.err.println("********* Network down, binding to router");
+                        Util.w("********* Network down, binding to router");
                         // connection will call networkStop()
                         bindRouter();
                     }
@@ -81,10 +81,10 @@ public class I2PReceiver extends BroadcastReceiver {
 /****
     private static void printInfo(NetworkInfo ni) {
         if (ni == null) {
-            System.err.println("Network info is null");
+            Util.w("Network info is null");
             return;
         }
-        System.err.println(
+        Util.w(
              "state: " + ni.getState() +
              " detail: " + ni.getDetailedState() +
              " extrainfo: " + ni.getExtraInfo() +
@@ -101,10 +101,10 @@ public class I2PReceiver extends BroadcastReceiver {
     private boolean bindRouter() {
         Intent intent = new Intent();
         intent.setClassName(_context, "net.i2p.android.router.service.RouterService");
-        System.err.println(this + " calling bindService");
+        Util.w(this + " calling bindService");
         _connection = new RouterConnection();
         boolean success = _context.bindService(intent, _connection, 0);
-        System.err.println(this + " got from bindService: " + success);
+        Util.w(this + " got from bindService: " + success);
         return success;
     }
 
@@ -123,7 +123,7 @@ public class I2PReceiver extends BroadcastReceiver {
             _isBound = true;
             _unconnectedCount = 0;
             _wasConnected = false;
-            System.err.println("********* Network down, stopping router");
+            Util.w("********* Network down, stopping router");
             _routerService.networkStop();
             // this doesn't work here... TODO where to unbind
             //_context.unbindService(this);
@@ -132,7 +132,7 @@ public class I2PReceiver extends BroadcastReceiver {
         public void onServiceDisconnected(ComponentName name) {
             _isBound = false;
             _routerService = null;
-            System.err.println("********* Receiver unbinding from router");
+            Util.w("********* Receiver unbinding from router");
         }
     }
 }
diff --git a/src/net/i2p/android/router/service/Init.java b/src/net/i2p/android/router/service/Init.java
index 6e9f76d2442e0cf245b5a4edb4ded620e7038fb9..89612416f2c364aa2844a1f1b2cf33f9e5fbfb05 100644
--- a/src/net/i2p/android/router/service/Init.java
+++ b/src/net/i2p/android/router/service/Init.java
@@ -41,23 +41,23 @@ class Init {
     }
 
     void debugStuff() {
-        System.err.println("java.io.tmpdir" + ": " + System.getProperty("java.io.tmpdir"));
-        System.err.println("java.vendor" + ": " + System.getProperty("java.vendor"));
-        System.err.println("java.version" + ": " + System.getProperty("java.version"));
-        System.err.println("os.arch" + ": " + System.getProperty("os.arch"));
-        System.err.println("os.name" + ": " + System.getProperty("os.name"));
-        System.err.println("os.version" + ": " + System.getProperty("os.version"));
-        System.err.println("user.dir" + ": " + System.getProperty("user.dir"));
-        System.err.println("user.home" + ": " + System.getProperty("user.home"));
-        System.err.println("user.name" + ": " + System.getProperty("user.name"));
-        System.err.println("getFilesDir()" + ": " + myDir);
-        System.err.println("max mem" + ": " + DataHelper.formatSize(Runtime.getRuntime().maxMemory()));
-        System.err.println("Package" + ": " + ctx.getPackageName());
-        System.err.println("Version" + ": " + _ourVersion);
-        System.err.println("MODEL" + ": " + Build.MODEL);
-        System.err.println("DISPLAY" + ": " + Build.DISPLAY);
-        System.err.println("VERSION" + ": " + Build.VERSION.RELEASE);
-        System.err.println("SDK" + ": " + Build.VERSION.SDK);
+        Util.i("java.io.tmpdir" + ": " + System.getProperty("java.io.tmpdir"));
+        Util.i("java.vendor" + ": " + System.getProperty("java.vendor"));
+        Util.i("java.version" + ": " + System.getProperty("java.version"));
+        Util.i("os.arch" + ": " + System.getProperty("os.arch"));
+        Util.i("os.name" + ": " + System.getProperty("os.name"));
+        Util.i("os.version" + ": " + System.getProperty("os.version"));
+        Util.i("user.dir" + ": " + System.getProperty("user.dir"));
+        Util.i("user.home" + ": " + System.getProperty("user.home"));
+        Util.i("user.name" + ": " + System.getProperty("user.name"));
+        Util.i("getFilesDir()" + ": " + myDir);
+        Util.i("max mem" + ": " + DataHelper.formatSize(Runtime.getRuntime().maxMemory()));
+        Util.i("Package" + ": " + ctx.getPackageName());
+        Util.i("Version" + ": " + _ourVersion);
+        Util.i("MODEL" + ": " + Build.MODEL);
+        Util.i("DISPLAY" + ": " + Build.DISPLAY);
+        Util.i("VERSION" + ": " + Build.VERSION.RELEASE);
+        Util.i("SDK" + ": " + Build.VERSION.SDK);
     }
 
     void initialize() {
@@ -101,6 +101,8 @@ class Init {
             imgDir.mkdir();
             copyResourceToFile(R.drawable.i2plogo, "docs/themes/console/images/i2plogo.png");
             copyResourceToFile(R.drawable.itoopie_sm, "docs/themes/console/images/itoopie_sm.png");
+            copyResourceToFile(R.drawable.outbound, "docs/themes/console/images/outbound.png");
+            copyResourceToFile(R.drawable.inbound, "docs/themes/console/images/inbound.png");
 
             File img2Dir = new File(cssDir, "images");
             img2Dir.mkdir();
@@ -122,7 +124,7 @@ class Init {
         InputStream in = null;
         FileOutputStream out = null;
 
-        System.err.println("Creating file " + f + " from resource");
+        Util.i("Creating file " + f + " from resource");
         byte buf[] = new byte[4096];
         try {
             // Context methods
@@ -165,9 +167,9 @@ class Init {
             try {
                 fin = new FileInputStream(new File(myDir, f));
                 DataHelper.loadProps(props,  fin);
-                System.err.println("Merging resource into file " + f);
+                Util.i("Merging resource into file " + f);
             } catch (IOException ioe) {
-                System.err.println("Creating file " + f + " from resource");
+                Util.i("Creating file " + f + " from resource");
             }
 
             // override user settings
@@ -177,7 +179,7 @@ class Init {
                 props.putAll(overrides);
             File path = new File(myDir, f);
             DataHelper.storeProps(props, path);
-            System.err.println("Saved " + props.size() +" properties in " + f);
+            Util.i("Saved " + props.size() +" properties in " + f);
         } catch (IOException ioe) {
         } catch (Resources.NotFoundException nfe) {
         } finally {
@@ -199,7 +201,7 @@ class Init {
             fin = ctx.openFileInput(CONFIG_FILE);
             DataHelper.loadProps(props,  fin);
         } catch (IOException ioe) {
-            System.err.println("Looks like a new install");
+            Util.i("Looks like a new install");
         } finally {
             if (fin != null) try { fin.close(); } catch (IOException ioe) {}
         }
@@ -209,12 +211,12 @@ class Init {
         boolean newVersion = !_ourVersion.equals(oldVersion);
 
         if (newVersion) {
-            System.err.println("New version " + _ourVersion);
+            Util.i("New version " + _ourVersion);
             props.setProperty(PROP_INSTALLED_VERSION, _ourVersion);
             try {
                 DataHelper.storeProps(props, ctx.getFileStreamPath(CONFIG_FILE));
             } catch (IOException ioe) {
-                System.err.println("Failed to write " + CONFIG_FILE);
+                Util.i("Failed to write " + CONFIG_FILE);
             }
         }
         return newVersion;
@@ -227,7 +229,7 @@ class Init {
         if (files != null) {
             for (int i = 0; i < files.length; i++) {
                 File f = files[i];
-                System.err.println("Deleting old file/dir " + f);
+                Util.i("Deleting old file/dir " + f);
                 FileUtil.rmdir(f, false);
             }
         }
diff --git a/src/net/i2p/android/router/service/LoadClientsJob.java b/src/net/i2p/android/router/service/LoadClientsJob.java
index 6374d6882f450884ebb4979e567a261b2fbf8682..ac94257225e33549a76437cb27ad4f92251bcf2a 100644
--- a/src/net/i2p/android/router/service/LoadClientsJob.java
+++ b/src/net/i2p/android/router/service/LoadClientsJob.java
@@ -2,6 +2,7 @@ package net.i2p.android.router.service;
 
 import net.i2p.addressbook.DaemonThread;
 import net.i2p.android.apps.NewsFetcher;
+import net.i2p.android.router.util.Util;
 import net.i2p.i2ptunnel.TunnelControllerGroup;
 import net.i2p.router.Job;
 import net.i2p.router.JobImpl;
@@ -71,17 +72,17 @@ class LoadClientsJob extends JobImpl {
         public String getName() { return "Start I2P Tunnel"; };
 
         public void runJob() {
-            System.err.println("Starting i2ptunnel");
+            Util.i("Starting i2ptunnel");
             TunnelControllerGroup tcg = TunnelControllerGroup.getInstance();
             int sz = tcg.getControllers().size();
-            System.err.println("i2ptunnel started " + sz + " clients");
+            Util.i("i2ptunnel started " + sz + " clients");
 
         }
     }
 
     private class ClientShutdownHook implements Runnable {
         public void run() {
-            System.err.println("client shutdown hook");
+            Util.i("client shutdown hook");
             // i2ptunnel registers its own hook
             if (_fetcherThread != null)
                 _fetcherThread.interrupt();
diff --git a/src/net/i2p/android/router/service/RouterService.java b/src/net/i2p/android/router/service/RouterService.java
index 61f9edc32748889d5039eb551bfe36819398bb3b..300fe2f80b4113fb340c1c4e3b2d81ee1ab0014a 100644
--- a/src/net/i2p/android/router/service/RouterService.java
+++ b/src/net/i2p/android/router/service/RouterService.java
@@ -60,7 +60,7 @@ public class RouterService extends Service {
     public void onCreate() {
         State lastState = getSavedState();
         setState(State.INIT);
-        System.err.println(this + " onCreate called" +
+        Util.i(this + " onCreate called" +
                            " Saved state is: " + lastState +
                            " Current state is: " + _state);
 
@@ -86,14 +86,14 @@ public class RouterService extends Service {
     /** NOT called by system if it restarts us after a crash */
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
-        System.err.println(this + " onStart called" +
+        Util.i(this + " onStart called" +
                            " Intent is: " + intent +
                            " Flags is: " + flags +
                            " ID is: " + startId +
                            " Current state is: " + _state);
         boolean restart = intent != null && intent.getBooleanExtra(EXTRA_RESTART, false);
         if (restart)
-            System.err.println(this + " RESTARTING");
+            Util.i(this + " RESTARTING");
         synchronized (_stateLock) {
             if (_state != State.INIT)
                 //return START_STICKY;
@@ -101,14 +101,14 @@ public class RouterService extends Service {
             _receiver = new I2PReceiver(this);
             if (Util.isConnected(this)) {
                 if (restart)
-                    _statusBar.replace("I2P is restarting");
+                    _statusBar.replace(StatusBar.ICON1, "I2P is restarting");
                 else
-                    _statusBar.replace("I2P is starting up");
+                    _statusBar.replace(StatusBar.ICON1, "I2P is starting up");
                 setState(State.STARTING);
                 _starterThread = new Thread(new Starter());
                 _starterThread.start();
             } else {
-                _statusBar.replace("I2P is waiting for a network connection");
+                _statusBar.replace(StatusBar.ICON6, "I2P is waiting for a network connection");
                 setState(State.WAITING);
                 _handler.postDelayed(new Waiter(), 10*1000);
             }
@@ -123,14 +123,14 @@ public class RouterService extends Service {
     /** maybe this goes away when the receiver can bind to us */
     private class Waiter implements Runnable {
         public void run() {
-            System.err.println(MARKER + this + " waiter handler" +
+            Util.i(MARKER + this + " waiter handler" +
                            " Current state is: " + _state);
             if (_state == State.WAITING) {
                 if (Util.isConnected(RouterService.this)) {
                     synchronized (_stateLock) {
                         if (_state != State.WAITING)
                             return;
-                        _statusBar.replace("Network connected, I2P is starting up");
+                        _statusBar.replace(StatusBar.ICON1, "Network connected, I2P is starting up");
                         setState(State.STARTING);
                         _starterThread = new Thread(new Starter());
                         _starterThread.start();
@@ -144,11 +144,11 @@ public class RouterService extends Service {
 
     private class Starter implements Runnable {
         public void run() {
-            System.err.println(MARKER + this + " starter thread" +
+            Util.i(MARKER + this + " starter thread" +
                            " Current state is: " + _state);
-            //System.err.println(MARKER + this + " JBigI speed test started");
+            //Util.i(MARKER + this + " JBigI speed test started");
             //NativeBigInteger.main(null);
-            //System.err.println(MARKER + this + " JBigI speed test finished, launching router");
+            //Util.i(MARKER + this + " JBigI speed test finished, launching router");
             RouterLaunch.main(null);
             synchronized (_stateLock) {
                 if (_state != State.STARTING)
@@ -157,7 +157,7 @@ public class RouterService extends Service {
                 List contexts = RouterContext.listContexts();
                 if ( (contexts == null) || (contexts.isEmpty()) ) 
                       throw new IllegalStateException("No contexts. This is usually because the router is either starting up or shutting down.");
-                _statusBar.update("I2P is running");
+                _statusBar.replace(StatusBar.ICON2, "I2P is running");
                 _context = (RouterContext)contexts.get(0);
                 _context.router().setKillVMOnEnd(false);
                 Job loadJob = new LoadClientsJob(_context);
@@ -166,7 +166,7 @@ public class RouterService extends Service {
                 _context.addFinalShutdownTask(new FinalShutdownHook());
                 _starterThread = null;
             }
-            System.err.println("Router.main finished");
+            Util.i("Router.main finished");
         }
     }
 
@@ -215,9 +215,9 @@ public class RouterService extends Service {
         boolean haveTunnels = inCl > 0 && outCl > 0;
         if (haveTunnels != _hadTunnels) {
             if (haveTunnels)
-                _statusBar.replace("Client tunnels are ready");
+                _statusBar.replace(StatusBar.ICON3, "Client tunnels are ready");
             else
-                _statusBar.replace("Client tunnels are down");
+                _statusBar.replace(StatusBar.ICON2, "Client tunnels are down");
             _hadTunnels = haveTunnels;
         }
         _statusBar.update(status, details);
@@ -226,7 +226,7 @@ public class RouterService extends Service {
     @Override
     public IBinder onBind(Intent intent)
     {
-        System.err.println(this + "onBind called" +
+        Util.i(this + "onBind called" +
                            " Current state is: " + _state);
         return _binder;
     }
@@ -264,7 +264,7 @@ public class RouterService extends Service {
      *  Stop and don't restart the router, but keep the service
      */
     public void manualStop() {
-        System.err.println("manualStop called" +
+        Util.i("manualStop called" +
                            " Current state is: " + _state);
         synchronized (_stateLock) {
             if (!canManualStop())
@@ -272,7 +272,7 @@ public class RouterService extends Service {
             if (_state == State.STARTING)
                 _starterThread.interrupt();
             if (_state == State.STARTING || _state == State.RUNNING) {
-                _statusBar.replace("Stopping I2P");
+                _statusBar.replace(StatusBar.ICON4, "Stopping I2P");
                 Thread stopperThread = new Thread(new Stopper(State.MANUAL_STOPPING, State.MANUAL_STOPPED));
                 stopperThread.start();
             }
@@ -283,7 +283,7 @@ public class RouterService extends Service {
      *  Stop the router and kill the service
      */
     public void manualQuit() {
-        System.err.println("manualQuit called" +
+        Util.i("manualQuit called" +
                            " Current state is: " + _state);
         synchronized (_stateLock) {
             if (!canManualStop())
@@ -291,7 +291,7 @@ public class RouterService extends Service {
             if (_state == State.STARTING)
                 _starterThread.interrupt();
             if (_state == State.STARTING || _state == State.RUNNING) {
-                _statusBar.replace("Stopping I2P");
+                _statusBar.replace(StatusBar.ICON4, "Stopping I2P");
                 Thread stopperThread = new Thread(new Stopper(State.MANUAL_QUITTING, State.MANUAL_QUITTED));
                 stopperThread.start();
             } else if (_state == State.WAITING) {
@@ -305,13 +305,13 @@ public class RouterService extends Service {
      *  Stop and then spin waiting for a network connection, then restart
      */
     public void networkStop() {
-        System.err.println("networkStop called" +
+        Util.i("networkStop called" +
                            " Current state is: " + _state);
         synchronized (_stateLock) {
             if (_state == State.STARTING)
                 _starterThread.interrupt();
             if (_state == State.STARTING || _state == State.RUNNING) {
-                _statusBar.replace("Network disconnected, stopping I2P");
+                _statusBar.replace(StatusBar.ICON4, "Network disconnected, stopping I2P");
                 // don't change state, let the shutdown hook do it
                 Thread stopperThread = new Thread(new Stopper(State.NETWORK_STOPPING, State.NETWORK_STOPPING));
                 stopperThread.start();
@@ -325,12 +325,12 @@ public class RouterService extends Service {
     }
 
     public void manualStart() {
-        System.err.println("restart called" +
+        Util.i("restart called" +
                            " Current state is: " + _state);
         synchronized (_stateLock) {
             if (!canManualStart())
                 return;
-            _statusBar.replace("I2P is starting up");
+            _statusBar.replace(StatusBar.ICON1, "I2P is starting up");
             setState(State.STARTING);
             _starterThread = new Thread(new Starter());
             _starterThread.start();
@@ -346,7 +346,7 @@ public class RouterService extends Service {
      */
     @Override
     public void onDestroy() {
-        System.err.println("onDestroy called" +
+        Util.i("onDestroy called" +
                            " Current state is: " + _state);
 
         _handler.removeCallbacks(_updater);
@@ -368,7 +368,7 @@ public class RouterService extends Service {
                 _starterThread.interrupt();
             if (_state == State.STARTING || _state == State.RUNNING) {
               // should this be in a thread?
-                _statusBar.replace("I2P is shutting down");
+                _statusBar.replace(StatusBar.ICON5, "I2P is shutting down");
                 Thread stopperThread = new Thread(new Stopper(State.STOPPING, State.STOPPED));
                 stopperThread.start();
             }
@@ -393,13 +393,13 @@ public class RouterService extends Service {
         }
 
         public void run() {
-            System.err.println(MARKER + this + " stopper thread" +
+            Util.i(MARKER + this + " stopper thread" +
                                " Current state is: " + _state);
             RouterContext ctx = _context;
             if (ctx != null)
                 ctx.router().shutdown(Router.EXIT_HARD);
             _statusBar.off();
-            System.err.println("********** Router shutdown complete");
+            Util.i("********** Router shutdown complete");
             synchronized (_stateLock) {
                 if (_state == nextState)
                     setState(stopState);
@@ -414,9 +414,9 @@ public class RouterService extends Service {
      */
     private class ShutdownHook implements Runnable {
         public void run() {
-            System.err.println(this + " shutdown hook" +
+            Util.i(this + " shutdown hook" +
                                " Current state is: " + _state);
-            _statusBar.replace("I2P is shutting down");
+            _statusBar.replace(StatusBar.ICON5, "I2P is shutting down");
             I2PReceiver rcvr = _receiver;
             if (rcvr != null) {
                 synchronized(rcvr) {
@@ -450,7 +450,7 @@ public class RouterService extends Service {
      */
     private class FinalShutdownHook implements Runnable {
         public void run() {
-            System.err.println(this + " final shutdown hook" +
+            Util.i(this + " final shutdown hook" +
                                " Current state is: " + _state);
             _statusBar.off();
             //I2PReceiver rcvr = _receiver;
@@ -469,7 +469,7 @@ public class RouterService extends Service {
                     _handler.postDelayed(new Waiter(), 10*1000);
                 } else if (_state == State.STARTING || _state == State.RUNNING ||
                            _state == State.STOPPING) {
-                    System.err.println(this + " died of unknown causes");
+                    Util.i(this + " died of unknown causes");
                     setState(State.STOPPED);
                     stopSelf();
                 } else if (_state == State.MANUAL_QUITTING) {
diff --git a/src/net/i2p/android/router/service/StatusBar.java b/src/net/i2p/android/router/service/StatusBar.java
index 7f60cc530345a2a337101c04d1967debf87e4390..d456fe130b6433fdef0d01d78ed652d6a58ff869 100644
--- a/src/net/i2p/android/router/service/StatusBar.java
+++ b/src/net/i2p/android/router/service/StatusBar.java
@@ -11,7 +11,7 @@ import java.lang.Thread.UncaughtExceptionHandler;
 import net.i2p.android.router.R;
 import net.i2p.android.router.activity.MainActivity;
 
-public class StatusBar {
+class StatusBar {
 
     private final Context ctx;
     private final Intent intent;
@@ -20,13 +20,20 @@ public class StatusBar {
 
     private static final int ID = 1;
 
+    public static final int ICON1 = R.drawable.ic_launcher_itoopie_300;
+    public static final int ICON2 = R.drawable.ic_launcher_itoopie_330;
+    public static final int ICON3 = R.drawable.ic_launcher_itoopie;
+    public static final int ICON4 = R.drawable.ic_launcher_itoopie_120;
+    public static final int ICON5 = R.drawable.ic_launcher_itoopie_150;
+    public static final int ICON6 = R.drawable.ic_launcher_itoopie_180;
+
     StatusBar(Context cx) {
         ctx = cx;
         String ns = Context.NOTIFICATION_SERVICE;
         mgr = (NotificationManager)ctx.getSystemService(ns);
         Thread.currentThread().setUncaughtExceptionHandler(new CrashHandler(mgr));
 
-        int icon = R.drawable.ic_launcher_itoopie;
+        int icon = ICON1;
         // won't be shown if replace() is called
         String text = "Starting I2P";
         long now = System.currentTimeMillis();
@@ -37,9 +44,10 @@ public class StatusBar {
     }
 
     /** remove and re-add */
-    public void replace(String tickerText) {
+    public void replace(int icon, String tickerText) {
         off();
-        notif.tickerText = tickerText;
+        notif.icon = icon;
+        notif.tickerText= tickerText;
         update(tickerText);
     }