diff --git a/core/api/src/main/java/org/onosproject/net/flow/criteria/ExtensionSelectorType.java b/core/api/src/main/java/org/onosproject/net/flow/criteria/ExtensionSelectorType.java
index 4664693..2e1f451 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/criteria/ExtensionSelectorType.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/criteria/ExtensionSelectorType.java
@@ -47,6 +47,8 @@
         OFDPA_MATCH_OVID(17),
         OFDPA_MATCH_MPLS_L2_PORT(18),
         EXT_MATCH_FLOW_TYPE(20),
+        OFDPA_MATCH_ACTSET_OUTPUT(19),
+        OFDPA_MATCH_ALLOW_VLAN_TRANSLATION(21),
 
         UNRESOLVED_TYPE(200);
 
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/ExtensionTreatmentType.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/ExtensionTreatmentType.java
index b626f19..4029bcf 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/ExtensionTreatmentType.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/ExtensionTreatmentType.java
@@ -73,7 +73,8 @@
         NICIRA_ENCAP_ETH_DST(122),
         NICIRA_ENCAP_ETH_TYPE(123),
         OPLINK_ATTENUATION(130),
-
+        OFDPA_ALLOW_VLAN_TRANSLATION(131),
+        ONF_COPY_FIELD(132),
         UNRESOLVED_TYPE(200);
 
         private ExtensionTreatmentType type;
diff --git a/drivers/default/src/main/java/org/onosproject/driver/DefaultCodecRegister.java b/drivers/default/src/main/java/org/onosproject/driver/DefaultCodecRegister.java
index 0c59d54..97f4c6a 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/DefaultCodecRegister.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/DefaultCodecRegister.java
@@ -30,12 +30,15 @@
 import org.onosproject.driver.extensions.NiciraSetNshSi;
 import org.onosproject.driver.extensions.NiciraSetNshSpi;
 import org.onosproject.driver.extensions.NiciraSetTunnelDst;
+import org.onosproject.driver.extensions.Ofdpa3CopyField;
 import org.onosproject.driver.extensions.Ofdpa3MatchMplsL2Port;
 import org.onosproject.driver.extensions.Ofdpa3MatchOvid;
 import org.onosproject.driver.extensions.Ofdpa3SetMplsL2Port;
 import org.onosproject.driver.extensions.Ofdpa3SetMplsType;
 import org.onosproject.driver.extensions.Ofdpa3SetOvid;
 import org.onosproject.driver.extensions.Ofdpa3SetQosIndex;
+import org.onosproject.driver.extensions.OfdpaMatchActsetOutput;
+import org.onosproject.driver.extensions.OfdpaMatchAllowVlanTranslation;
 import org.onosproject.driver.extensions.OfdpaMatchVlanVid;
 import org.onosproject.driver.extensions.OfdpaSetVlanVid;
 import org.onosproject.driver.extensions.OplinkAttenuation;
@@ -48,12 +51,15 @@
 import org.onosproject.driver.extensions.codec.NiciraSetNshSiCodec;
 import org.onosproject.driver.extensions.codec.NiciraSetNshSpiCodec;
 import org.onosproject.driver.extensions.codec.NiciraSetTunnelDstCodec;
+import org.onosproject.driver.extensions.codec.Ofdpa3CopyFieldCodec;
 import org.onosproject.driver.extensions.codec.Ofdpa3MatchMplsL2PortCodec;
 import org.onosproject.driver.extensions.codec.Ofdpa3MatchOvidCodec;
 import org.onosproject.driver.extensions.codec.Ofdpa3SetMplsL2PortCodec;
 import org.onosproject.driver.extensions.codec.Ofdpa3SetMplsTypeCodec;
 import org.onosproject.driver.extensions.codec.Ofdpa3SetOvidCodec;
 import org.onosproject.driver.extensions.codec.Ofdpa3SetQosIndexCodec;
+import org.onosproject.driver.extensions.codec.OfdpaMatchActsetOutputCodec;
+import org.onosproject.driver.extensions.codec.OfdpaMatchAllowVlanTranslationCodec;
 import org.onosproject.driver.extensions.codec.OfdpaMatchVlanVidCodec;
 import org.onosproject.driver.extensions.codec.OfdpaSetVlanVidCodec;
 import org.onosproject.driver.extensions.codec.OplinkAttenuationCodec;
@@ -85,6 +91,8 @@
         codecService.registerCodec(NiciraSetNshContextHeader.class, new NiciraSetNshContextHeaderCodec());
         codecService.registerCodec(OfdpaMatchVlanVid.class, new OfdpaMatchVlanVidCodec());
         codecService.registerCodec(OfdpaSetVlanVid.class, new OfdpaSetVlanVidCodec());
+        codecService.registerCodec(OfdpaMatchActsetOutput.class, new OfdpaMatchActsetOutputCodec());
+        codecService.registerCodec(OfdpaMatchAllowVlanTranslation.class, new OfdpaMatchAllowVlanTranslationCodec());
         codecService.registerCodec(Ofdpa3SetMplsType.class, new Ofdpa3SetMplsTypeCodec());
         codecService.registerCodec(Ofdpa3MatchOvid.class, new Ofdpa3MatchOvidCodec());
         codecService.registerCodec(Ofdpa3SetOvid.class, new Ofdpa3SetOvidCodec());
