basic instructions implemented
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java b/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java
index 9678dc1..906e505 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java
@@ -2,6 +2,8 @@
 
 import java.util.List;
 
+import org.onlab.onos.net.flow.criteria.Criterion;
+
 /**
  * Abstraction of a slice of network traffic.
  */
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/Criteria.java b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
similarity index 95%
rename from core/api/src/main/java/org/onlab/onos/net/flow/Criteria.java
rename to core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
index 4717cc4..ff1ac25 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/Criteria.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.net.flow;
+package org.onlab.onos.net.flow.criteria;
 
 /**
  * Factory class to create various traffic selection criteria.
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/Criterion.java b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criterion.java
similarity index 98%
rename from core/api/src/main/java/org/onlab/onos/net/flow/Criterion.java
rename to core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criterion.java
index 0b55a42..d105f7c 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/Criterion.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criterion.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.net.flow;
+package org.onlab.onos.net.flow.criteria;
 
 /**
  * Representation of a single header field selection.
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instruction.java b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instruction.java
index 5d34fc2..a22d2cd 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instruction.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instruction.java
@@ -5,6 +5,12 @@
  */
 public interface Instruction {
 
+    interface SubType {}
+
+    public enum NoneSubType implements SubType {
+        NONE;
+    }
+
     /**
      * Represents the type of traffic treatment.
      */
@@ -39,4 +45,10 @@
      */
     public Type type();
 
+    /**
+     * Returns the subtype of the modification instruction.
+     * @return type of instruction
+     */
+    public SubType subtype();
+
 }
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 2365bf0..5acac3e 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
@@ -3,8 +3,12 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import org.onlab.onos.net.PortNumber;
+import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.L2SubType;
 import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction;
-import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.SubType;
+import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.L3SubType;
+import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.ModIPInstruction;
+import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.ModIPProtoInstruction;
+import org.onlab.packet.IPAddress;
 import org.onlab.packet.MACAddress;
 /**
  * Factory class for creating various traffic treatment instructions.
@@ -42,7 +46,7 @@
      */
     public static L2ModificationInstruction modL2Src(MACAddress addr) {
         checkNotNull(addr, "Src l2 address cannot be null");
-        return new ModEtherInstruction(SubType.L2_SRC, addr);
+        return new ModEtherInstruction(L2SubType.L2_SRC, addr);
     }
 
     /**
@@ -52,7 +56,7 @@
      */
     public static L2ModificationInstruction modL2Dst(MACAddress addr) {
         checkNotNull(addr, "Dst l2 address cannot be null");
-        return new L2ModificationInstruction.ModEtherInstruction(SubType.L2_DST, addr);
+        return new L2ModificationInstruction.ModEtherInstruction(L2SubType.L2_DST, addr);
     }
 
     /**
@@ -65,11 +69,56 @@
         return new L2ModificationInstruction.ModEtherTypeInstruction(l2Type);
     }
 
+    /**
+     * Creates a Vlan id modification.
+     * @param vlanId the vlan id to modify to.
+     * @return a L2 modification
+     */
     public static L2ModificationInstruction modVlanId(Short vlanId) {
         checkNotNull(vlanId, "VLAN id cannot be null");
         return new L2ModificationInstruction.ModVlanIdInstruction(vlanId);
     }
 
+    /**
+     * Creates a Vlan pcp modification.
+     * @param vlanPcp the pcp to modify to.
+     * @return a L2 modification
+     */
+    public static L2ModificationInstruction modVlanPcp(Byte vlanPcp) {
+        checkNotNull(vlanPcp, "VLAN Pcp cannot be null");
+        return new L2ModificationInstruction.ModVlanPcpInstruction(vlanPcp);
+    }
+
+    /**
+     * Creates a L3 src modification.
+     * @param addr the ip address to modify to.
+     * @return a L3 modification
+     */
+    public static L3ModificationInstruction modL3Src(IPAddress addr) {
+        checkNotNull(addr, "Src l3 address cannot be null");
+        return new ModIPInstruction(L3SubType.L3_SRC, addr);
+    }
+
+    /**
+     * Creates a L3 dst modification.
+     * @param addr the ip address to modify to.
+     * @return a L3 modification
+     */
+    public static L3ModificationInstruction modL3Dst(IPAddress addr) {
+        checkNotNull(addr, "Dst l3 address cannot be null");
+        return new ModIPInstruction(L3SubType.L3_DST, addr);
+    }
+
+    /**
+     * Creates an L3 protocol modification.
+     * @param proto the protocol to change to
+     * @return a L3 modification
+     */
+    public static L3ModificationInstruction modIPProto(Byte proto) {
+        checkNotNull(proto, "IP protocol cannot be null");
+        return new ModIPProtoInstruction(proto);
+    }
+
     /*
      *  Output instructions
      */
