diff --git a/drivers/src/main/java/org/onosproject/driver/pipeline/OFDPA1Pipeline.java b/drivers/src/main/java/org/onosproject/driver/pipeline/OFDPA1Pipeline.java
index fb5d701..07983a3 100644
--- a/drivers/src/main/java/org/onosproject/driver/pipeline/OFDPA1Pipeline.java
+++ b/drivers/src/main/java/org/onosproject/driver/pipeline/OFDPA1Pipeline.java
@@ -105,7 +105,7 @@
 
     private static final int HIGHEST_PRIORITY = 0xffff;
     private static final int DEFAULT_PRIORITY = 0x8000;
-    private static final int LOWEST_PRIORITY = 0x0;
+    protected static final int LOWEST_PRIORITY = 0x0;
 
     /*
      * Group keys are normally generated by using the next Objective id. In the
@@ -130,12 +130,12 @@
 
     private final Logger log = getLogger(getClass());
     private ServiceDirectory serviceDirectory;
-    private FlowRuleService flowRuleService;
+    protected FlowRuleService flowRuleService;
     private CoreService coreService;
     private GroupService groupService;
     private FlowObjectiveStore flowObjectiveStore;
-    private DeviceId deviceId;
-    private ApplicationId driverId;
+    protected DeviceId deviceId;
+    protected ApplicationId driverId;
 
     private KryoNamespace appKryo = new KryoNamespace.Builder()
         .register(KryoNamespaces.API)
@@ -610,7 +610,7 @@
     }
 
 
-    private void initializePipeline() {
+    protected void initializePipeline() {
         processPortTable();
         processVlanTable();
         processTmacTable();
@@ -621,7 +621,7 @@
         //processGroupTable();
     }
 
-    private void processPortTable() {
+    protected void processPortTable() {
         //XXX is table miss entry enough or do we need to do the maskable in-port 0?
         FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
         TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
@@ -653,56 +653,12 @@
     }
 
     private void processVlanTable() {
-        // make these up for now - should really be filtering rules
-        /*FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
-        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
-        TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
-        selector.matchInPort(PortNumber.portNumber(10));
-        selector.matchVlanId(VlanId.vlanId((short) 100));
-        treatment.transition(TMAC_TABLE);
-        FlowRule rule = DefaultFlowRule.builder()
-                .forDevice(deviceId)
-                .withSelector(selector.build())
-                .withTreatment(treatment.build())
-                .withPriority(DEFAULT_PRIORITY)
-                .fromApp(appId)
-                .makePermanent()
-                .forTable(VLAN_TABLE).build();
-        ops =  ops.add(rule);
-        flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
-            @Override
-            public void onSuccess(FlowRuleOperations ops) {
-                log.info("Initialized vlan table");
-            }
-
-            @Override
-            public void onError(FlowRuleOperations ops) {
-                log.info("Failed to initialize vlan table");
-            }
-        }));*/
-
         // Table miss entry is not required as ofdpa default is to drop
         // In OF terms, the absence of a t.m.e. also implies drop
     }
 
 
-    private void processTmacTable() {
-        // this is made up as well -- should be a filtering rule
-        /*selector.matchInPort(PortNumber.portNumber(10));
-        selector.matchVlanId(VlanId.vlanId((short) 100));
-        selector.matchEthType(Ethernet.TYPE_IPV4);
-        selector.matchEthDst(MacAddress.valueOf("00:00:00:ba:ba:00"));
-        treatment.transition(UNICAST_ROUTING_TABLE);
-        FlowRule rule = DefaultFlowRule.builder()
-                .forDevice(deviceId)
-                .withSelector(selector.build())
-                .withTreatment(treatment.build())
-                .withPriority(DEFAULT_PRIORITY)
-                .fromApp(appId)
-                .makePermanent()
-                .forTable(TMAC_TABLE).build();
-        ops =  ops.add(rule);*/
-
+    protected void processTmacTable() {
         //table miss entry
         FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
         TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
@@ -732,7 +688,7 @@
         }));*/
     }
 
-    private void processIpTable() {
+    protected void processIpTable() {
         //table miss entry
         FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
         TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
@@ -762,72 +718,16 @@
         }));*/
     }
 
-    @SuppressWarnings("unused")
-    private void processGroupTable() {
-        // Creating a dummy L2 group as per OFDPA requirements
-       /* TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                                        .setOutput(PortNumber.portNumber(10))
-                                        .build();
-        NextObjective nextObjective = DefaultNextObjective.builder()
-                .addTreatment(treatment)
-                .fromApp(appId)
-                .withId(678) // dummy next objective id
-                .withType(NextObjective.Type.SIMPLE)
-                .add();
-        Integer l2groupId = 0x0064000a;
-        GroupBucket bucket =
-                DefaultGroupBucket.createIndirectGroupBucket(treatment);
-        final GroupKey key = new DefaultGroupKey(appKryo.serialize(678));
-        GroupDescription groupDescriptionl2
-            = new DefaultGroupDescription(deviceId,
-                                      GroupDescription.Type.INDIRECT,
-                                      new GroupBuckets(Collections
-                                                       .singletonList(bucket)),
-                                      key,
-                                      l2groupId,
-                                      appId);
-        groupService.addGroup(groupDescriptionl2);*/
-        //pendingNextObjectives.put(key, nextObjective);
-
-    }
-
-    @SuppressWarnings("unused")
-    private void tryGroupChain() {
-      //Create a dummy L3 group as per OFDPA requirements
-        /*TrafficTreatment treatment2 = DefaultTrafficTreatment.builder()
-                .setEthDst(MacAddress.valueOf("00:00:00:aa:aa:aa"))
-                .setEthSrc(MacAddress.valueOf("00:00:00:dd:dd:dd"))
-                .setVlanId(VlanId.vlanId((short) 100))
-                .group(new DefaultGroupId(0x0064000a))
-                .build();
-        NextObjective nextObjective2 = DefaultNextObjective.builder()
-                .addTreatment(treatment2)
-                .fromApp(appId)
-                .withId(67800) // another dummy next objective id
-                .withType(NextObjective.Type.SIMPLE)
-                .add();
-        Integer l3groupId = 0x2000000a;
-        GroupBucket bucket2 = DefaultGroupBucket.createIndirectGroupBucket(treatment2);
-        final GroupKey key2 = new DefaultGroupKey(appKryo.serialize(67800));
-        GroupDescription groupDescriptionl3
-               = new DefaultGroupDescription(deviceId,
-                                  GroupDescription.Type.INDIRECT,
-                                  new GroupBuckets(Collections
-                                                   .singletonList(bucket2)),
-                                  key2,
-                                  l3groupId,
-                                  appId);
-        groupService.addGroup(groupDescriptionl3);
-        pendingNextObjectives.put(key2, nextObjective2);
-    */
-    }
-
     private class GroupChecker implements Runnable {
         @Override
         public void run() {
             Set<GroupKey> keys = pendingGroups.keySet().stream()
                     .filter(key -> groupService.getGroup(deviceId, key) != null)
                     .collect(Collectors.toSet());
+            Set<GroupKey> otherkeys = pendingNextObjectives.asMap().keySet().stream()
+                    .filter(otherkey -> groupService.getGroup(deviceId, otherkey) != null)
+                    .collect(Collectors.toSet());
+            keys.addAll(otherkeys);
 
             keys.stream().forEach(key -> {
                 //first check for group chain
@@ -856,7 +756,7 @@
     private class InnerGroupListener implements GroupListener {
         @Override
         public void event(GroupEvent event) {
-            log.info("received group event of type {}", event.type());
+            log.debug("received group event of type {}", event.type());
             if (event.type() == GroupEvent.Type.GROUP_ADDED) {
                 GroupKey key = event.subject().appCookie();
                 // first check for group chain
