diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/AbstractDependencyFilter.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/AbstractDependencyFilter.java
index e550df1..80ed259 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/AbstractDependencyFilter.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/AbstractDependencyFilter.java
@@ -28,13 +28,14 @@
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.MojoExecutionException;
 
-import aQute.bnd.osgi.Instruction;
+import aQute.bnd.header.Attrs;
 import aQute.bnd.header.OSGiHeader;
+import aQute.bnd.osgi.Instruction;
 
 
 /**
  * Apply clause-based filter over given dependencies
- * 
+ *
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public abstract class AbstractDependencyFilter
@@ -44,10 +45,10 @@
     /**
      * Dependency artifacts.
      */
-    private final Collection m_dependencyArtifacts;
+    private final Collection<Artifact> m_dependencyArtifacts;
 
 
-    public AbstractDependencyFilter( Collection dependencyArtifacts )
+    public AbstractDependencyFilter( Collection<Artifact> dependencyArtifacts )
     {
         m_dependencyArtifacts = dependencyArtifacts;
     }
@@ -71,11 +72,11 @@
         }
 
 
-        public void filter( Collection dependencies )
+        public void filter( Collection<Artifact> dependencies )
         {
-            for ( Iterator i = dependencies.iterator(); i.hasNext(); )
+            for ( Iterator<Artifact> i = dependencies.iterator(); i.hasNext(); )
             {
-                if ( false == matches( ( Artifact ) i.next() ) )
+                if ( false == matches( i.next() ) )
                 {
                     i.remove();
                 }
@@ -106,21 +107,21 @@
 
     protected final void processInstructions( String header ) throws MojoExecutionException
     {
-        Map instructions = OSGiHeader.parseHeader( MISSING_KEY_PATTERN.matcher( header ).replaceAll( "$1$2*;$3" ) );
+        Map<String,Attrs> instructions = OSGiHeader.parseHeader( MISSING_KEY_PATTERN.matcher( header ).replaceAll( "$1$2*;$3" ) );
 
-        Collection availableDependencies = new LinkedHashSet( m_dependencyArtifacts );
+        Collection<Artifact> availableDependencies = new LinkedHashSet<Artifact>( m_dependencyArtifacts );
 
         DependencyFilter filter;
-        for ( Iterator clauseIterator = instructions.entrySet().iterator(); clauseIterator.hasNext(); )
+        for ( Iterator<Map.Entry<String,Attrs>> clauseIterator = instructions.entrySet().iterator(); clauseIterator.hasNext(); )
         {
             String inline = "false";
 
             // always start with a fresh *modifiable* collection for each unique clause
-            Collection filteredDependencies = new LinkedHashSet( availableDependencies );
+            Collection<Artifact> filteredDependencies = new LinkedHashSet<Artifact>( availableDependencies );
 
             // CLAUSE: REGEXP --> { ATTRIBUTE MAP }
-            Map.Entry clause = ( Map.Entry ) clauseIterator.next();
-            String primaryKey = ( ( String ) clause.getKey() ).replaceFirst( "~+$", "" );
+            Map.Entry<String,Attrs> clause = clauseIterator.next();
+            String primaryKey = clause.getKey().replaceFirst( "~+$", "" );
             boolean isNegative = primaryKey.startsWith( "!" );
             if ( isNegative )
             {
@@ -131,6 +132,7 @@
             {
                 filter = new DependencyFilter( primaryKey )
                 {
+                    @Override
                     boolean matches( Artifact dependency )
                     {
                         return super.matches( dependency.getArtifactId() );
@@ -140,14 +142,15 @@
                 filter.filter( filteredDependencies );
             }
 
-            for ( Iterator attrIterator = ( ( Map ) clause.getValue() ).entrySet().iterator(); attrIterator.hasNext(); )
+            for ( Iterator<Map.Entry<String,String>> attrIterator = clause.getValue().entrySet().iterator(); attrIterator.hasNext(); )
             {
                 // ATTRIBUTE: KEY --> REGEXP
-                Map.Entry attr = ( Map.Entry ) attrIterator.next();
+                Map.Entry<String,String> attr = attrIterator.next();
                 if ( "groupId".equals( attr.getKey() ) )
                 {
-                    filter = new DependencyFilter( ( String ) attr.getValue() )
+                    filter = new DependencyFilter( attr.getValue() )
                     {
+                        @Override
                         boolean matches( Artifact dependency )
                         {
                             return super.matches( dependency.getGroupId() );
@@ -156,8 +159,9 @@
                 }
                 else if ( "artifactId".equals( attr.getKey() ) )
                 {
-                    filter = new DependencyFilter( ( String ) attr.getValue() )
+                    filter = new DependencyFilter( attr.getValue() )
                     {
+                        @Override
                         boolean matches( Artifact dependency )
                         {
                             return super.matches( dependency.getArtifactId() );
@@ -166,8 +170,9 @@
                 }
                 else if ( "version".equals( attr.getKey() ) )
                 {
-                    filter = new DependencyFilter( ( String ) attr.getValue() )
+                    filter = new DependencyFilter( attr.getValue() )
                     {
+                        @Override
                         boolean matches( Artifact dependency )
                         {
                             try
@@ -184,8 +189,9 @@
                 }
                 else if ( "scope".equals( attr.getKey() ) )
                 {
-                    filter = new DependencyFilter( ( String ) attr.getValue(), "compile" )
+                    filter = new DependencyFilter( attr.getValue(), "compile" )
                     {
+                        @Override
                         boolean matches( Artifact dependency )
                         {
                             return super.matches( dependency.getScope() );
@@ -194,8 +200,9 @@
                 }
                 else if ( "type".equals( attr.getKey() ) )
                 {
-                    filter = new DependencyFilter( ( String ) attr.getValue(), "jar" )
+                    filter = new DependencyFilter( attr.getValue(), "jar" )
                     {
+                        @Override
                         boolean matches( Artifact dependency )
                         {
                             return super.matches( dependency.getType() );
@@ -204,8 +211,9 @@
                 }
                 else if ( "classifier".equals( attr.getKey() ) )
                 {
-                    filter = new DependencyFilter( ( String ) attr.getValue() )
+                    filter = new DependencyFilter( attr.getValue() )
                     {
+                        @Override
                         boolean matches( Artifact dependency )
                         {
                             return super.matches( dependency.getClassifier() );
@@ -214,8 +222,9 @@
                 }
                 else if ( "optional".equals( attr.getKey() ) )
                 {
-                    filter = new DependencyFilter( ( String ) attr.getValue(), "false" )
+                    filter = new DependencyFilter( attr.getValue(), "false" )
                     {
+                        @Override
                         boolean matches( Artifact dependency )
                         {
                             return super.matches( "" + dependency.isOptional() );
@@ -224,7 +233,7 @@
                 }
                 else if ( "inline".equals( attr.getKey() ) )
                 {
-                    inline = ( String ) attr.getValue();
+                    inline = attr.getValue();
                     continue;
                 }
                 else
@@ -255,5 +264,5 @@
     }
 
 
-    protected abstract void processDependencies( Collection dependencies, String inline );
+    protected abstract void processDependencies( Collection<Artifact> dependencies, String inline );
 }
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/AntPlugin.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/AntPlugin.java
index 63d7b34..0274f0d 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/AntPlugin.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/AntPlugin.java
@@ -48,7 +48,8 @@
     static final String BUILD_BND = "/maven-build.bnd";
 
 
-    protected void execute( MavenProject currentProject, Map originalInstructions, Properties properties,
+    @Override
+    protected void execute( MavenProject currentProject, Map<String, String> originalInstructions, Properties properties,
         Jar[] classpath ) throws MojoExecutionException
     {
         final String artifactId = getProject().getArtifactId();
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BlueprintPlugin.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BlueprintPlugin.java
index 97b3d69..9ece6c1 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BlueprintPlugin.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BlueprintPlugin.java
@@ -19,6 +19,8 @@
 package org.apache.felix.bundleplugin;
 
 
+import static org.apache.felix.utils.manifest.Parser.parseHeader;
+
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -26,15 +28,10 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.net.URL;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeSet;
 import java.util.regex.Pattern;
 
 import javax.xml.transform.Transformer;
@@ -42,22 +39,18 @@
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.transform.stream.StreamSource;
 
+import org.apache.felix.utils.manifest.Attribute;
+import org.apache.felix.utils.manifest.Clause;
+import org.osgi.framework.Constants;
+
 import aQute.bnd.header.Attrs;
-import aQute.bnd.service.AnalyzerPlugin;
 import aQute.bnd.osgi.Analyzer;
 import aQute.bnd.osgi.Descriptors.PackageRef;
 import aQute.bnd.osgi.Jar;
 import aQute.bnd.osgi.Processor;
 import aQute.bnd.osgi.Resource;
+import aQute.bnd.service.AnalyzerPlugin;
 import aQute.libg.generics.Create;
-import aQute.libg.qtokens.QuotedTokenizer;
-import aQute.service.reporter.Reporter;
-import org.apache.felix.utils.manifest.Attribute;
-import org.apache.felix.utils.manifest.Clause;
-import org.apache.felix.utils.manifest.Directive;
-import org.osgi.framework.Constants;
-
-import static org.apache.felix.utils.manifest.Parser.parseHeader;
 
 
 public class BlueprintPlugin implements AnalyzerPlugin
@@ -99,7 +92,7 @@
             if ( dir == null || dir.isEmpty() )
             {
                 Resource resource = jar.getResource( root );
-                if ( resource != null ) 
+                if ( resource != null )
 				{
                     process( analyzer, root, resource, headers );
 					if (bpHeader.length() > 0) {
@@ -113,7 +106,7 @@
             {
                 String path = entry.getKey();
                 Resource resource = entry.getValue();
-                if ( PATHS.matcher( path ).matches() ) 
+                if ( PATHS.matcher( path ).matches() )
 				{
                     process( analyzer, path, resource, headers );
 					if (bpHeader.length() > 0) {
@@ -123,7 +116,7 @@
 				}
             }
         }
-		if( !map.isEmpty() ) 
+		if( !map.isEmpty() )
 		{
 			analyzer.setProperty("Bundle-Blueprint", bpHeader);
 		}
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundleInfo.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundleInfo.java
index b75d978..d42ab74 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundleInfo.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundleInfo.java
@@ -4,9 +4,9 @@
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance with the License. You may obtain a
  * copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software distributed under the License
  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
  * or implied. See the License for the specific language governing permissions and limitations under
@@ -15,7 +15,6 @@
 package org.apache.felix.bundleplugin;
 
 
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -26,8 +25,8 @@
 
 
 /**
- * Information result of the bundling process 
- * 
+ * Information result of the bundling process
+ *
  * @author <a href="mailto:carlos@apache.org">Carlos Sanchez</a>
  * @version $Id$
  */
@@ -37,22 +36,22 @@
      * {@link Map} &lt; {@link String}, {@link Set} &lt; {@link Artifact} > >
      * Used to check for duplicated exports. Key is package name and value list of artifacts where it's exported.
      */
-    private Map m_exportedPackages = new HashMap();
+    private Map<String, Set<Artifact>> m_exportedPackages = new HashMap<String, Set<Artifact>>();
 
 
     public void addExportedPackage( String packageName, Artifact artifact )
     {
-        Set artifacts = ( Set ) getExportedPackages().get( packageName );
+        Set<Artifact> artifacts = getExportedPackages().get( packageName );
         if ( artifacts == null )
         {
-            artifacts = new HashSet();
+            artifacts = new HashSet<Artifact>();
             m_exportedPackages.put( packageName, artifacts );
         }
         artifacts.add( artifact );
     }
 
 
-    protected Map getExportedPackages()
+    protected Map<String, Set<Artifact>> getExportedPackages()
     {
         return m_exportedPackages;
     }
@@ -63,23 +62,23 @@
      * Key is package name and value list of artifacts where it's exported.
      * @return {@link Map} &lt; {@link String}, {@link Set} &lt; {@link Artifact} > >
      */
-    public Map getDuplicatedExports()
+    public Map<String, Set<Artifact>> getDuplicatedExports()
     {
-        Map duplicatedExports = new HashMap();
+        Map<String, Set<Artifact>> duplicatedExports = new HashMap<String, Set<Artifact>>();
 
-        for ( Iterator it = getExportedPackages().entrySet().iterator(); it.hasNext(); )
+        for ( Iterator<Map.Entry<String, Set<Artifact>>> it = getExportedPackages().entrySet().iterator(); it.hasNext(); )
         {
-            Map.Entry entry = ( Map.Entry ) it.next();
-            Set artifacts = ( Set ) entry.getValue();
+            Map.Entry<String, Set<Artifact>> entry = it.next();
+            Set<Artifact> artifacts = entry.getValue();
             if ( artifacts.size() > 1 )
             {
                 /* remove warnings caused by different versions of same artifact */
-                Set artifactKeys = new HashSet();
+                Set<String> artifactKeys = new HashSet<String>();
 
-                String packageName = ( String ) entry.getKey();
-                for ( Iterator it2 = artifacts.iterator(); it2.hasNext(); )
+                String packageName = entry.getKey();
+                for ( Iterator<Artifact> it2 = artifacts.iterator(); it2.hasNext(); )
                 {
-                    Artifact artifact = ( Artifact ) it2.next();
+                    Artifact artifact = it2.next();
                     artifactKeys.add( artifact.getGroupId() + "." + artifact.getArtifactId() );
                 }
 
@@ -96,16 +95,16 @@
 
     public void merge( BundleInfo bundleInfo )
     {
-        for ( Iterator it = bundleInfo.getExportedPackages().entrySet().iterator(); it.hasNext(); )
+        for ( Iterator<Map.Entry<String, Set<Artifact>>> it = bundleInfo.getExportedPackages().entrySet().iterator(); it.hasNext(); )
         {
-            Map.Entry entry = ( Map.Entry ) it.next();
-            String packageName = ( String ) entry.getKey();
-            Collection artifacts = ( Collection ) entry.getValue();
+            Map.Entry<String, Set<Artifact>> entry = it.next();
+            String packageName = entry.getKey();
+            Set<Artifact> artifacts = entry.getValue();
 
-            Collection artifactsWithPackage = ( Collection ) getExportedPackages().get( packageName );
+            Set<Artifact> artifactsWithPackage = getExportedPackages().get( packageName );
             if ( artifactsWithPackage == null )
             {
-                artifactsWithPackage = new HashSet();
+                artifactsWithPackage = new HashSet<Artifact>();
                 getExportedPackages().put( packageName, artifactsWithPackage );
             }
             artifactsWithPackage.addAll( artifacts );
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java
index 4e5835f..c84973c 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java
@@ -39,7 +39,6 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.Set;
 import java.util.jar.Attributes;
@@ -178,7 +177,7 @@
      *
      * @parameter
      */
-    protected List supportedProjectTypes = Arrays.asList( new String[]
+    protected List<String> supportedProjectTypes = Arrays.asList( new String[]
         { "jar", "bundle" } );
 
     /**
@@ -211,7 +210,7 @@
      *
      * @parameter
      */
-    private Map instructions = new LinkedHashMap();
+    private Map<String, String> instructions = new LinkedHashMap<String, String>();
 
     /**
      * Use locally patched version for now.
@@ -287,7 +286,7 @@
     }
 
 
-    protected void execute( MavenProject currentProject, Map originalInstructions, Properties properties )
+    protected void execute( MavenProject currentProject, Map<String, String> originalInstructions, Properties properties )
         throws MojoExecutionException
     {
         try
@@ -302,20 +301,20 @@
 
 
     /* transform directives from their XML form to the expected BND syntax (eg. _include becomes -include) */
-    protected static Map transformDirectives( Map originalInstructions )
+    protected static Map<String, String> transformDirectives( Map<String, String> originalInstructions )
     {
-        Map transformedInstructions = new LinkedHashMap();
-        for ( Iterator i = originalInstructions.entrySet().iterator(); i.hasNext(); )
+        Map<String, String> transformedInstructions = new LinkedHashMap<String, String>();
+        for ( Iterator<Map.Entry<String, String>> i = originalInstructions.entrySet().iterator(); i.hasNext(); )
         {
-            Map.Entry e = ( Map.Entry ) i.next();
+            Map.Entry<String, String> e = i.next();
 
-            String key = ( String ) e.getKey();
+            String key = e.getKey();
             if ( key.startsWith( "_" ) )
             {
                 key = "-" + key.substring( 1 );
             }
 
-            String value = ( String ) e.getValue();
+            String value = e.getValue();
             if ( null == value )
             {
                 value = "";
@@ -339,20 +338,20 @@
 
     protected boolean reportErrors( String prefix, Analyzer analyzer )
     {
-        List errors = analyzer.getErrors();
-        List warnings = analyzer.getWarnings();
+        List<String> errors = analyzer.getErrors();
+        List<String> warnings = analyzer.getWarnings();
 
-        for ( Iterator w = warnings.iterator(); w.hasNext(); )
+        for ( Iterator<String> w = warnings.iterator(); w.hasNext(); )
         {
-            String msg = ( String ) w.next();
+            String msg = w.next();
             getLog().warn( prefix + " : " + msg );
         }
 
         boolean hasErrors = false;
         String fileNotFound = "Input file does not exist: ";
-        for ( Iterator e = errors.iterator(); e.hasNext(); )
+        for ( Iterator<String> e = errors.iterator(); e.hasNext(); )
         {
-            String msg = ( String ) e.next();
+            String msg = e.next();
             if ( msg.startsWith( fileNotFound ) && msg.endsWith( "~" ) )
             {
                 // treat as warning; this error happens when you have duplicate entries in Include-Resource
@@ -369,7 +368,7 @@
     }
 
 
-    protected void execute( MavenProject currentProject, Map originalInstructions, Properties properties,
+    protected void execute( MavenProject currentProject, Map<String, String> originalInstructions, Properties properties,
         Jar[] classpath ) throws MojoExecutionException
     {
         try
@@ -456,18 +455,18 @@
     }
 
 
-    protected Builder getOSGiBuilder( MavenProject currentProject, Map originalInstructions, Properties properties,
+    protected Builder getOSGiBuilder( MavenProject currentProject, Map<String, String> originalInstructions, Properties properties,
         Jar[] classpath ) throws Exception
     {
         properties.putAll( getDefaultProperties( currentProject ) );
         properties.putAll( transformDirectives( originalInstructions ) );
 
         // process overrides from project
-        final Map addProps = new HashMap();
-        final Iterator iter = currentProject.getProperties().entrySet().iterator();
+        final Map<String, String> addProps = new HashMap<String, String>();
+        final Iterator<Map.Entry<Object, Object>> iter = currentProject.getProperties().entrySet().iterator();
         while ( iter.hasNext() )
         {
-            final Map.Entry entry = (Entry) iter.next();
+            final Map.Entry<Object, Object> entry = iter.next();
             final String key = entry.getKey().toString();
             if ( key.startsWith(BUNDLE_PLUGIN_EXTENSION) )
             {
@@ -475,7 +474,7 @@
                 final String currentValue = properties.getProperty(oKey);
                 if ( currentValue == null )
                 {
-                    addProps.put(oKey, entry.getValue());
+                    addProps.put(oKey, entry.getValue().toString());
                 }
                 else
                 {
@@ -488,7 +487,7 @@
                 final String currentValue = properties.getProperty(oKey);
                 if ( currentValue == null )
                 {
-                    addProps.put(oKey, entry.getValue());
+                    addProps.put(oKey, entry.getValue().toString());
                 }
                 else
                 {
@@ -497,7 +496,7 @@
             }
         }
         properties.putAll( addProps );
-        final Iterator keyIter = addProps.keySet().iterator();
+        final Iterator<String> keyIter = addProps.keySet().iterator();
         while ( keyIter.hasNext() )
         {
             Object key = keyIter.next();
@@ -548,9 +547,9 @@
     {
         // convert any non-String keys/values to Strings
         Properties sanitizedEntries = new Properties();
-        for ( Iterator itr = properties.entrySet().iterator(); itr.hasNext(); )
+        for ( Iterator<Map.Entry<Object,Object>> itr = properties.entrySet().iterator(); itr.hasNext(); )
         {
-            Map.Entry entry = ( Map.Entry ) itr.next();
+            Map.Entry<Object,Object> entry = itr.next();
             if ( entry.getKey() instanceof String == false )
             {
                 String key = sanitize( entry.getKey() );
@@ -620,7 +619,7 @@
         }
 
         // update BND instructions to embed selected Maven dependencies
-        Collection embeddableArtifacts = getEmbeddableArtifacts( currentProject, builder );
+        Collection<Artifact> embeddableArtifacts = getEmbeddableArtifacts( currentProject, builder );
         new DependencyEmbedder( getLog(), embeddableArtifacts ).processHeaders( builder );
 
         if ( dumpInstructions != null || getLog().isDebugEnabled() )
@@ -649,7 +648,7 @@
     }
 
 
-    protected Builder buildOSGiBundle( MavenProject currentProject, Map originalInstructions, Properties properties,
+    protected Builder buildOSGiBundle( MavenProject currentProject, Map<String, String> originalInstructions, Properties properties,
         Jar[] classpath ) throws Exception
     {
         Builder builder = getOSGiBuilder( currentProject, originalInstructions, properties, classpath );
@@ -670,10 +669,10 @@
         {
             buf.append( "#-----------------------------------------------------------------------" + NL );
             Properties stringProperties = new Properties();
-            for ( Enumeration e = properties.propertyNames(); e.hasMoreElements(); )
+            for ( Enumeration<String> e = (Enumeration<String>) properties.propertyNames(); e.hasMoreElements(); )
             {
                 // we can only store String properties
-                String key = ( String ) e.nextElement();
+                String key = e.nextElement();
                 String value = properties.getProperty( key );
                 if ( value != null )
                 {
@@ -693,15 +692,15 @@
     }
 
 
-    protected static StringBuilder dumpClasspath( List classpath, StringBuilder buf )
+    protected static StringBuilder dumpClasspath( List<Jar> classpath, StringBuilder buf )
     {
         try
         {
             buf.append( "#-----------------------------------------------------------------------" + NL );
             buf.append( "-classpath:\\" + NL );
-            for ( Iterator i = classpath.iterator(); i.hasNext(); )
+            for ( Iterator<Jar> i = classpath.iterator(); i.hasNext(); )
             {
-                File path = ( ( Jar ) i.next() ).getSource();
+                File path = i.next().getSource();
                 if ( path != null )
                 {
                     buf.append( ' ' + path.toString() + ( i.hasNext() ? ",\\" : "" ) + NL );
@@ -815,19 +814,19 @@
                 /*
                  * Add customized manifest sections (for some reason MavenArchiver doesn't do this for us)
                  */
-                List sections = archiveConfig.getManifestSections();
-                for ( Iterator i = sections.iterator(); i.hasNext(); )
+                List<ManifestSection> sections = archiveConfig.getManifestSections();
+                for ( Iterator<ManifestSection> i = sections.iterator(); i.hasNext(); )
                 {
-                    ManifestSection section = ( ManifestSection ) i.next();
+                    ManifestSection section = i.next();
                     Attributes attributes = new Attributes();
 
                     if ( !section.isManifestEntriesEmpty() )
                     {
-                        Map entries = section.getManifestEntries();
-                        for ( Iterator j = entries.entrySet().iterator(); j.hasNext(); )
+                        Map<String, String> entries = section.getManifestEntries();
+                        for ( Iterator<Map.Entry<String, String>> j = entries.entrySet().iterator(); j.hasNext(); )
                         {
-                            Map.Entry entry = ( Map.Entry ) j.next();
-                            attributes.putValue( ( String ) entry.getKey(), ( String ) entry.getValue() );
+                            Map.Entry<String, String> entry = j.next();
+                            attributes.putValue( entry.getKey(), entry.getValue() );
                         }
                     }
 
@@ -843,7 +842,7 @@
             // apply -removeheaders to the custom manifest
             for ( int i = 0; i < removeHeaders.length; i++ )
             {
-                for ( Iterator j = mainMavenAttributes.keySet().iterator(); j.hasNext(); )
+                for ( Iterator<Object> j = mainMavenAttributes.keySet().iterator(); j.hasNext(); )
                 {
                     if ( j.next().toString().matches( removeHeaders[i].trim() ) )
                     {
@@ -901,13 +900,13 @@
     }
 
 
-    protected Set getOptionalPackages( MavenProject currentProject ) throws IOException, MojoExecutionException
+    protected Set<String> getOptionalPackages( MavenProject currentProject ) throws IOException, MojoExecutionException
     {
-        ArrayList inscope = new ArrayList();
-        final Collection artifacts = getSelectedDependencies( currentProject.getArtifacts() );
-        for ( Iterator it = artifacts.iterator(); it.hasNext(); )
+        ArrayList<Artifact> inscope = new ArrayList<Artifact>();
+        final Collection<Artifact> artifacts = getSelectedDependencies( currentProject.getArtifacts() );
+        for ( Iterator<Artifact> it = artifacts.iterator(); it.hasNext(); )
         {
-            Artifact artifact = ( Artifact ) it.next();
+            Artifact artifact = it.next();
             if ( artifact.getArtifactHandler().isAddedToClasspath() )
             {
                 if ( !Artifact.SCOPE_TEST.equals( artifact.getScope() ) )
@@ -917,10 +916,10 @@
             }
         }
 
-        HashSet optionalArtifactIds = new HashSet();
-        for ( Iterator it = inscope.iterator(); it.hasNext(); )
+        HashSet<String> optionalArtifactIds = new HashSet<String>();
+        for ( Iterator<Artifact> it = inscope.iterator(); it.hasNext(); )
         {
-            Artifact artifact = ( Artifact ) it.next();
+            Artifact artifact = it.next();
             if ( artifact.isOptional() )
             {
                 String id = artifact.toString();
@@ -934,11 +933,11 @@
 
         }
 
-        HashSet required = new HashSet();
-        HashSet optional = new HashSet();
-        for ( Iterator it = inscope.iterator(); it.hasNext(); )
+        HashSet<String> required = new HashSet<String>();
+        HashSet<String> optional = new HashSet<String>();
+        for ( Iterator<Artifact> it = inscope.iterator(); it.hasNext(); )
         {
-            Artifact artifact = ( Artifact ) it.next();
+            Artifact artifact = it.next();
             File file = getFile( artifact );
             if ( file == null )
             {
@@ -968,12 +967,12 @@
      *
      * @param artifact
      */
-    protected boolean isTransitivelyOptional( HashSet optionalArtifactIds, Artifact artifact )
+    protected boolean isTransitivelyOptional( HashSet<String> optionalArtifactIds, Artifact artifact )
     {
-        List trail = artifact.getDependencyTrail();
-        for ( Iterator iterator = trail.iterator(); iterator.hasNext(); )
+        List<String> trail = artifact.getDependencyTrail();
+        for ( Iterator<String> iterator = trail.iterator(); iterator.hasNext(); )
         {
-            String next = ( String ) iterator.next();
+            String next = iterator.next();
             if ( optionalArtifactIds.contains( next ) )
             {
                 return true;
@@ -1036,9 +1035,9 @@
     }
 
 
-    private static Map getProperties( Model projectModel, String prefix )
+    private static Map<String, String> getProperties( Model projectModel, String prefix )
     {
-        Map properties = new LinkedHashMap();
+        Map<String, String> properties = new LinkedHashMap<String, String>();
         Method methods[] = Model.class.getDeclaredMethods();
         for ( int i = 0; i < methods.length; i++ )
         {
@@ -1054,7 +1053,7 @@
                         if ( v.getClass().isArray() )
                             properties.put( name, Arrays.asList( ( Object[] ) v ).toString() );
                         else
-                            properties.put( name, v );
+                            properties.put( name, v.toString() );
 
                     }
                 }
@@ -1068,15 +1067,15 @@
     }
 
 
-    private static StringBuffer printLicenses( List licenses )
+    private static StringBuffer printLicenses( List<License> licenses )
     {
         if ( licenses == null || licenses.size() == 0 )
             return null;
         StringBuffer sb = new StringBuffer();
         String del = "";
-        for ( Iterator i = licenses.iterator(); i.hasNext(); )
+        for ( Iterator<License> i = licenses.iterator(); i.hasNext(); )
         {
-            License l = ( License ) i.next();
+            License l = i.next();
             String url = l.getUrl();
             if ( url == null )
                 continue;
@@ -1112,17 +1111,17 @@
 
     protected Jar[] getClasspath( MavenProject currentProject ) throws IOException, MojoExecutionException
     {
-        List list = new ArrayList();
+        List<Jar> list = new ArrayList<Jar>();
 
         if ( getOutputDirectory() != null && getOutputDirectory().exists() )
         {
             list.add( new Jar( ".", getOutputDirectory() ) );
         }
 
-        final Collection artifacts = getSelectedDependencies( currentProject.getArtifacts() );
-        for ( Iterator it = artifacts.iterator(); it.hasNext(); )
+        final Collection<Artifact> artifacts = getSelectedDependencies( currentProject.getArtifacts() );
+        for ( Iterator<Artifact> it = artifacts.iterator(); it.hasNext(); )
         {
-            Artifact artifact = ( Artifact ) it.next();
+            Artifact artifact = it.next();
             if ( artifact.getArtifactHandler().isAddedToClasspath() )
             {
                 if ( !Artifact.SCOPE_TEST.equals( artifact.getScope() ) )
@@ -1146,7 +1145,7 @@
     }
 
 
-    private Collection getSelectedDependencies( Collection artifacts ) throws MojoExecutionException
+    private Collection<Artifact> getSelectedDependencies( Collection<Artifact> artifacts ) throws MojoExecutionException
     {
         if ( null == excludeDependencies || excludeDependencies.length() == 0 )
         {
@@ -1154,10 +1153,10 @@
         }
         else if ( "true".equalsIgnoreCase( excludeDependencies ) )
         {
-            return Collections.EMPTY_LIST;
+            return Collections.emptyList();
         }
 
-        Collection selectedDependencies = new LinkedHashSet( artifacts );
+        Collection<Artifact> selectedDependencies = new LinkedHashSet<Artifact>( artifacts );
         DependencyExcluder excluder = new DependencyExcluder( artifacts );
         excluder.processHeaders( excludeDependencies );
         selectedDependencies.removeAll( excluder.getExcludedArtifacts() );
@@ -1291,9 +1290,9 @@
         properties.putAll( currentProject.getProperties() );
         properties.putAll( currentProject.getModel().getProperties() );
 
-        for ( Iterator i = currentProject.getFilters().iterator(); i.hasNext(); )
+        for ( Iterator<String> i = currentProject.getFilters().iterator(); i.hasNext(); )
         {
-            File filterFile = new File( ( String ) i.next() );
+            File filterFile = new File( i.next() );
             if ( filterFile.isFile() )
             {
                 properties.putAll( PropertyUtils.loadProperties( filterFile ) );
@@ -1306,9 +1305,9 @@
             {
                 // don't pass upper-case session settings to bnd as they end up in the manifest
                 Properties sessionProperties = m_mavenSession.getExecutionProperties();
-                for ( Enumeration e = sessionProperties.propertyNames(); e.hasMoreElements(); )
+                for ( Enumeration<String> e = (Enumeration<String>) sessionProperties.propertyNames(); e.hasMoreElements(); )
                 {
-                    String key = ( String ) e.nextElement();
+                    String key = e.nextElement();
                     if ( key.length() > 0 && !Character.isUpperCase( key.charAt( 0 ) ) )
                     {
                         properties.put( key, sessionProperties.getProperty( key ) );
@@ -1455,17 +1454,17 @@
     }
 
 
-    private static List getMavenResources( MavenProject currentProject, boolean test )
+    private static List<Resource> getMavenResources( MavenProject currentProject, boolean test )
     {
-        List resources = new ArrayList( test ? currentProject.getTestResources() : currentProject.getResources() );
+        List<Resource> resources = new ArrayList<Resource>( test ? currentProject.getTestResources() : currentProject.getResources() );
 
         if ( currentProject.getCompileSourceRoots() != null )
         {
             // also scan for any "packageinfo" files lurking in the source folders
-            List packageInfoIncludes = Collections.singletonList( "**/packageinfo" );
-            for ( Iterator i = currentProject.getCompileSourceRoots().iterator(); i.hasNext(); )
+            final List<String> packageInfoIncludes = Collections.singletonList( "**/packageinfo" );
+            for ( Iterator<String> i = currentProject.getCompileSourceRoots().iterator(); i.hasNext(); )
             {
-                String sourceRoot = ( String ) i.next();
+                String sourceRoot = i.next();
                 Resource packageInfoResource = new Resource();
                 packageInfoResource.setDirectory( sourceRoot );
                 packageInfoResource.setIncludes( packageInfoIncludes );
@@ -1481,10 +1480,10 @@
     {
         final String basePath = currentProject.getBasedir().getAbsolutePath();
 
-        Set pathSet = new LinkedHashSet();
-        for ( Iterator i = getMavenResources( currentProject, test ).iterator(); i.hasNext(); )
+        Set<String> pathSet = new LinkedHashSet<String>();
+        for ( Iterator<Resource> i = getMavenResources( currentProject, test ).iterator(); i.hasNext(); )
         {
-            Resource resource = ( Resource ) i.next();
+            Resource resource = i.next();
 
             final String sourcePath = resource.getDirectory();
             final String targetPath = resource.getTargetPath();
@@ -1512,11 +1511,11 @@
                 scanner.addDefaultExcludes();
                 scanner.scan();
 
-                List includedFiles = Arrays.asList( scanner.getIncludedFiles() );
+                List<String> includedFiles = Arrays.asList( scanner.getIncludedFiles() );
 
-                for ( Iterator j = includedFiles.iterator(); j.hasNext(); )
+                for ( Iterator<String> j = includedFiles.iterator(); j.hasNext(); )
                 {
-                    String name = ( String ) j.next();
+                    String name = j.next();
                     String path = sourcePath + '/' + name;
 
                     // make relative to project
@@ -1559,7 +1558,7 @@
         }
 
         StringBuffer resourcePaths = new StringBuffer();
-        for ( Iterator i = pathSet.iterator(); i.hasNext(); )
+        for ( Iterator<String> i = pathSet.iterator(); i.hasNext(); )
         {
             resourcePaths.append( i.next() );
             if ( i.hasNext() )
@@ -1572,10 +1571,10 @@
     }
 
 
-    protected Collection getEmbeddableArtifacts( MavenProject currentProject, Analyzer analyzer )
+    protected Collection<Artifact> getEmbeddableArtifacts( MavenProject currentProject, Analyzer analyzer )
         throws MojoExecutionException
     {
-        final Collection artifacts;
+        final Collection<Artifact> artifacts;
 
         String embedTransitive = analyzer.getProperty( DependencyEmbedder.EMBED_TRANSITIVE );
         if ( Boolean.valueOf( embedTransitive ).booleanValue() )
@@ -1598,22 +1597,22 @@
         // pass maven source paths onto BND analyzer
         StringBuilder mavenSourcePaths = new StringBuilder();
         StringBuilder mavenTestSourcePaths = new StringBuilder();
-        Map<StringBuilder, List<?>> map = new HashMap<StringBuilder, List<?>>(2);
+        Map<StringBuilder, List<String>> map = new HashMap<StringBuilder, List<String>>(2);
         map.put(mavenSourcePaths, currentProject.getCompileSourceRoots() );
         map.put(mavenTestSourcePaths, currentProject.getTestCompileSourceRoots() );
-        for ( Map.Entry<StringBuilder, List<?>> entry : map.entrySet() )
+        for ( Map.Entry<StringBuilder, List<String>> entry : map.entrySet() )
         {
-            List<?> compileSourceRoots = entry.getValue();
+            List<String> compileSourceRoots = entry.getValue();
             if ( compileSourceRoots != null )
             {
                 StringBuilder sourcePaths = entry.getKey();
-                for ( Iterator i = compileSourceRoots.iterator(); i.hasNext(); )
+                for ( Iterator<String> i = compileSourceRoots.iterator(); i.hasNext(); )
                 {
                     if ( sourcePaths.length() > 0 )
                     {
                         sourcePaths.append( ',' );
                     }
-                    sourcePaths.append( ( String ) i.next() );
+                    sourcePaths.append( i.next() );
                 }
             }
         }
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/DependencyEmbedder.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/DependencyEmbedder.java
index 0f5578a..c83d3a2 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/DependencyEmbedder.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/DependencyEmbedder.java
@@ -34,7 +34,7 @@
 
 /**
  * Add BND directives to embed selected dependencies inside a bundle
- * 
+ *
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public final class DependencyEmbedder extends AbstractDependencyFilter
@@ -54,29 +54,22 @@
     private String m_embedStripVersion;
 
     /**
-     * Maven logger.
-     */
-    private final Log m_log;
-
-    /**
      * Inlined paths.
      */
-    private final Collection m_inlinedPaths;
+    private final Collection<String> m_inlinedPaths;
 
     /**
      * Embedded artifacts.
      */
-    private final Collection m_embeddedArtifacts;
+    private final Collection<Artifact> m_embeddedArtifacts;
 
 
-    public DependencyEmbedder( Log log, Collection dependencyArtifacts )
+    public DependencyEmbedder( Log log, Collection<Artifact> dependencyArtifacts )
     {
         super( dependencyArtifacts );
 
-        m_log = log;
-
-        m_inlinedPaths = new LinkedHashSet();
-        m_embeddedArtifacts = new LinkedHashSet();
+        m_inlinedPaths = new LinkedHashSet<String>();
+        m_embeddedArtifacts = new LinkedHashSet<Artifact>();
     }
 
 
@@ -98,13 +91,13 @@
 
             processInstructions( embedDependencyHeader );
 
-            for ( Iterator i = m_inlinedPaths.iterator(); i.hasNext(); )
+            for ( Iterator<String> i = m_inlinedPaths.iterator(); i.hasNext(); )
             {
-                inlineDependency( ( String ) i.next(), includeResource );
+                inlineDependency( i.next(), includeResource );
             }
-            for ( Iterator i = m_embeddedArtifacts.iterator(); i.hasNext(); )
+            for ( Iterator<Artifact> i = m_embeddedArtifacts.iterator(); i.hasNext(); )
             {
-                embedDependency( ( Artifact ) i.next(), includeResource, bundleClassPath, embeddedArtifacts );
+                embedDependency( i.next(), includeResource, bundleClassPath, embeddedArtifacts );
             }
         }
 
@@ -124,7 +117,7 @@
 
 
     @Override
-    protected void processDependencies( Collection dependencies, String inline )
+    protected void processDependencies( Collection<Artifact> dependencies, String inline )
     {
         if ( null == inline || "false".equalsIgnoreCase( inline ) )
         {
@@ -132,15 +125,15 @@
         }
         else
         {
-            for ( Iterator i = dependencies.iterator(); i.hasNext(); )
+            for ( Iterator<Artifact> i = dependencies.iterator(); i.hasNext(); )
             {
-                addInlinedPaths( ( Artifact ) i.next(), inline, m_inlinedPaths );
+                addInlinedPaths( i.next(), inline, m_inlinedPaths );
             }
         }
     }
 
 
-    private static void addInlinedPaths( Artifact dependency, String inline, Collection inlinedPaths )
+    private static void addInlinedPaths( Artifact dependency, String inline, Collection<String> inlinedPaths )
     {
         File path = dependency.getFile();
         if ( null != path && path.exists() )
@@ -252,13 +245,13 @@
     }
 
 
-    public Collection getInlinedPaths()
+    public Collection<String> getInlinedPaths()
     {
         return m_inlinedPaths;
     }
 
 
-    public Collection getEmbeddedArtifacts()
+    public Collection<Artifact> getEmbeddedArtifacts()
     {
         return m_embeddedArtifacts;
     }
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/DependencyExcluder.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/DependencyExcluder.java
index dedd93d..1bcc8b1 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/DependencyExcluder.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/DependencyExcluder.java
@@ -22,12 +22,13 @@
 import java.util.Collection;
 import java.util.HashSet;
 
+import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.MojoExecutionException;
 
 
 /**
  * Exclude selected dependencies from the classpath passed to BND.
- * 
+ *
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public final class DependencyExcluder extends AbstractDependencyFilter
@@ -35,14 +36,14 @@
     /**
      * Excluded artifacts.
      */
-    private final Collection m_excludedArtifacts;
+    private final Collection<Artifact> m_excludedArtifacts;
 
 
-    public DependencyExcluder( Collection dependencyArtifacts )
+    public DependencyExcluder( Collection<Artifact> dependencyArtifacts )
     {
         super( dependencyArtifacts );
 
-        m_excludedArtifacts = new HashSet();
+        m_excludedArtifacts = new HashSet<Artifact>();
     }
 
 
@@ -58,13 +59,13 @@
 
 
     @Override
-    protected void processDependencies( Collection dependencies, String inline )
+    protected void processDependencies( Collection<Artifact> dependencies, String inline )
     {
         m_excludedArtifacts.addAll( dependencies );
     }
 
 
-    public Collection getExcludedArtifacts()
+    public Collection<Artifact> getExcludedArtifacts()
     {
         return m_excludedArtifacts;
     }
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/InstructionsPlugin.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/InstructionsPlugin.java
index 55ae76e..baf69d3 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/InstructionsPlugin.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/InstructionsPlugin.java
@@ -34,14 +34,15 @@
 
 /**
  * Generate BND instructions for this project
- * 
+ *
  * @goal instructions
  * @requiresDependencyResolution test
  * @threadSafe
  */
 public class InstructionsPlugin extends BundlePlugin
 {
-    protected void execute( MavenProject project, Map instructions, Properties properties, Jar[] classpath )
+    @Override
+    protected void execute( MavenProject project, Map<String, String> instructions, Properties properties, Jar[] classpath )
         throws MojoExecutionException
     {
         if ( dumpInstructions == null )
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ManifestPlugin.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ManifestPlugin.java
index 4bac2ab..de70107 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ManifestPlugin.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ManifestPlugin.java
@@ -43,7 +43,7 @@
 
 /**
  * Generate an OSGi manifest for this project
- * 
+ *
  * @goal manifest
  * @phase process-classes
  * @requiresDependencyResolution test
@@ -52,7 +52,7 @@
 public class ManifestPlugin extends BundlePlugin
 {
     /**
-     * When true, generate the manifest by rebuilding the full bundle in memory 
+     * When true, generate the manifest by rebuilding the full bundle in memory
      *
      * @parameter expression="${rebuildBundle}"
      */
@@ -60,7 +60,7 @@
 
 
     @Override
-    protected void execute( MavenProject project, Map instructions, Properties properties, Jar[] classpath )
+    protected void execute( MavenProject project, Map<String, String> instructions, Properties properties, Jar[] classpath )
         throws MojoExecutionException
     {
         Manifest manifest;
@@ -104,11 +104,11 @@
     public Manifest getManifest( MavenProject project, Jar[] classpath ) throws IOException, MojoFailureException,
         MojoExecutionException, Exception
     {
-        return getManifest( project, new LinkedHashMap(), new Properties(), classpath );
+        return getManifest( project, new LinkedHashMap<String, String>(), new Properties(), classpath );
     }
 
 
-    public Manifest getManifest( MavenProject project, Map instructions, Properties properties, Jar[] classpath )
+    public Manifest getManifest( MavenProject project, Map<String, String> instructions, Properties properties, Jar[] classpath )
         throws IOException, MojoFailureException, MojoExecutionException, Exception
     {
         Analyzer analyzer = getAnalyzer( project, instructions, properties, classpath );
@@ -152,11 +152,11 @@
     protected Analyzer getAnalyzer( MavenProject project, Jar[] classpath ) throws IOException, MojoExecutionException,
         Exception
     {
-        return getAnalyzer( project, new LinkedHashMap(), new Properties(), classpath );
+        return getAnalyzer( project, new LinkedHashMap<String, String>(), new Properties(), classpath );
     }
 
 
-    protected Analyzer getAnalyzer( MavenProject project, Map instructions, Properties properties, Jar[] classpath )
+    protected Analyzer getAnalyzer( MavenProject project, Map<String, String> instructions, Properties properties, Jar[] classpath )
         throws IOException, MojoExecutionException, Exception
     {
         if ( rebuildBundle && supportedProjectTypes.contains( project.getArtifact().getType() ) )
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ManifestWriter.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ManifestWriter.java
index d90dfda9..7999789 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ManifestWriter.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ManifestWriter.java
@@ -196,55 +196,4 @@
             writeEntry(out, entry.getKey(), entry.getValue(), nice);
         }
     }
-
-    private static Manifest clean(Manifest org) {
-
-        Manifest result = new Manifest();
-        for (Map.Entry< ? , ? > entry : org.getMainAttributes().entrySet()) {
-            String nice = clean((String) entry.getValue());
-            result.getMainAttributes().put(entry.getKey(), nice);
-        }
-        for (String name : org.getEntries().keySet()) {
-            Attributes attrs = result.getAttributes(name);
-            if (attrs == null) {
-                attrs = new Attributes();
-                result.getEntries().put(name, attrs);
-            }
-
-            for (Map.Entry< ? , ? > entry : org.getAttributes(name).entrySet()) {
-                String nice = clean((String) entry.getValue());
-                attrs.put(entry.getKey(), nice);
-            }
-        }
-        return result;
-    }
-
-    private static String clean(String s) {
-        StringBuilder sb = new StringBuilder(s);
-        boolean changed = false;
-        boolean replacedPrev = false;
-        for ( int i=0; i<sb.length(); i++) {
-            char c = s.charAt(i);
-            switch(c) {
-            case 0:
-            case '\n':
-            case '\r':
-                changed = true;
-                if ( !replacedPrev ) {
-                    sb.replace(i, i+1, " ");
-                    replacedPrev= true;
-                } else
-                    sb.delete(i, i+1);
-                break;
-            default:
-                replacedPrev = false;
-                break;
-            }
-        }
-        if ( changed)
-            return sb.toString();
-        else
-            return s;
-    }
-
 }
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ScrPlugin.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ScrPlugin.java
index f3fc73b..746e516 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ScrPlugin.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/ScrPlugin.java
@@ -26,15 +26,9 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeSet;
-import java.util.regex.Pattern;
 
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerFactory;
@@ -42,17 +36,10 @@
 import javax.xml.transform.stream.StreamSource;
 
 import aQute.bnd.osgi.Analyzer;
-import aQute.bnd.osgi.Descriptors.PackageRef;
-import aQute.bnd.osgi.Jar;
 import aQute.bnd.osgi.Processor;
 import aQute.bnd.osgi.Resource;
 import aQute.bnd.service.AnalyzerPlugin;
 import aQute.libg.generics.Create;
-import org.apache.felix.utils.manifest.Attribute;
-import org.apache.felix.utils.manifest.Clause;
-import org.osgi.framework.Constants;
-
-import static org.apache.felix.utils.manifest.Parser.parseHeader;
 
 
 public class ScrPlugin implements AnalyzerPlugin
diff --git a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/VersionCleanerPlugin.java b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/VersionCleanerPlugin.java
index 05e7c0d..04c0f2b 100644
--- a/bundleplugin/src/main/java/org/apache/felix/bundleplugin/VersionCleanerPlugin.java
+++ b/bundleplugin/src/main/java/org/apache/felix/bundleplugin/VersionCleanerPlugin.java
@@ -45,7 +45,7 @@
      *
      * @parameter
      */
-    private Map versions = new LinkedHashMap();
+    private Map<String, String> versions = new LinkedHashMap<String, String>();
 
     /**
      * The Maven project.
@@ -73,10 +73,9 @@
 
     public void execute() throws MojoExecutionException, MojoFailureException
     {
-        for ( Object key : versions.keySet() )
+        for ( String name : versions.keySet() )
         {
-            String name = ( String ) key;
-            String version = ( String ) versions.get( key );
+            String version = versions.get( name );
             String osgi = maven2OsgiConverter.getVersion( version );
             project.getProperties().put( name, osgi );
         }