@@ -92,6 +100,7 @@
         codecService.registerCodec(Ofdpa3MatchMplsL2Port.class, new Ofdpa3MatchMplsL2PortCodec());
         codecService.registerCodec(Ofdpa3SetMplsL2Port.class, new Ofdpa3SetMplsL2PortCodec());
         codecService.registerCodec(OplinkAttenuation.class, new OplinkAttenuationCodec());
+        codecService.registerCodec(Ofdpa3CopyField.class, new Ofdpa3CopyFieldCodec());
         log.info("Registered default driver codecs.");
     }
 
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3AllowVlanTranslationType.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3AllowVlanTranslationType.java
new file mode 100644
index 0000000..e9ebacb
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3AllowVlanTranslationType.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.driver.extensions;
+
+public enum Ofdpa3AllowVlanTranslationType {
+    NOT_ALLOW((byte) 0),
+    ALLOW((byte) 1);
+
+    private byte value;
+
+    Ofdpa3AllowVlanTranslationType(byte value) {
+        this.value = value;
+    }
+
+    /*
+     * Get value as a byte.
+     */
+    public byte getValue() {
+        return this.value;
+    }
+}
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3CopyField.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3CopyField.java
new file mode 100644
index 0000000..8ec8869
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3CopyField.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.driver.extensions;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.net.flow.instructions.ExtensionTreatment;
+import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
+
+import java.util.Objects;
+
+/**
+ * OFDPA copy field extension instruction.
+ */
+public class Ofdpa3CopyField extends AbstractExtension implements ExtensionTreatment {
+    private int nBits;
+    private int srcOffset;
+    private int dstOffset;
+    private int src;
+    private int dst;
+
+    private static final KryoNamespace APPKRYO = new KryoNamespace.Builder()
+            .register(Ofdpa3AllowVlanTranslationType.class)
+            .build();
+
+    public Ofdpa3CopyField() {
+        nBits = 0;
+        srcOffset = 0;
+        dstOffset = 0;
+        // this default value corresponds to the vlan-id from ofdpa spec.
+        src = 0x80000c02;
+        // this default value corresponds to register 1 from ofdpa spec.
+        dst = 0x80010200;
+
+    }
+
+    public Ofdpa3CopyField(int nBits, int srcOffset, int dstOffset, int src, int dst) {
+        this.nBits = nBits;
+        this.srcOffset = srcOffset;
+        this.dstOffset = dstOffset;
+        this.src = src;
+        this.dst = dst;
+    }
+
+    /**
+     * Returns the nBits value.
+     * @return nBits value.
+     */
+    public int getnBits() {
+        return nBits;
+    }
+
+    /**
+     * Returns the srcOffset value.
+     * @return srcOffset value.
+     */
+    public int getSrcOffset() {
+        return srcOffset;
+    }
+
+    /**
+     * Returns the dstOffset value.
+     * @return dstOffset value.
+     */
+    public int getDstOffset() {
+        return dstOffset;
+    }
+
+    /**
+     * Returns the src value.
+     * @return src value.
+     */
+    public int getSrc() {
+        return src;
+    }
+
+    /**
+     * Returns the dst value.
+     * @return dst value.
+     */
+    public int getDst() {
+        return dst;
+    }
+
+    @Override
+    public ExtensionTreatmentType type() {
+        return ExtensionTreatmentType.ExtensionTreatmentTypes.ONF_COPY_FIELD.type();
+    }
+
+    @Override
+    public void deserialize(byte[] data) {
+    }
+
+    @Override
+    public byte[] serialize() {
+        return APPKRYO.serialize(this);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(this);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof Ofdpa3CopyField) {
+            Ofdpa3CopyField that = (Ofdpa3CopyField) obj;
+            return Objects.equals(nBits, that.nBits) &&
+                    Objects.equals(srcOffset, that.srcOffset) &&
+                    Objects.equals(dstOffset, that.dstOffset) &&
+                    Objects.equals(src, that.src) &&
+                    Objects.equals(dst, that.dst);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("nBits", nBits)
+                .add("srcOffset", Integer.toHexString(srcOffset))
+                .add("dstOffset", Integer.toHexString(dstOffset))
+                .add("src", Integer.toHexString(src))
+                .add("dst", Integer.toHexString(dst))
+                .toString();
+    }
+}
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionSelectorInterpreter.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionSelectorInterpreter.java
index 5ac9cf3..1431ca1 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionSelectorInterpreter.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionSelectorInterpreter.java
@@ -19,6 +19,7 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onlab.packet.VlanId;
 import org.onosproject.codec.CodecContext;
+import org.onosproject.net.PortNumber;
 import org.onosproject.net.behaviour.ExtensionSelectorResolver;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.net.flow.criteria.ExtensionSelector;
@@ -28,10 +29,13 @@
 import org.projectfloodlight.openflow.protocol.OFFactory;
 import org.projectfloodlight.openflow.protocol.match.MatchField;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxm;
+import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaActsetOutput;
+import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaAllowVlanTranslation;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaMplsL2Port;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaOvid;
 import org.projectfloodlight.openflow.types.U16;
 import org.projectfloodlight.openflow.types.U32;
