diff --git a/conf/checkstyle/sun_checks.xml b/conf/checkstyle/sun_checks.xml
index cbc0cc6..870c124 100644
--- a/conf/checkstyle/sun_checks.xml
+++ b/conf/checkstyle/sun_checks.xml
@@ -202,6 +202,7 @@
         <module name="WhitespaceAround">
             <property name="allowEmptyConstructors" value="true"/>
             <property name="allowEmptyMethods" value="true"/>
+            <property name="ignoreEnhancedForColon" value="false"/>
         </module>
 
 
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);
         }
     }
