diff --git a/core/api/src/main/java/org/onosproject/net/flow/DefaultFlowRule.java b/core/api/src/main/java/org/onosproject/net/flow/DefaultFlowRule.java
index 4b9057f..63baa68 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/DefaultFlowRule.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/DefaultFlowRule.java
@@ -23,6 +23,8 @@
 import java.util.Objects;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 public class DefaultFlowRule implements FlowRule {
 
@@ -34,15 +36,17 @@
 
     private final FlowId id;
 
-    private final short appId;
+    private final Short appId;
 
     private final int timeout;
     private final boolean permanent;
     private final GroupId groupId;
 
     private final Type type;
+    private final Integer tableId;
 
 
+    @Deprecated
     public DefaultFlowRule(DeviceId deviceId, TrafficSelector selector,
             TrafficTreatment treatment, int priority, long flowId,
             int timeout, boolean permanent) {
@@ -58,8 +62,10 @@
         this.groupId = new DefaultGroupId((short) ((flowId >>> 32) & 0xFFFF));
         this.id = FlowId.valueOf(flowId);
         this.type = Type.DEFAULT;
+        this.tableId = 0;
     }
 
+    @Deprecated
     public DefaultFlowRule(DeviceId deviceId, TrafficSelector selector,
                            TrafficTreatment treatment, int priority, long flowId,
                            int timeout, boolean permanent, Type tableType) {
@@ -75,8 +81,11 @@
         this.groupId = new DefaultGroupId((short) ((flowId >>> 32) & 0xFFFF));
         this.id = FlowId.valueOf(flowId);
         this.type = tableType;
+        this.tableId = 0;
+
     }
 
+    @Deprecated
     public DefaultFlowRule(DeviceId deviceId, TrafficSelector selector,
                            TrafficTreatment treatment, int priority, ApplicationId appId,
                            int timeout, boolean permanent) {
@@ -84,6 +93,7 @@
                 timeout, permanent);
     }
 
+    @Deprecated
     public DefaultFlowRule(DeviceId deviceId, TrafficSelector selector,
                            TrafficTreatment treatment, int priority, ApplicationId appId,
                            int timeout, boolean permanent, Type type) {
@@ -102,6 +112,7 @@
         this.permanent = permanent;
         this.created = System.currentTimeMillis();
         this.type = type;
+        this.tableId = 0;
 
         /*
          * id consists of the following.
@@ -112,6 +123,7 @@
 
     }
 
+    @Deprecated
     public DefaultFlowRule(DeviceId deviceId, TrafficSelector selector,
                            TrafficTreatment treatment, int priority, ApplicationId appId,
                            GroupId groupId, int timeout, boolean permanent) {
@@ -130,6 +142,7 @@
         this.permanent = permanent;
         this.created = System.currentTimeMillis();
         this.type = Type.DEFAULT;
+        this.tableId = 0;
 
         /*
          * id consists of the following.
@@ -151,6 +164,31 @@
         this.permanent = rule.isPermanent();
         this.created = System.currentTimeMillis();
         this.type = rule.type();
+        this.tableId = rule.tableId();
+
+    }
+
+    private DefaultFlowRule(DeviceId deviceId, TrafficSelector selector,
+                            TrafficTreatment treatment, Integer priority,
+                            FlowId flowId, Boolean permanent, Integer timeout,
+                            Integer tableId) {
+
+        this.deviceId = deviceId;
+        this.selector = selector;
+        this.treatment = treatment;
+        this.priority = priority;
+        this.appId = (short) (flowId.value() >>> 48);
+        this.id = flowId;
+        this.permanent = permanent;
+        this.timeout = timeout;
+        this.tableId = tableId;
+        this.created = System.currentTimeMillis();
+
+
+        //FIXME: fields below will be removed.
+        this.groupId = null;
+        this.type = null;
+
 
     }
 
@@ -197,7 +235,7 @@
      * @see java.lang.Object#equals(java.lang.Object)
      */
     public int hashCode() {
-        return Objects.hash(deviceId, selector, priority, type);
+        return Objects.hash(deviceId, selector, priority, type, tableId);
     }
 
     public int hash() {
@@ -220,6 +258,7 @@
             return Objects.equals(deviceId, that.deviceId) &&
                     Objects.equals(priority, that.priority) &&
                     Objects.equals(selector, that.selector) &&
+                    Objects.equals(tableId, that.tableId) &&
                     Objects.equals(type, that.type);
 
         }
@@ -254,4 +293,107 @@
         return type;
     }
 