+import org.projectfloodlight.openflow.types.U8;
 import org.slf4j.Logger;
 
 import static org.slf4j.LoggerFactory.getLogger;
@@ -50,6 +54,12 @@
             return true;
         } else if (extensionSelectorType.equals(ExtensionSelectorTypes.OFDPA_MATCH_MPLS_L2_PORT.type())) {
             return true;
+        } else if (extensionSelectorType.equals(
+                ExtensionSelectorType.ExtensionSelectorTypes.OFDPA_MATCH_ACTSET_OUTPUT.type())) {
+            return true;
+        } else if (extensionSelectorType.equals(
+                ExtensionSelectorTypes.OFDPA_MATCH_ALLOW_VLAN_TRANSLATION.type())) {
+            return true;
         }
         return false;
     }
@@ -82,7 +92,15 @@
             }
             throw new UnsupportedOperationException(
                         "Unexpected ExtensionSelector: " + extensionSelector.toString());
+        } else if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.OFDPA_MATCH_ACTSET_OUTPUT.type())) {
+            PortNumber port = ((OfdpaMatchActsetOutput) extensionSelector).port();
+            return factory.oxms().ofdpaActsetOutput(U32.of(port.toLong()));
+        } else if (type.equals(ExtensionSelectorTypes.OFDPA_MATCH_ALLOW_VLAN_TRANSLATION.type())) {
+            Short allowVlanTranslation =
+                    ((OfdpaMatchAllowVlanTranslation) extensionSelector).allowVlanTranslation();
+            return factory.oxms().ofdpaAllowVlanTranslation(U8.of(allowVlanTranslation));
         }
+
         throw new UnsupportedOperationException(
                 "Unexpected ExtensionSelector: " + extensionSelector.toString());
     }
@@ -123,7 +141,15 @@
                 throw new UnsupportedOperationException(
                         "Unexpected OXM: " + oxm.toString());
             }
+        } else if (oxm.getMatchField().equals(MatchField.OFDPA_ACTSET_OUTPUT)) {
+            U32 portNumberU32 = ((OFOxmOfdpaActsetOutput) oxm).getValue();
+            PortNumber portNumber = PortNumber.portNumber(portNumberU32.getValue());
+            return new OfdpaMatchActsetOutput(portNumber);
+        } else if (oxm.getMatchField().equals(MatchField.OFDPA_ALLOW_VLAN_TRANSLATION)) {
+            U8 value = ((OFOxmOfdpaAllowVlanTranslation) oxm).getValue();
+            return new OfdpaMatchAllowVlanTranslation(value.getValue());
         }
+
         throw new UnsupportedOperationException(
                 "Unexpected OXM: " + oxm.toString());
     }
@@ -134,7 +160,12 @@
             return new Ofdpa3MatchOvid();
         } else if (type.equals(ExtensionSelectorTypes.OFDPA_MATCH_MPLS_L2_PORT.type())) {
             return new Ofdpa3MatchMplsL2Port();
+        }  else if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.OFDPA_MATCH_ACTSET_OUTPUT.type())) {
+            return new OfdpaMatchActsetOutput();
+        } else if (type.equals(ExtensionSelectorTypes.OFDPA_MATCH_ALLOW_VLAN_TRANSLATION.type())) {
+            return new OfdpaMatchAllowVlanTranslation();
         }
+
         throw new UnsupportedOperationException(
                 "Driver does not support extension type " + type.toString());
     }
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionTreatmentInterpreter.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionTreatmentInterpreter.java
index 2a89b26..099f995 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionTreatmentInterpreter.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionTreatmentInterpreter.java
@@ -29,8 +29,11 @@
 import org.projectfloodlight.openflow.protocol.action.OFAction;
 import org.projectfloodlight.openflow.protocol.action.OFActionExperimenter;
 import org.projectfloodlight.openflow.protocol.action.OFActionOfdpa;
+import org.projectfloodlight.openflow.protocol.action.OFActionOnf;
+import org.projectfloodlight.openflow.protocol.action.OFActionOnfCopyField;
 import org.projectfloodlight.openflow.protocol.action.OFActionSetField;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxm;
+import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaAllowVlanTranslation;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaMplsL2Port;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaMplsType;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaOvid;
@@ -51,11 +54,12 @@
         implements ExtensionTreatmentInterpreter, ExtensionTreatmentResolver {
 
     private static final int TYPE_OFDPA = 0x1018;
+    private static final int TYPE_ONF = 0x4f4e4600;
     private static final int SUB_TYPE_PUSH_L2_HEADER = 1;
     private static final int SUB_TYPE_POP_L2_HEADER = 2;
     private static final int SUB_TYPE_PUSH_CW = 3;
     private static final int SUB_TYPE_POP_CW = 4;
-
+    private static final int SUB_TYPE_COPY_FIELD = 3200;
     private static final String TYPE = "type";
     private static final String MISSING_MEMBER_MESSAGE = " member is required in Ofdpa3ExtensionTreatmentInterpreter";
     private static final String MISSING_TREATMENT_MESSAGE = "Extension treatment cannot be null";
@@ -89,7 +93,14 @@
         } else if (extensionTreatmentType.equals(
                 ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_POP_CW.type())) {
             return true;
+        } else if (extensionTreatmentType.equals(
+                ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_ALLOW_VLAN_TRANSLATION.type())) {
+            return true;
+        } else if (extensionTreatmentType.equals(
+                ExtensionTreatmentType.ExtensionTreatmentTypes.ONF_COPY_FIELD.type())) {
+            return true;
         }
