initial impl of criteria
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
index ff1ac25..24c49bb 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
@@ -1,23 +1,41 @@
 package org.onlab.onos.net.flow.criteria;
 
+import org.onlab.onos.net.PortNumber;
+import org.onlab.onos.net.flow.criteria.Criterion.Type;
+import org.onlab.packet.IPAddress;
+import org.onlab.packet.MACAddress;
+import org.onlab.packet.VLANID;
+
 /**
  * Factory class to create various traffic selection criteria.
  */
 public final class Criteria {
 
+    //TODO: incomplete type implementation. Need to implement complete list from Criterion
+
     // Ban construction
     private Criteria() {
     }
 
     /**
+     * Creates a match on IN_PORT field using the specified value.
+     *
+     * @param port inport value
+     * @return match criterion
+     */
+    public static Criterion matchInPort(PortNumber port) {
+        return new PortCriterion(port);
+    }
+
+    /**
      * Creates a match on ETH_SRC field using the specified value. This value
      * may be a wildcard mask.
      *
      * @param macValue MAC address value or wildcard mask
      * @return match criterion
      */
-    public static Criterion matchEthSrc(MACValue macValue) {
-        return null;
+    public static Criterion matchEthSrc(MACAddress mac) {
+        return new EthCriterion(mac, Type.ETH_SRC);
     }
 
     /**
@@ -27,11 +45,214 @@
      * @param macValue MAC address value or wildcard mask
      * @return match criterion
      */
-    public static Criterion matchEthDst(MACValue macValue) {
-        return null;
+    public static Criterion matchEthDst(MACAddress mac) {
+        return new EthCriterion(mac, Type.ETH_DST);
+    }
+
+    /**
+     * Creates a match on ETH_TYPE field using the specified value.
+     *
+     * @param ethType eth type value
+     * @return match criterion
+     */
+    public static Criterion matchEthType(Short ethType) {
+        return new EthTypeCriterion(ethType);
+    }
+
+    /**
+     * Creates a match on VLAN ID field using the specified value.
+     *
+     * @param vlanId vlan id value
+     * @return match criterion
+     */
+    public static Criterion matchVlanId(VLANID vlanId) {
+        return new VlanIdCriterion(vlanId);
+    }
+
+    /**
+     * Creates a match on VLAN PCP field using the specified value.
+     *
+     * @param vlanPcp vlan pcp value
+     * @return match criterion
+     */
+    public static Criterion matchVlanId(Byte vlanPcp) {
+        return new VlanPcpCriterion(vlanPcp);
+    }
+
+    /**
+     * Creates a match on IP proto field using the specified value.
+     *
+     * @param proto ip protocol value
+     * @return match criterion
+     */
+    public static Criterion matchIPProtocol(Byte proto) {
+        return new IPProtocolCriterion(proto);
+    }
+
+    /**
+     * Creates a match on IP src field using the specified value.
+     *
+     * @param ip ip src value
+     * @return match criterion
+     */
+    public static Criterion matchIPSrc(IPAddress ip) {
+        return new IPCriterion(ip, Type.IPV4_SRC);
+    }
+
+    /**
+     * Creates a match on IP dst field using the specified value.
+     *
+     * @param ip ip src value
+     * @return match criterion
+     */
+    public static Criterion matchIPDst(IPAddress ip) {
+        return new IPCriterion(ip, Type.IPV4_DST);
     }
 
 
-    // Dummy to illustrate the concept for now; delete ASAP
-    private static class MACValue { }
+    /*
+     * Implementations of criteria.
+     */
+
+    public static final class PortCriterion implements Criterion {
+        private final PortNumber port;
+
+        public PortCriterion(PortNumber port) {
+            this.port = port;
+        }
+
+        @Override
+        public Type type() {
+            return Type.IN_PORT;
+        }
+
+        public PortNumber port() {
+            return this.port;
+        }
+    }
+
+
+    public static final class EthCriterion implements Criterion {
+        private final MACAddress mac;
+        private final Type type;
+
+        public EthCriterion(MACAddress mac, Type type) {
+            this.mac = mac;
+            this.type = type;
+        }
+
+        @Override
+        public Type type() {
+            return this.type;
+        }
+
+        public MACAddress mac() {
+            return this.mac;
+        }
+    }
+
+    public static final class EthTypeCriterion implements Criterion {
+
+        private final Short ethType;
+
+        public EthTypeCriterion(Short ethType) {
+            this.ethType = ethType;
+        }
+
+        @Override
+        public Type type() {
+            return Type.ETH_TYPE;
+        }
+
+        public Short ethType() {
+            return ethType;
+        }
+
+    }
+
+
+    public static final class IPCriterion implements Criterion {
+
+        private final IPAddress ip;
+        private final Type type;
+
+        public IPCriterion(IPAddress ip, Type type) {
+            this.ip = ip;
+            this.type = type;
+        }
+
+        @Override
+        public Type type() {
+            return this.type;
+        }
+
+        public IPAddress ip() {
+            return this.ip;
+        }
+
+
+    }
+
+
+    public static final class IPProtocolCriterion implements Criterion {
+
+        private final Byte proto;
+
+        public IPProtocolCriterion(Byte protocol) {
+            this.proto = protocol;
+        }
+
+        @Override
+        public Type type() {
+            return Type.IP_PROTO;
+        }
+
+        public Byte protocol() {
+            return proto;
+        }
+
+    }
+
+
+    public static final class VlanPcpCriterion implements Criterion {
+
+        private final Byte vlanPcp;
+
+        public VlanPcpCriterion(Byte vlanPcp) {
+            this.vlanPcp = vlanPcp;
+        }
+
+        @Override
+        public Type type() {
+            return Type.VLAN_PCP;
+        }
+
+        public Byte protocol() {
+            return vlanPcp;
+        }
+
+    }
+
+
+    public static final class VlanIdCriterion implements Criterion {
+
+
+        private final VLANID vlanId;
+
+        public VlanIdCriterion(VLANID vlanId) {
+            this.vlanId = vlanId;
+        }
+
+        @Override
+        public Type type() {
+            return Type.VLAN_VID;
+        }
+
+        public VLANID vlanId() {
+            return vlanId;
+        }
+
+    }
+
+
 }
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criterion.java b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criterion.java
index d105f7c..567e100 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criterion.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criterion.java
@@ -1,5 +1,6 @@
 package org.onlab.onos.net.flow.criteria;
 
+
 /**
  * Representation of a single header field selection.
  */
@@ -92,6 +93,12 @@
         IPV6_EXTHDR
     }
 
+    /**
+     * Returns the type of criterion.
+     * @return type of criterion
+     */
+    public Type type();
+
     // TODO: Create factory class 'Criteria' that will have various factory
     // to create specific criterions.
 
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instructions.java b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instructions.java
index 5acac3e..270704e 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instructions.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instructions.java
@@ -10,6 +10,7 @@
 import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.ModIPProtoInstruction;
 import org.onlab.packet.IPAddress;
 import org.onlab.packet.MACAddress;
+import org.onlab.packet.VLANID;
 /**
  * Factory class for creating various traffic treatment instructions.
  */
@@ -74,7 +75,7 @@
      * @param vlanId the vlan id to modify to.
      * @return a L2 modification
      */
-    public static L2ModificationInstruction modVlanId(Short vlanId) {
+    public static L2ModificationInstruction modVlanId(VLANID vlanId) {
         checkNotNull(vlanId, "VLAN id cannot be null");
         return new L2ModificationInstruction.ModVlanIdInstruction(vlanId);
     }
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L2ModificationInstruction.java b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L2ModificationInstruction.java
index 348c30f..da86e13 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L2ModificationInstruction.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L2ModificationInstruction.java
@@ -1,6 +1,7 @@
 package org.onlab.onos.net.flow.instructions;
 
 import org.onlab.packet.MACAddress;
+import org.onlab.packet.VLANID;
 
 /**
  * Abstraction of a single traffic treatment step.
@@ -100,9 +101,9 @@
      */
     public static final class ModVlanIdInstruction extends L2ModificationInstruction {
 
-        public final Short vlanId;
+        public final VLANID vlanId;
 
-        public ModVlanIdInstruction(Short vlanId) {
+        public ModVlanIdInstruction(VLANID vlanId) {
             this.vlanId = vlanId;
         }
 
@@ -111,7 +112,7 @@
             return L2SubType.VLAN_ID;
         }
 
-        public Short vlanId() {
+        public VLANID vlanId() {
             return this.vlanId;
         }