diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/CfmWebComponent.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/CfmWebComponent.java
index 6ead985..a31a407 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/CfmWebComponent.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/CfmWebComponent.java
@@ -82,8 +82,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.onosproject.incubator.net.l2monitoring.soam.loss.LossMeasurementThreshold.*;
-
 /**
  * Enables the CFM REST Web Service component at /onos/cfm.
  * Each codec for the rest interfaces should be registered here.
@@ -95,6 +93,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected CodecService codecService;
 
+    /**
+     * On activation of this component register these codecs with the codec service.
+     */
     @Activate
     public void activate() {
         codecService.registerCodec(MaintenanceDomain.class,
@@ -146,7 +147,7 @@
                                         new LossAvailabilityStatHistoryCodec());
         codecService.registerCodec(CounterOption.class,
                                         new LmCounterOptionCodec());
-        codecService.registerCodec(ThresholdOption.class,
+        codecService.registerCodec(LossMeasurementThreshold.ThresholdOption.class,
                                         new LmThresholdOptionCodec());
 
         codecService.registerCodec(StartTime.class, new StartTimeCodec());
@@ -155,6 +156,9 @@
         log.info("CFM Web Component Started");
     }
 
+    /**
+     * On deactivation of this component unregister these codecs from the codec service.
+     */
     @Deactivate
     public void deactivate() {
         log.info("CFM Web Component Stopped");
@@ -189,7 +193,7 @@
         codecService.unregisterCodec(LossAvailabilityStatCurrent.class);
         codecService.unregisterCodec(LossAvailabilityStatHistory.class);
         codecService.unregisterCodec(CounterOption.class);
-        codecService.unregisterCodec(ThresholdOption.class);
+        codecService.unregisterCodec(LossMeasurementThreshold.ThresholdOption.class);
 
     }
 }
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaAddCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaAddCommand.java
index d449cce..1fec9f3 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaAddCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaAddCommand.java
@@ -23,17 +23,8 @@
 import org.onosproject.incubator.net.l2monitoring.cfm.DefaultComponent;
 import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMaintenanceAssociation;
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaId2Octet;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdIccY1731;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdPrimaryVid;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdRfc2685VpnId;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdDomainName;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdMacUint;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdNone;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
@@ -44,60 +35,55 @@
 @Command(scope = "onos", name = "cfm-ma-add",
         description = "Add a CFM Maintenance Association to a Maintenance Domain.")
 public class CfmMaAddCommand extends AbstractShellCommand {
-    @Argument(index = 0, name = "name",
+    @Argument(name = "name",
             description = "Maintenance Domain name and type (in brackets)",
-            required = true, multiValued = false)
-    String mdName = null;
+            required = true)
+    private String mdName = null;
 
     @Argument(index = 1, name = "name-type",
             description = "Maintenance Assocation name type",
-            required = true, multiValued = false)
-    String nameType = null;
+            required = true)
+    private String nameType = null;
 
     @Argument(index = 2, name = "name",
             description = "Maintenance Assocation name. Restrictions apply depending " +
                     "on name-type",
-            required = true, multiValued = false)
-    String name = null;
+            required = true)
+    private String name = null;
 
     @Argument(index = 3, name = "ccm-interval",
             description = "CCM Interval values from list",
-            required = true, multiValued = false)
-    String ccmInterval = null;
+            required = true)
+    private String ccmInterval = null;
 
     @Argument(index = 4, name = "numeric-id",
-            description = "An optional numeric id for Maintenance Association [1-65535]",
-            required = false, multiValued = false)
-    short numericId = 0;
+            description = "An optional numeric id for Maintenance Association [1-65535]")
+    private Short numericId = null;
 
     @Argument(index = 5, name = "component-id",
             description = "An id for a Component in the Component List [1-65535]." +
                     "The CLI allows creation of only 1 component. If more are " +
-                    "required use the REST interface",
-            required = false, multiValued = false)
-    short componentId = 0;
+                    "required use the REST interface")
+    private Short componentId = null;
 
     @Argument(index = 6, name = "component-tag-type",
-            description = "Tag Type value for the component",
-            required = false, multiValued = false)
-    String tagType = null;
+            description = "Tag Type value for the component")
+    private String tagType = null;
 
     @Argument(index = 7, name = "component-mhf-creation",
-            description = "MEP Half function creation type for the component",
-            required = false, multiValued = false)
-    String mhfCreationType = null;
+            description = "MEP Half function creation type for the component")
+    private String mhfCreationType = null;
 
     @Argument(index = 8, name = "component-vid",
             description = "A VID for the component [1-4095]. This CLI allows " +
                     "only the specification of 1 VID. If more are required use " +
-                    "the REST interface",
-            required = false, multiValued = false)
-    short vid = 0;
+                    "the REST interface")
+    private Short vid = null;
 
     @Argument(index = 9, name = "rmep",
             description = "Remote Mep numeric identifier [1-8192]",
             required = true, multiValued = true)
-    String[] rmepArray = null;
+    private String[] rmepArray = null;
 
     @Override
     protected void execute() {
@@ -109,56 +95,23 @@
                     "Must be in the format of <identifier(name-type)>");
         }
 
-        MdId mdId = null;
-        MdId.MdNameType mdNameTypeEnum = MdId.MdNameType.valueOf(mdNameParts[1]);
-        switch (mdNameTypeEnum) {
-            case DOMAINNAME:
-                mdId = MdIdDomainName.asMdId(mdNameParts[0]);
-                break;
-            case MACANDUINT:
-                mdId = MdIdMacUint.asMdId(mdNameParts[0]);
-                break;
-            case NONE:
-                mdId = MdIdNone.asMdId();
-                break;
-            case CHARACTERSTRING:
-            default:
-                mdId = MdIdCharStr.asMdId(mdNameParts[0]);
-        }
+        MdId mdId = CfmMdListMdCommand.parseMdName(mdNameParts[0] + "(" + mdNameParts[1] + ")");
 
-        MaIdShort maId = null;
-        MaIdShort.MaIdType maNameTypeEnum = MaIdShort.MaIdType.valueOf(nameType);
-        switch (maNameTypeEnum) {
-            case TWOOCTET:
-                maId = MaId2Octet.asMaId(name);
-                break;
-            case ICCY1731:
-                maId = MaIdIccY1731.asMaId(name);
-                break;
-            case PRIMARYVID:
-                maId = MaIdPrimaryVid.asMaId(name);
-                break;
-            case RFC2685VPNID:
-                maId = MaIdRfc2685VpnId.asMaIdHex(name);
-                break;
-            case CHARACTERSTRING:
-            default:
-                maId = MaIdCharStr.asMaId(name);
-        }
+        MaIdShort maId = CfmMdListMdCommand.parseMaName(name + "(" + nameType + ")");
 
-        MaintenanceAssociation.MaBuilder builder = null;
         try {
-            builder = DefaultMaintenanceAssociation.builder(maId, mdId.getNameLength());
+            MaintenanceAssociation.MaBuilder builder = DefaultMaintenanceAssociation
+                    .builder(maId, mdId.getNameLength());
             if (ccmInterval != null && !ccmInterval.isEmpty()) {
                 builder = builder.ccmInterval(MaintenanceAssociation.CcmInterval.valueOf(ccmInterval));
             }
             for (String rmep:rmepArray) {
                 builder = builder.addToRemoteMepIdList(MepId.valueOf(Short.parseShort(rmep)));
             }
-            if (numericId > 0) {
+            if (numericId != null) {
                 builder = builder.maNumericId(numericId);
             }
-            if (componentId > 0) {
+            if (componentId != null) {
                 Component.ComponentBuilder compBuilder =
                         DefaultComponent.builder(componentId);
                 if (tagType != null && !tagType.isEmpty()) {
@@ -169,7 +122,7 @@
                     compBuilder = compBuilder.mhfCreationType(
                             Component.MhfCreationType.valueOf(mhfCreationType));
                 }
-                if (vid > 0) {
+                if (vid != null) {
                     compBuilder = compBuilder.addToVidList(VlanId.vlanId(vid));
                 }
                 builder = builder.addToComponentList(compBuilder.build());
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaDeleteCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaDeleteCommand.java
index 4228b78..b28a35e 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaDeleteCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaDeleteCommand.java
@@ -18,17 +18,8 @@
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaId2Octet;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdIccY1731;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdPrimaryVid;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdRfc2685VpnId;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdDomainName;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdMacUint;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdNone;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
 
@@ -39,58 +30,26 @@
         description = "Delete a CFM Maintenance Association and its children.")
 public class CfmMaDeleteCommand extends AbstractShellCommand {
 
-    @Argument(index = 0, name = "name",
+    private static final int MA_NAME_PARTS_COUNT = 4;
+    @Argument(name = "name",
             description = "Maintenance Domain name and type (in brackets) " +
                     "and the Maintenance Association name and type (in brackets)",
-            required = true, multiValued = false)
-    String name = null;
+            required = true)
+    private String name = null;
 
     @Override
     protected void execute() {
         CfmMdService service = get(CfmMdService.class);
 
         String[] nameParts = name.split("[()]");
-        if (nameParts.length != 4) {
+        if (nameParts.length != MA_NAME_PARTS_COUNT) {
             throw new IllegalArgumentException("Invalid name format. Must be in " +
                     "the format of <identifier(name-type)identifier(name-type)>");
         }
 
-        MdId mdId = null;
-        MdId.MdNameType nameTypeEnum = MdId.MdNameType.valueOf(nameParts[1]);
-        switch (nameTypeEnum) {
-            case DOMAINNAME:
-                mdId = MdIdDomainName.asMdId(nameParts[0]);
-                break;
-            case MACANDUINT:
-                mdId = MdIdMacUint.asMdId(nameParts[0]);
-                break;
-            case NONE:
-                mdId = MdIdNone.asMdId();
-                break;
-            case CHARACTERSTRING:
-            default:
-                mdId = MdIdCharStr.asMdId(nameParts[0]);
-        }
+        MdId mdId = CfmMdListMdCommand.parseMdName(nameParts[0] + "(" + nameParts[1] + ")");
 
-        MaIdShort maId = null;
-        MaIdShort.MaIdType maNameTypeEnum = MaIdShort.MaIdType.valueOf(nameParts[3]);
-        switch (maNameTypeEnum) {
-            case TWOOCTET:
-                maId = MaId2Octet.asMaId(nameParts[2]);
-                break;
-            case ICCY1731:
-                maId = MaIdIccY1731.asMaId(nameParts[2]);
-                break;
-            case PRIMARYVID:
-                maId = MaIdPrimaryVid.asMaId(nameParts[2]);
-                break;
-            case RFC2685VPNID:
-                maId = MaIdRfc2685VpnId.asMaIdHex(nameParts[2]);
-                break;
-            case CHARACTERSTRING:
-            default:
-                maId = MaIdCharStr.asMaId(nameParts[2]);
-        }
+        MaIdShort maId = CfmMdListMdCommand.parseMaName(nameParts[2] + "(" + nameParts[3] + ")");
 
         try {
             boolean deleted = service.deleteMaintenanceAssociation(mdId, maId);
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdAddCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdAddCommand.java
index 922ed64..c73fff3 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdAddCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdAddCommand.java
@@ -21,15 +21,9 @@
 import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMaintenanceDomain;
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdDomainName;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdMacUint;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdNone;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
 
-import java.util.Optional;
-
 /**
  * Adds a Maintenance Domain to the existing list.
  */
@@ -37,58 +31,39 @@
         description = "Add a CFM Maintenance Domain.")
 public class CfmMdAddCommand extends AbstractShellCommand {
 
-    @Argument(index = 0, name = "name-type",
+    @Argument(name = "name-type",
             description = "Maintenance Domain name type",
-            required = true, multiValued = false)
-    String nameType = null;
+            required = true)
+    private String nameType = null;
 
     @Argument(index = 1, name = "name",
             description = "Maintenance Domain name. Restrictions apply depending " +
                     "on name-type. Leave empty if name type is none",
-            required = true, multiValued = false)
-    String name = null;
+            required = true)
+    private String name = null;
 
     @Argument(index = 2, name = "level",
             description = "Maintenance Domain level LEVEL0-LEVEL7",
-            required = true, multiValued = false)
-    String level = null;
+            required = true)
+    private String level = null;
 
     @Argument(index = 3, name = "numeric-id",
-            description = "An optional numeric id for Maintenance Domain [1-65535]",
-            required = false, multiValued = false)
-    short numericId = 0;
+            description = "An optional numeric id for Maintenance Domain [1-65535]")
+    private Short numericId = null;
 
     @Override
     protected void execute() {
         CfmMdService service = get(CfmMdService.class);
-        MdId mdId = null;
-        MdId.MdNameType nameTypeEnum = MdId.MdNameType.valueOf(nameType);
-        switch (nameTypeEnum) {
-            case DOMAINNAME:
-                mdId = MdIdDomainName.asMdId(name);
-                break;
-            case MACANDUINT:
-                mdId = MdIdMacUint.asMdId(name);
-                break;
-            case NONE:
-                mdId = MdIdNone.asMdId();
-                break;
-            case CHARACTERSTRING:
-            default:
-                mdId = MdIdCharStr.asMdId(name);
-        }
+        MdId mdId = CfmMdListMdCommand.parseMdName(name + "(" + nameType + ")");
+
         MaintenanceDomain.MdLevel levelEnum =
                 MaintenanceDomain.MdLevel.valueOf(level);
-        Optional<Short> numericIdOpt = Optional.empty();
-        if (numericId > 0) {
-            numericIdOpt = Optional.of(numericId);
-        }
 
-        MaintenanceDomain.MdBuilder builder = null;
         try {
-            builder = DefaultMaintenanceDomain.builder(mdId).mdLevel(levelEnum);
-            if (numericIdOpt.isPresent()) {
-                builder = builder.mdNumericId(numericIdOpt.get());
+            MaintenanceDomain.MdBuilder builder = DefaultMaintenanceDomain
+                    .builder(mdId).mdLevel(levelEnum);
+            if (numericId != null) {
+                builder = builder.mdNumericId(numericId);
             }
             boolean created = service.createMaintenanceDomain(builder.build());
             print("Maintenance Domain with id %s is successfully %s.",
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdDeleteCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdDeleteCommand.java
index 3cf3c26..85f47eb 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdDeleteCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdDeleteCommand.java
@@ -19,10 +19,6 @@
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdDomainName;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdMacUint;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdNone;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
 
@@ -33,10 +29,10 @@
         description = "Delete a CFM Maintenance Domain and its children.")
 public class CfmMdDeleteCommand extends AbstractShellCommand {
 
-    @Argument(index = 0, name = "name",
+    @Argument(name = "name",
             description = "Maintenance Domain name and type (in brackets)",
-            required = true, multiValued = false)
-    String name = null;
+            required = true)
+    private String name = null;
 
     @Override
     protected void execute() {
@@ -48,22 +44,7 @@
                     "Must be in the format of <identifier(name-type)>");
         }
 
-        MdId mdId = null;
-        MdId.MdNameType nameTypeEnum = MdId.MdNameType.valueOf(nameParts[1]);
-        switch (nameTypeEnum) {
-            case DOMAINNAME:
-                mdId = MdIdDomainName.asMdId(nameParts[0]);
-                break;
-            case MACANDUINT:
-                mdId = MdIdMacUint.asMdId(nameParts[0]);
-                break;
-            case NONE:
-                mdId = MdIdNone.asMdId();
-                break;
-            case CHARACTERSTRING:
-            default:
-                mdId = MdIdCharStr.asMdId(nameParts[0]);
-        }
+        MdId mdId = CfmMdListMdCommand.parseMdName(nameParts[0] + "(" + nameParts[1] + ")");
 
         try {
             boolean deleted = service.deleteMaintenanceDomain(mdId);
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdListMdCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdListMdCommand.java
index 6f41005..7965113 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdListMdCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdListMdCommand.java
@@ -20,84 +20,76 @@
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation;
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaId2Octet;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdIccY1731;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdPrimaryVid;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdRfc2685VpnId;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdDomainName;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdMacUint;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdNone;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdMaNameUtil;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
 
-import java.util.Optional;
-
 /**
  * Lists a particular Maintenance Domain.
  */
 @Command(scope = "onos", name = "cfm-md-list",
         description = "Lists a single CFM Maintenance Domain or all if none specified.")
 public class CfmMdListMdCommand extends AbstractShellCommand {
-    @Argument(index = 0, name = "name",
-            description = "Maintenance Domain name and type (in brackets)",
-            required = false, multiValued = false)
-    String name = null;
+    @Argument(name = "name",
+            description = "Maintenance Domain name and type (in brackets)")
+    private String name = null;
 
     @Override
     protected void execute() {
-        CfmMdService service = get(CfmMdService.class);
+        CfmMdService service;
+        service = get(CfmMdService.class);
 
         if (name != null) {
             MdId mdId = parseMdName(name);
             print("Maintenance Domain:");
-            Optional<MaintenanceDomain> md = service.getMaintenanceDomain(mdId);
-            print(printMd(md));
-            md.get().maintenanceAssociationList().forEach(ma -> printMa(Optional.of(ma)));
-        } else {
-            service.getAllMaintenanceDomain().forEach(md -> {
-                print(printMd(Optional.of(md)));
+            service.getMaintenanceDomain(mdId).ifPresent(md -> {
+                print(printMd(md));
+                md.maintenanceAssociationList().forEach(CfmMdListMdCommand::printMa);
             });
+        } else {
+            service.getAllMaintenanceDomain().forEach(md -> print(printMd(md)));
         }
     }
 
-    public static String printMd(Optional<MaintenanceDomain> md) {
-        if (!md.isPresent()) {
-            return new String("MD not found");
+    private static String printMd(MaintenanceDomain md) {
+        if (md == null) {
+            return "MD not found";
         } else {
-            StringBuffer sb = new StringBuffer("\tMD: ");
-            sb.append(md.get().mdId().mdName());
-            sb.append("(" + md.get().mdId().nameType());
-            sb.append(") Lvl:" + md.get().mdLevel().ordinal());
-            sb.append(", Num: " + md.get().mdNumericId());
+            StringBuilder sb = new StringBuilder("\tMD: ");
+            sb.append(md.mdId().mdName());
+            sb.append("(");
+            sb.append(md.mdId().nameType());
+            sb.append(") Lvl:");
+            sb.append(md.mdLevel().ordinal());
+            sb.append(", Num: ");
+            sb.append(md.mdNumericId());
 
-            md.get().maintenanceAssociationList().
-                    forEach(ma -> sb.append(printMa(Optional.of(ma))));
+            md.maintenanceAssociationList().
+                    forEach(ma -> sb.append(printMa(ma)));
             return sb.toString();
         }
     }
 
-    public static String printMa(Optional<MaintenanceAssociation> ma) {
-        if (!ma.isPresent()) {
+    private static String printMa(MaintenanceAssociation ma) {
+        if (ma == null) {
             return "\n\tNo MA found";
         }
 
         StringBuilder sb = new StringBuilder("\n\t\tMA: ");
-        sb.append(ma.get().maId().maName());
+        sb.append(ma.maId().maName());
         sb.append("(");
-        sb.append(ma.get().maId().nameType());
+        sb.append(ma.maId().nameType());
         sb.append(") CCM: ");
-        sb.append(ma.get().ccmInterval());
+        sb.append(ma.ccmInterval());
         sb.append(" Num: ");
-        sb.append(ma.get().maNumericId());
+        sb.append(ma.maNumericId());
 
-        ma.get().remoteMepIdList().forEach(rmep -> {
+        ma.remoteMepIdList().forEach(rmep -> {
                     sb.append("\n\t\t\tRmep: ");
                     sb.append(rmep);
                 });
-        ma.get().componentList().forEach(comp -> {
+        ma.componentList().forEach(comp -> {
             sb.append("\n\t\t\tComponent: ");
             sb.append(comp.componentId());
             sb.append(" Perm: ");
@@ -116,59 +108,24 @@
         return sb.toString();
     }
 
-    public static MdId parseMdName(String mdStr) {
+    static MdId parseMdName(String mdStr) {
         String[] nameParts = mdStr.split("[()]");
         if (nameParts.length != 2) {
             throw new IllegalArgumentException("Invalid name format. " +
                     "Must be in the format of <identifier(name-type)>");
         }
 
-        MdId mdId = null;
-        MdId.MdNameType nameTypeEnum = MdId.MdNameType.valueOf(nameParts[1]);
-        switch (nameTypeEnum) {
-            case DOMAINNAME:
-                mdId = MdIdDomainName.asMdId(nameParts[0]);
-                break;
-            case MACANDUINT:
-                mdId = MdIdMacUint.asMdId(nameParts[0]);
-                break;
-            case NONE:
-                mdId = MdIdNone.asMdId();
-                break;
-            case CHARACTERSTRING:
-            default:
-                mdId = MdIdCharStr.asMdId(nameParts[0]);
-        }
-        return mdId;
+        return MdMaNameUtil.parseMdName(nameParts[1], nameParts[0]);
     }
 
-    public static MaIdShort parseMaName(String maStr) {
+    static MaIdShort parseMaName(String maStr) {
         String[] nameParts = maStr.split("[()]");
         if (nameParts.length != 2) {
             throw new IllegalArgumentException("Invalid name format. " +
                     "Must be in the format of <identifier(name-type)>");
         }
 
-        MaIdShort maId = null;
-        MaIdShort.MaIdType nameTypeEnum = MaIdShort.MaIdType.valueOf(nameParts[1]);
-        switch (nameTypeEnum) {
-            case ICCY1731:
-                maId = MaIdIccY1731.asMaId(nameParts[0]);
-                break;
-            case PRIMARYVID:
-                maId = MaIdPrimaryVid.asMaId(nameParts[0]);
-                break;
-            case RFC2685VPNID:
-                maId = MaIdRfc2685VpnId.asMaIdHex(nameParts[0]);
-                break;
-            case TWOOCTET:
-                maId = MaId2Octet.asMaId(nameParts[0]);
-                break;
-            case CHARACTERSTRING:
-            default:
-                maId = MaIdCharStr.asMaId(nameParts[0]);
-        }
-        return maId;
+        return MdMaNameUtil.parseMaName(nameParts[1], nameParts[0]);
     }
 
 }
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListCommand.java
index b406947..55ed5ef 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListCommand.java
@@ -39,18 +39,15 @@
         description = "Lists a filtered set of MEPs or all if no parameters specified.")
 public class CfmMepListCommand extends AbstractShellCommand {
     private final Logger log = getLogger(getClass());
-    @Argument(index = 0, name = "md",
-            description = "Maintenance Domain name and type (in brackets) - will use all MDs if not specified",
-            required = false, multiValued = false)
-    String mdStr = null;
+    @Argument(name = "md",
+            description = "Maintenance Domain name and type (in brackets) - will use all MDs if not specified")
+    private String mdStr = null;
     @Argument(index = 1, name = "ma",
-            description = "Maintenance Association name and type (in brackets) - requires MD",
-            required = false, multiValued = false)
-    String maStr = null;
+            description = "Maintenance Association name and type (in brackets) - requires MD")
+    private String maStr = null;
     @Argument(index = 2, name = "mep",
-            description = "MEP identifier - requires MD and MA",
-            required = false, multiValued = false)
-    String mepStr = null;
+            description = "MEP identifier - requires MD and MA")
+    private String mepStr = null;
 
     @Override
     protected void execute() {
@@ -83,9 +80,8 @@
                 } else {
                     //MD and MA given but no MEP given
                     try {
-                        mepService.getAllMeps(mdId, maId).forEach(mep -> {
-                            print(printMepEntry(mep));
-                        });
+                        mepService.getAllMeps(mdId, maId)
+                                .forEach(mep -> print(printMepEntry(mep)));
                     } catch (CfmConfigException e) {
                         log.error("Error retrieving Meps for {}/{}",
                                 mdId.mdName(), maId.maName(), e);
@@ -96,9 +92,8 @@
                 mdService.getAllMaintenanceAssociation(mdId).forEach(ma -> {
                     print(printMaId(ma.maId()));
                     try {
-                        mepService.getAllMeps(mdId, ma.maId()).forEach(mep -> {
-                            print(printMepEntry(mep));
-                        });
+                        mepService.getAllMeps(mdId, ma.maId())
+                                .forEach(mep -> print(printMepEntry(mep)));
                     } catch (CfmConfigException e) {
                         log.error("Error retrieving Meps for {}/{}",
                                 mdId.mdName(), ma.maId().maName(), e);
@@ -113,9 +108,8 @@
                 mdService.getAllMaintenanceAssociation(md.mdId()).forEach(ma -> {
                     print(printMaId(ma.maId()));
                     try {
-                        mepService.getAllMeps(md.mdId(), ma.maId()).forEach(mep -> {
-                            print(printMepEntry(mep));
-                        });
+                        mepService.getAllMeps(md.mdId(), ma.maId())
+                                .forEach(mep -> print(printMepEntry(mep)));
                     } catch (CfmConfigException e) {
                         log.error("Error retrieving Meps for {}/{}",
                                 md.mdId().mdName(), ma.maId().maName(), e);
@@ -130,25 +124,38 @@
      * @param mep The MEPEntry to print
      * @return A string with MepEntry details
      */
-    public static String printMepEntry(MepEntry mep) {
+    private static String printMepEntry(MepEntry mep) {
         StringBuffer sb = new StringBuffer("MEP: ");
         sb.append(mep.mepId());
-        sb.append(" Device:" + mep.deviceId());
-        sb.append(", Port: " + mep.port());
-        sb.append(", Vlan: " + mep.primaryVid());
-        sb.append(", AdminSt: " + mep.administrativeState());
-        sb.append(", CciEnabled: " + mep.cciEnabled());
-        sb.append(", Priority: " + mep.ccmLtmPriority());
+        sb.append(" Device:");
+        sb.append(mep.deviceId());
+        sb.append(", Port: ");
+        sb.append(mep.port());
+        sb.append(", Vlan: ");
+        sb.append(mep.primaryVid());
+        sb.append(", AdminSt: ");
+        sb.append(mep.administrativeState());
+        sb.append(", CciEnabled: ");
+        sb.append(mep.cciEnabled());
+        sb.append(", Priority: ");
+        sb.append(mep.ccmLtmPriority());
         sb.append("\n"); //The following are state
-        sb.append(", Total CCMs: " + mep.totalCcmsTransmitted());
-        sb.append(", MAC: " + mep.macAddress());
-        sb.append(", Fault: " + mep.fngState());
+        sb.append(", Total CCMs: ");
+        sb.append(mep.totalCcmsTransmitted());
+        sb.append(", MAC: ");
+        sb.append(mep.macAddress());
+        sb.append(", Fault: ");
+        sb.append(mep.fngState());
 
         mep.activeRemoteMepList().forEach(rmep -> {
-            sb.append("\n\tRmep: " + rmep.remoteMepId());
-            sb.append(", Mac: " + rmep.macAddress());
-            sb.append(", State: " + rmep.state());
-            sb.append(", Failed Time: " + rmep.failedOrOkTime());
+            sb.append("\n\tRmep: ");
+            sb.append(rmep.remoteMepId());
+            sb.append(", Mac: ");
+            sb.append(rmep.macAddress());
+            sb.append(", State: ");
+            sb.append(rmep.state());
+            sb.append(", Failed Time: ");
+            sb.append(rmep.failedOrOkTime());
 
         });
 
@@ -156,18 +163,12 @@
         return sb.toString();
     }
 
-    public static String printMdId(MdId mdId) {
-        StringBuffer sb = new StringBuffer("MD: ");
-        sb.append(mdId.mdName());
-        sb.append("(" + mdId.nameType() + ")");
-        return sb.toString();
+    private static String printMdId(MdId mdId) {
+        return "MD: " + mdId.mdName() + "(" + mdId.nameType() + ")";
     }
 
-    public static String printMaId(MaIdShort maId) {
-        StringBuffer sb = new StringBuffer("MA: ");
-        sb.append(maId.maName());
-        sb.append("(" + maId.nameType() + ")");
-        return sb.toString();
+    private static String printMaId(MaIdShort maId) {
+        return "MA: " + maId.maName() + "(" + maId.nameType() + ")";
     }
 
 }
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListDeviceCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListDeviceCommand.java
index c99399a..5067cc1 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListDeviceCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListDeviceCommand.java
@@ -22,9 +22,6 @@
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMepService;
 import org.onosproject.net.DeviceId;
-import org.slf4j.Logger;
-
-import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Lists all the MEPs on a particular device.
@@ -32,11 +29,10 @@
 @Command(scope = "onos", name = "cfm-mep-device-list",
         description = "Lists a set of MEPs filtered by device.")
 public class CfmMepListDeviceCommand extends AbstractShellCommand {
-    private final Logger log = getLogger(getClass());
-    @Argument(index = 0, name = "device",
+    @Argument(name = "device",
             description = "Device Id",
-            required = true, multiValued = false)
-    String deviceStr = null;
+            required = true)
+    private String deviceStr = null;
 
     @Override
     protected void execute() {
@@ -44,9 +40,8 @@
         if (deviceStr != null) {
             DeviceId deviceId = DeviceId.deviceId(deviceStr);
             try {
-                mepService.getAllMepsByDevice(deviceId).forEach(mep -> {
-                    print(printMep(mep));
-                });
+                mepService.getAllMepsByDevice(deviceId)
+                        .forEach(mep -> print(printMep(mep)));
             } catch (CfmConfigException e) {
                 log.error("Error retrieving Meps for Device {}",
                         deviceId, e);
@@ -59,19 +54,12 @@
      * @param mep The MEP to print
      * @return A string with MD name, MA name and Mep details
      */
-    public static String printMep(Mep mep) {
-        StringBuffer sb = new StringBuffer("MEP: ");
-        sb.append(mep.mdId().mdName() + "/");
-        sb.append(mep.maId().maName() + "/");
-        sb.append(mep.mepId());
-        sb.append(" Device:" + mep.deviceId());
-        sb.append(", Port: " + mep.port());
-        sb.append(", Vlan: " + mep.primaryVid());
-        sb.append(", AdminSt: " + mep.administrativeState());
-        sb.append(", CciEnabled: " + mep.cciEnabled());
-        sb.append(", Priority: " + mep.ccmLtmPriority());
-
-        return sb.toString();
+    private static String printMep(Mep mep) {
+         return "MEP: " + mep.mdId().mdName() + "/" + mep.maId().maName() + "/" +
+                 mep.mepId() + " Device:" + mep.deviceId() + ", Port: " +
+                 mep.port() + ", Vlan: " + mep.primaryVid() + ", AdminSt: " +
+                 mep.administrativeState() + ", CciEnabled: " + mep.cciEnabled() +
+                 ", Priority: " + mep.ccmLtmPriority();
     }
 
 }
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaNameCompleter.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaNameCompleter.java
index b484212..1463804 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaNameCompleter.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaNameCompleter.java
@@ -34,16 +34,8 @@
         CfmMdService service = get(CfmMdService.class);
         service.getAllMaintenanceDomain().forEach(md ->
             md.maintenanceAssociationList().forEach(ma ->
-                choices.add(new StringBuilder(md.mdId().mdName())
-                .append("(")
-                .append(md.mdId().nameType())
-                .append(")")
-                .append(ma.maId().maName())
-                .append("(")
-                .append(ma.maId().nameType())
-                .append(")").toString())
-            )
-        );
+                choices.add(md.mdId().mdName() + "(" + md.mdId().nameType() + ")" +
+                        ma.maId().maName() + "(" + ma.maId().nameType() + ")")));
 
         return choices;
     }
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMepIdCompleter.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMepIdCompleter.java
index 6019916..a26a460 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMepIdCompleter.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMepIdCompleter.java
@@ -41,32 +41,17 @@
         CfmMepService mepService = get(CfmMepService.class);
 
         mdService.getAllMaintenanceDomain().forEach(md -> {
-            choices.add(new StringBuilder(md.mdId().mdName())
-                            .append("(")
-                            .append(md.mdId().nameType())
-                            .append(")").toString());
+            choices.add(md.mdId().mdName() + "(" + md.mdId().nameType() + ")");
 
             md.maintenanceAssociationList().forEach(ma -> {
-                    choices.add(new StringBuilder(md.mdId().mdName())
-                            .append("(")
-                            .append(md.mdId().nameType())
-                            .append(") ")
-                            .append(ma.maId().maName())
-                            .append("(")
-                            .append(ma.maId().nameType())
-                            .append(")").toString());
+                    choices.add(md.mdId().mdName() + "(" + md.mdId().nameType() +
+                            ") " + ma.maId().maName() + "(" + ma.maId().nameType() + ")");
 
                     try {
                         mepService.getAllMeps(md.mdId(), ma.maId()).forEach(mep ->
-                                choices.add(new StringBuilder(md.mdId().mdName())
-                                        .append("(")
-                                        .append(md.mdId().nameType())
-                                        .append(") ")
-                                        .append(ma.maId().maName())
-                                        .append("(")
-                                        .append(ma.maId().nameType())
-                                        .append(") ")
-                                        .append(mep.mepId()).toString())
+                                choices.add(md.mdId().mdName() + "(" +
+                                        md.mdId().nameType() + ") " + ma.maId().maName() +
+                                        "(" + ma.maId().nameType() + ") " + mep.mepId())
                         );
                     } catch (CfmConfigException e) {
                         log.warn("Unable to retrieve mep details", e);
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/rest/MaWebResource.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/rest/MaWebResource.java
index 85b7ac4..e0390a9 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/rest/MaWebResource.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/rest/MaWebResource.java
@@ -17,6 +17,7 @@
 
 import java.io.InputStream;
 import java.net.URI;
+import java.util.Optional;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -134,9 +135,9 @@
         log.debug("POST called to Create MA");
         try {
             MdId mdId = MdIdCharStr.asMdId(mdName);
-            MaintenanceDomain md = get(CfmMdService.class)
-                                            .getMaintenanceDomain(mdId).get();
-            if (md == null) {
+            Optional<MaintenanceDomain> md = get(CfmMdService.class)
+                                            .getMaintenanceDomain(mdId);
+            if (!md.isPresent()) {
                 return Response.serverError().entity("{ \"failure\":\"md "
                                         + mdName + " does not exist\" }").build();
             }
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/rest/MdWebResource.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/rest/MdWebResource.java
index 0e523a7..aa16d9e 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/rest/MdWebResource.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/rest/MdWebResource.java
@@ -49,7 +49,6 @@
 @Path("md")
 public class MdWebResource extends AbstractWebResource {
     private final Logger log = LoggerFactory.getLogger(getClass());
-    public static final String JSON_NOT_NULL = "JsonNode can not be null";
 
     /**
      * Get all Maintenance Domains.
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/rest/MepWebResource.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/rest/MepWebResource.java
index 52d4150..a9d2c9e 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/rest/MepWebResource.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/rest/MepWebResource.java
@@ -180,7 +180,10 @@
         try {
             MdId mdId = MdIdCharStr.asMdId(mdName);
             MaIdShort maId = MaIdCharStr.asMaId(maName);
-            MaintenanceAssociation ma = get(CfmMdService.class).getMaintenanceAssociation(mdId, maId).get();
+            MaintenanceAssociation ma =
+                    get(CfmMdService.class).getMaintenanceAssociation(mdId, maId)
+                    .orElseThrow(() -> new IllegalArgumentException(
+                            "MA " + mdName + "/" + maName + " not Found"));
 
             ObjectMapper mapper = new ObjectMapper();
             JsonNode cfg = mapper.readTree(input);
@@ -194,12 +197,14 @@
                         " already exists").build();
             }
             return Response
-                    .created(new URI("md/" + mdName + "/ma/" + ma.maId() + "/mep/" + mep.mepId()))
-                    .entity("{ \"success\":\"mep " + mdName + "/" + ma.maId() + "/" + mep.mepId() + " created\" }")
+                    .created(new URI("md/" + mdName + "/ma/" + ma.maId() +
+                            "/mep/" + mep.mepId()))
+                    .entity("{ \"success\":\"mep " + mdName + "/" + ma.maId() +
+                            "/" + mep.mepId() + " created\" }")
                     .build();
         } catch (Exception | CfmConfigException e) {
             log.error("Create Mep on " + mdName + "/" + maName + " failed because of exception {}",
-                      e.toString());
+                      e);
             return Response.serverError()
                     .entity("{ \"failure\":\"" + e.toString() + "\" }")
                     .build();
@@ -229,9 +234,25 @@
 
         MdId mdId = MdIdCharStr.asMdId(mdName);
         MaIdShort maId = MaIdCharStr.asMaId(maName);
-        MaintenanceDomain md = get(CfmMdService.class).getMaintenanceDomain(mdId).get();
-        MaintenanceAssociation ma = get(CfmMdService.class)
-                .getMaintenanceAssociation(mdId, maId).get();
+        MaintenanceDomain md;
+        Optional<MaintenanceDomain> mdOpt = get(CfmMdService.class).getMaintenanceDomain(mdId);
+        if (mdOpt.isPresent()) {
+            md = mdOpt.get();
+        } else {
+            return Response.serverError()
+                    .entity("{ \"failure\":\"" + mdName + " does not exist\" }")
+                    .build();
+        }
+        MaintenanceAssociation ma;
+        Optional<MaintenanceAssociation> maOpt = get(CfmMdService.class)
+                .getMaintenanceAssociation(mdId, maId);
+        if (maOpt.isPresent()) {
+            ma = maOpt.get();
+        } else {
+            return Response.serverError()
+                    .entity("{ \"failure\":\"" + maName + " does not exist\" }")
+                    .build();
+        }
 
         MepId mepId = MepId.valueOf(mepIdShort);
 
@@ -275,9 +296,25 @@
 
         MdId mdId = MdIdCharStr.asMdId(mdName);
         MaIdShort maId = MaIdCharStr.asMaId(maName);
-        MaintenanceDomain md = get(CfmMdService.class).getMaintenanceDomain(mdId).get();
-        MaintenanceAssociation ma = get(CfmMdService.class)
-                .getMaintenanceAssociation(mdId, maId).get();
+        MaintenanceDomain md;
+        Optional<MaintenanceDomain> mdOpt = get(CfmMdService.class).getMaintenanceDomain(mdId);
+        if (mdOpt.isPresent()) {
+            md = mdOpt.get();
+        } else {
+            return Response.serverError()
+                    .entity("{ \"failure\":\"" + mdName + " does not exist\" }")
+                    .build();
+        }
+        MaintenanceAssociation ma;
+        Optional<MaintenanceAssociation> maOpt = get(CfmMdService.class)
+                .getMaintenanceAssociation(mdId, maId);
+        if (maOpt.isPresent()) {
+            ma = maOpt.get();
+        } else {
+            return Response.serverError()
+                    .entity("{ \"failure\":\"" + maName + " does not exist\" }")
+                    .build();
+        }
 
         MepId mepId = MepId.valueOf(mepIdShort);
 
@@ -319,9 +356,25 @@
 
         MdId mdId = MdIdCharStr.asMdId(mdName);
         MaIdShort maId = MaIdCharStr.asMaId(maName);
-        MaintenanceDomain md = get(CfmMdService.class).getMaintenanceDomain(mdId).get();
-        MaintenanceAssociation ma = get(CfmMdService.class)
-                .getMaintenanceAssociation(mdId, maId).get();
+        MaintenanceDomain md;
+        Optional<MaintenanceDomain> mdOpt = get(CfmMdService.class).getMaintenanceDomain(mdId);
+        if (mdOpt.isPresent()) {
+            md = mdOpt.get();
+        } else {
+            return Response.serverError()
+                    .entity("{ \"failure\":\"" + mdName + " does not exist\" }")
+                    .build();
+        }
+        MaintenanceAssociation ma;
+        Optional<MaintenanceAssociation> maOpt = get(CfmMdService.class)
+                .getMaintenanceAssociation(mdId, maId);
+        if (maOpt.isPresent()) {
+            ma = maOpt.get();
+        } else {
+            return Response.serverError()
+                    .entity("{ \"failure\":\"" + maName + " does not exist\" }")
+                    .build();
+        }
 
         MepId mepId = MepId.valueOf(mepIdShort);
 
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/ComponentCodec.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/ComponentCodec.java
index 6a53497..ee83dea 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/ComponentCodec.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/ComponentCodec.java
@@ -42,6 +42,15 @@
     private static final String MHF_CREATION_TYPE = "mhf-creation-type";
     private static final String ID_PERMISSION = "id-permission";
 
+    /**
+     * Encodes the Component entity into JSON.
+     *
+     * @param component  Component to encode
+     * @param context encoding context
+     * @return JSON node
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ObjectNode encode(Component component, CodecContext context) {
 
@@ -63,15 +72,31 @@
         return (ObjectNode) context.mapper().createObjectNode().set(COMPONENT, node);
     }
 
+    /**
+     * Encodes the collection of the Component entities.
+     *
+     * @param components collection of Component to encode
+     * @param context  encoding context
+     * @return JSON array
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ArrayNode encode(Iterable<Component> components, CodecContext context) {
         ArrayNode an = context.mapper().createArrayNode();
-        components.forEach(component -> {
-            an.add(encode(component, context));
-        });
+        components.forEach(component -> an.add(encode(component, context)));
         return an;
     }
 
+    /**
+     * Decodes the Component entity from JSON.
+     *
+     * @param json    JSON to decode
+     * @param context decoding context
+     * @return decoded Component
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support decode operations
+     */
     @Override
     public Component decode(ObjectNode json, CodecContext context) {
         if (json == null || !json.isObject()) {
@@ -87,7 +112,7 @@
 
         List<VlanId> vidList = (new VidCodec()).decode((ArrayNode)
                 nullIsIllegal(componentNode.get(VID_LIST), "vid-list is required"), context);
-        if (vidList == null || vidList.size() < 1) {
+        if (vidList == null || vidList.isEmpty()) {
             throw new IllegalArgumentException("A least one VID is required in component: " + componentId);
         }
         for (VlanId vid:vidList) {
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/FngAddressCodec.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/FngAddressCodec.java
index 47cc9b6..1c0e725 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/FngAddressCodec.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/FngAddressCodec.java
@@ -25,6 +25,8 @@
 import org.onosproject.incubator.net.l2monitoring.cfm.Mep;
 import org.onosproject.incubator.net.l2monitoring.cfm.Mep.FngAddress;
 
+import java.util.Locale;
+
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.util.Tools.nullIsIllegal;
 
@@ -33,6 +35,15 @@
  */
 public class FngAddressCodec extends JsonCodec<FngAddress> {
 
+    /**
+     * Encodes the FngAddress entity into JSON.
+     *
+     * @param fngAddress  FngAddress to encode
+     * @param context encoding context
+     * @return JSON node
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ObjectNode encode(FngAddress fngAddress, CodecContext context) {
         checkNotNull(fngAddress, "FngAddress cannot be null");
@@ -47,6 +58,15 @@
         return result;
     }
 
+    /**
+     * Decodes the FngAddress entity from JSON.
+     *
+     * @param json    JSON to decode
+     * @param context decoding context
+     * @return decoded FngAddress
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support decode operations
+     */
     @Override
     public FngAddress decode(ObjectNode json, CodecContext context) {
         if (json == null || !json.isObject()) {
@@ -57,7 +77,7 @@
 
         String addressType = nullIsIllegal(node.get("address-type"),
                             "address type is required").asText();
-        Mep.FngAddressType type = Mep.FngAddressType.valueOf(addressType.toUpperCase());
+        Mep.FngAddressType type = Mep.FngAddressType.valueOf(addressType.toUpperCase(Locale.ENGLISH));
         JsonNode ipAddressNode = node.get("ipAddress");
 
         switch (type) {
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MaintenanceAssociationCodec.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MaintenanceAssociationCodec.java
index 6c3829f..b1b9baa 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MaintenanceAssociationCodec.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MaintenanceAssociationCodec.java
@@ -27,12 +27,8 @@
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation;
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation.CcmInterval;
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation.MaBuilder;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaId2Octet;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdIccY1731;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdPrimaryVid;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdRfc2685VpnId;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdMaNameUtil;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
 
@@ -53,6 +49,15 @@
     private static final String RMEP_LIST = "rmep-list";
     private static final String MA = "ma";
 
+    /**
+     * Encodes the MaintenanceAssociation entity into JSON.
+     *
+     * @param ma MaintenanceAssociation to encode
+     * @param context encoding context
+     * @return JSON node
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ObjectNode encode(MaintenanceAssociation ma, CodecContext context) {
         checkNotNull(ma, "Maintenance Association cannot be null");
@@ -72,6 +77,16 @@
         return result;
     }
 
+    /**
+     * Decodes the MaintenanceAssociation entity from JSON.
+     *
+     * @param json    JSON to decode
+     * @param context decoding context
+     * @param mdNameLen the length of the corresponding MD's name
+     * @return decoded MaintenanceAssociation
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support decode operations
+     */
     public MaintenanceAssociation decode(ObjectNode json, CodecContext context, int mdNameLen) {
         if (json == null || !json.isObject()) {
             return null;
@@ -86,25 +101,7 @@
         }
 
         try {
-            MaIdShort maId = null;
-            MaIdShort.MaIdType maIdType = MaIdShort.MaIdType.valueOf(maNameType);
-            switch (maIdType) {
-                case PRIMARYVID:
-                    maId = MaIdPrimaryVid.asMaId(maName);
-                    break;
-                case TWOOCTET:
-                    maId = MaId2Octet.asMaId(maName);
-                    break;
-                case RFC2685VPNID:
-                    maId = MaIdRfc2685VpnId.asMaIdHex(maName);
-                    break;
-                case ICCY1731:
-                    maId = MaIdIccY1731.asMaId(maName);
-                    break;
-                case CHARACTERSTRING:
-                default:
-                    maId = MaIdCharStr.asMaId(maName);
-            }
+            MaIdShort maId = MdMaNameUtil.parseMaName(maNameType, maName);
             MaBuilder builder =
                     DefaultMaintenanceAssociation.builder(maId, mdNameLen);
 
@@ -140,6 +137,15 @@
 
     }
 
+    /**
+     * Encodes the collection of the MaintenanceAssociation entities.
+     *
+     * @param maEntities collection of MaintenanceAssociation to encode
+     * @param context  encoding context
+     * @return JSON array
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ArrayNode encode(Iterable<MaintenanceAssociation> maEntities, CodecContext context) {
         ArrayNode an = context.mapper().createArrayNode();
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MaintenanceDomainCodec.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MaintenanceDomainCodec.java
index a6bcf01..89b7cc1 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MaintenanceDomainCodec.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MaintenanceDomainCodec.java
@@ -24,10 +24,7 @@
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain;
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain.MdLevel;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdDomainName;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdMacUint;
-import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdNone;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdMaNameUtil;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
 
 import com.fasterxml.jackson.databind.JsonNode;
@@ -50,6 +47,15 @@
 
     }
 
+    /**
+     * Encodes the MaintenanceDomain entity into JSON.
+     *
+     * @param md MaintenanceDomain to encode
+     * @param context encoding context
+     * @return JSON node
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ObjectNode encode(MaintenanceDomain md, CodecContext context) {
         checkNotNull(md, "Maintenance Domain cannot be null");
@@ -67,6 +73,15 @@
         return result;
     }
 
+    /**
+     * Decodes the MaintenanceDomain entity from JSON.
+     *
+     * @param json    JSON to decode
+     * @param context decoding context
+     * @return decoded MaintenanceDomain
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support decode operations
+     */
     @Override
     public MaintenanceDomain decode(ObjectNode json, CodecContext context) {
         if (json == null || !json.isObject()) {
@@ -82,24 +97,7 @@
         }
 
         try {
-            MdId mdId = null;
-            MdId.MdNameType nameType =
-                    MdId.MdNameType.valueOf(mdNameType);
-            switch (nameType) {
-                case DOMAINNAME:
-                    mdId = MdIdDomainName.asMdId(mdName);
-                    break;
-                case MACANDUINT:
-                    mdId = MdIdMacUint.asMdId(mdName);
-                    break;
-                case NONE:
-                    mdId = MdIdNone.asMdId();
-                    break;
-                case CHARACTERSTRING:
-                default:
-                    mdId = MdIdCharStr.asMdId(mdName);
-            }
-
+            MdId mdId = MdMaNameUtil.parseMdName(mdNameType, mdName);
             MaintenanceDomain.MdBuilder builder = DefaultMaintenanceDomain.builder(mdId);
             JsonNode mdLevelNode = mdNode.get(MD_LEVEL);
             if (mdLevelNode != null) {
@@ -118,6 +116,15 @@
         }
     }
 
+    /**
+     * Encodes the collection of the MaintenanceDomain entities.
+     *
+     * @param mdEntities collection of MaintenanceDomain to encode
+     * @param context  encoding context
+     * @return JSON array
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ArrayNode encode(Iterable<MaintenanceDomain> mdEntities, CodecContext context) {
         ArrayNode an = context.mapper().createArrayNode();
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepCodec.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepCodec.java
index 73a58b6..a095da8 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepCodec.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepCodec.java
@@ -53,6 +53,17 @@
     private static final String DEFECT_PRESENT_TIME = "defect-present-time";
     private static final String DEFECT_ABSENT_TIME = "defect-absent-time";
 
+    /**
+     * Decodes the Mep entity from JSON.
+     *
+     * @param json    JSON to decode
+     * @param context decoding context
+     * @param mdName The MD name
+     * @param maName The MA name
+     * @return decoded Mep
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support decode operations
+     */
      public Mep decode(ObjectNode json, CodecContext context, String
                         mdName, String maName) {
         if (json == null || !json.isObject()) {
@@ -127,6 +138,15 @@
         }
     }
 
+    /**
+     * Encodes the Mep entity into JSON.
+     *
+     * @param mep Mep to encode
+     * @param context encoding context
+     * @return JSON node
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ObjectNode encode(Mep mep, CodecContext context) {
         checkNotNull(mep, "Mep cannot be null");
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepEntryCodec.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepEntryCodec.java
index d1618a7..f1799fb 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepEntryCodec.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepEntryCodec.java
@@ -34,6 +34,15 @@
  */
 public class MepEntryCodec extends JsonCodec<MepEntry> {
 
+    /**
+     * Encodes the MepEntry entity into JSON.
+     *
+     * @param mepEntry  MepEntry to encode
+     * @param context encoding context
+     * @return JSON node
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ObjectNode encode(MepEntry mepEntry, CodecContext context) {
         checkNotNull(mepEntry, "Mep cannot be null");
@@ -41,7 +50,7 @@
         ObjectNode result = context.mapper().createObjectNode();
 
         //Get the common attributes
-        Mep mep = (Mep) mepEntry;
+        Mep mep = mepEntry;
         ObjectNode mepAttrs = new MepCodec().encode(mep, context);
         Iterator<Entry<String, JsonNode>> elements = mepAttrs.fields();
         while (elements.hasNext()) {
@@ -81,6 +90,15 @@
         return result;
     }
 
+    /**
+     * Encodes the collection of the MepEntry entities.
+     *
+     * @param mepEntryEntities collection of MepEntry to encode
+     * @param context  encoding context
+     * @return JSON array
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ArrayNode encode(Iterable<MepEntry> mepEntryEntities, CodecContext context) {
         ArrayNode an = context.mapper().createArrayNode();
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepLbCreateCodec.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepLbCreateCodec.java
index e29415c..8b80237 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepLbCreateCodec.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepLbCreateCodec.java
@@ -42,6 +42,15 @@
     public static final String VLAN_PRIORITY = "vlanPriority";
     public static final String LOOPBACK = "loopback";
 
+    /**
+     * Encodes the MepLbCreate entity into JSON.
+     *
+     * @param mepLbCreate MepLbCreate to encode
+     * @param context encoding context
+     * @return JSON node
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ObjectNode encode(MepLbCreate mepLbCreate, CodecContext context) {
         checkNotNull(mepLbCreate, "Mep Lb Create cannot be null");
@@ -66,7 +75,15 @@
         return result;
     }
 
-
+    /**
+     * Decodes the MepLbCreate entity from JSON.
+     *
+     * @param json    JSON to decode
+     * @param context decoding context
+     * @return decoded MepLbCreate
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support decode operations
+     */
     @Override
     public MepLbCreate decode(ObjectNode json, CodecContext context) {
         if (json == null || !json.isObject()) {
@@ -78,7 +95,7 @@
         JsonNode remoteMepIdNode = loopbackNode.get(REMOTE_MEP_ID);
         JsonNode remoteMepMacNode = loopbackNode.get(REMOTE_MEP_MAC);
 
-        MepLbCreate.MepLbCreateBuilder lbCreateBuilder = null;
+        MepLbCreate.MepLbCreateBuilder lbCreateBuilder;
         if (remoteMepIdNode != null) {
             MepId remoteMepId = MepId.valueOf((short) remoteMepIdNode.asInt());
             lbCreateBuilder = DefaultMepLbCreate.builder(remoteMepId);
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepLbEntryCodec.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepLbEntryCodec.java
index 62409cd..8ff8e23 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepLbEntryCodec.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepLbEntryCodec.java
@@ -28,6 +28,15 @@
  */
 public class MepLbEntryCodec extends JsonCodec<MepLbEntry> {
 
+    /**
+     * Encodes the MepLbEntry entity into JSON.
+     *
+     * @param mepLbEntry MepLbEntry to encode
+     * @param context encoding context
+     * @return JSON node
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ObjectNode encode(MepLbEntry mepLbEntry, CodecContext context) {
         checkNotNull(mepLbEntry, "Mep Lb Entry cannot be null");
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepLtCreateCodec.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepLtCreateCodec.java
index 0141a73..ba7aabe 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepLtCreateCodec.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/MepLtCreateCodec.java
@@ -40,6 +40,15 @@
     private static final String LINKTRACE = "linktrace";
     private static final String USE_FDB_ONLY = "use-fdb-only";
 
+    /**
+     * Encodes the MepLtCreate entity into JSON.
+     *
+     * @param mepLtCreate MepLtCreate to encode
+     * @param context encoding context
+     * @return JSON node
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ObjectNode encode(MepLtCreate mepLtCreate, CodecContext context) {
         checkNotNull(mepLtCreate, "Mep Lt Create cannot be null");
@@ -62,7 +71,15 @@
         return result;
     }
 
-
+    /**
+     * Decodes the MepLtCreate entity from JSON.
+     *
+     * @param json    JSON to decode
+     * @param context decoding context
+     * @return decoded MepLtCreate
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support decode operations
+     */
     @Override
     public MepLtCreate decode(ObjectNode json, CodecContext context) {
         if (json == null || !json.isObject()) {
@@ -74,7 +91,7 @@
         JsonNode remoteMepIdNode = linktraceNode.get(REMOTE_MEP_ID);
         JsonNode remoteMepMacNode = linktraceNode.get(REMOTE_MEP_MAC);
 
-        MepLtCreate.MepLtCreateBuilder ltCreateBuilder = null;
+        MepLtCreate.MepLtCreateBuilder ltCreateBuilder;
         if (remoteMepIdNode != null) {
             MepId remoteMepId = MepId.valueOf((short) remoteMepIdNode.asInt());
             ltCreateBuilder = DefaultMepLtCreate.builder(remoteMepId);
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/RMepCodec.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/RMepCodec.java
index ff4f775..6f4fc53 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/RMepCodec.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/RMepCodec.java
@@ -33,20 +33,45 @@
  */
 public class RMepCodec extends JsonCodec<MepId> {
 
+    /**
+     * Encodes the MepId entity into JSON.
+     *
+     * @param rmep  MepId to encode
+     * @param context encoding context
+     * @return JSON node
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ObjectNode encode(MepId rmep, CodecContext context) {
         return context.mapper().createObjectNode().put("rmep", rmep.id());
     }
 
+    /**
+     * Encodes the collection of the MepId entities.
+     *
+     * @param rmeps collection of MepId to encode
+     * @param context  encoding context
+     * @return JSON array
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ArrayNode encode(Iterable<MepId> rmeps, CodecContext context) {
         ArrayNode an = context.mapper().createArrayNode();
-        rmeps.forEach(rmep -> {
-            an.add(encode(rmep, context));
-        });
+        rmeps.forEach(rmep -> an.add(encode(rmep, context)));
         return an;
     }
 
+    /**
+     * Decodes the MepId entity from JSON.
+     *
+     * @param json    JSON to decode
+     * @param context decoding context
+     * @return decoded MepId
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support decode operations
+     */
     @Override
     public MepId decode(ObjectNode json, CodecContext context) {
         if (json == null || !json.isObject()) {
@@ -60,6 +85,15 @@
 
     }
 
+    /**
+     * Decodes the MepId JSON array into a collection of entities.
+     *
+     * @param json    JSON array to decode
+     * @param context decoding context
+     * @return collection of decoded MepId
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support decode operations
+     */
     @Override
     public List<MepId> decode(ArrayNode json, CodecContext context) {
         List<MepId> rmepList = new ArrayList<>();
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/RemoteMepEntryCodec.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/RemoteMepEntryCodec.java
index 4f8344a..329cc72 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/RemoteMepEntryCodec.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/RemoteMepEntryCodec.java
@@ -29,6 +29,15 @@
  */
 public class RemoteMepEntryCodec extends JsonCodec<RemoteMepEntry> {
 
+    /**
+     * Encodes the RemoteMepEntry entity into JSON.
+     *
+     * @param remoteMepEntry  RemoteMepEntry to encode
+     * @param context encoding context
+     * @return JSON node
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ObjectNode encode(RemoteMepEntry remoteMepEntry, CodecContext context) {
         checkNotNull(remoteMepEntry, "Mep cannot be null");
@@ -62,6 +71,15 @@
         return result;
     }
 
+    /**
+     * Encodes the collection of the RemoteMepEntry entities.
+     *
+     * @param remoteMepEntries collection of RemoteMepEntry to encode
+     * @param context  encoding context
+     * @return JSON array
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ArrayNode encode(Iterable<RemoteMepEntry> remoteMepEntries,
             CodecContext context) {
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/VidCodec.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/VidCodec.java
index a673719..cf97f01 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/VidCodec.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/web/VidCodec.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cfm.web;
 
+import static org.onlab.packet.VlanId.MAX_VLAN;
 import static org.onlab.util.Tools.nullIsIllegal;
 
 import java.util.ArrayList;
@@ -33,20 +34,45 @@
  */
 public class VidCodec extends JsonCodec<VlanId> {
 
+    /**
+     * Encodes the VlanId entity into JSON.
+     *
+     * @param vid VlanId to encode
+     * @param context encoding context
+     * @return JSON node
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ObjectNode encode(VlanId vid, CodecContext context) {
         return context.mapper().createObjectNode().put("vid", vid.toString());
     }
 
+    /**
+     * Encodes the collection of the VlanId entities.
+     *
+     * @param vids collection of VlanId to encode
+     * @param context  encoding context
+     * @return JSON array
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support encode operations
+     */
     @Override
     public ArrayNode encode(Iterable<VlanId> vids, CodecContext context) {
         ArrayNode an = context.mapper().createArrayNode();
-        vids.forEach(vid -> {
-            an.add(encode(vid, context));
-        });
+        vids.forEach(vid -> an.add(encode(vid, context)));
         return an;
     }
 
+    /**
+     * Decodes the VlanId entity from JSON.
+     *
+     * @param json    JSON to decode
+     * @param context decoding context
+     * @return decoded VlanId
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support decode operations
+     */
     @Override
     public VlanId decode(ObjectNode json, CodecContext context) {
         if (json == null || !json.isObject()) {
@@ -56,12 +82,21 @@
         JsonNode vidNode = json.get("vid");
 
         int vid = (nullIsIllegal(vidNode.asInt(), "vid is required"));
-        if (vid < 0 || vid > 4095) {
+        if (vid < 0 || vid > MAX_VLAN) {
             throw new IllegalArgumentException("VID values must be between 0 and 4095");
         }
         return VlanId.vlanId((short) vid);
     }
 
+    /**
+     * Decodes the VlanId JSON array into a collection of entities.
+     *
+     * @param json    JSON array to decode
+     * @param context decoding context
+     * @return collection of decoded VlanId
+     * @throws java.lang.UnsupportedOperationException if the codec does not
+     *                                                 support decode operations
+     */
     @Override
     public List<VlanId> decode(ArrayNode json, CodecContext context) {
         List<VlanId> vidList = new ArrayList<>();
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/soam/web/LossMeasurementThresholdCodec.java b/apps/cfm/nbi/src/main/java/org/onosproject/soam/web/LossMeasurementThresholdCodec.java
index 3a17f94..da87a82 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/soam/web/LossMeasurementThresholdCodec.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/soam/web/LossMeasurementThresholdCodec.java
@@ -29,6 +29,7 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.util.Tools.nullIsIllegal;
+
 import static org.onosproject.incubator.net.l2monitoring.soam.loss.DefaultLmThreshold.*;
 
 /**
@@ -131,7 +132,7 @@
         LossMeasurementThreshold.LmThresholdBuilder builder = builder(thresholdId);
 
         if (thrNode.get("thresholds") != null) {
-            context.codec(ThresholdOption.class)
+            context.codec(LossMeasurementThreshold.ThresholdOption.class)
                     .decode((ArrayNode) (thrNode.get("thresholds")), context)
                     .forEach(builder::addToThreshold);
         }
