diff --git a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
index 462bcc0..e196fe5 100644
--- a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
+++ b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
@@ -252,10 +252,8 @@
 
             flowObjectiveService.forward(deviceId,
                                          generateRibFlowRule(fibEntry.prefix(), nextId).add());
-
-
+            log.trace("Sending flow forwarding objective {}->{}", fibEntry, nextId);
         }
-        log.info("Sending flow forwarding objective");
 
     }
 
@@ -325,8 +323,10 @@
                     .setOutput(egressIntf.connectPoint().port())
                     .build();
 
+            int nextId = flowObjectiveService.allocateNextId();
+
             NextObjective nextObjective = DefaultNextObjective.builder()
-                    .withId(entry.hashCode())
+                    .withId(nextId)
                     .addTreatment(treatment)
                     .withType(NextObjective.Type.SIMPLE)
                     .fromApp(appId)
@@ -348,7 +348,7 @@
             groupService.addGroup(groupDescription);
             */
 
-            nextHops.put(nextHop.ip(), flowObjectiveService.allocateNextId());
+            nextHops.put(nextHop.ip(), nextId);
 
         }
 
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 f944f4b..81c0638 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
@@ -365,7 +365,7 @@
                     "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 " +
+            checkArgument(priority >= MIN_PRIORITY, "Priority cannot be less than " +
                     MIN_PRIORITY);
 
             return new DefaultFlowRule(deviceId, selector, treatment, priority,
diff --git a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java
index 6b84bfa..7f6b0ee 100644
--- a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java
+++ b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java
@@ -178,7 +178,7 @@
     private boolean queueObjective(DeviceId deviceId, ForwardingObjective fwd) {
         if (fwd.nextId() != null &&
                 flowObjectiveStore.getNextGroup(fwd.nextId()) == null) {
-            log.warn("Queuing forwarding objective.");
+            log.trace("Queuing forwarding objective for nextId {}", fwd.nextId());
             if (pendingForwards.putIfAbsent(fwd.nextId(),
                                 Sets.newHashSet(new PendingNext(deviceId, fwd))) != null) {
                 Set<PendingNext> pending = pendingForwards.get(fwd.nextId());
@@ -226,10 +226,11 @@
             }
 
             // Always (re)initialize the pipeline behaviour
+            log.info("Driver {} bound to device {} ... initializing driver",
+                     handler.driver().name(), deviceId);
             Pipeliner pipeliner = handler.behaviour(Pipeliner.class);
             pipeliner.init(deviceId, context);
             pipeliners.putIfAbsent(deviceId, pipeliner);
-            log.info("Driver {} bound to device {}", handler.driver().name(), deviceId);
         }
     }
 
@@ -241,6 +242,7 @@
                 case MASTER_CHANGED:
                     if (event.roleInfo().master() != null) {
                         setupPipelineHandler(event.subject());
+                        log.info("mastership changed on device {}", event.subject());
                     }
                     break;
                 case BACKUPS_CHANGED:
@@ -258,7 +260,10 @@
             switch (event.type()) {
                 case DEVICE_ADDED:
                 case DEVICE_AVAILABILITY_CHANGED:
+                    log.info("Device either added or availability changed {}",
+                             event.subject().id());
                     if (deviceService.isAvailable(event.subject().id())) {
+                        log.info("Device is now available {}", event.subject().id());
                         setupPipelineHandler(event.subject().id());
                         processPendingObjectives(event.subject().id());
                     }
@@ -281,6 +286,8 @@
         }
 
         private void processPendingObjectives(DeviceId deviceId) {
+            log.debug("Processing pending objectives for device {}", deviceId);
+
             pendingObjectives.getOrDefault(deviceId,
                                            Collections.emptySet()).forEach(obj -> {
                 if (obj instanceof NextObjective) {
@@ -313,13 +320,15 @@
     private class InternalStoreDelegate implements FlowObjectiveStoreDelegate {
         @Override
         public void notify(ObjectiveEvent event) {
+            log.debug("Received notification of obj event {}", event);
             Set<PendingNext> pending = pendingForwards.remove(event.subject());
 
             if (pending == null) {
+                log.debug("Nothing pending for this obj event");
                 return;
             }
 
-            log.info("Processing pending objectives {}", pending.size());
+            log.debug("Processing pending forwarding objectives {}", pending.size());
 
             pending.forEach(p -> getDevicePipeliner(p.deviceId())
                     .forward(p.forwardingObjective()));
diff --git a/drivers/src/main/java/org/onosproject/driver/pipeline/OVSCorsaPipeline.java b/drivers/src/main/java/org/onosproject/driver/pipeline/OVSCorsaPipeline.java
index c54be23..4d1284b 100644
--- a/drivers/src/main/java/org/onosproject/driver/pipeline/OVSCorsaPipeline.java
+++ b/drivers/src/main/java/org/onosproject/driver/pipeline/OVSCorsaPipeline.java
@@ -79,7 +79,7 @@
 
 
 
-    protected static final int FIRST_TABLE = 0;
+    protected static final int MAC_TABLE = 0;
     protected static final int VLAN_MPLS_TABLE = 1;
     protected static final int VLAN_TABLE = 2;
     //protected static final int MPLS_TABLE = 3;
@@ -329,7 +329,7 @@
                         .withPriority(CONTROLLER_PRIORITY)
                         .fromApp(applicationId)
                         .makePermanent()
-                        .forTable(FIRST_TABLE).build();
+                        .forTable(MAC_TABLE).build();
                 ops =  install ? ops.add(rule) : ops.remove(rule);
             } else if (c.type() == Criterion.Type.VLAN_VID) {
                 Criteria.VlanIdCriterion v = (Criteria.VlanIdCriterion) c;
@@ -378,13 +378,13 @@
             @Override
             public void onSuccess(FlowRuleOperations ops) {
                 pass(filt);
-                log.info("Provisioned default table for bgp router");
+                log.info("Applied filtering rules");
             }
 
             @Override
             public void onError(FlowRuleOperations ops) {
                 fail(filt, ObjectiveError.FLOWINSTALLATIONFAILED);
-                log.info("Failed to provision default table for bgp router");
+                log.info("Failed to apply filtering rules");
             }
         }));
     }
@@ -402,16 +402,16 @@
     }
 
     private void pushDefaultRules() {
-        processTableZero(true);
-        processTableOne(true);
-        processTableTwo(true);
-        processTableFour(true);
-        processTableFive(true);
-        processTableSix(true);
-        processTableNine(true);
+        processMacTable(true);
+        processVlanMplsTable(true);
+        processVlanTable(true);
+        processEtherTable(true);
+        processCosTable(true);
+        processFibTable(true);
+        processLocalTable(true);
     }
 
-    private void processTableZero(boolean install) {
+    private void processMacTable(boolean install) {
         TrafficSelector.Builder selector;
         TrafficTreatment.Builder treatment;
 
@@ -429,7 +429,7 @@
                 .withPriority(CONTROLLER_PRIORITY)
                 .fromApp(appId)
                 .makePermanent()
-                .forTable(FIRST_TABLE).build();
+                .forTable(MAC_TABLE).build();
 
 
         FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
@@ -450,7 +450,7 @@
                 .withPriority(DROP_PRIORITY)
                 .fromApp(appId)
                 .makePermanent()
-                .forTable(FIRST_TABLE).build();
+                .forTable(MAC_TABLE).build();
 
 
         ops = install ? ops.add(rule) : ops.remove(rule);
@@ -458,18 +458,18 @@
         flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
             @Override
             public void onSuccess(FlowRuleOperations ops) {
-                log.info("Provisioned default table for bgp router");
+                log.info("Provisioned mac table");
             }
 
             @Override
             public void onError(FlowRuleOperations ops) {
-                log.info("Failed to provision default table for bgp router");
+                log.info("Failed to provision mac table");
             }
         }));
 
     }
 