+
         return false;
     }
 
@@ -141,8 +152,25 @@
             return factory.actions().ofdpaPopL2Header();
         } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_POP_CW.type())) {
             return factory.actions().ofdpaPopCw();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_ALLOW_VLAN_TRANSLATION.type())) {
+            byte allow = ((OfdpaSetAllowVlanTranslation) extensionTreatment).getVlanTranslation();
+            return factory.actions().setField(factory.oxms().ofdpaAllowVlanTranslation(
+                    U8.ofRaw(allow)));
+       } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.ONF_COPY_FIELD.type())) {
+             Ofdpa3CopyField copyField = (Ofdpa3CopyField) extensionTreatment;
+
+             // this action uses the ONF experimenter id thus
+             // we differentiate here, but, we should treat the extensionTreatment
+             // as an ofdpa3 treatment, because it is ofdpa specific.
+            return factory.actions().buildOnfCopyField()
+                    .setDstOffset(copyField.getDstOffset())
+                    .setSrcOffset(copyField.getSrcOffset())
+                    .setNBits(copyField.getnBits())
+                    .setSrc(copyField.getSrc())
+                    .setDst(copyField.getDst())
+                    .build();
         }
-        throw new UnsupportedOperationException(
+            throw new UnsupportedOperationException(
                 "Unexpected ExtensionTreatment: " + extensionTreatment.toString());
     }
 
@@ -176,6 +204,13 @@
                         return new Ofdpa3SetQosIndex(qosIndex);
                     }
                     break;
+                case OFDPA_ALLOW_VLAN_TRANSLATION:
+                    OFOxmOfdpaAllowVlanTranslation allowVlanTranslation = (OFOxmOfdpaAllowVlanTranslation) oxm;
+                    Byte allowVlan = allowVlanTranslation.getValue().getRaw();
+                    if ((allowVlan == 0) || (allowVlan == 1)) {
+                        return new OfdpaSetAllowVlanTranslation(allowVlan);
+                    }
+                    break;
                 default:
                     throw new UnsupportedOperationException(
                             "Driver does not support extension type " + oxm.getMatchField().id);
@@ -197,6 +232,19 @@
                         throw new UnsupportedOperationException(
                                 "Unexpected OFAction: " + action.toString());
                 }
+            } else if (Long.valueOf(experimenter.getExperimenter()).intValue() == TYPE_ONF) {
+                OFActionOnf onf = (OFActionOnf) experimenter;
+                switch (onf.getExpType()) {
+                    case SUB_TYPE_COPY_FIELD:
+                        return new Ofdpa3CopyField(((OFActionOnfCopyField) onf).getNBits(),
+                                                   ((OFActionOnfCopyField) onf).getSrcOffset(),
+                                                   ((OFActionOnfCopyField) onf).getDstOffset(),
+                                                   (int) ((OFActionOnfCopyField) onf).getSrc(),
+                                                   (int) ((OFActionOnfCopyField) onf).getDst());
+                    default:
+                        throw new UnsupportedOperationException(
+                                "Unexpected OFAction: " + action.toString());
+                }
             }
             throw new UnsupportedOperationException(
                     "Unexpected OFAction: " + action.toString());
@@ -223,6 +271,10 @@
             return new Ofdpa3PopL2Header();
         } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_POP_CW.type())) {
             return new Ofdpa3PopCw();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_ALLOW_VLAN_TRANSLATION.type())) {
+            return new OfdpaSetAllowVlanTranslation();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.ONF_COPY_FIELD.type())) {
+            return new Ofdpa3CopyField();
         }
         throw new UnsupportedOperationException(NOT_SUPPORTED_MESSAGE + type.toString());
     }
@@ -257,8 +309,13 @@
             root.put(TYPE, ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_POP_L2_HEADER.name());
         } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_POP_CW.type())) {
             root.put(TYPE, ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_POP_CW.name());
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_ALLOW_VLAN_TRANSLATION.type())) {
+            root.put(TYPE, ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_ALLOW_VLAN_TRANSLATION.name());
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.ONF_COPY_FIELD.type())) {
+            root.put(TYPE, ExtensionTreatmentType.ExtensionTreatmentTypes.ONF_COPY_FIELD.name());
         }
 
+
         return root;
     }
 
@@ -286,6 +343,10 @@
             return new Ofdpa3PopL2Header();
         } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_POP_CW.name())) {
             return new Ofdpa3PopCw();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_ALLOW_VLAN_TRANSLATION.name())) {
+            return new OfdpaSetAllowVlanTranslation();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.ONF_COPY_FIELD.name())) {
+            return new Ofdpa3CopyField();
         } else {
             throw new UnsupportedOperationException(NOT_SUPPORTED_MESSAGE + type.toString());
         }
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/OfdpaExtensionSelectorInterpreter.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/OfdpaExtensionSelectorInterpreter.java
index 67f390a..1d64c31 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/extensions/OfdpaExtensionSelectorInterpreter.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/OfdpaExtensionSelectorInterpreter.java
@@ -13,10 +13,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.onosproject.driver.extensions;
 
 import org.onlab.packet.VlanId;
