diff --git a/src/main/java/net/onrc/onos/apps/sdnip/ISdnIpService.java b/src/main/java/net/onrc/onos/apps/sdnip/ISdnIpService.java
index a2abaa1..1e7bd08 100644
--- a/src/main/java/net/onrc/onos/apps/sdnip/ISdnIpService.java
+++ b/src/main/java/net/onrc/onos/apps/sdnip/ISdnIpService.java
@@ -54,4 +54,11 @@
      */
     public void beginRouting();
 
+    /**
+     * Start SDN-IP Routing.
+     * Before intent framework is ready, we need two methods to start the
+     * application.
+     */
+    public void beginRoutingWithNewIntent();
+
 }
diff --git a/src/main/java/net/onrc/onos/apps/sdnip/SdnIp.java b/src/main/java/net/onrc/onos/apps/sdnip/SdnIp.java
index ffa9cfa..dd0c072 100644
--- a/src/main/java/net/onrc/onos/apps/sdnip/SdnIp.java
+++ b/src/main/java/net/onrc/onos/apps/sdnip/SdnIp.java
@@ -26,6 +26,7 @@
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.api.newintent.IntentService;
 import net.onrc.onos.api.newintent.MultiPointToSinglePointIntent;
+import net.onrc.onos.api.newintent.PointToPointIntent;
 import net.onrc.onos.apps.proxyarp.IArpRequester;
 import net.onrc.onos.apps.proxyarp.IProxyArpService;
 import net.onrc.onos.apps.sdnip.RibUpdate.Operation;
@@ -37,10 +38,12 @@
 import net.onrc.onos.core.intent.runtime.IPathCalcRuntimeService;
 import net.onrc.onos.core.linkdiscovery.ILinkDiscoveryService;
 import net.onrc.onos.core.main.config.IConfigInfoService;
+import net.onrc.onos.core.matchaction.action.Actions;
 import net.onrc.onos.core.matchaction.action.ModifyDstMacAction;
 import net.onrc.onos.core.matchaction.match.PacketMatch;
 import net.onrc.onos.core.matchaction.match.PacketMatchBuilder;
 import net.onrc.onos.core.newintent.IdBlockAllocatorBasedIntentIdGenerator;
+import net.onrc.onos.core.packet.Ethernet;
 import net.onrc.onos.core.registry.IControllerRegistryService;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.IPv4;
@@ -100,7 +103,9 @@
     private IdBlockAllocatorBasedIntentIdGenerator intentIdGenerator;
     //private static final short ARP_PRIORITY = 20;
 
-    //private static final short BGP_PORT = 179;
+    private static final short BGP_PORT = 179;
+    public static final byte PROTOCOL_ICMP = 0x1;
+    public static final byte PROTOCOL_TCP = 0x6;
 
     // Configuration stuff
     private List<String> switches;
@@ -604,6 +609,160 @@
         pathRuntime.executeIntentOperations(operations);
     }
 
