diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/AbstractCriterionTranslator.java b/core/net/src/main/java/org/onosproject/net/pi/impl/AbstractCriterionTranslator.java
index 19e4c3a..d403ec1 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/AbstractCriterionTranslator.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/AbstractCriterionTranslator.java
@@ -47,9 +47,9 @@
      */
     void initAsExactMatch(ImmutableByteSequence value, int bitWidth)
             throws ByteSequenceTrimException {
+        this.initType = PiMatchType.EXACT;
         this.value = fit(value, bitWidth);
         this.bitWidth = bitWidth;
-        this.initType = PiMatchType.EXACT;
     }
 
     /**
@@ -62,10 +62,10 @@
      */
     void initAsTernaryMatch(ImmutableByteSequence value, ImmutableByteSequence mask, int bitWidth)
             throws ByteSequenceTrimException {
+        this.initType = PiMatchType.TERNARY;
         this.value = fit(value, bitWidth);
         this.mask = fit(mask, bitWidth);
         this.bitWidth = bitWidth;
-        this.initType = PiMatchType.TERNARY;
     }
 
     /**
@@ -78,10 +78,19 @@
      */
     void initAsLpm(ImmutableByteSequence value, int prefixLength, int bitWidth)
             throws ByteSequenceTrimException {
+        this.initType = PiMatchType.LPM;
         this.value = fit(value, bitWidth);
         this.prefixLength = prefixLength;
         this.bitWidth = bitWidth;
-        this.initType = PiMatchType.LPM;
+    }
+
+    /**
+     * Computes the prefix padding size (in bits) based on value and bit width.
+     *
+     * @return prefix padding in bits
+     */
+    private int prefixPadding() {
+        return value.size() * Byte.SIZE - this.bitWidth;
     }
 
     @Override
@@ -112,7 +121,7 @@
     public Pair<ImmutableByteSequence, ImmutableByteSequence> ternaryMatch() {
         switch (initType) {
             case EXACT:
-                mask = ImmutableByteSequence.ofOnes(value.size());
+                mask = ImmutableByteSequence.prefixZeros(value.size(), prefixPadding());
                 break;
             case TERNARY:
                 break;
diff --git a/core/net/src/test/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorTest.java b/core/net/src/test/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorTest.java
index d5c880b..0423331 100644
--- a/core/net/src/test/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorTest.java
+++ b/core/net/src/test/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorTest.java
@@ -53,6 +53,8 @@
 public class PiFlowRuleTranslatorTest {
 
     private static final String BMV2_JSON_PATH = "/org/onosproject/net/pi/impl/default.json";
+    private static final short IN_PORT_MASK = 0x01ff; // 9-bit mask
+    private static final short ETH_TYPE_MASK = (short) 0xffff;
 
     private Random random = new Random();
     private PiPipeconf pipeconf;
@@ -138,12 +140,20 @@
         // check that values stored in entry are the same used for the flow rule
         assertThat("Incorrect inPort match param value",
                    inPortParam.value().asReadOnlyBuffer().getShort(), is(equalTo(inPort)));
+        assertThat("Incorrect inPort match param mask",
+                   inPortParam.mask().asReadOnlyBuffer().getShort(), is(equalTo(IN_PORT_MASK)));
         assertThat("Incorrect ethDestMac match param value",
                    ethDstParam.value().asArray(), is(equalTo(ethDstMac.toBytes())));
+        assertThat("Incorrect ethDestMac match param mask",
+                   ethDstParam.mask().asArray(), is(equalTo(MacAddress.BROADCAST.toBytes())));
         assertThat("Incorrect ethSrcMac match param value",
                    ethSrcParam.value().asArray(), is(equalTo(ethSrcMac.toBytes())));
+        assertThat("Incorrect ethSrcMac match param mask",
+                   ethSrcParam.mask().asArray(), is(equalTo(MacAddress.BROADCAST.toBytes())));
         assertThat("Incorrect ethType match param value",
                    ethTypeParam.value().asReadOnlyBuffer().getShort(), is(equalTo(ethType)));
+        assertThat("Incorrect ethType match param mask",
+                   ethTypeParam.mask().asReadOnlyBuffer().getShort(), is(equalTo(ETH_TYPE_MASK)));
         assertThat("Incorrect priority value",
                    entry1.priority().get(), is(equalTo(Integer.MAX_VALUE - rule1.priority())));
         assertThat("Incorrect timeout value",
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DefaultInterpreter.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DefaultInterpreter.java
index aef0719..fa6a8ea 100644
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DefaultInterpreter.java
+++ b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DefaultInterpreter.java
@@ -103,7 +103,7 @@
                 Instructions.OutputInstruction outInstruction = (Instructions.OutputInstruction) instruction;
                 PortNumber port = outInstruction.port();
                 if (!port.isLogical()) {
-                    PiAction.builder()
+                    return PiAction.builder()
                             .withId(PiActionId.of(SET_EGRESS_PORT))
                             .withParameter(new PiActionParam(PiActionParamId.of(PORT),
                                     ImmutableByteSequence.copyFrom(port.toLong())))
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/TableEntryEncoder.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/TableEntryEncoder.java
index 9218f94..6b345eb 100644
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/TableEntryEncoder.java
+++ b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/TableEntryEncoder.java
@@ -146,7 +146,7 @@
         tableEntryMsgBuilder.setTableId(tableInfo.getPreamble().getId());
 
         // Priority.
-        // FIXME: check on P4Runtime if/what is the defaulr priority.
+        // FIXME: check on P4Runtime if/what is the default priority.
         int priority = piTableEntry.priority().orElse(0);
         tableEntryMsgBuilder.setPriority(priority);
 
