diff --git a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarmsCounts.java b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarmsCounts.java
index 9f689e4..a5413dc 100644
--- a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarmsCounts.java
+++ b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarmsCounts.java
@@ -15,30 +15,59 @@
  */
 package org.onosproject.faultmanagement.alarms.cli;
 
-import java.util.Map;
+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.incubator.net.faultmanagement.alarm.Alarm;
 import org.onosproject.incubator.net.faultmanagement.alarm.AlarmService;
+import org.onosproject.net.DeviceId;
+
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * Lists alarm counts across all devices.
  */
-@Command(scope = "onos", name = "alarm-counts",
-        description = "Lists alarm counts across all devices.")
+@Command(scope = "onos", name = "alarms-counts",
+        description = "Lists the count of alarms for each severity")
 public class GetAllAlarmsCounts extends AbstractShellCommand {
 
+    @Option(name = "-a", aliases = "--active", description = "Shows ACTIVE alarms only",
+            required = false, multiValued = false)
+    private boolean activeOnly = false;
+
+    @Argument(index = 0, name = "deviceId", description = "Device identity",
+            required = false, multiValued = false)
+    String deviceId = null;
+
+    private AlarmService alarmService = AbstractShellCommand.get(AlarmService.class);
+    private Map<Alarm.SeverityLevel, Long> alarmCounts;
+
     @Override
     protected void execute() {
-        Map<Alarm.SeverityLevel, Long> alarmCounts
-                = AbstractShellCommand.get(AlarmService.class).getAlarmCounts();
+        if (deviceId != null) {
+            if (activeOnly) {
+                alarmCounts = alarmService.getActiveAlarms(DeviceId.deviceId(deviceId))
+                        .stream().filter(a -> !a.severity().equals(Alarm.SeverityLevel.CLEARED))
+                        .collect(Collectors.groupingBy(Alarm::severity, Collectors.counting()));
+            } else {
+                alarmCounts = alarmService.
+                        getAlarmCounts(DeviceId.deviceId(deviceId));
+            }
+        } else if (activeOnly) {
+            alarmCounts = alarmService.getActiveAlarms()
+                    .stream().filter(a -> !a.severity().equals(Alarm.SeverityLevel.CLEARED))
+                    .collect(Collectors.groupingBy(Alarm::severity, Collectors.counting()));
+        } else {
+            alarmCounts = alarmService.getAlarmCounts();
+        }
         printCounts(alarmCounts);
     }
 
     void printCounts(Map<Alarm.SeverityLevel, Long> alarmCounts) {
         alarmCounts.entrySet().forEach((countEntry) -> {
-            print(String.format("%s, %d",
-                    countEntry.getKey(), countEntry.getValue()));
+            print(String.format("%s, %d", countEntry.getKey(), countEntry.getValue()));
 
         });
     }
