diff --git a/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingCommand.java b/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingCommand.java
deleted file mode 100644
index 4318b6c..0000000
--- a/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingCommand.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2017-present 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.mapping.cli;
-
-import org.onosproject.cli.AbstractShellCommand;
-
-/**
- * A command for querying mapping information.
- */
-public class MappingCommand extends AbstractShellCommand {
-    @Override
-    protected void execute() {
-
-    }
-}
diff --git a/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingStoreTypeCompleter.java b/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingStoreTypeCompleter.java
new file mode 100755
index 0000000..2a7c04b
--- /dev/null
+++ b/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingStoreTypeCompleter.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2017-present 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.mapping.cli;
+
+import com.google.common.collect.ImmutableList;
+import org.onosproject.cli.AbstractChoicesCompleter;
+import org.onosproject.mapping.MappingStore.Type;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Mapping store type completer.
+ */
+public class MappingStoreTypeCompleter extends AbstractChoicesCompleter {
+
+    private static final List<Type> STORE_TYPES =
+            ImmutableList.of(Type.MAP_CACHE, Type.MAP_DATABASE);
+
+    @Override
+    protected List<String> choices() {
+        return STORE_TYPES.stream().map(type ->
+                type.toString().toLowerCase()).collect(Collectors.toList());
+    }
+}
\ No newline at end of file
diff --git a/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingsListCommand.java b/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingsListCommand.java
new file mode 100755
index 0000000..b626ae5
--- /dev/null
+++ b/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingsListCommand.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2017-present 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.mapping.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.Option;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.mapping.Mapping;
+import org.onosproject.mapping.MappingKey;
+import org.onosproject.mapping.MappingTreatment;
+import org.onosproject.mapping.MappingValue;
+import org.onosproject.mapping.MappingService;
+import org.onosproject.mapping.MappingStore;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.device.DeviceService;
+
+import java.util.List;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+/**
+ * A command for querying mapping information.
+ */
+@Command(scope = "onos", name = "mappings",
+        description = "Lists mappings")
+public class MappingsListCommand extends AbstractShellCommand {
+
+    private static final String DB = "map_database";
+    private static final String CACHE = "map_cache";
+
+    private static final String SUMMARY_FORMAT = "deviceId=%s, mappingCount=%d";
+    private static final String MAPPING_ID_FORMAT = "  id=%s";
+    private static final String MAPPING_KEY_FORMAT = "  key=%s";
+    private static final String MAPPING_VALUE_FORMAT = "  value=";
+    private static final String MAPPING_ACTION_FORMAT = "    action=%s";
+    private static final String MAPPING_TREATMENTS_FORMAT = "    treatments=";
+    private static final String MAPPING_TREATMENT_LONG_FORMAT =
+            "      address=%s, instructions=%s";
+    private static final String MAPPING_TREATMENT_SHORT_FORMAT = "      %s";
+
+    @Argument(index = 0, name = "type",
+            description = "Shows mappings with specified type",
+            required = true, multiValued = false)
+    private String type = null;
+
+    @Argument(index = 1, name = "deviceId", description = "Device identity",
+            required = false, multiValued = false)
+    private String deviceId = null;
+
+    @Option(name = "-s", aliases = "--short",
+            description = "Print more succinct output for each mapping",
+            required = false, multiValued = false)
+    private boolean shortOutput = false;
+
+    private MappingService mappingService =
+            AbstractShellCommand.get(MappingService.class);
+    private List<Mapping> mappings;
+
+    @Override
+    protected void execute() {
+
+        MappingStore.Type typeEnum = null;
+
+        if (type.equals(DB)) {
+            typeEnum = MappingStore.Type.MAP_DATABASE;
+        } else if (type.equals(CACHE)) {
+            typeEnum = MappingStore.Type.MAP_CACHE;
+        }
+
+        DeviceService deviceService = get(DeviceService.class);
+        Iterable<Device> devices = deviceService.getDevices();
+
+        if (deviceId != null) {
+            mappings = newArrayList(mappingService.getMappingEntries(typeEnum,
+                    DeviceId.deviceId(deviceId)));
+            printMappings(DeviceId.deviceId(deviceId), mappings);
+
+        } else {
+
+            for (Device d : devices) {
+                mappings = newArrayList(mappingService.getMappingEntries(typeEnum, d.id()));
+                printMappings(d.id(), mappings);
+            }
+        }
+    }
+
+    /**
+     * Prints out mapping information.
+     *
+     * @param deviceId device identifier
+     * @param mappings a collection of mapping
+     */
+    private void printMappings(DeviceId deviceId, List<Mapping> mappings) {
+
+        print(SUMMARY_FORMAT, deviceId, mappings.size());
+
+        for (Mapping m : mappings) {
+            print(MAPPING_ID_FORMAT, Long.toHexString(m.id().value()));
+            print(MAPPING_KEY_FORMAT, printMappingKey(m.key()));
+            printMappingValue(m.value());
+        }
+    }
+
+    /**
+     * Prints out mapping key.
+     *
+     * @param key mapping key
+     * @return string format of mapping key
+     */
+    private String printMappingKey(MappingKey key) {
+        StringBuilder builder = new StringBuilder();
+
+        if (key.address() != null) {
+            builder.append(key.address().toString());
+        }
+
+        return builder.toString();
+    }
+
+    /**
+     * Prints out mapping value.
+     *
+     * @param value mapping value
+     * @return string format of mapping value
+     */
+    private void printMappingValue(MappingValue value) {
+
+        print(MAPPING_VALUE_FORMAT);
+
+        if (value.action() != null) {
+            print(MAPPING_ACTION_FORMAT, value.action().toString());
+        }
+
+        if (!value.treatments().isEmpty()) {
+            print(MAPPING_TREATMENTS_FORMAT);
+            for (MappingTreatment treatment : value.treatments()) {
+                printMappingTreatment(treatment);
+            }
+        }
+
+    }
+
+    /**
+     * Prints out mapping treatment.
+     *
+     * @param treatment mapping treatment
+     * @return string format of mapping treatment
+     */
+    private void printMappingTreatment(MappingTreatment treatment) {
+        if (treatment != null) {
+            if (shortOutput) {
+                print(MAPPING_TREATMENT_SHORT_FORMAT, treatment.address());
+            } else {
+                print(MAPPING_TREATMENT_LONG_FORMAT, treatment.address(),
+                        treatment.instructions());
+            }
+        }
+    }
+}
\ No newline at end of file
