diff --git a/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java b/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
index e59b33c..8d37611 100644
--- a/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
+++ b/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
@@ -58,7 +58,8 @@
     private static final int DEFAULT_IDLE_TIMEOUT = 5;
     private int idleTimeout = DEFAULT_IDLE_TIMEOUT;
 
-    private static final ScheduledExecutorService EXECUTOR_SERVICE = Executors.newScheduledThreadPool(NUMBER_OF_THREAD_FOR_EXECUTOR);
+    private static final ScheduledExecutorService EXECUTOR_SERVICE =
+            Executors.newScheduledThreadPool(NUMBER_OF_THREAD_FOR_EXECUTOR);
 
     private final String callerId = "Forwarding";
 
@@ -233,15 +234,18 @@
         String destinationMac =
                 HexString.toHexString(eth.getDestinationMACAddress());
 
-        //FIXME getDeviceByMac() is a blocking call, so it may be better way to handle it to avoid the condition.
-        Device deviceObject = topology.getDeviceByMac(MACAddress.valueOf(destinationMac));
+        // FIXME getDeviceByMac() is a blocking call, so it may be better way
+        // to handle it to avoid the condition.
+        Device deviceObject = topology.getDeviceByMac(
+                MACAddress.valueOf(destinationMac));
 
         if (deviceObject == null) {
             log.debug("No device entry found for {}",
                     destinationMac);
 
             //Device is not in the DB, so wait it until the device is added.
-            EXECUTOR_SERVICE.schedule(new WaitDeviceArp(sw, inPort, eth), SLEEP_TIME_FOR_DB_DEVICE_INSTALLED, TimeUnit.MILLISECONDS);
+            EXECUTOR_SERVICE.schedule(new WaitDeviceArp(sw, inPort, eth),
+                    SLEEP_TIME_FOR_DB_DEVICE_INSTALLED, TimeUnit.MILLISECONDS);
             return;
         }
 
@@ -264,11 +268,14 @@
         public void run() {
             Device deviceObject = topology.getDeviceByMac(MACAddress.valueOf(eth.getDestinationMACAddress()));
             if (deviceObject == null) {
-                log.debug("wait {}ms and device was not found. Send broadcast packet and the thread finish.", SLEEP_TIME_FOR_DB_DEVICE_INSTALLED);
+                log.debug("wait {}ms and device was not found. " +
+                        "Send broadcast packet and the thread finish.",
+                        SLEEP_TIME_FOR_DB_DEVICE_INSTALLED);
                 handleBroadcast(sw, inPort, eth);
                 return;
             }
-            log.debug("wait {}ms and device {} was found, continue", SLEEP_TIME_FOR_DB_DEVICE_INSTALLED, deviceObject.getMacAddress());
+            log.debug("wait {}ms and device {} was found, continue",
+                    SLEEP_TIME_FOR_DB_DEVICE_INSTALLED, deviceObject.getMacAddress());
             continueHandlePacketIn(sw, inPort, eth, deviceObject);
         }
     }
