diff --git a/cli/src/main/java/org/onosproject/cli/NodeAddCommand.java b/cli/src/main/java/org/onosproject/cli/NodeAddCommand.java
deleted file mode 100644
index e01fd67..0000000
--- a/cli/src/main/java/org/onosproject/cli/NodeAddCommand.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2014-present Open Networking Foundation
- *
- * 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.cli;
-
-import org.apache.karaf.shell.api.action.Argument;
-import org.apache.karaf.shell.api.action.Command;
-import org.apache.karaf.shell.api.action.lifecycle.Service;
-import org.onosproject.cluster.ClusterAdminService;
-import org.onosproject.cluster.DefaultControllerNode;
-import org.onosproject.cluster.NodeId;
-import org.onlab.packet.IpAddress;
-
-/**
- * Adds a new controller cluster node.
- */
-@Service
-@Command(scope = "onos", name = "add-node",
-         description = "Adds a new controller cluster node")
-public class NodeAddCommand extends AbstractShellCommand {
-
-    @Argument(index = 0, name = "nodeId", description = "Node ID",
-              required = true, multiValued = false)
-    String nodeId = null;
-
-    @Argument(index = 1, name = "ip", description = "Node IP address",
-              required = true, multiValued = false)
-    String ip = null;
-
-    @Argument(index = 2, name = "tcpPort", description = "Node TCP listen port",
-              required = false, multiValued = false)
-    int tcpPort = DefaultControllerNode.DEFAULT_PORT;
-
-    @Override
-    protected void doExecute() {
-        ClusterAdminService service = get(ClusterAdminService.class);
-        service.addNode(new NodeId(nodeId), IpAddress.valueOf(ip), tcpPort);
-    }
-
-}
diff --git a/cli/src/main/java/org/onosproject/cli/NodeRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/NodeRemoveCommand.java
deleted file mode 100644
index 5470c38..0000000
--- a/cli/src/main/java/org/onosproject/cli/NodeRemoveCommand.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2014-present Open Networking Foundation
- *
- * 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.cli;
-
-import org.apache.karaf.shell.api.action.Argument;
-import org.apache.karaf.shell.api.action.Command;
-import org.apache.karaf.shell.api.action.lifecycle.Service;
-import org.onosproject.cluster.ClusterAdminService;
-import org.onosproject.cluster.NodeId;
-
-/**
- * Removes a controller cluster node.
- */
-@Service
-@Command(scope = "onos", name = "remove-node",
-         description = "Removes a new controller cluster node")
-public class NodeRemoveCommand extends AbstractShellCommand {
-
-    @Argument(index = 0, name = "nodeId", description = "Node ID",
-              required = true, multiValued = false)
-    String nodeId = null;
-
-    @Override
-    protected void doExecute() {
-        ClusterAdminService service = get(ClusterAdminService.class);
-        service.removeNode(new NodeId(nodeId));
-    }
-
-}
diff --git a/core/api/src/main/java/org/onosproject/cluster/ClusterAdminService.java b/core/api/src/main/java/org/onosproject/cluster/ClusterAdminService.java
index 4792a94..250892b 100644
--- a/core/api/src/main/java/org/onosproject/cluster/ClusterAdminService.java
+++ b/core/api/src/main/java/org/onosproject/cluster/ClusterAdminService.java
@@ -15,60 +15,12 @@
  */
 package org.onosproject.cluster;
 
-import java.util.Set;
-
-import org.onlab.packet.IpAddress;
-
 /**
  * Service for administering the cluster node membership.
  */
 public interface ClusterAdminService extends ClusterService {
 
     /**
-     * Forms cluster configuration based on the specified set of node
-     * information.&nbsp; This method resets and restarts the controller
-     * instance.
-     *
-     * @param nodes    set of nodes that form the cluster
-     * @deprecated since 1.14
-     */
-    @Deprecated
-    void formCluster(Set<ControllerNode> nodes);
-
-    /**
-     * Forms cluster configuration based on the specified set of node
-     * information.&nbsp; This method resets and restarts the controller
-     * instance.
-     *
-     * @param nodes    set of nodes that form the cluster
-     * @param partitionSize number of nodes to compose a partition
-     * @deprecated since 1.14
-     */
-    @Deprecated
-    void formCluster(Set<ControllerNode> nodes, int partitionSize);
-
-    /**
-     * Adds a new controller node to the cluster.
-     *
-     * @param nodeId  controller node identifier
-     * @param ip      node IP listen address
-     * @param tcpPort tcp listen port
-     * @return newly added node
-     * @deprecated since 1.14
-     */
-    @Deprecated
-    ControllerNode addNode(NodeId nodeId, IpAddress ip, int tcpPort);
-
-    /**
-     * Removes the specified node from the cluster node list.
-     *
-     * @param nodeId controller node identifier
-     * @deprecated since 1.14
-     */
-    @Deprecated
-    void removeNode(NodeId nodeId);
-
-    /**
      * Marks the current node as fully started or not.
      *
      * @param started true indicates all components have been started
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java b/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java
index 240fa24..44a86c5 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java
@@ -16,14 +16,10 @@
 package org.onosproject.cluster.impl;
 
 import org.apache.karaf.system.SystemService;
-import org.onlab.packet.IpAddress;
 import org.onosproject.cluster.ClusterAdminService;
 import org.onosproject.cluster.ClusterEvent;
 import org.onosproject.cluster.ClusterEventListener;
 import org.onosproject.cluster.ClusterMetadata;
-import org.onosproject.cluster.ClusterMetadataDiff;
-import org.onosproject.cluster.ClusterMetadataEvent;
-import org.onosproject.cluster.ClusterMetadataEventListener;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.ClusterStore;
 import org.onosproject.cluster.ClusterStoreDelegate;
@@ -43,7 +39,6 @@
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 
-import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.CLUSTER_READ;
@@ -70,7 +65,6 @@
     protected SystemService systemService;
 
     private final AtomicReference<ClusterMetadata> currentMetadata = new AtomicReference<>();
-    private final InternalClusterMetadataListener metadataListener = new InternalClusterMetadataListener();
 
     @Activate
     public void activate() {
@@ -136,30 +130,6 @@
         return store.getLastUpdatedInstant(nodeId);
     }
 
-    @Override
-    public void formCluster(Set<ControllerNode> nodes) {
-        formCluster(nodes, DEFAULT_PARTITION_SIZE);
-    }
-
-    @Override
-    public void formCluster(Set<ControllerNode> nodes, int partitionSize) {
-        log.warn("formCluster is deprecated");
-    }
-
-    @Override
-    public ControllerNode addNode(NodeId nodeId, IpAddress ip, int tcpPort) {
-        checkNotNull(nodeId, INSTANCE_ID_NULL);
-        checkNotNull(ip, "IP address cannot be null");
-        checkArgument(tcpPort > 5000, "TCP port must be > 5000");
-        return store.addNode(nodeId, ip, tcpPort);
-    }
-
-    @Override
-    public void removeNode(NodeId nodeId) {
-        checkNotNull(nodeId, INSTANCE_ID_NULL);
-        store.removeNode(nodeId);
-    }
-
     // Store delegate to re-post events emitted from the store.
     private class InternalStoreDelegate implements ClusterStoreDelegate {
         @Override
@@ -167,25 +137,4 @@
             post(event);
         }
     }
-
-    /**
-     * Processes metadata by adding and removing nodes from the cluster.
-     */
-    private synchronized void processMetadata(ClusterMetadata metadata) {
-        try {
-            ClusterMetadataDiff examiner =
-                    new ClusterMetadataDiff(currentMetadata.get(), metadata);
-            examiner.nodesAdded().forEach(node -> addNode(node.id(), node.ip(), node.tcpPort()));
-            examiner.nodesRemoved().forEach(this::removeNode);
-        } finally {
-            currentMetadata.set(metadata);
-        }
-    }
-
-    private class InternalClusterMetadataListener implements ClusterMetadataEventListener {
-        @Override
-        public void event(ClusterMetadataEvent event) {
-            processMetadata(event.subject());
-        }
-    }
 }
