diff --git a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/PeerConnectivityManager.java b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/PeerConnectivityManager.java
index 3917f5a..400dba0 100644
--- a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/PeerConnectivityManager.java
+++ b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/PeerConnectivityManager.java
@@ -1,13 +1,11 @@
 package org.onlab.onos.sdnip;
 
-import java.util.List;
-
+import org.onlab.onos.ApplicationId;
 import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.flow.DefaultTrafficSelector;
 import org.onlab.onos.net.flow.DefaultTrafficTreatment;
 import org.onlab.onos.net.flow.TrafficSelector;
 import org.onlab.onos.net.flow.TrafficTreatment;
-import org.onlab.onos.net.intent.IntentId;
 import org.onlab.onos.net.intent.IntentService;
 import org.onlab.onos.net.intent.PointToPointIntent;
 import org.onlab.onos.sdnip.config.BgpPeer;
@@ -22,6 +20,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.List;
+
 /**
  * Manages the connectivity requirements between peers.
  */
@@ -38,11 +38,13 @@
     private final InterfaceService interfaceService;
     private final IntentService intentService;
 
-    // TODO this sucks.
-    private int intentId = 0;
+    private final ApplicationId appId;
 
-    public PeerConnectivityManager(SdnIpConfigService configInfoService,
-            InterfaceService interfaceService, IntentService intentService) {
+    public PeerConnectivityManager(ApplicationId appId,
+                                   SdnIpConfigService configInfoService,
+                                   InterfaceService interfaceService,
+                                   IntentService intentService) {
+        this.appId = appId;
         this.configInfoService = configInfoService;
         this.interfaceService = interfaceService;
         this.intentService = intentService;
@@ -53,15 +55,15 @@
         if (interfaceService.getInterfaces().isEmpty()) {
 
             log.warn("The interface in configuration file is empty. "
-                    + "Thus, the SDN-IP application can not be started.");
+                             + "Thus, the SDN-IP application can not be started.");
         } else if (configInfoService.getBgpPeers().isEmpty()) {
 
             log.warn("The BGP peer in configuration file is empty."
-                    + "Thus, the SDN-IP application can not be started.");
+                             + "Thus, the SDN-IP application can not be started.");
         } else if (configInfoService.getBgpSpeakers() == null) {
 
             log.error("The BGP speaker in configuration file is empty. "
-                    + "Thus, the SDN-IP application can not be started.");
+                              + "Thus, the SDN-IP application can not be started.");
             return;
         }
 
@@ -80,7 +82,7 @@
         for (BgpSpeaker bgpSpeaker : configInfoService.getBgpSpeakers()
                 .values()) {
             log.debug("Start to set up BGP paths for BGP speaker: {}",
-                    bgpSpeaker);
+                      bgpSpeaker);
             ConnectPoint bgpdConnectPoint = bgpSpeaker.connectPoint();
 
             List<InterfaceAddress> interfaceAddresses =
@@ -89,14 +91,14 @@
             for (BgpPeer bgpPeer : configInfoService.getBgpPeers().values()) {
 
                 log.debug("Start to set up BGP paths between BGP speaker: {} "
-                        + "to BGP peer: {}", bgpSpeaker, bgpPeer);
+                                  + "to BGP peer: {}", bgpSpeaker, bgpPeer);
 
                 Interface peerInterface = interfaceService.getInterface(
                         bgpPeer.connectPoint());
                 if (peerInterface == null) {
                     log.error("Can not find the corresponding Interface from "
-                            + "configuration for BGP peer {}",
-                            bgpPeer.ipAddress());
+                                      + "configuration for BGP peer {}",
+                              bgpPeer.ipAddress());
                     continue;
                 }
 
@@ -110,7 +112,7 @@
                 }
                 if (bgpdAddress == null) {
                     log.debug("There is no interface IP address for bgpPeer: {}"
-                            + " on interface {}", bgpPeer, bgpPeer.connectPoint());
+                                      + " on interface {}", bgpPeer, bgpPeer.connectPoint());
                     return;
                 }
 
