diff --git a/src/main/java/net/onrc/onos/core/registry/RegistryException.java b/src/main/java/net/onrc/onos/core/registry/RegistryException.java
index f05aef8..8137d19 100644
--- a/src/main/java/net/onrc/onos/core/registry/RegistryException.java
+++ b/src/main/java/net/onrc/onos/core/registry/RegistryException.java
@@ -4,17 +4,6 @@
 
     private static final long serialVersionUID = -8276300722010217913L;
 
-    /*
-    public RegistryException() {
-        // TODO Auto-generated constructor stub
-    }
-
-    public RegistryException(Throwable cause) {
-        super(cause);
-        // TODO Auto-generated constructor stub
-    }
-    */
-
     public RegistryException(String message) {
         super(message);
     }
diff --git a/src/main/java/net/onrc/onos/core/registry/StandaloneRegistry.java b/src/main/java/net/onrc/onos/core/registry/StandaloneRegistry.java
index de07adf..0b552f1 100644
--- a/src/main/java/net/onrc/onos/core/registry/StandaloneRegistry.java
+++ b/src/main/java/net/onrc/onos/core/registry/StandaloneRegistry.java
@@ -2,6 +2,7 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -34,6 +35,9 @@
     private String registeredControllerId;
     private Map<String, ControlChangeCallback> switchCallbacks;
 
+    private long blockTop;
+    private static final long BLOCK_SIZE = 0x1000000L;
+
     //
     // Unique ID generation state
     //
@@ -95,14 +99,16 @@
 
     @Override
     public Collection<String> getAllControllers() throws RegistryException {
-        List<String> l = new ArrayList<String>();
-        l.add(registeredControllerId);
-        return l;
+        //List<String> l = new ArrayList<String>();
+        //l.add(registeredControllerId);
+        //return l;
+        return Collections.singletonList(registeredControllerId);
     }
 
     @Override
     public String getControllerForSwitch(long dpid) throws RegistryException {
-        return (switchCallbacks.get(HexString.toHexString(dpid)) == null) ? null : registeredControllerId;
+        return (switchCallbacks.get(HexString.toHexString(dpid)) == null)
+                ? null : registeredControllerId;
     }
 
     @Override
@@ -112,7 +118,8 @@
 
         for (String strSwitch : switchCallbacks.keySet()) {
             log.debug("Switch _{}", strSwitch);
-            List<ControllerRegistryEntry> list = new ArrayList<ControllerRegistryEntry>();
+            List<ControllerRegistryEntry> list =
+                    new ArrayList<ControllerRegistryEntry>();
             list.add(new ControllerRegistryEntry(registeredControllerId, 0));
 
             switches.put(strSwitch, list);
@@ -127,12 +134,10 @@
         throw new NotImplementedException("Not yet implemented");
     }
 
-    private long blockTop;
-    private static final long BLOCK_SIZE = 0x1000000L;
-
     /**
      * Returns a block of IDs which are unique and unused.
-     * Range of IDs is fixed size and is assigned incrementally as this method called.
+     * Range of IDs is fixed size and is assigned incrementally as this method
+     * called.
      *
      * @return an IdBlock containing a set of unique IDs
      */
diff --git a/src/main/java/net/onrc/onos/core/registry/ZookeeperRegistry.java b/src/main/java/net/onrc/onos/core/registry/ZookeeperRegistry.java
index 2f1c4c7..35ce962 100644
--- a/src/main/java/net/onrc/onos/core/registry/ZookeeperRegistry.java
+++ b/src/main/java/net/onrc/onos/core/registry/ZookeeperRegistry.java
@@ -55,7 +55,8 @@
  *
  * @author jono
  */
