diff --git a/apps/routing-api/src/main/java/org/onosproject/routing/config/BgpPeer.java b/apps/routing-api/src/main/java/org/onosproject/routing/config/BgpPeer.java
deleted file mode 100644
index e08177f..0000000
--- a/apps/routing-api/src/main/java/org/onosproject/routing/config/BgpPeer.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.routing.config;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import org.onlab.packet.IpAddress;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.NetTools;
-import org.onosproject.net.PortNumber;
-
-import java.util.Objects;
-
-/**
- * Configuration details for a BGP peer.
- */
-public class BgpPeer {
-    private final ConnectPoint connectPoint;
-    private final IpAddress ipAddress;
-
-    /**
-     * Creates a new BgpPeer.
-     *
-     * @param dpid the DPID of the switch the peer is attached at, as a String
-     * @param port the port the peer is attached at
-     * @param ipAddress the IP address of the peer as a String
-     */
-    public BgpPeer(@JsonProperty("attachmentDpid") String dpid,
-                   @JsonProperty("attachmentPort") long port,
-                   @JsonProperty("ipAddress") String ipAddress) {
-        this.connectPoint = new ConnectPoint(
-                DeviceId.deviceId(NetTools.dpidToUri(dpid)),
-                PortNumber.portNumber(port));
-        this.ipAddress = IpAddress.valueOf(ipAddress);
-    }
-
-    /**
-     * Gets the connection point of the peer.
-     *
-     * @return the connection point
-     */
-    public ConnectPoint connectPoint() {
-        return connectPoint;
-    }
-
-    /**
-     * Gets the IP address of the peer.
-     *
-     * @return the IP address
-     */
-    public IpAddress ipAddress() {
-        return ipAddress;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(connectPoint, ipAddress);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-
-        if (!(obj instanceof BgpPeer)) {
-            return false;
-        }
-
-        BgpPeer that = (BgpPeer) obj;
-        return Objects.equals(this.connectPoint, that.connectPoint)
-                && Objects.equals(this.ipAddress, that.ipAddress);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("connectPoint", connectPoint)
-                .add("ipAddress", ipAddress)
-                .toString();
-    }
-}
diff --git a/apps/routing-api/src/main/java/org/onosproject/routing/config/BgpSpeaker.java b/apps/routing-api/src/main/java/org/onosproject/routing/config/BgpSpeaker.java
deleted file mode 100644
index 8b53880..0000000
--- a/apps/routing-api/src/main/java/org/onosproject/routing/config/BgpSpeaker.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.routing.config;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import org.onlab.packet.MacAddress;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.NetTools;
-import org.onosproject.net.PortNumber;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Represents a BGP daemon in SDN network.
- * <p>
- * Each BGP speaker has a attachment point, which includes a switch DPID and a
- * switch port. Each BGP speaker has one MAC address and several IP addresses,
- * which are used to peer with BGP peers outside the SDN network. For each
- * peer outside the SDN network, we configure a different IP address to BGP
- * speaker inside the SDN network.
- * </p>
- * <p>
- * Each BGP speaker has a name, which is a unique identifying String that is
- * used to reference this speaker in the configuration.
- * </p>
- */
-public class BgpSpeaker {
-    private final String name;
-    private final ConnectPoint connectPoint;
-    private final MacAddress macAddress;
-    private List<InterfaceAddress> interfaceAddresses;
-
-    /**
-     * Class constructor used by the JSON library to create an object.
-     *
-     * @param name the name of the BGP speaker inside SDN network
-     * @param attachmentDpid the DPID where the BGP speaker is attached to
-     * @param attachmentPort the port where the BGP speaker is attached to
-     * @param macAddress the MAC address of the BGP speaker
-     */
-    @JsonCreator
-    public BgpSpeaker(@JsonProperty("name") String name,
-            @JsonProperty("attachmentDpid") String attachmentDpid,
-            @JsonProperty("attachmentPort") long attachmentPort,
-            @JsonProperty("macAddress") String macAddress) {
-
-        this.name = name;
-        this.macAddress = MacAddress.valueOf(macAddress);
-        this.connectPoint = new ConnectPoint(
-                DeviceId.deviceId(NetTools.dpidToUri(attachmentDpid)),
-                PortNumber.portNumber(attachmentPort));
-    }
-
-    /**
-     * Sets the addresses we configured for the BGP speaker on all virtual
-     * {@link Interface}s.
-     *
-     * @param interfaceAddresses a list of IP addresses of the BGP speaker
-     * configured on all virtual interfaces
-     */
-    @JsonProperty("interfaceAddresses")
-    public void setInterfaceAddresses(
-            List<InterfaceAddress> interfaceAddresses) {
-        this.interfaceAddresses = interfaceAddresses;
-    }
-
-    /**
-     * Gets the BGP speaker name.
-     *
-     * @return the BGP speaker name
-     */
-    public String name() {
-        return name;
-    }
-
-    /**
-     * Gets the connect point where the BGP speaker is attached.
-     *
-     * @return the connect point
-     */
-    public ConnectPoint connectPoint() {
-        return connectPoint;
-    }
-
-    /**
-     * Gets the MAC address of the BGP speaker.
-     *
-     * @return the MAC address
-     */
-    public MacAddress macAddress() {
-        return macAddress;
-    }
-
-    /**
-     * Gets all IP addresses configured on all {@link Interface}s of the
-     * BGP speaker.
-     *
-     * @return a list of IP addresses of the BGP speaker configured on all
-     * virtual interfaces
-     */
-    public List<InterfaceAddress> interfaceAddresses() {
-        return interfaceAddresses;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (!(other instanceof BgpSpeaker)) {
-            return false;
-        }
-
-        BgpSpeaker otherBgpSpeaker = (BgpSpeaker) other;
-
-        return  name.equals(otherBgpSpeaker.name) &&
-                connectPoint.equals(
-                        otherBgpSpeaker.connectPoint) &&
-                macAddress.equals(otherBgpSpeaker.macAddress) &&
-                interfaceAddresses.equals(otherBgpSpeaker.interfaceAddresses);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(name, connectPoint, macAddress,
-                interfaceAddresses);
-
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("speakerName", name)
-                .add("connectPoint", connectPoint)
-                .add("macAddress", macAddress)
-                .add("interfaceAddresses", interfaceAddresses)
-                .toString();
-    }
-}
diff --git a/apps/routing-api/src/main/java/org/onosproject/routing/config/Interface.java b/apps/routing-api/src/main/java/org/onosproject/routing/config/Interface.java
deleted file mode 100644
index 347847a..0000000
--- a/apps/routing-api/src/main/java/org/onosproject/routing/config/Interface.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.routing.config;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.Sets;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.VlanId;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.host.InterfaceIpAddress;
-
-import java.util.Objects;
-import java.util.Set;
-
-/**
- * An Interface is a set of addresses that are logically mapped to a switch
- * port in the network.
- */
-public class Interface {
-    private final ConnectPoint connectPoint;
-    private final Set<InterfaceIpAddress> ipAddresses;
-    private final MacAddress macAddress;
-    private final VlanId vlan;
-
-    /**
-     * Creates an Interface based on a connection point, a set of interface
-     * IP addresses, and a MAC address.
-     *
-     * @param connectPoint the connect point this interface is mapped to
-     * @param ipAddresses the IP addresses for the interface
-     * @param macAddress the MAC address of the interface
-     * @param vlan VLAN identifier
-     */
-    public Interface(ConnectPoint connectPoint,
-                     Set<InterfaceIpAddress> ipAddresses,
-                     MacAddress macAddress, VlanId vlan) {
-        this.connectPoint = connectPoint;
-        this.ipAddresses = Sets.newHashSet(ipAddresses);
-        this.macAddress = macAddress;
-        this.vlan = vlan;
-    }
-
-    /**
-     * Retrieves the connection point that this interface maps to.
-     *
-     * @return the connection point
-     */
-    public ConnectPoint connectPoint() {
-        return connectPoint;
-    }
-
-    /**
-     * Retrieves the set of IP addresses that are assigned to the interface.
-     *
-     * @return the set of interface IP addresses
-     */
-    public Set<InterfaceIpAddress> ipAddresses() {
-        return ipAddresses;
-    }
-
-    /**
-     * Retrieves the MAC address that is assigned to the interface.
-     *
-     * @return the MAC address
-     */
-    public MacAddress mac() {
-        return macAddress;
-    }
-
-    /**
-     * Retrieves the VLAN ID that is assigned to the interface.
-     *
-     * @return the VLAN ID
-     */
-    public VlanId vlan() {
-        return vlan;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (!(other instanceof Interface)) {
-            return false;
-        }
-
-        Interface otherInterface = (Interface) other;
-
-        return  connectPoint.equals(otherInterface.connectPoint) &&
-                ipAddresses.equals(otherInterface.ipAddresses) &&
-                macAddress.equals(otherInterface.macAddress) &&
-                vlan.equals(otherInterface.vlan);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(connectPoint, ipAddresses, macAddress, vlan);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("connectPoint", connectPoint)
-                .add("ipAddresses", ipAddresses)
-                .add("macAddress", macAddress)
-                .add("vlan", vlan)
-                .toString();
-    }
-}
diff --git a/apps/routing-api/src/main/java/org/onosproject/routing/config/InterfaceAddress.java b/apps/routing-api/src/main/java/org/onosproject/routing/config/InterfaceAddress.java
deleted file mode 100644
index a210957..0000000
--- a/apps/routing-api/src/main/java/org/onosproject/routing/config/InterfaceAddress.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.routing.config;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import org.onlab.packet.IpAddress;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.NetTools;
-import org.onosproject.net.PortNumber;
-
-import java.util.Objects;
-
-/**
- * Represents an address of a {@link BgpSpeaker} configured on an
- * {@link Interface}.
- * <p>
- * Each InterfaceAddress includes the interface name and an IP address.
- * </p>
- */
-public class InterfaceAddress {
-    private final ConnectPoint connectPoint;
-    private final IpAddress ipAddress;
-
-    /**
-     * Creates an InterfaceAddress object.
-     *
-     * @param dpid the DPID of the interface as a String
-     * @param port the port of the interface
-     * @param ipAddress the IP address of a {@link BgpSpeaker} configured on
-     * the interface
-     */
-    public InterfaceAddress(@JsonProperty("interfaceDpid") String dpid,
-                            @JsonProperty("interfacePort") int port,
-                            @JsonProperty("ipAddress") String ipAddress) {
-        this.connectPoint = new ConnectPoint(
-                DeviceId.deviceId(NetTools.dpidToUri(dpid)),
-                PortNumber.portNumber(port));
-        this.ipAddress = IpAddress.valueOf(ipAddress);
-    }
-
-    /**
-     * Gets the connection point of the peer.
-     *
-     * @return the connection point
-     */
-    public ConnectPoint connectPoint() {
-        return connectPoint;
-    }
-
-    /**
-     * Gets the IP address of a BGP speaker configured on an {@link Interface}.
-     *
-     * @return the IP address
-     */
-    public IpAddress ipAddress() {
-        return ipAddress;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(connectPoint, ipAddress);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-
-        if (!(obj instanceof InterfaceAddress)) {
-            return false;
-        }
-
-        InterfaceAddress that = (InterfaceAddress) obj;
-        return Objects.equals(this.connectPoint, that.connectPoint)
-                && Objects.equals(this.ipAddress, that.ipAddress);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("connectPoint", connectPoint)
-                .add("ipAddress", ipAddress)
-                .toString();
-    }
-}
diff --git a/apps/routing/src/main/java/org/onosproject/routing/config/impl/Configuration.java b/apps/routing/src/main/java/org/onosproject/routing/config/impl/Configuration.java
deleted file mode 100644
index dd1ffe3..0000000
--- a/apps/routing/src/main/java/org/onosproject/routing/config/impl/Configuration.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.routing.config.impl;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import org.onlab.packet.MacAddress;
-import org.onosproject.routing.config.BgpPeer;
-import org.onosproject.routing.config.BgpSpeaker;
-import org.onosproject.routing.config.LocalIpPrefixEntry;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Contains the configuration data for SDN-IP that has been read from a
- * JSON-formatted configuration file.
- */
-public class Configuration {
-    // 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 List<BgpSpeaker> bgpSpeakers = Collections.emptyList();
-    private List<BgpPeer> peers = Collections.emptyList();
-    private MacAddress virtualGatewayMacAddress;
-
-    // All IP prefixes from the configuration are local
-    private List<LocalIpPrefixEntry> localIp4PrefixEntries =
-            Collections.emptyList();
-    private List<LocalIpPrefixEntry> localIp6PrefixEntries =
-            Collections.emptyList();
-
-    /**
-     * Default constructor.
-     */
-    public Configuration() {
-    }
-
-    /**
-     * Gets a list of bgpSpeakers in the system, represented by
-     * {@link BgpSpeaker} objects.
-     *
-     * @return the list of BGP speakers
-     */
-    public List<BgpSpeaker> getBgpSpeakers() {
-        return Collections.unmodifiableList(bgpSpeakers);
-    }
-
-    /**
-     * Sets a list of bgpSpeakers in the system.
-     *
-     * @param bgpSpeakers the list of BGP speakers
-     */
-    @JsonProperty("bgpSpeakers")
-    public void setBgpSpeakers(List<BgpSpeaker> bgpSpeakers) {
-        this.bgpSpeakers = bgpSpeakers;
-    }
-
-    /**
-     * Gets a list of BGP peers we are configured to peer with. Peers are
-     * represented by {@link BgpPeer} objects.
-     *
-     * @return the list of BGP peers
-     */
-    public List<BgpPeer> getPeers() {
-        return Collections.unmodifiableList(peers);
-    }
-
-    /**
-     * Sets a list of BGP peers we configured to peer with.
-     *
-     * @param peers the list of BGP peers
-     */
-    @JsonProperty("bgpPeers")
-    public void setPeers(List<BgpPeer> peers) {
-        this.peers = peers;
-    }
-
-    /**
-     * Gets the MAC address we configured for virtual gateway
-     * in SDN network.
-     *
-     * @return the MAC address of virtual gateway
-     */
-    public MacAddress getVirtualGatewayMacAddress() {
-        return virtualGatewayMacAddress;
-    }
-
-    /**
-     * Sets the MAC address for virtual gateway in SDN network.
-     *
-     * @param virtualGatewayMacAddress the MAC address of virtual gateway
-     */
-    @JsonProperty("virtualGatewayMacAddress")
-    public void setVirtualGatewayMacAddress(MacAddress virtualGatewayMacAddress) {
-        this.virtualGatewayMacAddress = virtualGatewayMacAddress;
-    }
-
-    /**
-     * Gets a list of local IPv4 prefix entries configured for local
-     * SDN network.
-     * <p>
-     * IP prefix entries are represented by {@link LocalIpPrefixEntry}
-     * objects.
-     * </p>
-     *
-     * @return the list of local IPv4 prefix entries
-     */
-    public List<LocalIpPrefixEntry> getLocalIp4PrefixEntries() {
-        return Collections.unmodifiableList(localIp4PrefixEntries);
-    }
-
-    /**
-     * Sets a list of IPv4 prefix entries configured for local SDN network.
-     *
-     * @param ip4PrefixEntries the list of Ipv4 prefix entries
-     */
-    @JsonProperty("ip4LocalPrefixes")
-    public void setLocalIp4PrefixEntries(List<LocalIpPrefixEntry> ip4PrefixEntries) {
-        this.localIp4PrefixEntries = ip4PrefixEntries;
-    }
-
-    /**
-     * Gets a list of IPv6 prefix entries configured for local SDN network.
-     * <p>
-     * IP prefix entries are represented by {@link LocalIpPrefixEntry}
-     * objects.
-     * </p>
-     *
-     * @return the list of IPv6 prefix entries
-     */
-    public List<LocalIpPrefixEntry> getLocalIp6PrefixEntries() {
-        return Collections.unmodifiableList(localIp6PrefixEntries);
-    }
-
-    /**
-     * Sets a list of IPv6 prefix entries configured for local SDN network.
-     *
-     * @param ip6PrefixEntries the list of Ipv6 prefix entries
-     */
-    @JsonProperty("ip6LocalPrefixes")
-    public void setLocalIp6PrefixEntries(List<LocalIpPrefixEntry> ip6PrefixEntries) {
-        this.localIp6PrefixEntries = ip6PrefixEntries;
-    }
-
-}
diff --git a/apps/routing/src/main/java/org/onosproject/routing/config/impl/RoutingConfigurationImpl.java b/apps/routing/src/main/java/org/onosproject/routing/config/impl/RoutingConfigurationImpl.java
index 31b16c6..f3533a5 100644
--- a/apps/routing/src/main/java/org/onosproject/routing/config/impl/RoutingConfigurationImpl.java
+++ b/apps/routing/src/main/java/org/onosproject/routing/config/impl/RoutingConfigurationImpl.java
@@ -58,7 +58,7 @@
 
 /**
  * Implementation of RoutingConfigurationService which reads routing
- * configuration from a file.
+ * configuration from the network configuration service.
  */
 @Component(immediate = true)
 @Service
diff --git a/apps/routing/src/test/java/org/onosproject/routing/impl/IntentSynchronizerTest.java b/apps/routing/src/test/java/org/onosproject/routing/impl/IntentSynchronizerTest.java
index 0172dc7..4b7110a 100644
--- a/apps/routing/src/test/java/org/onosproject/routing/impl/IntentSynchronizerTest.java
+++ b/apps/routing/src/test/java/org/onosproject/routing/impl/IntentSynchronizerTest.java
@@ -15,20 +15,14 @@
  */
 package org.onosproject.routing.impl;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.MoreExecutors;
 import org.junit.Before;
 import org.junit.Test;
-import org.onlab.junit.TestUtils;
-import org.onlab.junit.TestUtils.TestUtilsException;
 import org.onlab.packet.Ethernet;
-import org.onlab.packet.Ip4Address;
 import org.onlab.packet.Ip4Prefix;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
-import org.onlab.packet.VlanId;
 import org.onosproject.TestApplicationId;
 import org.onosproject.cluster.ClusterServiceAdapter;
 import org.onosproject.cluster.ControllerNode;
@@ -37,7 +31,6 @@
 import org.onosproject.cluster.NodeId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreServiceAdapter;
-import org.onosproject.incubator.net.intf.Interface;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
@@ -45,19 +38,15 @@
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.host.InterfaceIpAddress;
 import org.onosproject.net.intent.AbstractIntentTest;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.IntentService;
 import org.onosproject.net.intent.IntentState;
-import org.onosproject.net.intent.IntentUtils;
 import org.onosproject.net.intent.Key;
 import org.onosproject.net.intent.MultiPointToSinglePointIntent;
-import org.onosproject.routing.RouteEntry;
 
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 
@@ -66,9 +55,6 @@
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.reset;
 import static org.easymock.EasyMock.verify;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
 
 /**
  * This class tests the intent synchronization function in the
@@ -95,7 +81,7 @@
             PortNumber.portNumber(1));
 
     private IntentSynchronizer intentSynchronizer;
-    private final Set<Interface> interfaces = Sets.newHashSet();
+    private final Set<ConnectPoint> connectPoints = new HashSet<>();
 
     private static final ApplicationId APPID =
             TestApplicationId.create("intent-sync-test");
@@ -107,7 +93,7 @@
     public void setUp() throws Exception {
         super.setUp();
 
-        setUpInterfaceService();
+        setUpConnectPoints();
 
         intentService = createMock(IntentService.class);
 
@@ -115,131 +101,58 @@
 
         intentSynchronizer.coreService = new TestCoreService();
         intentSynchronizer.clusterService = new TestClusterService();
-        intentSynchronizer.leadershipService = new TestLeadershipService();
+        intentSynchronizer.leadershipService = new LeadershipServiceAdapter();
         intentSynchronizer.intentService = intentService;
 
         intentSynchronizer.activate();
     }
 
     /**
-     * Sets up InterfaceService.
+     * Sets up connect points.
      */
