diff --git a/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java b/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java
index 06bcfcb..b332d2c 100644
--- a/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java
+++ b/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java
@@ -21,8 +21,6 @@
 import org.onlab.onos.net.flow.FlowRuleService;
 import org.onlab.onos.net.flow.TrafficSelector;
 import org.onlab.onos.net.flow.TrafficTreatment;
-import org.onlab.onos.net.flow.criteria.Criteria;
-import org.onlab.onos.net.flow.instructions.Instructions;
 import org.onlab.onos.net.host.HostService;
 import org.onlab.onos.net.packet.InboundPacket;
 import org.onlab.onos.net.packet.PacketContext;
@@ -153,7 +151,7 @@
 
     // Sends a packet out the specified port.
     private void packetOut(PacketContext context, PortNumber portNumber) {
-        context.treatmentBuilder().add(Instructions.createOutput(portNumber));
+        context.treatmentBuilder().setOutput(portNumber);
         context.send();
     }
 
@@ -165,13 +163,13 @@
         // Install the flow rule to handle this type of message from now on.
         Ethernet inPkt = context.inPacket().parsed();
         TrafficSelector.Builder builder = new DefaultTrafficSelector.Builder();
-        builder.add(Criteria.matchEthType(inPkt.getEtherType()))
-        .add(Criteria.matchEthSrc(inPkt.getSourceMAC()))
-        .add(Criteria.matchEthDst(inPkt.getDestinationMAC()))
-        .add(Criteria.matchInPort(context.inPacket().receivedFrom().port()));
+        builder.matchEthType(inPkt.getEtherType())
+        .matchEthSrc(inPkt.getSourceMAC())
+        .matchEthDst(inPkt.getDestinationMAC())
+        .matchInport(context.inPacket().receivedFrom().port());
 
         TrafficTreatment.Builder treat = new DefaultTrafficTreatment.Builder();
-        treat.add(Instructions.createOutput(portNumber));
+        treat.setOutput(portNumber);
 
         FlowRule f = new DefaultFlowRule(context.inPacket().receivedFrom().deviceId(),
                 builder.build(), treat.build(), 0, appId);
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficSelector.java b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficSelector.java
index 9ec49e4..8f68ea5 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficSelector.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficSelector.java
@@ -6,7 +6,12 @@
 import java.util.LinkedList;
 import java.util.List;
 
