diff --git a/sdx-l3/pom.xml b/sdx-l3/pom.xml
index 7a51fef..2d33fd2 100644
--- a/sdx-l3/pom.xml
+++ b/sdx-l3/pom.xml
@@ -22,7 +22,7 @@
 
     <parent>
         <groupId>org.onosproject</groupId>
-        <artifactId>onos-apps</artifactId>
+        <artifactId>onos-app-samples</artifactId>
         <version>1.5.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
diff --git a/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3.java b/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3.java
index f01cd80..8211b68 100644
--- a/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3.java
+++ b/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3.java
@@ -85,7 +85,7 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected HostService hostService;
 
-    protected ArpHandler arpHandler = null;
+    protected SdxL3ArpHandler arpHandler = null;
 
     private InternalPacketProcessor processor = null;
 
@@ -95,7 +95,7 @@
     static {
         components.add("org.onosproject.routing.bgp.BgpSessionManager");
         components.add("org.onosproject.routing.impl.Router");
-        components.add(org.onosproject.sdxl3.impl.PeerConnectivityManager.class.getName());
+        components.add(org.onosproject.sdxl3.impl.SdxL3PeerManager.class.getName());
         components.add(org.onosproject.sdxl3.SdxL3Fib.class.getName());
     }
 
@@ -109,7 +109,7 @@
         BgpConfig bgpConfig =
                 networkConfigService.getConfig(routerAppId, RoutingService.CONFIG_CLASS);
 
