diff --git a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/Router.java b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/Router.java
index e4eafb5..f1a14e7 100644
--- a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/Router.java
+++ b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/Router.java
@@ -143,7 +143,7 @@
     }
 
     /**
-     * Starts the Router.
+     * Starts the router.
      */
     public void start() {
         bgpUpdatesExecutor.execute(new Runnable() {
@@ -161,6 +161,14 @@
         });
     }
 
+    /**
+     * Shuts the router down.
+     */
+    public void shutdown() {
+        bgpUpdatesExecutor.shutdownNow();
+        bgpIntentsSynchronizerExecutor.shutdownNow();
+    }
+
     //@Override TODO hook this up to something
     public void leaderChanged(boolean isLeader) {
         log.debug("Leader changed: {}", isLeader);
diff --git a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/SdnIp.java b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/SdnIp.java
index 0f6e38a..4abefa7 100644
--- a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/SdnIp.java
+++ b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/SdnIp.java
@@ -90,6 +90,9 @@
 
     @Deactivate
     protected void deactivate() {
+        bgpSessionManager.shutDown();
+        router.shutdown();
+
         log.info("Stopped");
     }
 
diff --git a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/config/SdnIpConfigReader.java b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/config/SdnIpConfigReader.java
index cde65c6..2fcd1fe 100644
--- a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/config/SdnIpConfigReader.java
+++ b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/config/SdnIpConfigReader.java
@@ -16,6 +16,7 @@
 package org.onlab.onos.sdnip.config;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Map;
@@ -40,12 +41,8 @@
 
     private static final String DEFAULT_CONFIG_FILE = "config/sdnip.json";
     private String configFileName = DEFAULT_CONFIG_FILE;
-    //private Map<String, Interface> interfaces;
-    // We call the BGP routers in our SDN network the BGP speakers, and call
-    // the BGP routers outside our SDN network the BGP peers.
-    private Map<String, BgpSpeaker> bgpSpeakers;
-    private Map<IpAddress, BgpPeer> bgpPeers;
-    //private InvertedRadixTree<Interface> interfaceRoutes;
+    private Map<String, BgpSpeaker> bgpSpeakers = new ConcurrentHashMap<>();
+    private Map<IpAddress, BgpPeer> bgpPeers = new ConcurrentHashMap<>();
 
     /**
      * Reads the info contained in the configuration file.
@@ -58,78 +55,25 @@
 
         try {
             Configuration config = mapper.readValue(gatewaysFile, Configuration.class);
-            /*interfaces = new ConcurrentHashMap<>();
-            for (Interface intf : config.getInterfaces()) {
-                interfaces.put(intf.getName(), intf);
-            }*/
-            bgpSpeakers = new ConcurrentHashMap<>();
             for (BgpSpeaker speaker : config.getBgpSpeakers()) {
                 bgpSpeakers.put(speaker.name(), speaker);
             }
-            bgpPeers = new ConcurrentHashMap<>();
             for (BgpPeer peer : config.getPeers()) {
                 bgpPeers.put(peer.ipAddress(), peer);
             }
+        } catch (FileNotFoundException e) {
+            log.warn("Configuration file not found: {}", configFileName);
         } catch (IOException e) {
             log.error("Error reading JSON file", e);
-            //throw new ConfigurationRuntimeException("Error in JSON file", e);
         }
-
-        // Populate the interface InvertedRadixTree
-        /*for (Interface intf : interfaces.values()) {
-            Ip4Prefix prefix = intf.getIp4Prefix();
-            String binaryString = RouteEntry.createBinaryString(prefix);
-            interfaceRoutes.put(binaryString, intf);
-        }*/
     }
 
-    /*
-     * To find the Interface which has longest matchable IP prefix (sub-network
-     *  prefix) to next hop IP address.
-     *
-     * @param address the IP address of next hop router
-     * @return the Interface which has longest matchable IP prefix
-     */
-    /*private Interface longestInterfacePrefixMatch(IpAddress address) {
-        Ip4Prefix prefixToSearchFor =
-            new Ip4Prefix(address, (short) Ip4Address.BIT_LENGTH);
-        String binaryString = RouteEntry.createBinaryString(prefixToSearchFor);
-
-        Iterator<Interface> it =
-            interfaceRoutes.getValuesForKeysPrefixing(binaryString).iterator();
-        Interface intf = null;
-        // Find the last prefix, which will be the longest prefix
-        while (it.hasNext()) {
-            intf = it.next();
-        }
-
-        return intf;
-    }*/
-
-    /*@Override
-    public Interface getOutgoingInterface(IpAddress dstIpAddress) {
-        return longestInterfacePrefixMatch(dstIpAddress);
-    }*/
-
     public void init() {
-        //interfaceRoutes = new ConcurrentInvertedRadixTree<>(
-                //new DefaultByteArrayNodeFactory());
-
-        // Reading config values
-        /*String configFilenameParameter = context.getConfigParams(this).get("configfile");
-        if (configFilenameParameter != null) {
-            currentConfigFilename = configFilenameParameter;
-        }*/
         log.debug("Config file set to {}", configFileName);
 
         readConfiguration(configFileName);
     }
 
-    /*@Override
-    public Map<String, Interface> getInterfaces() {
-        return Collections.unmodifiableMap(interfaces);
-    }*/
-
     @Override
     public Map<String, BgpSpeaker> getBgpSpeakers() {
         return Collections.unmodifiableMap(bgpSpeakers);