-    private void setUpInterfaceService() {
-        List<InterfaceIpAddress> interfaceIpAddresses1 = Lists.newArrayList();
-        interfaceIpAddresses1.add(new InterfaceIpAddress(
-                IpAddress.valueOf("192.168.10.101"),
-                IpPrefix.valueOf("192.168.10.0/24")));
-        Interface sw1Eth1 = new Interface(SW1_ETH1,
-                interfaceIpAddresses1, MacAddress.valueOf("00:00:00:00:00:01"),
-                VlanId.NONE);
-        interfaces.add(sw1Eth1);
-
-        List<InterfaceIpAddress> interfaceIpAddresses2 = Lists.newArrayList();
-        interfaceIpAddresses2.add(
-                new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"),
-                                       IpPrefix.valueOf("192.168.20.0/24")));
-        Interface sw2Eth1 = new Interface(SW2_ETH1,
-                interfaceIpAddresses2, MacAddress.valueOf("00:00:00:00:00:02"),
-                VlanId.NONE);
-        interfaces.add(sw2Eth1);
-
-        List<InterfaceIpAddress> interfaceIpAddresses3 = Lists.newArrayList();
-        interfaceIpAddresses3.add(
-                new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"),
-                                       IpPrefix.valueOf("192.168.30.0/24")));
-        Interface sw3Eth1 = new Interface(SW3_ETH1,
-                interfaceIpAddresses3, MacAddress.valueOf("00:00:00:00:00:03"),
-                VlanId.NONE);
-        interfaces.add(sw3Eth1);
-
-        InterfaceIpAddress interfaceIpAddress4 =
-                new InterfaceIpAddress(IpAddress.valueOf("192.168.40.101"),
-                                       IpPrefix.valueOf("192.168.40.0/24"));
-        Interface sw4Eth1 = new Interface(SW4_ETH1,
-                                          Lists.newArrayList(interfaceIpAddress4),
-                                          MacAddress.valueOf("00:00:00:00:00:04"),
-                                          VlanId.vlanId((short) 1));
-
-        interfaces.add(sw4Eth1);
+    private void setUpConnectPoints() {
+        connectPoints.add(SW1_ETH1);
+        connectPoints.add(SW2_ETH1);
+        connectPoints.add(SW3_ETH1);
+        connectPoints.add(SW4_ETH1);
     }
 
     /**
      * Tests the synchronization behavior of intent synchronizer. We set up
      * a discrepancy between the intent service state and the intent
      * synchronizer's state and ensure that this is reconciled correctly.
-     *
-     * @throws TestUtilsException
      */
     @Test
