diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslatorHelper.java b/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslatorHelper.java
index 3069e27..47c944a 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslatorHelper.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslatorHelper.java
@@ -24,10 +24,74 @@
 import org.onosproject.net.flow.criteria.EthTypeCriterion;
 import org.onosproject.net.flow.criteria.IPCriterion;
 import org.onosproject.net.flow.criteria.PortCriterion;
+import org.onosproject.net.flow.criteria.VlanIdCriterion;
+import org.onosproject.net.flow.criteria.UdpPortCriterion;
+import org.onosproject.net.flow.criteria.ExtensionCriterion;
+import org.onosproject.net.flow.criteria.IPDscpCriterion;
+import org.onosproject.net.flow.criteria.IPProtocolCriterion;
+import org.onosproject.net.flow.criteria.IPv6ExthdrFlagsCriterion;
+import org.onosproject.net.flow.criteria.IPv6FlowLabelCriterion;
+import org.onosproject.net.flow.criteria.IPv6NDLinkLayerAddressCriterion;
+import org.onosproject.net.flow.criteria.IPv6NDTargetAddressCriterion;
+import org.onosproject.net.flow.criteria.IcmpCodeCriterion;
+import org.onosproject.net.flow.criteria.IcmpTypeCriterion;
+import org.onosproject.net.flow.criteria.Icmpv6CodeCriterion;
+import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion;
+import org.onosproject.net.flow.criteria.LambdaCriterion;
+import org.onosproject.net.flow.criteria.MplsBosCriterion;
+import org.onosproject.net.flow.criteria.MplsCriterion;
+import org.onosproject.net.flow.criteria.MplsTcCriterion;
+import org.onosproject.net.flow.criteria.OchSignalCriterion;
+import org.onosproject.net.flow.criteria.OchSignalTypeCriterion;
+import org.onosproject.net.flow.criteria.OduSignalIdCriterion;
+import org.onosproject.net.flow.criteria.OduSignalTypeCriterion;
+import org.onosproject.net.flow.criteria.PbbIsidCriterion;
+import org.onosproject.net.flow.criteria.PiCriterion;
+import org.onosproject.net.flow.criteria.SctpPortCriterion;
+import org.onosproject.net.flow.criteria.TcpFlagsCriterion;
+import org.onosproject.net.flow.criteria.TcpPortCriterion;
+import org.onosproject.net.flow.criteria.TunnelIdCriterion;
+import org.onosproject.net.flow.criteria.VlanPcpCriterion;
+import org.onosproject.net.flow.criteria.ArpHaCriterion;
+import org.onosproject.net.flow.criteria.ArpOpCriterion;
+import org.onosproject.net.flow.criteria.ArpPaCriterion;
+
 import org.onosproject.net.pi.impl.CriterionTranslators.EthCriterionTranslator;
 import org.onosproject.net.pi.impl.CriterionTranslators.EthTypeCriterionTranslator;
 import org.onosproject.net.pi.impl.CriterionTranslators.IpCriterionTranslator;
 import org.onosproject.net.pi.impl.CriterionTranslators.PortCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.VlanIdCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.UdpPortCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.ExtensionCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IPDscpCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IPProtocolCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IPv6ExthdrFlagsCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IPv6FlowLabelCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IPv6NDLinkLayerAddressCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IPv6NDTargetAddressCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IcmpCodeCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IcmpTypeCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.Icmpv6CodeCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.Icmpv6TypeCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.LambdaCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.MplsBosCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.MplsCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.MplsTcCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.OchSignalCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.OchSignalTypeCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.OduSignalIdCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.OduSignalTypeCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.PbbIsidCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.PiCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.SctpPortCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.TcpFlagsCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.TcpPortCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.TunnelIdCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.VlanPcpCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.ArpHaCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.ArpOpCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.ArpPaCriterionTranslator;
+
 import org.onosproject.net.pi.model.PiMatchType;
 import org.onosproject.net.pi.runtime.PiExactFieldMatch;
 import org.onosproject.net.pi.runtime.PiFieldMatch;