@@ -79,6 +128,11 @@
         public Type type() {
             return Type.DROP;
         }
+
+        @Override
+        public SubType subtype() {
+            return NoneSubType.NONE;
+        }
     }
 
 
@@ -97,6 +151,11 @@
         public Type type() {
             return Type.OUTPUT;
         }
+
+        @Override
+        public SubType subtype() {
+            return NoneSubType.NONE;
+        }
     }
 
 }
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 f71ad2e..348c30f 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
@@ -11,7 +11,7 @@
     /**
      * Represents the type of traffic treatment.
      */
-    public enum SubType {
+    public enum L2SubType implements SubType {
         /**
          * Ether src modification.
          */
@@ -41,10 +41,7 @@
     // TODO: Create factory class 'Instructions' that will have various factory
     // to create specific instructions.
 
-    /**
-     * Returns the subtype of the modification instruction.
-     * @return type of instruction
-     */
+    @Override
     public abstract SubType subtype();
 
     @Override
@@ -89,7 +86,7 @@
 
         @Override
         public SubType subtype() {
-            return SubType.L2_TYPE;
+            return L2SubType.L2_TYPE;
         }
 
         public short l2Type() {
@@ -111,7 +108,7 @@
 
         @Override
         public SubType subtype() {
-            return SubType.VLAN_ID;
+            return L2SubType.VLAN_ID;
         }
 
         public Short vlanId() {
@@ -120,5 +117,27 @@
 
     }
 
+    /**
+     * Represents a VLAN PCP modification instruction.
+     */
+    public static final class ModVlanPcpInstruction extends L2ModificationInstruction {
+
+        public final Byte vlanPcp;
+
+        public ModVlanPcpInstruction(Byte vlanPcp) {
+            this.vlanPcp = vlanPcp;
+        }
+
+        @Override
+        public SubType subtype() {
+            return L2SubType.VLAN_PCP;
+        }
+
+        public Byte vlanPcp() {
+            return this.vlanPcp;
+        }
+
+    }
+
 
 }
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L3ModificationInstruction.java b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L3ModificationInstruction.java
new file mode 100644
index 0000000..eb4d3b6
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L3ModificationInstruction.java
@@ -0,0 +1,89 @@
+package org.onlab.onos.net.flow.instructions;
+
+import org.onlab.packet.IPAddress;
+
+/**
+ * Abstraction of a single traffic treatment step.
+ * @param <T> the type parameter for the instruction
+ */
+public abstract class L3ModificationInstruction implements Instruction {
+
+    /**
+     * Represents the type of traffic treatment.
+     */
+    public enum L3SubType implements SubType {
+        /**
+         * Ether src modification.
+         */
+        L3_SRC,
+
+        /**
+         * Ether dst modification.
+         */
+        L3_DST,
+
+        /**
+         * Ethertype modification.
+         */
+        L3_PROTO,
+
+        //TODO: remaining types
+    }
+
+    /**
+     * Returns the subtype of the modification instruction.
+     * @return type of instruction
+     */
+    public abstract SubType subtype();
+
+    @Override
+    public Type type() {
+        return Type.MODIFICATION;
+    }
+
+    /**
+     * Represents a L3 src/dst modification instruction.
+     */
+    public static final class ModIPInstruction extends L3ModificationInstruction {
+
+        private final SubType subtype;
+        private final IPAddress ip;
+
+        public ModIPInstruction(SubType subType, IPAddress addr) {
+            this.subtype = subType;
+            this.ip = addr;
+        }
+
+        @Override
+        public SubType subtype() {
+            return this.subtype;
+        }
+
+        public IPAddress ip() {
+            return this.ip;
+        }
+
+    }
+
+    /**
+     * Represents a L3 proto modification instruction.
+     */
+    public static final class ModIPProtoInstruction extends L3ModificationInstruction {
+
+        public final Byte proto;
+
+        public ModIPProtoInstruction(Byte proto) {
+            this.proto = proto;
+        }
+
+        @Override
+        public SubType subtype() {
+            return L3SubType.L3_PROTO;
+        }
+
+        public short proto() {
+            return this.proto;
+        }
+
+    }
+}