diff --git a/maven-artifact/src/main/java/org/apache/maven/artifact/metadata/ArtifactMetadataSource.java b/maven-artifact/src/main/java/org/apache/maven/artifact/metadata/ArtifactMetadataSource.java
index 2482308..875d6cf 100644
--- a/maven-artifact/src/main/java/org/apache/maven/artifact/metadata/ArtifactMetadataSource.java
+++ b/maven-artifact/src/main/java/org/apache/maven/artifact/metadata/ArtifactMetadataSource.java
@@ -21,6 +21,7 @@
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
 
 import java.util.List;
 
@@ -35,13 +36,15 @@
 {
     String ROLE = ArtifactMetadataSource.class.getName();
 
-    ResolutionGroup retrieve( Artifact artifact, ArtifactRepository localRepository, List remoteRepositories )
+    ResolutionGroup retrieve( Artifact artifact, ArtifactRepository localRepository,
+                              List<ArtifactRepository> remoteRepositories )
         throws ArtifactMetadataRetrievalException;
 
     /**
      * Resolve all relocations in the POM for this artifact, and return the new artifact coordinate.
      */
-    Artifact retrieveRelocatedArtifact( Artifact artifact, ArtifactRepository localRepository, List remoteRepositories )
+    Artifact retrieveRelocatedArtifact( Artifact artifact, ArtifactRepository localRepository,
+                                        List<ArtifactRepository> remoteRepositories )
         throws ArtifactMetadataRetrievalException;
 
     /**
@@ -55,6 +58,7 @@
      * @return {@link List} $lt; {@link ArtifactVersion} >
      * @throws ArtifactMetadataRetrievalException in case of error while retrieving repository metadata from the repository.
      */
-    List retrieveAvailableVersions( Artifact artifact, ArtifactRepository localRepository, List remoteRepositories )
+    List<ArtifactVersion> retrieveAvailableVersions( Artifact artifact, ArtifactRepository localRepository,
+                                                     List<ArtifactRepository> remoteRepositories )
         throws ArtifactMetadataRetrievalException;
 }
\ No newline at end of file
diff --git a/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ManagedVersionMap.java b/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ManagedVersionMap.java
index abba1d9..d8e74ff 100644
--- a/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ManagedVersionMap.java
+++ b/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ManagedVersionMap.java
@@ -23,9 +23,12 @@
 import java.util.Map;
 import java.util.Iterator;
 