-    private void processTableOne(boolean install) {
+    private void processVlanMplsTable(boolean install) {
         TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
         TrafficTreatment.Builder treatment = DefaultTrafficTreatment
                 .builder();
@@ -494,19 +494,19 @@
         flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
             @Override
             public void onSuccess(FlowRuleOperations ops) {
-                log.info("Provisioned vlan/mpls table for bgp router");
+                log.info("Provisioned vlan/mpls table");
             }
 
             @Override
             public void onError(FlowRuleOperations ops) {
                 log.info(
-                        "Failed to provision vlan/mpls table for bgp router");
+                        "Failed to provision vlan/mpls table");
             }
         }));
 
     }
 
-    private void processTableTwo(boolean install) {
+    private void processVlanTable(boolean install) {
         TrafficSelector.Builder selector;
         TrafficTreatment.Builder treatment;
         FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
@@ -533,17 +533,17 @@
         flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
             @Override
             public void onSuccess(FlowRuleOperations ops) {
-                log.info("Provisioned vlan table for bgp router");
+                log.info("Provisioned vlan table");
             }
 
             @Override
             public void onError(FlowRuleOperations ops) {
-                log.info("Failed to provision vlan table for bgp router");
+                log.info("Failed to provision vlan table");
             }
         }));
     }
 
-    private void processTableFour(boolean install) {
+    private void processEtherTable(boolean install) {
         TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
         TrafficTreatment.Builder treatment = DefaultTrafficTreatment
                 .builder();
@@ -602,18 +602,18 @@
         flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
             @Override
             public void onSuccess(FlowRuleOperations ops) {
-                log.info("Provisioned ether table for bgp router");
+                log.info("Provisioned ether table");
             }
 
             @Override
             public void onError(FlowRuleOperations ops) {
-                log.info("Failed to provision ether table for bgp router");
+                log.info("Failed to provision ether table");
             }
         }));
 
     }
 
-    private void processTableFive(boolean install) {
+    private void processCosTable(boolean install) {
         TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
         TrafficTreatment.Builder treatment = DefaultTrafficTreatment
                 .builder();
@@ -636,18 +636,18 @@
         flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
             @Override
             public void onSuccess(FlowRuleOperations ops) {
-                log.info("Provisioned cos table for bgp router");
+                log.info("Provisioned cos table");
             }
 
             @Override
             public void onError(FlowRuleOperations ops) {
-                log.info("Failed to provision cos table for bgp router");
+                log.info("Failed to provision cos table");
             }
         }));
 
     }
 
-    private void processTableSix(boolean install) {
+    private void processFibTable(boolean install) {
         TrafficSelector.Builder selector;
         TrafficTreatment.Builder treatment;
         FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
@@ -673,17 +673,17 @@
         flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
             @Override
             public void onSuccess(FlowRuleOperations ops) {
-                log.info("Provisioned FIB table for bgp router");
+                log.info("Provisioned FIB table");
             }
 
             @Override
             public void onError(FlowRuleOperations ops) {
-                log.info("Failed to provision FIB table for bgp router");
+                log.info("Failed to provision FIB table");
             }
         }));
     }
 
-    private void processTableNine(boolean install) {
+    private void processLocalTable(boolean install) {
         TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
         TrafficTreatment.Builder treatment = DefaultTrafficTreatment
                 .builder();
@@ -706,12 +706,12 @@
         flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
             @Override
             public void onSuccess(FlowRuleOperations ops) {
-                log.info("Provisioned Local table for bgp router");
+                log.info("Provisioned Local table");
             }
 
             @Override
             public void onError(FlowRuleOperations ops) {
-                log.info("Failed to provision Local table for bgp router");
+                log.info("Failed to provision Local table");
             }
         }));
     }
@@ -748,6 +748,7 @@
                 }
                 pass(obj);
                 pendingGroups.invalidate(key);
+                log.info("Heard back from group service for group {}", obj.id());
                 flowObjectiveStore.putNextGroup(obj.id(), new CorsaGroup(key));
             });
         }
diff --git a/openflow/drivers/src/main/java/org/onosproject/openflow/drivers/OFCorsaSwitchDriver.java b/openflow/drivers/src/main/java/org/onosproject/openflow/drivers/OFCorsaSwitchDriver.java
index 5cbdc0f..5fe41dd 100644
--- a/openflow/drivers/src/main/java/org/onosproject/openflow/drivers/OFCorsaSwitchDriver.java
+++ b/openflow/drivers/src/main/java/org/onosproject/openflow/drivers/OFCorsaSwitchDriver.java
@@ -38,7 +38,7 @@
 import org.projectfloodlight.openflow.types.OFVlanVidMatch;
 import org.projectfloodlight.openflow.types.TableId;
 
