diff --git a/pom.xml b/pom.xml
index db081c0..531ef73 100644
--- a/pom.xml
+++ b/pom.xml
@@ -52,6 +52,7 @@
         <module>ifwd</module>
         <module>ipfix</module>
         <module>oneping</module>
+        <module>sdx-l3</module>
         <module>tvue</module>
         <module>uiref</module>
         <module>ecord/co</module>
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();
+        }
+
+    }
+}
+