@@ -123,7 +125,7 @@
                 // TODO: The usage of PacketMatchBuilder will be improved, then we
                 // only need to new the PacketMatchBuilder once.
                 // By then, the code here will be improved accordingly.
-                 TrafficSelector selector = DefaultTrafficSelector.builder()
+                TrafficSelector selector = DefaultTrafficSelector.builder()
                         .matchEthType(Ethernet.TYPE_IPV4)
                         .matchIPProtocol(IPv4.PROTOCOL_TCP)
                         .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH))
@@ -134,13 +136,13 @@
                 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
                         .build();
 
-                PointToPointIntent intentMatchDstTcpPort = new PointToPointIntent(
-                        nextIntentId(), selector, treatment,
-                        bgpdConnectPoint, bgpdPeerConnectPoint);
+                PointToPointIntent intentMatchDstTcpPort =
+                        new PointToPointIntent(appId, selector, treatment,
+                                               bgpdConnectPoint, bgpdPeerConnectPoint);
                 intentService.submit(intentMatchDstTcpPort);
                 log.debug("Submitted BGP path intent matching dst TCP port 179 "
-                        + "from BGPd {} to peer {}: {}",
-                        bgpdAddress, bgpdPeerAddress, intentMatchDstTcpPort);
+                                  + "from BGPd {} to peer {}: {}",
+                          bgpdAddress, bgpdPeerAddress, intentMatchDstTcpPort);
 
                 // install intent for BGP path from BGPd to BGP peer matching
                 // source TCP port 179
@@ -152,13 +154,13 @@
                         .matchTcpSrc(BGP_PORT)
                         .build();
 
-                PointToPointIntent intentMatchSrcTcpPort = new PointToPointIntent(
-                        nextIntentId(), selector, treatment,
-                        bgpdConnectPoint, bgpdPeerConnectPoint);
+                PointToPointIntent intentMatchSrcTcpPort =
+                        new PointToPointIntent(appId, selector, treatment,
+                                               bgpdConnectPoint, bgpdPeerConnectPoint);
                 intentService.submit(intentMatchSrcTcpPort);
                 log.debug("Submitted BGP path intent matching src TCP port 179"
-                        + "from BGPd {} to peer {}: {}",
-                        bgpdAddress, bgpdPeerAddress, intentMatchSrcTcpPort);
+                                  + "from BGPd {} to peer {}: {}",
+                          bgpdAddress, bgpdPeerAddress, intentMatchSrcTcpPort);
 
                 // install intent for reversed BGP path from BGP peer to BGPd
                 // matching destination TCP port 179
@@ -170,13 +172,13 @@
                         .matchTcpDst(BGP_PORT)
                         .build();
 
-                PointToPointIntent reversedIntentMatchDstTcpPort = new PointToPointIntent(
-                        nextIntentId(), selector, treatment,
-                        bgpdPeerConnectPoint, bgpdConnectPoint);
+                PointToPointIntent reversedIntentMatchDstTcpPort =
+                        new PointToPointIntent(appId, selector, treatment,
+                                               bgpdPeerConnectPoint, bgpdConnectPoint);
                 intentService.submit(reversedIntentMatchDstTcpPort);
                 log.debug("Submitted BGP path intent matching dst TCP port 179"
-                        + "from BGP peer {} to BGPd {} : {}",
-                        bgpdPeerAddress, bgpdAddress, reversedIntentMatchDstTcpPort);
+                                  + "from BGP peer {} to BGPd {} : {}",
+                          bgpdPeerAddress, bgpdAddress, reversedIntentMatchDstTcpPort);
 
                 // install intent for reversed BGP path from BGP peer to BGPd
                 // matching source TCP port 179
@@ -188,13 +190,13 @@
                         .matchTcpSrc(BGP_PORT)
                         .build();
 