@@ -46,7 +110,6 @@
  * Helper class to translate criterion instances to PI field matches.
  */
 final class CriterionTranslatorHelper {
-
     private static final Map<Class<? extends Criterion>, CriterionTranslator> TRANSLATORS =
             // Add here new CriterionTranslator implementations.
             new ImmutableMap.Builder<Class<? extends Criterion>, CriterionTranslator>()
@@ -54,6 +117,37 @@
                     .put(EthCriterion.class, new EthCriterionTranslator())
                     .put(EthTypeCriterion.class, new EthTypeCriterionTranslator())
                     .put(IPCriterion.class, new IpCriterionTranslator())
+                    .put(VlanIdCriterion.class, new VlanIdCriterionTranslator())
+                    .put(UdpPortCriterion.class, new UdpPortCriterionTranslator())
+                    .put(ExtensionCriterion.class, new ExtensionCriterionTranslator())
+                    .put(IPDscpCriterion.class, new IPDscpCriterionTranslator())
+                    .put(IPProtocolCriterion.class, new IPProtocolCriterionTranslator())
+                    .put(IPv6ExthdrFlagsCriterion.class, new IPv6ExthdrFlagsCriterionTranslator())
+                    .put(IPv6FlowLabelCriterion.class, new IPv6FlowLabelCriterionTranslator())
+                    .put(IPv6NDLinkLayerAddressCriterion.class, new IPv6NDLinkLayerAddressCriterionTranslator())
+                    .put(IPv6NDTargetAddressCriterion.class, new IPv6NDTargetAddressCriterionTranslator())
+                    .put(IcmpCodeCriterion.class, new IcmpCodeCriterionTranslator())
+                    .put(IcmpTypeCriterion.class, new IcmpTypeCriterionTranslator())
+                    .put(Icmpv6CodeCriterion.class, new Icmpv6CodeCriterionTranslator())
+                    .put(Icmpv6TypeCriterion.class, new Icmpv6TypeCriterionTranslator())
+                    .put(LambdaCriterion.class, new LambdaCriterionTranslator())
+                    .put(MplsBosCriterion.class, new MplsBosCriterionTranslator())
+                    .put(MplsCriterion.class, new MplsCriterionTranslator())
+                    .put(MplsTcCriterion.class, new MplsTcCriterionTranslator())
+                    .put(OchSignalCriterion.class, new OchSignalCriterionTranslator())
+                    .put(OchSignalTypeCriterion.class, new OchSignalTypeCriterionTranslator())
+                    .put(OduSignalIdCriterion.class, new OduSignalIdCriterionTranslator())
+                    .put(OduSignalTypeCriterion.class, new OduSignalTypeCriterionTranslator())
+                    .put(PbbIsidCriterion.class, new PbbIsidCriterionTranslator())
+                    .put(PiCriterion.class, new PiCriterionTranslator())
+                    .put(SctpPortCriterion.class, new SctpPortCriterionTranslator())
+                    .put(TcpFlagsCriterion.class, new TcpFlagsCriterionTranslator())
+                    .put(TcpPortCriterion.class, new TcpPortCriterionTranslator())
+                    .put(TunnelIdCriterion.class, new TunnelIdCriterionTranslator())
+                    .put(VlanPcpCriterion.class, new VlanPcpCriterionTranslator())
+                    .put(ArpHaCriterion.class, new ArpHaCriterionTranslator())
+                    .put(ArpOpCriterion.class, new ArpOpCriterionTranslator())
+                    .put(ArpPaCriterion.class, new ArpPaCriterionTranslator())
                     .build();
 
     private CriterionTranslatorHelper() {
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslators.java b/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslators.java
index 089f80a..11153cc 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslators.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslators.java
@@ -22,6 +22,38 @@
 import org.onosproject.net.flow.criteria.EthTypeCriterion;
 import org.onosproject.net.flow.criteria.IPCriterion;
 import org.onosproject.net.flow.criteria.PortCriterion;
+import org.onosproject.net.flow.criteria.VlanIdCriterion;
+import org.onosproject.net.flow.criteria.UdpPortCriterion;
+import org.onosproject.net.flow.criteria.ExtensionCriterion;
+import org.onosproject.net.flow.criteria.IPDscpCriterion;
+import org.onosproject.net.flow.criteria.IPProtocolCriterion;
+import org.onosproject.net.flow.criteria.IPv6ExthdrFlagsCriterion;
+import org.onosproject.net.flow.criteria.IPv6FlowLabelCriterion;
+import org.onosproject.net.flow.criteria.IcmpCodeCriterion;
+import org.onosproject.net.flow.criteria.IcmpTypeCriterion;
+import org.onosproject.net.flow.criteria.Icmpv6CodeCriterion;
+import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion;
+import org.onosproject.net.flow.criteria.LambdaCriterion;
+import org.onosproject.net.flow.criteria.MetadataCriterion;
+import org.onosproject.net.flow.criteria.MplsBosCriterion;
+import org.onosproject.net.flow.criteria.MplsCriterion;
+import org.onosproject.net.flow.criteria.MplsTcCriterion;
+import org.onosproject.net.flow.criteria.OchSignalCriterion;
+import org.onosproject.net.flow.criteria.OchSignalTypeCriterion;
+import org.onosproject.net.flow.criteria.OduSignalIdCriterion;
+import org.onosproject.net.flow.criteria.OduSignalTypeCriterion;
+import org.onosproject.net.flow.criteria.PbbIsidCriterion;
+import org.onosproject.net.flow.criteria.PiCriterion;
+import org.onosproject.net.flow.criteria.SctpPortCriterion;
+import org.onosproject.net.flow.criteria.TcpFlagsCriterion;
+import org.onosproject.net.flow.criteria.TcpPortCriterion;
+import org.onosproject.net.flow.criteria.TunnelIdCriterion;
+import org.onosproject.net.flow.criteria.VlanPcpCriterion;
+import org.onosproject.net.flow.criteria.ArpHaCriterion;
+import org.onosproject.net.flow.criteria.ArpOpCriterion;
+import org.onosproject.net.flow.criteria.ArpPaCriterion;
+import org.onosproject.net.flow.criteria.IPv6NDLinkLayerAddressCriterion;
+import org.onosproject.net.flow.criteria.IPv6NDTargetAddressCriterion;
 
 import static org.onlab.util.ImmutableByteSequence.ByteSequenceTrimException;
 import static org.onlab.util.ImmutableByteSequence.copyFrom;
@@ -74,9 +106,388 @@
      * Translator of IpCriterion.
      */
     static final class IpCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
         public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
             IPCriterion c = (IPCriterion) criterion;
             initAsLpm(copyFrom(c.ip().address().toOctets()), c.ip().prefixLength(), bitWidth);
         }
     }