+    @Override
+    public int tableId() {
+        return tableId;
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    private static final class Builder implements FlowRule.Builder {
+
+        private FlowId flowId;
+        private Integer priority;
+        private DeviceId deviceId;
+        private Integer tableId = 0;
+        private TrafficSelector selector;
+        private TrafficTreatment treatment;
+        private Integer timeout;
+        private Boolean permanent;
+
+        @Override
+        public FlowRule.Builder withCookie(long cookie) {
+            this.flowId = FlowId.valueOf(cookie);
+            return this;
+        }
+
+        @Override
+        public FlowRule.Builder fromApp(ApplicationId appId) {
+            this.flowId = computeFlowId(appId);
+            return this;
+        }
+
+        @Override
+        public FlowRule.Builder withPriority(int priority) {
+            this.priority = priority;
+            return this;
+        }
+
+        @Override
+        public FlowRule.Builder forDevice(DeviceId deviceId) {
+            this.deviceId = deviceId;
+            return this;
+        }
+
+        @Override
+        public FlowRule.Builder forTable(int tableId) {
+            this.tableId = tableId;
+            return this;
+        }
+
+        @Override
+        public FlowRule.Builder withSelector(TrafficSelector selector) {
+            this.selector = selector;
+            return this;
+        }
+
+        @Override
+        public FlowRule.Builder withTreatment(TrafficTreatment treatment) {
+            this.treatment = treatment;
+            return this;
+        }
+
+        @Override
+        public FlowRule.Builder makePermanent() {
+            this.timeout = 0;
+            this.permanent = true;
+            return this;
+        }
+
+        @Override
+        public FlowRule.Builder makeTemporary(int timeout) {
+            this.permanent = false;
+            this.timeout = timeout;
+            return this;
+        }
+
+        @Override
+        public FlowRule build() {
+            checkNotNull(flowId != null, "Either an application" +
+                    " id or a cookie must be supplied");
+            checkNotNull(selector != null, "Traffic selector cannot be null");
+            checkNotNull(timeout != null || permanent != null, "Must either have " +
+                    "a timeout or be permanent");
+            checkNotNull(deviceId != null, "Must refer to a device");
+            checkNotNull(priority != null, "Priority cannot be null");
+            checkArgument(priority < MIN_PRIORITY, "Priority cannot be less than " +
+                    MIN_PRIORITY);
+
+            return new DefaultFlowRule(deviceId, selector, treatment, priority,
+                                       flowId, permanent, timeout, tableId);
+        }
+
+        private FlowId computeFlowId(ApplicationId appId) {
+            return FlowId.valueOf((((long) appId.id()) << 48)
+                                   | (hash() & 0xffffffffL));
+        }
+
+        private int hash() {
+            return Objects.hash(deviceId, selector, treatment, tableId);
+        }
+
+    }
+
 }
diff --git a/core/api/src/main/java/org/onosproject/net/flow/FlowRule.java b/core/api/src/main/java/org/onosproject/net/flow/FlowRule.java
index 0fb7658..a126f18 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/FlowRule.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/FlowRule.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.net.flow;
 
+import org.onosproject.core.ApplicationId;
 import org.onosproject.core.GroupId;
 import org.onosproject.net.DeviceId;
 
@@ -32,6 +33,7 @@
      * needs to be put for multi-table support switch.
      * For single table switch, Default is used.
      */
+    @Deprecated
     public static enum Type {
         /* Default type - used in flow rule for single table switch
          * NOTE: this setting should not be used as Table 0 in a multi-table pipeline*/
@@ -59,7 +61,6 @@
         FIRST,
     }
 
-    //TODO: build cookie value
     /**
      * Returns the ID of this flow.
      *
@@ -130,6 +131,105 @@
      *
      * @return flow rule type
      */
+    @Deprecated
     Type type();
 
+    /**
+     * Returns the table id for this rule.
+     *
+     * @return an integer.
+     */
+    int tableId();
+
+    /**
+     * A flowrule builder.
+     */
+    public interface Builder {
+
+        /**
+         * Assigns a cookie value to this flowrule. Mutually exclusive with the
+         * fromApp method. This method is intended to take a cookie value from
+         * the dataplane and not from the application.
+         *
+         * @param cookie a long value
+         * @return this
+         */
+        Builder withCookie(long cookie);
+
+        /**
+         * Assigns the application that built this flow rule to this object.
+         * The short value of the appId will be used as a basis for the
+         * cookie value computation. It is expected that application use this
+         * call to set their application id.
+         *
+         * @param appId an application id
+         * @return this
+         */
+        Builder fromApp(ApplicationId appId);
+
+        /**
+         * Sets the priority for this flow rule.
+         *
+         * @param priority an integer
+         * @return this
+         */
+        Builder withPriority(int priority);
+
+        /**
+         * Sets the deviceId for this flow rule.
+         *
+         * @param deviceId a device id
+         * @return this
+         */
+        Builder forDevice(DeviceId deviceId);
+
+        /**
+         * Sets the table id for this flow rule. Default value is 0.
+         *
+         * @param tableId an integer
+         * @return this
+         */
+        Builder forTable(int tableId);
+
+        /**
+         * Sets the selector (or match field) for this flow rule.
+         *
+         * @param selector a traffic selector
+         * @return this
+         */
+        Builder withSelector(TrafficSelector selector);
+
+        /**
+         * Sets the traffic treatment for this flow rule.
+         *
+         * @param treatment a traffic treatment
+         * @return this
+         */
+        Builder withTreatment(TrafficTreatment treatment);
+
+        /**
+         * Makes this rule permanent on the dataplane.
+         *
+         * @return this
+         */
+        Builder makePermanent();
+
+        /**
+         * Makes this rule temporary and timeout after the specified amount
+         * of time.
+         *
+         * @param timeout an integer
+         * @return this
+         */
+        Builder makeTemporary(int timeout);
+
+        /**
+         * Builds a flow rule object.
+         *
+         * @return a flow rule.
+         */
+        FlowRule build();
+
+    }
+
 }
