flowrules are pushed: we still have an intermittent hang though
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultFlowRule.java b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultFlowRule.java
new file mode 100644
index 0000000..801e8f9
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultFlowRule.java
@@ -0,0 +1,38 @@
+package org.onlab.onos.net.flow;
+
+import org.onlab.onos.net.DeviceId;
+
+public class DefaultFlowRule implements FlowRule {
+
+    private final TrafficSelector selector;
+    private final TrafficTreatment treatment;
+    private final DeviceId deviceId;
+
+    public DefaultFlowRule(DeviceId deviceId,
+            TrafficSelector selector, TrafficTreatment treatment) {
+        this.treatment = treatment;
+        this.selector = selector;
+        this.deviceId = deviceId;
+    }
+
+    @Override
+    public int priority() {
+        return 0;
+    }
+
+    @Override
+    public DeviceId deviceId() {
+        return deviceId;
+    }
+
+    @Override
+    public TrafficSelector selector() {
+        return selector;
+    }
+
+    @Override
+    public TrafficTreatment treatment() {
+        return treatment;
+    }
+
+}
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
new file mode 100644
index 0000000..9ec49e4
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficSelector.java
@@ -0,0 +1,44 @@
+package org.onlab.onos.net.flow;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.onlab.onos.net.flow.criteria.Criterion;
+import org.slf4j.Logger;
+
+public final class DefaultTrafficSelector implements TrafficSelector {
+
+    private final List<Criterion> selector;
+
+    private DefaultTrafficSelector(List<Criterion> selector) {
+        this.selector = Collections.unmodifiableList(selector);
+    }
+
+    @Override
+    public List<Criterion> criteria() {
+        return selector;
+    }
+
+    public static class Builder implements TrafficSelector.Builder {
+
+        private final Logger log = getLogger(getClass());
+
+        private final List<Criterion> selector = new LinkedList<>();
+
+        @Override
+        public TrafficSelector.Builder add(Criterion criterion) {
+            selector.add(criterion);
+            return this;
+        }
+
+        @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 0bf4ea8..9de68dc 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
@@ -9,12 +9,11 @@
 import org.onlab.onos.net.flow.instructions.Instruction;
 import org.slf4j.Logger;
 
-@SuppressWarnings("rawtypes")
-public class DefaultTrafficTreatment implements TrafficTreatment {
+public final class DefaultTrafficTreatment implements TrafficTreatment {
 
     private final List<Instruction> instructions;
 
-    public DefaultTrafficTreatment(List<Instruction> instructions) {
+    private DefaultTrafficTreatment(List<Instruction> instructions) {
         this.instructions = Collections.unmodifiableList(instructions);
     }