diff --git a/core/common/src/main/java/org/onosproject/codec/impl/DecodeInstructionCodecHelper.java b/core/common/src/main/java/org/onosproject/codec/impl/DecodeInstructionCodecHelper.java
index 5e69b0e..316e9d24 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/DecodeInstructionCodecHelper.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/DecodeInstructionCodecHelper.java
@@ -76,7 +76,8 @@
      * @throws IllegalArgumentException if the JSON is invalid
      */
     private Instruction decodeL2() {
-        String subType = json.get(InstructionCodec.SUBTYPE).asText();
+        String subType = nullIsIllegal(json.get(InstructionCodec.SUBTYPE),
+                InstructionCodec.SUBTYPE + InstructionCodec.ERROR_MESSAGE).asText();
 
         if (subType.equals(L2ModificationInstruction.L2SubType.ETH_SRC.name())) {
             String mac = nullIsIllegal(json.get(InstructionCodec.MAC),
@@ -124,7 +125,8 @@
      * @throws IllegalArgumentException if the JSON is invalid
      */
     private Instruction decodeL3() {
-        String subType = json.get(InstructionCodec.SUBTYPE).asText();
+        String subType = nullIsIllegal(json.get(InstructionCodec.SUBTYPE),
+                InstructionCodec.SUBTYPE + InstructionCodec.ERROR_MESSAGE).asText();
 
         if (subType.equals(L3ModificationInstruction.L3SubType.IPV4_SRC.name())) {
             IpAddress ip = IpAddress.valueOf(nullIsIllegal(json.get(InstructionCodec.IP),
@@ -158,7 +160,8 @@
      * @throws IllegalArgumentException if the JSON is invalid
      */
     private Instruction decodeL0() {
-        String subType = json.get(InstructionCodec.SUBTYPE).asText();
+        String subType = nullIsIllegal(json.get(InstructionCodec.SUBTYPE),
+                InstructionCodec.SUBTYPE + InstructionCodec.ERROR_MESSAGE).asText();
 
         if (subType.equals(L0ModificationInstruction.L0SubType.OCH.name())) {
             String gridTypeString = nullIsIllegal(json.get(InstructionCodec.GRID_TYPE),
@@ -193,7 +196,8 @@
      * @throws IllegalArgumentException if the JSON is invalid
      */
     private Instruction decodeL1() {
-        String subType = json.get(InstructionCodec.SUBTYPE).asText();
+        String subType = nullIsIllegal(json.get(InstructionCodec.SUBTYPE),
+                InstructionCodec.SUBTYPE + InstructionCodec.ERROR_MESSAGE).asText();
         if (subType.equals(L1ModificationInstruction.L1SubType.ODU_SIGID.name())) {
             int tributaryPortNumber = nullIsIllegal(json.get(InstructionCodec.TRIBUTARY_PORT_NUMBER),
                     InstructionCodec.TRIBUTARY_PORT_NUMBER + InstructionCodec.MISSING_MEMBER_MESSAGE).asInt();
@@ -217,7 +221,8 @@
      * @throws IllegalArgumentException if the JSON is invalid
      */
     private Instruction decodeL4() {
-        String subType = json.get(InstructionCodec.SUBTYPE).asText();
+        String subType = nullIsIllegal(json.get(InstructionCodec.SUBTYPE),
+                InstructionCodec.SUBTYPE + InstructionCodec.ERROR_MESSAGE).asText();
 
         if (subType.equals(L4ModificationInstruction.L4SubType.TCP_DST.name())) {
             TpPort tcpPort = TpPort.tpPort(nullIsIllegal(json.get(InstructionCodec.TCP_PORT),
@@ -292,19 +297,15 @@
      */
     private PortNumber getPortNumber(ObjectNode jsonNode) {
         PortNumber portNumber;
-        if (jsonNode.get(InstructionCodec.PORT).isLong() || jsonNode.get(InstructionCodec.PORT).isInt()) {
-            portNumber = PortNumber
-                    .portNumber(nullIsIllegal(jsonNode.get(InstructionCodec.PORT)
-                            .asLong(), InstructionCodec.PORT
-                            + InstructionCodec.MISSING_MEMBER_MESSAGE));
-        } else if (jsonNode.get(InstructionCodec.PORT).isTextual()) {
-            portNumber = PortNumber
-                    .fromString(nullIsIllegal(jsonNode.get(InstructionCodec.PORT)
-                            .textValue(), InstructionCodec.PORT
-                            + InstructionCodec.MISSING_MEMBER_MESSAGE));
+        JsonNode portNode = nullIsIllegal(jsonNode.get(InstructionCodec.PORT),
+                InstructionCodec.PORT + InstructionCodec.ERROR_MESSAGE);
+        if (portNode.isLong() || portNode.isInt()) {
+            portNumber = PortNumber.portNumber(portNode.asLong());
+        } else if (portNode.isTextual()) {
+            portNumber = PortNumber.fromString(portNode.textValue());
         } else {
             throw new IllegalArgumentException("Port value "
-                    + jsonNode.get(InstructionCodec.PORT).toString()
+                    + portNode.toString()
                     + " is not supported");
         }
         return portNumber;
@@ -317,26 +318,27 @@
      * @throws IllegalArgumentException if the JSON is invalid
      */
     public Instruction decode() {
-        String type = json.get(InstructionCodec.TYPE).asText();
+        String type = nullIsIllegal(json.get(InstructionCodec.TYPE),
+                InstructionCodec.TYPE + InstructionCodec.ERROR_MESSAGE).asText();
 
         if (type.equals(Instruction.Type.OUTPUT.name())) {
             return Instructions.createOutput(getPortNumber(json));
         } else if (type.equals(Instruction.Type.NOACTION.name())) {
             return Instructions.createNoAction();
         } else if (type.equals(Instruction.Type.TABLE.name())) {
-            return Instructions.transition(nullIsIllegal(json.get(InstructionCodec.TABLE_ID)
-                    .asInt(), InstructionCodec.TABLE_ID + InstructionCodec.MISSING_MEMBER_MESSAGE));
+            return Instructions.transition(nullIsIllegal(json.get(InstructionCodec.TABLE_ID),
+                    InstructionCodec.TABLE_ID + InstructionCodec.MISSING_MEMBER_MESSAGE).asInt());
         } else if (type.equals(Instruction.Type.GROUP.name())) {
-            GroupId groupId = new DefaultGroupId(nullIsIllegal(json.get(InstructionCodec.GROUP_ID)
-                    .asInt(), InstructionCodec.GROUP_ID + InstructionCodec.MISSING_MEMBER_MESSAGE));
+            GroupId groupId = new DefaultGroupId(nullIsIllegal(json.get(InstructionCodec.GROUP_ID),
+                    InstructionCodec.GROUP_ID + InstructionCodec.MISSING_MEMBER_MESSAGE).asInt());
             return Instructions.createGroup(groupId);
         } else if (type.equals(Instruction.Type.METER.name())) {
-            MeterId meterId = MeterId.meterId(nullIsIllegal(json.get(InstructionCodec.METER_ID)
-                    .asLong(), InstructionCodec.METER_ID + InstructionCodec.MISSING_MEMBER_MESSAGE));
+            MeterId meterId = MeterId.meterId(nullIsIllegal(json.get(InstructionCodec.METER_ID),
+                    InstructionCodec.METER_ID + InstructionCodec.MISSING_MEMBER_MESSAGE).asLong());
             return Instructions.meterTraffic(meterId);
         } else if (type.equals(Instruction.Type.QUEUE.name())) {
-            long queueId = nullIsIllegal(json.get(InstructionCodec.QUEUE_ID)
-                    .asLong(), InstructionCodec.QUEUE_ID + InstructionCodec.MISSING_MEMBER_MESSAGE);
+            long queueId = nullIsIllegal(json.get(InstructionCodec.QUEUE_ID),
+                    InstructionCodec.QUEUE_ID + InstructionCodec.MISSING_MEMBER_MESSAGE).asLong();
             return Instructions.setQueue(queueId, getPortNumber(json));
         } else if (type.equals(Instruction.Type.L0MODIFICATION.name())) {
             return decodeL0();
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/InstructionCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/InstructionCodec.java
index 9da240d..3078fa8 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/InstructionCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/InstructionCodec.java
@@ -62,6 +62,8 @@
 
     protected static final String MISSING_MEMBER_MESSAGE =
             " member is required in Instruction";
+    protected static final String ERROR_MESSAGE =
+            " not specified in Instruction";
 
 
     @Override
