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 05c943c..388d0e6 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
@@ -26,11 +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.OFOxmOfdpaMplsL2Port;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaOvid;
 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.U16;
+import org.projectfloodlight.openflow.types.U32;
 import org.projectfloodlight.openflow.types.VlanVid;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,6 +51,8 @@
             return true;
         } else if (extensionSelectorType.equals(ExtensionSelectorTypes.OFDPA_MATCH_OVID.type())) {
             return true;
+        } else if (extensionSelectorType.equals(ExtensionSelectorTypes.OFDPA_MATCH_MPLS_L2_PORT.type())) {
+            return true;
         }
         return false;
     }
@@ -82,6 +86,18 @@
                 short oVid = (short) (mask | vlanId.toShort());
                 return factory.oxms().ofdpaOvid(U16.ofRaw(oVid));
             }
+        } else if (type.equals(ExtensionSelectorTypes.OFDPA_MATCH_MPLS_L2_PORT.type())) {
+            int mplsL2Port = ((Ofdpa3MatchMplsL2Port) extensionSelector).mplsL2Port();
+            /*
+             * 0x0000XXXX UNI Interface.
+             * 0x0002XXXX NNI Interface
+             */
+            if ((mplsL2Port >= 0 && mplsL2Port <= 0x0000FFFF) ||
+                    (mplsL2Port >= 0x00020000 && mplsL2Port <= 0x0002FFFF)) {
+                return factory.oxms().ofdpaMplsL2Port(U32.ofRaw(mplsL2Port));
+            }
+            throw new UnsupportedOperationException(
+                        "Unexpected ExtensionSelector: " + extensionSelector.toString());
         }
         throw new UnsupportedOperationException(
                 "Unexpected ExtensionSelector: " + extensionSelector.toString());
@@ -126,6 +142,28 @@
                 vlanId = VlanId.vlanId(oVid);
                 }
             return new Ofdpa3MatchOvid(vlanId);
+        } else if (oxm.getMatchField().equals(MatchField.OFDPA_MPLS_L2_PORT)) {
+            Integer mplsL2Port;
+            /*
+             * Supported but not used for now.
+             */
+            if (oxm.isMasked()) {
+                throw new UnsupportedOperationException(
+                        "Unexpected OXM: " + oxm.toString());
+            } else {
+                OFOxmOfdpaMplsL2Port mplsl2port = ((OFOxmOfdpaMplsL2Port) oxm);
+                mplsL2Port = mplsl2port.getValue().getRaw();
+                /*
+                 * 0x0000XXXX UNI Interface.
+                 * 0x0002XXXX NNI Interface
+                 */
+                if ((mplsL2Port >= 0 && mplsL2Port <= 0x0000FFFF) ||
+                        (mplsL2Port >= 0x00020000 && mplsL2Port <= 0x0002FFFF)) {
+                    return new Ofdpa3MatchMplsL2Port(mplsL2Port);
+                }
+                throw new UnsupportedOperationException(
+                        "Unexpected OXM: " + oxm.toString());
+            }
         }
         throw new UnsupportedOperationException(
                 "Unexpected OXM: " + oxm.toString());
@@ -137,6 +175,8 @@
             return new OfdpaMatchVlanVid();
         } else if (type.equals(ExtensionSelectorTypes.OFDPA_MATCH_OVID.type())) {
             return new Ofdpa3MatchOvid();
+        } else if (type.equals(ExtensionSelectorTypes.OFDPA_MATCH_MPLS_L2_PORT.type())) {
+            return new Ofdpa3MatchMplsL2Port();
         }
         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 afdb29f..c449702 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
@@ -27,9 +27,11 @@
 import org.projectfloodlight.openflow.protocol.action.OFAction;
 import org.projectfloodlight.openflow.protocol.action.OFActionSetField;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxm;
+import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaMplsL2Port;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaMplsType;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaOvid;
 import org.projectfloodlight.openflow.types.U16;
+import org.projectfloodlight.openflow.types.U32;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -49,6 +51,9 @@
         } else if (extensionTreatmentType.equals(
                 ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_OVID.type())) {
             return true;
+        } else if (extensionTreatmentType.equals(
+                ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_MPLS_L2_PORT.type())) {
+            return true;
         }
         return false;
     }
