diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9ac597f..cc07744 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,6 +6,7 @@
     <uses-permission android:name="android.permission.READ_LOGS" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 
     <application
         android:allowBackup="true"
@@ -33,6 +34,15 @@
             </intent-filter>
         </service>
 
+        <receiver
+            android:name="net.named_data.nfd.utils.ConnectivityChangeReceiver"
+            android:label="ConnectivityChangeReceiver" >
+            <intent-filter>
+                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
+                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
+            </intent-filter>
+        </receiver>
+
     </application>
 
 </manifest>
diff --git a/app/src/main/java/net/named_data/nfd/service/NfdService.java b/app/src/main/java/net/named_data/nfd/service/NfdService.java
index 55a4f9d..3ab102d 100644
--- a/app/src/main/java/net/named_data/nfd/service/NfdService.java
+++ b/app/src/main/java/net/named_data/nfd/service/NfdService.java
@@ -128,6 +128,7 @@
     G.Log(TAG, "NFDService::onStartCommand()");
 
     serviceStartNfd();
+    createPermanentFaceUriAndRoute();
 
     // Service is restarted when killed.
     // Pending intents delivered; null intent redelivered otherwise.
@@ -184,32 +185,24 @@
       // Keep Service alive; In event when service is started
       // from a Handler's message through binding with the service.
       startService(new Intent(this, NfdService.class));
-
-      // Restore PermanentFaceUriAndRoute once NFD is running
-      onNfdStart(new Runnable() {
-        @Override
-        public void run() {
-          createPermanentFaceUriAndRoute(getApplicationContext());
-        }
-      });
-
       G.Log(TAG, "serviceStartNfd()");
     } else {
       G.Log(TAG, "serviceStartNfd(): NFD Service already running!");
     }
   }
 
-  private void onNfdStart(final Runnable task) {
+  private void createPermanentFaceUriAndRoute() {
     final long checkInterval = 1000;
     if (isNfdRunning()) {
-      G.Log(TAG, "onNfdStart: NFD is running, start executing task.");
-      task.run();
+      G.Log(TAG, "createPermanentFaceUriAndRoute: NFD is running, start executing task.");
+      new FaceCreateAsyncTask(getApplicationContext()).execute();
+      new RouteCreateAsyncTask(getApplicationContext()).execute();
     } else {
-      G.Log(TAG, "onNfdStart: NFD is not started yet, delay " + String.valueOf(checkInterval) + " ms.");
+      G.Log(TAG, "createPermanentFaceUriAndRoute: NFD is not started yet, delay " + String.valueOf(checkInterval) + " ms.");
       m_handler.postDelayed(new Runnable() {
         @Override
         public void run() {
-          onNfdStart(task);
+          createPermanentFaceUriAndRoute();
         }
       }, checkInterval);
     }
@@ -297,15 +290,6 @@
   }
 
   /**
-   * create all permanent faces and routes in the background
-   * @param ctx: Application Context
-   */
-  public static void createPermanentFaceUriAndRoute(Context ctx) {
-    new FaceCreateAsyncTask(ctx).execute();
-    new RouteCreateAsyncTask(ctx).execute();
-  }
-
-  /**
    * Message handler for the the NFD Service.
    */
   private class NfdServiceMessageHandler extends Handler {
diff --git a/app/src/main/java/net/named_data/nfd/utils/ConnectivityChangeReceiver.java b/app/src/main/java/net/named_data/nfd/utils/ConnectivityChangeReceiver.java
new file mode 100644
index 0000000..be9e2ee
--- /dev/null
+++ b/app/src/main/java/net/named_data/nfd/utils/ConnectivityChangeReceiver.java
@@ -0,0 +1,69 @@
+/* -*- Mode:jde; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2015-2016 Regents of the University of California
+ * <p>
+ * This file is part of NFD (Named Data Networking Forwarding Daemon) Android.
+ * See AUTHORS.md for complete list of NFD Android authors and contributors.
+ * <p>
+ * NFD Android is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ * <p>
+ * NFD Android is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.  See the GNU General Public License for more details.
+ * <p>
+ * You should have received a copy of the GNU General Public License along with
+ * NFD Android, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.named_data.nfd.utils;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+
+import net.named_data.nfd.service.NfdService;
+
+/**
+ * ConnectivityChangeReceiver monitors network connectivity changes and update
+ * face and route list accordingly.
+ */
+public class ConnectivityChangeReceiver extends BroadcastReceiver {
+  private static final String TAG = ConnectivityChangeReceiver.class.getName();
+
+  @Override
+  public void
+  onReceive(Context context, Intent intent) {
+    NetworkInfo network = getNetworkInfo(context);
+    if (null == network) {
+      G.Log(TAG, "Connection lost");
+      onConnectionLost(context);
+    } else {
+      G.Log(TAG, "Connection changed");
+      onChange(context, network);
+    }
+  }
+
+  private static NetworkInfo getNetworkInfo(Context applicationContext) {
+    ConnectivityManager cm = (ConnectivityManager) applicationContext
+        .getSystemService(Context.CONNECTIVITY_SERVICE);
+    return cm.getActiveNetworkInfo();
+  }
+
+  private void
+  onChange(Context context, NetworkInfo networkInfo) {
+    if (networkInfo.isConnected()) {
+      G.Log(TAG, "Network is connected");
+      // (re-)start service, triggering (re-)creation of permanent faces and routes
+      context.startService(new Intent(context, NfdService.class));
+    }
+  }
+
+  private void
+  onConnectionLost(Context context) {
+    // nothing to do: face/routes should disappear by themselves
+  }
+}
