diff --git a/cli/src/main/java/org/onlab/onos/cli/TabletAddCommand.java b/cli/src/main/java/org/onlab/onos/cli/TabletAddCommand.java
new file mode 100644
index 0000000..a7cdff7
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/TabletAddCommand.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2014 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.onlab.onos.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.onos.cluster.ControllerNode;
+import org.onlab.onos.cluster.DefaultControllerNode;
+import org.onlab.onos.cluster.NodeId;
+import org.onlab.onos.store.service.DatabaseAdminService;
+import org.onlab.packet.IpAddress;
+
+/**
+ * Adds a new controller cluster node.
+ */
+@Command(scope = "onos", name = "tablet-add",
+         description = "Adds a new member to tablet")
+public class TabletAddCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "nodeId", description = "Node ID",
+              required = true, multiValued = false)
+    String nodeId = null;
+
+    // TODO context aware completer to get IP from ClusterService?
+    @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 = 9876;
+
+    // TODO add tablet name argument when we support multiple tablets
+
+    @Override
+    protected void execute() {
+        DatabaseAdminService service = get(DatabaseAdminService.class);
+        ControllerNode node = new DefaultControllerNode(new NodeId(nodeId),
+                                                        IpAddress.valueOf(ip),
+                                                        tcpPort);
+        service.addMember(node);
+    }
+}
diff --git a/cli/src/main/java/org/onlab/onos/cli/TabletMemberCommand.java b/cli/src/main/java/org/onlab/onos/cli/TabletMemberCommand.java
new file mode 100644
index 0000000..da42790
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/TabletMemberCommand.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2014 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.onlab.onos.cli;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.onos.cluster.ClusterService;
+import org.onlab.onos.cluster.ControllerNode;
+import org.onlab.onos.store.service.DatabaseAdminService;
+
+import java.util.Collections;
+import java.util.List;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+/**
+ * Lists all controller cluster nodes.
+ */
+@Command(scope = "onos", name = "tablet-member",
+         description = "Lists all member nodes")
+public class TabletMemberCommand extends AbstractShellCommand {
+
+    // TODO add tablet name argument when we support multiple tablets
+
+    @Override
+    protected void execute() {
+        DatabaseAdminService service = get(DatabaseAdminService.class);
+        ClusterService clusterService = get(ClusterService.class);
+        List<ControllerNode> nodes = newArrayList(service.listMembers());
+        Collections.sort(nodes, Comparators.NODE_COMPARATOR);
+        if (outputJson()) {
+            print("%s", json(service, nodes));
+        } else {
+            ControllerNode self = clusterService.getLocalNode();
+            for (ControllerNode node : nodes) {
+                print("id=%s, address=%s:%s %s",
+                      node.id(), node.ip(), node.tcpPort(),
+                      node.equals(self) ? "*" : "");
+            }
+        }
+    }
+
+    // Produces JSON structure.
+    private JsonNode json(DatabaseAdminService service, List<ControllerNode> nodes) {
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayNode result = mapper.createArrayNode();
+        for (ControllerNode node : nodes) {
+            result.add(mapper.createObjectNode()
+                               .put("id", node.id().toString())
+                               .put("ip", node.ip().toString())
+                               .put("tcpPort", node.tcpPort()));
+        }
+        return result;
+    }
+
+}
diff --git a/cli/src/main/java/org/onlab/onos/cli/TabletRemoveCommand.java b/cli/src/main/java/org/onlab/onos/cli/TabletRemoveCommand.java
new file mode 100644
index 0000000..19c669d
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/TabletRemoveCommand.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2014 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.onlab.onos.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.onos.cluster.ClusterService;
+import org.onlab.onos.cluster.ControllerNode;
+import org.onlab.onos.cluster.NodeId;
+import org.onlab.onos.store.service.DatabaseAdminService;
+
+/**
+ * Removes a controller cluster node.
+ */
+@Command(scope = "onos", name = "tablet-remove",
+         description = "Removes a member from tablet")
+public class TabletRemoveCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "nodeId", description = "Node ID",
+              required = true, multiValued = false)
+    String nodeId = null;
+
+    // TODO add tablet name argument when we support multiple tablets
+
+    @Override
+    protected void execute() {
+        DatabaseAdminService service = get(DatabaseAdminService.class);
+        ClusterService clusterService = get(ClusterService.class);
+        ControllerNode node = clusterService.getNode(new NodeId(nodeId));
+        if (node != null) {
+            service.removeMember(node);
+        }
+    }
+}
