Completer fixes for core ONOS CLI commands

Change-Id: Icedfc542ad93a2825b592f3deb6cd96d91779544
diff --git a/cli/src/main/java/org/onosproject/cli/MetricNameCompleter.java b/cli/src/main/java/org/onosproject/cli/MetricNameCompleter.java
index 31ac4ff..62734f5 100644
--- a/cli/src/main/java/org/onosproject/cli/MetricNameCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/MetricNameCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cli;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.metrics.MetricsService;
 
 import java.util.ArrayList;
@@ -23,6 +24,7 @@
 /**
  * Metric name completer.
  */
+@Service
 public class MetricNameCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/MetricsListCommand.java b/cli/src/main/java/org/onosproject/cli/MetricsListCommand.java
index 3cd9515..a2a99f9 100644
--- a/cli/src/main/java/org/onosproject/cli/MetricsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/MetricsListCommand.java
@@ -31,6 +31,7 @@
 import com.google.common.collect.TreeMultimap;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.metrics.MetricsService;
 import org.onlab.util.Tools;
@@ -70,6 +71,7 @@
 
     @Argument(index = 0, name = "metricName", description = "Name of Metric",
             required = false, multiValued = false)
+    @Completion(MetricNameCompleter.class)
     String metricName = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/cfg/ComponentConfigCommand.java b/cli/src/main/java/org/onosproject/cli/cfg/ComponentConfigCommand.java
index 546a637..6c69457 100644
--- a/cli/src/main/java/org/onosproject/cli/cfg/ComponentConfigCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/cfg/ComponentConfigCommand.java
@@ -20,6 +20,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cfg.ComponentConfigService;
@@ -30,6 +31,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.cli.app.ApplicationCommandCompleter;
+import org.onosproject.cli.app.ApplicationNameCompleter;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
 
@@ -56,14 +59,17 @@
     @Argument(index = 0, name = "command",
             description = "Command name (get|set|preset)",
             required = false, multiValued = false)
+    @Completion(ApplicationCommandCompleter.class)
     String command = null;
 
     @Argument(index = 1, name = "component", description = "Component name",
             required = false, multiValued = false)
+    @Completion(ApplicationNameCompleter.class)
     String component = null;
 
     @Argument(index = 2, name = "name", description = "Property name",
             required = false, multiValued = false)