+
+    /**
+     * Translator of VlanIdCriterion.
+     */
+    static final class VlanIdCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            VlanIdCriterion c = (VlanIdCriterion) criterion;
+            initAsExactMatch(copyFrom(c.vlanId().toShort()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of UdpPortCriterion.
+     */
+    static final class UdpPortCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            UdpPortCriterion c = (UdpPortCriterion) criterion;
+            ImmutableByteSequence value = copyFrom(c.udpPort().toInt());
+            if (c.mask() == null) {
+                initAsExactMatch(value, bitWidth);
+            } else {
+                ImmutableByteSequence mask = copyFrom(c.mask().toInt());
+                initAsTernaryMatch(value, mask, bitWidth);
+            }
+        }
+    }
+
+    /**
+     * Translator of ExtensionCriterion.
+     */
+    static final class ExtensionCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            ExtensionCriterion c = (ExtensionCriterion) criterion;
+            initAsExactMatch(copyFrom(c.extensionSelector().type().toInt()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IPDscpCriterion.
+     */
+    static final class IPDscpCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IPDscpCriterion c = (IPDscpCriterion) criterion;
+            ImmutableByteSequence value = copyFrom(c.ipDscp());
+            initAsExactMatch(value, bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IPProtocolCriterion.
+     */
+    static final class IPProtocolCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IPProtocolCriterion c = (IPProtocolCriterion) criterion;
+            initAsExactMatch(copyFrom(c.protocol()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IPv6ExthdrFlagsCriterion.
+     */
+    static final class IPv6ExthdrFlagsCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IPv6ExthdrFlagsCriterion c = (IPv6ExthdrFlagsCriterion) criterion;
+            initAsExactMatch(copyFrom(c.exthdrFlags()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IPv6FlowLabelCriterion.
+     */
+    static final class IPv6FlowLabelCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IPv6FlowLabelCriterion c = (IPv6FlowLabelCriterion) criterion;
+            initAsExactMatch(copyFrom(c.flowLabel()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IPv6NDLinkLayerAddressCriterion.
+     */
+    static final class IPv6NDLinkLayerAddressCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IPv6NDLinkLayerAddressCriterion c = (IPv6NDLinkLayerAddressCriterion) criterion;
+            initAsExactMatch(copyFrom(c.mac().toLong()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IPv6NDTargetAddressCriterion.
+     */
+    static final class IPv6NDTargetAddressCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IPv6NDTargetAddressCriterion c = (IPv6NDTargetAddressCriterion) criterion;
+            initAsExactMatch(copyFrom(c.targetAddress().getIp6Address().toOctets()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IcmpCodeCriterion.
+     */
+    static final class IcmpCodeCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IcmpCodeCriterion c = (IcmpCodeCriterion) criterion;
+            initAsExactMatch(copyFrom(c.icmpCode()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IcmpTypeCriterion.
+     */
+    static final class IcmpTypeCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IcmpTypeCriterion c = (IcmpTypeCriterion) criterion;
+            initAsExactMatch(copyFrom(c.icmpType()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of Icmpv6CodeCriterion.
+     */
+    static final class Icmpv6CodeCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            Icmpv6CodeCriterion c = (Icmpv6CodeCriterion) criterion;
+            initAsExactMatch(copyFrom(c.icmpv6Code()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of Icmpv6TypeCriterion.
+     */
+    static final class Icmpv6TypeCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            Icmpv6TypeCriterion c = (Icmpv6TypeCriterion) criterion;
+            initAsExactMatch(copyFrom(c.icmpv6Type()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of LambdaCriterion.
+     */
+    static final class LambdaCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            LambdaCriterion c = (LambdaCriterion) criterion;
+            initAsExactMatch(copyFrom(c.lambda()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of MetadataCriterion.
+     */
+    static final class MetadataCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            MetadataCriterion c = (MetadataCriterion) criterion;
+            initAsExactMatch(copyFrom(c.metadata()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of MplsBosCriterion.
+     */
+    static final class MplsBosCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            MplsBosCriterion c = (MplsBosCriterion) criterion;
+            int iMplsBos = c.mplsBos() ? 0 : 1;
+            initAsExactMatch(copyFrom(iMplsBos), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of MplsCriterion.
+     */
+    static final class MplsCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            MplsCriterion c = (MplsCriterion) criterion;
+            initAsExactMatch(copyFrom(c.label().toInt()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of MplsTcCriterion.
+     */
+    static final class MplsTcCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            MplsTcCriterion c = (MplsTcCriterion) criterion;
+            initAsExactMatch(copyFrom(c.tc()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of OchSignalCriterion.
+     */
+    static final class OchSignalCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            OchSignalCriterion c = (OchSignalCriterion) criterion;
+            initAsExactMatch(copyFrom(c.lambda().slotGranularity()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of OchSignalTypeCriterion.
+     */
+    static final class OchSignalTypeCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            OchSignalTypeCriterion c = (OchSignalTypeCriterion) criterion;
+            initAsExactMatch(copyFrom(c.signalType().ordinal()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of OduSignalIdCriterion.
+     */
+    static final class OduSignalIdCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            OduSignalIdCriterion c = (OduSignalIdCriterion) criterion;
+            initAsExactMatch(copyFrom(c.oduSignalId().tributaryPortNumber()), bitWidth);
+        }
+    }
+
+
+    /**
+     * Translator of OduSignalTypeCriterion.
+     */
+    static final class OduSignalTypeCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            OduSignalTypeCriterion c = (OduSignalTypeCriterion) criterion;
+            initAsExactMatch(copyFrom(c.signalType().bitRate()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of PbbIsidCriterion.
+     */
+    static final class PbbIsidCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            PbbIsidCriterion c = (PbbIsidCriterion) criterion;
+            initAsExactMatch(copyFrom(c.pbbIsid()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of PiCriterion.
+     */
+    static final class PiCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            PiCriterion c = (PiCriterion) criterion;
+            initAsExactMatch(copyFrom(c.fieldMatches().size()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of SctpPortCriterion.
+     */
+    static final class SctpPortCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            SctpPortCriterion c = (SctpPortCriterion) criterion;
+            ImmutableByteSequence value = copyFrom(c.sctpPort().toInt());
+            if (c.mask() == null) {
+                initAsExactMatch(value, bitWidth);
+            } else {
+                ImmutableByteSequence mask = copyFrom(c.mask().toInt());
+                initAsTernaryMatch(value, mask, bitWidth);
+            }
+        }
+    }
+
+    /**
+     * Translator of TcpFlagsCriterion.
+     */
+    static final class TcpFlagsCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            TcpFlagsCriterion c = (TcpFlagsCriterion) criterion;
+            initAsExactMatch(copyFrom(c.flags()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of TcpPortCriterion.
+     */
+    static final class TcpPortCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            TcpPortCriterion c = (TcpPortCriterion) criterion;
+            ImmutableByteSequence value = copyFrom(c.tcpPort().toInt());
+            if (c.mask() == null) {
+                initAsExactMatch(value, bitWidth);
+            } else {
+                ImmutableByteSequence mask = copyFrom(c.mask().toInt());
+                initAsTernaryMatch(value, mask, bitWidth);
+            }
+
+        }
+    }
+
+    /**
+     * Translator of TunnelIdCriterion.
+     */
+    static final class TunnelIdCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            TunnelIdCriterion c = (TunnelIdCriterion) criterion;
+            initAsExactMatch(copyFrom(c.tunnelId()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of  VlanPcpCriterion.
+     */
+    static final class VlanPcpCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            VlanPcpCriterion c = (VlanPcpCriterion) criterion;
+            initAsExactMatch(copyFrom(c.priority()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of  ArpHaCriterion.
+     */
+    static final class ArpHaCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            ArpHaCriterion c = (ArpHaCriterion) criterion;
+            initAsExactMatch(copyFrom(c.mac().toLong()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of  ArpOpCriterion.
+     */
+    static final class ArpOpCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            ArpOpCriterion c = (ArpOpCriterion) criterion;
+            initAsExactMatch(copyFrom(c.arpOp()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of  ArpPaCriterion.
+     */
+    static final class ArpPaCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            ArpPaCriterion c = (ArpPaCriterion) criterion;
+            initAsExactMatch(copyFrom(c.ip().toInt()), bitWidth);
+        }
+    }
+
+
+
+
 }
