diff --git a/src/main/java/org/apache/maven/plugin/toolchain/ToolchainConverter.java b/src/main/java/org/apache/maven/plugin/toolchain/ToolchainConverter.java
index 57393df..8e7d479 100644
--- a/src/main/java/org/apache/maven/plugin/toolchain/ToolchainConverter.java
+++ b/src/main/java/org/apache/maven/plugin/toolchain/ToolchainConverter.java
@@ -74,25 +74,20 @@
     {
         Map map = new HashMap();
         PlexusConfiguration[] tools = configuration.getChildren();
-        for ( int i = 0; i < tools.length; i++ )
-        {
-            String type = tools[i].getName();
-            PlexusConfiguration[] params = tools[i].getChildren();
+        for (PlexusConfiguration tool : tools) {
+            String type = tool.getName();
+            PlexusConfiguration[] params = tool.getChildren();
             Map parameters = new HashMap();
-            for ( int j = 0; j < params.length; j++ )
-            {
-                try
-                {
-                    String name = params[j].getName();
-                    String val = params[j].getValue();
-                    parameters.put( name, val );
-                }
-                catch ( PlexusConfigurationException ex )
-                {
-                    throw new ComponentConfigurationException( ex );
+            for (PlexusConfiguration param : params) {
+                try {
+                    String name = param.getName();
+                    String val = param.getValue();
+                    parameters.put(name, val);
+                } catch (PlexusConfigurationException ex) {
+                    throw new ComponentConfigurationException(ex);
                 }
             }
-            map.put( type, parameters );
+            map.put(type, parameters);
         }
         chain.toolchains = map;
     }
diff --git a/src/main/java/org/apache/maven/plugin/toolchain/ToolchainMojo.java b/src/main/java/org/apache/maven/plugin/toolchain/ToolchainMojo.java
index 57f1746..b0c6b12 100644
--- a/src/main/java/org/apache/maven/plugin/toolchain/ToolchainMojo.java
+++ b/src/main/java/org/apache/maven/plugin/toolchain/ToolchainMojo.java
@@ -83,12 +83,10 @@
                     Map params = toolchains.getParams( type );
                     ToolchainPrivate[] tcs = getToolchains( type );
                     boolean matched = false;
-                    for ( int i = 0; i < tcs.length; i++ )
-                    {
-                        if ( tcs[i].matchesRequirements( params ) )
-                        {
-                            getLog().info( "Toolchain (" + type + ") matched:" + tcs[i] );
-                            toolchainManager.storeToolchainToBuildContext( tcs[i], session );
+                    for (ToolchainPrivate tc : tcs) {
+                        if (tc.matchesRequirements(params)) {
+                            getLog().info("Toolchain (" + type + ") matched:" + tc);
+                            toolchainManager.storeToolchainToBuildContext(tc, session);
                             matched = true;
                             break;
                         }
@@ -108,23 +106,19 @@
                 //TODO add the default toolchain instance if defined??
                 StringBuilder buff = new StringBuilder();
                 buff.append( "Cannot find matching toolchain definitions for the following toolchain types:" );
-                Iterator it = nonMatchedTypes.iterator();
-                while ( it.hasNext() )
-                {
-                    String type = (String) it.next();
-                    buff.append( '\n' );
-                    buff.append( type );
-                    Map params = toolchains.getParams( type );
-                    if ( params.size() > 0 )
-                    {
+                for (Object nonMatchedType : nonMatchedTypes) {
+                    String type = (String) nonMatchedType;
+                    buff.append('\n');
+                    buff.append(type);
+                    Map params = toolchains.getParams(type);
+                    if (params.size() > 0) {
                         Iterator it2 = params.keySet().iterator();
-                        buff.append( " [" );
-                        while ( it2.hasNext() )
-                        {
+                        buff.append(" [");
+                        while (it2.hasNext()) {
                             String string = (String) it2.next();
-                            buff.append( " " + string + "='" + params.get( string ) + "' " );
+                            buff.append(" " + string + "='" + params.get(string) + "' ");
                         }
-                        buff.append( ']' );
+                        buff.append(']');
                     }
                 }
                 getLog().error( buff.toString() );