@@ -67,6 +72,20 @@
             short oVid = (short) (mask | vlanId.toShort());
             return factory.actions().setField(factory.oxms().ofdpaOvid(
                     U16.ofRaw(oVid)));
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_MPLS_L2_PORT.type())) {
+            Integer mplsL2Port = ((Ofdpa3SetMplsL2Port) extensionTreatment).mplsL2Port();
+            /*
+             * 0x0000XXXX UNI Interface.
+             * 0x0002XXXX NNI Interface
+             */
+            if ((mplsL2Port >= 0 && mplsL2Port <= 0x0000FFFF) ||
+                    (mplsL2Port >= 0x00020000 && mplsL2Port <= 0x0002FFFF)) {
+                return factory.actions().setField(
+                        factory.oxms().ofdpaMplsL2Port(U32.ofRaw(mplsL2Port))
+                );
+            }
+            throw new UnsupportedOperationException(
+                    "Unexpected ExtensionTreatment: " + extensionTreatment.toString());
         }
         throw new UnsupportedOperationException(
                 "Unexpected ExtensionTreatment: " + extensionTreatment.toString());
@@ -87,6 +106,13 @@
                     short oVid = (short) (mask & ovid.getValue().getRaw());
                     VlanId vlanId = VlanId.vlanId(oVid);
                     return new Ofdpa3SetOvid(vlanId);
+                case OFDPA_MPLS_L2_PORT:
+                    OFOxmOfdpaMplsL2Port mplsl2Port = ((OFOxmOfdpaMplsL2Port) oxm);
+                    Integer mplsL2Port = mplsl2Port.getValue().getRaw();
+                    if ((mplsL2Port >= 0 && mplsL2Port <= 0x0000FFFF) ||
+                            (mplsL2Port >= 0x00020000 && mplsL2Port <= 0x0002FFFF)) {
+                        return new Ofdpa3SetMplsL2Port(mplsL2Port);
+                    }
                 default:
                     throw new UnsupportedOperationException(
                             "Driver does not support extension type " + oxm.getMatchField().id);
@@ -102,6 +128,8 @@
             return new Ofdpa3SetMplsType();
         } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_OVID.type())) {
             return new Ofdpa3SetOvid();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_MPLS_L2_PORT.type())) {
+            return new Ofdpa3SetMplsL2Port();
         }
         throw new UnsupportedOperationException(
                 "Driver does not support extension type " + type.toString());
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3MatchMplsL2Port.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3MatchMplsL2Port.java
new file mode 100644
index 0000000..6213120
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3MatchMplsL2Port.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.criteria.ExtensionSelector;
+import org.onosproject.net.flow.criteria.ExtensionSelectorType;
+
+import java.util.Objects;
+
+/**
+ * OFDPA MPLS L2 Port extension match. MPLS L2 Port
+ * is a logical port and it is represented with an
+ * integer.
+ */
+public class Ofdpa3MatchMplsL2Port extends AbstractExtension implements ExtensionSelector {
+    /**
+     * Integer representing the logical port.
+     */
+    private int mplsL2Port;
+
+    private static final KryoNamespace APPKRYO = new KryoNamespace.Builder()
+            .build();
+
+    /**
+     * OFDPA MPLS L2 Port extension match.
+     */
+    protected Ofdpa3MatchMplsL2Port() {
+        mplsL2Port = 0;
+    }
+
+    /**
+     * Constructs a new MPLS L2 Port match with a given Integer.
+     *
+     * @param mplsl2port the MPLS L2 Port
+     */
+    public Ofdpa3MatchMplsL2Port(int mplsl2port) {
+        this.mplsL2Port = mplsl2port;
+    }
+
+    /**
+     * Gets the MPLS L2 Port.
+     *
+     * @return MPLS L2 Port
+     */
+    public int mplsL2Port() {
+        return mplsL2Port;
+    }
+
+    @Override
+    public ExtensionSelectorType type() {
+        return ExtensionSelectorType.ExtensionSelectorTypes.OFDPA_MATCH_MPLS_L2_PORT.type();
+    }
+
+    @Override
+    public byte[] serialize() {
+        return APPKRYO.serialize(mplsL2Port);
+    }
+
+    @Override
+    public void deserialize(byte[] data) {
+        mplsL2Port = APPKRYO.deserialize(data);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mplsL2Port);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof Ofdpa3MatchMplsL2Port) {
+            Ofdpa3MatchMplsL2Port that = (Ofdpa3MatchMplsL2Port) obj;
+            return Objects.equals(mplsL2Port, that.mplsL2Port);
+
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("mplsL2Port", mplsL2Port)
+                .toString();
+    }
+}
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3MplsType.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3MplsType.java
index b4a9c56..84677c9 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3MplsType.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3MplsType.java
@@ -39,7 +39,7 @@
     /**
      * L3 unicast.
      */
-    L3_UNICAST ((short) 8),
+    L3_UNICAST((short) 8),
     /**
      * L3 multicast.
      */
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3SetMplsL2Port.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3SetMplsL2Port.java
new file mode 100644
index 0000000..7073b15
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3SetMplsL2Port.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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 set MPLS L2 Port extension instruction.
+ */
+public class Ofdpa3SetMplsL2Port extends AbstractExtension implements ExtensionTreatment {
+    /**
+     * Integer representing the logical port.
+     */
+    private int mplsL2Port;
+
+    private static final KryoNamespace APPKRYO = new KryoNamespace.Builder()
+            .build();
+
+    /**
+     * Constructs a new set MPLS L2 Port instruction.
+     */
+    protected Ofdpa3SetMplsL2Port() {
+        mplsL2Port = 0;
+    }
+
+    /**
+     * Constructs a new set MPLS L2 Port instruction with a given integer.
+     *
+     * @param mplsl2port the MPLS L2 Port
+     */
+    public Ofdpa3SetMplsL2Port(Integer mplsl2port) {
+        this.mplsL2Port = mplsl2port;
+    }
+
+    /**
+     * Gets the MPLS L2 Port.
+     *
+     * @return MPLS L2 Port
+     */
+    public int mplsL2Port() {
+        return mplsL2Port;
+    }
+
+    @Override
+    public ExtensionTreatmentType type() {
+        return ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_MPLS_L2_PORT.type();
+    }
+
+    @Override
+    public void deserialize(byte[] data) {
+        mplsL2Port = APPKRYO.deserialize(data);
+    }
+
+    @Override
+    public byte[] serialize() {
+        return APPKRYO.serialize(mplsL2Port);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mplsL2Port);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof Ofdpa3SetMplsL2Port) {
+            Ofdpa3SetMplsL2Port that = (Ofdpa3SetMplsL2Port) obj;
+            return Objects.equals(mplsL2Port, that.mplsL2Port);
+
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("mplsL2Port", mplsL2Port)
+                .toString();
+    }
+}
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/Ofdpa3MatchMplsL2PortCodec.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/Ofdpa3MatchMplsL2PortCodec.java
new file mode 100644
index 0000000..b32bd14
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/Ofdpa3MatchMplsL2PortCodec.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.Ofdpa3MatchMplsL2Port;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsIllegal;
+
+/**
+ * JSON Codec for Ofdpa match mpls l2 port class.
+ */
+public class Ofdpa3MatchMplsL2PortCodec extends JsonCodec<Ofdpa3MatchMplsL2Port> {
+
+    private static final String MPLS_L2_PORT = "mplsL2Port";
+    private static final String MISSING_MEMBER_MESSAGE = " member is required in Ofdpa3MatchMplsL2Port";
+    private static final String MISSING_MPLS_L2_PORT_MESSAGE = "MPLS L2 Port cannot be null";
+
+    @Override
+    public ObjectNode encode(Ofdpa3MatchMplsL2Port matchMplsL2Port, CodecContext context) {
+        checkNotNull(matchMplsL2Port, MISSING_MPLS_L2_PORT_MESSAGE);
+        return context.mapper().createObjectNode()
+                .put(MPLS_L2_PORT, matchMplsL2Port.mplsL2Port());
+    }
+
+    @Override
+    public Ofdpa3MatchMplsL2Port decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        // parse ofdpa match mpls l2 port
+        int mplsL2Port = (int) nullIsIllegal(json.get(MPLS_L2_PORT),
+                MPLS_L2_PORT + MISSING_MEMBER_MESSAGE).asInt();
+        return new Ofdpa3MatchMplsL2Port(mplsL2Port);
+    }
+}
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/Ofdpa3SetMplsL2PortCodec.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/Ofdpa3SetMplsL2PortCodec.java
new file mode 100644
index 0000000..9329a50
--- /dev/null
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/codec/Ofdpa3SetMplsL2PortCodec.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.Ofdpa3SetMplsL2Port;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsIllegal;
+
+/**
+ * JSON Codec for Ofdpa set ovid class.
+ */
+public class Ofdpa3SetMplsL2PortCodec extends JsonCodec<Ofdpa3SetMplsL2Port> {
+
+    private static final String MPLS_L2_PORT = "mplsL2Port";
+    private static final String MISSING_MEMBER_MESSAGE = " member is required in Ofdpa3SetMplsL2Port";
+    private static final String MISSING_MPLS_L2_PORT_MESSAGE = "MPLS_L2_PORT cannot be null";
+
+    @Override
+    public ObjectNode encode(Ofdpa3SetMplsL2Port setMplsL2Port, CodecContext context) {
+        checkNotNull(setMplsL2Port, MISSING_MPLS_L2_PORT_MESSAGE);
+        return context.mapper().createObjectNode()
+                .put(MPLS_L2_PORT, setMplsL2Port.mplsL2Port());
+    }
+
+    @Override
+    public Ofdpa3SetMplsL2Port decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        // parse ofdpa action set mpls l2 port
+        int mplsL2Port = (int) nullIsIllegal(json.get(MPLS_L2_PORT),
+                MPLS_L2_PORT + MISSING_MEMBER_MESSAGE).asInt();
+        return new Ofdpa3SetMplsL2Port(mplsL2Port);
+    }
+}