-        arpHandler = new ArpHandler(bgpConfig,
+        arpHandler = new SdxL3ArpHandler(bgpConfig,
                 edgeService,
                 hostService,
                 packetService,
diff --git a/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3ArpHandler.java b/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3ArpHandler.java
index 795d301..a1643c3 100644
--- a/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3ArpHandler.java
+++ b/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3ArpHandler.java
@@ -154,7 +154,7 @@
 
         // If the source address matches one of our external addresses
         // it could be a request from an internal host to an external
-        // address. Forward it over to the correct port.
+        // address. Forward it over to the correct connectPoint.
         boolean matched = false;
         Set<Interface> interfaces = interfaceService.getInterfacesByIp(context.sender());
         for (Interface intf : interfaces) {
@@ -185,7 +185,7 @@
         }
 
         // The request couldn't be resolved.
-        // Flood the request on all ports except the incoming port.
+        // Flood the request on all ports except the incoming connectPoint.
         flood(context.packet(), context.inPort());
     }
 
@@ -242,25 +242,25 @@
     }
 
     /**
-     * Outputs a packet out a specific port.
+     * Outputs a packet out a specific connectPoint.
      *
      * @param packet  the packet to send
-     * @param outPort the port to send it out
+     * @param outPort the connectPoint to send it out
      */
     private void sendTo(Ethernet packet, ConnectPoint outPort) {
         sendTo(outPort, ByteBuffer.wrap(packet.serialize()));
     }
 
     /**
-     * Outputs a packet out a specific port.
+     * Outputs a packet out a specific connectPoint.
      *
-     * @param outPort port to send it out
+     * @param outPort connectPoint to send it out
      * @param packet packet to send
      */
     private void sendTo(ConnectPoint outPort, ByteBuffer packet) {
         if (!edgeService.isEdgePoint(outPort)) {
             // Sanity check to make sure we don't send the packet out an
-            // internal port and create a loop (could happen due to
+            // internal connectPoint and create a loop (could happen due to
             // misconfiguration).
             return;
         }
@@ -272,10 +272,10 @@
     }
 
     /**
-     * Returns whether the given port has any IP addresses configured or not.
+     * Returns whether the given connectPoint has any IP addresses configured or not.
      *
-     * @param connectPoint the port to check
-     * @return true if the port has at least one IP address configured,
+     * @param connectPoint the connectPoint to check
+     * @return true if the connectPoint has at least one IP address configured,
      * false otherwise
      */
     private boolean hasIpAddress(ConnectPoint connectPoint) {
@@ -287,10 +287,10 @@
     }
 
     /**
-     * Returns whether the given port has any VLAN configured or not.
+     * Returns whether the given connectPoint has any VLAN configured or not.
      *
-     * @param connectPoint the port to check
-     * @return true if the port has at least one VLAN configured,
+     * @param connectPoint the connectPoint to check
+     * @return true if the connectPoint has at least one VLAN configured,
      * false otherwise
      */
     private boolean hasVlan(ConnectPoint connectPoint) {
@@ -394,7 +394,7 @@
      * created.
      *
      * @param eth input Ethernet frame
-     * @param inPort in port
+     * @param inPort in connectPoint
      * @return MessageContext if the packet was ARP or NDP, otherwise null
      */
     private MessageContext createContext(Ethernet eth, ConnectPoint inPort) {
@@ -411,7 +411,7 @@
      * Extracts context information from ARP packets.
      *
      * @param eth input Ethernet frame that is thought to be ARP
-     * @param inPort in port
+     * @param inPort in connectPoint
      * @return MessageContext object if the packet was a valid ARP packet,
      * otherwise null
      */
@@ -441,7 +441,7 @@
      * Extracts context information from NDP packets.
      *
      * @param eth input Ethernet frame that is thought to be NDP
-     * @param inPort in port
+     * @param inPort in connectPoint
      * @return MessageContext object if the packet was a valid NDP packet,
      * otherwise null
      */
diff --git a/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3Fib.java b/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3Fib.java
index 68829e1..9cd228d 100644
--- a/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3Fib.java
+++ b/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3Fib.java
@@ -75,7 +75,7 @@
     protected RoutingService routingService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected PeerConnectivityService peerConnectivity;
+    protected SdxL3PeerService peerService;
 
     private final InternalFibListener fibListener = new InternalFibListener();
 
@@ -177,7 +177,7 @@
             MacAddress nextHopMacAddress) {
 
         // Find the attachment point (egress interface) of the next hop
-        Interface egressInterface = peerConnectivity.getInterfaceForPeer(nextHopIpAddress);
+        Interface egressInterface = peerService.getInterfaceForPeer(nextHopIpAddress);
 
         if (egressInterface == null) {
             log.warn("No outgoing interface found for {}",
diff --git a/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3PeerService.java b/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3PeerService.java
index 6a2542c..c0a7a77 100644
--- a/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3PeerService.java
+++ b/sdx-l3/src/main/java/org/onosproject/sdxl3/SdxL3PeerService.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2014-2016 Open Networking Laboratory
+ * Copyright 2016 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.
@@ -18,19 +18,52 @@
 
 import org.onlab.packet.IpAddress;
 import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.routing.config.BgpConfig;
+import org.onosproject.sdxl3.config.SdxProvidersConfig;
+
+import java.util.List;
 
 /*
  * Service for managing peers connections
  */
 public interface SdxL3PeerService {
 
-    String CONFIG_KEY = "bgpPeers";
+    Class<SdxProvidersConfig> CONFIG_CLASS = SdxProvidersConfig.class;
+    String CONFIG_KEY = "providers";
+
+    /**
+     * Returns the list of IP addresses of BGP peers.
+     *
+     * @param bgpConfig BGP configuration
+     * @return list of IP addresses of peers
+     */
+    List<IpAddress> getPeerAddresses(BgpConfig bgpConfig);
 
     /**
      * Returns the interface used as connection point to peer.
      *
-     * @param peeringAddress IP address of peer
+     * @param peerAddress IP address of peer
      * @return interface to the peer
      */
-    Interface getInterfaceForPeer(IpAddress peeringAddress);
+    Interface getInterfaceForPeer(IpAddress peerAddress);
+
+    /**
+     * Adds details for a BGP peer to the configuration.
+     *
+     * @param peerName Peer name
+     * @param peerAddress Peer IP address
+     * @param port Connection point with peer
+     * @param interfaceName Name of the interface configured on port
+     */
+    void addPeerDetails(String peerName, IpAddress peerAddress,
+                        ConnectPoint port, String  interfaceName);
+
+    /**
+     * Removes details for a BGP peer to the configuration.
+     *
+     * @param peerAddress Peer IP address
+     */
+    void removePeerDetails(IpAddress peerAddress);
+
 }
diff --git a/sdx-l3/src/main/java/org/onosproject/sdxl3/cli/AddPeerDetailsCommand.java b/sdx-l3/src/main/java/org/onosproject/sdxl3/cli/AddPeerDetailsCommand.java
new file mode 100644
index 0000000..acc4579
--- /dev/null
+++ b/sdx-l3/src/main/java/org/onosproject/sdxl3/cli/AddPeerDetailsCommand.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2016 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.sdxl3.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.Option;
+import org.onlab.packet.IpAddress;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.sdxl3.SdxL3PeerService;
+
+/**
+ * Command to set details for an existing BGP peer.
+ */
+@Command(scope = "onos", name = "peer-add-details",
+        description = "Adds the details of an external BGP peer")
+public class AddPeerDetailsCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "ip", description = "BGP peer IP",
+            required = true, multiValued = false)
+    private String ip = null;
+
+    @Argument(index = 1, name = "port",
+            description = "Connect point of the BGP peer",
+            required = true, multiValued = false)
+    private String connectPoint = null;
+
+    @Argument(index = 2, name = "intfName",
+            description = "Name of configured interface for the BGP peer",
+            required = true, multiValued = false)
+    private String interfaceName = null;
+
+    @Option(name = "-n", aliases = "--name", description = "BGP peer name",
+            required = false, multiValued = false)
+    private String peerName = null;
+
+    private static final String DETAILS_ADD_SUCCESS =
+            "Details successfully added to peer.";
+    private static final String DETAILS_ADD_FAIL =
+            "Details could not be added to peer: ";
+
+    private IpAddress peerAddress = null;
+    private ConnectPoint port = null;
+
+    @Override
+    protected void execute() {
+        peerAddress = IpAddress.valueOf(ip);
+        port = ConnectPoint.deviceConnectPoint(connectPoint);
+
+        SdxL3PeerService peerService = get(SdxL3PeerService.class);
+        try {
+            peerService.addPeerDetails(peerName, peerAddress, port, interfaceName);
+            print(DETAILS_ADD_SUCCESS);
+        } catch (Exception e) {
+            print(DETAILS_ADD_FAIL + e.getMessage());
+        }
+    }
+}
diff --git a/sdx-l3/src/main/java/org/onosproject/sdxl3/cli/BgpPeersListCommand.java b/sdx-l3/src/main/java/org/onosproject/sdxl3/cli/BgpPeersListCommand.java
index 09f237b..2e22bed 100644
--- a/sdx-l3/src/main/java/org/onosproject/sdxl3/cli/BgpPeersListCommand.java
+++ b/sdx-l3/src/main/java/org/onosproject/sdxl3/cli/BgpPeersListCommand.java
@@ -26,7 +26,8 @@
 import org.onosproject.routing.RoutingService;
 import org.onosproject.routing.config.BgpConfig;
 import org.onosproject.sdxl3.SdxL3;
-import org.onosproject.sdxl3.config.BgpPeersConfig;
+import org.onosproject.sdxl3.SdxL3PeerService;
+import org.onosproject.sdxl3.config.SdxProvidersConfig;
 
 import java.util.Comparator;
 import java.util.List;
@@ -39,12 +40,13 @@
         description = "Lists all BGP peers")
 public class BgpPeersListCommand extends AbstractShellCommand {
 
-    private static final String FORMAT = "ip=%s, interface=%s";
-    private static final String NAME_FORMAT = "%s: " + FORMAT;
-    private static final String AUTO_SELECTION = "auto";
+    private static final String BASIC_FORMAT =  "ip=%s";
+    private static final String DETAILS_FORMAT =
+            BASIC_FORMAT + ", port=%s/%s, intfName=%s";
+    private static final String NAME_FORMAT = "%s: " + DETAILS_FORMAT;
     public static final String NO_PEERS = "No peers configured";
 
-    private static final Comparator<BgpPeersConfig.PeerConfig> PEER_COMPARATOR =
+    private static final Comparator<SdxProvidersConfig.PeerConfig> PEER_COMPARATOR =
             Comparator.comparing(p -> p.ip());
     public static final String EMPTY = "";
 
@@ -52,13 +54,14 @@
     protected void execute() {
         NetworkConfigService configService = get(NetworkConfigService.class);
         CoreService coreService = get(CoreService.class);
+        SdxL3PeerService peerService = get(SdxL3PeerService.class);
 
         ApplicationId routerAppId = coreService.getAppId(RoutingService.ROUTER_APP_ID);
         BgpConfig bgpConfig = configService.getConfig(routerAppId, RoutingService.CONFIG_CLASS);
 
         ApplicationId sdxL3AppId = coreService.getAppId(SdxL3.SDX_L3_APP);
-        BgpPeersConfig peersConfig = configService.
-                getConfig(sdxL3AppId, BgpPeersConfig.class);
+        SdxProvidersConfig peersConfig = configService.
+                getConfig(sdxL3AppId, SdxProvidersConfig.class);
 
         if (bgpConfig == null && peersConfig == null) {
             print(NO_PEERS);
@@ -67,12 +70,14 @@
 
         List<IpAddress> peeringAddresses = Lists.newArrayList();
         if (bgpConfig != null) {
-            peeringAddresses = getPeeringAddresses(bgpConfig);
+            // Get all peering addresses from BGP configuration
+            peeringAddresses = peerService.getPeerAddresses(bgpConfig);
         }
 
-        List<BgpPeersConfig.PeerConfig> bgpPeers =
+        List<SdxProvidersConfig.PeerConfig> bgpPeers =
                 Lists.newArrayList();
         if (peersConfig != null) {
+            // Get all peers having details specified
             bgpPeers.addAll(peersConfig.bgpPeers());
         }
 
@@ -86,43 +91,30 @@
         bgpPeers.sort(PEER_COMPARATOR);
         bgpPeers.forEach(p -> {
             if (p.name().isPresent()) {
-                if (p.interfaceName() != EMPTY) {
-                    print(NAME_FORMAT, p.name().get(), p.ip(), p.interfaceName());
-                } else {
-                    print(NAME_FORMAT, p.name().get(), p.ip(), AUTO_SELECTION);
-                }
-            } else if (p.interfaceName() != EMPTY) {
-                print(FORMAT, p.ip(), p.interfaceName());
+                print(NAME_FORMAT, p.name().get(), p.ip(),
+                      p.connectPoint().deviceId(), p.connectPoint().port(),
+                      p.interfaceName());
+            } else if (p.connectPoint() != null) {
+                print(DETAILS_FORMAT, p.ip(), p.connectPoint().deviceId(),
+                      p.connectPoint().port(), p.interfaceName());
             } else {
-                print(FORMAT, p.ip(), AUTO_SELECTION);
+                print(BASIC_FORMAT, p.ip());
             }
         });
     }
 
-    private List<IpAddress> getPeeringAddresses(BgpConfig bgpConfig) {
-        List<IpAddress> peeringAddresses = Lists.newArrayList();
-
-        List<BgpConfig.BgpSpeakerConfig> bgpSpeakers =
-                Lists.newArrayList(bgpConfig.bgpSpeakers());
-        bgpSpeakers.forEach(
-                s -> peeringAddresses.addAll(s.peers()));
-
-        return peeringAddresses;
-    }
-
-    private List<BgpPeersConfig.PeerConfig> mergePeers(
-            List<IpAddress> peeringAddresses,
-            List<BgpPeersConfig.PeerConfig> bgpPeers) {
+    private List<SdxProvidersConfig.PeerConfig> mergePeers(
+                List<IpAddress> peeringAddresses,
+                List<SdxProvidersConfig.PeerConfig> bgpPeers) {
         peeringAddresses.forEach(a -> {
             boolean exists = bgpPeers.stream()
                     .filter(p -> p.ip().equals(a))
                     .findAny().isPresent();
             if (!exists) {
-                bgpPeers.add(new BgpPeersConfig
-                        .PeerConfig(Optional.<String>empty(), a, EMPTY));
+                bgpPeers.add(new SdxProvidersConfig
+                        .PeerConfig(Optional.<String>empty(), a, null, EMPTY));
             }
         });
-
         return bgpPeers;
     }
 }
diff --git a/sdx-l3/src/main/java/org/onosproject/sdxl3/cli/RemovePeerDetailsCommand.java b/sdx-l3/src/main/java/org/onosproject/sdxl3/cli/RemovePeerDetailsCommand.java
new file mode 100644
index 0000000..8eee2ba
--- /dev/null
+++ b/sdx-l3/src/main/java/org/onosproject/sdxl3/cli/RemovePeerDetailsCommand.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2016 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.sdxl3.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.packet.IpAddress;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.sdxl3.SdxL3PeerService;
+
+/**
+ * Command to remove details for a peer from configuration.
+ */
+@Command(scope = "onos", name = "peer-remove-details",
+        description = "Removes the details of an external BGP peer")
+public class RemovePeerDetailsCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "ip",
+            description = "BGP peer IP",
+            required = true, multiValued = false)
+    private String ip = null;
+
+    private static final String DETAILS_REMOVE_SUCCESS =
+            "Details successfully removed from peer.";
+    private static final String DETAILS_REMOVE_FAIL =
+            "Details could not be added to peer: ";
+
+    private IpAddress peerAddress = null;
+
+    @Override
+    protected void execute() {
+        peerAddress = IpAddress.valueOf(ip);
+
+        SdxL3PeerService peerService = get(SdxL3PeerService.class);
+        try {
+            peerService.removePeerDetails(peerAddress);
+            print(DETAILS_REMOVE_SUCCESS);
+        } catch (Exception e) {
+            print(DETAILS_REMOVE_FAIL + e.getMessage());
+        }
+    }
+}
diff --git a/sdx-l3/src/main/java/org/onosproject/sdxl3/config/BgpPeersConfig.java b/sdx-l3/src/main/java/org/onosproject/sdxl3/config/BgpPeersConfig.java
deleted file mode 100644
index dd89aed..0000000
--- a/sdx-l3/src/main/java/org/onosproject/sdxl3/config/BgpPeersConfig.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright 2014-2015 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.sdxl3.config;
-
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.google.common.collect.Sets;
-import org.onlab.packet.IpAddress;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.net.config.Config;
-
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-public class BgpPeersConfig extends Config<ApplicationId> {
-    public static final String NAME = "name";
-    public static final String IP = "ip";
-    public static final String INTERFACE = "interface";
-
-    /**
-     * Gets the set of configured BGP peers.
-     *
-     * @return BGP peers
-     */
-    public Set<PeerConfig> bgpPeers() {
-        Set<PeerConfig> peers = Sets.newHashSet();
-
-        ArrayNode peersNode = array;
-        peersNode.forEach(jsonNode -> {
-            Optional<String> name;
-            if (jsonNode.get(NAME) == null) {
-                name = Optional.empty();
-            } else {
-                name = Optional.of(jsonNode.get(NAME).asText());
-            }
-
-            peers.add(new PeerConfig(name,
-                    IpAddress.valueOf(jsonNode.path(IP).asText()),
-                    jsonNode.path(INTERFACE).asText()));
-        });
-
-        return peers;
-    }
-
-    /**
-     * Gets the interface name configured for a given BGP peer.
-     *
-     * @param peerAddress IP address of the peer
-     * @return interface name
-     */
-
-    public String getInterfaceNameForPeer(IpAddress peerAddress) {
-        Optional<PeerConfig> match = bgpPeers()
-                .stream()
-                .filter(p -> p.ip().equals(peerAddress))
-                .findAny();
-
-        if (match.isPresent()) {
-            return match.get().interfaceName();
-        } else {
-            return null;
-        }
-    }
-
-
-    /**
-     * Configuration for a BGP peer.
-     */
-    public static class PeerConfig {
-
-        private Optional<String> name;
-        private IpAddress ip;
-        private String interfaceName;
-
-        public PeerConfig(Optional<String> name, IpAddress ip, String interfaceName) {
-            this.name = checkNotNull(name);
-            this.ip = checkNotNull(ip);
-            this.interfaceName = checkNotNull(interfaceName);
-        }
-
-        public Optional<String> name() {
-            return name;
-        }
-
-        public IpAddress ip() {
-            return ip;
-        }
-
-        public String interfaceName() {
-            return interfaceName;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof PeerConfig) {
-                final PeerConfig that = (PeerConfig) obj;
-                return Objects.equals(this.name, that.name) &&
-                        Objects.equals(this.ip, that.ip) &&
-                        Objects.equals(this.interfaceName, that.interfaceName);
-            }
-            return false;
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(name, ip, interfaceName);
-        }
-    }
-}
diff --git a/sdx-l3/src/main/java/org/onosproject/sdxl3/config/SdxProvidersConfig.java b/sdx-l3/src/main/java/org/onosproject/sdxl3/config/SdxProvidersConfig.java
new file mode 100644
index 0000000..8206fda
--- /dev/null
+++ b/sdx-l3/src/main/java/org/onosproject/sdxl3/config/SdxProvidersConfig.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright 2014-2015 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.sdxl3.config;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Sets;
+import org.onlab.packet.IpAddress;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.config.Config;
+
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Configuration for the Service Providers being connected to the
+ * software defined internet exchange point.
+ */
+public class SdxProvidersConfig extends Config<ApplicationId> {
+
+    public static final String PEERS = "bgpPeers";
+    public static final String NAME = "name";
+    public static final String IP = "ip";
+    public static final String CONN_POINT = "connectPoint";
+    public static final String INTF_NAME = "intfName";
+
+    /**
+     * Gets the set of configured BGP peers.
+     *
+     * @return BGP peers
+     */
+    public Set<PeerConfig> bgpPeers() {
+        Set<PeerConfig> peers = Sets.newHashSet();
+
+        JsonNode peersNode = object.get(PEERS);
+
+        if (peersNode == null) {
+            return peers;
+        }
+        peersNode.forEach(jsonNode -> {
+            Optional<String> name;
+            if (jsonNode.get(NAME) == null) {
+                name = Optional.empty();
+            } else {
+                name = Optional.of(jsonNode.get(NAME).asText());
+            }
+
+            peers.add(new PeerConfig(name,
+                    IpAddress.valueOf(jsonNode.path(IP).asText()),
+                    ConnectPoint.deviceConnectPoint(jsonNode.path(CONN_POINT).asText()),
+                    jsonNode.path(INTF_NAME).asText()));
+        });
+
+        return peers;
+    }
+
+    /**
+     * Gets the connectPoint configured for a given BGP peer.
+     *
+     * @param peerAddress IP address of the peer
+     * @return connectPoint connection point
+     */
+
+    public ConnectPoint getPortForPeer(IpAddress peerAddress) {
+        Optional<PeerConfig> match = bgpPeers()
+                .stream()
+                .filter(p -> p.ip().equals(peerAddress))
+                .findAny();
+
+        if (match.isPresent()) {
+            return match.get().connectPoint();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Gets the interface name configured for a given BGP peer.
+     *
+     * @param peerAddress IP address of the peer
+     * @return interface name
+     */
+
+    public String getInterfaceNameForPeer(IpAddress peerAddress) {
+        Optional<PeerConfig> match = bgpPeers()
+                .stream()
+                .filter(p -> p.ip().equals(peerAddress))
+                .findAny();
+
+        if (match.isPresent()) {
+            return match.get().interfaceName();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Gets the BGP peer configured for a given peer name.
+     *
+     * @param peerName Name of the BGP peer
+     * @return Peer configuration or null
+     */
+
+    public PeerConfig getPeerForName(Optional<String> peerName) {
+        Optional<PeerConfig> match = bgpPeers()
+                .stream()
+                .filter(p -> p.name().equals(peerName))
+                .findAny();
+
+        if (match.isPresent()) {
+            return match.get();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Adds new BGP peer details to the configuration.
+     *
+     * @param peer BGP peer configuration entry
+     */
+
+    public void addPeer(PeerConfig peer) {
+        ObjectNode peerNode = JsonNodeFactory.instance.objectNode();
+
+        if (peer.name().isPresent()) {
+            peerNode.put(NAME, peer.name().get());
+        }
+        peerNode.put(IP, peer.ip().toString());
+        peerNode.put(CONN_POINT, peer.connectPoint().elementId().toString()
+                + "/" + peer.connectPoint().port().toString());
+        peerNode.put(INTF_NAME, peer.interfaceName());
+
+        ArrayNode peersArray = bgpPeers().isEmpty() ?
+                initPeersConfiguration() : (ArrayNode) object.get(PEERS);
+        peersArray.add(peerNode);
+    }
+
+    /**
+     * Gets the BGP peer configured for a given peer IP.
+     *
+     * @param ip Name of the BGP peer
+     * @return Peer configuration or null
+     */
+
+    public PeerConfig getPeerForIp(IpAddress ip) {
+        Optional<PeerConfig> match = bgpPeers()
+                .stream()
+                .filter(p -> p.ip().equals(ip))
+                .findAny();
+
+        if (match.isPresent()) {
+            return match.get();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Removes BGP peer details from configuration.
+     *
+     * @param peerIp BGP peer IP address
+     */
+    public void removePeer(IpAddress peerIp) {
+        ArrayNode peersArray = (ArrayNode) object.get(PEERS);
+
+        for (int i = 0; i < peersArray.size(); i++) {
+            if (peersArray.get(i).get(IP).asText().equals(peerIp.toString())) {
+                peersArray.remove(i);
+                return;
+            }
+        }
+    }
+
+    /**
+     * Creates empty configuration for BGP peers details.
+     *
+     * @return empty array of BGP peers
+     */
+    private ArrayNode initPeersConfiguration() {
+        return object.putArray(PEERS);
+    }
+
+    /**
+     * Configuration for a BGP peer.
+     */
+    public static class PeerConfig {
+
+        private Optional<String> name;
+        private IpAddress ip;
+        private ConnectPoint connectPoint;
+        private String interfaceName;
+
+        public PeerConfig(Optional<String> name,
+                          IpAddress ip,
+                          ConnectPoint connectPoint,
+                          String interfaceName) {
+            this.name = checkNotNull(name);
+            this.ip = checkNotNull(ip);
+            // It can be null only for printout entries
+            this.connectPoint = connectPoint;
+            this.interfaceName = checkNotNull(interfaceName);
+        }
+
+        public Optional<String> name() {
+            return name;
+        }
+
+        public IpAddress ip() {
+            return ip;
+        }
+
+        public ConnectPoint connectPoint() {
+            return connectPoint;
+        }
+
+        public String interfaceName() {
+            return interfaceName;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj instanceof PeerConfig) {
+                final PeerConfig that = (PeerConfig) obj;
+                return Objects.equals(this.name, that.name) &&
+                        Objects.equals(this.ip, that.ip) &&
+                        Objects.equals(this.connectPoint, that.connectPoint) &&
+                        Objects.equals(this.interfaceName, that.interfaceName);
+            }
+            return false;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(name, ip, connectPoint, interfaceName);
+        }
+    }
+}
diff --git a/sdx-l3/src/main/java/org/onosproject/sdxl3/impl/SdxL3PeerManager.java b/sdx-l3/src/main/java/org/onosproject/sdxl3/impl/SdxL3PeerManager.java
index b881ca2..8f9d5e5 100644
--- a/sdx-l3/src/main/java/org/onosproject/sdxl3/impl/SdxL3PeerManager.java
+++ b/sdx-l3/src/main/java/org/onosproject/sdxl3/impl/SdxL3PeerManager.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.sdxl3.impl;
 
+import com.google.common.collect.Lists;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -28,6 +29,7 @@
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.TpPort;
+import org.onlab.util.ItemNotFoundException;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.incubator.net.intf.Interface;
@@ -50,9 +52,9 @@
 import org.onosproject.routing.IntentSynchronizationService;
 import org.onosproject.routing.RoutingService;
 import org.onosproject.routing.config.BgpConfig;
-import org.onosproject.sdxl3.PeerConnectivityService;
 import org.onosproject.sdxl3.SdxL3;
-import org.onosproject.sdxl3.config.BgpPeersConfig;
+import org.onosproject.sdxl3.SdxL3PeerService;
+import org.onosproject.sdxl3.config.SdxProvidersConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,6 +63,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -70,9 +73,6 @@
 @Service
 @Component(immediate = true, enabled = false)
 public class SdxL3PeerManager implements SdxL3PeerService {
-
-    private static final String CONFIG_KEY = "bgpPeers";
-
     private static final int PRIORITY_OFFSET = 1000;
 
     private static final String SUFFIX_DST = "dst";
@@ -80,7 +80,7 @@
     private static final String SUFFIX_ICMP = "icmp";
 
     private static final Logger log = LoggerFactory.getLogger(
-            PeerConnectivityManager.class);
+            SdxL3PeerManager.class);
 
     private static final short BGP_PORT = 179;
 
@@ -101,10 +101,10 @@
 
     private ConfigFactory configFactory =
             new ConfigFactory(SubjectFactories.APP_SUBJECT_FACTORY,
-                    BgpPeersConfig.class, CONFIG_KEY) {
+                              CONFIG_CLASS, CONFIG_KEY) {
                 @Override
-                public BgpPeersConfig createConfig() {
-                    return new BgpPeersConfig();
+                public SdxProvidersConfig createConfig() {
+                    return new SdxProvidersConfig();
                 }
             };
 
@@ -138,14 +138,234 @@
     }
 
     /**
+     * Adds details for a BGP peer to the SDX-L3 configuration.
+     *
+     * @param peerName      Peer name
+     * @param peerAddress   Peer IP address
+     * @param port          Connection point with peer
+     * @param interfaceName Name of the interface configured on port
+     */
+    @Override
+    public void addPeerDetails(String peerName, IpAddress peerAddress, ConnectPoint port, String interfaceName) {
+
+        BgpConfig bgpConfig = getBgpConfig();
+        if (bgpConfig == null) {
+            throw new ItemNotFoundException("BGP configuration not found");
+        }
+
+        if (!peerAddressExists(bgpConfig, peerAddress)) {
+            throw new ItemNotFoundException("Peer IP not found");
+        }
+
+        Interface peerInterface = getInterface(port, interfaceName);
+        if (peerInterface == null) {
+            throw new ItemNotFoundException("Interface not found");
+        }
+
+        if (!interfaceSubnetIncludesIp(peerInterface, peerAddress)) {
+            throw new IllegalArgumentException("Interface not configured for IP "
+                                                       + peerAddress);
+        }
+
+        Interface confInterface = getConfiguredInterfaceForPeer(peerAddress);
+        if (confInterface != null) {
+            if (confInterface.equals(peerInterface)) {
+                // Do nothing since the association exists.
+                return;
+            } else {
+                // The peer is associated with another interface.
+                throw new IllegalArgumentException("Peer details already exist");
+            }
+        }
+
+        SdxProvidersConfig peersConfig =
+                configService.addConfig(sdxAppId, SdxProvidersConfig.class);
+        if (peerName != null && peerNameExists(peersConfig, peerName)) {
+            throw new IllegalArgumentException("Peer name in use");
+        }
+
+        addPeerToConf(peersConfig, peerName, peerAddress, port, interfaceName);
+        configService.
+                applyConfig(sdxAppId, SdxProvidersConfig.class, peersConfig.node());
+    }
+
+    /**
+     * Removes details for a BGP peer to the SDX-L3 configuration.
+     *
+     * @param peerAddress Peer IP address
+     */
+    @Override
+    public void removePeerDetails(IpAddress peerAddress) {
+        BgpConfig bgpConfig = getBgpConfig();
+        if (bgpConfig == null) {
+            throw new ItemNotFoundException("BGP configuration not found");
+        }
+
+        SdxProvidersConfig peersConfig =
+                configService.addConfig(sdxAppId, SdxProvidersConfig.class);
+
+        if (peersConfig.getPeerForIp(peerAddress) == null) {
+            throw new ItemNotFoundException("Peer details not found");
+        }
+
+        removePeerFromConf(peersConfig, peerAddress);
+        configService.applyConfig(sdxAppId,
+                                  SdxProvidersConfig.class,
+                                  peersConfig.node());
+    }
+
+    /**
+     * Returns BGP configuration has been specified and any BGP speaker
+     * exists in this configuration, else null is returned.
+     *
+     * @return BGP configuration or null
+     */
+    private BgpConfig getBgpConfig() {
+        BgpConfig bgpConfig = configService.
+                getConfig(routerAppId, BgpConfig.class);
+
+        if (bgpConfig == null || bgpConfig.bgpSpeakers().isEmpty()) {
+            return null;
+        }
+        return bgpConfig;
+    }
+
+    private Interface getInterface(ConnectPoint port, String interfaceName) {
+        Optional<Interface> interfaceMatch = interfaceService
+                .getInterfacesByPort(port)
+                .stream()
+                .filter(intf -> intf.name().equals(interfaceName))
+                .findFirst();
+        if (!interfaceMatch.isPresent()) {
+            // No such interface name configured for given connectPoint
+            return null;
+        }
+        return interfaceMatch.get();
+    }
+
+    boolean interfaceSubnetIncludesIp(Interface peerInterface, IpAddress peerAddress) {
+        if (peerInterface.ipAddresses().stream()
+                .anyMatch(intfIp -> intfIp.subnetAddress().
+                        contains(peerAddress))) {
+            // Interface configured subnet not including peer address
+            return true;
+        }
+        return false;
+    }
+
+    private boolean peerNameExists(SdxProvidersConfig config, String peerName) {
+        if (config.getPeerForName(Optional.of(peerName)) == null) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Adds the peer to the SdxProvidersConfig .
+     *
+     * @param peersConfig the BGP peers configuration
+     */
+    private void addPeerToConf(SdxProvidersConfig peersConfig, String peerName,
+                               IpAddress peerAddress, ConnectPoint port,
+                               String interfaceName) {
+        log.debug("Adding peer with IP to configuration: {}", peerAddress);
+        SdxProvidersConfig.PeerConfig peer = new SdxProvidersConfig.
+                PeerConfig(Optional.ofNullable(peerName), peerAddress,
+                           port, interfaceName);
+
+        peersConfig.addPeer(peer);
+    }
+
+    /**
+     * Removes the speaker from the BgpConfig service.
+     *
+     * @param peersConfig the BGP peeers configuration
+     */
+    private void removePeerFromConf(SdxProvidersConfig peersConfig,
+                                    IpAddress peerAddress) {
+        log.debug("Removing peer details from configuration: {}",
+                  peerAddress.toString());
+        peersConfig.removePeer(peerAddress);
+    }
+
+    /**
+     * Returns true if a given IP address has been specified as a BGP peer
+     * address in the network configuration.
+     *
+     * @param BgpConfig BGP configuration
+     * @param peerAddress IP address of peer
+     * @return whether address has been specified for a peer or not
+     */
+    private Boolean peerAddressExists(BgpConfig bgpConfig,
+                                      IpAddress peerAddress) {
+        List<IpAddress> peeringAddresses =
+                getPeerAddresses(bgpConfig);
+        if (!peeringAddresses.contains(peerAddress)) {
+            return false;
+        }
+        return true;
+    }
+
+    private Interface getConfiguredInterfaceForPeer(IpAddress peerAddress) {
+        if (sdxAppId == null) {
+            return null;
+        }
+
+        SdxProvidersConfig config = configService.getConfig(sdxAppId, SdxProvidersConfig.class);
+        if (config == null) {
+            return null;
+        }
+
+        ConnectPoint port = config.getPortForPeer(peerAddress);
+        String intfName = config.getInterfaceNameForPeer(peerAddress);
+        if (port != null && intfName != null) {
+            Optional<Interface> interfaceMatch = interfaceService
+                    .getInterfacesByPort(port)
+                    .stream()
+                    .filter(intf -> intf.name().equals(intfName))
+                    .findFirst();
+            if (interfaceMatch.isPresent()) {
+                return interfaceMatch.get();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns the interface used as connection point to peer.
+     *
+     * @param peerAddress IP address of peer
+     * @return interface to the peer
+     */
+    @Override
+    public Interface getInterfaceForPeer(IpAddress peerAddress) {
+        Interface peeringInterface = getConfiguredInterfaceForPeer(peerAddress);
+        if (peeringInterface == null) {
+            peeringInterface = interfaceService.getMatchingInterface(peerAddress);
+        }
+        return peeringInterface;
+    }
+
+    @Override
+    public List<IpAddress> getPeerAddresses(BgpConfig bgpConfig) {
+        List<IpAddress> peeringAddresses = Lists.newArrayList();
+
+        List<BgpConfig.BgpSpeakerConfig> bgpSpeakers =
+                Lists.newArrayList(bgpConfig.bgpSpeakers());
+        bgpSpeakers.forEach(
+                s -> peeringAddresses.addAll(s.peers()));
+
+        return peeringAddresses;
+    }
+
+    /**
      * Sets up paths to establish connectivity between all internal
      * BGP speakers and external BGP peers.
      */
     private void setUpConnectivity() {
-        BgpConfig config = configService.getConfig(routerAppId, RoutingService.CONFIG_CLASS);
-
+        BgpConfig config = getBgpConfig();
         if (config == null) {
-            log.warn("No BgpConfig found");
+            log.warn("No BGP configuration found");
             return;
         }
 
@@ -201,23 +421,6 @@
         return intents;
     }
 
-    private Interface getConfiguredInterfaceForPeer(IpAddress peerAddress) {
-        if (sdxAppId == null) {
-            return null;
-        }
-
-        BgpPeersConfig config = configService.getConfig(sdxAppId, BgpPeersConfig.class);
-        if (config == null) {
-            return null;
-        }
-
-        String intfName = config.getInterfaceNameForPeer(peerAddress);
-        if (intfName != null) {
-            return interfaceService.getInterfaceByName(intfName);
-        }
-        return null;
-    }
-
     /**
      * Builds the required intents between the two pairs of connect points and
      * IP addresses.
@@ -250,7 +453,7 @@
             icmpProtocol = IPv6.PROTOCOL_ICMP6;
         }
 
-        // Path from BGP speaker to BGP peer matching destination TCP port 179
+        // Path from BGP speaker to BGP peer matching destination TCP connectPoint 179
         selector = buildSelector(tcpProtocol,
                 ipOne,
                 ipTwo,
@@ -269,7 +472,7 @@
                 .priority(PRIORITY_OFFSET)
                 .build());
 
-        // Path from BGP speaker to BGP peer matching source TCP port 179
+        // Path from BGP speaker to BGP peer matching source TCP connectPoint 179
         selector = buildSelector(tcpProtocol,
                 ipOne,
                 ipTwo,
@@ -288,7 +491,7 @@
                 .priority(PRIORITY_OFFSET)
                 .build());
 
-        // Path from BGP peer to BGP speaker matching destination TCP port 179
+        // Path from BGP peer to BGP speaker matching destination TCP connectPoint 179
         selector = buildSelector(tcpProtocol,
                 ipTwo,
                 ipOne,
@@ -307,7 +510,7 @@
                 .priority(PRIORITY_OFFSET)
                 .build());
 
-        // Path from BGP peer to BGP speaker matching source TCP port 179
+        // Path from BGP peer to BGP speaker matching source TCP connectPoint 179
         selector = buildSelector(tcpProtocol,
                 ipTwo,
                 ipOne,
@@ -373,8 +576,8 @@
      * @param ipProto IP protocol
      * @param srcIp source IP address
      * @param dstIp destination IP address
-     * @param srcTcpPort source TCP port, or null if shouldn't be set
-     * @param dstTcpPort destination TCP port, or null if shouldn't be set
+     * @param srcTcpPort source TCP connectPoint, or null if shouldn't be set
+     * @param dstTcpPort destination TCP connectPoint, or null if shouldn't be set
      * @return the new traffic selector
      */
     private TrafficSelector buildSelector(byte ipProto, IpAddress srcIp,
@@ -426,15 +629,6 @@
         return Key.of(keyString, sdxAppId);
     }
 
-    @Override
-    public Interface getInterfaceForPeer(IpAddress peeringAddress) {
-        Interface peeringInterface = getConfiguredInterfaceForPeer(peeringAddress);
-        if (peeringInterface == null) {
-            peeringInterface = interfaceService.getMatchingInterface(peeringAddress);
-        }
-        return peeringInterface;
-    }
-
     private class InternalNetworkConfigListener implements NetworkConfigListener {
 
         @Override
@@ -447,7 +641,8 @@
             case CONFIG_ADDED:
             case CONFIG_UPDATED:
             case CONFIG_REMOVED:
-                if (event.configClass() == RoutingService.CONFIG_CLASS) {
+                if (event.configClass() == RoutingService.CONFIG_CLASS ||
+                        event.configClass() == CONFIG_CLASS) {
                     setUpConnectivity();
                 }
                 break;
diff --git a/sdx-l3/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/sdx-l3/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index 4757f78..237a9dc 100644
--- a/sdx-l3/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/sdx-l3/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -19,5 +19,11 @@
       <command>
           <action class="org.onosproject.sdxl3.cli.BgpPeersListCommand"/>
       </command>
+      <command>
+          <action class="org.onosproject.sdxl3.cli.AddPeerDetailsCommand"/>
+      </command>
+      <command>
+          <action class="org.onosproject.sdxl3.cli.RemovePeerDetailsCommand"/>
+      </command>
   </command-bundle>
 </blueprint>
diff --git a/sdx-l3/src/main/resources/config-examples/network-cfg.json b/sdx-l3/src/main/resources/config-examples/network-cfg.json
index a51ef92..7100e7a 100644
--- a/sdx-l3/src/main/resources/config-examples/network-cfg.json
+++ b/sdx-l3/src/main/resources/config-examples/network-cfg.json
@@ -6,14 +6,25 @@
           "name" : "AS1-conn1",
           "ips"  : [ "10.0.1.101/24" ],
           "mac"  : "00:00:00:00:00:01"
-        }
-      ]
-    },
-    "of:00000000000000a2/1" : {
-      "interfaces" : [
+        },
         {
           "name" : "AS1-conn2",
           "ips"  : [ "10.0.1.101/24" ],
+          "mac"  : "00:00:00:00:00:01",
+          "vlan" : "100"
+        }
+      ]
+    },
+    "of:00000000000000a3/1" : {
+      "interfaces" : [
+        {
+          "name" : "AS1-conn3",
+          "ips"  : [ "10.0.1.101/24" ],
+          "mac"  : "00:00:00:00:00:01"
+        },
+        {
+          "name" : "AS2-conn1",
+          "ips"  : [ "10.0.2.101/24" ],
           "mac"  : "00:00:00:00:00:01"
         }
       ]
@@ -38,19 +49,34 @@
     }
   },
   "apps" : {
-    "org.onosproject.sdxl3" : {
-      "bgpPeers" : [
-        {
-          "name" : "AS1-Router1",
-          "ip" : "10.0.1.1",
-          "interface" : "AS1-conn1"
-        },
-        {
-          "name" : "AS1-Router2",
-          "ip" : "10.0.1.129",
-          "interface" : "AS1-conn2"
-        }
-      ]
+    "org.onosproject.sdxl3": {
+      "providers": {
+        "bgpPeers": [
+          {
+            "name": "AS1-Router1",
+            "ip": "10.0.1.1",
+            "connectPoint": "of:00000000000000a1/1",
+            "intfName": "AS1-conn1"
+          },
+          {
+            "name": "AS1-Router2",
+            "ip": "10.0.1.2",
+            "connectPoint": "of:00000000000000a1/1",
+            "intfName": "AS1-conn2"
+          },
+          {
+            "name": "AS1-Router3",
+            "ip": "10.0.1.129",
+            "connectPoint": "of:00000000000000a3/1",
+            "intfName": "AS1-conn3"
+          },
+          {
+            "ip": "10.0.1.2",
+            "connectPoint": "of:00000000000000a1/1",
+            "intfName": "AS1-conn2"
+          }
+        ]
+      }
     },
     "org.onosproject.router" : {
       "bgp" : {
@@ -60,8 +86,15 @@
             "connectPoint" : "of:00000000000000a3/1",
             "peers" : [
               "10.0.1.1",
+              "10.0.1.2",
               "10.0.1.129",
-              "10.0.3.1",
+              "10.0.2.1",
+              "10.0.3.1"
+            ]
+          },
+          {
+            "connectPoint" : "of:00000000000000a3/1",
+            "peers" : [
               "10.0.4.1"
             ]
           }
@@ -69,4 +102,4 @@
       }
     }
   }
-}
\ No newline at end of file
+}
diff --git a/sdx-l3/src/main/resources/config-examples/route-server_network-cfg.json b/sdx-l3/src/main/resources/config-examples/route-server_network-cfg.json
index c2ea2e3..1bdc232 100644
--- a/sdx-l3/src/main/resources/config-examples/route-server_network-cfg.json
+++ b/sdx-l3/src/main/resources/config-examples/route-server_network-cfg.json
@@ -21,18 +21,22 @@
   },
   "apps" : {
     "org.onosproject.sdxl3" : {
-      "bgpPeers" : [
-        {
-          "name" : "AS65001-R1",
-          "ip" : "10.0.0.1",
-          "interface" : "AS 65001"
-        },
-        {
-          "name" : "AS65002-R2",
-          "ip" : "10.0.0.2",
-          "interface" : "AS 65002"
-        }
-      ]
+      "providers" : {
+        "bgpPeers": [
+          {
+            "name": "AS65001-R1",
+            "ip": "10.0.0.1",
+            "connectPoint": "of:00000000000000a1/1",
+            "intfName": "AS 65001"
+          },
+          {
+            "name": "AS65002-R2",
+            "ip": "10.0.0.2",
+            "connectPoint": "of:00000000000000a1/2",
+            "intfName": "AS 65002"
+          }
+        ]
+      }
     },
     "org.onosproject.router" : {
       "bgp" : {
diff --git a/sdx-l3/src/test/java/org/onosproject/sdxl3/BgpPeersConfigTest.java b/sdx-l3/src/test/java/org/onosproject/sdxl3/BgpPeersConfigTest.java
deleted file mode 100644
index fc2a6ed..0000000
--- a/sdx-l3/src/test/java/org/onosproject/sdxl3/BgpPeersConfigTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright 2014-2015 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.sdxl3;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.collect.Sets;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.IpAddress;
-import org.onosproject.TestApplicationId;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.incubator.net.config.basics.ConfigException;
-import org.onosproject.net.config.Config;
-import org.onosproject.net.config.ConfigApplyDelegate;
-import org.onosproject.sdxl3.config.BgpPeersConfig;
-
-import java.util.Optional;
-import java.util.Set;
-
-import static junit.framework.TestCase.assertEquals;
-
-public class BgpPeersConfigTest {
-    private static final ApplicationId APP_ID =
-            new TestApplicationId(SdxL3.SDX_L3_APP);
-    private static final String KEY = "key";
-
-    public static final String NAME1 = "peer1";
-    public static final String IP1_STRING = "10.0.1.1";
-    public static final IpAddress IP1 = IpAddress.valueOf(IP1_STRING);
-    public static final String INTF1 = "conn_point1";
-
-    public static final String IP2_STRING = "10.0.2.1";
-    public static final IpAddress IP2 = IpAddress.valueOf(IP2_STRING);
-    public static final String INTF2 = "conn_point2";
-
-    private static final String JSON_TREE = "[{" +
-            "\"" + BgpPeersConfig.NAME + "\" : \"" + NAME1 + "\", " +
-            "\"" + BgpPeersConfig.IP + "\" : \"" + IP1_STRING + "\", " +
-            "\"" + BgpPeersConfig.INTERFACE + "\" : \"" + INTF1 + "\"}, " +
-            "{ \"" + BgpPeersConfig.IP + "\" : \"" + IP2_STRING + "\", " +
-            "\"" + BgpPeersConfig.INTERFACE + "\" : \"" + INTF2 + "\"}] ";
-
-    BgpPeersConfig peersConfig = new BgpPeersConfig();
-
-    private final ConfigApplyDelegate delegate = new MockCfgDelegate();
-    private final ObjectMapper mapper = new ObjectMapper();
-
-    @Before
-    public void setUp()  throws Exception {
-        JsonNode node = new ObjectMapper().readTree(JSON_TREE);
-        peersConfig.init(APP_ID, KEY, node, mapper, delegate);
-    }
-
-    /**
-     * Tests if peers can be retrieved from JSON.
-     */
-    @Test
-    public void testBgpPeers() throws Exception {
-        assertEquals(createPeers(), peersConfig.bgpPeers());
-    }
-
-    /**
-     * Tests if interface name can be retrieved for given peer's IP.
-     */
-    @Test
-    public void testGetInterfaceNameForPeer() throws Exception {
-        assertEquals(INTF1, peersConfig.getInterfaceNameForPeer(IP1));
-    }
-
-    private Set<BgpPeersConfig.PeerConfig> createPeers() throws ConfigException {
-        Set<BgpPeersConfig.PeerConfig> peers = Sets.newHashSet();
-
-        peers.add(new BgpPeersConfig.PeerConfig(Optional.of(NAME1), IP1, INTF1));
-        peers.add(new BgpPeersConfig.PeerConfig(Optional.empty(), IP2, INTF2));
-
-        return peers;
-    }
-
-    private class MockCfgDelegate implements ConfigApplyDelegate {
-
-        @Override
-        public void onApply(@SuppressWarnings("rawtypes") Config config) {
-            config.apply();
-        }
-
-    }
-}
-
diff --git a/sdx-l3/src/test/java/org/onosproject/sdxl3/SdxProvidersConfigTest.java b/sdx-l3/src/test/java/org/onosproject/sdxl3/SdxProvidersConfigTest.java
new file mode 100644
index 0000000..f0f7bd0
--- /dev/null
+++ b/sdx-l3/src/test/java/org/onosproject/sdxl3/SdxProvidersConfigTest.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2016 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.sdxl3;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Sets;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onosproject.TestApplicationId;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.config.Config;
+import org.onosproject.net.config.ConfigApplyDelegate;
+import org.onosproject.sdxl3.config.SdxProvidersConfig;
+
+import java.util.HashSet;
+import java.util.Optional;
+import java.util.Set;
+
+import static junit.framework.TestCase.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+public class SdxProvidersConfigTest {
+    private static final ApplicationId APP_ID =
+            new TestApplicationId(SdxL3.SDX_L3_APP);
+    private static final String KEY = "key";
+
+    private static final String NAME1 = "peer1";
+    private static final String IP_STRING1 = "10.0.1.1";
+    private static final IpAddress IP1 = IpAddress.valueOf(IP_STRING1);
+    private static final String PORT_STRING1 = "of:00000000000000a1/1";
+    private static final ConnectPoint PORT1 =
+            ConnectPoint.deviceConnectPoint(PORT_STRING1);
+    private static final String INTF_NAME1 = "conn_point1";
+
+    private static final String IP_STRING2 = "10.0.2.1";
+    private static final IpAddress IP2 = IpAddress.valueOf(IP_STRING2);
+    private static final String PORT_STRING2 = "of:00000000000000a1/2";
+    private static final ConnectPoint PORT2 =
+            ConnectPoint.deviceConnectPoint(PORT_STRING2);
+    private static final String INTF_NAME2 = "conn_point2";
+
+    private static final String NAME3 = "new_peer";
+    private static final String IP_STRING3 = "10.0.3.1";
+    private static final String PORT_STRING3 = "of:00000000000000a1/3";
+    private static final ConnectPoint PORT3 =
+            ConnectPoint.deviceConnectPoint(PORT_STRING3);
+    private static final IpAddress IP3 = IpAddress.valueOf(IP_STRING3);
+    private static final String INTF_NAME3 = "conn_point3";
+
+    private static final String JSON_TREE = "{\"" + SdxProvidersConfig.PEERS + "\"" +
+            ": [{\"" + SdxProvidersConfig.NAME + "\" : \"" + NAME1 + "\", " +
+            "\"" + SdxProvidersConfig.IP + "\" : \"" + IP_STRING1 + "\", " +
+            "\"" + SdxProvidersConfig.CONN_POINT + "\" : \"" + PORT_STRING1 + "\", " +
+            "\"" + SdxProvidersConfig.INTF_NAME + "\" : \"" + INTF_NAME1 + "\"}, " +
+            "{ \"" + SdxProvidersConfig.IP + "\" : \"" + IP_STRING2 + "\", " +
+            "\"" + SdxProvidersConfig.CONN_POINT + "\" : \"" + PORT_STRING2 + "\", " +
+            "\"" + SdxProvidersConfig.INTF_NAME + "\" : \"" + INTF_NAME2 + "\"}]}";
+
+    private static final String EMPTY_JSON_TREE = "{ }";
+
+    private Set<SdxProvidersConfig.PeerConfig> peers = new HashSet<>();
+    private SdxProvidersConfig.PeerConfig peer1;
+
+    private SdxProvidersConfig peersConfig = new SdxProvidersConfig();
+    private SdxProvidersConfig emptyPeersConfig = new SdxProvidersConfig();
+
+    private final ConfigApplyDelegate delegate = new MockCfgDelegate();
+    private final ObjectMapper mapper = new ObjectMapper();
+
+    @Before
+    public void setUp()  throws Exception {
+        peers = createPeers();
+        JsonNode node = new ObjectMapper().readTree(JSON_TREE);
+        peersConfig.init(APP_ID, KEY, node, mapper, delegate);
+        JsonNode emptyTree = new ObjectMapper().readTree(EMPTY_JSON_TREE);
+        emptyPeersConfig.init(APP_ID, KEY, emptyTree, mapper, delegate);
+    }
+
+    /**
+     * Tests if peers can be retrieved from JSON.
+     */
+    @Test
+    public void testBgpPeers() throws Exception {
+        assertEquals(peers, peersConfig.bgpPeers());
+    }
+
+    /**
+     * Tests if interface name can be retrieved for given peer's IP.
+     */
+    @Test
+    public void testGetInterfaceNameForPeer() throws Exception {
+        assertEquals(INTF_NAME1, peersConfig.getInterfaceNameForPeer(IP1));
+    }
+
+    /**
+     * Tests addition of new peer.
+     */
+    @Test
+    public void testAddPeer() throws Exception {
+        int initialSize = peersConfig.bgpPeers().size();
+        SdxProvidersConfig.PeerConfig newPeer = createNewPeer();
+        peersConfig.addPeer(newPeer);
+        assertEquals(initialSize + 1, peersConfig.bgpPeers().size());
+        peers.add(newPeer);
+        assertEquals(peers, peersConfig.bgpPeers());
+    }
+
+    /**
+     * Tests addition of new peer to empty configuration.
+     */
+    @Test
+    public void testAddPeerToEmpty() throws Exception {
+        emptyPeersConfig.addPeer(createNewPeer());
+        assertFalse(emptyPeersConfig.bgpPeers().isEmpty());
+    }
+
+    /**
+     * Tests getting peer configuration based on given name.
+     */
+    @Test
+    public void testGetPeerForName() throws Exception {
+        assertEquals(peer1, peersConfig.getPeerForName(Optional.of(NAME1)));
+    }
+
+    /**
+     * Tests getting peer configuration based on given IP.
+     */
+    @Test
+    public void testGetPeerForIp() throws Exception {
+        assertEquals(peer1, peersConfig.getPeerForIp(IP1));
+    }
+
+    /**
+     * Tests removing peer details based on given IP.
+     */
+    @Test
+    public void testRemovePeer() throws Exception {
+        int initialSize = peersConfig.bgpPeers().size();
+        peersConfig.removePeer(IP1);
+        assertEquals(initialSize - 1, peersConfig.bgpPeers().size());
+        peers.remove(peer1);
+        assertEquals(peers, peersConfig.bgpPeers());    }
+
+    private Set<SdxProvidersConfig.PeerConfig> createPeers() {
+        Set<SdxProvidersConfig.PeerConfig> peers = Sets.newHashSet();
+
+        peer1 = new SdxProvidersConfig.
+                PeerConfig(Optional.of(NAME1), IP1, PORT1, INTF_NAME1);
+        peers.add(peer1);
+        peers.add(new SdxProvidersConfig.
+                PeerConfig(Optional.empty(), IP2, PORT2, INTF_NAME2));
+
+        return peers;
+    }
+
+    private SdxProvidersConfig.PeerConfig createNewPeer() {
+        return new SdxProvidersConfig.
+                PeerConfig(Optional.of(NAME3), IP3, PORT3, INTF_NAME3);
+    }
+
+    private class MockCfgDelegate implements ConfigApplyDelegate {
+
+        @Override
+        public void onApply(@SuppressWarnings("rawtypes") Config config) {
+            config.apply();
+        }
+
+    }
+}
+