-    public void testIntentSync() throws TestUtilsException {
+    public void testIntentSync() {
 
-        //
         // Construct routes and intents.
         // This test simulates the following cases during the master change
         // time interval:
-        // 1. RouteEntry1 did not change and the intent also did not change.
-        // 2. RouteEntry2 was deleted, but the intent was not deleted.
-        // 3. RouteEntry3 was newly added, and the intent was also submitted.
-        // 4. RouteEntry4 was updated to RouteEntry4Update, and the intent was
+        // 1. intent1 did not change and the intent also did not change.
+        // 2. intent2 was deleted, but the intent was not deleted.
+        // 3. intent3 was newly added, and the intent was also submitted.
+        // 4. intent4 was updated to RouteEntry4Update, and the intent was
         // also updated to a new one.
-        // 5. RouteEntry5 did not change, but its intent id changed.
-        // 6. RouteEntry6 was newly added, but the intent was not submitted.
-        //
-        RouteEntry routeEntry1 = new RouteEntry(
-                Ip4Prefix.valueOf("1.1.1.0/24"),
-                Ip4Address.valueOf("192.168.10.1"));
-
-        RouteEntry routeEntry2 = new RouteEntry(
-                Ip4Prefix.valueOf("2.2.2.0/24"),
-                Ip4Address.valueOf("192.168.20.1"));
-
-        RouteEntry routeEntry3 = new RouteEntry(
-                Ip4Prefix.valueOf("3.3.3.0/24"),
-                Ip4Address.valueOf("192.168.30.1"));
-
-        RouteEntry routeEntry4 = new RouteEntry(
-                Ip4Prefix.valueOf("4.4.4.0/24"),
-                Ip4Address.valueOf("192.168.30.1"));
-
-        RouteEntry routeEntry4Update = new RouteEntry(
-                Ip4Prefix.valueOf("4.4.4.0/24"),
-                Ip4Address.valueOf("192.168.20.1"));
-
-        RouteEntry routeEntry5 = new RouteEntry(
-                Ip4Prefix.valueOf("5.5.5.0/24"),
-                Ip4Address.valueOf("192.168.10.1"));
-
-        RouteEntry routeEntry6 = new RouteEntry(
-                Ip4Prefix.valueOf("6.6.6.0/24"),
-                Ip4Address.valueOf("192.168.10.1"));
-
-        RouteEntry routeEntry7 = new RouteEntry(
-                Ip4Prefix.valueOf("7.7.7.0/24"),
-                Ip4Address.valueOf("192.168.10.1"));
+        // 5. intent5 did not change, but its intent id changed.
+        // 6. intent6 was newly added, but the intent was not submitted.
 
         MultiPointToSinglePointIntent intent1 = intentBuilder(
-                routeEntry1.prefix(), "00:00:00:00:00:01", SW1_ETH1);
+                Ip4Prefix.valueOf("1.1.1.0/24"), "00:00:00:00:00:01", SW1_ETH1);
         MultiPointToSinglePointIntent intent2 = intentBuilder(
-                routeEntry2.prefix(), "00:00:00:00:00:02", SW2_ETH1);
+                Ip4Prefix.valueOf("2.2.2.0/24"), "00:00:00:00:00:02", SW2_ETH1);
         MultiPointToSinglePointIntent intent3 = intentBuilder(
-                routeEntry3.prefix(), "00:00:00:00:00:03", SW3_ETH1);
+                Ip4Prefix.valueOf("3.3.3.0/24"), "00:00:00:00:00:03", SW3_ETH1);
         MultiPointToSinglePointIntent intent4 = intentBuilder(
-                routeEntry4.prefix(), "00:00:00:00:00:03", SW3_ETH1);
+                Ip4Prefix.valueOf("4.4.4.0/24"), "00:00:00:00:00:03", SW3_ETH1);
         MultiPointToSinglePointIntent intent4Update = intentBuilder(
-                routeEntry4Update.prefix(), "00:00:00:00:00:02", SW2_ETH1);
+                Ip4Prefix.valueOf("4.4.4.0/24"), "00:00:00:00:00:02", SW2_ETH1);
         MultiPointToSinglePointIntent intent5 = intentBuilder(
-                routeEntry5.prefix(), "00:00:00:00:00:01",  SW1_ETH1);
+                Ip4Prefix.valueOf("5.5.5.0/24"), "00:00:00:00:00:01",  SW1_ETH1);
         MultiPointToSinglePointIntent intent7 = intentBuilder(
-                routeEntry7.prefix(), "00:00:00:00:00:01",  SW1_ETH1);
-
-        // Compose a intent, which is equal to intent5 but the id is different.
-        MultiPointToSinglePointIntent intent5New =
-                staticIntentBuilder(intent5, routeEntry5, "00:00:00:00:00:01");
-        assertThat(IntentUtils.intentsAreEqual(intent5, intent5New), is(true));
-        assertFalse(intent5.equals(intent5New));
+                Ip4Prefix.valueOf("7.7.7.0/24"), "00:00:00:00:00:01",  SW1_ETH1);
 
         MultiPointToSinglePointIntent intent6 = intentBuilder(
-                routeEntry6.prefix(), "00:00:00:00:00:01",  SW1_ETH1);
+                Ip4Prefix.valueOf("6.6.6.0/24"), "00:00:00:00:00:01",  SW1_ETH1);
 
         // Set up expectation
         Set<Intent> intents = new HashSet<>();