+import org.onlab.onos.net.PortNumber;
+import org.onlab.onos.net.flow.criteria.Criteria;
 import org.onlab.onos.net.flow.criteria.Criterion;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 import org.slf4j.Logger;
 
 public final class DefaultTrafficSelector implements TrafficSelector {
@@ -29,11 +34,47 @@
         private final List<Criterion> selector = new LinkedList<>();
 
         @Override
-        public TrafficSelector.Builder add(Criterion criterion) {
+        public Builder add(Criterion criterion) {
             selector.add(criterion);
             return this;
         }
 
+        public Builder matchInport(PortNumber port) {
+            return add(Criteria.matchInPort(port));
+        }
+
+        public Builder matchEthSrc(MacAddress addr) {
+            return add(Criteria.matchEthSrc(addr));
+        }
+
+        public Builder matchEthDst(MacAddress addr) {
+            return add(Criteria.matchEthDst(addr));
+        }
+
+        public Builder matchEthType(short ethType) {
+            return add(Criteria.matchEthType(ethType));
+        }
+
+        public Builder matchVlanId(VlanId vlanId) {
+            return add(Criteria.matchVlanId(vlanId));
+        }
+
+        public Builder matchVlanPcp(Byte vlanPcp) {
+            return add(Criteria.matchVlanPcp(vlanPcp));
+        }
+
+        public Builder matchIPProtocol(Byte proto) {
+            return add(Criteria.matchIPProtocol(proto));
+        }
+
+        public Builder matchIPSrc(IpPrefix ip) {
+            return add(Criteria.matchIPSrc(ip));
+        }
+
+        public Builder matchIPDst(IpPrefix ip) {
+            return add(Criteria.matchIPDst(ip));
+        }
+
         @Override
         public TrafficSelector build() {
             return new DefaultTrafficSelector(selector);
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficTreatment.java b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficTreatment.java
index 9de68dc..2ce233f 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficTreatment.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficTreatment.java
@@ -6,7 +6,12 @@
 import java.util.LinkedList;
 import java.util.List;
 
+import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.flow.instructions.Instruction;
+import org.onlab.onos.net.flow.instructions.Instructions;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 import org.slf4j.Logger;
 
 public final class DefaultTrafficTreatment implements TrafficTreatment {
@@ -42,9 +47,10 @@
         // TODO: should be a list of instructions based on modification objects
         List<Instruction> modifications = new LinkedList<>();
 
-
-        @Override
         public Builder add(Instruction instruction) {
+            if (drop) {
+                return this;
+            }
             switch (instruction.type()) {
             case DROP:
                 drop = true;
@@ -67,6 +73,46 @@
         }
 
         @Override
+        public void drop() {
+            add(Instructions.createDrop());
+        }
+
+        @Override
+        public Builder setOutput(PortNumber number) {
+            return add(Instructions.createOutput(number));
+        }
+
+        @Override
+        public Builder setEthSrc(MacAddress addr) {
+            return add(Instructions.modL2Src(addr));
+        }
+
+        @Override
+        public Builder setEthDst(MacAddress addr) {
+            return add(Instructions.modL2Dst(addr));
+        }
+
+        @Override
+        public Builder setVlanId(VlanId id) {
+            return add(Instructions.modVlanId(id));
+        }
+
+        @Override
+        public Builder setVlanPcp(Byte pcp) {
+            return add(Instructions.modVlanPcp(pcp));
+        }
+
+        @Override
+        public Builder setIpSrc(IpPrefix addr) {
+            return add(Instructions.modL3Src(addr));
+        }
+
+        @Override
+        public Builder setIpDst(IpPrefix addr) {
+            return add(Instructions.modL3Dst(addr));
+        }
+
+        @Override
         public TrafficTreatment build() {
 
             //If we are dropping should we just return an emptry list?
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 906e505..249d1f9 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,7 +2,11 @@
 
 import java.util.List;
 
+import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.flow.criteria.Criterion;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 /**
  * Abstraction of a slice of network traffic.
@@ -31,6 +35,69 @@
         Builder add(Criterion criterion);
 
         /**
+         * Matches an inport.
+         * @param port the inport
+         * @return a selection builder
+         */
+        public Builder matchInport(PortNumber port);
+
+        /**
+         * Matches a l2 src address.
+         * @param addr a l2 address
+         * @return a selection builder
+         */
+        public Builder matchEthSrc(MacAddress addr);
+
+        /**
+         * Matches a l2 dst address.
+         * @param addr a l2 address
+         * @return a selection builder
+         */
+        public Builder matchEthDst(MacAddress addr);
+
+        /**
+         * Matches the ethernet type.
+         * @param ethType an ethernet type
+         * @return a selection builder
+         */
+        public Builder matchEthType(short ethType);
+
+        /**
+         * Matches the vlan id.
+         * @param vlanId a vlan id
+         * @return a selection builder
+         */
+        public Builder matchVlanId(VlanId vlanId);
+
+        /**
+         * Matches a vlan priority.
+         * @param vlanPcp a vlan priority
+         * @return a selection builder
+         */
+        public Builder matchVlanPcp(Byte vlanPcp);
+
+        /**
+         * Matches the l3 protocol.
+         * @param proto a l3 protocol
+         * @return a selection builder
+         */
+        public Builder matchIPProtocol(Byte proto);
+
+        /**
+         * Matches a l3 address.
+         * @param ip a l3 address
+         * @return a selection builder
+         */
+        public Builder matchIPSrc(IpPrefix ip);
+
+        /**
+         * Matches a l3 address.
+         * @param ip a l3 address
+         * @return a selection builder
+         */
+        public Builder matchIPDst(IpPrefix ip);
+
+        /**
          * Builds an immutable traffic selector.
          *
          * @return traffic selector
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/TrafficTreatment.java b/core/api/src/main/java/org/onlab/onos/net/flow/TrafficTreatment.java
index 068bc2c..fe21328 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/TrafficTreatment.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/TrafficTreatment.java
@@ -2,7 +2,11 @@
 
 import java.util.List;
 
+import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.flow.instructions.Instruction;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 /**
  * Abstraction of network traffic treatment.
@@ -22,14 +26,67 @@
     public interface Builder {
 
         /**
-         * Adds a traffic treatment instruction. If a same type instruction has
-         * already been added, it will be replaced by this one.
-         *
-         * @param instruction new instruction
+         * Adds an instruction to the builder.
+         * @param instruction an instruction
+         * @return a treatment builder
          */
         Builder add(Instruction instruction);
 
         /**
+         * Adds a drop instruction and does not return a builder.
+         */
+        public void drop();
+
+        /**
+         * Set the output port.
+         * @param number the out port
+         * @return a treatment builder
+         */
+        public Builder setOutput(PortNumber number);
+
+        /**
+         * Sets the src l2 address.
+         * @param addr a macaddress
+         * @return a treatment builder
+         */
+        public Builder setEthSrc(MacAddress addr);
+
+        /**
+         * Sets the dst l2 address.
+         * @param addr a macaddress
+         * @return a treatment builder
+         */
+        public Builder setEthDst(MacAddress addr);
+
+        /**
+         * Sets the vlan id.
+         * @param id a vlanid
+         * @return a treatment builder
+         */
+        public Builder setVlanId(VlanId id);
+
+        /**
+         * Sets the vlan priority.
+         * @param pcp a vlan priority
+         * @return a treatment builder
+         */
+        public Builder setVlanPcp(Byte pcp);
+
+        /**
+         * Sets the src l3 address.
+         * @param addr an ip
+         * @return a treatment builder
+         */
+        public Builder setIpSrc(IpPrefix addr);
+
+        /**
+         * Sets the dst l3 address.
+         * @param addr an ip
+         * @return a treatment builder
+         */
+        public Builder setIpDst(IpPrefix addr);
+
+        /**
          * Builds an immutable traffic treatment descriptor.
          *
          * @return traffic treatment
diff --git a/core/net/src/main/java/org/onlab/onos/net/host/impl/HostMonitor.java b/core/net/src/main/java/org/onlab/onos/net/host/impl/HostMonitor.java
index 71d1130..a5aa13e 100644
--- a/core/net/src/main/java/org/onlab/onos/net/host/impl/HostMonitor.java
+++ b/core/net/src/main/java/org/onlab/onos/net/host/impl/HostMonitor.java
@@ -65,12 +65,12 @@
 
     private final long probeRate;
 
-    private Timeout timeout;
+    private final Timeout timeout;
 
     public HostMonitor(HostService hostService, TopologyService topologyService,
-                       DeviceService deviceService,
-                       HostProvider hostProvider, PacketService packetService,
-                       HostStore hostStore) {
+            DeviceService deviceService,
+            HostProvider hostProvider, PacketService packetService,
+            HostStore hostStore) {
         this.hostService = hostService;
         this.topologyService = topologyService;
         this.deviceService = deviceService;
@@ -147,10 +147,9 @@
         List<Instruction> instructions = new ArrayList<>();
         instructions.add(Instructions.createOutput(port.number()));
 
-        TrafficTreatment treatment =
-                new DefaultTrafficTreatment.Builder()
-                .add(Instructions.createOutput(port.number()))
-                .build();
+        TrafficTreatment treatment = new DefaultTrafficTreatment.Builder()
+        .setOutput(port.number())
+        .build();
 
         OutboundPacket outboundPacket =
                 new DefaultOutboundPacket(deviceId, treatment,
@@ -163,9 +162,9 @@
 
         ARP arp = new ARP();
         arp.setHardwareType(ARP.HW_TYPE_ETHERNET)
-           .setHardwareAddressLength((byte) Ethernet.DATALAYER_ADDRESS_LENGTH)
-           .setProtocolType(ARP.PROTO_TYPE_IP)
-           .setProtocolAddressLength((byte) IpPrefix.INET_LEN);
+        .setHardwareAddressLength((byte) Ethernet.DATALAYER_ADDRESS_LENGTH)
+        .setProtocolType(ARP.PROTO_TYPE_IP)
+        .setProtocolAddressLength((byte) IpPrefix.INET_LEN);
 
         byte[] sourceMacAddress;
         if (portAddresses.mac() == null) {
@@ -175,15 +174,15 @@
         }
 
         arp.setSenderHardwareAddress(sourceMacAddress)
-           //TODO .setSenderProtocolAddress(portAddresses.ips().toOctets())
-           .setTargetHardwareAddress(ZERO_MAC_ADDRESS)
-           .setTargetProtocolAddress(targetIp.toOctets());
+        //TODO .setSenderProtocolAddress(portAddresses.ips().toOctets())
+        .setTargetHardwareAddress(ZERO_MAC_ADDRESS)
+        .setTargetProtocolAddress(targetIp.toOctets());
 
         Ethernet ethernet = new Ethernet();
         ethernet.setEtherType(Ethernet.TYPE_ARP)
-                .setDestinationMACAddress(BROADCAST_MAC)
-                .setSourceMACAddress(sourceMacAddress)
-                .setPayload(arp);
+        .setDestinationMACAddress(BROADCAST_MAC)
+        .setSourceMACAddress(sourceMacAddress)
+        .setPayload(arp);
 
         return ethernet;
     }
diff --git a/providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/FlowRuleBuilder.java b/providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/FlowRuleBuilder.java
index 39540d7..6d773de 100644
--- a/providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/FlowRuleBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/FlowRuleBuilder.java
@@ -13,8 +13,6 @@
 import org.onlab.onos.net.flow.FlowRule.FlowRuleState;
 import org.onlab.onos.net.flow.TrafficSelector;
 import org.onlab.onos.net.flow.TrafficTreatment;
-import org.onlab.onos.net.flow.criteria.Criteria;
-import org.onlab.onos.net.flow.instructions.Instructions;
 import org.onlab.onos.openflow.controller.Dpid;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
@@ -88,53 +86,53 @@
         TrafficTreatment.Builder builder = new DefaultTrafficTreatment.Builder();
         // If this is a drop rule
         if (actions.size() == 0) {
-            builder.add(Instructions.createDrop());
+            builder.drop();
             return builder.build();
         }
         for (OFAction act : actions) {
             switch (act.getType()) {
             case OUTPUT:
                 OFActionOutput out = (OFActionOutput) act;
-                builder.add(Instructions.createOutput(
-                        PortNumber.portNumber(out.getPort().getPortNumber())));
-                break;
-            case SET_VLAN_PCP:
-                OFActionSetVlanVid vlan = (OFActionSetVlanVid) act;
-                builder.add(Instructions.modVlanId(VlanId.vlanId(vlan.getVlanVid().getVlan())));
+                builder.setOutput(
+                        PortNumber.portNumber(out.getPort().getPortNumber()));
                 break;
             case SET_VLAN_VID:
+                OFActionSetVlanVid vlan = (OFActionSetVlanVid) act;
+                builder.setVlanId(VlanId.vlanId(vlan.getVlanVid().getVlan()));
+                break;
+            case SET_VLAN_PCP:
                 OFActionSetVlanPcp pcp = (OFActionSetVlanPcp) act;
-                builder.add(Instructions.modVlanId(VlanId.vlanId(pcp.getVlanPcp().getValue())));
+                builder.setVlanId(VlanId.vlanId(pcp.getVlanPcp().getValue()));
                 break;
             case SET_DL_DST:
                 OFActionSetDlDst dldst = (OFActionSetDlDst) act;
-                builder.add(Instructions.modL2Dst(
-                        MacAddress.valueOf(dldst.getDlAddr().getLong())));
+                builder.setEthDst(
+                        MacAddress.valueOf(dldst.getDlAddr().getLong()));
                 break;
             case SET_DL_SRC:
                 OFActionSetDlSrc dlsrc = (OFActionSetDlSrc) act;
-                builder.add(Instructions.modL2Src(
-                        MacAddress.valueOf(dlsrc.getDlAddr().getLong())));
+                builder.setEthSrc(
+                        MacAddress.valueOf(dlsrc.getDlAddr().getLong()));
 
                 break;
             case SET_NW_DST:
                 OFActionSetNwDst nwdst = (OFActionSetNwDst) act;
                 IPv4Address di = nwdst.getNwAddr();
                 if (di.isCidrMask()) {
-                    builder.add(Instructions.modL3Dst(IpPrefix.valueOf(di.getInt(),
-                            di.asCidrMaskLength())));
+                    builder.setIpDst(IpPrefix.valueOf(di.getInt(),
+                            di.asCidrMaskLength()));
                 } else {
-                    builder.add(Instructions.modL3Dst(IpPrefix.valueOf(di.getInt())));
+                    builder.setIpDst(IpPrefix.valueOf(di.getInt()));
                 }
                 break;
             case SET_NW_SRC:
                 OFActionSetNwSrc nwsrc = (OFActionSetNwSrc) act;
                 IPv4Address si = nwsrc.getNwAddr();
                 if (si.isCidrMask()) {
-                    builder.add(Instructions.modL3Dst(IpPrefix.valueOf(si.getInt(),
-                            si.asCidrMaskLength())));
+                    builder.setIpSrc(IpPrefix.valueOf(si.getInt(),
+                            si.asCidrMaskLength()));
                 } else {
-                    builder.add(Instructions.modL3Dst(IpPrefix.valueOf(si.getInt())));
+                    builder.setIpSrc(IpPrefix.valueOf(si.getInt()));
                 }
                 break;
             case SET_TP_DST:
@@ -174,20 +172,20 @@
         for (MatchField<?> field : match.getMatchFields()) {
             switch (field.id) {
             case IN_PORT:
-                builder.add(Criteria.matchInPort(PortNumber
-                        .portNumber(match.get(MatchField.IN_PORT).getPortNumber())));
+                builder.matchInport(PortNumber
+                        .portNumber(match.get(MatchField.IN_PORT).getPortNumber()));
                 break;
             case ETH_SRC:
                 MacAddress sMac = MacAddress.valueOf(match.get(MatchField.ETH_SRC).getLong());
-                builder.add(Criteria.matchEthSrc(sMac));
+                builder.matchEthSrc(sMac);
                 break;
             case ETH_DST:
                 MacAddress dMac = MacAddress.valueOf(match.get(MatchField.ETH_DST).getLong());
-                builder.add(Criteria.matchEthDst(dMac));
+                builder.matchEthDst(dMac);
                 break;
             case ETH_TYPE:
                 int ethType = match.get(MatchField.ETH_TYPE).getValue();
-                builder.add(Criteria.matchEthType((short) ethType));
+                builder.matchEthType((short) ethType);
                 break;
             case IPV4_DST:
                 IPv4Address di = match.get(MatchField.IPV4_DST);
@@ -197,7 +195,7 @@
                 } else {
                     dip = IpPrefix.valueOf(di.getInt());
                 }
-                builder.add(Criteria.matchIPDst(dip));
+                builder.matchIPDst(dip);
                 break;
             case IPV4_SRC:
                 IPv4Address si = match.get(MatchField.IPV4_SRC);
@@ -207,19 +205,19 @@
                 } else {
                     sip = IpPrefix.valueOf(si.getInt());
                 }
-                builder.add(Criteria.matchIPSrc(sip));
+                builder.matchIPSrc(sip);
                 break;
             case IP_PROTO:
                 short proto = match.get(MatchField.IP_PROTO).getIpProtocolNumber();
-                builder.add(Criteria.matchIPProtocol((byte) proto));
+                builder.matchIPProtocol((byte) proto);
                 break;
             case VLAN_PCP:
                 byte vlanPcp = match.get(MatchField.VLAN_PCP).getValue();
-                builder.add(Criteria.matchVlanPcp(vlanPcp));
+                builder.matchVlanPcp(vlanPcp);
                 break;
             case VLAN_VID:
                 VlanId vlanId = VlanId.vlanId(match.get(MatchField.VLAN_VID).getVlan());
-                builder.add(Criteria.matchVlanId(vlanId));
+                builder.matchVlanId(vlanId);
                 break;
             case ARP_OP:
             case ARP_SHA:
