diff --git a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/bgp/BgpSessionManager.java b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/bgp/BgpSessionManager.java
index 38fad6c..b6dfd34 100644
--- a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/bgp/BgpSessionManager.java
+++ b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/bgp/BgpSessionManager.java
@@ -32,6 +32,8 @@
 import org.jboss.netty.channel.ChannelPipeline;
 import org.jboss.netty.channel.ChannelPipelineFactory;
 import org.jboss.netty.channel.Channels;
+import org.jboss.netty.channel.group.ChannelGroup;
+import org.jboss.netty.channel.group.DefaultChannelGroup;
 import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
 import org.onlab.onos.sdnip.RouteListener;
 import org.onlab.onos.sdnip.RouteUpdate;
@@ -46,7 +48,10 @@
 public class BgpSessionManager {
     private static final Logger log =
         LoggerFactory.getLogger(BgpSessionManager.class);
+    boolean isShutdown = true;
     private Channel serverChannel;     // Listener for incoming BGP connections
+    private ServerBootstrap serverBootstrap;
+    private ChannelGroup allChannels = new DefaultChannelGroup();
     private ConcurrentMap<SocketAddress, BgpSession> bgpSessions =
         new ConcurrentHashMap<>();
     private Ip4Address myBgpId;        // Same BGP ID for all peers
@@ -85,6 +90,24 @@
     }
 
     /**
+     * Adds the channel for a BGP session.
+     *
+     * @param channel the channel to add
+     */
+    void addSessionChannel(Channel channel) {
+        allChannels.add(channel);
+    }
+
+    /**
+     * Removes the channel for a BGP session.
+     *
+     * @param channel the channel to remove
+     */
+    void removeSessionChannel(Channel channel) {
+        allChannels.remove(channel);
+    }
+
+    /**
      * Processes the connection from a BGP peer.
      *
      * @param bgpSession the BGP session for the peer
@@ -160,6 +183,7 @@
      */
     public void startUp(int listenPortNumber) {
         log.debug("BGP Session Manager startUp()");
+        isShutdown = false;
 
         ChannelFactory channelFactory =
             new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),
@@ -183,13 +207,14 @@
         InetSocketAddress listenAddress =
             new InetSocketAddress(listenPortNumber);
 
-        ServerBootstrap serverBootstrap = new ServerBootstrap(channelFactory);
+        serverBootstrap = new ServerBootstrap(channelFactory);
         // serverBootstrap.setOptions("reuseAddr", true);
         serverBootstrap.setOption("child.keepAlive", true);
         serverBootstrap.setOption("child.tcpNoDelay", true);
         serverBootstrap.setPipelineFactory(pipelineFactory);
         try {
             serverChannel = serverBootstrap.bind(listenAddress);
+            allChannels.add(serverChannel);
         } catch (ChannelException e) {
             log.debug("Exception binding to BGP port {}: ",
                       listenAddress.getPort(), e);
@@ -200,10 +225,9 @@
      * Shuts down the BGP Session Manager operation.
      */
     public void shutDown() {
-        // TODO: Complete the implementation: remove routes, etc.
-        if (serverChannel != null) {
-            serverChannel.close();
-        }
+        isShutdown = true;
+        allChannels.close().awaitUninterruptibly();
+        serverBootstrap.releaseExternalResources();
     }
 
     /**
@@ -223,6 +247,9 @@
         synchronized void routeUpdates(BgpSession bgpSession,
                         Collection<BgpRouteEntry> addedBgpRouteEntries,
                         Collection<BgpRouteEntry> deletedBgpRouteEntries) {
+            if (isShutdown) {
+                return;         // Ignore any leftover updates if shutdown
+            }
             // Process the deleted route entries
             for (BgpRouteEntry bgpRouteEntry : deletedBgpRouteEntries) {
                 processDeletedRoute(bgpSession, bgpRouteEntry);