@@ -395,13 +308,9 @@
                 DefaultTrafficTreatment.builder();
         treatmentBuilder.setEthDst(MacAddress.valueOf(nextHopMacAddress));
 
-        Set<ConnectPoint> ingressPoints = new HashSet<>();
-        for (Interface intf : interfaces) {
-            if (!intf.connectPoint().equals(egressPoint)) {
-                ConnectPoint srcPort = intf.connectPoint();
-                ingressPoints.add(srcPort);
-            }
-        }
+        Set<ConnectPoint> ingressPoints = new HashSet<>(connectPoints);
+        ingressPoints.remove(egressPoint);
+
         MultiPointToSinglePointIntent intent =
                 MultiPointToSinglePointIntent.builder()
                         .appId(APPID)
@@ -414,29 +323,6 @@
         return intent;
     }
 
-    /**
-     * A static MultiPointToSinglePointIntent builder, the returned intent is
-     * equal to the input intent except that the id is different.
-     *
-     * @param intent the intent to be used for building a new intent
-     * @param routeEntry the relative routeEntry of the intent
-     * @return the newly constructed MultiPointToSinglePointIntent
-     * @throws TestUtilsException
-     */
-    private MultiPointToSinglePointIntent staticIntentBuilder(
-            MultiPointToSinglePointIntent intent, RouteEntry routeEntry,
-            String nextHopMacAddress) throws TestUtilsException {
-
-        // Use a different egress ConnectPoint with that in intent
-        // to generate a different id
-        MultiPointToSinglePointIntent intentNew = intentBuilder(
-                routeEntry.prefix(), nextHopMacAddress, SW2_ETH1);
-        TestUtils.setField(intentNew, "egressPoint", intent.egressPoint());
-        TestUtils.setField(intentNew,
-                "ingressPoints", intent.ingressPoints());
-        return intentNew;
-    }
-
     private class TestIntentSynchronizer extends IntentSynchronizer {
         @Override
         protected ExecutorService createExecutor() {
@@ -457,8 +343,4 @@
             return LOCAL_NODE;
         }
     }
