diff --git a/src/net/i2p/android/router/activity/I2PActivityBase.java b/src/net/i2p/android/router/activity/I2PActivityBase.java
index 7f4afd74c671b6ff8bfdf7a23d94f4b089f2343c..ca0f7661990fd3e841617caf5995cf71f9c65386 100644
--- a/src/net/i2p/android/router/activity/I2PActivityBase.java
+++ b/src/net/i2p/android/router/activity/I2PActivityBase.java
@@ -14,6 +14,7 @@ import android.view.MenuItem;
 import net.i2p.android.router.R;
 import net.i2p.android.router.binder.RouterBinder;
 import net.i2p.android.router.service.RouterService;
+import net.i2p.android.router.util.Util;
 import net.i2p.router.CommSystemFacade;
 import net.i2p.router.NetworkDatabaseFacade;
 import net.i2p.router.Router;
@@ -145,7 +146,8 @@ public abstract class I2PActivityBase extends Activity {
     public boolean onPrepareOptionsMenu(Menu menu) {
         // add/hide items here
         RouterService svc = _routerService;
-        boolean showStart = (svc == null) || (!_isBound) || svc.canManualStart();
+        boolean showStart = ((svc == null) || (!_isBound) || svc.canManualStart()) &&
+                            Util.isConnected(this);
         MenuItem start = menu.findItem(R.id.menu_start);
         start.setVisible(showStart);
         start.setEnabled(showStart);
diff --git a/src/net/i2p/android/router/activity/MainActivity.java b/src/net/i2p/android/router/activity/MainActivity.java
index dfd34e518032a7efb32bb7473e96ee602c0ea9c7..fc3bd53de1e1171e7b0ee0693710ee306b2a6e58 100644
--- a/src/net/i2p/android/router/activity/MainActivity.java
+++ b/src/net/i2p/android/router/activity/MainActivity.java
@@ -199,7 +199,8 @@ public class MainActivity extends I2PActivityBase {
 
     private void updateVisibility() {
         RouterService svc = _routerService;
-        boolean showStart = (svc == null) || (!_isBound) || svc.canManualStart();
+        boolean showStart = ((svc == null) || (!_isBound) || svc.canManualStart()) &&
+                            Util.isConnected(this);
         Button start = (Button) findViewById(R.id.router_start_button);
         start.setVisibility(showStart ? View.VISIBLE : View.INVISIBLE);
 
@@ -214,7 +215,10 @@ public class MainActivity extends I2PActivityBase {
     private void updateStatus() {
         RouterContext ctx = getRouterContext();
         TextView tv = (TextView) findViewById(R.id.main_status_text);
-        if (ctx != null) {
+        if (!Util.isConnected(this)) {
+            tv.setText("No Internet connection is available");
+            tv.setVisibility(View.VISIBLE);
+        } else if (ctx != null) {
             int active = ctx.commSystem().countActivePeers();
             int known = Math.max(ctx.netDb().getKnownRouters() - 1, 0);
             int inEx = ctx.tunnelManager().getFreeTunnelCount();
diff --git a/src/net/i2p/android/router/receiver/I2PReceiver.java b/src/net/i2p/android/router/receiver/I2PReceiver.java
index 6ec54001fec55a473be1767d19904cc0b9eea1b8..4db24f1bdbb881ba81eddf614027e7bc0e140c23 100644
--- a/src/net/i2p/android/router/receiver/I2PReceiver.java
+++ b/src/net/i2p/android/router/receiver/I2PReceiver.java
@@ -8,11 +8,11 @@ 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;
 import net.i2p.android.router.service.RouterService;
+import net.i2p.android.router.util.Util;
 
 public class I2PReceiver extends BroadcastReceiver {
     private final Context _context;
@@ -21,7 +21,6 @@ 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
@@ -29,13 +28,12 @@ public class I2PReceiver extends BroadcastReceiver {
     public I2PReceiver(Context context) {
         super();
         _context = context;
-        getInfo();
         IntentFilter intents = new IntentFilter();
         intents.addAction(Intent.ACTION_TIME_CHANGED);
         intents.addAction(Intent.ACTION_TIME_TICK);  // once per minute, for testing
         intents.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
         context.registerReceiver(this, intents);
-        _wasConnected = isConnected();
+        _wasConnected = Util.isConnected(context);
     }
 
     public void onReceive(Context context, Intent intent) {
@@ -59,7 +57,7 @@ public class I2PReceiver extends BroadcastReceiver {
 
         if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION) ||
             action.equals(Intent.ACTION_TIME_TICK)) {
-            boolean connected = isConnected();
+            boolean connected = Util.isConnected(context);
             if (_wasConnected && !connected) {
                 // notify + 2 timer ticks
                 if (++_unconnectedCount >= 3) {
@@ -80,22 +78,7 @@ 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();
-    }
-
-    private NetworkInfo getInfo() {
-        ConnectivityManager cm = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
-        NetworkInfo current = cm.getActiveNetworkInfo();
-        System.err.println("Current network info:");
-        printInfo(current);
-        return current;
-    }
-
+/****
     private static void printInfo(NetworkInfo ni) {
         if (ni == null) {
             System.err.println("Network info is null");
@@ -113,6 +96,7 @@ public class I2PReceiver extends BroadcastReceiver {
              " failover: " + ni.isFailover());
 
     }
+****/
 
     private boolean bindRouter() {
         Intent intent = new Intent();
diff --git a/src/net/i2p/android/router/service/RouterService.java b/src/net/i2p/android/router/service/RouterService.java
index 16daf3a6a95525baf5de80b17c7a0d1e30e8195a..ff722ea7e83d12ca3a766c33d9c1f1f078147eb9 100644
--- a/src/net/i2p/android/router/service/RouterService.java
+++ b/src/net/i2p/android/router/service/RouterService.java
@@ -15,6 +15,7 @@ import java.util.List;
 import net.i2p.android.router.R;
 import net.i2p.android.router.binder.RouterBinder;
 import net.i2p.android.router.receiver.I2PReceiver;
+import net.i2p.android.router.util.Util;
 import net.i2p.data.DataHelper;
 import net.i2p.router.Job;
 import net.i2p.router.Router;
@@ -77,7 +78,7 @@ public class RouterService extends Service {
                 //return START_STICKY;
                 return START_NOT_STICKY;
             _receiver = new I2PReceiver(this);
-            if (_receiver.isConnected()) {
+            if (Util.isConnected(this)) {
                 _statusBar.update("I2P is starting up");
                 _state = State.STARTING;
                 _starterThread = new Thread(new Starter());
@@ -99,28 +100,22 @@ 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 thread" +
+            System.err.println(MARKER + this + " waiter handler" +
                            " Current state is: " + _state);
-            while (_state == State.WAITING) {
-                try {
-                    Thread.sleep(30*1000);
-                } catch (InterruptedException ie) {
-                    break;
-                }
-
-                if (_receiver.isConnected()) {
+            if (_state == State.WAITING) {
+                if (Util.isConnected(RouterService.this)) {
                     synchronized (_stateLock) {
                         if (_state != State.WAITING)
-                            break;
+                            return;
                         _statusBar.update("Network connected, I2P is starting up");
                         _state = State.STARTING;
                         _starterThread = new Thread(new Starter());
                         _starterThread.start();
                     }
-                    break;
+                    return;
                 }
+                _handler.postDelayed(this, 15*1000);
             }
-            System.err.println("waiter finished");
         }
     }
 
@@ -236,7 +231,7 @@ public class RouterService extends Service {
         synchronized (_stateLock) {
             if (!canManualStop())
                 return;
-            if (_state == State.WAITING || _state == State.STARTING)
+            if (_state == State.STARTING)
                 _starterThread.interrupt();
             if (_state == State.STARTING || _state == State.RUNNING) {
                 _statusBar.update("Stopping I2P");
@@ -255,12 +250,15 @@ public class RouterService extends Service {
         synchronized (_stateLock) {
             if (!canManualStop())
                 return;
-            if (_state == State.WAITING || _state == State.STARTING)
+            if (_state == State.STARTING)
                 _starterThread.interrupt();
             if (_state == State.STARTING || _state == State.RUNNING) {
                 _statusBar.update("Quitting I2P");
                 Thread stopperThread = new Thread(new Stopper(State.MANUAL_QUITTING, State.MANUAL_QUITTED));
                 stopperThread.start();
+            } else if (_state == State.WAITING) {
+                _state = State.MANUAL_QUITTING;
+                (new FinalShutdownHook()).run();
             }
         }
     }
@@ -272,7 +270,7 @@ public class RouterService extends Service {
         System.err.println("networkStop called" +
                            " Current state is: " + _state);
         synchronized (_stateLock) {
-            if (_state == State.WAITING || _state == State.STARTING)
+            if (_state == State.STARTING)
                 _starterThread.interrupt();
             if (_state == State.STARTING || _state == State.RUNNING) {
                 _statusBar.update("Network disconnected, stopping I2P");
@@ -327,7 +325,7 @@ public class RouterService extends Service {
             }
         }
         synchronized (_stateLock) {
-            if (_state == State.WAITING || _state == State.STARTING)
+            if (_state == State.STARTING)
                 _starterThread.interrupt();
             if (_state == State.STARTING || _state == State.RUNNING) {
               // should this be in a thread?
@@ -394,7 +392,7 @@ public class RouterService extends Service {
             synchronized (_stateLock) {
                 // null out to release the memory
                 _context = null;
-                if (_state == State.WAITING || _state == State.STARTING)
+                if (_state == State.STARTING)
                     _starterThread.interrupt();
                 if (_state == State.WAITING || _state == State.STARTING ||
                     _state == State.RUNNING)
@@ -421,15 +419,14 @@ public class RouterService extends Service {
             synchronized (_stateLock) {
                 // null out to release the memory
                 _context = null;
-                if (_state == State.WAITING || _state == State.STARTING)
+                if (_state == State.STARTING)
                     _starterThread.interrupt();
                 if (_state == State.MANUAL_STOPPING) {
                     _state = State.MANUAL_STOPPED;
                 } else if (_state == State.NETWORK_STOPPING) {
-                    // start waiter thread
+                    // start waiter handler
                     _state = State.WAITING;
-                    _starterThread = new Thread(new Waiter());
-                    _starterThread.start();
+                    _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");
diff --git a/src/net/i2p/android/router/util/Util.java b/src/net/i2p/android/router/util/Util.java
index 991c4e83be85a2efa9d24b45677b8b0265477d1c..85637fd5a5f502a5068b20b48fa83e4a30ed119d 100644
--- a/src/net/i2p/android/router/util/Util.java
+++ b/src/net/i2p/android/router/util/Util.java
@@ -3,8 +3,12 @@ package net.i2p.android.router.util;
 import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.Build;
 
 public abstract class Util {
+    private static final boolean _isEmulator = Build.MODEL.equals("sdk");
 
     public static String getOurVersion(Context ctx) {
         PackageManager pm = ctx.getPackageManager();
@@ -20,4 +24,19 @@ public abstract class Util {
         } catch (Exception e) {}
         return "??";
     }
+
+    public static boolean isConnected(Context ctx) {
+        // emulator always returns null NetworkInfo
+        if (_isEmulator)
+            return true;
+        NetworkInfo current = getNetworkInfo(ctx);
+        return current != null && current.isConnected();
+    }
+
+    public static NetworkInfo getNetworkInfo(Context ctx) {
+        ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
+        NetworkInfo current = cm.getActiveNetworkInfo();
+        return current;
+    }
+
 }