-import java.util.ArrayList;
+//import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -79,7 +79,7 @@
      */
     @Override
     public void write(OFMessage msg) {
-        if (msg.getType() == OFType.FLOW_MOD) {
+/*        if (msg.getType() == OFType.FLOW_MOD) {
             OFFlowMod flowMod = (OFFlowMod) msg;
             OFFlowMod.Builder builder = flowMod.createBuilder();
             builder.setTableId(TableId.of(LOCAL_TABLE));
@@ -87,11 +87,13 @@
         } else {
             channel.write(Collections.singletonList(msg));
         }
+*/
+        channel.write(Collections.singletonList(msg));
     }
 
     @Override
     public void write(List<OFMessage> msgs) {
-        List<OFMessage> newMsgs = new ArrayList<OFMessage>();
+/*        List<OFMessage> newMsgs = new ArrayList<OFMessage>();
         for (OFMessage msg : msgs) {
             if (msg.getType() == OFType.FLOW_MOD) {
                 OFFlowMod flowMod = (OFFlowMod) msg;
@@ -103,6 +105,8 @@
             }
         }
         channel.write(newMsgs);
+*/
+        channel.write(msgs);
     }
 
     @Override
diff --git a/openflow/drivers/src/main/java/org/onosproject/openflow/drivers/OFOVSSwitchCorsaTTP.java b/openflow/drivers/src/main/java/org/onosproject/openflow/drivers/OFOVSSwitchCorsaTTP.java
index 46fb87e..9e85def 100644
--- a/openflow/drivers/src/main/java/org/onosproject/openflow/drivers/OFOVSSwitchCorsaTTP.java
+++ b/openflow/drivers/src/main/java/org/onosproject/openflow/drivers/OFOVSSwitchCorsaTTP.java
@@ -15,18 +15,18 @@
  */
 package org.onosproject.openflow.drivers;
 
-import com.google.common.collect.Lists;
 import org.onosproject.openflow.controller.Dpid;
 import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
-import org.projectfloodlight.openflow.protocol.OFFlowMod;
 import org.projectfloodlight.openflow.protocol.OFMessage;
+/*import com.google.common.collect.Lists;
+import org.projectfloodlight.openflow.protocol.OFFlowMod;
 import org.projectfloodlight.openflow.protocol.OFType;
 import org.projectfloodlight.openflow.protocol.instruction.OFInstruction;
 import org.projectfloodlight.openflow.protocol.instruction.OFInstructionGotoTable;
 import org.projectfloodlight.openflow.types.TableId;
-
-import java.util.Collections;
 import java.util.List;
+*/
+import java.util.Collections;
 
 public class OFOVSSwitchCorsaTTP extends OFCorsaSwitchDriver {
 
@@ -36,7 +36,7 @@
 
     @Override
     public void transformAndSendMsg(OFMessage msg, TableType type) {
-        log.trace("Trying to send {} of TableType {}", msg, type);
+        /*log.trace("Trying to send {} of TableType {}", msg, type);
         if (msg.getType() == OFType.FLOW_MOD) {
             OFFlowMod flowMod = (OFFlowMod) msg;
             OFFlowMod.Builder builder = flowMod.createBuilder();
@@ -84,10 +84,10 @@
                             break;
                         case NONE:
                             log.error("Should never have to go to Table 0");
-                            /*newInstructions.add(
+                            newInstructions.add(
                                     gotoTable.createBuilder()
                                             .setTableId(TableId.of(0)).build());
-                            */
+
                             break;
                         default:
                             log.warn("Unknown table type: {}", tid);
@@ -134,6 +134,7 @@
 
         } else {
             channel.write(Collections.singletonList(msg));
-        }
+        }*/
+        channel.write(Collections.singletonList(msg));
     }
 }
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
index 32042fe..5b4e286 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
@@ -211,11 +211,12 @@
                               fbe.operator(), fbe);
                     continue;
                 }
-            if (fbe.target().tableId() == 0) {
+            /*if (fbe.target().tableId() == 0) {
                 sw.sendMsg(mod);
             } else {
                 sw.transformAndSendMsg(mod, getTableType(fbe.target().tableId()));
-            }
+            }*/
+            sw.sendMsg(mod);
         }
         OFBarrierRequest.Builder builder = sw.factory()
                 .buildBarrierRequest()
