diff --git a/cli/src/main/java/org/onosproject/cli/StorageNodesListCommand.java b/cli/src/main/java/org/onosproject/cli/StorageNodesListCommand.java
new file mode 100644
index 0000000..7b26db8
--- /dev/null
+++ b/cli/src/main/java/org/onosproject/cli/StorageNodesListCommand.java
@@ -0,0 +1,69 @@
+/*
+ * 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 java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cluster.ClusterAdminService;
+import org.onosproject.cluster.Node;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+/**
+ * Lists all storage nodes.
+ */
+@Command(scope = "onos", name = "storage-nodes", description = "Lists all storage nodes")
+public class StorageNodesListCommand extends AbstractShellCommand {
+
+    private static final String FMT = "id=%s, address=%s:%s";
+
+    @Override
+    protected void execute() {
+        ClusterAdminService service = get(ClusterAdminService.class);
+        List<Node> nodes = newArrayList(service.getConsensusNodes());
+        Collections.sort(nodes, Comparator.comparing(Node::id));
+        if (outputJson()) {
+            print("%s", json(nodes));
+        } else {
+            for (Node node : nodes) {
+                print(FMT, node.id(), node.host(), node.tcpPort());
+            }
+        }
+    }
+
+    // Produces JSON structure.
+    private JsonNode json(List<Node> nodes) {
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayNode result = mapper.createArrayNode();
+        for (Node node : nodes) {
+            ObjectNode newNode = mapper.createObjectNode()
+                    .put("id", node.id().toString())
+                    .put("ip", node.ip().toString())
+                    .put("host", node.host())
+                    .put("tcpPort", node.tcpPort());
+            result.add(newNode);
+        }
+        return result;
+    }
+
+}