-
-    private class TestLeadershipService extends LeadershipServiceAdapter {
-
-    }
 }
diff --git a/apps/sdnip/src/test/java/org/onosproject/sdnip/PeerConnectivityManagerTest.java b/apps/sdnip/src/test/java/org/onosproject/sdnip/PeerConnectivityManagerTest.java
index bf2ba88..1799155 100644
--- a/apps/sdnip/src/test/java/org/onosproject/sdnip/PeerConnectivityManagerTest.java
+++ b/apps/sdnip/src/test/java/org/onosproject/sdnip/PeerConnectivityManagerTest.java
@@ -18,7 +18,6 @@
 import com.google.common.collect.Sets;
 import org.junit.Before;
 import org.junit.Test;
-import org.onlab.junit.TestUtils.TestUtilsException;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.IpAddress;
@@ -47,7 +46,6 @@
 import org.onosproject.net.intent.PointToPointIntent;
 import org.onosproject.routing.IntentSynchronizationService;
 import org.onosproject.routing.config.BgpConfig;
-import org.onosproject.routing.config.BgpPeer;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -82,7 +80,6 @@
 
     private Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers;
     private Map<String, Interface> interfaces;
-    private Map<IpAddress, BgpPeer> peers;
 
     private BgpConfig bgpConfig;
 