+import org.onosproject.net.PortNumber;
 import org.onosproject.net.behaviour.ExtensionSelectorResolver;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.net.flow.criteria.ExtensionSelector;
@@ -26,9 +26,13 @@
 import org.projectfloodlight.openflow.protocol.OFFactory;
 import org.projectfloodlight.openflow.protocol.match.MatchField;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxm;
+import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaActsetOutput;
+import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaAllowVlanTranslation;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmVlanVid;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmVlanVidMasked;
 import org.projectfloodlight.openflow.types.OFVlanVidMatch;
+import org.projectfloodlight.openflow.types.U32;
+import org.projectfloodlight.openflow.types.U8;
 import org.projectfloodlight.openflow.types.VlanVid;
 
 /**
@@ -41,6 +45,12 @@
     public boolean supported(ExtensionSelectorType extensionSelectorType) {
         if (extensionSelectorType.equals(ExtensionSelectorTypes.OFDPA_MATCH_VLAN_VID.type())) {
             return true;
+        } else if (extensionSelectorType.equals(
+                ExtensionSelectorType.ExtensionSelectorTypes.OFDPA_MATCH_ACTSET_OUTPUT.type())) {
+            return true;
+        } else if (extensionSelectorType.equals(
+                ExtensionSelectorTypes.OFDPA_MATCH_ALLOW_VLAN_TRANSLATION.type())) {
+            return true;
         }
         return false;
     }
@@ -61,6 +71,16 @@
             } else {
                 return factory.oxms().vlanVid(OFVlanVidMatch.ofVlanVid(VlanVid.ofVlan(vlanId.toShort())));
             }
+        } else if (type.equals(
+                ExtensionSelectorType.ExtensionSelectorTypes.OFDPA_MATCH_ACTSET_OUTPUT.type())) {
+            PortNumber port = ((OfdpaMatchActsetOutput) extensionSelector).port();
+            return factory.oxms().ofdpaActsetOutput(U32.of(port.toLong()));
+        } else if (type.equals(ExtensionSelectorTypes.OFDPA_MATCH_ALLOW_VLAN_TRANSLATION.type())) {
+
+            Short allowVlanTranslation =
+                    ((OfdpaMatchAllowVlanTranslation) extensionSelector).allowVlanTranslation();
+
+            return factory.oxms().ofdpaAllowVlanTranslation(U8.of(allowVlanTranslation));
         }
         throw new UnsupportedOperationException(
                 "Unexpected ExtensionSelector: " + extensionSelector.toString());
@@ -93,6 +113,13 @@
                 }
             }
             return new OfdpaMatchVlanVid(vlanId);
+        } else if (oxm.getMatchField().equals(MatchField.OFDPA_ACTSET_OUTPUT)) {
+            U32 portNumberU32 = ((OFOxmOfdpaActsetOutput) oxm).getValue();
+            PortNumber portNumber = PortNumber.portNumber(portNumberU32.getValue());
+            return new OfdpaMatchActsetOutput(portNumber);
+        } else if (oxm.getMatchField().equals(MatchField.OFDPA_ALLOW_VLAN_TRANSLATION)) {
+            U8 value = ((OFOxmOfdpaAllowVlanTranslation) oxm).getValue();
+            return new OfdpaMatchAllowVlanTranslation(value.getValue());
         }
         throw new UnsupportedOperationException(
                 "Unexpected OXM: " + oxm.toString());
@@ -102,6 +129,10 @@
     public ExtensionSelector getExtensionSelector(ExtensionSelectorType type) {
         if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.OFDPA_MATCH_VLAN_VID.type())) {
             return new OfdpaMatchVlanVid();
+        } else if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.OFDPA_MATCH_ACTSET_OUTPUT.type())) {
+            return new OfdpaMatchActsetOutput();
+        } else if (type.equals(ExtensionSelectorTypes.OFDPA_MATCH_ALLOW_VLAN_TRANSLATION.type())) {
+            return new OfdpaMatchAllowVlanTranslation();
         }
         throw new UnsupportedOperationException(
                 "Driver does not support extension type " + type.toString());
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/OfdpaMatchActsetOutput.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/OfdpaMatchActsetOutput.java
new file mode 100644
index 0000000..d645f12
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/OfdpaMatchActsetOutput.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.driver.extensions;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.net.flow.criteria.ExtensionSelector;
+import org.onosproject.net.flow.criteria.ExtensionSelectorType;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * OFDPA ACTSET_OUTPUT extension match.
+ */
+public class OfdpaMatchActsetOutput extends AbstractExtension implements ExtensionSelector {
+
+    private PortNumber port;
+    private static final KryoNamespace APPKRYO = new KryoNamespace.Builder()
+            .register(PortNumber.class)
+            .build();
+
+    /**
+     * OFDPA ACTSET_OUTPUT extension match.
+     */
+    public OfdpaMatchActsetOutput() {
+        this.port = null;
+    }
+
+    /**
+     * Constructs new ACTSET_OUTPUT match with given port number.
+     *
+     * @param port port number
+     */
+    public OfdpaMatchActsetOutput(PortNumber port) {
+        checkNotNull(port);
+        this.port = port;
+    }
+
+    /**
+     * Gets the port number.
+     *
+     * @return the port number
+     */
+    public PortNumber port() {
+        return port;
+    }
+
+    @Override
+    public ExtensionSelectorType type() {
+        return ExtensionSelectorType.ExtensionSelectorTypes.OFDPA_MATCH_ACTSET_OUTPUT.type();
+    }
+
+    @Override
+    public byte[] serialize() {
+        return APPKRYO.serialize(port);
+    }
+
+    @Override
+    public void deserialize(byte[] data) {
+        port = APPKRYO.deserialize(data);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(port);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj == null || !obj.getClass().equals(OfdpaMatchActsetOutput.class)) {
+            return false;
+        }
+
+        OfdpaMatchActsetOutput that = (OfdpaMatchActsetOutput) obj;
+        return port.equals(that.port());
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("port", port)
+                .toString();
+    }
+}
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/OfdpaMatchAllowVlanTranslation.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/OfdpaMatchAllowVlanTranslation.java
new file mode 100644
index 0000000..e5adc74
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/OfdpaMatchAllowVlanTranslation.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.driver.extensions;
+
+import org.onlab.util.KryoNamespace;
+import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.net.flow.criteria.ExtensionSelector;
+import org.onosproject.net.flow.criteria.ExtensionSelectorType;
+
+import java.util.Objects;
+
+/**
+ * OFDPA ALLOW_VLAN_TRANSLATION extension match.
+ */
+public class OfdpaMatchAllowVlanTranslation extends AbstractExtension implements ExtensionSelector {
+    private static final KryoNamespace APPKRYO = new KryoNamespace.Builder()
+            .register(Short.class)
+            .build();
+
+    private Short allowVlanTranslation;
+
+    /**
+     * OFDPA ALLOW_VLAN_TRANSLATION extension match.
+     */
+    public OfdpaMatchAllowVlanTranslation() {
+        allowVlanTranslation = 0;
+    }
+
+    /**
+     * Constructs new ALLOW_VLAN_TRANSLATION match with given boolean data.
+     *
+     * @param allowVlanTranslation allows vlan translation
+     */
+    public OfdpaMatchAllowVlanTranslation(Short allowVlanTranslation) {
+        this.allowVlanTranslation = allowVlanTranslation;
+    }
+
+    /**
+     * Gets allow vlan translation flag.
+     *
+     * @return allowVlanTranslation field
+     */
+    public Short allowVlanTranslation() {
+        return allowVlanTranslation;
+    }
+
+    @Override
+    public ExtensionSelectorType type() {
+        return ExtensionSelectorType.ExtensionSelectorTypes.OFDPA_MATCH_ALLOW_VLAN_TRANSLATION.type();
+    }
+
+    @Override
+    public byte[] serialize() {
+        return APPKRYO.serialize(allowVlanTranslation);
+    }
+
+    @Override
+    public void deserialize(byte[] data) {
+        allowVlanTranslation = APPKRYO.deserialize(data);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(allowVlanTranslation);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+
+        if (obj == null || !obj.getClass().equals(OfdpaMatchAllowVlanTranslation.class)) {
+            return false;
+        }
+
+        OfdpaMatchAllowVlanTranslation that = (OfdpaMatchAllowVlanTranslation) obj;
+        return that.allowVlanTranslation().equals(allowVlanTranslation);
+    }
+}
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/OfdpaSetAllowVlanTranslation.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/OfdpaSetAllowVlanTranslation.java
new file mode 100644
index 0000000..059e6b9
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/OfdpaSetAllowVlanTranslation.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.driver.extensions;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.net.flow.instructions.ExtensionTreatment;
+import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * OFDPA set Allow  Vlan Translation extension instruction.
+ */
+public class OfdpaSetAllowVlanTranslation extends AbstractExtension implements ExtensionTreatment {
+    private byte vlanTranslation;
+
+    private static final KryoNamespace APPKRYO = new KryoNamespace.Builder()
+            .register(Ofdpa3AllowVlanTranslationType.class)
+            .build();
+
+    protected OfdpaSetAllowVlanTranslation() {
+        vlanTranslation = Ofdpa3AllowVlanTranslationType.NOT_ALLOW.getValue();
+    }
+
+    public OfdpaSetAllowVlanTranslation(byte allow) {
+        checkNotNull(allow);
+        this.vlanTranslation = allow;
+    }
+
+    public OfdpaSetAllowVlanTranslation(Ofdpa3AllowVlanTranslationType allow) {
+        this.vlanTranslation = allow.getValue();
+    }
+
+    public byte getVlanTranslation() {
+        return vlanTranslation;
+    }
+
+    @Override
+    public ExtensionTreatmentType type() {
+        return ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_ALLOW_VLAN_TRANSLATION.type();
+    }
+
+    @Override
+    public void deserialize(byte[] data) {
+        vlanTranslation = APPKRYO.deserialize(data);
+    }
+
+    @Override
+    public byte[] serialize() {
+        return APPKRYO.serialize(vlanTranslation);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(vlanTranslation);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OfdpaSetAllowVlanTranslation) {
+            OfdpaSetAllowVlanTranslation that = (OfdpaSetAllowVlanTranslation) obj;
+            return Objects.equals(vlanTranslation, that.vlanTranslation);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("ofdpaSetAllowVlanTranslation", vlanTranslation)
+                .toString();
+    }
+}
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/Ofdpa3CopyFieldCodec.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/Ofdpa3CopyFieldCodec.java
new file mode 100644
index 0000000..999bb74
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/Ofdpa3CopyFieldCodec.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.driver.extensions.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.driver.extensions.Ofdpa3CopyField;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsIllegal;
+
+/**
+ * JSON Codec for Ofdpa copy field class.
+ */
+public class Ofdpa3CopyFieldCodec extends JsonCodec<Ofdpa3CopyField> {
+
+    private static final String N_BITS = "nBits";
+    private static final String SRC = "src";
+    private static final String DST = "dst";
+    private static final String SRC_OFFSET = "srcOffset";
+    private static final String DST_OFFSET = "dstOffset";
+
+    private static final String MISSING_MEMBER_MESSAGE = " member is required in Ofdpa3CopyField";
+    private static final String MISSING_COPY_FIELD_MESSAGE = "CopyField can not be null";
+
+    @Override
+    public ObjectNode encode(Ofdpa3CopyField copyField, CodecContext context) {
+        checkNotNull(copyField, MISSING_COPY_FIELD_MESSAGE);
+        return context.mapper().createObjectNode()
+                .put(N_BITS, copyField.getnBits())
+                .put(SRC_OFFSET, copyField.getSrcOffset())
+                .put(DST_OFFSET, copyField.getDstOffset())
+                .put(SRC, copyField.getSrc())
+                .put(DST, copyField.getDst());
+    }
+
+    @Override
+    public Ofdpa3CopyField decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        // parse members of copy field action
+        int nBits = (int) nullIsIllegal(json.get(N_BITS),
+                                        N_BITS + MISSING_MEMBER_MESSAGE).asInt();
+        int src = (int) nullIsIllegal(json.get(SRC),
+                                      SRC + MISSING_MEMBER_MESSAGE).asInt();
+        int dst = (int) nullIsIllegal(json.get(DST),
+                                      DST + MISSING_MEMBER_MESSAGE).asInt();
+        int srcOffset = (int) nullIsIllegal(json.get(SRC_OFFSET),
+                                            SRC_OFFSET + MISSING_MEMBER_MESSAGE).asInt();
+        int dstOffset = (int) nullIsIllegal(json.get(DST_OFFSET),
+                                            DST_OFFSET + MISSING_MEMBER_MESSAGE).asInt();
+        return new Ofdpa3CopyField(nBits, src, dst, srcOffset, dstOffset);
+    }
+}
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/OfdpaMatchActsetOutputCodec.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/OfdpaMatchActsetOutputCodec.java
new file mode 100644
index 0000000..cb051e4
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/OfdpaMatchActsetOutputCodec.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.driver.extensions.codec;
+
+import org.onosproject.driver.extensions.OfdpaMatchActsetOutput;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.net.PortNumber;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsIllegal;
+
+/**
+ * JSON Codec for Ofdpa match actset output class.
+ */
+public class OfdpaMatchActsetOutputCodec extends JsonCodec<OfdpaMatchActsetOutput> {
+
+    private static final String ACTSET_OUTPUT = "actsetOutput";
+    private static final String MISSING_MEMBER_MESSAGE = " member is required in OfdpaMatchActsetOutput";
+    private static final String MISSING_ACTSET_OUTPUT_MESSAGE = "Actset Output cannot be null";
+
+    @Override
+    public ObjectNode encode(OfdpaMatchActsetOutput actsetOutput, CodecContext context) {
+        checkNotNull(actsetOutput, MISSING_ACTSET_OUTPUT_MESSAGE);
+        return context.mapper().createObjectNode()
+                .put(ACTSET_OUTPUT, actsetOutput.port().toLong());
+    }
+
+    @Override
+    public OfdpaMatchActsetOutput decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        // parse ofdpa match actset output
+        long portNumber = nullIsIllegal(json.get(ACTSET_OUTPUT),
+                                              ACTSET_OUTPUT + MISSING_MEMBER_MESSAGE).asLong();
+        return new OfdpaMatchActsetOutput(PortNumber.portNumber(portNumber));
+    }
+}
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/OfdpaMatchAllowVlanTranslationCodec.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/OfdpaMatchAllowVlanTranslationCodec.java
new file mode 100644
index 0000000..c72aa2c
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/OfdpaMatchAllowVlanTranslationCodec.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.driver.extensions.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.driver.extensions.OfdpaMatchAllowVlanTranslation;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsIllegal;
+
+/**
+ * JSON Codec for Ofdpa match allow vlan translation class.
+ */
+public class OfdpaMatchAllowVlanTranslationCodec extends JsonCodec<OfdpaMatchAllowVlanTranslation> {
+
+    private static final String ALLOW_VLAN_TRANSLATION = "allowVlanTranslation";
+    private static final String MISSING_MEMBER_MESSAGE = " member is required in OfdpaMatchAllowVlanTranslation";
+    private static final String MISSING_ALLOW_VLAN_TRANSLATION_MESSAGE = "Allow Vlan Translation cannot be null";
+
+    @Override
+    public ObjectNode encode(OfdpaMatchAllowVlanTranslation allowVlanTranslation, CodecContext context) {
+        checkNotNull(allowVlanTranslation, MISSING_ALLOW_VLAN_TRANSLATION_MESSAGE);
+        return context.mapper().createObjectNode().put(ALLOW_VLAN_TRANSLATION,
+                                                       allowVlanTranslation.allowVlanTranslation());
+    }
+
+    @Override
+    public OfdpaMatchAllowVlanTranslation decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        // parse ofdpa match allow vlan translation
+        short allowVlanTranslation = (short) nullIsIllegal(json.get(ALLOW_VLAN_TRANSLATION),
+                                                           ALLOW_VLAN_TRANSLATION + MISSING_MEMBER_MESSAGE).asLong();
+        return new OfdpaMatchAllowVlanTranslation(allowVlanTranslation);
+    }
+}
diff --git a/lib/BUCK b/lib/BUCK
index 1302f55..c37f470 100644
--- a/lib/BUCK
+++ b/lib/BUCK
@@ -1,4 +1,4 @@
-# ***** This file was auto-generated at Wed, 4 Apr 2018 19:53:12 GMT. Do not edit this file manually. *****
+# ***** This file was auto-generated at Thu, 12 Apr 2018 17:32:52 GMT. Do not edit this file manually. *****
 # ***** Use onos-lib-gen *****
 
 pass_thru_pom(
@@ -963,10 +963,10 @@
 
 remote_jar (
   name = 'openflowj',
-  out = 'openflowj-3.2.0.onos.jar',
-  url = 'mvn:org.onosproject:openflowj:jar:3.2.0.onos',
-  sha1 = 'b890ecb2901912b9c7ededd1d1028fea73aa5db4',
-  maven_coords = 'org.onosproject:openflowj:3.2.0.onos',
+  out = 'openflowj-3.2.1.onos.jar',
+  url = 'mvn:org.onosproject:openflowj:jar:3.2.1.onos',
+  sha1 = '66544b285cddc8d53485107310f07b7bc90ac63b',
+  maven_coords = 'org.onosproject:openflowj:3.2.1.onos',
   visibility = [ 'PUBLIC' ],
 )
 
diff --git a/lib/deps.json b/lib/deps.json
index 8192ee7..ccf648d 100644
--- a/lib/deps.json
+++ b/lib/deps.json
@@ -200,7 +200,7 @@
     "netty-codec-http2": "mvn:io.netty:netty-codec-http2:4.1.8.Final",
     "netty-codec-http": "mvn:io.netty:netty-codec-http:4.1.8.Final",
     "objenesis": "mvn:org.objenesis:objenesis:2.6",
-    "openflowj": "mvn:org.onosproject:openflowj:3.2.0.onos",
+    "openflowj": "mvn:org.onosproject:openflowj:3.2.1.onos",
     "org.apache.felix.framework.security": "mvn:org.onosproject:org.apache.felix.framework.security:jar:2.2.0.onos",
     "org.apache.felix.scr": "mvn:org.apache.felix:org.apache.felix.scr:1.8.2",
     "org.apache.felix.scr.annotations": "mvn:org.apache.felix:org.apache.felix.scr.annotations:1.9.12",
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/util/FlowEntryBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/util/FlowEntryBuilder.java
index a71d440..cb9568b 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/util/FlowEntryBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/util/FlowEntryBuilder.java
@@ -798,6 +798,7 @@
         case OFDPA_MPLS_TYPE:
         case OFDPA_OVID:
         case OFDPA_MPLS_L2_PORT:
+        case OFDPA_ALLOW_VLAN_TRANSLATION:
         case OFDPA_QOS_INDEX:
             if (treatmentInterpreter != null) {
                 try {
@@ -1277,6 +1278,31 @@
                     }
                 }
                 break;
+                case OFDPA_ALLOW_VLAN_TRANSLATION:
+                    if (selectorInterpreter != null &&
+                            selectorInterpreter.supported(
+                                    ExtensionSelectorTypes.OFDPA_MATCH_ALLOW_VLAN_TRANSLATION.type())) {
+                        if (isOF13OrLater(match)) {
+                            OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.OFDPA_ALLOW_VLAN_TRANSLATION);
+                            builder.extension(selectorInterpreter.mapOxm(oxm),
+                                              deviceId);
+                        } else {
+                            break;
+                        }
+                    }
+                    break;
+                case OFDPA_ACTSET_OUTPUT:
+                    if (selectorInterpreter != null &&
+                            selectorInterpreter.supported(ExtensionSelectorTypes.OFDPA_MATCH_ACTSET_OUTPUT.type())) {
+                        if (isOF13OrLater(match)) {
+                            OFOxm oxm = ((OFMatchV3) match).getOxmList().get(MatchField.OFDPA_ACTSET_OUTPUT);
+                            builder.extension(selectorInterpreter.mapOxm(oxm),
+                                              deviceId);
+                        } else {
+                            break;
+                        }
+                    }
+                    break;
             case MPLS_TC:
             default:
                 log.warn("Match type {} not yet implemented.", field.id);