+    @Completion(ComponentPropertyNameCompleter.class)
     String name = null;
 
     @Argument(index = 3, name = "value", description = "Property value",
diff --git a/cli/src/main/java/org/onosproject/cli/cfg/ConfigKeyCompleter.java b/cli/src/main/java/org/onosproject/cli/cfg/ConfigKeyCompleter.java
index 55baaf6..74bcdc2 100644
--- a/cli/src/main/java/org/onosproject/cli/cfg/ConfigKeyCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/cfg/ConfigKeyCompleter.java
@@ -21,6 +21,7 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.config.Config;
@@ -35,6 +36,7 @@
  * Assumes 2 argument before the one being completed is SubjectClassKey
  * and argument right before the one being completed is SubjectKey.
  */
+@Service
 public class ConfigKeyCompleter extends AbstractChoicesCompleter {
 
     // FIXME ConfigKeyCompleter never gets called??
diff --git a/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigCommand.java b/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigCommand.java
index b155090..fad93ef 100644
--- a/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigCommand.java
@@ -21,6 +21,7 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -43,14 +44,17 @@
 
     @Argument(index = 0, name = "subjectClassKey", description = "Subject class key",
             required = false, multiValued = false)
+    @Completion(ComponentConfigCommandCompleter.class)
     String subjectClassKey = null;
 
     @Argument(index = 1, name = "subjectKey", description = "Subject key",
             required = false, multiValued = false)
+    @Completion(ComponentNameCompleter.class)
     String subjectKey = null;
 
     @Argument(index = 2, name = "configKey", description = "Config key",
             required = false, multiValued = false)
+    @Completion(ConfigKeyCompleter.class)
     String configKey = null;
 
     @Option(name = "--remove",
diff --git a/cli/src/main/java/org/onosproject/cli/net/AddHostToHostIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddHostToHostIntentCommand.java
index fb95646..27a7dca 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddHostToHostIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddHostToHostIntentCommand.java
@@ -19,6 +19,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.net.HostId;
 import org.onosproject.net.flow.TrafficSelector;
@@ -37,10 +38,12 @@
 
     @Argument(index = 0, name = "one", description = "One host ID",
               required = true, multiValued = false)
+    @Completion(HostIdCompleter.class)
     String one = null;
 
     @Argument(index = 1, name = "two", description = "Another host ID",
               required = true, multiValued = false)
+    @Completion(HostIdCompleter.class)
     String two = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/AddMultiPointToSinglePointIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddMultiPointToSinglePointIntentCommand.java
index 7c8c6bb..d06b491 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddMultiPointToSinglePointIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddMultiPointToSinglePointIntentCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.FilteredConnectPoint;
@@ -42,6 +43,7 @@
     @Argument(index = 0, name = "ingressDevices egressDevice",
               description = "ingressDevice/Port..ingressDevice/Port egressDevice/Port",
               required = true, multiValued = true)
+    @Completion(ConnectPointCompleter.class)
     String[] deviceStrings = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/AddPointToPointIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddPointToPointIntentCommand.java
index 6b48914..2a57397 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddPointToPointIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddPointToPointIntentCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.net.ConnectPoint;
@@ -44,11 +45,13 @@
     @Argument(index = 0, name = "ingressDevice",
               description = "Ingress Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String ingressDeviceString = null;
 
     @Argument(index = 1, name = "egressDevice",
               description = "Egress Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String egressDeviceString = null;
 
     private boolean backup = false;
diff --git a/cli/src/main/java/org/onosproject/cli/net/AddProtectedTransportIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddProtectedTransportIntentCommand.java
index 7360cec..ad8954e 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddProtectedTransportIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddProtectedTransportIntentCommand.java
@@ -19,6 +19,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -45,11 +46,13 @@
     @Argument(index = 0, name = "deviceId1",
             description = "First Device ID of protected path",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String deviceId1Str = null;
 
     @Argument(index = 1, name = "deviceId2",
             description = "Second Device ID of protected path",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String deviceId2Str = null;
 
     private IntentService intentService;
diff --git a/cli/src/main/java/org/onosproject/cli/net/AddSinglePointToMultiPointIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddSinglePointToMultiPointIntentCommand.java
index c868f19..17f1072 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddSinglePointToMultiPointIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddSinglePointToMultiPointIntentCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.flow.TrafficSelector;
@@ -39,6 +40,7 @@
     @Argument(index = 0, name = "ingressDevice egressDevices",
             description = "ingressDevice/Port egressDevice/Port...egressDevice/Port",
             required = true, multiValued = true)
+    @Completion(ConnectPointCompleter.class)
     String[] deviceStrings = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java b/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java
index de4a4dd..5e7b4fe 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java
@@ -29,6 +29,7 @@
 import com.google.common.collect.ImmutableSet;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.MplsLabel;
@@ -73,10 +74,12 @@
 
     @Argument(index = 0, name = "deviceIdString", description = "Device ID",
               required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String deviceIdStr = null;
 
     @Argument(index = 1, name = "portNumberString", description = "PortNumber",
               required = false, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     String portNumberStr = null;
 
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/AnnotateDeviceCommand.java b/cli/src/main/java/org/onosproject/cli/net/AnnotateDeviceCommand.java
index 4a4cb06..b538db1 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AnnotateDeviceCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AnnotateDeviceCommand.java
@@ -17,9 +17,11 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.completer.AnnotationKeysCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.DeviceAnnotationConfig;
@@ -37,10 +39,12 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "key", description = "Annotation key",
             required = true, multiValued = false)
+    @Completion(AnnotationKeysCompleter.class)
     String key = null;
 
     @Argument(index = 2, name = "value",
diff --git a/cli/src/main/java/org/onosproject/cli/net/AnnotateLinkCommand.java b/cli/src/main/java/org/onosproject/cli/net/AnnotateLinkCommand.java
index b20546f..3355dc3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AnnotateLinkCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AnnotateLinkCommand.java
@@ -20,9 +20,12 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.completer.AnnotationKeysCompleter;
+import org.onosproject.cli.net.completer.PeerConnectPointCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.Link;
@@ -50,16 +53,19 @@
 
     @Argument(index = 0, name = "srcConnectPoint", description = "source Connect Point",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     private String srcCp = null;
 
     @Argument(index = 1, name = "dstConnectPoint", description = "destination Connect Point",
             required = true, multiValued = false)
+    @Completion(PeerConnectPointCompleter.class)
     private String dstCp = null;
 
 
 
     @Argument(index = 2, name = "key", description = "Annotation key",
             required = true, multiValued = false)
+    @Completion(AnnotationKeysCompleter.class)
     private String key = null;
 
     @Argument(index = 3, name = "value",
diff --git a/cli/src/main/java/org/onosproject/cli/net/AnnotatePortCommand.java b/cli/src/main/java/org/onosproject/cli/net/AnnotatePortCommand.java
index 931ea67..bab4f16 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AnnotatePortCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AnnotatePortCommand.java
@@ -17,9 +17,11 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.completer.AnnotationKeysCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.PortAnnotationConfig;
@@ -35,10 +37,12 @@
 
     @Argument(index = 0, name = "port", description = "Device Port",
               required = true)
+    @Completion(ConnectPointCompleter.class)
     String port = null;
 
     @Argument(index = 1, name = "key", description = "Annotation key",
              required = false)
+    @Completion(AnnotationKeysCompleter.class)
     String key = null;
 
     @Argument(index = 2, name = "value",
diff --git a/cli/src/main/java/org/onosproject/cli/net/ClusterDevicesCommand.java b/cli/src/main/java/org/onosproject/cli/net/ClusterDevicesCommand.java
index 49a2571..2380462 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ClusterDevicesCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ClusterDevicesCommand.java
@@ -19,6 +19,7 @@
 import com.google.common.collect.Lists;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.utils.Comparators;
 import org.onosproject.net.DeviceId;
@@ -40,6 +41,7 @@
 
     @Argument(index = 0, name = "id", description = "Cluster ID",
               required = true, multiValued = false)
+    @Completion(ClusterIdCompleter.class)
     String id = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/ClusterLinksCommand.java b/cli/src/main/java/org/onosproject/cli/net/ClusterLinksCommand.java
index 9bc690b..b3f3d42 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ClusterLinksCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ClusterLinksCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.net.Link;
 import org.onosproject.net.topology.TopologyCluster;
@@ -35,6 +36,7 @@
 
     @Argument(index = 0, name = "id", description = "Cluster ID",
               required = true, multiValued = false)
+    @Completion(ClusterIdCompleter.class)
     String id = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/ConfigureLinkCommand.java b/cli/src/main/java/org/onosproject/cli/net/ConfigureLinkCommand.java
index 6af7a26..89b2e48 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ConfigureLinkCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ConfigureLinkCommand.java
@@ -21,9 +21,11 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.completer.PeerConnectPointCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Link;
 import org.onosproject.net.LinkKey;
@@ -41,10 +43,12 @@
 
     @Argument(index = 0, name = "src", description = "src port",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String src = null;
 
     @Argument(index = 1, name = "dst", description = "dst port",
             required = true, multiValued = false)
+    @Completion(PeerConnectPointCompleter.class)
     String dst = null;
 
     @Option(name = "--type",
diff --git a/cli/src/main/java/org/onosproject/cli/net/ConnectivityIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/ConnectivityIntentCommand.java
index 9cfa346..43961f3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ConnectivityIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ConnectivityIntentCommand.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cli.net;
 
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.Ip6Address;
 import org.onlab.packet.IpAddress;
@@ -24,6 +25,7 @@
 import org.onlab.packet.VlanId;
 import org.onlab.util.Bandwidth;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.app.AllApplicationNamesCompleter;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.EncapsulationType;
@@ -67,6 +69,7 @@
 
     @Option(name = "-t", aliases = "--ethType", description = "Ethernet Type",
             required = false, multiValued = false)
+    @Completion(EthTypeCompleter.class)
     private String ethTypeString = null;
 
     @Option(name = "-v", aliases = "--vlan", description = "VLAN ID",
@@ -75,6 +78,7 @@
 
     @Option(name = "--ipProto", description = "IP Protocol",
             required = false, multiValued = false)
+    @Completion(IpProtocolCompleter.class)
     private String ipProtoString = null;
 
     @Option(name = "--ipSrc", description = "Source IP Prefix",
@@ -91,10 +95,12 @@
 
     @Option(name = "--icmp6Type", description = "ICMPv6 Type",
             required = false, multiValued = false)
+    @Completion(Icmp6TypeCompleter.class)
     private String icmp6TypeString = null;
 
     @Option(name = "--icmp6Code", description = "ICMPv6 Code",
             required = false, multiValued = false)
+    @Completion(Icmp6CodeCompleter.class)
     private String icmp6CodeString = null;
 
     @Option(name = "--ndTarget", description = "IPv6 Neighbor Discovery Target Address",
@@ -119,10 +125,12 @@
 
     @Option(name = "--extHdr", description = "IPv6 Extension Header Pseudo-field",
             required = false, multiValued = true)
+    @Completion(ExtHeaderCompleter.class)
     private List<String> extHdrStringList = null;
 
     @Option(name = "-a", aliases = "--appId", description = "Application Id",
             required = false, multiValued = false)
+    @Completion(AllApplicationNamesCompleter.class)
     private String appId = null;
 
     @Option(name = "-k", aliases = "--key", description = "Intent Key",
@@ -180,6 +188,7 @@
 
     @Option(name = "-e", aliases = "--encapsulation", description = "Encapsulation type",
             required = false, multiValued = false)
+    @Completion(EncapTypeCompleter.class)
     private String encapsulationString = null;
 
     @Option(name = "--hashed", description = "Hashed path selection",
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceControllersCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceControllersCommand.java
index ea39249..0a25b37 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceControllersCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceControllersCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
@@ -34,6 +35,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
     private DeviceId deviceId;
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceAddCommand.java
index f468008..e2a2503 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceAddCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.VlanId;
@@ -54,6 +55,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String uri = null;
 
     @Argument(index = 1, name = "interface",
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceRemoveCommand.java
index 8cdd7b4..527e133 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceRemoveCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -50,6 +51,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String uri = null;
 
     @Argument(index = 1, name = "interface",
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfacesListCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfacesListCommand.java
index 801b7d6..a617058 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfacesListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfacesListCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.net.Device;
 import org.onosproject.net.behaviour.InterfaceConfig;
@@ -49,6 +50,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String uri = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/DevicePortStateCommand.java b/cli/src/main/java/org/onosproject/cli/net/DevicePortStateCommand.java
index dca8a90..543bffb 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DevicePortStateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DevicePortStateCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.Device;
@@ -35,15 +36,18 @@
 public class DevicePortStateCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "portNumber", description = "Port Number",
             required = true, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     String portNumber = null;
 
     @Argument(index = 2, name = "portState",
             description = "Desired State. Either \"enable\" or \"disable\".",
             required = true, multiValued = false)
+    @Completion(PortStateCompleter.class)
     String portState = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/DevicePortStatsCommand.java b/cli/src/main/java/org/onosproject/cli/net/DevicePortStatsCommand.java
index e3f707d..8105bff 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DevicePortStatsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DevicePortStatsCommand.java
@@ -25,6 +25,7 @@
 import com.google.common.collect.Lists;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -60,10 +61,12 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "portNumber", description = "Port Number",
             required = false, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     String portNumberStr = null;
 
     PortNumber portNumber = null;
diff --git a/cli/src/main/java/org/onosproject/cli/net/DevicePortsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/DevicePortsListCommand.java
index e05a675..86887f7 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DevicePortsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DevicePortsListCommand.java
@@ -46,6 +46,7 @@
 
     @Option(name = "-e", aliases = "--enabled", description = "Show only enabled ports",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private boolean enabled = false;
 
     @Option(name = "-d", aliases = "--disabled", description = "Show only disabled ports",
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceRemoveCommand.java
index 8c68259..4152312 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceRemoveCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
@@ -32,6 +33,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
               required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceRoleCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceRoleCommand.java
index bb68be8..03d5f26 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceRoleCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceRoleCommand.java
@@ -17,8 +17,10 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.NodeIdCompleter;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.mastership.MastershipAdminService;
 import org.onosproject.net.MastershipRole;
@@ -37,14 +39,17 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
               required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "node", description = "Node ID",
               required = true, multiValued = false)
+    @Completion(NodeIdCompleter.class)
     String node = null;
 
     @Argument(index = 2, name = "role", description = "Mastership role",
               required = true, multiValued = false)
+    @Completion(RoleCompleter.class)
     String role = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceSetControllersCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceSetControllersCommand.java
index fd8fc09..dc20afa 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceSetControllersCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceSetControllersCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.IpAddress;
@@ -44,6 +45,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "controllersListStrings", description = "list of " +
diff --git a/cli/src/main/java/org/onosproject/cli/net/DriversListCommand.java b/cli/src/main/java/org/onosproject/cli/net/DriversListCommand.java
index 6a973ea..4b88ad3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DriversListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DriversListCommand.java
@@ -19,6 +19,7 @@
 import com.google.common.collect.ImmutableList;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -46,6 +47,7 @@
 
     @Argument(index = 0, name = "driverName", description = "Driver name",
             required = false, multiValued = false)
+    @Completion(DriverNameCompleter.class)
     String driverName = null;
 
     @Option(name = "-s", aliases = "--sort", description = "Sort output by driver name",
diff --git a/cli/src/main/java/org/onosproject/cli/net/EdgePortsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/EdgePortsListCommand.java
index 7592cdf..6f7ae26 100644
--- a/cli/src/main/java/org/onosproject/cli/net/EdgePortsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/EdgePortsListCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
@@ -41,6 +42,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/FlowsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/FlowsListCommand.java
index ddac49e..f7adc0a 100644
--- a/cli/src/main/java/org/onosproject/cli/net/FlowsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/FlowsListCommand.java
@@ -21,10 +21,12 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onlab.util.StringFilter;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.Device;
@@ -73,14 +75,17 @@
 
     @Argument(index = 0, name = "state", description = "Flow Rule state",
             required = false, multiValued = false)
+    @Completion(FlowRuleStatusCompleter.class)
     String state = null;
 
     @Argument(index = 1, name = "uri", description = "Device ID",
               required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 2, name = "table", description = "Table ID",
             required = false, multiValued = false)
+    @Completion(PlaceholderCompleter.class)
     String table = null;
 
     @Option(name = "-s", aliases = "--short",
diff --git a/cli/src/main/java/org/onosproject/cli/net/GetFlowStatisticsCommand.java b/cli/src/main/java/org/onosproject/cli/net/GetFlowStatisticsCommand.java
index aa86d6e..bc2fca5 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GetFlowStatisticsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GetFlowStatisticsCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -50,6 +51,7 @@
     @Argument(index = 0, name = "devicePort",
             description = "Device[/Port] connectPoint Description",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String devicePort = null;
 
     @Option(name = "-s", aliases = "--summary",
diff --git a/cli/src/main/java/org/onosproject/cli/net/GetStatisticsCommand.java b/cli/src/main/java/org/onosproject/cli/net/GetStatisticsCommand.java
index 54ddfb2..984916f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GetStatisticsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GetStatisticsCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
@@ -41,6 +42,7 @@
     @Argument(index = 0, name = "connectPoint",
               description = "Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String connectPoint = null;
 
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/GroupStatusCompleter.java b/cli/src/main/java/org/onosproject/cli/net/GroupStatusCompleter.java
index 3669c54..ce7f51e 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GroupStatusCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GroupStatusCompleter.java
@@ -16,6 +16,7 @@
 package org.onosproject.cli.net;
 
 import com.google.common.collect.Lists;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.net.group.Group;
 
@@ -24,6 +25,7 @@
 /**
  * Group status completer.
  */
+@Service
 public class GroupStatusCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
diff --git a/cli/src/main/java/org/onosproject/cli/net/GroupTypeCompleter.java b/cli/src/main/java/org/onosproject/cli/net/GroupTypeCompleter.java
index 5eb567a..904676f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GroupTypeCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GroupTypeCompleter.java
@@ -16,6 +16,7 @@
 package org.onosproject.cli.net;
 
 import com.google.common.collect.Lists;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.net.group.Group;
 
@@ -24,6 +25,7 @@
 /**
  * Group status completer.
  */
+@Service
 public class GroupTypeCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
diff --git a/cli/src/main/java/org/onosproject/cli/net/GroupsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/GroupsListCommand.java
index bd61d03..f162e77 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GroupsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GroupsListCommand.java
@@ -20,6 +20,7 @@
 import com.google.common.collect.Lists;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -59,10 +60,12 @@
 
     @Argument(index = 1, name = "uri", description = "Device ID",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 0, name = "state", description = "Group state",
             required = false, multiValued = false)
+    @Completion(GroupStatusCompleter.class)
     String state;
 
     @Option(name = "-c", aliases = "--count",
@@ -78,6 +81,7 @@
     @Option(name = "-t", aliases = "--type",
             description = "Print groups with specified type",
             required = false, multiValued = false)
+    @Completion(GroupTypeCompleter.class)
     private String type = null;
 
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/HostRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/HostRemoveCommand.java
index 0c83520..cdb8dcd 100644
--- a/cli/src/main/java/org/onosproject/cli/net/HostRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/HostRemoveCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.HostId;
@@ -32,6 +33,7 @@
 
     @Argument(index = 0, name = "id", description = "Host ID",
               required = true, multiValued = false)
+    @Completion(HostIdCompleter.class)
     String id = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java
index 96a12f5..ddab53a 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java
@@ -21,7 +21,9 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.support.completers.NullCompleter;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
@@ -59,16 +61,19 @@
     @Argument(index = 0, name = "ingressDevice",
               description = "Ingress Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String ingressDeviceString = null;
 
     @Argument(index = 1, name = "egressDevice",
               description = "Egress Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String egressDeviceString = null;
 
     @Argument(index = 2, name = "numberOfIntents",
             description = "Number of intents to install/withdraw",
             required = true, multiValued = false)
+    @Completion(NullCompleter.class)
     String numberOfIntents = null;
 
     @Argument(index = 3, name = "keyOffset",
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentDetailsCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentDetailsCommand.java
index e80623b..1c2716e 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentDetailsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentDetailsCommand.java
@@ -19,10 +19,12 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.completer.IntentIdCompleter;
 import org.onosproject.net.Link;
 import org.onosproject.net.LinkKey;
 import org.onosproject.net.intent.Intent;
@@ -40,6 +42,7 @@
 
     @Option(name = "--id",
             description = "Filter intent by specific Id", multiValued = true)
+    @Completion(IntentIdCompleter.class)
     private List<String> idsStr;
 
     private Set<IntentId> ids = null;
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentPushTestCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentPushTestCommand.java
index bca79353..bc51f88 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentPushTestCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentPushTestCommand.java
@@ -18,8 +18,10 @@
 import com.google.common.collect.Lists;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.support.completers.NullCompleter;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
@@ -60,16 +62,19 @@
     @Argument(index = 0, name = "ingressDevice",
               description = "Ingress Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String ingressDeviceString = null;
 
     @Argument(index = 1, name = "egressDevice",
               description = "Egress Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String egressDeviceString = null;
 
     @Argument(index = 2, name = "numberOfIntents",
             description = "Number of intents to install/withdraw",
             required = true, multiValued = false)
+    @Completion(NullCompleter.class)
     String numberOfIntents = null;
 
     @Argument(index = 3, name = "keyOffset",
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentRemoveCommand.java
index b602dfe..6a9c8aa0 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentRemoveCommand.java
@@ -18,9 +18,11 @@
 import com.google.common.collect.ImmutableList;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.app.ApplicationIdWithIntentNameCompleter;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.intent.Intent;
@@ -54,11 +56,13 @@
     @Argument(index = 0, name = "app",
             description = "Application ID",
             required = false, multiValued = false)
+    @Completion(ApplicationIdWithIntentNameCompleter.class)
     String applicationIdString = null;
 
     @Argument(index = 1, name = "key",
             description = "Intent Key",
             required = false, multiValued = false)
+    @Completion(IntentKeyCompleter.class)
     String keyString = null;
 
     @Option(name = "-p", aliases = "--purge",
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentsDiagnosisCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentsDiagnosisCommand.java
index 22a20c3..da9ae55 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentsDiagnosisCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentsDiagnosisCommand.java
@@ -21,6 +21,7 @@
 import com.google.common.collect.Streams;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -65,6 +66,7 @@
     @Argument(index = 0, name = "key",
             description = "Intent key",
             required = false, multiValued = false)
+    @Completion(IntentKeyCompleter.class)
     String key = null;
 
     @Option(name = "-d", aliases = "--details", description = "printing intent details",
diff --git a/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java
index c6210c7..ee11157 100644
--- a/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java
@@ -19,11 +19,13 @@
 import com.google.common.collect.Lists;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
 import org.onosproject.net.intf.Interface;
 import org.onosproject.net.intf.InterfaceAdminService;
 import org.onosproject.net.ConnectPoint;
@@ -42,10 +44,12 @@
     @Argument(index = 0, name = "port",
             description = "Device port that the interface is associated with",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     private String connectPoint = null;
 
     @Argument(index = 1, name = "name", description = "Interface name",
             required = true, multiValued = false)
+    @Completion(PlaceholderCompleter.class)
     private String name = null;
 
     @Option(name = "-m", aliases = "--mac",
diff --git a/cli/src/main/java/org/onosproject/cli/net/InterfaceRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/InterfaceRemoveCommand.java
index 7645f1d..f379286 100644
--- a/cli/src/main/java/org/onosproject/cli/net/InterfaceRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/InterfaceRemoveCommand.java
@@ -18,8 +18,10 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.completer.InterfaceNameCompleter;
 import org.onosproject.net.intf.InterfaceAdminService;
 import org.onosproject.net.ConnectPoint;
 
@@ -34,11 +36,13 @@
     @Argument(index = 0, name = "connectPoint",
             description = "Connect point of the interface",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     private String connectPoint = null;
 
     @Argument(index = 1, name = "name",
             description = "Interface name",
             required = true, multiValued = false)
+    @Completion(InterfaceNameCompleter.class)
     private String name = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/LinksListCommand.java b/cli/src/main/java/org/onosproject/cli/net/LinksListCommand.java
index b7c8ef7..c1667e9 100644
--- a/cli/src/main/java/org/onosproject/cli/net/LinksListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/LinksListCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
@@ -45,6 +46,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
               required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/McastDeleteCommand.java b/cli/src/main/java/org/onosproject/cli/net/McastDeleteCommand.java
index 270db57..a5ad5fe 100644
--- a/cli/src/main/java/org/onosproject/cli/net/McastDeleteCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/McastDeleteCommand.java
@@ -17,9 +17,11 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.mcast.McastRoute;
 import org.onosproject.net.mcast.MulticastRouteService;
@@ -43,16 +45,19 @@
     @Argument(index = 0, name = "sAddr",
             description = "IP Address of the multicast source. '*' can be used for any source (*, G) entry",
             required = true, multiValued = false)
+    @Completion(PlaceholderCompleter.class)
     String sAddr = null;
 
     @Argument(index = 1, name = "gAddr",
             description = "IP Address of the multicast group. '*' can be used to denote all groups",
             required = true, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String gAddr = null;
 
     @Argument(index = 2, name = "egressList",
             description = "Egress id/port",
             required = false, multiValued = true)
+    @Completion(ConnectPointCompleter.class)
     String[] egressList = null;
 
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/McastGroupCompleter.java b/cli/src/main/java/org/onosproject/cli/net/McastGroupCompleter.java
index 6700b97..2ba40d3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/McastGroupCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/McastGroupCompleter.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.cli.net;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractChoicesCompleter;
@@ -29,6 +30,7 @@
 /**
  * Mcast group Completer.
  */
+@Service
 public class McastGroupCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/McastJoinCommand.java b/cli/src/main/java/org/onosproject/cli/net/McastJoinCommand.java
index 1c32d42..e0d8047 100644
--- a/cli/src/main/java/org/onosproject/cli/net/McastJoinCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/McastJoinCommand.java
@@ -17,9 +17,11 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.mcast.McastRoute;
 import org.onosproject.net.mcast.MulticastRouteService;
@@ -39,16 +41,19 @@
     @Argument(index = 0, name = "sAddr",
               description = "IP Address of the multicast source. '*' can be used for any source (*, G) entry",
               required = true, multiValued = false)
+    @Completion(PlaceholderCompleter.class)
     String sAddr = null;
 
     @Argument(index = 1, name = "gAddr",
               description = "IP Address of the multicast group",
               required = true, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String gAddr = null;
 
     @Argument(index = 2, name = "ingressPort",
             description = "Ingress port of:XXXXXXXXXX/XX",
             required = false, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String ingressPort = null;
 
     @Argument(index = 3, name = "ports",
diff --git a/cli/src/main/java/org/onosproject/cli/net/McastShowCommand.java b/cli/src/main/java/org/onosproject/cli/net/McastShowCommand.java
index ff9e2e6..3d9b9b5 100644
--- a/cli/src/main/java/org/onosproject/cli/net/McastShowCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/McastShowCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
@@ -42,6 +43,7 @@
 
     @Argument(index = 0, name = "mcastIp", description = "mcast Ip",
             required = false, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String mcastIp;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/MeterAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/MeterAddCommand.java
index a892b17..3e71ad9 100644
--- a/cli/src/main/java/org/onosproject/cli/net/MeterAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/MeterAddCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -83,6 +84,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String uri = null;
 
     private final String appId = "org.onosproject.cli.meterCmd";
diff --git a/cli/src/main/java/org/onosproject/cli/net/MeterRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/MeterRemoveCommand.java
index 9c08a86..6c3f1bb 100644
--- a/cli/src/main/java/org/onosproject/cli/net/MeterRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/MeterRemoveCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.CoreService;
@@ -41,6 +42,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String uri = null;
 
     @Argument(index = 1, name = "meterId", description = "Meter ID hexadecimal value",
diff --git a/cli/src/main/java/org/onosproject/cli/net/MetersListCommand.java b/cli/src/main/java/org/onosproject/cli/net/MetersListCommand.java
index 354ccbc..4fe3590 100644
--- a/cli/src/main/java/org/onosproject/cli/net/MetersListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/MetersListCommand.java
@@ -18,6 +18,7 @@
 import com.google.common.collect.Collections2;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
@@ -39,6 +40,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "meter", description = "Meter ID",
diff --git a/cli/src/main/java/org/onosproject/cli/net/PathListCommand.java b/cli/src/main/java/org/onosproject/cli/net/PathListCommand.java
index 78d5c46..ae86d2c 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PathListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PathListCommand.java
@@ -20,6 +20,7 @@
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -47,10 +48,12 @@
 
     @Argument(index = 0, name = "src", description = "Source device ID",
               required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String src = null;
 
     @Argument(index = 1, name = "dst", description = "Destination device ID",
               required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String dst = null;
 
     @Option(name = "--disjoint", description = "Show disjoint Paths")
diff --git a/cli/src/main/java/org/onosproject/cli/net/PortNumberCompleter.java b/cli/src/main/java/org/onosproject/cli/net/PortNumberCompleter.java
index ff38857..5192cc4 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PortNumberCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PortNumberCompleter.java
@@ -22,6 +22,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
@@ -33,6 +34,7 @@
  *
  * Assumes argument right before the one being completed is DeviceId.
  */
+@Service
 public class PortNumberCompleter extends AbstractChoicesCompleter {
 
     /**
diff --git a/cli/src/main/java/org/onosproject/cli/net/PortQueryVlansCommand.java b/cli/src/main/java/org/onosproject/cli/net/PortQueryVlansCommand.java
index 75878f7..369b1ae 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PortQueryVlansCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PortQueryVlansCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
@@ -51,6 +52,7 @@
     @Argument(index = 0, name = "port",
             description = "Port Description",
             required = true, multiValued = true)
+    @Completion(ConnectPointCompleter.class)
     private String[] ports;
 
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/PortStateCompleter.java b/cli/src/main/java/org/onosproject/cli/net/PortStateCompleter.java
index 888e6a2..e84140f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PortStateCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PortStateCompleter.java
@@ -17,6 +17,7 @@
 
 import java.util.List;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 
 import com.google.common.collect.ImmutableList;
@@ -26,6 +27,7 @@
  *
  * Assumes argument right before the one being completed is PortNumber.
  */
+@Service
 public class PortStateCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/RandomIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/RandomIntentCommand.java
index 5d3a277..cdfc8fe 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RandomIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RandomIntentCommand.java
@@ -21,7 +21,9 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.support.completers.NullCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -52,6 +54,7 @@
                       "not be taken into account if it exceeds the maximum " +
                       "number of intents the command can push",
               required = true, multiValued = false)
+    @Completion(NullCompleter.class)
     String countString = null;
 
     private IntentService service;
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionAddCommand.java
index 5901241..392bdba 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionAddCommand.java
@@ -21,8 +21,10 @@
 import com.google.common.collect.Sets;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.NodeIdCompleter;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.BasicRegionConfig;
@@ -66,6 +68,7 @@
     @Argument(index = 2, name = "type", description = "Region Type (CONTINENT|" +
             "COUNTRY|METRO|CAMPUS|BUILDING|DATA_CENTER|FLOOR|ROOM|RACK|LOGICAL_GROUP)",
             required = true, multiValued = false)
+    @Completion(RegionTypeCompleter.class)
     String type = null;
 
     @Argument(index = 3, name = "latOrY",
@@ -85,6 +88,7 @@
     @Argument(index = 6, name = "masters", description = "Region Master, a set " +
             "of nodeIds should be split with '/' delimiter (e.g., 1 2 3 / 4 5 6)",
             required = true, multiValued = true)
+    @Completion(NodeIdCompleter.class)
     List<String> masterArgs = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionAddDevicesCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionAddDevicesCommand.java
index 2ed04f8..c879598 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionAddDevicesCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionAddDevicesCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
@@ -36,10 +37,12 @@
 
     @Argument(index = 0, name = "id", description = "Region ID",
             required = true, multiValued = false)
+    @Completion(RegionIdCompleter.class)
     String id = null;
 
     @Argument(index = 1, name = "devIds", description = "Device IDs",
             required = true, multiValued = true)
+    @Completion(DeviceIdCompleter.class)
     List<String> devIds = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionAddPeerLocCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionAddPeerLocCommand.java
index 146fdda..bc721d3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionAddPeerLocCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionAddPeerLocCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.config.NetworkConfigService;
@@ -49,6 +50,7 @@
 
     @Argument(index = 0, name = "id", description = "Region ID",
             required = true, multiValued = false)
+    @Completion(RegionIdCompleter.class)
     String id = null;
 
     @Argument(index = 1, name = "peer", description = "Peer region ID",
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionIdCompleter.java b/cli/src/main/java/org/onosproject/cli/net/RegionIdCompleter.java
index 9d46b1f..51379ac 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionIdCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionIdCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cli.net;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.region.RegionService;
@@ -25,6 +26,7 @@
 /**
  * Region ID completer.
  */
+@Service
 public class RegionIdCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionListCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionListCommand.java
index e959d3e..ab0065b 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionListCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.utils.Comparators;
@@ -42,6 +43,7 @@
 
     @Argument(index = 0, name = "id", description = "Region ID",
             required = false, multiValued = false)
+    @Completion(RegionIdCompleter.class)
     String id = null;
 
     private RegionService regionService;
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionRemoveCommand.java
index 83956b5..cf6d5c3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionRemoveCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.region.RegionAdminService;
@@ -32,6 +33,7 @@
 
     @Argument(index = 0, name = "id", description = "Region ID",
             required = true, multiValued = false)
+    @Completion(RegionIdCompleter.class)
     String id = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionRemoveDevicesCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionRemoveDevicesCommand.java
index aac1023..79d406d 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionRemoveDevicesCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionRemoveDevicesCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
@@ -36,10 +37,12 @@
 
     @Argument(index = 0, name = "id", description = "Region ID",
             required = true, multiValued = false)
+    @Completion(RegionIdCompleter.class)
     String id = null;
 
     @Argument(index = 1, name = "devIds", description = "Device IDs",
             required = true, multiValued = true)
+    @Completion(DeviceIdCompleter.class)
     List<String> devIds = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionTypeCompleter.java b/cli/src/main/java/org/onosproject/cli/net/RegionTypeCompleter.java
index a2c4dc2..1c7c13d 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionTypeCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionTypeCompleter.java
@@ -16,6 +16,7 @@
 package org.onosproject.cli.net;
 
 import com.google.common.collect.Lists;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.net.region.Region;
 
@@ -24,6 +25,7 @@
 /**
  * Region type completer.
  */
+@Service
 public class RegionTypeCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionUpdateCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionUpdateCommand.java
index 3b164d4..678ae10 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionUpdateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionUpdateCommand.java
@@ -21,8 +21,10 @@
 import com.google.common.collect.Sets;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.NodeIdCompleter;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.net.region.Region;
 import org.onosproject.net.region.RegionAdminService;
@@ -50,6 +52,7 @@
 
     @Argument(index = 0, name = "id", description = "Region ID",
             required = true, multiValued = false)
+    @Completion(RegionIdCompleter.class)
     String id = null;
 
     @Argument(index = 1, name = "name", description = "Region Name",
@@ -59,11 +62,13 @@
     @Argument(index = 2, name = "type", description = "Region Type (CONTINENT|" +
             "COUNTRY|METRO|CAMPUS|BUILDING|FLOOR|ROOM|RACK|LOGICAL_GROUP)",
             required = true, multiValued = false)
+    @Completion(RegionTypeCompleter.class)
     String type = null;
 
     @Argument(index = 3, name = "masters", description = "Region Master, a set " +
     "of nodeIds should be split with '/' delimiter (e.g., 1 2 3 / 4 5 6)",
             required = true, multiValued = true)
+    @Completion(NodeIdCompleter.class)
     List<String> masterArgs = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java b/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
index 9d57f66..d4c1a40 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
@@ -27,6 +27,7 @@
 import com.google.common.collect.Iterables;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.MplsLabel;
@@ -75,10 +76,12 @@
 
     @Argument(index = 0, name = "deviceIdString", description = "Device ID",
               required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String deviceIdStr = null;
 
     @Argument(index = 1, name = "portNumberString", description = "PortNumber",
               required = false, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     String portNumberStr = null;
 
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java b/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java
index 4631920..d704509 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java
@@ -19,6 +19,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -58,10 +59,12 @@
 
     @Argument(index = 0, name = "deviceId", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String deviceIdStr = null;
 
     @Argument(index = 1, name = "portNumber", description = "PortNumber",
             required = true, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     String portNumberStr = null;
 
     private ResourceService resourceService;
diff --git a/cli/src/main/java/org/onosproject/cli/net/TestProtectionEndpointIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/TestProtectionEndpointIntentCommand.java
index 373d5ff..a50bd4f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TestProtectionEndpointIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TestProtectionEndpointIntentCommand.java
@@ -21,6 +21,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.VlanId;
@@ -56,11 +57,13 @@
     @Argument(index = 0, name = "deviceId",
             description = "Device ID to configure",
             required = true)
+    @Completion(DeviceIdCompleter.class)
     private String deviceIdStr = null;
 
     @Argument(index = 1, name = "peerDeviceId",
             description = "Device ID of remote peer",
             required = true)
+    @Completion(DeviceIdCompleter.class)
     private String peerStr = null;
 
     @Argument(index = 2, name = "portNumber1",
diff --git a/cli/src/main/java/org/onosproject/cli/net/completer/AnnotationKeysCompleter.java b/cli/src/main/java/org/onosproject/cli/net/completer/AnnotationKeysCompleter.java
index 773d5ec..baf91f7 100644
--- a/cli/src/main/java/org/onosproject/cli/net/completer/AnnotationKeysCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/completer/AnnotationKeysCompleter.java
@@ -21,12 +21,14 @@
 import java.util.Objects;
 import java.util.stream.Collectors;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.net.AnnotationKeys;
 
 /**
  * Completer for annotation keys declared in {@link AnnotationKeys}.
  */
+@Service
 public class AnnotationKeysCompleter extends AbstractChoicesCompleter {
 
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/completer/PeerConnectPointCompleter.java b/cli/src/main/java/org/onosproject/cli/net/completer/PeerConnectPointCompleter.java
index 222f643..563e552 100644
--- a/cli/src/main/java/org/onosproject/cli/net/completer/PeerConnectPointCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/completer/PeerConnectPointCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cli.net.completer;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.device.DeviceService;
@@ -37,6 +38,7 @@
  * This completer will look for (device id)/(port number) in the
  * existing argument and propose list of remote ports.
  */
+@Service
 public class PeerConnectPointCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/TenantRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/TenantRemoveCommand.java
index 49ed593..d31696c 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/TenantRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/TenantRemoveCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.TenantId;
@@ -34,6 +35,7 @@
 
     @Argument(index = 0, name = "id", description = "Tenant ID",
             required = true, multiValued = false)
+    @Completion(TenantCompleter.class)
     String id = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCompleter.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCompleter.java
index 4b554a7..2baace7 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCompleter.java
@@ -18,6 +18,7 @@
 
 import static org.onlab.osgi.DefaultServiceDirectory.getService;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualDevice;
@@ -34,6 +35,7 @@
  *
  * Assumes the first argument which can be parsed to a number is network id.
  */
+@Service
 public class VirtualDeviceCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCreateCommand.java
index 16c1193..a7a8b72 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCreateCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -34,6 +35,7 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Device ID",
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceListCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceListCommand.java
index 3f52021..79aba49 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceListCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -42,6 +43,7 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceRemoveCommand.java
index c04c710..2f40812 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceRemoveCommand.java
@@ -18,8 +18,10 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
 import org.onosproject.net.DeviceId;
@@ -34,10 +36,12 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String deviceId = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualFlowsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualFlowsListCommand.java
index b783ab7..57c9fb1 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualFlowsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualFlowsListCommand.java
@@ -21,10 +21,13 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onlab.util.StringFilter;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
+import org.onosproject.cli.net.FlowRuleStatusCompleter;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -72,18 +75,22 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "state", description = "Flow Rule state",
             required = false, multiValued = false)
+    @Completion(FlowRuleStatusCompleter.class)
     String state = null;
 
     @Argument(index = 2, name = "uri", description = "Device ID",
               required = false, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String uri = null;
 
     @Argument(index = 3, name = "table", description = "Table ID",
             required = false, multiValued = false)
+    @Completion(PlaceholderCompleter.class)
     String table = null;
 
     @Option(name = "-s", aliases = "--short",
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostCreateCommand.java
index 505e8c3..b580c68 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostCreateCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.IpAddress;
@@ -45,6 +46,7 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "mac", description = "Mac address",
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostListCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostListCommand.java
index 7ae3b59..6569e50 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostListCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -40,6 +41,7 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostRemoveCommand.java
index 4d3370d..b7c08c0 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostRemoveCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -36,10 +37,12 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "id", description = "Host ID",
               required = true, multiValued = false)
+    @Completion(VirtualHostCompleter.class)
     String id = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkCreateCommand.java
index 89057ad..916f118 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkCreateCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -37,22 +38,27 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "srcDeviceId", description = "Source device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String srcDeviceId = null;
 
     @Argument(index = 2, name = "srcPortNum", description = "Source port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer srcPortNum = null;
 
     @Argument(index = 3, name = "dstDeviceId", description = "Destination device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String dstDeviceId = null;
 
     @Argument(index = 4, name = "dstPortNum", description = "Destination port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer dstPortNum = null;
 
     @Option(name = "-b", aliases = "--bidirectional",
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkListCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkListCommand.java
index c5c6462..cf8e7ee 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkListCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -40,6 +41,7 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkRemoveCommand.java
index 130c580..df0259d 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkRemoveCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -37,22 +38,27 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "srcDeviceId", description = "Source device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String srcDeviceId = null;
 
     @Argument(index = 2, name = "srcPortNum", description = "Source port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer srcPortNum = null;
 
     @Argument(index = 3, name = "dstDeviceId", description = "Destination device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String dstDeviceId = null;
 
     @Argument(index = 4, name = "dstPortNum", description = "Destination port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer dstPortNum = null;
 
     @Option(name = "-b", aliases = "--bidirectional",
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkBalanceMastersCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkBalanceMastersCommand.java
index 1481c19..4164688 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkBalanceMastersCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkBalanceMastersCommand.java
@@ -17,6 +17,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -32,6 +33,7 @@
 public class VirtualNetworkBalanceMastersCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
     @Override
     protected void doExecute() {
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkCreateCommand.java
index 00903fe..0850144 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkCreateCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.TenantId;
@@ -33,6 +34,7 @@
 
     @Argument(index = 0, name = "id", description = "Tenant ID",
             required = true, multiValued = false)
+    @Completion(TenantCompleter.class)
     String id = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentCreateCommand.java
index 5684ae5..f57f3f7 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentCreateCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.net.ConnectivityIntentCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -42,6 +43,7 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "ingressDevice",
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentRemoveCommand.java
index 0001d41..67f39f2 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentRemoveCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
@@ -52,6 +53,7 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "app",
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkPacketRequestCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkPacketRequestCommand.java
index 20b33fd..c022444 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkPacketRequestCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkPacketRequestCommand.java
@@ -21,6 +21,7 @@
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.Ip6Address;
@@ -30,10 +31,15 @@
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cli.net.EthType;
+import org.onosproject.cli.net.EthTypeCompleter;
 import org.onosproject.cli.net.ExtHeader;
+import org.onosproject.cli.net.ExtHeaderCompleter;
 import org.onosproject.cli.net.Icmp6Code;
+import org.onosproject.cli.net.Icmp6CodeCompleter;
 import org.onosproject.cli.net.Icmp6Type;
+import org.onosproject.cli.net.Icmp6TypeCompleter;
 import org.onosproject.cli.net.IpProtocol;
+import org.onosproject.cli.net.IpProtocolCompleter;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkService;
 import org.onosproject.net.DeviceId;
@@ -80,6 +86,7 @@
 
     @Option(name = "-t", aliases = "--ethType", description = "Ethernet Type",
             required = false, multiValued = false)
+    @Completion(EthTypeCompleter.class)
     private String ethTypeString = null;
 
     @Option(name = "-v", aliases = "--vlan", description = "VLAN ID",
@@ -88,6 +95,7 @@
 
     @Option(name = "--ipProto", description = "IP Protocol",
             required = false, multiValued = false)
+    @Completion(IpProtocolCompleter.class)
     private String ipProtoString = null;
 
     @Option(name = "--ipSrc", description = "Source IP Prefix",
@@ -104,10 +112,12 @@
 
     @Option(name = "--icmp6Type", description = "ICMPv6 Type",
             required = false, multiValued = false)
+    @Completion(Icmp6TypeCompleter.class)
     private String icmp6TypeString = null;
 
     @Option(name = "--icmp6Code", description = "ICMPv6 Code",
             required = false, multiValued = false)
+    @Completion(Icmp6CodeCompleter.class)
     private String icmp6CodeString = null;
 
     @Option(name = "--ndTarget", description = "IPv6 Neighbor Discovery Target Address",
@@ -132,6 +142,7 @@
 
     @Option(name = "--extHdr", description = "IPv6 Extension Header Pseudo-field",
             required = false, multiValued = true)
+    @Completion(ExtHeaderCompleter.class)
     private List<String> extHdrStringList = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkRemoveCommand.java
index 3bf84b6..aad24d7 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkRemoveCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -33,6 +34,7 @@
 
     @Argument(index = 0, name = "id", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long id;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortBindCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortBindCommand.java
index fb46fb4..488972c 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortBindCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortBindCommand.java
@@ -18,8 +18,11 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
+import org.onosproject.cli.net.PortNumberCompleter;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
 import org.onosproject.incubator.net.virtual.VirtualNetworkService;
@@ -42,22 +45,27 @@
 public class VirtualPortBindCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Virtual Device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String deviceId = null;
 
     @Argument(index = 2, name = "portNum", description = "Virtual device port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer portNum = null;
 
     @Argument(index = 3, name = "physDeviceId", description = "Physical Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String physDeviceId = null;
 
     @Argument(index = 4, name = "physPortNum", description = "Physical device port number",
             required = true, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     Integer physPortNum = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCompleter.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCompleter.java
index 2660428..f810a97 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCompleter.java
@@ -18,6 +18,7 @@
 
 import static org.onlab.osgi.DefaultServiceDirectory.getService;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkService;
@@ -35,6 +36,7 @@
  * Assumes the first argument which can be parsed to a number is network id
  * and the argument right before the one being completed is device id
  */
+@Service
 public class VirtualPortCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCreateCommand.java
index e9b7763..190de0f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCreateCommand.java
@@ -18,8 +18,11 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
+import org.onosproject.cli.net.PortNumberCompleter;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualDevice;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -43,10 +46,12 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Virtual Device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String deviceId = null;
 
     @Argument(index = 2, name = "portNum", description = "Virtual device port number",
@@ -55,10 +60,12 @@
 
     @Argument(index = 3, name = "physDeviceId", description = "Physical Device ID",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String physDeviceId = null;
 
     @Argument(index = 4, name = "physPortNum", description = "Physical device port number",
             required = false, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     Integer physPortNum = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortListCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortListCommand.java
index 4a1ea76..612ef65 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortListCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -43,10 +44,12 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Virtual Device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String deviceId = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortRemoveCommand.java
index 414324e..d8fe2e6 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortRemoveCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -35,14 +36,17 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String deviceId = null;
 
     @Argument(index = 2, name = "portNum", description = "Device port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer portNum = null;
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortStateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortStateCommand.java
index 25acc931..a645419 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortStateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortStateCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -40,14 +41,17 @@
 public class VirtualPortStateCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Virtual Device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String deviceId = null;
 
     @Argument(index = 2, name = "portNum", description = "Virtual device port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer portNum = null;
 
     @Argument(index = 3, name = "portState",
diff --git a/cli/src/main/java/org/onosproject/cli/security/ReviewApplicationNameCompleter.java b/cli/src/main/java/org/onosproject/cli/security/ReviewApplicationNameCompleter.java
index 452664b..fa8dbce 100644
--- a/cli/src/main/java/org/onosproject/cli/security/ReviewApplicationNameCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/security/ReviewApplicationNameCompleter.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.cli.security;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.apache.karaf.shell.api.console.CommandLine;
 import org.apache.karaf.shell.api.console.Session;
 import org.apache.karaf.shell.support.completers.StringsCompleter;
@@ -34,6 +35,7 @@
 /**
  * Application name completer for security review command.
  */
+@Service
 public class ReviewApplicationNameCompleter extends AbstractCompleter {
     @Override
     public int complete(Session session, CommandLine commandLine, List<String> candidates) {
diff --git a/cli/src/main/java/org/onosproject/cli/security/ReviewCommand.java b/cli/src/main/java/org/onosproject/cli/security/ReviewCommand.java
index 1d7e32c..00c5424 100644
--- a/cli/src/main/java/org/onosproject/cli/security/ReviewCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/security/ReviewCommand.java
@@ -18,6 +18,7 @@
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.app.ApplicationAdminService;
 import org.onosproject.cli.AbstractShellCommand;
@@ -41,6 +42,7 @@
 
     @Argument(index = 0, name = "name", description = "Application name",
             required = true, multiValued = false)
+    @Completion(ReviewApplicationNameCompleter.class)
     String name = null;
 
     @Argument(index = 1, name = "accept", description = "Option to accept policy",