@@ -461,7 +468,8 @@
 
     private void flowInstalled(PathIntent installedPath) {
         if (log.isTraceEnabled()) {
-            log.trace("Installed intent ID {}, path {}", installedPath.getParentIntent().getId(), installedPath.getPath());
+            log.trace("Installed intent ID {}, path {}",
+                    installedPath.getParentIntent().getId(), installedPath.getPath());
         }
 
         ShortestPathIntent spfIntent = (ShortestPathIntent) installedPath.getParentIntent();
diff --git a/src/main/java/net/onrc/onos/apps/proxyarp/ArpCache.java b/src/main/java/net/onrc/onos/apps/proxyarp/ArpCache.java
index 6216f59..39dc119 100644
--- a/src/main/java/net/onrc/onos/apps/proxyarp/ArpCache.java
+++ b/src/main/java/net/onrc/onos/apps/proxyarp/ArpCache.java
@@ -137,7 +137,8 @@
 
         if (arpEntry != null && arpEntry.getMacAddress().equals(macAddress)) {
             arpEntry.setTimeLastSeen(System.currentTimeMillis());
-            log.debug("The same ArpCache, ip {}, mac {}. Update local cache last seen time only.", ipAddress, macAddress);
+            log.debug("The same ArpCache, ip {}, mac {}. " +
+                    "Update local cache last seen time only.", ipAddress, macAddress);
         } else {
             arpCache.put(ipAddress, new ArpCacheEntry(macAddress));
             kvArpCache.forceCreate(ipAddress, macAddress.toBytes());
diff --git a/src/main/java/net/onrc/onos/apps/sdnip/PatriciaTree.java b/src/main/java/net/onrc/onos/apps/sdnip/PatriciaTree.java
index 844ba35..cce2630 100644
--- a/src/main/java/net/onrc/onos/apps/sdnip/PatriciaTree.java
+++ b/src/main/java/net/onrc/onos/apps/sdnip/PatriciaTree.java
@@ -125,7 +125,8 @@
 
             while (node != null
                     && node.prefix.getPrefixLength() <= p.getPrefixLength()
-                    && key_match(node.prefix.getAddress(), node.prefix.getPrefixLength(), p.getAddress(), p.getPrefixLength()) == true) {
+                    && key_match(node.prefix.getAddress(), node.prefix.getPrefixLength(),
+                    p.getAddress(), p.getPrefixLength()) == true) {
                 if (node.prefix.getPrefixLength() == p.getPrefixLength()) {
                     //return addReference(node);
                     return node.rib;
diff --git a/src/main/java/net/onrc/onos/apps/sdnip/Ptree.java b/src/main/java/net/onrc/onos/apps/sdnip/Ptree.java
index c99ea09..c47ef1d 100644
--- a/src/main/java/net/onrc/onos/apps/sdnip/Ptree.java
+++ b/src/main/java/net/onrc/onos/apps/sdnip/Ptree.java
@@ -15,7 +15,9 @@
     private int maxKeyOctets;
     //private int refCount;
     private PtreeNode top;
-    private byte[] maskBits = {(byte) 0x00, (byte) 0x80, (byte) 0xc0, (byte) 0xe0, (byte) 0xf0, (byte) 0xf8, (byte) 0xfc, (byte) 0xfe, (byte) 0xff};
+    private byte[] maskBits =
+        {(byte) 0x00, (byte) 0x80, (byte) 0xc0, (byte) 0xe0, (byte) 0xf0,
+         (byte) 0xf8, (byte) 0xfc, (byte) 0xfe, (byte) 0xff};
 
     public Ptree(int maxKeyBits) {
         this.maxKeyBits = maxKeyBits;
diff --git a/src/main/java/net/onrc/onos/core/datastore/IKVClient.java b/src/main/java/net/onrc/onos/core/datastore/IKVClient.java
index a59a8a9..2a7d4f5 100644
--- a/src/main/java/net/onrc/onos/core/datastore/IKVClient.java
+++ b/src/main/java/net/onrc/onos/core/datastore/IKVClient.java
@@ -163,7 +163,8 @@
      * @param initialValue
      * @throws ObjectExistsException
      */
-    public void createCounter(final IKVTableID tableId, final byte[] key, final long initialValue) throws ObjectExistsException;
+    public void createCounter(final IKVTableID tableId, final byte[] key,
+            final long initialValue) throws ObjectExistsException;
 
     /**
      * Set atomic 64bit integer counter in data store to specified value.
diff --git a/src/main/java/net/onrc/onos/core/datastore/hazelcast/HZClient.java b/src/main/java/net/onrc/onos/core/datastore/hazelcast/HZClient.java
index 8c34cac..796976e 100644
--- a/src/main/java/net/onrc/onos/core/datastore/hazelcast/HZClient.java
+++ b/src/main/java/net/onrc/onos/core/datastore/hazelcast/HZClient.java
@@ -43,14 +43,17 @@
 
     private static final String MAP_PREFIX = "datastore://";
 
-    private static final String BASE_CONFIG_FILENAME = System.getProperty("net.onrc.onos.core.datastore.hazelcast.baseConfig", "conf/hazelcast.xml");
+    private static final String BASE_CONFIG_FILENAME =
+            System.getProperty("net.onrc.onos.core.datastore.hazelcast.baseConfig", "conf/hazelcast.xml");
     private static final String HAZELCAST_DEFAULT_XML = "conf/hazelcast.default.xml";
 
     // XXX Remove this mode at some point
-    private static boolean useClientMode = Boolean.parseBoolean(System.getProperty("net.onrc.onos.core.datastore.hazelcast.clientMode", "true"));
+    private static boolean useClientMode = Boolean.parseBoolean(
+            System.getProperty("net.onrc.onos.core.datastore.hazelcast.clientMode", "true"));
 
     // Note: xml configuration will overwrite this value if present
-    private static int backupCount = Integer.parseInt(System.getProperty("net.onrc.onos.core.datastore.hazelcast.backupCount", "3"));
+    private static int backupCount = Integer.parseInt(
+            System.getProperty("net.onrc.onos.core.datastore.hazelcast.backupCount", "3"));
 
     private final HazelcastInstance hazelcastInstance;
 
@@ -279,7 +282,8 @@
     @Override
     public IMultiEntryOperation forceCreateOp(final IKVTableID tableId, final byte[] key,
                                               final byte[] value) {
-        return new HZMultiEntryOperation((HZTable) tableId, key, value, HZClient.VERSION_NONEXISTENT, OPERATION.FORCE_CREATE);
+        return new HZMultiEntryOperation((HZTable) tableId, key, value,
+                HZClient.VERSION_NONEXISTENT, OPERATION.FORCE_CREATE);
     }
 
     @Override
diff --git a/src/main/java/net/onrc/onos/core/datastore/hazelcast/HZMultiEntryOperation.java b/src/main/java/net/onrc/onos/core/datastore/hazelcast/HZMultiEntryOperation.java
index 58df13b..270d1a7 100644
--- a/src/main/java/net/onrc/onos/core/datastore/hazelcast/HZMultiEntryOperation.java
+++ b/src/main/java/net/onrc/onos/core/datastore/hazelcast/HZMultiEntryOperation.java
@@ -52,7 +52,8 @@
      * @param version
      * @param operation
      */
-    public HZMultiEntryOperation(final HZTable table, final byte[] key, final byte[] value, final long version, final OPERATION operation) {
+    public HZMultiEntryOperation(final HZTable table, final byte[] key,
+            final byte[] value, final long version, final OPERATION operation) {
         this.table = table;
         this.key = key.clone();
         this.status = STATUS.NOT_EXECUTED;
diff --git a/src/main/java/net/onrc/onos/core/datastore/ramcloud/RCClient.java b/src/main/java/net/onrc/onos/core/datastore/ramcloud/RCClient.java
index 687b6dd..17538f0 100644
--- a/src/main/java/net/onrc/onos/core/datastore/ramcloud/RCClient.java
+++ b/src/main/java/net/onrc/onos/core/datastore/ramcloud/RCClient.java
@@ -498,11 +498,15 @@
                         op.entry.setVersion(removedVersion);
                         op.status = STATUS.SUCCESS;
                     } catch (JRamCloud.ObjectDoesntExistException | JRamCloud.WrongVersionException e) {
-                        log.error("Failed to remove key:" + ByteArrayUtil.toHexStringBuilder(op.entry.getKey(), "") + " from tableID:" + op.tableId, e);
+                        log.error("Failed to remove key:" +
+                                ByteArrayUtil.toHexStringBuilder(op.entry.getKey(), "") +
+                                " from tableID:" + op.tableId, e);
                         failExists = true;
                         op.status = STATUS.FAILED;
                     } catch (JRamCloud.RejectRulesException e) {
-                        log.error("Failed to remove key:" + ByteArrayUtil.toHexStringBuilder(op.entry.getKey(), "") + " from tableID:" + op.tableId, e);
+                        log.error("Failed to remove key:" +
+                                ByteArrayUtil.toHexStringBuilder(op.entry.getKey(), "") +
+                                " from tableID:" + op.tableId, e);
                         failExists = true;
                         op.status = STATUS.FAILED;
                     }
@@ -514,7 +518,9 @@
                         op.entry.setVersion(removedVersion);
                         op.status = STATUS.SUCCESS;
                     } else {
-                        log.error("Failed to remove key:{} from tableID:{}", ByteArrayUtil.toHexStringBuilder(op.entry.getKey(), ""), op.tableId);
+                        log.error("Failed to remove key:{} from tableID:{}",
+                                ByteArrayUtil.toHexStringBuilder(op.entry.getKey(), ""),
+                                op.tableId);
                         failExists = true;
                         op.status = STATUS.FAILED;
                     }
@@ -545,9 +551,11 @@
         }
 
         // execute
-        JRamCloud.Object[] results = rcClient.multiRead(multiReadObjects.tableId, multiReadObjects.key, multiReadObjects.keyLength, reqs);
+        JRamCloud.Object[] results = rcClient.multiRead(multiReadObjects.tableId,
+                multiReadObjects.key, multiReadObjects.keyLength, reqs);
         if (results.length != reqs) {
-            log.error("multiRead returned unexpected number of results. (requested:{}, returned:{})", reqs, results.length);
+            log.error("multiRead returned unexpected number of results. " +
+                    "(requested:{}, returned:{})", reqs, results.length);
             failExists = true;
         }
 
@@ -605,12 +613,18 @@
                     op.setStatus(STATUS.FAILED);
                     return failExists;
             }
-            multiWriteObjects.setObject(i, ((RCTableID) op.getTableId()).getTableID(), op.getKey(), op.getValue(), rules);
+            multiWriteObjects.setObject(i,
+                    ((RCTableID) op.getTableId()).getTableID(), op.getKey(),
+                    op.getValue(), rules);
         }
 
-        MultiWriteRspObject[] results = rcClient.multiWrite(multiWriteObjects.tableId, multiWriteObjects.key, multiWriteObjects.keyLength, multiWriteObjects.value, multiWriteObjects.valueLength, ops.size(), multiWriteObjects.rules);
+        MultiWriteRspObject[] results = rcClient.multiWrite(multiWriteObjects.tableId,
+                multiWriteObjects.key, multiWriteObjects.keyLength,
+                multiWriteObjects.value, multiWriteObjects.valueLength, ops.size(),
+                multiWriteObjects.rules);
         if (results.length != reqs) {
-            log.error("multiWrite returned unexpected number of results. (requested:{}, returned:{})", reqs, results.length);
+            log.error("multiWrite returned unexpected number of results. " +
+                    "(requested:{}, returned:{})", reqs, results.length);
             failExists = true;
         }
 
@@ -630,7 +644,8 @@
         return failExists;
     }
 
-    private static final ConcurrentHashMap<String, RCTable> TABLES = new ConcurrentHashMap<>();
+    private static final ConcurrentHashMap<String, RCTable> TABLES =
+            new ConcurrentHashMap<>();
 
     @Override
     public IKVTable getTable(final String tableName) {
diff --git a/src/main/java/net/onrc/onos/core/datastore/ramcloud/RCMultiEntryOperation.java b/src/main/java/net/onrc/onos/core/datastore/ramcloud/RCMultiEntryOperation.java
index 9893838..b061f8d 100644
--- a/src/main/java/net/onrc/onos/core/datastore/ramcloud/RCMultiEntryOperation.java
+++ b/src/main/java/net/onrc/onos/core/datastore/ramcloud/RCMultiEntryOperation.java
@@ -73,11 +73,13 @@
     }
 
     public static IMultiEntryOperation create(final IKVTableID tableId, final byte[] key, final byte[] value) {
-        return new RCMultiEntryOperation(tableId, new Entry(key, value, RCClient.VERSION_NONEXISTENT), OPERATION.CREATE);
+        return new RCMultiEntryOperation(tableId,
+                new Entry(key, value, RCClient.VERSION_NONEXISTENT), OPERATION.CREATE);
     }
 
     public static IMultiEntryOperation forceCreate(final IKVTableID tableId, final byte[] key, final byte[] value) {
-        return new RCMultiEntryOperation(tableId, new Entry(key, value, RCClient.VERSION_NONEXISTENT), OPERATION.FORCE_CREATE);
+        return new RCMultiEntryOperation(tableId,
+                new Entry(key, value, RCClient.VERSION_NONEXISTENT), OPERATION.FORCE_CREATE);
     }
 
     /**
@@ -90,11 +92,13 @@
         return new RCMultiEntryOperation(tableId, new Entry(key), OPERATION.READ);
     }
 
-    public static IMultiEntryOperation update(final IKVTableID tableId, final byte[] key, final byte[] value, final long version) {
+    public static IMultiEntryOperation update(final IKVTableID tableId,
+            final byte[] key, final byte[] value, final long version) {
         return new RCMultiEntryOperation(tableId, new Entry(key, value, version), OPERATION.UPDATE);
     }
 
-    public static IMultiEntryOperation delete(final IKVTableID tableId, final byte[] key, final byte[] value, final long version) {
+    public static IMultiEntryOperation delete(final IKVTableID tableId,
+            final byte[] key, final byte[] value, final long version) {
         return new RCMultiEntryOperation(tableId, new Entry(key, value, version), OPERATION.DELETE);
     }
 
diff --git a/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java b/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
index fb7203b..1bf9ee6 100644
--- a/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
+++ b/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
@@ -18,8 +18,6 @@
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
 import net.floodlightcontroller.core.FloodlightContext;
 import net.floodlightcontroller.core.IFloodlightProviderService;
 import net.floodlightcontroller.core.IOFMessageListener;
@@ -72,6 +70,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * FlowPusher is a implementation of FlowPusherService.
  * FlowPusher assigns one message queue instance for each one switch.
@@ -956,7 +956,8 @@
         }
 
         if (log.isTraceEnabled()) {
-            log.trace("Installing flow entry {} into switch DPID: {} flowEntryId: {} srcMac: {} dstMac: {} inPort: {} outPort: {}"
+            log.trace("Installing flow entry {} into switch DPID: {} " +
+                    "flowEntryId: {} srcMac: {} dstMac: {} inPort: {} outPort: {}"
                     , flowEntry.flowEntryUserState()
                     , sw.getStringId()
                     , flowEntry.flowEntryId()
diff --git a/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java b/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java
index 1940daa..92f57ad 100644
--- a/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java
+++ b/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java
@@ -179,10 +179,13 @@
 
     @Override
     public String toString() {
-        return String.format("id:%s, state:%s, srcDpid:%s, srcPort:%d, srcMac:%s, srcIP:%s, dstDpid:%s, dstPort:%d, dstMac:%s, dstIP:%s",
+        return String.format("id:%s, state:%s, srcDpid:%s, srcPort:%d, " +
+                "srcMac:%s, srcIP:%s, dstDpid:%s, dstPort:%d, dstMac:%s, dstIP:%s",
                 getId(), getState(),
-                new Dpid(srcSwitchDpid), srcPortNumber, MACAddress.valueOf(srcMacAddress), Integer.toString(srcIpAddress),
-                new Dpid(dstSwitchDpid), dstPortNumber, MACAddress.valueOf(dstMacAddress), Integer.toString(dstIpAddress));
+                new Dpid(srcSwitchDpid), srcPortNumber,
+                MACAddress.valueOf(srcMacAddress), Integer.toString(srcIpAddress),
+                new Dpid(dstSwitchDpid), dstPortNumber,
+                MACAddress.valueOf(dstMacAddress), Integer.toString(dstIpAddress));
     }
 
     public int getSrcIp() {
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntime.java b/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntime.java
index 837e210..8d7f6a6 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntime.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntime.java
@@ -41,7 +41,8 @@
      * @param pathIntents  a set of current low-level intents
      * @return IntentOperationList. PathIntent and/or ErrorIntent instances.
      */
-    public IntentOperationList calcPathIntents(final IntentOperationList intentOpList, final IntentMap appIntents, final PathIntentMap pathIntents) {
+    public IntentOperationList calcPathIntents(final IntentOperationList intentOpList,
+            final IntentMap appIntents, final PathIntentMap pathIntents) {
         IntentOperationList pathIntentOpList = new IntentOperationList();
         HashMap<Switch, ConstrainedBFSTree> spfTrees = new HashMap<>();
 
@@ -134,7 +135,9 @@
 
                     break;
                 case REMOVE:
-                    ShortestPathIntent targetAppIntent = (ShortestPathIntent) appIntents.getIntent(intentOp.intent.getId());
+                    ShortestPathIntent targetAppIntent =
+                            (ShortestPathIntent) appIntents.getIntent(
+                                    intentOp.intent.getId());
                     if (targetAppIntent != null) {
                         String pathIntentId = targetAppIntent.getPathIntentId();
                         if (pathIntentId != null) {
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java b/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java
index 8dcfd5f..b663db4 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PathCalcRuntimeModule.java
@@ -52,7 +52,10 @@
 /**
  * @author Toshio Koide (t-koide@onlab.us)
  */
-public class PathCalcRuntimeModule implements IFloodlightModule, IPathCalcRuntimeService, ITopologyListener, IEventChannelListener<Long, IntentStateList> {
+public class PathCalcRuntimeModule implements IFloodlightModule,
+                                    IPathCalcRuntimeService,
+                                    ITopologyListener,
+                                    IEventChannelListener<Long, IntentStateList> {
     static class PerfLog {
         private String step;
         private long time;
@@ -266,7 +269,8 @@
         runtime = new PathCalcRuntime(topologyService.getTopology());
         pathIntents = new PathIntentMap();
         pathIntents.addChangeListener(deleteIntentsTracker);
-        opEventChannel = datagridService.createChannel(INTENT_OP_EVENT_CHANNEL_NAME, Long.class, IntentOperationList.class);
+        opEventChannel = datagridService.createChannel(
+                INTENT_OP_EVENT_CHANNEL_NAME, Long.class, IntentOperationList.class);
         datagridService.addListener(INTENT_STATE_EVENT_CHANNEL_NAME, this, Long.class, IntentStateList.class);
         topologyService.registerTopologyListener(this);
         persistIntent = new PersistIntent(controllerRegistry);
@@ -512,7 +516,9 @@
 
         boolean rerouteAll = false;
         for (LinkEvent le : addedLinkEvents) {
-            LinkEvent rev = new LinkEvent(le.getDst().getDpid(), le.getDst().getNumber(), le.getSrc().getDpid(), le.getSrc().getNumber());
+            LinkEvent rev = new LinkEvent(le.getDst().getDpid(),
+                    le.getDst().getNumber(), le.getSrc().getDpid(),
+                    le.getSrc().getNumber());
             if (unmatchedLinkEvents.contains(rev)) {
                 rerouteAll = true;
                 unmatchedLinkEvents.remove(rev);
@@ -630,10 +636,12 @@
                         // FALLTHROUGH
                     case DEL_PENDING:
                         if (isChildIntent) {
-                            log.debug("put the state highLevelIntentStates ID {}, state {}", parentIntent.getId(), nextPathIntentState);
+                            log.debug("put the state highLevelIntentStates ID {}, state {}",
+                                    parentIntent.getId(), nextPathIntentState);
                             highLevelIntentStates.put(parentIntent.getId(), nextPathIntentState);
                         }
-                        log.debug("put the state pathIntentStates ID {}, state {}", pathIntentId, nextPathIntentState);
+                        log.debug("put the state pathIntentStates ID {}, state {}",
+                                pathIntentId, nextPathIntentState);
                         pathIntentStates.put(pathIntentId, nextPathIntentState);
                         break;
                     case DEL_ACK:
@@ -641,10 +649,12 @@
                             if (intentInstalledMap.containsKey(parentIntent.getId())) {
                                  intentInstalledMap.remove(parentIntent.getId());
                             }
-                            log.debug("put the state highLevelIntentStates ID {}, state {}", parentIntent.getId(), nextPathIntentState);
+                            log.debug("put the state highLevelIntentStates ID {}, state {}",
+                                    parentIntent.getId(), nextPathIntentState);
                             highLevelIntentStates.put(parentIntent.getId(), nextPathIntentState);
                         }
-                        log.debug("put the state pathIntentStates ID {}, state {}", pathIntentId, nextPathIntentState);
+                        log.debug("put the state pathIntentStates ID {}, state {}",
+                                pathIntentId, nextPathIntentState);
                         pathIntentStates.put(pathIntentId, nextPathIntentState);
                         break;
                     case CREATED:
@@ -698,7 +708,8 @@
         allSwitchesForPath.add(spfIntent.getDstSwitchDpid());
 
         if (log.isTraceEnabled()) {
-            log.trace("All switches {}, installed installedDpids {}", allSwitchesForPath, intentInstalledMap.get(parentIntentId));
+            log.trace("All switches {}, installed installedDpids {}",
+                    allSwitchesForPath, intentInstalledMap.get(parentIntentId));
         }
 
         if (allSwitchesForPath.equals(intentInstalledMap.get(parentIntentId))) {
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallModule.java b/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallModule.java
index 2d2dbd8..c4d83d2 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallModule.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallModule.java
@@ -100,7 +100,8 @@
          * @param success
          * @param domainSwitchDpids
          */
-        private void sendNotifications(IntentOperationList intents, boolean installed, boolean success, Set<Long> domainSwitchDpids) {
+        private void sendNotifications(IntentOperationList intents,
+                boolean installed, boolean success, Set<Long> domainSwitchDpids) {
             IntentStateList states = new IntentStateList();
             for (IntentOperation i : intents) {
                 IntentState newState;
diff --git a/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java
index 9be2313..b94c30c 100644
--- a/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java
+++ b/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java
@@ -769,7 +769,10 @@
         bb.rewind();
         bb.get(controllerTLVValue, 0, 8);
 
-        this.controllerTLV = new LLDPTLV().setType((byte) 0x0c).setLength((short) controllerTLVValue.length).setValue(controllerTLVValue);
+        this.controllerTLV = new LLDPTLV()
+                                .setType((byte) 0x0c)
+                                .setLength((short) controllerTLVValue.length)
+                                .setValue(controllerTLVValue);
     }
 
     @Override
@@ -868,7 +871,8 @@
             /*else if (sw <= remoteSwitch.getId()) {
                 if (log.isTraceEnabled()) {
                     log.trace("Getting BBDP from a different controller. myId {}: remoteId {}", myId, otherId);
-                    log.trace("and my controller id is smaller than the other, so quelching it. myPort {}: rPort {}", pi.getInPort(), remotePort);
+                    log.trace("and my controller id is smaller than the other, so quelching it. myPort {}: rPort {}",
+                    pi.getInPort(), remotePort);
                 }
                 //XXX ONOS: Fix the BDDP broadcast issue
                 //return Command.CONTINUE;
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
index 0dac65f..8e0a4e6 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
@@ -1225,7 +1225,9 @@
          for (KVDevice d : KVDevice.getAllDevices()) {
               DeviceEvent devEvent = new DeviceEvent(MACAddress.valueOf(d.getMac()));
               for (byte[] portId : d.getAllPortIds()) {
-                  devEvent.addAttachmentPoint(new SwitchPort(KVPort.getDpidFromKey(portId), KVPort.getNumberFromKey(portId)));
+                  devEvent.addAttachmentPoint(
+                          new SwitchPort(KVPort.getDpidFromKey(portId),
+                                  KVPort.getNumberFromKey(portId)));
               }
          }
 
diff --git a/src/main/java/net/onrc/onos/core/util/DataPath.java b/src/main/java/net/onrc/onos/core/util/DataPath.java
index 0a124e5..3d89e96 100644
--- a/src/main/java/net/onrc/onos/core/util/DataPath.java
+++ b/src/main/java/net/onrc/onos/core/util/DataPath.java
@@ -148,7 +148,8 @@
      * Convert the data path to a string.
      * <p/>
      * The string has the following form:
-     * [src=01:01:01:01:01:01:01:01/1111 flowEntry=<entry1> flowEntry=<entry2> flowEntry=<entry3> dst=02:02:02:02:02:02:02:02/2222]
+     * [src=01:01:01:01:01:01:01:01/1111 flowEntry=<entry1> flowEntry=<entry2>
+     * flowEntry=<entry3> dst=02:02:02:02:02:02:02:02/2222]
      *
      * @return the data path as a string.
      */