-                PointToPointIntent reversedIntentMatchSrcTcpPort = new PointToPointIntent(
-                        nextIntentId(), selector, treatment,
-                        bgpdPeerConnectPoint, bgpdConnectPoint);
+                PointToPointIntent reversedIntentMatchSrcTcpPort =
+                        new PointToPointIntent(appId, selector, treatment,
+                                               bgpdPeerConnectPoint, bgpdConnectPoint);
                 intentService.submit(reversedIntentMatchSrcTcpPort);
                 log.debug("Submitted BGP path intent matching src TCP port 179"
-                        + "from BGP peer {} to BGPd {} : {}",
-                        bgpdPeerAddress, bgpdAddress, reversedIntentMatchSrcTcpPort);
+                                  + "from BGP peer {} to BGPd {} : {}",
+                          bgpdPeerAddress, bgpdAddress, reversedIntentMatchSrcTcpPort);
 
             }
         }
@@ -212,7 +214,7 @@
         for (BgpSpeaker bgpSpeaker : configInfoService.getBgpSpeakers()
                 .values()) {
             log.debug("Start to set up ICMP paths for BGP speaker: {}",
-                    bgpSpeaker);
+                      bgpSpeaker);
             ConnectPoint bgpdConnectPoint = bgpSpeaker.connectPoint();
             List<InterfaceAddress> interfaceAddresses = bgpSpeaker
                     .interfaceAddresses();
@@ -224,8 +226,8 @@
 
                 if (peerInterface == null) {
                     log.error("Can not find the corresponding Interface from "
-                            + "configuration for BGP peer {}",
-                            bgpPeer.ipAddress());
+                                      + "configuration for BGP peer {}",
+                              bgpPeer.ipAddress());
                     continue;
                 }
                 IpAddress bgpdAddress = null;
@@ -239,8 +241,8 @@
                 }
                 if (bgpdAddress == null) {
                     log.debug("There is no IP address for bgpPeer: {} on "
-                            + "interface port: {}", bgpPeer,
-                            bgpPeer.connectPoint());
+                                      + "interface port: {}", bgpPeer,
+                              bgpPeer.connectPoint());
                     return;
                 }
 
@@ -258,12 +260,12 @@
                 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
                         .build();
 
-                PointToPointIntent intent = new PointToPointIntent(
-                        nextIntentId(), selector, treatment,
-                        bgpdConnectPoint, bgpdPeerConnectPoint);
+                PointToPointIntent intent =
+                        new PointToPointIntent(appId, selector, treatment,
+                                               bgpdConnectPoint, bgpdPeerConnectPoint);
                 intentService.submit(intent);
                 log.debug("Submitted ICMP path intent from BGPd {} to peer {} :"
-                        + " {}", bgpdAddress, bgpdPeerAddress, intent);
+                                  + " {}", bgpdAddress, bgpdPeerAddress, intent);
 
                 // install intent for reversed ICMP path from BGP peer to BGPd
                 selector = DefaultTrafficSelector.builder()
@@ -273,18 +275,15 @@
                         .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH))
                         .build();
 
-                PointToPointIntent reversedIntent = new PointToPointIntent(
-                        nextIntentId(), selector, treatment,
-                        bgpdPeerConnectPoint, bgpdConnectPoint);
+                PointToPointIntent reversedIntent =
+                        new PointToPointIntent(appId, selector, treatment,
+                                               bgpdPeerConnectPoint, bgpdConnectPoint);
                 intentService.submit(reversedIntent);
                 log.debug("Submitted ICMP path intent from BGP peer {} to BGPd"
-                        + " {} : {}",
-                        bgpdPeerAddress, bgpdAddress, reversedIntent);
+                                  + " {} : {}",
+                          bgpdPeerAddress, bgpdAddress, reversedIntent);
             }
         }
     }
 
-    private IntentId nextIntentId() {
-        return new IntentId(intentId++);
-    }
 }
