diff --git a/apps/routing/src/main/java/org/onosproject/routing/cli/AddPeerCommand.java b/apps/routing/src/main/java/org/onosproject/routing/cli/AddPeerCommand.java
new file mode 100644
index 0000000..d3162ed
--- /dev/null
+++ b/apps/routing/src/main/java/org/onosproject/routing/cli/AddPeerCommand.java
@@ -0,0 +1,96 @@
+/*
+ * 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.routing.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.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.incubator.net.intf.InterfaceService;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.routing.RoutingService;
+import org.onosproject.routing.config.BgpConfig;
+
+/**
+ * Command to add new BGP peer to existing internal speaker.
+ */
+@Command(scope = "onos", name = "add-bgp-peer",
+        description = "Adds an external BGP router as peer to an existing BGP speaker")
+public class AddPeerCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "name",
+            description = "Name of the internal BGP speaker",
+            required = true, multiValued = false)
+    String name = null;
+
+    @Argument(index = 1, name = "ip",
+            description = "IP address of the BGP peer",
+            required = true, multiValued = false)
+    String ip = null;
+
+    private static final String PEER_ADD_SUCCESS = "Peer Successfully Added.";
+    private static final String NO_CONFIGURATION = "No speakers configured";
+    private static final String SPEAKER_NOT_FOUND =
+            "Speaker with name \'%s\' not found";
+    private static final String NO_INTERFACE =
+            "No matching interface found for IP \'%s\'";
+
+    private IpAddress peerAddress = null;
+
+    @Override
+    protected void execute() {
+        peerAddress = IpAddress.valueOf(ip);
+
+        NetworkConfigService configService = get(NetworkConfigService.class);
+        CoreService coreService = get(CoreService.class);
+        ApplicationId appId = coreService.getAppId(RoutingService.ROUTER_APP_ID);
+
+        BgpConfig config = configService.getConfig(appId, BgpConfig.class);
+        if (config == null || config.bgpSpeakers().isEmpty()) {
+            print(NO_CONFIGURATION);
+            return;
+        }
+
+        BgpConfig.BgpSpeakerConfig speaker = config.getSpeakerWithName(name);
+        if (speaker == null) {
+            print(SPEAKER_NOT_FOUND, name);
+            return;
+        } else {
+            if (speaker.isConnectedToPeer(peerAddress)) {
+                return; // Peering already exists.
+            }
+        }
+
+        InterfaceService interfaceService = get(InterfaceService.class);
+        if (interfaceService.getMatchingInterface(peerAddress) == null) {
+            print(NO_INTERFACE, ip);
+            return;
+        }
+
+        addPeerToSpeakerConf(config);
+        configService.applyConfig(appId, BgpConfig.class, config.node());
+
+        print(PEER_ADD_SUCCESS);
+    }
+
+    private void addPeerToSpeakerConf(BgpConfig config) {
+        log.debug("Creating BGP configuration for new peer: {}", ip);
+        config.addPeerToSpeaker(name, peerAddress);
+    }
+}
diff --git a/apps/routing/src/main/java/org/onosproject/routing/cli/AddSpeakerCommand.java b/apps/routing/src/main/java/org/onosproject/routing/cli/AddSpeakerCommand.java
new file mode 100644
index 0000000..e414239
--- /dev/null
+++ b/apps/routing/src/main/java/org/onosproject/routing/cli/AddSpeakerCommand.java
@@ -0,0 +1,90 @@
+/*
+ * 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.routing.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.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.routing.RoutingService;
+import org.onosproject.routing.config.BgpConfig;
+
+import java.util.HashSet;
+import java.util.Optional;
+
+/**
+ * Command to add a new internal BGP speaker.
+ */
+@Command(scope = "onos", name = "add-bgp-speaker",
+        description = "Adds an internal BGP speaker")
+public class AddSpeakerCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "name",
+            description = "Name of the internal BGP speaker",
+            required = true, multiValued = false)
+    String name = null;
+
+    @Argument(index = 1, name = "connectionPoint",
+            description = "Interface to the BGP speaker",
+            required = true, multiValued = false)
+    String connectionPoint = null;
+
+    private static final String SPEAKER_ADD_SUCCESS = "Speaker Successfully Added.";
+
+    @Override
+    protected void execute() {
+        NetworkConfigService configService = get(NetworkConfigService.class);
+        CoreService coreService = get(CoreService.class);
+        ApplicationId appId = coreService.getAppId(RoutingService.ROUTER_APP_ID);
+
+        BgpConfig config = configService.addConfig(appId, BgpConfig.class);
+
+        BgpConfig.BgpSpeakerConfig speaker = config.getSpeakerWithName(name);
+        if (speaker != null) {
+            log.debug("Speaker already exists: {}", name);
+            return;
+        }
+
+        addSpeakerToConf(config);
+        configService.applyConfig(appId, BgpConfig.class, config.node());
+
+        print(SPEAKER_ADD_SUCCESS);
+    }
+
+    /**
+     * Adds the speaker to the BgpConfig service.
+     *
+     * @param config the BGP configuration
+     */
+    private void addSpeakerToConf(BgpConfig config) {
+        log.debug("Adding new speaker to configuration: {}", name);
+        BgpConfig.BgpSpeakerConfig speaker = getSpeaker();
+
+        config.addSpeaker(speaker);
+    }
+
+    private BgpConfig.BgpSpeakerConfig getSpeaker() {
+        ConnectPoint connectPoint = ConnectPoint.
+                deviceConnectPoint(connectionPoint);
+        return new BgpConfig.BgpSpeakerConfig(Optional.ofNullable(name),
+                connectPoint, new HashSet<IpAddress>());
+    }
+}
diff --git a/apps/routing/src/main/java/org/onosproject/routing/cli/RemovePeerCommand.java b/apps/routing/src/main/java/org/onosproject/routing/cli/RemovePeerCommand.java
new file mode 100644
index 0000000..e3f7ff3
--- /dev/null
+++ b/apps/routing/src/main/java/org/onosproject/routing/cli/RemovePeerCommand.java
@@ -0,0 +1,81 @@
+/*
+ * 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.routing.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.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.routing.RoutingService;
+import org.onosproject.routing.config.BgpConfig;
+
+/**
+ * Command to remove existing BGP peer.
+ */
+@Command(scope = "onos", name = "remove-bgp-peer",
+        description = "Removes a BGP peer")
+public class RemovePeerCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "ip",
+            description = "IP address of the BGP peer",
+            required = true, multiValued = false)
+    String ip = null;
+
+    private static final String PEER_REMOVE_SUCCESS = "Peer Successfully Removed.";
+    private static final String NO_CONFIGURATION = "No speakers configured";
+    private static final String PEER_NOT_FOUND =
+            "Peer with IP \'%s\' not found";
+
+    private IpAddress peerAddress = null;
+
+    @Override
+    protected void execute() {
+        peerAddress = IpAddress.valueOf(ip);
+
+        NetworkConfigService configService = get(NetworkConfigService.class);
+        CoreService coreService = get(CoreService.class);
+        ApplicationId appId = coreService.getAppId(RoutingService.ROUTER_APP_ID);
+
+        BgpConfig config = configService.getConfig(appId, BgpConfig.class);
+        if (config == null || config.bgpSpeakers().isEmpty()) {
+            print(NO_CONFIGURATION);
+            return;
+        }
+
+        peerAddress = IpAddress.valueOf(ip);
+
+        BgpConfig.BgpSpeakerConfig speaker = config.getSpeakerFromPeer(peerAddress);
+        if (speaker == null) {
+            print(PEER_NOT_FOUND, ip);
+            return;
+        }
+
+        removePeerFromSpeakerConf(speaker, config);
+        configService.applyConfig(appId, BgpConfig.class, config.node());
+
+        print(PEER_REMOVE_SUCCESS);
+    }
+
+    private void removePeerFromSpeakerConf(BgpConfig.BgpSpeakerConfig speaker,
+                                           BgpConfig config) {
+        log.debug("Removing BGP configuration for peer: {}", ip);
+        config.removePeerFromSpeaker(speaker, peerAddress);
+    }
+}
diff --git a/apps/routing/src/main/java/org/onosproject/routing/cli/RemoveSpeakerCommand.java b/apps/routing/src/main/java/org/onosproject/routing/cli/RemoveSpeakerCommand.java
new file mode 100644
index 0000000..2ce6da2
--- /dev/null
+++ b/apps/routing/src/main/java/org/onosproject/routing/cli/RemoveSpeakerCommand.java
@@ -0,0 +1,87 @@
+/*
+ * 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.routing.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.routing.RoutingService;
+import org.onosproject.routing.config.BgpConfig;
+
+/**
+ * Command to remove a internal BGP speaker.
+ */
+@Command(scope = "onos", name = "remove-bgp-speaker",
+        description = "Removes an internal BGP speaker")
+public class RemoveSpeakerCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "name",
+            description = "Name of the internal BGP speaker",
+            required = true, multiValued = false)
+    String name = null;
+
+    private static final String SPEAKER_REMOVE_SUCCESS = "Speaker Successfully Removed.";
+    private static final String NO_CONFIGURATION = "No speakers configured";
+    private static final String PEERS_EXIST =
+            "Speaker with name \'%s\' has peer connections";
+    private static final String SPEAKER_NOT_FOUND =
+            "Speaker with name \'%s\' not found";
+
+    @Override
+    protected void execute() {
+        NetworkConfigService configService = get(NetworkConfigService.class);
+        CoreService coreService = get(CoreService.class);
+        ApplicationId appId = coreService.getAppId(RoutingService.ROUTER_APP_ID);
+
+        BgpConfig config = configService.getConfig(appId, BgpConfig.class);
+        if (config == null || config.bgpSpeakers().isEmpty()) {
+            print(NO_CONFIGURATION);
+            return;
+        }
+
+        BgpConfig.BgpSpeakerConfig speaker = config.getSpeakerWithName(name);
+        if (speaker == null) {
+            print(SPEAKER_NOT_FOUND, name);
+            return;
+        } else {
+            if (!speaker.peers().isEmpty()) {
+                // Removal not allowed when peer connections exist.
+                print(PEERS_EXIST, name);
+                return;
+            }
+        }
+
+        removeSpeakerFromConf(config);
+        configService.applyConfig(appId, BgpConfig.class, config.node());
+
+        print(SPEAKER_REMOVE_SUCCESS);
+    }
+
+    /**
+     * Removes the speaker from the BgpConfig service.
+     *
+     * @param bgpConfig the BGP configuration
+     */
+    private void removeSpeakerFromConf(BgpConfig bgpConfig) {
+        log.debug("Removing speaker from configuration: {}", name);
+
+        bgpConfig.removeSpeaker(name);
+    }
+}
diff --git a/apps/routing/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/routing/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index d5ca246..ab9c620 100644
--- a/apps/routing/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/apps/routing/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -37,5 +37,17 @@
     <command>
       <action class="org.onosproject.routing.cli.PrimaryChangeCommand"/>
     </command>
+    <command>
+      <action class="org.onosproject.routing.cli.AddSpeakerCommand"/>
+    </command>
+    <command>
+      <action class="org.onosproject.routing.cli.RemoveSpeakerCommand"/>
+    </command>
+    <command>
+      <action class="org.onosproject.routing.cli.AddPeerCommand"/>
+    </command>
+    <command>
+      <action class="org.onosproject.routing.cli.RemovePeerCommand"/>
+    </command>
   </command-bundle>
 </blueprint>