-public class ZookeeperRegistry implements IFloodlightModule, IControllerRegistryService {
+public class ZookeeperRegistry implements IFloodlightModule,
+                                          IControllerRegistryService {
 
     private static final Logger log = LoggerFactory.getLogger(ZookeeperRegistry.class);
 
@@ -63,14 +64,15 @@
 
     private IRestApiService restApi;
 
-    //This is the default, it's overwritten by the connectionString configuration parameter
+    // This is the default. It is overwritten by the connectionString
+    // configuration parameter
     private String connectionString = "localhost:2181";
 
     private static final String NAMESPACE = "onos";
     private static final String SWITCH_LATCHES_PATH = "/switches";
     private static final String CLUSTER_LEADER_PATH = "/cluster/leader";
 
-    private static final String SERVICES_PATH = "/"; //i.e. the root of our namespace
+    private static final String SERVICES_PATH = "/"; // i.e. the root of our namespace
     private static final String CONTROLLER_SERVICE_NAME = "controllers";
 
     private CuratorFramework curatorFrameworkClient;
@@ -135,14 +137,13 @@
         }
     }
 
-    /*
-     * Dispatcher thread for leadership change events coming from Curator.
-     */
+    // Dispatcher thread for leadership change events coming from Curator
     private void dispatchEvents() {
         while (!Thread.currentThread().isInterrupted()) {
             try {
                 SwitchLeaderEvent event = switchLeadershipEvents.take();
-                SwitchLeadershipData swData = switches.get(HexString.toHexString(event.getDpid()));
+                SwitchLeadershipData swData =
+                        switches.get(HexString.toHexString(event.getDpid()));
                 if (swData == null) {
                     log.debug("Leadership data {} not found", event.getDpid());
                     continue;
@@ -169,14 +170,16 @@
         public void isLeader() {
             log.debug("Became leader for {}", dpid);
 
-            switchLeadershipEvents.add(new SwitchLeaderEvent(HexString.toLong(dpid), true));
+            switchLeadershipEvents.add(
+                    new SwitchLeaderEvent(HexString.toLong(dpid), true));
         }
 
         @Override
         public void notLeader() {
             log.debug("Lost leadership for {}", dpid);
 
-            switchLeadershipEvents.add(new SwitchLeaderEvent(HexString.toLong(dpid), false));
+            switchLeadershipEvents.add(
+                    new SwitchLeaderEvent(HexString.toLong(dpid), false));
         }
     }
 
@@ -194,7 +197,8 @@
             switch (event.getType()) {
                 case CHILD_ADDED:
                 case CHILD_UPDATED:
-                    //Check we have a PathChildrenCache for this child, add one if not
+                    // Check we have a PathChildrenCache for this child
+                    // and add one if not
                     synchronized (switchPathCaches) {
                         if (switchPathCaches.get(strSwitch) == null) {
                             PathChildrenCache pc = new PathChildrenCache(client,
@@ -205,7 +209,7 @@
                     }
                     break;
                 case CHILD_REMOVED:
-                    //Remove our PathChildrenCache for this child
+                    // Remove our PathChildrenCache for this child
                     PathChildrenCache pc = null;
                     synchronized (switchPathCaches) {
                         pc = switchPathCaches.remove(strSwitch);
@@ -215,8 +219,9 @@
                     }
                     break;
                 default:
-                    //All other switchLeadershipEvents are connection status switchLeadershipEvents. We don't need to
-                    //do anything as the path cache handles these on its own.
+                    // All other switchLeadershipEvents are connection status
+                    // switchLeadershipEvents. We don't need to do anything as
+                    // the path cache handles these on its own.
                     break;
             }
 
@@ -241,11 +246,13 @@
     }
 
     @Override
-    public void requestControl(long dpid, ControlChangeCallback cb) throws RegistryException {
+    public void requestControl(long dpid, ControlChangeCallback cb)
+            throws RegistryException {
         log.info("Requesting control for {}", HexString.toHexString(dpid));
 
         if (controllerId == null) {
-            throw new IllegalStateException("Must register a controller before calling requestControl");
+            throw new IllegalStateException("Must register a controller before"
+                    + " calling requestControl");
         }
 
         String dpidStr = HexString.toHexString(dpid);
@@ -257,7 +264,8 @@
 
         String latchPath = SWITCH_LATCHES_PATH + "/" + dpidStr;
 
-        LeaderLatch latch = new LeaderLatch(curatorFrameworkClient, latchPath, controllerId);
+        LeaderLatch latch =
+                new LeaderLatch(curatorFrameworkClient, latchPath, controllerId);
         SwitchLeaderListener listener = new SwitchLeaderListener(dpidStr);
         latch.addListener(listener);
 
@@ -266,24 +274,25 @@
         SwitchLeadershipData oldData = switches.putIfAbsent(dpidStr, swData);
 
         if (oldData != null) {
-            //There was already data for that key in the map
-            //i.e. someone else got here first so we can't succeed
+            // There was already data for that key in the map
+            // i.e. someone else got here first so we can't succeed
             log.debug("Already requested control for {}", dpidStr);
             throw new RegistryException("Already requested control for " + dpidStr);
         }
 
-        //Now that we know we were able to add our latch to the collection,
-        //we can start the leader election in Zookeeper. However I don't know
-        //how to handle if the start fails - the latch is already in our
-        //switches list.
-        //TODO seems like there's a Curator bug when latch.start is called when
-        //there's no Zookeeper connection which causes two znodes to be put in
-        //Zookeeper at the latch path when we reconnect to Zookeeper.
+        // Now that we know we were able to add our latch to the collection,
+        // we can start the leader election in Zookeeper. However I don't know
+        // how to handle if the start fails - the latch is already in our
+        // switches list.
+        // TODO seems like there's a Curator bug when latch.start is called when
+        // there's no Zookeeper connection which causes two znodes to be put in
+        // Zookeeper at the latch path when we reconnect to Zookeeper.
         try {
             latch.start();
         } catch (Exception e) {
             log.warn("Error starting leader latch: {}", e.getMessage());
-            throw new RegistryException("Error starting leader latch for " + dpidStr, e);
+            throw new RegistryException("Error starting leader latch for "
+                    + dpidStr, e);
         }
 
     }
@@ -308,8 +317,8 @@
         try {
             latch.close();
         } catch (IOException e) {
-            //I think it's OK not to do anything here. Either the node got
-            //deleted correctly, or the connection went down and the node got deleted.
+            // I think it's OK not to do anything here. Either the node got
+            // deleted correctly, or the connection went down and the node got deleted.
             log.debug("releaseControl: caught IOException {}", dpidStr);
         }
     }
@@ -388,16 +397,19 @@
         }
 
         try {
-            //We've seen issues with these caches get stuck out of date, so we'll have to
-            //force them to refresh before each read. This slows down the method as it
-            //blocks on a Zookeeper query, however at the moment only the cleanup thread
-            //uses this and that isn't particularly time-sensitive.
+            // We've seen issues with these caches get stuck out of date, so
+            // we'll have to force them to refresh before each read. This slows
+            // down the method as it blocks on a Zookeeper query, however at
+            // the moment only the cleanup thread uses this and that isn't
+            // particularly time-sensitive.
+            // TODO verify if it is still the case that caches can be out of date
             switchCache.rebuild();
         } catch (Exception e) {
             log.error("Exception rebuilding the switch cache:", e);
         }
 
-        List<ChildData> sortedData = new ArrayList<ChildData>(switchCache.getCurrentData());
+        List<ChildData> sortedData =
+                new ArrayList<ChildData>(switchCache.getCurrentData());
 
         Collections.sort(
                 sortedData,
@@ -423,14 +435,14 @@
 
     @Override
     public Collection<Long> getSwitchesControlledByController(String controller) {
-        //TODO remove this if not needed
+        // TODO remove this if not needed
         throw new NotImplementedException("Not yet implemented");
     }
 
 
-    //TODO what should happen when there's no ZK connection? Currently we just return
-    //the cache but this may lead to false impressions - i.e. we don't actually know
-    //what's in ZK so we shouldn't say we do
+    // TODO what should happen when there's no ZK connection? Currently we just
+    // return the cache but this may lead to false impressions - i.e. we don't
+    // actually know what's in ZK so we shouldn't say we do
     @Override
     public Map<String, List<ControllerRegistryEntry>> getAllSwitches() {
         Map<String, List<ControllerRegistryEntry>> data =
@@ -441,8 +453,7 @@
                     new ArrayList<ControllerRegistryEntry>();
 
             if (entry.getValue().getCurrentData().size() < 1) {
-                //TODO prevent even having the PathChildrenCache in this case
-                //log.info("Switch entry with no leader elections: {}", entry.getKey());
+                // TODO prevent even having the PathChildrenCache in this case
                 continue;
             }
 
@@ -453,7 +464,8 @@
                 String[] splitted = d.getPath().split("-");
                 int sequenceNumber = Integer.parseInt(splitted[splitted.length - 1]);
 
-                contendingControllers.add(new ControllerRegistryEntry(childsControllerId, sequenceNumber));
+                contendingControllers.add(new ControllerRegistryEntry(
+                        childsControllerId, sequenceNumber));
             }
 
             Collections.sort(contendingControllers);
@@ -544,13 +556,12 @@
         return l;
     }
 
-    //TODO currently blocks startup when it can't get a Zookeeper connection.
-    //Do we support starting up with no Zookeeper connection?
+    // TODO currently blocks startup when it can't get a Zookeeper connection.
+    // Do we support starting up with no Zookeeper connection?
     @Override
-    public void init(FloodlightModuleContext context) throws FloodlightModuleException {
-        log.info("Initialising the Zookeeper Registry - Zookeeper connection required");
-
-        //Read the Zookeeper connection string from the config
+    public void init(FloodlightModuleContext context)
+            throws FloodlightModuleException {
+        // Read the Zookeeper connection string from the config
         Map<String, String> configParams = context.getConfigParams(this);
         String connectionStringParam = configParams.get("connectionString");
         if (connectionStringParam != null) {
@@ -561,11 +572,11 @@
         restApi = context.getServiceImpl(IRestApiService.class);
 
         switches = new ConcurrentHashMap<String, SwitchLeadershipData>();
-        //switchPathCaches = new HashMap<String, PathChildrenCache>();
         switchPathCaches = new ConcurrentHashMap<String, PathChildrenCache>();
 
         RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
-        curatorFrameworkClient = CuratorFrameworkFactory.newClient(this.connectionString,
+        curatorFrameworkClient =
+                CuratorFrameworkFactory.newClient(this.connectionString,
                 SESSION_TIMEOUT, CONNECTION_TIMEOUT, retryPolicy);
 
         curatorFrameworkClient.start();
@@ -576,24 +587,25 @@
                 ID_COUNTER_PATH,
                 new RetryOneTime(100));
 
-        rootSwitchCache = new PathChildrenCache(curatorFrameworkClient, SWITCH_LATCHES_PATH, true);
+        rootSwitchCache = new PathChildrenCache(
+                curatorFrameworkClient, SWITCH_LATCHES_PATH, true);
         rootSwitchCache.getListenable().addListener(switchPathCacheListener);
 
-        //Build the service discovery object
+        // Build the service discovery object
         serviceDiscovery = ServiceDiscoveryBuilder.builder(ControllerService.class)
                 .client(curatorFrameworkClient).basePath(SERVICES_PATH).build();
 
-        //We read the list of services very frequently (GUI periodically queries them)
-        //so we'll cache them to cut down on Zookeeper queries.
+        // We read the list of services very frequently (GUI periodically
+        // queries them) so we'll cache them to cut down on Zookeeper queries.
         serviceCache = serviceDiscovery.serviceCacheBuilder()
                 .name(CONTROLLER_SERVICE_NAME).build();
 
-
         try {
             serviceDiscovery.start();
             serviceCache.start();
 
-            //Don't prime the cache, we want a notification for each child node in the path
+            // Don't prime the cache, we want a notification for each child
+            // node in the path
             rootSwitchCache.start(StartMode.NORMAL);
         } catch (Exception e) {
             throw new FloodlightModuleException(
@@ -629,7 +641,7 @@
         try {
             clusterLeaderLatch.start();
         } catch (Exception e) {
-            log.error("Error on startup starting the cluster leader election: {}", e.getMessage());
+            log.error("Error starting the cluster leader election: ", e);
         }
 
         // Keep trying until there is a cluster leader
@@ -641,7 +653,7 @@
                 }
                 Thread.sleep(CLUSTER_LEADER_ELECTION_RETRY_MS);
             } catch (Exception e) {
-                log.error("Error on startup waiting for cluster leader election: {}", e.getMessage());
+                log.error("Error waiting for cluster leader election:", e);
             }
         } while (true);
 