+
+    /**
+     * Setup paths for BGP Daemon and its peers. Run a loop for all the bgpPeers.
+     * Push intent for path from BGPd to the peer. Push intent for path from peer
+     * to BGPd.
+     */
+    private void setupBgpPathsWithNewIntent() {
+        for (BgpPeer bgpPeer : bgpPeers.values()) {
+
+            log.debug("Start to set up BGP paths.");
+
+            Interface peerInterface = interfaces.get(bgpPeer.getInterfaceName());
+
+            IPv4 bgpdAddress = new IPv4(InetAddresses
+                    .coerceToInteger(peerInterface.getIpAddress()));
+            IPv4 bgpdPeerAddress = new IPv4(InetAddresses
+                    .coerceToInteger(bgpPeer.getIpAddress()));
+
+            SwitchPort bgpdSwitchPort = bgpdAttachmentPoint;
+            SwitchPort bgpdPeerSwitchPort = peerInterface.getSwitchPort();
+
+            // install intent for BGP path from BGPd to BGP peer matching
+            // destination TCP port 179
+
+            // 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.
+            PacketMatchBuilder builderMatchDstTcpPort = new PacketMatchBuilder();
+            builderMatchDstTcpPort.setEtherType(Ethernet.TYPE_IPV4);
+            builderMatchDstTcpPort.setIpProto(PROTOCOL_TCP);
+            builderMatchDstTcpPort.setSrcIp(bgpdAddress);
+            builderMatchDstTcpPort.setDstIp(bgpdPeerAddress);
+            builderMatchDstTcpPort.setDstTcpPort(BGP_PORT);
+
+            PacketMatch packetMatch = builderMatchDstTcpPort.build();
+
+            PointToPointIntent intentMatchDstTcpPort = new PointToPointIntent(
+                    intentIdGenerator.getNewId(), packetMatch, Actions
+                    .nullAction(), bgpdSwitchPort, bgpdPeerSwitchPort);
+            intentService.submit(intentMatchDstTcpPort);
+            log.debug("Submitted BGP path intent matching dst TCP port 179 "
+                    + "from BGPd to peer {}: {}",
+                    bgpdPeerAddress, intentMatchDstTcpPort);
+
+            // install intent for BGP path from BGPd to BGP peer matching
+            // source TCP port 179
+            PacketMatchBuilder builderMatchSrcTcpPort = new PacketMatchBuilder();
+            builderMatchSrcTcpPort.setEtherType(Ethernet.TYPE_IPV4);
+            builderMatchSrcTcpPort.setIpProto(PROTOCOL_TCP);
+            builderMatchSrcTcpPort.setSrcIp(bgpdAddress);
+            builderMatchSrcTcpPort.setDstIp(bgpdPeerAddress);
+            builderMatchSrcTcpPort.setSrcTcpPort(BGP_PORT);
+
+            packetMatch = builderMatchSrcTcpPort.build();
+
+            PointToPointIntent intentMatchSrcTcpPort = new PointToPointIntent(
+                    intentIdGenerator.getNewId(), packetMatch, Actions
+                    .nullAction(), bgpdSwitchPort, bgpdPeerSwitchPort);
+            intentService.submit(intentMatchSrcTcpPort);
+            log.debug("Submitted BGP path intent matching src TCP port 179"
+                    + "from BGPd to peer {}: {}",
+                    bgpdPeerAddress, intentMatchSrcTcpPort);
+
+            // install intent for reversed BGP path from BGP peer to BGPd
+            // matching destination TCP port 179
+            PacketMatchBuilder reversedBuilderMatchDstTcpPort = new PacketMatchBuilder();
+            reversedBuilderMatchDstTcpPort.setEtherType(Ethernet.TYPE_IPV4);
+            reversedBuilderMatchDstTcpPort.setIpProto(PROTOCOL_TCP);
+            reversedBuilderMatchDstTcpPort.setSrcIp(bgpdPeerAddress);
+            reversedBuilderMatchDstTcpPort.setDstIp(bgpdAddress);
+            reversedBuilderMatchDstTcpPort.setDstTcpPort(BGP_PORT);
+
+            packetMatch = reversedBuilderMatchDstTcpPort.build();
+
+            PointToPointIntent reversedIntentMatchDstTcpPort = new PointToPointIntent(
+                    intentIdGenerator.getNewId(), packetMatch, Actions
+                    .nullAction(), bgpdPeerSwitchPort, bgpdSwitchPort);
+            intentService.submit(reversedIntentMatchDstTcpPort);
+            log.debug("Submitted BGP path intent matching dst TCP port 179"
+                    + "from BGP peer {} to BGPd: {}",
+                    bgpdPeerAddress, reversedIntentMatchDstTcpPort);
+
+            // install intent for reversed BGP path from BGP peer to BGPd
+            // matching source TCP port 179
+            PacketMatchBuilder reversedBuilderMatchSrcTcpPort = new PacketMatchBuilder();
+            reversedBuilderMatchSrcTcpPort.setEtherType(Ethernet.TYPE_IPV4);
+            reversedBuilderMatchSrcTcpPort.setIpProto(PROTOCOL_TCP);
+            reversedBuilderMatchSrcTcpPort.setSrcIp(bgpdPeerAddress);
+            reversedBuilderMatchSrcTcpPort.setDstIp(bgpdAddress);
+            reversedBuilderMatchSrcTcpPort.setSrcTcpPort(BGP_PORT);
+
+            packetMatch = reversedBuilderMatchSrcTcpPort.build();
+
+            PointToPointIntent reversedIntentMatchSrcTcpPort = new PointToPointIntent(
+                    intentIdGenerator.getNewId(), packetMatch, Actions
+                    .nullAction(), bgpdPeerSwitchPort, bgpdSwitchPort);
+            intentService.submit(reversedIntentMatchSrcTcpPort);
+            log.debug("Submitted BGP path intent matching src TCP port 179"
+                    + "from BGP peer {} to BGPd: {}",
+                    bgpdPeerAddress, reversedIntentMatchSrcTcpPort);
+
+        }
+
+    }
+
+    /**
+     * Setup ICMP paths between BGP Daemon and its peers. Run a loop for all the
+     * bgpPeers. Push intent for path from BGPd to the peer. Push intent for path
+     * from peer to BGPd.
+     */
+    private void setupIcmpPaths() {
+        for (BgpPeer bgpPeer : bgpPeers.values()) {
+
+            Interface peerInterface = interfaces.get(bgpPeer.getInterfaceName());
+
+            PacketMatchBuilder builder = new PacketMatchBuilder();
+            builder.setEtherType(Ethernet.TYPE_IPV4);
+            builder.setIpProto(PROTOCOL_ICMP);
+
+            IPv4 bgpdAddress = new IPv4(InetAddresses
+                    .coerceToInteger(peerInterface.getIpAddress()));
+            IPv4 bgpdPeerAddress = new IPv4(InetAddresses
+                    .coerceToInteger(bgpPeer.getIpAddress()));
+
+            SwitchPort bgpdSwitchPort = bgpdAttachmentPoint;
+            SwitchPort bgpdPeerSwitchPort = peerInterface.getSwitchPort();
+
+            // install intent for ICMP path from BGPd to BGP peer
+            builder.setSrcIp(bgpdAddress);
+            builder.setDstIp(bgpdPeerAddress);
+            PacketMatch packetMatch = builder.build();
+
+            PointToPointIntent intent = new PointToPointIntent(
+                    intentIdGenerator.getNewId(), packetMatch, Actions
+                    .nullAction(), bgpdSwitchPort, bgpdPeerSwitchPort);
+            intentService.submit(intent);
+            log.debug("Submitted ICMP path intent from BGPd to peer {}: {}",
+                    bgpdPeerAddress, intent);
+
+            // install intent for reversed ICMP path from BGP peer to BGPd
+            builder.setSrcIp(bgpdPeerAddress);
+            builder.setDstIp(bgpdAddress);
+            packetMatch = builder.build();
+
+            PointToPointIntent reversedIntent = new PointToPointIntent(
+                    intentIdGenerator.getNewId(), packetMatch, Actions
+                    .nullAction(), bgpdPeerSwitchPort, bgpdSwitchPort);
+            intentService.submit(reversedIntent);
+            log.debug("Submitted ICMP path intent from BGP peer {} to BGPd: {}",
+                    bgpdPeerAddress, reversedIntent);
+        }
+
+    }
+
     /**
      * This method handles the prefixes which are waiting for ARP replies for
      * MAC addresses of next hops.
@@ -761,6 +920,35 @@
     }
 
     /**
+     * The SDN-IP application is started from this method.
+     * Before intent framework is ready, we need two methods to start the
+     * application.
+     */
+    @Override
+    public void beginRoutingWithNewIntent() {
+        log.debug("Topology is now ready, beginning routing function");
+
+        // TODO
+        /*setupArpFlows();
+        setupDefaultDropFlows();*/
+
+        setupBgpPathsWithNewIntent();
+        setupIcmpPaths();
+
+        // Suppress link discovery on external-facing router ports
+        for (Interface intf : interfaces.values()) {
+            linkDiscoveryService.disableDiscoveryOnPort(intf.getDpid(), intf.getPort());
+        }
+
+        bgpUpdatesExecutor.execute(new Runnable() {
+            @Override
+            public void run() {
+                doUpdatesThread();
+            }
+        });
+    }
+
+    /**
      * Thread for handling RIB updates.
      */
     private void doUpdatesThread() {
diff --git a/src/main/java/net/onrc/onos/apps/sdnip/web/SdnIpSetup.java b/src/main/java/net/onrc/onos/apps/sdnip/web/SdnIpSetup.java
index 4bed425..5fb9714 100644
--- a/src/main/java/net/onrc/onos/apps/sdnip/web/SdnIpSetup.java
+++ b/src/main/java/net/onrc/onos/apps/sdnip/web/SdnIpSetup.java
@@ -13,8 +13,17 @@
     public String sdnipSetupMethod() {
         ISdnIpService sdnIp = (ISdnIpService) getContext()
                               .getAttributes().get(ISdnIpService.class.getCanonicalName());
-        sdnIp.beginRouting();
-        return "SdnIp SetupBgpPaths Succeeded";
+        String version = (String) getRequestAttributes().get("version");
+        if (version.equals("new")) {
+            sdnIp.beginRoutingWithNewIntent();
+            return "SdnIp SetupBgpPaths Succeeded with New intent";
+        } else if (version.equals("old")) {
+
+            sdnIp.beginRouting();
+            return "SdnIp SetupBgpPaths Succeeded";
+        }
+
+        return "URL is wrong!";
     }
 
 }
diff --git a/src/main/java/net/onrc/onos/apps/sdnip/web/SdnIpWebRoutableNew.java b/src/main/java/net/onrc/onos/apps/sdnip/web/SdnIpWebRoutableNew.java
index 5b6928a..887f1da 100644
--- a/src/main/java/net/onrc/onos/apps/sdnip/web/SdnIpWebRoutableNew.java
+++ b/src/main/java/net/onrc/onos/apps/sdnip/web/SdnIpWebRoutableNew.java
@@ -15,7 +15,8 @@
     @Override
     public Restlet getRestlet(Context context) {
         Router router = new Router(context);
-        router.attach("/beginRouting/json", SdnIpSetup.class);
+        //router.attach("/beginRouting/json", SdnIpSetup.class);
+        router.attach("/beginRouting/json/{version}", SdnIpSetup.class);
         return router;
     }
 
