diff --git a/src/main/java/net/onrc/onos/core/newintent/IntentManagerRuntime.java b/src/main/java/net/onrc/onos/core/newintent/IntentManagerRuntime.java
index f4ea1e3..7b02632 100644
--- a/src/main/java/net/onrc/onos/core/newintent/IntentManagerRuntime.java
+++ b/src/main/java/net/onrc/onos/core/newintent/IntentManagerRuntime.java
@@ -85,7 +85,7 @@
     public Set<Intent> getIntents() {
         Collection<IntentEvent> events = intentEvents.values();
         Set<Intent> intents = new HashSet<>(events.size());
-        for (IntentEvent event: events) {
+        for (IntentEvent event : events) {
             intents.add(event.getIntent());
         }
         return intents;
@@ -167,7 +167,7 @@
      * @param event event supplied to a listener as an argument
      */
     private void invokeListeners(IntentEvent event) {
-        for (IntentEventListener listener: listeners) {
+        for (IntentEventListener listener : listeners) {
             listener.event(event);
         }
     }
@@ -226,7 +226,7 @@
      */
     private void installIntent(Intent intent) {
         IntentCompilationResult compiled = installableIntents.get(intent.getId());
-        for (InstallableIntent installable: compiled.getResult()) {
+        for (InstallableIntent installable : compiled.getResult()) {
             registerSubclassInstallerIfNeeded(installable);
             getInstaller(installable).install(installable);
         }
@@ -241,7 +241,7 @@
      */
     private void uninstallIntent(Intent intent) {
         IntentCompilationResult compiled = installableIntents.get(intent.getId());
-        for (InstallableIntent installable: compiled.getResult()) {
+        for (InstallableIntent installable : compiled.getResult()) {
             getInstaller(installable).remove(installable);
         }
 
diff --git a/src/main/java/net/onrc/onos/core/newintent/IntentMap.java b/src/main/java/net/onrc/onos/core/newintent/IntentMap.java
index 09d3a23..05a73b9 100644
--- a/src/main/java/net/onrc/onos/core/newintent/IntentMap.java
+++ b/src/main/java/net/onrc/onos/core/newintent/IntentMap.java
@@ -94,7 +94,7 @@
      */
     public Collection<V> values() {
         Collection<V> values = new ArrayList<>();
-        for (byte[] bytes: map.values()) {
+        for (byte[] bytes : map.values()) {
             V value = KryoFactory.deserialize(bytes);
             if (value == null) {
                 continue;
diff --git a/src/main/java/net/onrc/onos/core/newintent/MultiPointToSinglePointIntentCompiler.java b/src/main/java/net/onrc/onos/core/newintent/MultiPointToSinglePointIntentCompiler.java
index e5a9d25..dc1f50c 100644
--- a/src/main/java/net/onrc/onos/core/newintent/MultiPointToSinglePointIntentCompiler.java
+++ b/src/main/java/net/onrc/onos/core/newintent/MultiPointToSinglePointIntentCompiler.java
@@ -87,7 +87,7 @@
         ConstrainedBFSTree bfs = new ConstrainedBFSTree(egressSwitch);
         Tree tree = new Tree();
 
-        for (SwitchPort ingressPort: ingressPorts) {
+        for (SwitchPort ingressPort : ingressPorts) {
             Switch ingressSwitch = topology.getSwitch(ingressPort.getDpid());
             if (ingressSwitch == null) {
                 continue;
diff --git a/src/main/java/net/onrc/onos/core/newintent/PathIntentCompiler.java b/src/main/java/net/onrc/onos/core/newintent/PathIntentCompiler.java
index 0277050..97f6320 100644
--- a/src/main/java/net/onrc/onos/core/newintent/PathIntentCompiler.java
+++ b/src/main/java/net/onrc/onos/core/newintent/PathIntentCompiler.java
@@ -75,7 +75,7 @@
                 .toList();
 
         Path path = new Path();
-        for (LinkTuple link: links) {
+        for (LinkTuple link : links) {
             path.add(new FlowLink(link.getSrc(), link.getDst()));
         }
         return path;
diff --git a/src/main/java/net/onrc/onos/core/newintent/PointToPointIntentCompiler.java b/src/main/java/net/onrc/onos/core/newintent/PointToPointIntentCompiler.java
index a4cfceb..6dcf5fe 100644
--- a/src/main/java/net/onrc/onos/core/newintent/PointToPointIntentCompiler.java
+++ b/src/main/java/net/onrc/onos/core/newintent/PointToPointIntentCompiler.java
@@ -109,7 +109,7 @@
                 .toList();
 
         Path converted = new Path();
-        for (LinkData data: dataEntries) {
+        for (LinkData data : dataEntries) {
             converted.add(new FlowLink(data.getSrc(), data.getDst()));
         }
         return converted;
diff --git a/src/test/java/net/onrc/onos/api/flowmanager/FakeFlowManagerService.java b/src/test/java/net/onrc/onos/api/flowmanager/FakeFlowManagerService.java
index 50e68ce..1c40774 100644
--- a/src/test/java/net/onrc/onos/api/flowmanager/FakeFlowManagerService.java
+++ b/src/test/java/net/onrc/onos/api/flowmanager/FakeFlowManagerService.java
@@ -29,6 +29,7 @@
         this.returnNull = returnNull;
     }
 
+    @Override
     public FlowBatchHandle addFlow(Flow flow) {
         return processFlow();
     }
@@ -113,7 +114,7 @@
     }
 
     private void invokeListeners(FlowStatesChangedEvent event) {
-        for (FlowManagerListener listener: listeners) {
+        for (FlowManagerListener listener : listeners) {
             listener.flowStatesChanged(event);
         }
     }
diff --git a/src/test/java/net/onrc/onos/apps/proxyarp/ArpCacheTest.java b/src/test/java/net/onrc/onos/apps/proxyarp/ArpCacheTest.java
index b641e98..d64d107 100644
--- a/src/test/java/net/onrc/onos/apps/proxyarp/ArpCacheTest.java
+++ b/src/test/java/net/onrc/onos/apps/proxyarp/ArpCacheTest.java
@@ -71,7 +71,7 @@
     @Test
     public void testGetMappings() {
         testUpdate();
-        for (String macStr :arpCache.getMappings()) {
+        for (String macStr : arpCache.getMappings()) {
             assertNotNull(macStr);
         }
     }
