diff --git a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/RoleManager.java b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/RoleManager.java
index 50e7b33..99e9173 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/RoleManager.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/RoleManager.java
@@ -241,7 +241,6 @@
         int xid = (int) rri.getXid();
         RoleState role = rri.getRole();
         // XXX S should check generation id meaningfully and other cases of expectations
-        // U64 genId = rri.getGenId();
 
         if (pendingXid != xid) {
             log.debug("Received older role reply from " +
@@ -257,7 +256,6 @@
                     + "expected role-reply {} with expectations {}",
                     new Object[] {sw.getStringId(), role, expectation});
 
-            //setSwitchRole(role, RoleRecvStatus.RECEIVED_REPLY); dont want to set state here
             if (expectation == RoleRecvStatus.MATCHED_CURRENT_ROLE ||
                     expectation == RoleRecvStatus.MATCHED_SET_ROLE) {
                 return expectation;
@@ -482,224 +480,3 @@
 
 }
 
-
-///**
-// * We are waiting for a role reply message in response to a role request
-// * sent after hearing back from the registry service -- OR -- we are
-// * just waiting to hear back from the registry service in the case that
-// * the switch does not support role messages. If completed successfully,
-// * the controller's role for this switch will be set here.
-// * Before we move to the state corresponding to the role, we allow the
-// * switch specific driver to complete its configuration. This configuration
-// * typically depends on the role the controller is playing for this switch.
-// * And so we set the switch role (for 'this' controller) before we start
-// * the driver-sub-handshake.
-// * Next State: WAIT_SWITCH_DRIVER_SUB_HANDSHAKE
-// */
-//WAIT_INITIAL_ROLE(false) {
-//    @Override
-//    void processOFError(OFChannelHandler h, OFErrorMsg m)
-//            throws SwitchStateException {
-//        // role changer will ignore the error if it isn't for it
-//        RoleRecvStatus rrstatus = h.roleChanger.deliverError(m);
-//        if (rrstatus == RoleRecvStatus.OTHER_EXPECTATION) {
-//            logError(h, m);
-//        }
-//    }
-//
-//    @Override
-//    void processOFExperimenter(OFChannelHandler h, OFExperimenter m)
-//            throws IOException, SwitchStateException {
-//        Role role = extractNiciraRoleReply(h, m);
-//        // If role == null it means the vendor (experimenter) message
-//        // wasn't really a Nicira role reply. We ignore this case.
-//        if (role != null) {
-//            RoleReplyInfo rri = new RoleReplyInfo(role, null, m.getXid());
-//            RoleRecvStatus rrs = h.roleChanger.deliverRoleReply(rri);
-//            if (rrs == RoleRecvStatus.MATCHED_SET_ROLE) {
-//                setRoleAndStartDriverHandshake(h, rri.getRole());
-//            } // else do nothing - wait for the correct expected reply
-//        } else {
-//            unhandledMessageReceived(h, m);
-//        }
-//    }
-//
-//    @Override
-//    void processOFRoleReply(OFChannelHandler h, OFRoleReply m)
-//            throws SwitchStateException, IOException {
-//        RoleReplyInfo rri = extractOFRoleReply(h, m);
-//        RoleRecvStatus rrs = h.roleChanger.deliverRoleReply(rri);
-//        if (rrs == RoleRecvStatus.MATCHED_SET_ROLE) {
-//            setRoleAndStartDriverHandshake(h, rri.getRole());
-//        } // else do nothing - wait for the correct expected reply
-//    }
-//
-//    @Override
-//    void handleUnsentRoleMessage(OFChannelHandler h, Role role,
-//            RoleRecvStatus expectation) throws IOException {
-//        // typically this is triggered for a switch where role messages
-//        // are not supported - we confirm that the role being set is
-//        // master and move to the next state
-//        if (expectation == RoleRecvStatus.MATCHED_SET_ROLE) {
-//            if (role == Role.MASTER) {
-//                setRoleAndStartDriverHandshake(h, role);
-//            } else {
-//                log.error("Expected MASTER role from registry for switch "
-//                        + "which has no support for role-messages."
-//                        + "Received {}. It is possible that this switch "
-//                        + "is connected to other controllers, in which "
-//                        + "case it should support role messages - not "
-//                        + "moving forward.", role);
-//            }
-//        } // else do nothing - wait to hear back from registry
-//
-//    }
-//
-//    private void setRoleAndStartDriverHandshake(OFChannelHandler h,
-//            Role role) throws IOException {
-//        h.setSwitchRole(role);
-//        h.sw.startDriverHandshake();
-//        if (h.sw.isDriverHandshakeComplete()) {
-//            Role mySwitchRole = h.sw.getRole();
-//            if (mySwitchRole == Role.MASTER) {
-//                log.info("Switch-driver sub-handshake complete. "
-//                        + "Activating switch {} with Role: MASTER",
-//                        h.sw.getStringId());
-//                handlePendingPortStatusMessages(h); //before activation
-//                boolean success = h.sw.addActivatedMasterSwitch();
-//                if (!success) {
-//                    disconnectDuplicate(h);
-//                    return;
-//                }
-//                h.setState(MASTER);
-//            } else {
-//                log.info("Switch-driver sub-handshake complete. "
-//                        + "Activating switch {} with Role: EQUAL",
-//                        h.sw.getStringId());
-//                handlePendingPortStatusMessages(h); //before activation
-//                boolean success = h.sw.addActivatedEqualSwitch();
-//                if (!success) {
-//                    disconnectDuplicate(h);
-//                    return;
-//                }
-//                h.setState(EQUAL);
-//            }
-//        } else {
-//            h.setState(WAIT_SWITCH_DRIVER_SUB_HANDSHAKE);
-//        }
-//    }
-//
-//    @Override
-//    void processOFFeaturesReply(OFChannelHandler h, OFFeaturesReply  m)
-//            throws IOException, SwitchStateException {
-//        illegalMessageReceived(h, m);
-//    }
-//
-//    @Override
-//    void processOFStatisticsReply(OFChannelHandler h, OFStatsReply m)
-//            throws SwitchStateException {
-//        illegalMessageReceived(h, m);
-//    }
-//
-//    @Override
-//    void processOFPortStatus(OFChannelHandler h, OFPortStatus m)
-//            throws IOException, SwitchStateException {
-//        h.pendingPortStatusMsg.add(m);
-//
-//    }
-//},
-
-
-
-
-
-
-
-///**
-// * This controller is in EQUAL role for this switch. We enter this state
-// * after some /other/ controller instance wins mastership-role over this
-// * switch. The EQUAL role can be considered the same as the SLAVE role
-// * if this controller does NOT send commands or packets to the switch.
-// * This should always be true for OF1.0 switches. XXX S need to enforce.
-// *
-// * For OF1.3 switches, choosing this state as EQUAL instead of SLAVE,
-// * gives us the flexibility that if an app wants to send commands/packets
-// * to switches, it can, even thought it is running on a controller instance
-// * that is not in a MASTER role for this switch. Of course, it is the job
-// * of the app to ensure that commands/packets sent by this (EQUAL) controller
-// * instance does not clash/conflict with commands/packets sent by the MASTER
-// * controller for this switch. Neither the controller instances, nor the
-// * switch provides any kind of resolution mechanism should conflicts occur.
-// */
-//EQUAL(true) {
-//    @Override
-//    void processOFError(OFChannelHandler h, OFErrorMsg m)
-//            throws IOException, SwitchStateException {
-//        // role changer will ignore the error if it isn't for it
-//        RoleRecvStatus rrstatus = h.roleChanger.deliverError(m);
-//        if (rrstatus == RoleRecvStatus.OTHER_EXPECTATION) {
-//            logError(h, m);
-//            h.dispatchMessage(m);
-//        }
-//    }
-//
-//    @Override
-//    void processOFStatisticsReply(OFChannelHandler h,
-//            OFStatsReply m) {
-//        h.sw.handleMessage(m);
-//    }
-//
-//    @Override
-//    void processOFExperimenter(OFChannelHandler h, OFExperimenter m)
-//            throws IOException, SwitchStateException {
-//        Role role = extractNiciraRoleReply(h, m);
-//        // If role == null it means the message wasn't really a
-//        // Nicira role reply. We ignore it in this state.
-//        if (role != null) {
-//            RoleRecvStatus rrs = h.roleChanger.deliverRoleReply(
-//                    new RoleReplyInfo(role, null, m.getXid()));
-//            if (rrs == RoleRecvStatus.MATCHED_SET_ROLE) {
-//                checkAndSetRoleTransition(h, role);
-//            }
-//        } else {
-//            unhandledMessageReceived(h, m);
-//        }
-//    }
-//
-//    @Override
-//    void processOFRoleReply(OFChannelHandler h, OFRoleReply m)
-//            throws SwitchStateException, IOException {
-//        RoleReplyInfo rri = extractOFRoleReply(h, m);
-//        RoleRecvStatus rrs = h.roleChanger.deliverRoleReply(rri);
-//        if (rrs == RoleRecvStatus.MATCHED_SET_ROLE) {
-//            checkAndSetRoleTransition(h, rri.getRole());
-//        }
-//    }
-//
-//    // XXX S needs more handlers for 1.3 switches in equal role
-//
-//    @Override
-//    void processOFPortStatus(OFChannelHandler h, OFPortStatus m)
-//            throws IOException, SwitchStateException {
-//        handlePortStatusMessage(h, m, true);
-//    }
-//
-//    @Override
-//    @LogMessageDoc(level = "WARN",
-//    message = "Received PacketIn from switch {} while "
-//            + "being slave. Reasserting slave role.",
-//            explanation = "The switch has receive a PacketIn despite being "
-//                    + "in slave role indicating inconsistent controller roles",
-//                    recommendation = "This situation can occurs transiently during role"
-//                            + " changes. If, however, the condition persists or happens"
-//                            + " frequently this indicates a role inconsistency. "
-//                            + LogMessageDoc.CHECK_CONTROLLER)
-//    void processOFPacketIn(OFChannelHandler h, OFPacketIn m) throws IOException {
-//        // we don't expect packetIn while slave, reassert we are slave
-//        h.counters.packetInWhileSwitchIsSlave.updateCounterNoFlush();
-//        log.warn("Received PacketIn from switch {} while" +
-//                "being slave. Reasserting slave role.", h.sw);
-//        //h.controller.reassertRole(h, Role.SLAVE);
-//        // XXX reassert in role changer
-//    }
-//};
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/drivers/OFSwitchImplCPqD13.java b/of/ctl/src/main/java/org/onlab/onos/of/drivers/OFSwitchImplCPqD13.java
index c3377e6..6f78e8f 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/drivers/OFSwitchImplCPqD13.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/drivers/OFSwitchImplCPqD13.java
@@ -4,6 +4,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -60,7 +61,7 @@
  */
 public class OFSwitchImplCPqD13 extends AbstractOpenFlowSwitch {
 
-    private static Logger log =
+    private Logger log =
             LoggerFactory.getLogger(OFSwitchImplCPqD13.class);
 
     private static final int VLAN_ID_OFFSET = 16;
@@ -95,7 +96,7 @@
     private static final short MIN_PRIORITY = 0x0;
     private static final U64 METADATA_MASK = U64.of(Long.MAX_VALUE << 1 | 0x1);
 
-    ConcurrentHashMap<Integer, OFGroup> l2groups;
+    private Map<Integer, OFGroup> l2groups;
 
     private final boolean usePipeline13;
 
