diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/AbstractFacesMojo.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/AbstractFacesMojo.java
index f40fd26..30a523c 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/AbstractFacesMojo.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/AbstractFacesMojo.java
@@ -147,9 +147,9 @@
         // requires JAXP 1.3, in JavaSE 5.0
         // spf.setXIncludeAware(false);
 
-        for (Iterator i=masters.iterator(); i.hasNext();)
+        for (Iterator<URL> i=masters.iterator(); i.hasNext();)
         {
-          URL url = (URL)i.next();
+          URL url = i.next();
           Digester digester = new Digester(spf.newSAXParser());
           digester.setNamespaceAware(true);
 
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateComponentsMojo.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateComponentsMojo.java
index 47eeafc..93335bc 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateComponentsMojo.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateComponentsMojo.java
@@ -84,7 +84,7 @@
       if (suppressListenerMethods)
         getLog().warn("Event listener methods will not be generated");
 
-      Iterator components = facesConfig.components();
+      Iterator<ComponentBean> components = facesConfig.components();
       components = new FilteredIterator(components, new SkipFilter());
       components = new FilteredIterator(components,
                                         new ComponentTypeFilter(typePrefix));
@@ -102,7 +102,7 @@
         int count = 0;
         while (components.hasNext())
         {
-          _generateComponent((ComponentBean)components.next());
+          _generateComponent(components.next());
           count++;
         }
         getLog().info("Generated " + count + " component(s)");
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateJspTaglibsMojo.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateJspTaglibsMojo.java
index 56fb9b8..6a35537 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateJspTaglibsMojo.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateJspTaglibsMojo.java
@@ -144,9 +144,9 @@
 
       // taglibs map syntax requires distinct shortNames,
       // which is a Good Thing!
-      for (Iterator i = taglibs.entrySet().iterator(); i.hasNext(); )
+      for (Iterator<Map.Entry> i = taglibs.entrySet().iterator(); i.hasNext(); )
       {
-        Map.Entry entry = (Map.Entry)i.next();
+        Map.Entry entry = i.next();
         String shortName = (String)entry.getKey();
         String namespaceURI = (String)entry.getValue();
 
@@ -492,11 +492,11 @@
     // converters need an id attribute
     writeTagAttribute(stream, "id", "the identifier for the converter", null, null);
 
-    Iterator properties = converter.properties();
+    Iterator<PropertyBean> properties = converter.properties();
     properties = new FilteredIterator(properties, new TagAttributeFilter());
     while (properties.hasNext())
     {
-      PropertyBean property = (PropertyBean)properties.next();
+      PropertyBean property = properties.next();
       writeTagAttribute(stream,
                          property.getPropertyName(),
                          property.getDescription(),
@@ -704,11 +704,11 @@
     // validators need an id attribute
     writeTagAttribute(stream, "id", "the identifier for the validator", null, null);
 
-    Iterator properties = validator.properties();
+    Iterator<PropertyBean> properties = validator.properties();
     properties = new FilteredIterator(properties, new TagAttributeFilter());
     while (properties.hasNext())
     {
-      PropertyBean property = (PropertyBean)properties.next();
+      PropertyBean property = properties.next();
       writeTagAttribute(stream,
                          property.getPropertyName(),
                          property.getDescription(),
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateRendererMapMojo.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateRendererMapMojo.java
index 66ff540..0910a0b 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateRendererMapMojo.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/GenerateRendererMapMojo.java
@@ -71,10 +71,10 @@
     }
     else
     {
-      Iterator renderkits = facesConfig.renderKits();
+      Iterator<RenderKitBean> renderkits = facesConfig.renderKits();
       while (renderkits.hasNext())
       {
-        RenderKitBean renderkit = (RenderKitBean) renderkits.next();
+        RenderKitBean renderkit = renderkits.next();
         String id = renderkit.getRenderKitId();
         if (!id.startsWith(renderKitPrefix))
           continue;
@@ -92,10 +92,10 @@
     PrintWriter pw = new PrintWriter(fw);
     try
     {
-      Iterator renderers = rk.renderers();
+      Iterator<RendererBean> renderers = rk.renderers();
       while (renderers.hasNext())
       {
-        RendererBean r = (RendererBean) renderers.next();
+        RendererBean r = renderers.next();
         pw.print(r.getComponentFamily());
         pw.print('|');
         pw.print(r.getRendererType());
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/GeneratorHelper.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/GeneratorHelper.java
index 61d83dd..0b07bdf 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/GeneratorHelper.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/GeneratorHelper.java
@@ -129,12 +129,12 @@
       String packageName,
       Set imports)
   {
-    Iterator iterator = imports.iterator();
+    Iterator<String> iterator = imports.iterator();
     iterator = new FilteredIterator(iterator,
         new PackageImportsFilter(packageName));
     while (iterator.hasNext())
     {
-      String className = (String) iterator.next();
+      String className = iterator.next();
       out.println("import " + className + ";");
     }
 
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/component/AbstractComponentGenerator.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/component/AbstractComponentGenerator.java
index 02d86ad..06078f2 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/component/AbstractComponentGenerator.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/component/AbstractComponentGenerator.java
@@ -100,10 +100,10 @@
       out.println(" * <th align=\"left\">Phases</th>");
       out.println(" * <th align=\"left\">Description</th>");
       out.println(" * </tr>");
-      Iterator events = component.events(true);
+      Iterator<EventRefBean> events = component.events(true);
       while (events.hasNext())
       {
-        EventRefBean eventRef = (EventRefBean) events.next();
+        EventRefBean eventRef = events.next();
         EventBean event = eventRef.resolveEventType();
         if (event != null)
         {
@@ -156,10 +156,10 @@
     if (component.isClientBehaviorHolder())
       interfaces.add("javax.faces.component.behavior.ClientBehaviorHolder");
 
-    Iterator events = component.events();
+    Iterator<EventRefBean> events = component.events();
     while (events.hasNext())
     {
-      EventRefBean eventRef = (EventRefBean) events.next();
+      EventRefBean eventRef = events.next();
       EventBean event = eventRef.resolveEventType();
       if (event != null)
       {
@@ -249,14 +249,14 @@
       imports.add("javax.faces.component.behavior.ClientBehaviorHolder");
     }
 
-    Iterator properties = component.properties();
+    Iterator<PropertyBean> properties = component.properties();
     properties = new FilteredIterator(properties, new NonVirtualFilter());
     // PropertyKey only needed if there are properties
     if (properties.hasNext())
     {
       while (properties.hasNext())
       {
-        PropertyBean property = (PropertyBean) properties.next();
+        PropertyBean property = properties.next();
         String propertyClass = property.getPropertyClass();
         if (propertyClass != null)
         {
@@ -279,10 +279,10 @@
     if (facets.hasNext())
       imports.add("javax.faces.component.UIComponent");
 
-    Iterator events = component.events();
+    Iterator<EventRefBean> events = component.events();
     while (events.hasNext())
     {
-      EventRefBean eventRef = (EventRefBean) events.next();
+      EventRefBean eventRef = events.next();
       EventBean event = eventRef.resolveEventType();
 
       if (event == null)
@@ -376,11 +376,11 @@
       ComponentBean component) throws IOException
   {
     //  component property keys
-    Iterator properties = component.properties();
+    Iterator<PropertyBean> properties = component.properties();
     properties = new FilteredIterator(properties, new NonVirtualFilter());
     while (properties.hasNext())
     {
-      PropertyBean property = (PropertyBean) properties.next();
+      PropertyBean property = properties.next();
       String[] propertyValues = property.getPropertyValues();
 
       if (propertyValues != null)
@@ -406,10 +406,10 @@
       PrettyWriter out,
       ComponentBean component) throws IOException
   {
-    Iterator facets = component.facets();
+    Iterator<FacetBean> facets = component.facets();
     while (facets.hasNext())
     {
-      FacetBean facet = (FacetBean) facets.next();
+      FacetBean facet = facets.next();
       String facetName = facet.getFacetName();
       String facetKey = Util.getConstantNameFromProperty(facetName, "_FACET");
       out.println("static public final " +
@@ -609,11 +609,11 @@
   public void writePropertyMethods(PrettyWriter out, ComponentBean component, Collection ignoreList)
       throws IOException
   {
-    Iterator properties = component.properties();
+    Iterator<PropertyBean> properties = component.properties();
     properties = new FilteredIterator(properties, new NonVirtualFilter());
     while (properties.hasNext())
     {
-      PropertyBean property = (PropertyBean) properties.next();
+      PropertyBean property = properties.next();
       if (property.isList())
         writePropertyListMethods(out, property, ignoreList);
       else
@@ -821,10 +821,10 @@
       PrettyWriter out,
       ComponentBean component) throws IOException
   {
-    Iterator facets = component.facets();
+    Iterator<FacetBean> facets = component.facets();
     while (facets.hasNext())
     {
-      FacetBean facet = (FacetBean) facets.next();
+      FacetBean facet = facets.next();
       writeFacetGet(out, facet);
       writeFacetSet(out, facet);
     }
@@ -907,10 +907,10 @@
       PrettyWriter out,
       ComponentBean component) throws IOException
   {
-    Iterator events = component.events();
+    Iterator<EventRefBean> events = component.events();
     while (events.hasNext())
     {
-      EventRefBean eventRef = (EventRefBean) events.next();
+      EventRefBean eventRef = events.next();
       EventBean event = eventRef.resolveEventType();
       if (event != null)
       {
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/component/MyFacesComponentGenerator.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/component/MyFacesComponentGenerator.java
index 38263c1..7049560 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/component/MyFacesComponentGenerator.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/component/MyFacesComponentGenerator.java
@@ -49,9 +49,9 @@
   {
     imports.add("javax.faces.context.FacesContext");
     imports.add("javax.el.ValueExpression");
-    for (Iterator lIterator = component.properties(); lIterator.hasNext();)
+    for (Iterator<PropertyBean> lIterator = component.properties(); lIterator.hasNext();)
     {
-      PropertyBean lPropertyBean = (PropertyBean) lIterator.next();
+      PropertyBean lPropertyBean = lIterator.next();
       if (GeneratorHelper.isValidator(lPropertyBean, _is12))
       {
         imports.add("javax.faces.validator.Validator");
@@ -297,9 +297,9 @@
     // first we count the primitive properties, because for each primitive property
     // we save a new property that says if the property has been set or not
     int primitivePropertiesCount = 0;
-    for (Iterator iterator = component.properties(); iterator.hasNext();)
+    for (Iterator<PropertyBean> iterator = component.properties(); iterator.hasNext();)
     {
-      PropertyBean property = (PropertyBean) iterator.next();
+      PropertyBean property = iterator.next();
       if (Util.isPrimitiveClass(property.getPropertyClass()))
       {
         primitivePropertiesCount++;
@@ -321,9 +321,9 @@
 
     int propIndex = 1;
 
-    for (Iterator iterator = component.properties(); iterator.hasNext();)
+    for (Iterator<PropertyBean> iterator = component.properties(); iterator.hasNext();)
     {
-      PropertyBean property = (PropertyBean) iterator.next();
+      PropertyBean property = iterator.next();
       String varName = property.getFieldPropertyName();
 
       if (property.isStateHolder())
@@ -381,9 +381,9 @@
 
     int propIndex = 1;
 
-    for (Iterator iterator = component.properties(); iterator.hasNext();)
+    for (Iterator<PropertyBean> iterator = component.properties(); iterator.hasNext();)
     {
-      PropertyBean property = (PropertyBean) iterator.next();
+      PropertyBean property = iterator.next();
 
       String varName = property.getFieldPropertyName();
       String propFullClass = property.getPropertyClass();
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/component/TrinidadComponentGenerator.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/component/TrinidadComponentGenerator.java
index 6a6efd8..6ab1798 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/component/TrinidadComponentGenerator.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/component/TrinidadComponentGenerator.java
@@ -50,7 +50,7 @@
 
     imports.add("org.apache.myfaces.trinidad.bean.FacesBean");
 
-    Iterator properties = component.properties();
+    Iterator<PropertyBean> properties = component.properties();
     properties = new FilteredIterator(properties, new NonVirtualFilter());
     // PropertyKey only needed if there are properties
     if (properties.hasNext())
@@ -60,7 +60,7 @@
       PropertyFilter resolvable = new ResolvableTypeFilter();
       while (properties.hasNext())
       {
-        PropertyBean property = (PropertyBean) properties.next();
+        PropertyBean property = properties.next();
 
         // ComponentUtils only needed for resolvable properties
         if (resolvable.accept(property))
@@ -99,11 +99,11 @@
     out.unindent();
 
     //  component property keys
-    Iterator properties = component.properties();
+    Iterator<PropertyBean> properties = component.properties();
     properties = new FilteredIterator(properties, new NonVirtualFilter());
     while (properties.hasNext())
     {
-      PropertyBean property = (PropertyBean) properties.next();
+      PropertyBean property = properties.next();
       String propName = property.getPropertyName();
       String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
       String propAlias = property.getAliasOf();
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractComponentTagGenerator.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractComponentTagGenerator.java
index 433ae8c..6bb04df 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractComponentTagGenerator.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractComponentTagGenerator.java
@@ -61,10 +61,10 @@
   {
     Set imports = new TreeSet();
 
-    for (Iterator lIterator = components.iterator(); lIterator.hasNext();)
+    for (Iterator<ComponentBean> lIterator = components.iterator(); lIterator.hasNext();)
     {
-      ComponentBean component = (ComponentBean) lIterator.next();
-      Iterator properties = component.properties();
+      ComponentBean component = lIterator.next();
+      Iterator<PropertyBean> properties = component.properties();
       properties = new FilteredIterator(properties, new TagAttributeFilter());
 
       // TODO: remove these imports
@@ -81,7 +81,7 @@
 
       while (properties.hasNext())
       {
-        PropertyBean property = (PropertyBean) properties.next();
+        PropertyBean property = properties.next();
 
         String propertyClass = property.getPropertyClass();
         String[] propertyClassParams = property.getPropertyClassParameters();
@@ -195,12 +195,12 @@
   public void writePropertyMembers(PrettyWriter out,
                                    ComponentBean component) throws IOException
   {
-    Iterator properties = component.properties();
+    Iterator<PropertyBean> properties = component.properties();
     properties = new FilteredIterator(properties, new TagAttributeFilter());
 
     while (properties.hasNext())
     {
-      PropertyBean property = (PropertyBean) properties.next();
+      PropertyBean property = properties.next();
       writePropertyDeclaration(out, property);
       writePropertySetter(out, property);
     }
@@ -209,9 +209,9 @@
 
   public void writePropertyMembers(PrettyWriter out, Collection components) throws IOException
   {
-    for (Iterator lIterator = components.iterator(); lIterator.hasNext();)
+    for (Iterator<ComponentBean> lIterator = components.iterator(); lIterator.hasNext();)
     {
-      writePropertyMembers(out, (ComponentBean) lIterator.next());
+      writePropertyMembers(out, lIterator.next());
     }
   }
 
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractConverterTagGenerator.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractConverterTagGenerator.java
index e54265a..26fd284 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractConverterTagGenerator.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractConverterTagGenerator.java
@@ -87,7 +87,7 @@
     PrettyWriter  out,
     ConverterBean converter) throws IOException
   {
-    Iterator properties = converter.properties();
+    Iterator<PropertyBean> properties = converter.properties();
     properties = new FilteredIterator(properties, new TagAttributeFilter());
     if (properties.hasNext())
     {
@@ -102,7 +102,7 @@
       out.indent();
       while (properties.hasNext())
       {
-        PropertyBean property = (PropertyBean)properties.next();
+        PropertyBean property = properties.next();
         writeSetProperty(out, property);
       }
       out.unindent();
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractTagGenerator.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractTagGenerator.java
index ada75f2..3d180ea 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractTagGenerator.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractTagGenerator.java
@@ -93,11 +93,11 @@
       PrettyWriter  out,
       AbstractTagBean abstractTag) throws IOException
     {
-      Iterator properties = abstractTag.properties();
+      Iterator<PropertyBean> properties = abstractTag.properties();
       properties = new FilteredIterator(properties, new TagAttributeFilter());
       while (properties.hasNext())
       {
-        PropertyBean property = (PropertyBean)properties.next();
+        PropertyBean property = properties.next();
         out.println();
         writePropertyMember(out, property);
         writePropertySet(out, property);
@@ -136,7 +136,7 @@
     PrettyWriter  out,
     AbstractTagBean abstractTag) throws IOException
   {
-    Iterator properties = abstractTag.properties();
+    Iterator<PropertyBean> properties = abstractTag.properties();
     properties = new FilteredIterator(properties, new TagAttributeFilter());
     if (properties.hasNext())
     {
@@ -150,7 +150,7 @@
       out.println("super.release();");
       while (properties.hasNext())
       {
-        PropertyBean property = (PropertyBean)properties.next();
+        PropertyBean property = properties.next();
         String propName = property.getPropertyName();
         String propVar = "_" + Util.getVariableFromName(propName);
         out.println(propVar + " = null;");
@@ -210,12 +210,12 @@
   }
 
   protected void addImportsFromPropertes(AbstractTagBean abstractTagBean, Set imports) {
-    Iterator properties = abstractTagBean.properties();
+    Iterator<PropertyBean> properties = abstractTagBean.properties();
     properties = new FilteredIterator(properties, new TagAttributeFilter());
 
     while (properties.hasNext())
     {
-      PropertyBean property = (PropertyBean)properties.next();
+      PropertyBean property = properties.next();
 
       String propertyClass = property.getPropertyClass();
       if (propertyClass != null)
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractValidatorTagGenerator.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractValidatorTagGenerator.java
index bcf7197..ff19d86 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractValidatorTagGenerator.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/AbstractValidatorTagGenerator.java
@@ -165,7 +165,7 @@
       PrettyWriter  out,
       ValidatorBean validator) throws IOException
     {
-      Iterator properties = validator.properties();
+      Iterator<PropertyBean> properties = validator.properties();
       properties = new FilteredIterator(properties, new TagAttributeFilter());
       if (properties.hasNext())
       {
@@ -180,7 +180,7 @@
         out.indent();
         while (properties.hasNext())
         {
-          PropertyBean property = (PropertyBean)properties.next();
+          PropertyBean property = properties.next();
           writeSetProperty(out, property);
         }
         out.unindent();
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/MyFacesComponentTagGenerator.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/MyFacesComponentTagGenerator.java
index ceb10e1..792a2c1 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/MyFacesComponentTagGenerator.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/MyFacesComponentTagGenerator.java
@@ -185,9 +185,9 @@
   {
 
     Collection all = new HashSet();
-    for (Iterator lIterator = components.iterator(); lIterator.hasNext();)
+    for (Iterator<ComponentBean> lIterator = components.iterator(); lIterator.hasNext();)
     {
-      ComponentBean component = (ComponentBean) lIterator.next();
+      ComponentBean component = lIterator.next();
       Iterator prop = component.properties();
       while (prop.hasNext())
       {
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/TrinidadComponentTagGenerator.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/TrinidadComponentTagGenerator.java
index ae3f791..839a5e6 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/TrinidadComponentTagGenerator.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/generator/taglib/TrinidadComponentTagGenerator.java
@@ -62,12 +62,12 @@
       imports.add("javax.el.ValueExpression");
     }
 
-    Iterator properties = component.properties();
+    Iterator<PropertyBean> properties = component.properties();
     properties = new FilteredIterator(properties, new TagAttributeFilter());
 
     while (properties.hasNext())
     {
-      PropertyBean property = (PropertyBean) properties.next();
+      PropertyBean property = properties.next();
       String propertyClass = property.getPropertyClass();
       String[] propertyClassParams = property.getPropertyClassParameters();
 
@@ -206,9 +206,9 @@
       throws IOException
   {
     Collection all = new HashSet();
-    for (Iterator lIterator = components.iterator(); lIterator.hasNext();)
+    for (Iterator<ComponentBean> lIterator = components.iterator(); lIterator.hasNext();)
     {
-      ComponentBean component = (ComponentBean) lIterator.next();
+      ComponentBean component = lIterator.next();
       Iterator prop = component.properties();
       while (prop.hasNext())
       {
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/AbstractTagBean.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/AbstractTagBean.java
index 39aa5f8..7df387b 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/AbstractTagBean.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/AbstractTagBean.java
@@ -32,11 +32,11 @@
   private String       _longDescription;
   private QName        _tagName;
   private String       _tagClass;
-  protected Map        _properties;
+  protected Map<String, PropertyBean> _properties;
   private int          _tagClassModifiers;
-  private Map          _examples;
+  private Map<String, ExampleBean>    _examples;
   private int          _exampleIdx = 0;
-  private Map          _screenshots;
+  private Map<String, ScreenshotBean> _screenshots;
   private int          _screenshotIdx = 0;
   
   public AbstractTagBean() 
@@ -52,10 +52,10 @@
     // use the same properties.
     if (!isComponentBean)
     {
-      _properties = new LinkedHashMap();
+      _properties = new LinkedHashMap<String, PropertyBean>();
     }
-    _examples   = new LinkedHashMap();      
-    _screenshots = new LinkedHashMap();   
+    _examples   = new LinkedHashMap<String, ExampleBean>();      
+    _screenshots = new LinkedHashMap<String, ScreenshotBean>();   
   }
 
   /**
@@ -162,7 +162,7 @@
   public PropertyBean findProperty(
     String propertyName)
   {
-    return (PropertyBean)_properties.get(propertyName);
+    return _properties.get(propertyName);
   }
 
   /**
@@ -181,7 +181,7 @@
    *
    * @return  the property iterator
    */
-  public Iterator properties()
+  public Iterator<PropertyBean> properties()
   {
     return _properties.values().iterator();
   }
@@ -218,7 +218,7 @@
   public ExampleBean findExample(
     String key)
   {
-    return (ExampleBean)_examples.get(key);
+    return _examples.get(key);
   }
 
   /**
@@ -226,7 +226,7 @@
    *
    * @return  the example iterator
    */
-  public Iterator examples()
+  public Iterator<ExampleBean> examples()
   {
     return _examples.values().iterator();
   }
@@ -263,7 +263,7 @@
   public ScreenshotBean findScreenshot(
     String key)
   {
-    return (ScreenshotBean)_screenshots.get(key);
+    return _screenshots.get(key);
   }
 
   /**
@@ -271,7 +271,7 @@
   *
   * @return  the screenshot iterator
   */
-  public Iterator screenshots()
+  public Iterator<ScreenshotBean> screenshots()
   {
     return _screenshots.values().iterator();
   }
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/ComponentBean.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/ComponentBean.java
index bce4716..2e3aef6 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/ComponentBean.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/ComponentBean.java
@@ -44,9 +44,9 @@
   public ComponentBean()
   {
     super(true);
-    _properties = new LinkedHashMap();
-    _facets = new LinkedHashMap();
-    _events = new LinkedHashMap();
+    _properties = new LinkedHashMap<String, PropertyBean>();
+    _facets = new LinkedHashMap<String, FacetBean>();
+    _events = new LinkedHashMap<String, EventRefBean>();
   }
 
   /**
@@ -467,7 +467,7 @@
   public PropertyBean findProperty(
     String propertyName)
   {
-    return (PropertyBean)_properties.get(propertyName);
+    return _properties.get(propertyName);
   }
 
   /**
@@ -528,7 +528,7 @@
    *
    * @return  the property iterator
    */
-  public Iterator properties()
+  public Iterator<PropertyBean> properties()
   {
     return _properties.values().iterator();
   }
@@ -542,7 +542,7 @@
    *
    * @return  the property iterator
    */
-  public Iterator properties(
+  public Iterator<PropertyBean> properties(
     boolean flatten)
   {
     if (flatten)
@@ -562,9 +562,9 @@
     if (parent != null)
     {
       Map superProps = parent.getFlattenedProperties();
-      for (Iterator iter = superProps.entrySet().iterator(); iter.hasNext(); )
+      for (Iterator<Map.Entry> iter = superProps.entrySet().iterator(); iter.hasNext(); )
       {
-        Map.Entry entry = (Map.Entry)iter.next();
+        Map.Entry entry = iter.next();
         if (!props.containsKey(entry.getKey()))
         {
           props.put(entry.getKey(), entry.getValue());
@@ -602,7 +602,7 @@
   public FacetBean findFacet(
     String facetName)
   {
-    return (FacetBean)_facets.get(facetName);
+    return _facets.get(facetName);
   }
 
   public FacetBean findFacet(
@@ -658,7 +658,7 @@
    *
    * @return  the facet iterator
    */
-  public Iterator facets()
+  public Iterator<FacetBean> facets()
   {
     return _facets.values().iterator();
   }
@@ -672,7 +672,7 @@
   *
   * @return  the facet iterator
   */
-  public Iterator facets(
+  public Iterator<FacetBean> facets(
    boolean flatten)
   {
     if (flatten)
@@ -692,9 +692,9 @@
     if (parent != null)
     {
       Map superFacets = parent.getFlattenedFacets();
-      for (Iterator iter = superFacets.entrySet().iterator(); iter.hasNext(); )
+      for (Iterator<Map.Entry> iter = superFacets.entrySet().iterator(); iter.hasNext(); )
       {
-        Map.Entry entry = (Map.Entry)iter.next();
+        Map.Entry entry = iter.next();
         if (!facets.containsKey(entry.getKey()))
         {
           facets.put(entry.getKey(), entry.getValue());
@@ -1011,17 +1011,17 @@
    *
    * @param eventName  the event name to find
    */
-  public EventBean findEvent(
+  public EventRefBean findEvent(
     String eventName)
   {
-    return (EventBean)_events.get(eventName);
+    return _events.get(eventName);
   }
 
-  public EventBean findEvent(
+  public EventRefBean findEvent(
     String eventName,
     boolean flatten)
   {
-    EventBean event = findEvent(eventName);
+    EventRefBean event = findEvent(eventName);
     if (event == null && flatten)
     {
       ComponentBean parent = resolveSupertype();
@@ -1037,7 +1037,7 @@
    *
    * @return  the event iterator
    */
-  public Iterator events()
+  public Iterator<EventRefBean> events()
   {
     return _events.values().iterator();
   }
@@ -1051,10 +1051,10 @@
   *
   * @return  the event iterator
   */
-  public Iterator events(
+  public Iterator<EventRefBean> events(
    boolean flatten)
   {
-    Iterator events = events();
+    Iterator<EventRefBean> events = events();
     if (flatten)
     {
       ComponentBean parent = resolveSupertype();
@@ -1220,10 +1220,10 @@
     FacesConfigBean owner)
   {
     super.attach(owner);
-    Iterator events = events(false);
+    Iterator<EventRefBean> events = events(false);
     while (events.hasNext())
     {
-      EventRefBean eventRef = (EventRefBean)events.next();
+      EventRefBean eventRef = events.next();
       eventRef.attach(owner);
     }
   }
@@ -1245,9 +1245,9 @@
   private String  _defaultEventName;
   private boolean _namingContainer;
   private boolean _children = true;
-  private Map     _properties;
-  private Map     _facets;
-  private Map     _events;
+  private Map<String, PropertyBean> _properties;
+  private Map<String, FacetBean>    _facets;
+  private Map<String, EventRefBean>    _events;
   private int     _componentClassModifiers;
   private int     _tagClassModifiers;
   private String[] _unsupportedAgents = new String[0];
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/FacesConfigBean.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/FacesConfigBean.java
index 5e75106..5047d0b 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/FacesConfigBean.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/FacesConfigBean.java
@@ -50,7 +50,7 @@
   public ConverterBean findConverter(
     String converterId)
   {
-    return (ConverterBean)_converters.get(converterId);
+    return _converters.get(converterId);
   }
 
   /**
@@ -70,7 +70,7 @@
    *
    * @return  the converter iterator
    */
-  public Iterator converters()
+  public Iterator<ConverterBean> converters()
   {
     return _converters.values().iterator();
   }
@@ -96,7 +96,7 @@
   public ValidatorBean findValidator(
     String validatorId)
   {
-    return (ValidatorBean)_validators.get(validatorId);
+    return _validators.get(validatorId);
   }
 
   /**
@@ -116,7 +116,7 @@
    *
    * @return  the validator iterator
    */
-  public Iterator validators()
+  public Iterator<ValidatorBean> validators()
   {
     return _validators.values().iterator();
   }
@@ -145,7 +145,7 @@
   public ComponentBean findComponent(
     String componentType)
   {
-    return (ComponentBean)_components.get(componentType);
+    return _components.get(componentType);
   }
 
   /**
@@ -165,7 +165,7 @@
    *
    * @return  the component iterator
    */
-  public Iterator components()
+  public Iterator<ComponentBean> components()
   {
     return _components.values().iterator();
   }
@@ -232,7 +232,7 @@
    *
    * @return  the event iterator
    */
-  public Iterator events()
+  public Iterator<EventBean> events()
   {
     return _events.values().iterator();
   }
@@ -304,11 +304,11 @@
     return _cur;
   }
 
-  private Map _converters = new TreeMap();
-  private Map _validators = new TreeMap();
-  private Map _components = new TreeMap();
-  private Map _events = new TreeMap();
-  private Map _renderKits = new TreeMap();
+  private Map<String, ConverterBean> _converters = new TreeMap<String, ConverterBean>();
+  private Map<String, ValidatorBean> _validators = new TreeMap<String, ValidatorBean>();
+  private Map<String, ComponentBean> _components = new TreeMap<String, ComponentBean>();
+  private Map<String, EventBean> _events = new TreeMap<String, EventBean>();
+  private Map<String, RenderKitBean> _renderKits = new TreeMap<String, RenderKitBean>();
   private URL _currentResource = null;
 
   static private final Logger _LOG = Logger.getLogger(FacesConfigBean.class.getName());
diff --git a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/RenderKitBean.java b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/RenderKitBean.java
index c839a38..29bbaf8 100644
--- a/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/RenderKitBean.java
+++ b/maven-faces-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/faces/parse/RenderKitBean.java
@@ -87,7 +87,7 @@
     String rendererType)
   {
     String compositeKey = componentFamily + "|" + rendererType;
-    return (RendererBean) _renderers.get(compositeKey);
+    return _renderers.get(compositeKey);
   }
 
   /**
@@ -106,7 +106,7 @@
    *
    * @return  the renderer iterator
    */
-  public Iterator renderers()
+  public Iterator<RendererBean> renderers()
   {
     return _renderers.values().iterator();
   }
@@ -120,10 +120,10 @@
     FacesConfigBean owner)
   {
     super.attach(owner);
-    Iterator renderers = renderers();
+    Iterator<RendererBean> renderers = renderers();
     while (renderers.hasNext())
     {
-      RendererBean renderer = (RendererBean)renderers.next();
+      RendererBean renderer = renderers.next();
       renderer.attach(owner);
     }
   }
@@ -131,13 +131,13 @@
   void addAllRenderers(
     RenderKitBean renderKit)
   {
-    for (Iterator i = renderKit._renderers.values().iterator(); i.hasNext();)
+    for (Iterator<RendererBean> i = renderKit._renderers.values().iterator(); i.hasNext();)
     {
       // use addRenderer to establish owner
-      addRenderer((RendererBean)i.next());
+      addRenderer(i.next());
     }
   }
 
   private String  _renderKitId = "";
-  private Map     _renderers;
+  private Map<String,RendererBean>   _renderers;
 }
diff --git a/maven-javacc-plugin/src/main/java/org/apache/myfaces/trinidadinternal/view/faces/maven/plugin/javacc/JavaCCMojo.java b/maven-javacc-plugin/src/main/java/org/apache/myfaces/trinidadinternal/view/faces/maven/plugin/javacc/JavaCCMojo.java
index 4ad6f1c..9dd1cf8 100644
--- a/maven-javacc-plugin/src/main/java/org/apache/myfaces/trinidadinternal/view/faces/maven/plugin/javacc/JavaCCMojo.java
+++ b/maven-javacc-plugin/src/main/java/org/apache/myfaces/trinidadinternal/view/faces/maven/plugin/javacc/JavaCCMojo.java
@@ -249,9 +249,9 @@
       return;
     }
 
-    for (Iterator i = staleGrammars.iterator(); i.hasNext(); )
+    for (Iterator<File> i = staleGrammars.iterator(); i.hasNext(); )
     {
-      File javaccFile = (File) i.next();
+      File javaccFile = i.next();
       try
       {
         org.javacc.parser.Main.mainProgram(generateJavaCCArgumentList(javaccFile.getAbsolutePath()));
diff --git a/maven-tagdoc-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/tagdoc/TagdocReport.java b/maven-tagdoc-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/tagdoc/TagdocReport.java
index 230464c..0b32172 100644
--- a/maven-tagdoc-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/tagdoc/TagdocReport.java
+++ b/maven-tagdoc-plugin/src/main/java/org/apache/myfaces/trinidadbuild/plugin/tagdoc/TagdocReport.java
@@ -189,11 +189,11 @@
       }
     }
 
-    Iterator validators = facesConfig.validators();
+    Iterator<ValidatorBean> validators = facesConfig.validators();
     validators = new FilteredIterator(validators, new ValidatorTagFilter());
     validators = new FilteredIterator(validators, new ValidatorNamespaceFilter());
 
-    Iterator converters = facesConfig.converters();
+    Iterator<ConverterBean> converters = facesConfig.converters();
     converters = new FilteredIterator(converters, new ConverterTagFilter());
     converters = new FilteredIterator(converters, new ConverterNamespaceFilter());
 
@@ -215,7 +215,7 @@
     int count = 0;
     while (components.hasNext())
     {
-      String pageName = _generateComponentDoc((ComponentBean)components.next(), compTypeMap, contractMap);
+      String pageName = _generateComponentDoc(components.next(), compTypeMap, contractMap);
       if (pageName != null)
       {
         componentPages.add(pageName);
@@ -224,7 +224,7 @@
     }
     while (converters.hasNext())
     {
-      String pageName = _generateConverterDoc((ConverterBean)converters.next());
+      String pageName = _generateConverterDoc(converters.next());
       if (pageName != null)
       {
         converterPages.add(pageName);
@@ -233,7 +233,7 @@
     }
     while (validators.hasNext())
     {
-      String pageName = _generateValidatorDoc((ValidatorBean)validators.next());
+      String pageName = _generateValidatorDoc(validators.next());
       if (pageName != null)
       {
         validatorPages.add(pageName);
@@ -259,9 +259,9 @@
     sink.sectionTitle1_();
     sink.section1();
 
-    for (Iterator i = taglibs.entrySet().iterator(); i.hasNext(); )
+    for (Iterator<Map.Entry> i = taglibs.entrySet().iterator(); i.hasNext(); )
     {
-      Map.Entry entry = (Map.Entry)i.next();
+      Map.Entry entry = i.next();
       sink.paragraph();
 
       sink.bold();
@@ -431,14 +431,14 @@
     sink.text("Tag Name");
     sink.tableHeaderCell_();
     sink.tableRow_();
-
-    Iterator iter = pages.iterator();
+    
+    Iterator<String> iter = pages.iterator();
     while (iter.hasNext())
     {
       sink.tableRow();
       sink.tableCell();
-
-      String name = (String) iter.next();
+      
+      String name = iter.next();
       String tagName = "<" + name.replace('_', ':') + ">";
 
       sink.link(_DOC_SUBDIRECTORY + "/" + name + ".html");
@@ -477,9 +477,9 @@
     if (namespace == null)
       return null;
 
-    for (Iterator i = taglibs.entrySet().iterator(); i.hasNext(); )
+    for (Iterator<Map.Entry> i = taglibs.entrySet().iterator(); i.hasNext(); )
     {
-      Map.Entry entry = (Map.Entry)i.next();
+      Map.Entry entry = i.next();
       if (namespace.equals(entry.getValue()))
         return (String) entry.getKey();
     }
@@ -842,20 +842,20 @@
   {
     // Sort the names
     TreeSet attributes = new TreeSet();
-    Iterator attrs = bean.properties(true);
+    Iterator<PropertyBean> attrs = bean.properties(true);
     while (attrs.hasNext())
     {
-      PropertyBean property = (PropertyBean) attrs.next();
+      PropertyBean property = attrs.next();
       if (!property.isTagAttributeExcluded())
         attributes.add(property.getPropertyName());
     }
 
     // Now get a list of PropertyBeans
     List list = new ArrayList();
-    Iterator iter = attributes.iterator();
+    Iterator<String> iter = attributes.iterator();
     while (iter.hasNext())
     {
-      String attrName = (String) iter.next();
+      String attrName = iter.next();
       list.add(bean.findProperty(attrName, true));
     }
 
@@ -877,13 +877,13 @@
                               bean.getComponentClass(),
                               groups.isEmpty() ? null : "Ungrouped");
 
-    Iterator groupIter = groups.iterator();
+    Iterator<String> groupIter = groups.iterator();
     while (groupIter.hasNext())
     {
       _writeComponentAttributes(out,
                                 list.iterator(),
                                 bean.getComponentClass(),
-                                (String) groupIter.next());
+                                groupIter.next());
     }
 
   }
@@ -893,20 +893,20 @@
   {
     // Sort the names
     TreeSet attributes = new TreeSet();
-    Iterator attrs = bean.properties();
+    Iterator<PropertyBean> attrs = bean.properties();
     while (attrs.hasNext())
     {
-      PropertyBean property = (PropertyBean) attrs.next();
+      PropertyBean property = attrs.next();
       if (!property.isTagAttributeExcluded())
         attributes.add(property.getPropertyName());
     }
 
     // Now get a list of PropertyBeans
     List list = new ArrayList();
-    Iterator iter = attributes.iterator();
+    Iterator<String> iter = attributes.iterator();
     while (iter.hasNext())
     {
-      String attrName = (String) iter.next();
+      String attrName = iter.next();
       list.add(bean.findProperty(attrName));
     }
 
@@ -922,20 +922,20 @@
   {
     // Sort the names
     TreeSet attributes = new TreeSet();
-    Iterator attrs = bean.properties();
+    Iterator<PropertyBean> attrs = bean.properties();
     while (attrs.hasNext())
     {
-      PropertyBean property = (PropertyBean) attrs.next();
+      PropertyBean property = attrs.next();
       if (!property.isTagAttributeExcluded())
         attributes.add(property.getPropertyName());
     }
 
     // Now get a list of PropertyBeans
     List list = new ArrayList();
-    Iterator iter = attributes.iterator();
+    Iterator<String> iter = attributes.iterator();
     while (iter.hasNext())
     {
-      String attrName = (String) iter.next();
+      String attrName = iter.next();
       list.add(bean.findProperty(attrName));
     }
 
@@ -948,7 +948,7 @@
 
 
   private void _writeComponentAttributes(Writer out,
-                                         Iterator attributes,
+                                         Iterator<PropertyBean> attributes,
                                          String className,
                                          String group) throws IOException
   {
@@ -956,8 +956,8 @@
 
     while (attributes.hasNext())
     {
-      PropertyBean attr = (PropertyBean) attributes.next();
-
+      PropertyBean attr = attributes.next();
+      
       if (attr.isHidden())
       {
         continue;
@@ -1195,10 +1195,10 @@
     out.write("<th>Description</th>\n");
     out.write("</tr>\n");
 
-    Iterator iter = bean.events(true);
+    Iterator<EventRefBean> iter = bean.events(true);
     while (iter.hasNext())
     {
-      EventRefBean eventRef = (EventRefBean) iter.next();
+      EventRefBean eventRef = iter.next();
       EventBean    event = eventRef.resolveEventType();
 
       out.write("<tr>\n");
@@ -1279,10 +1279,10 @@
 
     // Go through each example, write its description
     // followed by the example source code.
-    Iterator iter = bean.examples();
+    Iterator<ExampleBean> iter = bean.examples();
     while (iter.hasNext())
     {
-      exBean = (ExampleBean) iter.next();
+      exBean = iter.next();
       String desc   = exBean.getSourceDescription();
       String source = exBean.getSourceCode();
 
@@ -1326,10 +1326,10 @@
 
     // Go through each screenshot, write its image
     // followed by the image's caption.
-    Iterator iter = bean.screenshots();
+    Iterator<ScreenshotBean> iter = bean.screenshots();
     while (iter.hasNext())
     {
-      ssBean = (ScreenshotBean) iter.next();
+      ssBean = iter.next();
       String desc   = ssBean.getDescription();
       String img = ssBean.getImage();
 
@@ -1428,10 +1428,10 @@
     // specific attribute
     if (bean.hasAccessibilityGuidelines())
     {
-      Iterator iter = bean.accessibilityGuidelines();
+      Iterator<String> iter = bean.accessibilityGuidelines();
       while (iter.hasNext())
       {
-        accGuideline = (String) iter.next();
+        accGuideline = iter.next();
         _writeAccessibilityGuideline(out, "", accGuideline);
       }
     }
@@ -1621,9 +1621,9 @@
         // requires JAXP 1.3, in JavaSE 5.0
         // spf.setXIncludeAware(false);
 
-        for (Iterator i=masters.iterator(); i.hasNext();)
+        for (Iterator<URL> i=masters.iterator(); i.hasNext();)
         {
-          URL url = (URL)i.next();
+          URL url = i.next();
           Digester digester = new Digester(spf.newSAXParser());
           digester.setNamespaceAware(true);
 