@@ -135,7 +132,6 @@
         // These will set expectations on routingConfig and interfaceService
         bgpSpeakers = setUpBgpSpeakers();
         interfaces = Collections.unmodifiableMap(setUpInterfaces());
-        peers = setUpPeers();
 
         initPeerConnectivity();
         intentList = setUpIntentList();
@@ -280,39 +276,6 @@
     }
 
     /**
-     * Sets up BGP daemon peers.
-     *
-     * @return configured BGP peers as a MAP from peer IP address to BgpPeer
-     */
-    private Map<IpAddress, BgpPeer> setUpPeers() {
-
-        Map<IpAddress, BgpPeer> configuredPeers = new HashMap<>();
-
-        String peerSw1Eth1 = "192.168.10.1";
-        configuredPeers.put(IpAddress.valueOf(peerSw1Eth1),
-                new BgpPeer(dpid1, 1, peerSw1Eth1));
-
-        // Two BGP peers are connected to switch 2 port 1.
-        String peer1Sw2Eth1 = "192.168.20.1";
-        configuredPeers.put(IpAddress.valueOf(peer1Sw2Eth1),
-                new BgpPeer(dpid2, 1, peer1Sw2Eth1));
-
-        String peer2Sw2Eth1 = "192.168.30.1";
-        configuredPeers.put(IpAddress.valueOf(peer2Sw2Eth1),
-                new BgpPeer(dpid2, 1, peer2Sw2Eth1));
-
-        String peer3Sw3Eth1 = "192.168.40.1";
-        configuredPeers.put(IpAddress.valueOf(peer3Sw3Eth1),
-                            new BgpPeer(dpid3, 1, peer3Sw3Eth1));
-
-        String peer4Sw3Eth1 = "192.168.50.1";
-        configuredPeers.put(IpAddress.valueOf(peer4Sw3Eth1),
-                            new BgpPeer(dpid3, 1, peer4Sw3Eth1));
-
-        return configuredPeers;
-    }
-
-    /**
      * Sets up expected point to point intent list.
      *
      * @return point to point intent list
@@ -613,10 +576,8 @@
 
     /**
      * Initializes peer connectivity testing environment.
-     *
-     * @throws TestUtilsException if exceptions when using TestUtils
      */
-    private void initPeerConnectivity() throws TestUtilsException {
+    private void initPeerConnectivity() {
         expect(bgpConfig.bgpSpeakers()).andReturn(bgpSpeakers).anyTimes();
         replay(bgpConfig);
         expect(networkConfigService.getConfig(APPID, BgpConfig.class))
@@ -710,6 +671,7 @@
         expect(bgpConfig.bgpSpeakers()).andReturn(Collections.emptySet()).anyTimes();
         replay(bgpConfig);
 
+        // We don't expect any intents in this case
         reset(intentSynchronizer);
         replay(intentSynchronizer);
         peerConnectivityManager.start();
@@ -722,10 +684,20 @@
      */
     @Test
     public void testNoPeerInterface() {
-        String peerSw100Eth1 = "192.168.200.1";
-        peers.put(IpAddress.valueOf(peerSw100Eth1),
-                new BgpPeer("00:00:00:00:00:00:01:00", 1, peerSw100Eth1));
-        testConnectionSetup();
+        IpAddress ip = IpAddress.valueOf("1.1.1.1");
+        bgpSpeakers.clear();
+        bgpSpeakers.add(new BgpConfig.BgpSpeakerConfig(Optional.of("foo"),
+                VlanId.NONE, s1Eth100, Collections.singleton(ip)));
+        reset(interfaceService);
+        interfaceService.addListener(anyObject(InterfaceListener.class));
+        expect(interfaceService.getMatchingInterface(ip)).andReturn(null).anyTimes();
+        replay(interfaceService);
+
+        // We don't expect any intents in this case
+        reset(intentSynchronizer);
+        replay(intentSynchronizer);
+        peerConnectivityManager.start();
+        verify(intentSynchronizer);
     }
 
 }