-public class ManagedVersionMap extends HashMap
+import org.apache.maven.artifact.Artifact;
+
+public class ManagedVersionMap
+    extends HashMap<String, Artifact>
 {
-    public ManagedVersionMap( Map map )
+    public ManagedVersionMap( Map<String, Artifact> map )
     {
         super();
         if ( map != null )
@@ -37,7 +40,7 @@
     public String toString()
     {
         StringBuffer buffer = new StringBuffer( "ManagedVersionMap\n" );
-        Iterator iter = this.keySet().iterator();
+        Iterator<String> iter = this.keySet().iterator();
         while ( iter.hasNext() )
         {
             String key = (String) iter.next();
diff --git a/maven-model/src/main/mdo/maven.mdo b/maven-model/src/main/mdo/maven.mdo
index a343869..9846da6 100644
--- a/maven-model/src/main/mdo/maven.mdo
+++ b/maven-model/src/main/mdo/maven.mdo
@@ -760,16 +760,15 @@
      * @return a Map of plugins field with <code>Plugins#getKey()</code> as key
      * @see org.apache.maven.model.Plugin#getKey()
      */
-    public java.util.Map getPluginsAsMap()
+    public java.util.Map<String, Plugin> getPluginsAsMap()
     {
         if ( pluginMap == null )
         {
-            pluginMap = new java.util.LinkedHashMap();
+            pluginMap = new java.util.LinkedHashMap<String, Plugin>();
             if ( plugins != null )
             {
-                for ( java.util.Iterator it = plugins.iterator(); it.hasNext(); )
+                for ( Plugin plugin : plugins )
                 {
-                    Plugin plugin = (Plugin) it.next();
                     pluginMap.put( plugin.getKey(), plugin );
                 }
             }
@@ -3121,16 +3120,15 @@
      * @return a Map of reportSets field with <code>ReportSet#getId()</code> as key
      * @see org.apache.maven.model.ReportSet#getId()
      */
-    public java.util.Map getReportSetsAsMap()
+    public java.util.Map<String, ReportSet> getReportSetsAsMap()
     {
         if ( reportSetMap == null )
         {
-            reportSetMap = new java.util.LinkedHashMap();
+            reportSetMap = new java.util.LinkedHashMap<String, ReportSet>();
             if ( getReportSets() != null )
             {
-                for ( java.util.Iterator i = getReportSets().iterator(); i.hasNext(); )
+                for ( ReportSet reportSet : getReportSets() )
                 {
-                    ReportSet reportSet = (ReportSet) i.next();
                     reportSetMap.put( reportSet.getId(), reportSet );
                 }
             }
diff --git a/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java b/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
index da89003..259f773 100644
--- a/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
+++ b/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
@@ -234,7 +234,7 @@
     // sure this is ideal. I remove all caching from the builder and all reactor related ITs which assume
     // access to simbling project resources failed.
     public MavenProject buildFromRepository( Artifact artifact,
-                                             List remoteArtifactRepositories,
+                                             List<ArtifactRepository> remoteArtifactRepositories,
                                              ArtifactRepository localRepository,
                                              boolean allowStubModel )
         throws ProjectBuildingException
@@ -245,7 +245,7 @@
     }
 
     public MavenProject buildFromRepository( Artifact artifact,
-                                             List remoteArtifactRepositories,
+                                             List<ArtifactRepository> remoteArtifactRepositories,
                                              ProjectBuilderConfiguration config,
                                              boolean allowStubModel )
         throws ProjectBuildingException
@@ -266,7 +266,7 @@
     }
 
     public MavenProject buildFromRepository( Artifact artifact,
-                                             List remoteArtifactRepositories,
+                                             List<ArtifactRepository> remoteArtifactRepositories,
                                              ArtifactRepository localRepository )
         throws ProjectBuildingException
     {
diff --git a/maven-project/src/main/java/org/apache/maven/project/MavenProject.java b/maven-project/src/main/java/org/apache/maven/project/MavenProject.java
index d08d0a4..84a0bdd 100644
--- a/maven-project/src/main/java/org/apache/maven/project/MavenProject.java
+++ b/maven-project/src/main/java/org/apache/maven/project/MavenProject.java
@@ -26,7 +26,6 @@
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -47,6 +46,7 @@
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.model.Developer;
 import org.apache.maven.model.DistributionManagement;
+import org.apache.maven.model.Extension;
 import org.apache.maven.model.IssueManagement;
 import org.apache.maven.model.License;
 import org.apache.maven.model.MailingList;
@@ -56,9 +56,11 @@
 import org.apache.maven.model.PluginExecution;
 import org.apache.maven.model.PluginManagement;
 import org.apache.maven.model.Prerequisites;
+import org.apache.maven.model.Profile;
 import org.apache.maven.model.ReportPlugin;
 import org.apache.maven.model.ReportSet;
 import org.apache.maven.model.Reporting;
+import org.apache.maven.model.Repository;
 import org.apache.maven.model.Resource;
 import org.apache.maven.model.Scm;
 import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
@@ -96,60 +98,60 @@
 
     private File file;
 
-    private Set artifacts;
+    private Set<Artifact> artifacts;
 
     private Artifact parentArtifact;
 
-    private Set pluginArtifacts;
+    private Set<Artifact> pluginArtifacts;
 
-    private List remoteArtifactRepositories;
+    private List<ArtifactRepository> remoteArtifactRepositories;
 
-    private List collectedProjects = Collections.EMPTY_LIST;
+    private List<MavenProject> collectedProjects = Collections.emptyList();
 
-    private List attachedArtifacts;
+    private List<Artifact> attachedArtifacts;
 
     private MavenProject executionProject;
 
-    private List compileSourceRoots = new ArrayList();
+    private List<String> compileSourceRoots = new ArrayList<String>();
 
-    private List testCompileSourceRoots = new ArrayList();
+    private List<String> testCompileSourceRoots = new ArrayList<String>();
 
-    private List scriptSourceRoots = new ArrayList();
+    private List<String> scriptSourceRoots = new ArrayList<String>();
 
-    private List pluginArtifactRepositories;
+    private List<ArtifactRepository> pluginArtifactRepositories;
 
     private ArtifactRepository releaseArtifactRepository;
 
     private ArtifactRepository snapshotArtifactRepository;
 
-    private List activeProfiles = new ArrayList();
+    private List<Profile> activeProfiles = new ArrayList<Profile>();
 
-    private Set dependencyArtifacts;
+    private Set<Artifact> dependencyArtifacts;
 
     private Artifact artifact;
 
     // calculated.
-    private Map artifactMap;
+    private Map<String, Artifact> artifactMap;
 
     private Model originalModel;
 
-    private Map pluginArtifactMap;
+    private Map<String, Artifact> pluginArtifactMap;
 
-    private Set reportArtifacts;
+    private Set<Artifact> reportArtifacts;
 
-    private Map reportArtifactMap;
+    private Map<String, Artifact> reportArtifactMap;
 
-    private Set extensionArtifacts;
+    private Set<Artifact> extensionArtifacts;
 
-    private Map extensionArtifactMap;
+    private Map<String, Artifact> extensionArtifactMap;
 
-    private Map managedVersionMap;
+    private Map<String, Artifact> managedVersionMap;
 
-    private Map projectReferences = new HashMap();
+    private Map<String, MavenProject> projectReferences = new HashMap<String, MavenProject>();
 
     private boolean executionRoot;
 
-    private Map moduleAdjustments;
+    private Map<String, String> moduleAdjustments;
 
     private File basedir;
 
@@ -246,23 +248,23 @@
         if ( project.getAttachedArtifacts() != null )
         {
             // clone properties modifyable by plugins in a forked lifecycle
-            setAttachedArtifacts( new ArrayList( project.getAttachedArtifacts() ) );
+            setAttachedArtifacts( new ArrayList<Artifact>( project.getAttachedArtifacts() ) );
         }
 
         if ( project.getCompileSourceRoots() != null )
         {
             // clone source roots
-            setCompileSourceRoots( ( new ArrayList( project.getCompileSourceRoots() ) ) );
+            setCompileSourceRoots( ( new ArrayList<String>( project.getCompileSourceRoots() ) ) );
         }
 
         if ( project.getTestCompileSourceRoots() != null )
         {
-            setTestCompileSourceRoots( ( new ArrayList( project.getTestCompileSourceRoots() ) ) );
+            setTestCompileSourceRoots( ( new ArrayList<String>( project.getTestCompileSourceRoots() ) ) );
         }
 
         if ( project.getScriptSourceRoots() != null )
         {
-            setScriptSourceRoots( ( new ArrayList( project.getScriptSourceRoots() ) ) );
+            setScriptSourceRoots( ( new ArrayList<String>( project.getScriptSourceRoots() ) ) );
         }
 
         setModel( ( ModelUtils.cloneModel( project.getModel() ) ) );
@@ -299,25 +301,25 @@
             setDynamicBuild( ModelUtils.cloneBuild( project.getDynamicBuild() ) );
             setOriginalInterpolatedBuild( ModelUtils.cloneBuild( project.getOriginalInterpolatedBuild() ) );
 
-            List dynamicRoots = project.getDynamicCompileSourceRoots();
+            List<String> dynamicRoots = project.getDynamicCompileSourceRoots();
             if ( dynamicRoots != null )
             {
-                setDynamicCompileSourceRoots( new ArrayList( dynamicRoots ) );
-                setOriginalInterpolatedCompileSourceRoots( new ArrayList( project.getOriginalInterpolatedCompileSourceRoots() ) );
+                setDynamicCompileSourceRoots( new ArrayList<String>( dynamicRoots ) );
+                setOriginalInterpolatedCompileSourceRoots( new ArrayList<String>( project.getOriginalInterpolatedCompileSourceRoots() ) );
             }
 
             dynamicRoots = project.getDynamicTestCompileSourceRoots();
             if ( dynamicRoots != null )
             {
-                setDynamicTestCompileSourceRoots( new ArrayList( dynamicRoots ) );
-                setOriginalInterpolatedTestCompileSourceRoots( new ArrayList( project.getOriginalInterpolatedTestCompileSourceRoots() ) );
+                setDynamicTestCompileSourceRoots( new ArrayList<String>( dynamicRoots ) );
+                setOriginalInterpolatedTestCompileSourceRoots( new ArrayList<String>( project.getOriginalInterpolatedTestCompileSourceRoots() ) );
             }
 
             dynamicRoots = project.getDynamicScriptSourceRoots();
             if ( dynamicRoots != null )
             {
-                setDynamicScriptSourceRoots( new ArrayList( dynamicRoots ) );
-                setOriginalInterpolatedScriptSourceRoots( new ArrayList( project.getOriginalInterpolatedScriptSourceRoots() ) );
+                setDynamicScriptSourceRoots( new ArrayList<String>( dynamicRoots ) );
+                setOriginalInterpolatedScriptSourceRoots( new ArrayList<String>( project.getOriginalInterpolatedScriptSourceRoots() ) );
             }
         }
 
@@ -348,14 +350,13 @@
 
         if ( moduleAdjustments == null )
         {
-            moduleAdjustments = new HashMap();
+            moduleAdjustments = new HashMap<String, String>();
 
-            List modules = getModules();
+            List<String> modules = getModules();
             if ( modules != null )
             {
-                for ( Iterator it = modules.iterator(); it.hasNext(); )
+                for ( String modulePath : modules )
                 {
-                    String modulePath = (String) it.next();
                     String moduleName = modulePath;
 
                     if ( moduleName.endsWith( "/" ) || moduleName.endsWith( "\\" ) )
@@ -416,12 +417,12 @@
         this.parent = parent;
     }
 
-    public void setRemoteArtifactRepositories( List remoteArtifactRepositories )
+    public void setRemoteArtifactRepositories( List<ArtifactRepository> remoteArtifactRepositories )
     {
         this.remoteArtifactRepositories = remoteArtifactRepositories;
     }
 
-    public List getRemoteArtifactRepositories()
+    public List<ArtifactRepository> getRemoteArtifactRepositories()
     {
         return remoteArtifactRepositories;
     }
@@ -461,12 +462,12 @@
         return basedir;
     }
 
-    public void setDependencies( List dependencies )
+    public void setDependencies( List<Dependency> dependencies )
     {
         getModel().setDependencies( dependencies );
     }
 
-    public List getDependencies()
+    public List<Dependency> getDependencies()
     {
         return getModel().getDependencies();
     }
@@ -525,32 +526,30 @@
         }
     }
 
-    public List getCompileSourceRoots()
+    public List<String> getCompileSourceRoots()
     {
         return compileSourceRoots;
     }
 
-    public List getScriptSourceRoots()
+    public List<String> getScriptSourceRoots()
     {
         return scriptSourceRoots;
     }
 
-    public List getTestCompileSourceRoots()
+    public List<String> getTestCompileSourceRoots()
     {
         return testCompileSourceRoots;
     }
 
-    public List getCompileClasspathElements()
+    public List<String> getCompileClasspathElements()
         throws DependencyResolutionRequiredException
     {
-        List list = new ArrayList( getArtifacts().size() );
+        List<String> list = new ArrayList<String>( getArtifacts().size() );
 
         list.add( getBuild().getOutputDirectory() );
 
-        for ( Iterator i = getArtifacts().iterator(); i.hasNext(); )
+        for ( Artifact a : getArtifacts() )
         {
-            Artifact a = (Artifact) i.next();
-
             if ( a.getArtifactHandler().isAddedToClasspath() )
             {
                 // TODO: let the scope handler deal with this
@@ -564,14 +563,12 @@
         return list;
     }
 
-    public List getCompileArtifacts()
+    public List<Artifact> getCompileArtifacts()
     {
-        List list = new ArrayList( getArtifacts().size() );
+        List<Artifact> list = new ArrayList<Artifact>( getArtifacts().size() );
 
-        for ( Iterator i = getArtifacts().iterator(); i.hasNext(); )
+        for ( Artifact a : getArtifacts() )
         {
-            Artifact a = (Artifact) i.next();
-
             // TODO: classpath check doesn't belong here - that's the other method
             if ( a.getArtifactHandler().isAddedToClasspath() )
             {
@@ -586,21 +583,19 @@
         return list;
     }
 
-    public List getCompileDependencies()
+    public List<Dependency> getCompileDependencies()
     {
-        Set artifacts = getArtifacts();
+        Set<Artifact> artifacts = getArtifacts();
 
         if ( artifacts == null || artifacts.isEmpty() )
         {
-            return Collections.EMPTY_LIST;
+            return Collections.emptyList();
         }
 
-        List list = new ArrayList( artifacts.size() );
+        List<Dependency> list = new ArrayList<Dependency>( artifacts.size() );
 
-        for ( Iterator i = getArtifacts().iterator(); i.hasNext(); )
+        for ( Artifact a : getArtifacts() )
         {
-            Artifact a = (Artifact) i.next();
-
             // TODO: let the scope handler deal with this
             if ( Artifact.SCOPE_COMPILE.equals( a.getScope() ) || Artifact.SCOPE_PROVIDED.equals( a.getScope() )
                 || Artifact.SCOPE_SYSTEM.equals( a.getScope() ) )
@@ -620,19 +615,17 @@
         return list;
     }
 
-    public List getTestClasspathElements()
+    public List<String> getTestClasspathElements()
         throws DependencyResolutionRequiredException
     {
-        List list = new ArrayList( getArtifacts().size() + 1 );
+        List<String> list = new ArrayList<String>( getArtifacts().size() + 1 );
 
         list.add( getBuild().getTestOutputDirectory() );
 
         list.add( getBuild().getOutputDirectory() );
 
-        for ( Iterator i = getArtifacts().iterator(); i.hasNext(); )
+        for ( Artifact a : getArtifacts() )
         {
-            Artifact a = (Artifact) i.next();
-
             if ( a.getArtifactHandler().isAddedToClasspath() )
             {
                 // TODO: let the scope handler deal with this
@@ -653,14 +646,12 @@
         return list;
     }
 
-    public List getTestArtifacts()
+    public List<Artifact> getTestArtifacts()
     {
-        List list = new ArrayList( getArtifacts().size() );
+        List<Artifact> list = new ArrayList<Artifact>( getArtifacts().size() );
 
-        for ( Iterator i = getArtifacts().iterator(); i.hasNext(); )
+        for ( Artifact a : getArtifacts() )
         {
-            Artifact a = (Artifact) i.next();
-
             // TODO: classpath check doesn't belong here - that's the other method
             if ( a.getArtifactHandler().isAddedToClasspath() )
             {
@@ -679,21 +670,19 @@
         return list;
     }
 
-    public List getTestDependencies()
+    public List<Dependency> getTestDependencies()
     {
-        Set artifacts = getArtifacts();
+        Set<Artifact> artifacts = getArtifacts();
 
         if ( artifacts == null || artifacts.isEmpty() )
         {
-            return Collections.EMPTY_LIST;
+            return Collections.emptyList();
         }
 
-        List list = new ArrayList( artifacts.size() );
+        List<Dependency> list = new ArrayList<Dependency>( artifacts.size() );
 
-        for ( Iterator i = getArtifacts().iterator(); i.hasNext(); )
+        for ( Artifact a : getArtifacts() )
         {
-            Artifact a = (Artifact) i.next();
-
             // TODO: let the scope handler deal with this
             // NOTE: [jc] scope == 'test' is the widest possible scope, so we don't really need to perform
             // this check...
@@ -716,17 +705,15 @@
         return list;
     }
 
-    public List getRuntimeClasspathElements()
+    public List<String> getRuntimeClasspathElements()
         throws DependencyResolutionRequiredException
     {
-        List list = new ArrayList( getArtifacts().size() + 1 );
+        List<String> list = new ArrayList<String>( getArtifacts().size() + 1 );
 
         list.add( getBuild().getOutputDirectory() );
 
-        for ( Iterator i = getArtifacts().iterator(); i.hasNext(); )
+        for ( Artifact a : getArtifacts() )
         {
-            Artifact a = (Artifact) i.next();
-
             if ( a.getArtifactHandler().isAddedToClasspath() )
             {
                 // TODO: let the scope handler deal with this
@@ -744,14 +731,12 @@
         return list;
     }
 
-    public List getRuntimeArtifacts()
+    public List<Artifact> getRuntimeArtifacts()
     {
-        List list = new ArrayList( getArtifacts().size() );
+        List<Artifact> list = new ArrayList<Artifact>( getArtifacts().size() );
 
-        for ( Iterator i = getArtifacts().iterator(); i.hasNext(); )
+        for ( Artifact a : getArtifacts() )
         {
-            Artifact a = (Artifact) i.next();
-
             // TODO: classpath check doesn't belong here - that's the other method
             if ( a.getArtifactHandler().isAddedToClasspath() )
             {
@@ -765,21 +750,19 @@
         return list;
     }
 
-    public List getRuntimeDependencies()
+    public List<Dependency> getRuntimeDependencies()
     {
-        Set artifacts = getArtifacts();
+        Set<Artifact> artifacts = getArtifacts();
 
         if ( artifacts == null || artifacts.isEmpty() )
         {
-            return Collections.EMPTY_LIST;
+            return Collections.emptyList();
         }
 
-        List list = new ArrayList( artifacts.size() );
+        List<Dependency> list = new ArrayList<Dependency>( artifacts.size() );
 
-        for ( Iterator i = artifacts.iterator(); i.hasNext(); )
+        for ( Artifact a : artifacts )
         {
-            Artifact a = (Artifact) i.next();
-
             // TODO: let the scope handler deal with this
             if ( Artifact.SCOPE_COMPILE.equals( a.getScope() ) || Artifact.SCOPE_RUNTIME.equals( a.getScope() ) )
             {
@@ -798,17 +781,15 @@
         return list;
     }
 
-    public List getSystemClasspathElements()
+    public List<String> getSystemClasspathElements()
         throws DependencyResolutionRequiredException
     {
-        List list = new ArrayList( getArtifacts().size() );
+        List<String> list = new ArrayList<String>( getArtifacts().size() );
 
         list.add( getBuild().getOutputDirectory() );
 
-        for ( Iterator i = getArtifacts().iterator(); i.hasNext(); )
+        for ( Artifact a : getArtifacts() )
         {
-            Artifact a = (Artifact) i.next();
-
             if ( a.getArtifactHandler().isAddedToClasspath() )
             {
                 // TODO: let the scope handler deal with this
@@ -821,14 +802,12 @@
         return list;
     }
 
-    public List getSystemArtifacts()
+    public List<Artifact> getSystemArtifacts()
     {
-        List list = new ArrayList( getArtifacts().size() );
+        List<Artifact> list = new ArrayList<Artifact>( getArtifacts().size() );
 
-        for ( Iterator i = getArtifacts().iterator(); i.hasNext(); )
+        for ( Artifact a : getArtifacts() )
         {
-            Artifact a = (Artifact) i.next();
-
             // TODO: classpath check doesn't belong here - that's the other method
             if ( a.getArtifactHandler().isAddedToClasspath() )
             {
@@ -842,21 +821,19 @@
         return list;
     }
 
-    public List getSystemDependencies()
+    public List<Dependency> getSystemDependencies()
     {
-        Set artifacts = getArtifacts();
+        Set<Artifact> artifacts = getArtifacts();
 
         if ( artifacts == null || artifacts.isEmpty() )
         {
-            return Collections.EMPTY_LIST;
+            return Collections.emptyList();
         }
 
-        List list = new ArrayList( artifacts.size() );
+        List<Dependency> list = new ArrayList<Dependency>( artifacts.size() );
 
-        for ( Iterator i = getArtifacts().iterator(); i.hasNext(); )
+        for ( Artifact a : getArtifacts() )
         {
-            Artifact a = (Artifact) i.next();
-
             // TODO: let the scope handler deal with this
             if ( Artifact.SCOPE_SYSTEM.equals( a.getScope() ) )
             {
@@ -1051,12 +1028,12 @@
         return getModel().getScm();
     }
 
-    public void setMailingLists( List mailingLists )
+    public void setMailingLists( List<MailingList> mailingLists )
     {
         getModel().setMailingLists( mailingLists );
     }
 
-    public List getMailingLists()
+    public List<MailingList> getMailingLists()
     {
         return getModel().getMailingLists();
     }
@@ -1066,12 +1043,12 @@
         getModel().addMailingList( mailingList );
     }
 
-    public void setDevelopers( List developers )
+    public void setDevelopers( List<Developer> developers )
     {
         getModel().setDevelopers( developers );
     }
 
-    public List getDevelopers()
+    public List<Developer> getDevelopers()
     {
         return getModel().getDevelopers();
     }
@@ -1081,12 +1058,12 @@
         getModel().addDeveloper( developer );
     }
 
-    public void setContributors( List contributors )
+    public void setContributors( List<Contributor> contributors )
     {
         getModel().setContributors( contributors );
     }
 
-    public List getContributors()
+    public List<Contributor> getContributors()
     {
         return getModel().getContributors();
     }
@@ -1106,12 +1083,12 @@
         return getModelBuild();
     }
 
-    public List getResources()
+    public List<Resource> getResources()
     {
         return getBuild().getResources();
     }
 
-    public List getTestResources()
+    public List<Resource> getTestResources()
     {
         return getBuild().getTestResources();
     }
@@ -1136,12 +1113,12 @@
         return getModel().getReporting();
     }
 
-    public void setLicenses( List licenses )
+    public void setLicenses( List<License> licenses )
     {
         getModel().setLicenses( licenses );
     }
 
-    public List getLicenses()
+    public List<License> getLicenses()
     {
         return getModel().getLicenses();
     }
@@ -1151,7 +1128,7 @@
         getModel().addLicense( license );
     }
 
-    public void setArtifacts( Set artifacts )
+    public void setArtifacts( Set<Artifact> artifacts )
     {
         this.artifacts = artifacts;
 
@@ -1166,12 +1143,12 @@
      * @return {@link Set} &lt; {@link Artifact} >
      * @see #getDependencyArtifacts() to get only direct dependencies
      */
-    public Set getArtifacts()
+    public Set<Artifact> getArtifacts()
     {
-        return artifacts == null ? Collections.EMPTY_SET : artifacts;
+        return artifacts == null ? Collections.<Artifact>emptySet() : artifacts;
     }
 
-    public Map getArtifactMap()
+    public Map<String, Artifact> getArtifactMap()
     {
         if ( artifactMap == null )
         {
@@ -1181,19 +1158,19 @@
         return artifactMap;
     }
 
-    public void setPluginArtifacts( Set pluginArtifacts )
+    public void setPluginArtifacts( Set<Artifact> pluginArtifacts )
     {
         this.pluginArtifacts = pluginArtifacts;
 
         this.pluginArtifactMap = null;
     }
 
-    public Set getPluginArtifacts()
+    public Set<Artifact> getPluginArtifacts()
     {
         return pluginArtifacts;
     }
 
-    public Map getPluginArtifactMap()
+    public Map<String, Artifact> getPluginArtifactMap()
     {
         if ( pluginArtifactMap == null )
         {
@@ -1203,19 +1180,19 @@
         return pluginArtifactMap;
     }
 
-    public void setReportArtifacts( Set reportArtifacts )
+    public void setReportArtifacts( Set<Artifact> reportArtifacts )
     {
         this.reportArtifacts = reportArtifacts;
 
         this.reportArtifactMap = null;
     }
 
-    public Set getReportArtifacts()
+    public Set<Artifact> getReportArtifacts()
     {
         return reportArtifacts;
     }
 
-    public Map getReportArtifactMap()
+    public Map<String, Artifact> getReportArtifactMap()
     {
         if ( reportArtifactMap == null )
         {
@@ -1225,19 +1202,19 @@
         return reportArtifactMap;
     }
 
-    public void setExtensionArtifacts( Set extensionArtifacts )
+    public void setExtensionArtifacts( Set<Artifact> extensionArtifacts )
     {
         this.extensionArtifacts = extensionArtifacts;
 
         this.extensionArtifactMap = null;
     }
 
-    public Set getExtensionArtifacts()
+    public Set<Artifact> getExtensionArtifacts()
     {
         return this.extensionArtifacts;
     }
 
-    public Map getExtensionArtifactMap()
+    public Map<String, Artifact> getExtensionArtifactMap()
     {
         if ( extensionArtifactMap == null )
         {
@@ -1257,7 +1234,7 @@
         return parentArtifact;
     }
 
-    public List getRepositories()
+    public List<Repository> getRepositories()
     {
         return getModel().getRepositories();
     }
@@ -1266,7 +1243,7 @@
     // Plugins
     // ----------------------------------------------------------------------
 
-    public List getReportPlugins()
+    public List<ReportPlugin> getReportPlugins()
     {
         if ( getModel().getReporting() == null )
         {
@@ -1276,7 +1253,7 @@
 
     }
 
-    public List getBuildPlugins()
+    public List<Plugin> getBuildPlugins()
     {
         if ( getModel().getBuild() == null )
         {
@@ -1285,7 +1262,7 @@
         return getModel().getBuild().getPlugins();
     }
 
-    public List getModules()
+    public List<String> getModules()
     {
         return getModel().getModules();
     }
@@ -1336,30 +1313,30 @@
 
         if ( pm != null )
         {
-            Map pmByKey = pm.getPluginsAsMap();
+            Map<String, Plugin> pmByKey = pm.getPluginsAsMap();
 
             String pluginKey = plugin.getKey();
 
             if ( pmByKey != null && pmByKey.containsKey( pluginKey ) )
             {
-                Plugin pmPlugin = (Plugin) pmByKey.get( pluginKey );
+                Plugin pmPlugin = pmByKey.get( pluginKey );
 
                 ModelUtils.mergePluginDefinitions( plugin, pmPlugin, false );
             }
         }
     }
 
-    public List getCollectedProjects()
+    public List<MavenProject> getCollectedProjects()
     {
         return collectedProjects;
     }
 
-    public void setCollectedProjects( List collectedProjects )
+    public void setCollectedProjects( List<MavenProject> collectedProjects )
     {
         this.collectedProjects = collectedProjects;
     }
 
-    public void setPluginArtifactRepositories( List pluginArtifactRepositories )
+    public void setPluginArtifactRepositories( List<ArtifactRepository> pluginArtifactRepositories )
     {
         this.pluginArtifactRepositories = pluginArtifactRepositories;
     }
@@ -1368,7 +1345,7 @@
      * @return a list of ArtifactRepository objects constructed
      *         from the Repository objects returned by getPluginRepositories.
      */
-    public List getPluginArtifactRepositories()
+    public List<ArtifactRepository> getPluginArtifactRepositories()
     {
         return pluginArtifactRepositories;
     }
@@ -1379,17 +1356,17 @@
             : getReleaseArtifactRepository();
     }
 
-    public List getPluginRepositories()
+    public List<Repository> getPluginRepositories()
     {
         return getModel().getPluginRepositories();
     }
 
-    public void setActiveProfiles( List activeProfiles )
+    public void setActiveProfiles( List<Profile> activeProfiles )
     {
         this.activeProfiles.addAll( activeProfiles );
     }
 
-    public List getActiveProfiles()
+    public List<Profile> getActiveProfiles()
     {
         return activeProfiles;
     }
@@ -1399,11 +1376,11 @@
         getAttachedArtifacts().add( artifact );
     }
 
-    public List getAttachedArtifacts()
+    public List<Artifact> getAttachedArtifacts()
     {
         if ( attachedArtifacts == null )
         {
-            attachedArtifacts = new ArrayList();
+            attachedArtifacts = new ArrayList<Artifact>();
         }
         return attachedArtifacts;
     }
@@ -1421,10 +1398,8 @@
 
         if ( getBuildPlugins() != null )
         {
-            for ( Iterator iterator = getBuildPlugins().iterator(); iterator.hasNext(); )
+            for ( Plugin plugin : getBuildPlugins() )
             {
-                Plugin plugin = (Plugin) iterator.next();
-
                 if ( pluginGroupId.equals( plugin.getGroupId() ) && pluginArtifactId.equals( plugin.getArtifactId() ) )
                 {
                     dom = (Xpp3Dom) plugin.getConfiguration();
@@ -1499,17 +1474,15 @@
 
         if ( getReportPlugins() != null )
         {
-            for ( Iterator iterator = getReportPlugins().iterator(); iterator.hasNext(); )
+            for ( ReportPlugin plugin : getReportPlugins() )
             {
-                ReportPlugin plugin = (ReportPlugin) iterator.next();
-
                 if ( pluginGroupId.equals( plugin.getGroupId() ) && pluginArtifactId.equals( plugin.getArtifactId() ) )
                 {
                     dom = (Xpp3Dom) plugin.getConfiguration();
 
                     if ( reportSetId != null )
                     {
-                        ReportSet reportSet = (ReportSet) plugin.getReportSetsAsMap().get( reportSetId );
+                        ReportSet reportSet = plugin.getReportSetsAsMap().get( reportSetId );
                         if ( reportSet != null )
                         {
                             Xpp3Dom executionConfiguration = (Xpp3Dom) reportSet.getConfiguration();
@@ -1565,12 +1538,12 @@
      * @return {@link Set} &lt; {@link Artifact} >
      * @see #getArtifacts() to get all transitive dependencies
      */
-    public Set getDependencyArtifacts()
+    public Set<Artifact> getDependencyArtifacts()
     {
         return dependencyArtifacts;
     }
 
-    public void setDependencyArtifacts( Set dependencyArtifacts )
+    public void setDependencyArtifacts( Set<Artifact> dependencyArtifacts )
     {
         this.dependencyArtifacts = dependencyArtifacts;
     }
@@ -1595,16 +1568,17 @@
         return originalModel;
     }
 
-    public void setManagedVersionMap( Map map )
+    public void setManagedVersionMap( Map<String, Artifact> map )
     {
         this.managedVersionMap = map;
     }
 
-    public Map getManagedVersionMap()
+    public Map<String, Artifact> getManagedVersionMap()
     {
         return this.managedVersionMap;
     }
 
+    @Override
     public boolean equals( Object other )
     {
         if ( other == this )
@@ -1623,17 +1597,18 @@
         }
     }
 
+    @Override
     public int hashCode()
     {
         return getId().hashCode();
     }
 
-    public List getBuildExtensions()
+    public List<Extension> getBuildExtensions()
     {
         Build build = getBuild();
         if ( build == null || build.getExtensions() == null )
         {
-            return Collections.EMPTY_LIST;
+            return Collections.emptyList();
         }
         else
         {
@@ -1645,7 +1620,7 @@
      * @todo the lazy initialisation of this makes me uneasy.
      * @return {@link Set} &lt; {@link Artifact} >
      */
-    public Set createArtifacts( ArtifactFactory artifactFactory, String inheritedScope,
+    public Set<Artifact> createArtifacts( ArtifactFactory artifactFactory, String inheritedScope,
                                 ArtifactFilter dependencyFilter )
         throws InvalidDependencyVersionException
     {
@@ -1675,12 +1650,12 @@
         return getModel().getProperties();
     }
 
-    public List getFilters()
+    public List<String> getFilters()
     {
         return getBuild().getFilters();
     }
 
-    public Map getProjectReferences()
+    public Map<String, MavenProject> getProjectReferences()
     {
         return projectReferences;
     }
@@ -1706,22 +1681,22 @@
         this.model = model;
     }
 
-    protected void setAttachedArtifacts( List attachedArtifacts )
+    protected void setAttachedArtifacts( List<Artifact> attachedArtifacts )
     {
         this.attachedArtifacts = attachedArtifacts;
     }
 
-    protected void setCompileSourceRoots( List compileSourceRoots )
+    protected void setCompileSourceRoots( List<String> compileSourceRoots )
     {
         this.compileSourceRoots = compileSourceRoots;
     }
 
-    protected void setTestCompileSourceRoots( List testCompileSourceRoots )
+    protected void setTestCompileSourceRoots( List<String> testCompileSourceRoots )
     {
         this.testCompileSourceRoots = testCompileSourceRoots;
     }
 
-    protected void setScriptSourceRoots( List scriptSourceRoots )
+    protected void setScriptSourceRoots( List<String> scriptSourceRoots )
     {
         this.scriptSourceRoots = scriptSourceRoots;
     }
@@ -1738,18 +1713,17 @@
 
     public void resolveActiveArtifacts()
     {
-        Set depArtifacts = getDependencyArtifacts();
+        Set<Artifact> depArtifacts = getDependencyArtifacts();
         if ( depArtifacts == null )
         {
             return;
         }
 
-        Set updated = new LinkedHashSet( depArtifacts.size() );
+        Set<Artifact> updated = new LinkedHashSet<Artifact>( depArtifacts.size() );
         int updatedCount = 0;
 
-        for ( Iterator it = depArtifacts.iterator(); it.hasNext(); )
+        for ( Artifact depArtifact : depArtifacts )
         {
-            Artifact depArtifact = (Artifact) it.next();
             Artifact replaced = replaceWithActiveArtifact( depArtifact );
 
             if ( depArtifact != replaced )
@@ -1816,15 +1790,14 @@
      * @param requestedArtifact The artifact to resolve, must not be <code>null</code>.
      * @return The matching artifact or <code>null</code> if not found.
      */
-    private Artifact findMatchingArtifact( List artifacts, Artifact requestedArtifact )
+    private Artifact findMatchingArtifact( List<Artifact> artifacts, Artifact requestedArtifact )
     {
         if ( artifacts != null && !artifacts.isEmpty() )
         {
             // first try matching by dependency conflict id
             String requestedId = requestedArtifact.getDependencyConflictId();
-            for ( Iterator it = artifacts.iterator(); it.hasNext(); )
+            for ( Artifact artifact : artifacts )
             {
-                Artifact artifact = (Artifact) it.next();
                 if ( requestedId.equals( artifact.getDependencyConflictId() ) )
                 {
                     return artifact;
@@ -1833,9 +1806,8 @@
 
             // next try matching by repository conflict id
             requestedId = getRepositoryConflictId( requestedArtifact );
-            for ( Iterator it = artifacts.iterator(); it.hasNext(); )
+            for ( Artifact artifact : artifacts )
             {
-                Artifact artifact = (Artifact) it.next();
                 if ( requestedId.equals( getRepositoryConflictId( artifact ) ) )
                 {
                     return artifact;
@@ -1899,7 +1871,7 @@
         }
     }
 
-    private void addArtifactPath( Artifact a, List list )
+    private void addArtifactPath( Artifact a, List<String> list )
         throws DependencyResolutionRequiredException
     {
         File file = a.getFile();
@@ -1940,6 +1912,7 @@
      * @throws CloneNotSupportedException
      * @since 2.0.9
      */
+    @Override
     public Object clone()
         throws CloneNotSupportedException
     {
@@ -1956,17 +1929,17 @@
 
     private Build originalInterpolatedBuild;
 
-    private List dynamicCompileSourceRoots;
+    private List<String> dynamicCompileSourceRoots;
 
-    private List originalInterpolatedCompileSourceRoots;
+    private List<String> originalInterpolatedCompileSourceRoots;
 
-    private List dynamicTestCompileSourceRoots;
+    private List<String> dynamicTestCompileSourceRoots;
 
-    private List originalInterpolatedTestCompileSourceRoots;
+    private List<String> originalInterpolatedTestCompileSourceRoots;
 
-    private List dynamicScriptSourceRoots;
+    private List<String> dynamicScriptSourceRoots;
 
-    private List originalInterpolatedScriptSourceRoots;
+    private List<String> originalInterpolatedScriptSourceRoots;
 
     private boolean isConcrete = false;
 
@@ -1990,32 +1963,32 @@
         return originalInterpolatedBuild;
     }
 
-    public List getDynamicCompileSourceRoots()
+    public List<String> getDynamicCompileSourceRoots()
     {
         return dynamicCompileSourceRoots;
     }
 
-    public List getOriginalInterpolatedCompileSourceRoots()
+    public List<String> getOriginalInterpolatedCompileSourceRoots()
     {
         return originalInterpolatedCompileSourceRoots;
     }
 
-    public List getDynamicTestCompileSourceRoots()
+    public List<String> getDynamicTestCompileSourceRoots()
     {
         return dynamicTestCompileSourceRoots;
     }
 
-    public List getOriginalInterpolatedTestCompileSourceRoots()
+    public List<String> getOriginalInterpolatedTestCompileSourceRoots()
     {
         return originalInterpolatedTestCompileSourceRoots;
     }
 
-    public List getDynamicScriptSourceRoots()
+    public List<String> getDynamicScriptSourceRoots()
     {
         return dynamicScriptSourceRoots;
     }
 
-    public List getOriginalInterpolatedScriptSourceRoots()
+    public List<String> getOriginalInterpolatedScriptSourceRoots()
     {
         return originalInterpolatedScriptSourceRoots;
     }
@@ -2036,19 +2009,19 @@
         originalInterpolatedBuild = null;
     }
 
-    public void preserveCompileSourceRoots( List originalInterpolatedCompileSourceRoots )
+    public void preserveCompileSourceRoots( List<String> originalInterpolatedCompileSourceRoots )
     {
         dynamicCompileSourceRoots = getCompileSourceRoots();
         this.originalInterpolatedCompileSourceRoots = originalInterpolatedCompileSourceRoots;
     }
 
-    public void preserveTestCompileSourceRoots( List originalInterpolatedTestCompileSourceRoots )
+    public void preserveTestCompileSourceRoots( List<String> originalInterpolatedTestCompileSourceRoots )
     {
         dynamicTestCompileSourceRoots = getTestCompileSourceRoots();
         this.originalInterpolatedTestCompileSourceRoots = originalInterpolatedTestCompileSourceRoots;
     }
 
-    public void preserveScriptSourceRoots( List originalInterpolatedScriptSourceRoots )
+    public void preserveScriptSourceRoots( List<String> originalInterpolatedScriptSourceRoots )
     {
         dynamicScriptSourceRoots = getScriptSourceRoots();
         this.originalInterpolatedScriptSourceRoots = originalInterpolatedScriptSourceRoots;
@@ -2073,32 +2046,32 @@
         this.originalInterpolatedBuild = originalInterpolatedBuild;
     }
 
-    protected void setDynamicCompileSourceRoots( List dynamicCompileSourceRoots )
+    protected void setDynamicCompileSourceRoots( List<String> dynamicCompileSourceRoots )
     {
         this.dynamicCompileSourceRoots = dynamicCompileSourceRoots;
     }
 
-    protected void setOriginalInterpolatedCompileSourceRoots( List originalInterpolatedCompileSourceRoots )
+    protected void setOriginalInterpolatedCompileSourceRoots( List<String> originalInterpolatedCompileSourceRoots )
     {
         this.originalInterpolatedCompileSourceRoots = originalInterpolatedCompileSourceRoots;
     }
 
-    protected void setDynamicTestCompileSourceRoots( List dynamicTestCompileSourceRoots )
+    protected void setDynamicTestCompileSourceRoots( List<String> dynamicTestCompileSourceRoots )
     {
         this.dynamicTestCompileSourceRoots = dynamicTestCompileSourceRoots;
     }
 
-    protected void setOriginalInterpolatedTestCompileSourceRoots( List originalInterpolatedTestCompileSourceRoots )
+    protected void setOriginalInterpolatedTestCompileSourceRoots( List<String> originalInterpolatedTestCompileSourceRoots )
     {
         this.originalInterpolatedTestCompileSourceRoots = originalInterpolatedTestCompileSourceRoots;
     }
 
-    protected void setDynamicScriptSourceRoots( List dynamicScriptSourceRoots )
+    protected void setDynamicScriptSourceRoots( List<String> dynamicScriptSourceRoots )
     {
         this.dynamicScriptSourceRoots = dynamicScriptSourceRoots;
     }
 
-    protected void setOriginalInterpolatedScriptSourceRoots( List originalInterpolatedScriptSourceRoots )
+    protected void setOriginalInterpolatedScriptSourceRoots( List<String> originalInterpolatedScriptSourceRoots )
     {
         this.originalInterpolatedScriptSourceRoots = originalInterpolatedScriptSourceRoots;
     }
@@ -2116,7 +2089,7 @@
         if ( p != null )
         {
             preservedProperties = new Properties();
-            for ( Enumeration e = p.propertyNames(); e.hasMoreElements(); )
+            for ( Enumeration<?> e = p.propertyNames(); e.hasMoreElements(); )
             {
                 String key = (String) e.nextElement();
                 preservedProperties.setProperty( key, p.getProperty( key ) );
diff --git a/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java b/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java
index bb29b17..8799207 100644
--- a/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java
+++ b/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java
@@ -72,7 +72,7 @@
      * @return the built project
      * @throws ProjectBuildingException
      */
-    MavenProject buildFromRepository( Artifact artifact, List remoteArtifactRepositories,
+    MavenProject buildFromRepository( Artifact artifact, List<ArtifactRepository> remoteArtifactRepositories,
                                       ArtifactRepository localRepository )
         throws ProjectBuildingException;
 
@@ -86,7 +86,7 @@
      * @return the built project
      * @throws ProjectBuildingException
      */
-    MavenProject buildFromRepository( Artifact artifact, List remoteArtifactRepositories,
+    MavenProject buildFromRepository( Artifact artifact, List<ArtifactRepository> remoteArtifactRepositories,
                                       ArtifactRepository localRepository, boolean allowStubModel )
         throws ProjectBuildingException;
 
@@ -102,7 +102,7 @@
      * @return the built project
      * @throws ProjectBuildingException
      */
-    MavenProject buildFromRepository( Artifact artifact, List remoteArtifactRepositories,
+    MavenProject buildFromRepository( Artifact artifact, List<ArtifactRepository> remoteArtifactRepositories,
                                       ProjectBuilderConfiguration configuration, boolean allowStubModel )
         throws ProjectBuildingException;
 
diff --git a/maven-project/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java b/maven-project/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
index 26ec543..ae40b81 100644
--- a/maven-project/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
+++ b/maven-project/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
@@ -106,7 +106,7 @@
     /**
      * Resolve all relocations in the POM for this artifact, and return the new artifact coordinate.
      */
-    public Artifact retrieveRelocatedArtifact( Artifact artifact, ArtifactRepository localRepository, List remoteRepositories )
+    public Artifact retrieveRelocatedArtifact( Artifact artifact, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
         throws ArtifactMetadataRetrievalException
     {
         if ( artifact instanceof ActiveProjectArtifact )
@@ -162,7 +162,8 @@
         return artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getVersion();
     }
 
-    private ProjectRelocation retrieveRelocatedProject( Artifact artifact, ArtifactRepository localRepository, List remoteRepositories )
+    private ProjectRelocation retrieveRelocatedProject( Artifact artifact, ArtifactRepository localRepository,
+                                                        List<ArtifactRepository> remoteRepositories )
         throws ArtifactMetadataRetrievalException
     {
         MavenProject project = null;
@@ -442,16 +443,15 @@
      * @todo desperately needs refactoring. It's just here because it's implementation is maven-project specific
      * @return {@link Set} &lt; {@link Artifact} >
      */
-    public static Set createArtifacts( ArtifactFactory artifactFactory, List dependencies, String inheritedScope,
-                                       ArtifactFilter dependencyFilter, MavenProject project )
+    public static Set<Artifact> createArtifacts( ArtifactFactory artifactFactory, List<Dependency> dependencies,
+                                                 String inheritedScope, ArtifactFilter dependencyFilter,
+                                                 MavenProject project )
         throws InvalidDependencyVersionException
     {
-        Set projectArtifacts = new LinkedHashSet( dependencies.size() );
+        Set<Artifact> projectArtifacts = new LinkedHashSet<Artifact>( dependencies.size() );
 
-        for ( Iterator i = dependencies.iterator(); i.hasNext(); )
+        for ( Dependency d : dependencies )
         {
-            Dependency d = (Dependency) i.next();
-
             String scope = d.getScope();
 
             if ( StringUtils.isEmpty( scope ) )
