Bug 324774 -  Update Framework source code for generics
diff --git a/bundles/org.eclipse.osgi.tests/test_files/genericCapability/p1.osgi.MF b/bundles/org.eclipse.osgi.tests/test_files/genericCapability/p1.osgi.MF
index 6a58119..1eb6b50 100644
--- a/bundles/org.eclipse.osgi.tests/test_files/genericCapability/p1.osgi.MF
+++ b/bundles/org.eclipse.osgi.tests/test_files/genericCapability/p1.osgi.MF
@@ -3,7 +3,7 @@
 Bundle-SymbolicName: p1.osgi
 Bundle-Version: 1.0
 Provide-Capability: 
- namespace.1; rank:Long="100"; percent:Double="0.10"; test.version:Version="1.0.0"; test.string="ABC",
- namespace.2; rank:Long="100"; percent:Double="0.10"; test.version:Version="1.0.0"; test.string="ABC",
- namespace.3; rank:Long="100"; percent:Double="0.10"; test.version:Version="1.0.0"; test.string="ABC"
+ namespace.1; rank:Long="100"; percent:Double="0.10"; test.version:Version="1.0.0"; test.string="ABC"; long.list:List<Long>="1,2,3"; double.list:List<Double>="0.1,0.2,0.3"; version.list:List<Version>="1.0, 2.0, 3.0"; string.list:List="A, B, C",
+ namespace.2; rank:Long="100"; percent:Double="0.10"; test.version:Version="1.0.0"; test.string="ABC"; long.list:List<Long>="1,2,3"; double.list:List<Double>="0.1,0.2,0.3"; version.list:List<Version>="1.0, 2.0, 3.0"; string.list:List="A, B, C",
+ namespace.3; rank:Long="100"; percent:Double="0.10"; test.version:Version="1.0.0"; test.string="ABC"; long.list:List<Long>="1,2,3"; double.list:List<Double>="0.1,0.2,0.3"; version.list:List<Version>="1.0, 2.0, 3.0"; string.list:List="A, B, C"
 
diff --git a/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/ExportPackageDescription.java b/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/ExportPackageDescription.java
index 9aff124..c857576 100644
--- a/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/ExportPackageDescription.java
+++ b/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/ExportPackageDescription.java
@@ -37,13 +37,13 @@
 	 * Returns the arbitrary attributes for this package.
 	 * @return the arbitrary attributes for this package
 	 */
-	public Map<String, String> getAttributes();
+	public Map<String, Object> getAttributes();
 
 	/**
 	 * Returns the directives for this package.
 	 * @return the directives for this package
 	 */
-	public Map<String, String> getDirectives();
+	public Map<String, Object> getDirectives();
 
 	/**
 	 * Returns the specified directive for this package.
diff --git a/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/GenericDescription.java b/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/GenericDescription.java
index ea73606..8f091ae 100644
--- a/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/GenericDescription.java
+++ b/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/GenericDescription.java
@@ -28,7 +28,7 @@
 	 * Returns the arbitrary attributes for this description
 	 * @return the arbitrary attributes for this description
 	 */
-	public Dictionary<String, String> getAttributes();
+	public Dictionary<String, Object> getAttributes();
 
 	/**
 	 * Returns the type of generic description capability
diff --git a/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/ImportPackageSpecification.java b/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/ImportPackageSpecification.java
index 6589440..09da758 100644
--- a/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/ImportPackageSpecification.java
+++ b/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/ImportPackageSpecification.java
@@ -53,13 +53,13 @@
 	 * Returns the arbitrary attributes which this import package may be resolved to.
 	 * @return the arbitrary attributes which this import package may be resolved to.
 	 */
-	public Map<String, String> getAttributes();
+	public Map<String, Object> getAttributes();
 
 	/**
 	 * Returns the directives that control this import package.
 	 * @return the directives that control this import package.
 	 */
-	public Map<String, String> getDirectives();
+	public Map<String, Object> getDirectives();
 
 	/**
 	 * Returns the specified directive that control this import package.
diff --git a/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/Resolver.java b/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/Resolver.java
index 842a8ec..24bed1c 100644
--- a/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/Resolver.java
+++ b/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/Resolver.java
@@ -46,7 +46,7 @@
 	 * against.  A <tt>null</tt> value indicates that the system properties should
 	 * be used to match against
 	 */
-	public void resolve(BundleDescription[] discard, Dictionary<String, String>[] platformProperties);
+	public void resolve(BundleDescription[] discard, Dictionary<Object, Object>[] platformProperties);
 
 	/**
 	 * Flushes this resolver of any stored/cached data it may be keeping to
diff --git a/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/State.java b/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/State.java
index 2602b88..3bd9b83 100644
--- a/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/State.java
+++ b/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/State.java
@@ -459,7 +459,7 @@
 	 * supported properties already set.  If any of the supported property values 
 	 * are changed as a result of calling this method then true is returned.
 	 */
-	public boolean setPlatformProperties(Dictionary<String, String> platformProperties);
+	public boolean setPlatformProperties(Dictionary<?, ?> platformProperties);
 
 	/**
 	 * Sets the platform properties of the state to a list of platform properties.  
@@ -470,13 +470,14 @@
 	 * supported properties already set.  If any of the supported property values 
 	 * are changed as a result of calling this method then true is returned.
 	 */
-	public boolean setPlatformProperties(Dictionary<String, String>[] platformProperties);
+	public boolean setPlatformProperties(Dictionary<?, ?>[] platformProperties);
 
 	/**
 	 * Returns the list of platform properties currently set for this state.
 	 * @return the list of platform properties currently set for this state.
 	 */
-	public Dictionary<String, String>[] getPlatformProperties();
+	@SuppressWarnings("rawtypes")
+	public Dictionary[] getPlatformProperties();
 
 	/**
 	 * Returns the list of system packages which are exported by the system bundle.  
diff --git a/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/StateObjectFactory.java b/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/StateObjectFactory.java
index b87f571..c9585c6 100644
--- a/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/StateObjectFactory.java
+++ b/bundles/org.eclipse.osgi/core/adaptor/org/eclipse/osgi/service/resolver/StateObjectFactory.java
@@ -246,7 +246,7 @@
 	 * @param importer the importing bundle (may be <code>null</code>)
 	 * @return the created package specification
 	 */
-	public ImportPackageSpecification createImportPackageSpecification(String packageName, VersionRange versionRange, String bundleSymbolicName, VersionRange bundleVersionRange, Map<String, String> directives, Map<String, String> attributes, BundleDescription importer);
+	public ImportPackageSpecification createImportPackageSpecification(String packageName, VersionRange versionRange, String bundleSymbolicName, VersionRange bundleVersionRange, Map<String, ?> directives, Map<String, ?> attributes, BundleDescription importer);
 
 	/**
 	 * Creates an import package specification that is a copy of the given import package
@@ -268,7 +268,7 @@
 	 * @param exporter the exporter of the package (may be <code>null</code>)
 	 * @return the created package
 	 */
-	public ExportPackageDescription createExportPackageDescription(String packageName, Version version, Map<String, String> directives, Map<String, String> attributes, boolean root, BundleDescription exporter);
+	public ExportPackageDescription createExportPackageDescription(String packageName, Version version, Map<String, ?> directives, Map<String, ?> attributes, boolean root, BundleDescription exporter);
 
 	/**
 	 * Creates a generic description from the given parameters
@@ -279,7 +279,7 @@
 	 * @return the created generic description
 	 * @deprecated use {@link #createGenericDescription(String, String, Version, Map)}
 	 */
-	public GenericDescription createGenericDescription(String name, String type, Version version, Map<String, String> attributes);
+	public GenericDescription createGenericDescription(String name, String type, Version version, Map<String, ?> attributes);
 
 	/**
 	 * Creates a generic description from the given parameters
@@ -290,7 +290,7 @@
 	 * @return the created generic description
 	 * @since 3.7
 	 */
-	public GenericDescription createGenericDescription(String type, Map<String, String> attributes, Map<String, String> directives, BundleDescription supplier);
+	public GenericDescription createGenericDescription(String type, Map<String, ?> attributes, Map<String, String> directives, BundleDescription supplier);
 
 	/**
 	 * Creates a generic specification from the given parameters
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/GroupingChecker.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/GroupingChecker.java
index f866170..c1f04c2 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/GroupingChecker.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/GroupingChecker.java
@@ -40,7 +40,7 @@
 		// must check resolved imports to get any dynamically resolved imports
 		ExportPackageDescription[] imports = bundle.getBundleDescription().getResolvedImports();
 		for (ExportPackageDescription importPkg : imports) {
-			ResolverExport[] exports = bundle.getResolver().getResolverExports().get(importPkg.getName());
+			List<ResolverExport> exports = bundle.getResolver().getResolverExports().get(importPkg.getName());
 			for (ResolverExport export : exports) {
 				if (export.getExportPackageDescription() == importPkg)
 					isConsistentInternal(bundle, export, true, null);
@@ -173,7 +173,7 @@
 			for (ExportPackageDescription importPkg : imports) {
 				if (importPkg.getExporter() == bundle.getBundleDescription() || !importPkg.getName().equals(packageName))
 					continue;
-				ResolverExport[] exports = bundle.getResolver().getResolverExports().get(packageName);
+				List<ResolverExport> exports = bundle.getResolver().getResolverExports().get(packageName);
 				for (ResolverExport export : exports) {
 					if (export.getExportPackageDescription() == importPkg)
 						return getPackageRoots(export.getExporter(), packageName, visited);
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/MappedList.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/MappedList.java
index 9bbc74b..a104a24 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/MappedList.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/MappedList.java
@@ -10,7 +10,6 @@
  *******************************************************************************/
 package org.eclipse.osgi.internal.module;
 
-import java.lang.reflect.Array;
 import java.util.*;
 
 /*
@@ -20,63 +19,43 @@
  */
 public class MappedList<K, V> {
 	// the mapping with key -> Object[] mapping
-	protected final HashMap<K, Object> internal = new HashMap();
-	protected final Class<V> valueClass;
-	protected final V[] empty;
-
-	public MappedList(Class<V> valueClass) {
-		this.valueClass = valueClass;
-		empty = (V[]) Array.newInstance(valueClass, 0);
-	}
+	protected final HashMap<K, List<V>> internal = new HashMap<K, List<V>>();
+	@SuppressWarnings("unchecked")
+	protected final List<V> empty = Collections.EMPTY_LIST;
 
 	public void put(K key, V value) {
-		Object existing = internal.get(key);
+		List<V> existing = internal.get(key);
 		if (existing == null) {
-			internal.put(key, value);
-		} else {
-			V[] existingValues;
-			if (existing.getClass().isArray()) {
-				existingValues = (V[]) existing;
-			} else {
-				existingValues = (V[]) Array.newInstance(valueClass, 1);
-				existingValues[0] = (V) existing;
-			}
-			// insert the new value
-			int index = insertionIndex(existingValues, value);
-			V[] newValues = (V[]) Array.newInstance(valueClass, existingValues.length + 1);
-			System.arraycopy(existingValues, 0, newValues, 0, index);
-			newValues[index] = value;
-			System.arraycopy(existingValues, index, newValues, index + 1, existingValues.length - index);
-			internal.put(key, newValues); // overwrite the old values in the map
+			existing = new ArrayList<V>(1);
+			existing.add(value);
+			internal.put(key, existing);
+			return;
 		}
+		// insert the new value
+		int index = insertionIndex(existing, value);
+		existing.add(index, value);
 	}
 
-	protected int insertionIndex(V[] existing, V value) {
+	protected int insertionIndex(List<V> existing, V value) {
 		// a MappedList is by default not sorted so just insert at the end
 		// extending classes may override this method to provide an index that retains sorted order
-		return existing.length;
+		return existing.size();
 	}
 
 	// removes all values with the specified key
-	public V[] remove(K key) {
+	public List<V> remove(K key) {
 		return get(key, true);
 	}
 
 	// gets all values with the specified key
-	public V[] get(K key) {
+	public List<V> get(K key) {
 		return get(key, false);
 	}
 
 	// gets all values with the specified and optionally removes them
-	private V[] get(K key, boolean remove) {
-		Object result = remove ? internal.remove(key) : internal.get(key);
-		if (result != null && result.getClass().isArray())
-			return (V[]) result;
-		if (result == null)
-			return empty;
-		V[] singleValue = (V[]) Array.newInstance(valueClass, 1);
-		singleValue[0] = (V) result;
-		return singleValue;
+	private List<V> get(K key, boolean remove) {
+		List<V> result = remove ? internal.remove(key) : internal.get(key);
+		return result == null ? empty : result;
 	}
 
 	// returns the number of keyed lists
@@ -85,21 +64,14 @@
 	}
 
 	// returns all values of all keys
-	public V[] getAllValues() {
+	public List<V> getAllValues() {
 		if (getSize() == 0)
 			return empty;
-		ArrayList<V> results = new ArrayList(getSize());
-		Iterator iter = internal.values().iterator();
-		while (iter.hasNext()) {
-			Object value = iter.next();
-			if (value.getClass().isArray()) {
-				Object[] values = (Object[]) value;
-				for (int i = 0; i < values.length; i++)
-					results.add((V) values[i]);
-			} else
-				results.add((V) value);
-		}
-		return results.toArray(empty);
+		ArrayList<V> results = new ArrayList<V>(getSize());
+		Iterator<List<V>> iter = internal.values().iterator();
+		while (iter.hasNext())
+			results.addAll(iter.next());
+		return results;
 	}
 
 	// removes all keys from the map
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverBundle.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverBundle.java
index 7ea8c94..5bef040 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverBundle.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverBundle.java
@@ -21,7 +21,7 @@
 /*
  * A companion to BundleDescription from the state used while resolving.
  */
-public class ResolverBundle extends VersionSupplier implements Comparable, BundleRevision {
+public class ResolverBundle extends VersionSupplier implements Comparable<ResolverBundle>, BundleRevision {
 	public static final int UNRESOLVED = 0;
 	public static final int RESOLVING = 1;
 	public static final int RESOLVED = 2;
@@ -48,7 +48,7 @@
 	private final ResolverImpl resolver;
 	private boolean newFragmentExports;
 	private boolean newFragmentCapabilities;
-	private ArrayList refs;
+	private List<ResolverBundle> refs;
 
 	ResolverBundle(BundleDescription bundle, ResolverImpl resolver) {
 		super(bundle);
@@ -59,7 +59,7 @@
 
 	void initialize(boolean useSelectedExports) {
 		if (getBundleDescription().isSingleton())
-			refs = new ArrayList();
+			refs = new ArrayList<ResolverBundle>();
 		if (getBundleDescription().getHost() != null) {
 			host = new BundleConstraint(this, getBundleDescription().getHost());
 			exports = new ResolverExport[0];
@@ -114,13 +114,13 @@
 	}
 
 	ResolverExport[] getExports(String name) {
-		ArrayList results = new ArrayList(1); // rare to have more than one
+		List<ResolverExport> results = new ArrayList<ResolverExport>(1); // rare to have more than one
 		// it is faster to ask the VersionHashMap for this package name and then compare the exporter to this
-		ResolverExport[] resolverExports = resolver.getResolverExports().get(name);
+		List<ResolverExport> resolverExports = resolver.getResolverExports().get(name);
 		for (ResolverExport export : resolverExports)
 			if (export.getExporter() == this)
 				results.add(export);
-		return (ResolverExport[]) results.toArray(new ResolverExport[results.size()]);
+		return results.toArray(new ResolverExport[results.size()]);
 	}
 
 	void clearWires() {
@@ -270,17 +270,17 @@
 
 	private void initFragments() {
 		if (fragments == null)
-			fragments = new ArrayList(1);
+			fragments = new ArrayList<ResolverBundle>(1);
 		if (fragmentExports == null)
-			fragmentExports = new HashMap(1);
+			fragmentExports = new HashMap<Long, List<ResolverExport>>(1);
 		if (fragmentImports == null)
-			fragmentImports = new HashMap(1);
+			fragmentImports = new HashMap<Long, List<ResolverImport>>(1);
 		if (fragmentRequires == null)
-			fragmentRequires = new HashMap(1);
+			fragmentRequires = new HashMap<Long, List<BundleConstraint>>(1);
 		if (fragmentGenericCapabilities == null)
-			fragmentGenericCapabilities = new HashMap(1);
+			fragmentGenericCapabilities = new HashMap<Long, List<GenericCapability>>(1);
 		if (fragmentGenericRequires == null)
-			fragmentGenericRequires = new HashMap(1);
+			fragmentGenericRequires = new HashMap<Long, List<GenericConstraint>>(1);
 	}
 
 	private boolean isImported(String packageName) {
@@ -321,8 +321,8 @@
 		initFragments();
 		// need to make sure there is not already another version of this fragment 
 		// already attached to this host
-		for (Iterator iFragments = fragments.iterator(); iFragments.hasNext();) {
-			ResolverBundle existingFragment = (ResolverBundle) iFragments.next();
+		for (Iterator<ResolverBundle> iFragments = fragments.iterator(); iFragments.hasNext();) {
+			ResolverBundle existingFragment = iFragments.next();
 			String bsn = existingFragment.getName();
 			if (bsn != null && bsn.equals(fragment.getName()))
 				return;
@@ -333,7 +333,7 @@
 		fragment.getHost().addPossibleSupplier(this);
 
 		if (newImports.length > 0) {
-			ArrayList<ResolverImport> hostImports = new ArrayList(newImports.length);
+			ArrayList<ResolverImport> hostImports = new ArrayList<ResolverImport>(newImports.length);
 			for (int i = 0; i < newImports.length; i++)
 				if (!isImported(newImports[i].getName()))
 					hostImports.add(new ResolverImport(this, newImports[i]));
@@ -341,7 +341,7 @@
 		}
 
 		if (newRequires.length > 0) {
-			ArrayList<BundleConstraint> hostRequires = new ArrayList(newRequires.length);
+			ArrayList<BundleConstraint> hostRequires = new ArrayList<BundleConstraint>(newRequires.length);
 			for (int i = 0; i < newRequires.length; i++)
 				if (!isRequired(newRequires[i].getName()))
 					hostRequires.add(new BundleConstraint(this, newRequires[i]));
@@ -349,13 +349,13 @@
 		}
 
 		if (newGenericRequires.length > 0) {
-			ArrayList hostGenericRequires = new ArrayList(newGenericRequires.length);
+			ArrayList<GenericConstraint> hostGenericRequires = new ArrayList<GenericConstraint>(newGenericRequires.length);
 			for (int i = 0; i < newGenericRequires.length; i++)
 				hostGenericRequires.add(new GenericConstraint(this, newGenericRequires[i]));
 			fragmentGenericRequires.put(fragment.bundleID, hostGenericRequires);
 		}
 
-		ArrayList<ResolverExport> hostExports = new ArrayList(newExports.length);
+		ArrayList<ResolverExport> hostExports = new ArrayList<ResolverExport>(newExports.length);
 		if (newExports.length > 0 && dynamicAttach) {
 			StateObjectFactory factory = resolver.getState().getFactory();
 			for (int i = 0; i < newExports.length; i++) {
@@ -377,11 +377,11 @@
 		if (newGenericCapabilities.length > 0 && dynamicAttach) {
 			StateObjectFactory factory = resolver.getState().getFactory();
 			for (GenericDescription capability : newGenericCapabilities) {
-				Dictionary origAttrs = capability.getAttributes();
-				Map attrs = new HashMap();
+				Dictionary<String, Object> origAttrs = capability.getAttributes();
+				Map<String, Object> attrs = new HashMap<String, Object>();
 				if (origAttrs != null) {
-					for (Enumeration keys = origAttrs.keys(); keys.hasMoreElements();) {
-						Object key = keys.nextElement();
+					for (Enumeration<String> keys = origAttrs.keys(); keys.hasMoreElements();) {
+						String key = keys.nextElement();
 						attrs.put(key, origAttrs.get(key));
 					}
 				}
@@ -409,15 +409,15 @@
 		return true;
 	}
 
-	public static boolean equivalentMaps(Map existingDirectives, Map newDirectives, boolean exactMatch) {
+	public static boolean equivalentMaps(Map<String, Object> existingDirectives, Map<String, Object> newDirectives, boolean exactMatch) {
 		if (existingDirectives == null && newDirectives == null)
 			return true;
 		if (existingDirectives == null ? newDirectives != null : newDirectives == null)
 			return false;
 		if (exactMatch && existingDirectives.size() != newDirectives.size())
 			return false;
-		for (Iterator entries = existingDirectives.entrySet().iterator(); entries.hasNext();) {
-			Entry entry = (Entry) entries.next();
+		for (Iterator<Entry<String, Object>> entries = existingDirectives.entrySet().iterator(); entries.hasNext();) {
+			Entry<String, Object> entry = entries.next();
 			Object newValue = newDirectives.get(entry.getKey());
 			if (newValue == null || entry.getValue().getClass() != newValue.getClass())
 				return false;
@@ -500,20 +500,20 @@
 			// we need to check the remaining fragment constraints to make sure they do not have
 			// the same unresolved constraint.
 			for (ResolverBundle remainingFrag : fragments) {
-				ArrayList additionalImports = new ArrayList(0);
-				ArrayList additionalRequires = new ArrayList(0);
+				List<ResolverImport> additionalImports = new ArrayList<ResolverImport>(0);
+				List<BundleConstraint> additionalRequires = new ArrayList<BundleConstraint>(0);
 				if (hasUnresolvedConstraint(reason, fragment, remainingFrag, oldImports, oldRequires, additionalImports, additionalRequires))
 					continue;
 				// merge back the additional imports or requires which the detached fragment has in common with the remaining fragment
 				if (additionalImports.size() > 0) {
-					ArrayList remainingImports = (ArrayList) fragmentImports.get(remainingFrag.bundleID);
+					List<ResolverImport> remainingImports = fragmentImports.get(remainingFrag.bundleID);
 					if (remainingImports == null)
 						fragmentImports.put(remainingFrag.bundleID, additionalImports);
 					else
 						remainingImports.addAll(additionalImports);
 				}
 				if (additionalRequires.size() > 0) {
-					ArrayList remainingRequires = (ArrayList) fragmentRequires.get(remainingFrag.bundleID);
+					List<BundleConstraint> remainingRequires = fragmentRequires.get(remainingFrag.bundleID);
 					if (remainingRequires == null)
 						fragmentRequires.put(remainingFrag.bundleID, additionalRequires);
 					else
@@ -530,7 +530,7 @@
 			resolver.removeGenerics(removedCapabilities.toArray(new GenericCapability[removedCapabilities.size()]));
 	}
 
-	private boolean hasUnresolvedConstraint(ResolverConstraint reason, ResolverBundle detachedFragment, ResolverBundle remainingFragment, ResolverImport[] oldImports, BundleConstraint[] oldRequires, ArrayList additionalImports, ArrayList additionalRequires) {
+	private boolean hasUnresolvedConstraint(ResolverConstraint reason, ResolverBundle detachedFragment, ResolverBundle remainingFragment, ResolverImport[] oldImports, BundleConstraint[] oldRequires, List<ResolverImport> additionalImports, List<BundleConstraint> additionalRequires) {
 		ImportPackageSpecification[] remainingFragImports = remainingFragment.getBundleDescription().getImportPackages();
 		BundleSpecification[] remainingFragRequires = remainingFragment.getBundleDescription().getRequiredBundles();
 		VersionConstraint[] constraints;
@@ -626,9 +626,9 @@
 	 * If the other BSN is null then -1 is returned
 	 * otherwise String.compareTo is used
 	 */
-	public int compareTo(Object o) {
+	public int compareTo(ResolverBundle o) {
 		String bsn = getName();
-		String otherBsn = ((ResolverBundle) o).getName();
+		String otherBsn = o.getName();
 		if (bsn == null)
 			return otherBsn == null ? 0 : 1;
 		return otherBsn == null ? -1 : bsn.compareTo(otherBsn);
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java
index 678ccd7..ce9cfc8 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java
@@ -58,7 +58,7 @@
 	// Used to check permissions for import/export, provide/require, host/fragment
 	private final PermissionChecker permissionChecker;
 	// Set of bundles that are pending removal
-	private MappedList<Long, BundleDescription> removalPending = new MappedList<Long, BundleDescription>(BundleDescription.class);
+	private MappedList<Long, BundleDescription> removalPending = new MappedList<Long, BundleDescription>();
 	// Indicates whether this resolver has been initialized
 	private boolean initialized = false;
 
@@ -73,7 +73,7 @@
 	// Keys are BundleDescriptions, values are ResolverBundles
 	private HashMap<BundleDescription, ResolverBundle> bundleMapping = null;
 	private GroupingChecker groupingChecker;
-	private Comparator selectionPolicy;
+	private Comparator<BaseDescription> selectionPolicy;
 	private boolean developmentMode = false;
 	private boolean usesCalculationTimeout = false;
 	private long usesTimeout = -1;
@@ -89,8 +89,8 @@
 
 	// Initializes the resolver
 	private void initialize() {
-		resolverExports = new VersionHashMap<ResolverExport>(this, ResolverExport.class);
-		resolverBundles = new VersionHashMap<ResolverBundle>(this, ResolverBundle.class);
+		resolverExports = new VersionHashMap<ResolverExport>(this);
+		resolverBundles = new VersionHashMap<ResolverBundle>(this);
 		resolverGenerics = new HashMap<String, VersionHashMap<GenericCapability>>();
 		unresolvedBundles = new HashSet<ResolverBundle>();
 		bundleMapping = new HashMap<BundleDescription, ResolverBundle>();
@@ -102,9 +102,9 @@
 		for (int i = 0; i < bundles.length; i++)
 			initResolverBundle(bundles[i], fragmentBundles, false);
 		// Add each removal pending bundle to the resolver's internal state
-		BundleDescription[] removedBundles = removalPending.getAllValues();
-		for (int i = 0; i < removedBundles.length; i++)
-			initResolverBundle(removedBundles[i], fragmentBundles, true);
+		List<BundleDescription> removedBundles = removalPending.getAllValues();
+		for (BundleDescription removed : removedBundles)
+			initResolverBundle(removed, fragmentBundles, true);
 		// Iterate over the resolved fragments and attach them to their hosts
 		for (Iterator<ResolverBundle> iter = fragmentBundles.iterator(); iter.hasNext();) {
 			ResolverBundle fragment = iter.next();
@@ -182,7 +182,7 @@
 			return;
 		}
 		String constraintName = constraint.getName();
-		GenericCapability[] matches = constraintName == null ? namespace.get(constraintName) : namespace.getAllValues();
+		List<GenericCapability> matches = constraintName == null ? namespace.get(constraintName) : namespace.getAllValues();
 		for (GenericCapability match : matches) {
 			for (GenericDescription supplier : suppliers)
 				if (match.getBaseDescription() == supplier)
@@ -215,7 +215,7 @@
 		ResolverExport matchingExport = null;
 		ExportPackageDescription importSupplier = (ExportPackageDescription) imp.getVersionConstraint().getSupplier();
 		ResolverBundle exporter = importSupplier == null ? null : (ResolverBundle) bundleMapping.get(importSupplier.getExporter());
-		ResolverExport[] matches = resolverExports.get(imp.getName());
+		List<ResolverExport> matches = resolverExports.get(imp.getName());
 		for (ResolverExport export : matches) {
 			if (export.getExporter() == exporter && importSupplier == export.getExportPackageDescription()) {
 				matchingExport = export;
@@ -235,7 +235,7 @@
 
 	// Checks a bundle to make sure it is valid.  If this method returns false for
 	// a given bundle, then that bundle will not even be considered for resolution
-	private boolean isResolvable(ResolverBundle bundle, Dictionary[] platformProperties, ArrayList rejectedSingletons, Collection<ResolverBundle> hookDisabled) {
+	private boolean isResolvable(ResolverBundle bundle, Dictionary<Object, Object>[] platformProperties, List<BundleDescription> rejectedSingletons, Collection<ResolverBundle> hookDisabled) {
 		BundleDescription bundleDesc = bundle.getBundleDescription();
 		// check if this is a rejected singleton
 		if (rejectedSingletons.contains(bundleDesc))
@@ -260,15 +260,15 @@
 		}
 		// Check for singletons
 		if (bundleDesc.isSingleton()) {
-			Object[] sameName = resolverBundles.get(bundleDesc.getName());
-			if (sameName.length > 1) {
+			List<ResolverBundle> sameName = resolverBundles.get(bundleDesc.getName());
+			if (sameName.size() > 1) {
 				// Need to check if one is already resolved
-				Collection<Capability> collisionCandidates = new ArrayList<Capability>(sameName.length - 1);
-				for (Object collision : sameName) {
-					if (collision == bundleDesc || !((ResolverBundle) collision).getBundleDescription().isSingleton())
+				Collection<Capability> collisionCandidates = new ArrayList<Capability>(sameName.size() - 1);
+				for (ResolverBundle collision : sameName) {
+					if (collision == bundleDesc || !collision.getBundleDescription().isSingleton())
 						continue; // Ignore the bundle we are resolving and non-singletons
-					if (((ResolverBundle) collision).getBundleDescription().isResolved())
-						collisionCandidates.add((Capability) collision);
+					if (collision.getBundleDescription().isResolved())
+						collisionCandidates.add(collision);
 				}
 				if (hook != null)
 					hook.filterSingletonCollisions(bundle, collisionCandidates);
@@ -331,10 +331,13 @@
 			return false;
 		try {
 			Filter filter = FilterImpl.newInstance(platformFilter);
-			for (int i = 0; i < platformProperties.length; i++)
+			for (int i = 0; i < platformProperties.length; i++) {
 				// using matchCase here in case of duplicate case invarient keys (bug 180817)
-				if (filter.matchCase(platformProperties[i]))
+				@SuppressWarnings("rawtypes")
+				Dictionary props = platformProperties[i];
+				if (filter.matchCase(props))
 					return true;
+			}
 		} catch (InvalidSyntaxException e) {
 			// return false below
 		}
@@ -343,30 +346,29 @@
 	}
 
 	// Attach fragment to its host
-	private void attachFragment(ResolverBundle bundle, ArrayList rejectedSingletons, Collection processedFragments) {
+	private void attachFragment(ResolverBundle bundle, List<BundleDescription> rejectedSingletons, Collection<String> processedFragments) {
 		if (processedFragments.contains(bundle.getName()))
 			return;
 		processedFragments.add(bundle.getName());
 		// we want to attach multiple versions of the same fragment
 		// from highest version to lowest to give the higher versions first pick
 		// of the available host bundles.
-		Object[] fragments = resolverBundles.get(bundle.getName());
-		for (int i = 0; i < fragments.length; i++) {
-			ResolverBundle fragment = (ResolverBundle) fragments[i];
+		List<ResolverBundle> fragments = resolverBundles.get(bundle.getName());
+		for (ResolverBundle fragment : fragments) {
 			if (!fragment.isResolved())
 				attachFragment0(fragment, rejectedSingletons);
 		}
 	}
 
-	private void attachFragment0(ResolverBundle bundle, ArrayList rejectedSingletons) {
+	private void attachFragment0(ResolverBundle bundle, List<BundleDescription> rejectedSingletons) {
 		if (!bundle.isFragment() || !bundle.isResolvable() || rejectedSingletons.contains(bundle.getBundleDescription()))
 			return;
 		// no need to select singletons now; it will be done when we select the rest of the singleton bundles (bug 152042)
 		// find all available hosts to attach to.
 		boolean foundMatch = false;
 		BundleConstraint hostConstraint = bundle.getHost();
-		Object[] hosts = resolverBundles.get(hostConstraint.getVersionConstraint().getName());
-		Collection<ResolverBundle> candidates = new ArrayList(Arrays.asList(hosts));
+		List<ResolverBundle> hosts = resolverBundles.get(hostConstraint.getVersionConstraint().getName());
+		Collection<ResolverBundle> candidates = new ArrayList<ResolverBundle>(hosts);
 		// Must remove candidates that do not match before calling hooks.
 		for (Iterator<ResolverBundle> iCandidates = candidates.iterator(); iCandidates.hasNext();) {
 			ResolverBundle host = iCandidates.next();
@@ -384,7 +386,7 @@
 			state.addResolverError(bundle.getBundleDescription(), ResolverError.MISSING_FRAGMENT_HOST, bundle.getHost().getVersionConstraint().toString(), bundle.getHost().getVersionConstraint());
 	}
 
-	public synchronized void resolve(BundleDescription[] reRefresh, Dictionary[] platformProperties) {
+	public synchronized void resolve(BundleDescription[] reRefresh, Dictionary<Object, Object>[] platformProperties) {
 		if (DEBUG)
 			ResolverImpl.log("*** BEGIN RESOLUTION ***"); //$NON-NLS-1$
 		if (state == null)
@@ -418,7 +420,7 @@
 			// always get the latest EEs
 			getCurrentEEs(platformProperties);
 			// keep a list of rejected singletons
-			ArrayList rejectedSingletons = new ArrayList();
+			List<BundleDescription> rejectedSingletons = new ArrayList<BundleDescription>();
 			boolean resolveOptional = platformProperties.length == 0 ? false : "true".equals(platformProperties[0].get("osgi.resolveOptional")); //$NON-NLS-1$//$NON-NLS-2$
 			ResolverBundle[] currentlyResolved = null;
 			if (resolveOptional) {
@@ -428,13 +430,14 @@
 					currentlyResolved[i] = bundleMapping.get(resolvedBundles[i]);
 			}
 			// attempt to resolve all unresolved bundles
+			@SuppressWarnings("unchecked")
 			Collection<ResolverBundle> hookDisabled = Collections.EMPTY_LIST;
 			if (hook != null) {
 				Collection<BundleRevision> resolvable = new ArrayList<BundleRevision>(unresolvedBundles);
 				int size = resolvable.size();
 				hook.filterResolvable(resolvable);
 				if (resolvable.size() < size) {
-					hookDisabled = new ArrayList(unresolvedBundles);
+					hookDisabled = new ArrayList<ResolverBundle>(unresolvedBundles);
 					hookDisabled.removeAll(resolvable);
 				}
 			}
@@ -449,8 +452,7 @@
 				bundles = unresolvedBundles.toArray(new ResolverBundle[unresolvedBundles.size()]);
 				resolveBundles(bundles, platformProperties, rejectedSingletons, hookDisabled);
 			}
-			for (Iterator rejected = rejectedSingletons.iterator(); rejected.hasNext();) {
-				BundleDescription reject = (BundleDescription) rejected.next();
+			for (BundleDescription reject : rejectedSingletons) {
 				// need to do a bit of work to figure out which bundle got selected
 				BundleDescription[] sameNames = state.getBundles(reject.getSymbolicName());
 				BundleDescription sameName = reject;
@@ -476,7 +478,7 @@
 			return reRefresh; // we don't care about this unless we are in development mode
 		// when in develoment mode we need to reRefresh hosts  of unresolved fragments that add new constraints 
 		// and reRefresh and unresolved bundles that have dependents
-		HashSet additionalRefresh = new HashSet();
+		Set<BundleDescription> additionalRefresh = new HashSet<BundleDescription>();
 		ResolverBundle[] unresolved = unresolvedBundles.toArray(new ResolverBundle[unresolvedBundles.size()]);
 		for (int i = 0; i < unresolved.length; i++) {
 			addUnresolvedWithDependents(unresolved[i], additionalRefresh);
@@ -488,16 +490,16 @@
 		if (reRefresh != null)
 			for (int i = 0; i < reRefresh.length; i++)
 				additionalRefresh.add(reRefresh[i]);
-		return (BundleDescription[]) additionalRefresh.toArray(new BundleDescription[additionalRefresh.size()]);
+		return additionalRefresh.toArray(new BundleDescription[additionalRefresh.size()]);
 	}
 
-	private void addUnresolvedWithDependents(ResolverBundle unresolved, HashSet additionalRefresh) {
+	private void addUnresolvedWithDependents(ResolverBundle unresolved, Set<BundleDescription> additionalRefresh) {
 		BundleDescription[] dependents = unresolved.getBundleDescription().getDependents();
 		if (dependents.length > 0)
 			additionalRefresh.add(unresolved.getBundleDescription());
 	}
 
-	private void addHostsFromFragmentConstraints(ResolverBundle unresolved, Set additionalRefresh) {
+	private void addHostsFromFragmentConstraints(ResolverBundle unresolved, Set<BundleDescription> additionalRefresh) {
 		if (!unresolved.isFragment())
 			return;
 		ImportPackageSpecification[] newImports = unresolved.getBundleDescription().getImportPackages();
@@ -505,12 +507,12 @@
 		if (newImports.length == 0 && newRequires.length == 0)
 			return; // the fragment does not have its own constraints
 		BundleConstraint hostConstraint = unresolved.getHost();
-		Object[] hosts = resolverBundles.get(hostConstraint.getVersionConstraint().getName());
-		for (int j = 0; j < hosts.length; j++)
-			if (hostConstraint.isSatisfiedBy((ResolverBundle) hosts[j]) && ((ResolverBundle) hosts[j]).isResolved())
+		List<ResolverBundle> hosts = resolverBundles.get(hostConstraint.getVersionConstraint().getName());
+		for (ResolverBundle host : hosts)
+			if (hostConstraint.isSatisfiedBy(host) && host.isResolved())
 				// we found a host that is resolved;
 				// add it to the set of bundle to refresh so we can ensure this fragment is allowed to resolve
-				additionalRefresh.add(((ResolverBundle) hosts[j]).getBundleDescription());
+				additionalRefresh.add(host.getBundleDescription());
 
 	}
 
@@ -524,7 +526,7 @@
 	// TODO this does not do proper uses constraint verification.
 	private void resolveOptionalConstraints(ResolverBundle bundle) {
 		BundleConstraint[] requires = bundle.getRequires();
-		ArrayList cycle = new ArrayList();
+		List<ResolverBundle> cycle = new ArrayList<ResolverBundle>();
 		boolean resolvedOptional = false;
 		for (int i = 0; i < requires.length; i++)
 			if (requires[i].isOptional() && requires[i].getSelectedSupplier() == null) {
@@ -548,7 +550,7 @@
 		}
 	}
 
-	private void getCurrentEEs(Dictionary[] platformProperties) {
+	private void getCurrentEEs(Dictionary<Object, Object>[] platformProperties) {
 		CURRENT_EES = new String[platformProperties.length][];
 		for (int i = 0; i < platformProperties.length; i++) {
 			String eeSpecs = (String) platformProperties[i].get(Constants.FRAMEWORK_EXECUTIONENVIRONMENT);
@@ -556,7 +558,7 @@
 		}
 	}
 
-	private void resolveBundles(ResolverBundle[] bundles, Dictionary[] platformProperties, ArrayList rejectedSingletons, Collection<ResolverBundle> hookDisabled) {
+	private void resolveBundles(ResolverBundle[] bundles, Dictionary<Object, Object>[] platformProperties, List<BundleDescription> rejectedSingletons, Collection<ResolverBundle> hookDisabled) {
 		// First check that all the meta-data is valid for each unresolved bundle
 		// This will reset the resolvable flag for each bundle
 		for (int i = 0; i < bundles.length; i++) {
@@ -573,12 +575,12 @@
 		stateResolveBundles(bundles);
 	}
 
-	private void resolveBundles0(ResolverBundle[] bundles, Dictionary[] platformProperties, ArrayList rejectedSingletons) {
+	private void resolveBundles0(ResolverBundle[] bundles, Dictionary<Object, Object>[] platformProperties, List<BundleDescription> rejectedSingletons) {
 		if (developmentMode)
 			// need to sort bundles to keep consistent order for fragment attachment (bug 174930)
 			Arrays.sort(bundles);
 		// First attach all fragments to the matching hosts
-		Collection processedFragments = new HashSet(bundles.length);
+		Collection<String> processedFragments = new HashSet<String>(bundles.length);
 		for (int i = 0; i < bundles.length; i++)
 			attachFragment(bundles[i], rejectedSingletons, processedFragments);
 
@@ -604,11 +606,11 @@
 		checkComposites(bundles, platformProperties, rejectedSingletons);
 	}
 
-	private void checkComposites(ResolverBundle[] bundles, Dictionary[] platformProperties, ArrayList rejectedSingletons) {
+	private void checkComposites(ResolverBundle[] bundles, Dictionary<Object, Object>[] platformProperties, List<BundleDescription> rejectedSingletons) {
 		CompositeResolveHelperRegistry helpers = getCompositeHelpers();
 		if (helpers == null)
 			return;
-		Set exclude = null;
+		Set<ResolverBundle> exclude = null;
 		for (int i = 0; i < bundles.length; i++) {
 			CompositeResolveHelper helper = helpers.getCompositeResolveHelper(bundles[i].getBundleDescription());
 			if (helper == null)
@@ -622,14 +624,14 @@
 				// We pass false for keepFragmentsAttached because we need to redo the attachments (bug 272561)
 				setBundleUnresolved(bundles[i], false, false);
 				if (exclude == null)
-					exclude = new HashSet(1);
+					exclude = new HashSet<ResolverBundle>(1);
 				exclude.add(bundles[i]);
 			}
 		}
 		reResolveBundles(exclude, bundles, platformProperties, rejectedSingletons);
 	}
 
-	private void checkUsesConstraints(ResolverBundle[] bundles, Dictionary[] platformProperties, ArrayList rejectedSingletons) {
+	private void checkUsesConstraints(ResolverBundle[] bundles, Dictionary<Object, Object>[] platformProperties, List<BundleDescription> rejectedSingletons) {
 		List<ResolverConstraint> conflictingConstraints = findBestCombination(bundles, platformProperties);
 		if (conflictingConstraints == null)
 			return;
@@ -661,10 +663,10 @@
 		reResolveBundles(conflictedBundles, bundles, platformProperties, rejectedSingletons);
 	}
 
-	private void reResolveBundles(Set exclude, ResolverBundle[] bundles, Dictionary[] platformProperties, ArrayList rejectedSingletons) {
+	private void reResolveBundles(Set<ResolverBundle> exclude, ResolverBundle[] bundles, Dictionary<Object, Object>[] platformProperties, List<BundleDescription> rejectedSingletons) {
 		if (exclude == null || exclude.size() == 0)
 			return;
-		ArrayList remainingUnresolved = new ArrayList();
+		List<ResolverBundle> remainingUnresolved = new ArrayList<ResolverBundle>();
 		for (int i = 0; i < bundles.length; i++) {
 			if (!exclude.contains(bundles[i])) {
 				// We pass false for keepFragmentsAttached because we need to redo the attachments (bug 272561)
@@ -672,10 +674,10 @@
 				remainingUnresolved.add(bundles[i]);
 			}
 		}
-		resolveBundles0((ResolverBundle[]) remainingUnresolved.toArray(new ResolverBundle[remainingUnresolved.size()]), platformProperties, rejectedSingletons);
+		resolveBundles0(remainingUnresolved.toArray(new ResolverBundle[remainingUnresolved.size()]), platformProperties, rejectedSingletons);
 	}
 
-	private List<ResolverConstraint> findBestCombination(ResolverBundle[] bundles, Dictionary[] platformProperties) {
+	private List<ResolverConstraint> findBestCombination(ResolverBundle[] bundles, Dictionary<Object, Object>[] platformProperties) {
 		Object usesMode = platformProperties.length == 0 ? null : platformProperties[0].get("osgi.resolver.usesMode"); //$NON-NLS-1$
 		if (usesMode == null)
 			usesMode = secureAction.getProperty("osgi.resolver.usesMode"); //$NON-NLS-1$
@@ -979,8 +981,8 @@
 	}
 
 	String getSystemBundle() {
-		Dictionary[] platformProperties = state.getPlatformProperties();
-		String systemBundle = (String) (platformProperties.length == 0 ? null : platformProperties[0].get(Constants.STATE_SYSTEM_BUNDLE));
+		Dictionary<?, ?>[] platformProperties = state.getPlatformProperties();
+		String systemBundle = platformProperties.length == 0 ? null : (String) platformProperties[0].get(Constants.STATE_SYSTEM_BUNDLE);
 		if (systemBundle == null)
 			systemBundle = Constants.getInternalSymbolicName();
 		return systemBundle;
@@ -1071,7 +1073,7 @@
 		}
 	}
 
-	private boolean selectSingletons(ResolverBundle[] bundles, ArrayList rejectedSingletons) {
+	private boolean selectSingletons(ResolverBundle[] bundles, List<BundleDescription> rejectedSingletons) {
 		if (developmentMode)
 			return false; // do no want to unresolve singletons in development mode
 		boolean result = false;
@@ -1079,13 +1081,12 @@
 			BundleDescription bundleDesc = bundles[i].getBundleDescription();
 			if (!bundleDesc.isSingleton() || !bundleDesc.isResolved() || rejectedSingletons.contains(bundleDesc))
 				continue;
-			Object[] sameName = resolverBundles.get(bundleDesc.getName());
-			if (sameName.length > 1) { // Need to make a selection based off of num dependents
-				Collection<ResolverBundle> singletonCollisions = new ArrayList();
-				for (int j = 0; j < sameName.length; j++) {
-					BundleDescription sameNameDesc = ((VersionSupplier) sameName[j]).getBundleDescription();
-					ResolverBundle sameNameBundle = (ResolverBundle) sameName[j];
-					if (sameName[j] == bundles[i] || !sameNameDesc.isSingleton() || !sameNameDesc.isResolved() || rejectedSingletons.contains(sameNameDesc))
+			List<ResolverBundle> sameName = resolverBundles.get(bundleDesc.getName());
+			if (sameName.size() > 1) { // Need to make a selection based off of num dependents
+				Collection<ResolverBundle> singletonCollisions = new ArrayList<ResolverBundle>();
+				for (ResolverBundle sameNameBundle : sameName) {
+					BundleDescription sameNameDesc = sameNameBundle.getBundleDescription();
+					if (sameNameBundle == bundles[i] || !sameNameDesc.isSingleton() || !sameNameDesc.isResolved() || rejectedSingletons.contains(sameNameDesc))
 						continue; // Ignore the bundle we are selecting, non-singletons, and non-resolved
 					singletonCollisions.add(sameNameBundle);
 				}
@@ -1115,8 +1116,8 @@
 		for (int i = 0; i < bundles.length; i++)
 			bundles[i].clearRefs();
 		// unresolve the rejected singletons
-		for (Iterator rejects = rejectedSingletons.iterator(); rejects.hasNext();)
-			unresolveBundle(bundleMapping.get(rejects.next()), false);
+		for (BundleDescription rejected : rejectedSingletons)
+			unresolveBundle(bundleMapping.get(rejected), false);
 		// reorder exports and bundles after unresolving the bundles
 		resolverExports.reorder();
 		resolverBundles.reorder();
@@ -1288,12 +1289,12 @@
 		}
 		VersionHashMap<GenericCapability> namespace = resolverGenerics.get(constraint.getNameSpace());
 		String name = constraint.getName();
-		GenericCapability[] capabilities;
+		List<GenericCapability> capabilities;
 		if (namespace == null)
-			capabilities = new GenericCapability[0];
+			capabilities = Collections.EMPTY_LIST;
 		else
 			capabilities = name == null || "*".equals(name) ? namespace.getAllValues() : namespace.get(name); //$NON-NLS-1$
-		Collection<GenericCapability> candidates = new ArrayList<GenericCapability>(Arrays.asList(capabilities));
+		Collection<GenericCapability> candidates = new ArrayList<GenericCapability>(capabilities);
 		// Must remove candidates that do not match before calling hooks.
 		for (Iterator<GenericCapability> iCandidates = candidates.iterator(); iCandidates.hasNext();) {
 			if (!constraint.isSatisfiedBy(iCandidates.next()))
@@ -1347,8 +1348,8 @@
 				ResolverImpl.log("  - already wired"); //$NON-NLS-1$
 			return true; // Already wired (due to grouping dependencies) so just return
 		}
-		ResolverBundle[] bundles = resolverBundles.get(req.getVersionConstraint().getName());
-		Collection<ResolverBundle> candidates = new ArrayList<ResolverBundle>(Arrays.asList(bundles));
+		List<ResolverBundle> bundles = resolverBundles.get(req.getVersionConstraint().getName());
+		Collection<ResolverBundle> candidates = new ArrayList<ResolverBundle>(bundles);
 		// Must remove candidates that do not match before calling hooks.
 		for (Iterator<ResolverBundle> iCandidates = candidates.iterator(); iCandidates.hasNext();) {
 			if (!req.isSatisfiedBy(iCandidates.next()))
@@ -1410,8 +1411,8 @@
 		}
 		boolean result = false;
 		ResolverExport[] substitutableExps = imp.getBundle().getExports(imp.getName());
-		ResolverExport[] exports = resolverExports.get(imp.getName());
-		Collection<ResolverExport> candidates = new ArrayList<ResolverExport>(Arrays.asList(exports));
+		List<ResolverExport> exports = resolverExports.get(imp.getName());
+		Collection<ResolverExport> candidates = new ArrayList<ResolverExport>(exports);
 		// Must remove candidates that do not match before calling hooks.
 		for (Iterator<ResolverExport> iCandidates = candidates.iterator(); iCandidates.hasNext();) {
 			if (!imp.isSatisfiedBy(iCandidates.next()))
@@ -1575,31 +1576,31 @@
 			stateResolveConstraints(rb);
 		// Gather selected exports
 		ResolverExport[] exports = rb.getSelectedExports();
-		ArrayList selectedExports = new ArrayList(exports.length);
+		List<ExportPackageDescription> selectedExports = new ArrayList<ExportPackageDescription>(exports.length);
 		for (int i = 0; i < exports.length; i++) {
 			if (permissionChecker.checkPackagePermission(exports[i].getExportPackageDescription()))
 				selectedExports.add(exports[i].getExportPackageDescription());
 		}
-		ExportPackageDescription[] selectedExportsArray = (ExportPackageDescription[]) selectedExports.toArray(new ExportPackageDescription[selectedExports.size()]);
+		ExportPackageDescription[] selectedExportsArray = selectedExports.toArray(new ExportPackageDescription[selectedExports.size()]);
 
 		// Gather substitute exports
 		ResolverExport[] substituted = rb.getSubstitutedExports();
-		ArrayList substitutedExports = new ArrayList(substituted.length);
+		List<ExportPackageDescription> substitutedExports = new ArrayList<ExportPackageDescription>(substituted.length);
 		for (int i = 0; i < substituted.length; i++) {
 			substitutedExports.add(substituted[i].getExportPackageDescription());
 		}
-		ExportPackageDescription[] substitutedExportsArray = (ExportPackageDescription[]) substitutedExports.toArray(new ExportPackageDescription[substitutedExports.size()]);
+		ExportPackageDescription[] substitutedExportsArray = substitutedExports.toArray(new ExportPackageDescription[substitutedExports.size()]);
 
 		// Gather exports that have been wired to
 		ExportPackageDescription[] exportsWiredToArray = getExportsWiredTo(rb);
 
 		// Gather bundles that have been wired to
 		BundleConstraint[] requires = rb.getRequires();
-		ArrayList bundlesWiredTo = new ArrayList(requires.length);
+		List<BundleDescription> bundlesWiredTo = new ArrayList<BundleDescription>(requires.length);
 		for (int i = 0; i < requires.length; i++)
 			if (requires[i].getSelectedSupplier() != null)
-				bundlesWiredTo.add(requires[i].getSelectedSupplier().getBaseDescription());
-		BundleDescription[] bundlesWiredToArray = (BundleDescription[]) bundlesWiredTo.toArray(new BundleDescription[bundlesWiredTo.size()]);
+				bundlesWiredTo.add((BundleDescription) requires[i].getSelectedSupplier().getBaseDescription());
+		BundleDescription[] bundlesWiredToArray = bundlesWiredTo.toArray(new BundleDescription[bundlesWiredTo.size()]);
 
 		GenericCapability[] capabilities = rb.getGenericCapabilities();
 		List<GenericDescription> selectedCapabilities = new ArrayList<GenericDescription>(capabilities.length);
@@ -1660,11 +1661,11 @@
 	private static ExportPackageDescription[] getExportsWiredTo(ResolverBundle rb) {
 		// Gather exports that have been wired to
 		ResolverImport[] imports = rb.getImportPackages();
-		ArrayList exportsWiredTo = new ArrayList(imports.length);
+		List<ExportPackageDescription> exportsWiredTo = new ArrayList<ExportPackageDescription>(imports.length);
 		for (int i = 0; i < imports.length; i++)
 			if (imports[i].getSelectedSupplier() != null)
-				exportsWiredTo.add(imports[i].getSelectedSupplier().getBaseDescription());
-		return (ExportPackageDescription[]) exportsWiredTo.toArray(new ExportPackageDescription[exportsWiredTo.size()]);
+				exportsWiredTo.add((ExportPackageDescription) imports[i].getSelectedSupplier().getBaseDescription());
+		return exportsWiredTo.toArray(new ExportPackageDescription[exportsWiredTo.size()]);
 	}
 
 	// Resolve dynamic import
@@ -1699,7 +1700,7 @@
 					found = true;
 					// populate the grouping checker with current imports
 					groupingChecker.populateRoots(resolverImports[j].getBundle());
-					if (resolveImport(resolverImports[j], new ArrayList())) {
+					if (resolveImport(resolverImports[j], new ArrayList<ResolverBundle>())) {
 						found = false;
 						while (!found && resolverImports[j].getSelectedSupplier() != null) {
 							if (groupingChecker.isDynamicConsistent(resolverImports[j].getBundle(), (ResolverExport) resolverImports[j].getSelectedSupplier()) != null)
@@ -1729,11 +1730,11 @@
 			}
 			// this is to support adding dynamic imports on the fly.
 			if (!found) {
-				Map directives = new HashMap(1);
+				Map<String, String> directives = new HashMap<String, String>(1, 1);
 				directives.put(Constants.RESOLUTION_DIRECTIVE, ImportPackageSpecification.RESOLUTION_DYNAMIC);
 				ImportPackageSpecification packageSpec = state.getFactory().createImportPackageSpecification(requestedPackage, null, null, null, directives, null, importingBundle);
 				ResolverImport newImport = new ResolverImport(rb, packageSpec);
-				if (resolveImport(newImport, new ArrayList())) {
+				if (resolveImport(newImport, new ArrayList<ResolverBundle>())) {
 					while (newImport.getSelectedSupplier() != null) {
 						if (groupingChecker.isDynamicConsistent(rb, (ResolverExport) newImport.getSelectedSupplier()) != null)
 							newImport.selectNextSupplier();
@@ -1798,18 +1799,18 @@
 		if (bundle == null)
 			return;
 		// check the removed list if unresolving then remove from the removed list
-		BundleDescription[] removedBundles = removalPending.remove(new Long(bundle.getBundleDescription().getBundleId()));
-		for (int i = 0; i < removedBundles.length; i++) {
-			ResolverBundle re = bundleMapping.get(removedBundles[i]);
+		List<BundleDescription> removedBundles = removalPending.remove(new Long(bundle.getBundleDescription().getBundleId()));
+		for (BundleDescription removedDesc : removedBundles) {
+			ResolverBundle re = bundleMapping.get(removedDesc);
 			unresolveBundle(re, true);
-			state.removeBundleComplete(removedBundles[i]);
+			state.removeBundleComplete(removedDesc);
 			resolverExports.remove(re.getExportPackages());
 			resolverBundles.remove(re);
 			removeGenerics(re.getGenericCapabilities());
-			bundleMapping.remove(removedBundles[i]);
+			bundleMapping.remove(removedDesc);
 			groupingChecker.clear(re);
 			// the bundle is removed
-			if (removedBundles[i] == bundle.getBundleDescription())
+			if (removedDesc == bundle.getBundleDescription())
 				removed = true;
 		}
 
@@ -1843,9 +1844,9 @@
 		resolverGenerics = null;
 		unresolvedBundles = null;
 		bundleMapping = null;
-		BundleDescription[] removed = removalPending.getAllValues();
-		for (int i = 0; i < removed.length; i++)
-			state.removeBundleComplete(removed[i]);
+		List<BundleDescription> removed = removalPending.getAllValues();
+		for (BundleDescription removedDesc : removed)
+			state.removeBundleComplete(removedDesc);
 		removalPending.clear();
 		initialized = false;
 	}
@@ -1879,9 +1880,8 @@
 	// LOGGING METHODS
 	private void printWirings() {
 		ResolverImpl.log("****** Result Wirings ******"); //$NON-NLS-1$
-		Object[] bundles = resolverBundles.getAllValues();
-		for (int j = 0; j < bundles.length; j++) {
-			ResolverBundle rb = (ResolverBundle) bundles[j];
+		List<ResolverBundle> bundles = resolverBundles.getAllValues();
+		for (ResolverBundle rb : bundles) {
 			if (rb.getBundleDescription().isResolved()) {
 				continue;
 			}
@@ -1937,11 +1937,11 @@
 		return resolverExports;
 	}
 
-	public void setSelectionPolicy(Comparator selectionPolicy) {
+	public void setSelectionPolicy(Comparator<BaseDescription> selectionPolicy) {
 		this.selectionPolicy = selectionPolicy;
 	}
 
-	public Comparator getSelectionPolicy() {
+	public Comparator<BaseDescription> getSelectionPolicy() {
 		return selectionPolicy;
 	}
 
@@ -1970,7 +1970,7 @@
 		for (GenericCapability capability : generics) {
 			VersionHashMap<GenericCapability> namespace = resolverGenerics.get(capability.getNamespace());
 			if (namespace == null) {
-				namespace = new VersionHashMap<GenericCapability>(this, GenericCapability.class);
+				namespace = new VersionHashMap<GenericCapability>(this);
 				resolverGenerics.put(capability.getNamespace(), namespace);
 			}
 			namespace.put(capability.getName(), capability);
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/VersionHashMap.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/VersionHashMap.java
index 6e1820e..8773234 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/VersionHashMap.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/VersionHashMap.java
@@ -11,25 +11,24 @@
  *******************************************************************************/
 package org.eclipse.osgi.internal.module;
 
-import java.lang.reflect.Array;
 import java.util.*;
 
-public class VersionHashMap<V extends VersionSupplier> extends MappedList<String, V> implements Comparator {
+public class VersionHashMap<V extends VersionSupplier> extends MappedList<String, V> implements Comparator<V> {
 	private final ResolverImpl resolver;
 	private final boolean preferSystemPackages;
 
-	public VersionHashMap(ResolverImpl resolver, Class<V> valueClass) {
-		super(valueClass);
+	public VersionHashMap(ResolverImpl resolver) {
 		this.resolver = resolver;
 		preferSystemPackages = Boolean.valueOf(ResolverImpl.secureAction.getProperty("osgi.resolver.preferSystemPackages", "true")).booleanValue(); //$NON-NLS-1$//$NON-NLS-2$
 	}
 
 	// assumes existing array is sorted
 	// finds the index where to insert the new value
-	protected int insertionIndex(V[] existing, V value) {
-		int index = existing.length;
-		if (compare(existing[existing.length - 1], value) > 0) {
-			index = Arrays.binarySearch(existing, value, this);
+	protected int insertionIndex(List<V> existing, V value) {
+		int index = existing.size();
+		if (compare(existing.get(existing.size() - 1), value) > 0) {
+			index = Collections.binarySearch(existing, value, this);
+
 			if (index < 0)
 				index = -index - 1;
 		}
@@ -46,32 +45,18 @@
 	}
 
 	private V contains(V vs, boolean remove) {
-		Object existing = internal.get(vs.getName());
+		List<V> existing = internal.get(vs.getName());
 		if (existing == null)
 			return null;
-		if (existing == vs) {
-			if (remove)
-				internal.remove(vs.getName());
+		int index = existing.indexOf(vs);
+		if (index >= 0) {
+			if (remove) {
+				existing.remove(index);
+				if (existing.size() == 0)
+					internal.remove(vs.getName());
+			}
 			return vs;
 		}
-		if (!existing.getClass().isArray())
-			return null;
-		Object[] existingValues = (Object[]) existing;
-		for (int i = 0; i < existingValues.length; i++)
-			if (existingValues[i] == vs) {
-				if (remove) {
-					if (existingValues.length == 2) {
-						internal.put(vs.getName(), existingValues[i == 0 ? 1 : 0]);
-						return vs;
-					}
-					V[] newExisting = (V[]) Array.newInstance(valueClass, existingValues.length - 1);
-					System.arraycopy(existingValues, 0, newExisting, 0, i);
-					if (i + 1 < existingValues.length)
-						System.arraycopy(existingValues, i + 1, newExisting, i, existingValues.length - i - 1);
-					internal.put(vs.getName(), newExisting);
-				}
-				return vs;
-			}
 		return null;
 	}
 
@@ -87,11 +72,10 @@
 	// Once we have resolved bundles, we need to make sure that version suppliers
 	// from the resolved bundles are ahead of those from unresolved bundles
 	void reorder() {
-		for (Iterator it = internal.values().iterator(); it.hasNext();) {
-			Object existing = it.next();
-			if (!existing.getClass().isArray())
-				continue;
-			Arrays.sort((Object[]) existing, this);
+		for (Iterator<List<V>> it = internal.values().iterator(); it.hasNext();) {
+			List<V> existing = it.next();
+			if (existing.size() > 0)
+				Collections.sort(existing, this);
 		}
 	}
 
@@ -100,11 +84,7 @@
 	// First the resolution status of the supplying bundle.
 	// Second is the supplier version.
 	// Third is the bundle id of the supplying bundle.
-	public int compare(Object o1, Object o2) {
-		if (!(o1 instanceof VersionSupplier) || !(o2 instanceof VersionSupplier))
-			throw new IllegalArgumentException();
-		VersionSupplier vs1 = (VersionSupplier) o1;
-		VersionSupplier vs2 = (VersionSupplier) o2;
+	public int compare(V vs1, V vs2) {
 		// if the selection policy is set then use that
 		if (resolver.getSelectionPolicy() != null)
 			return resolver.getSelectionPolicy().compare(vs1.getBaseDescription(), vs2.getBaseDescription());
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/BaseDescriptionImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/BaseDescriptionImpl.java
index 95dce28..497a8b0 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/BaseDescriptionImpl.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/BaseDescriptionImpl.java
@@ -56,7 +56,8 @@
 			String key = entry.getKey();
 			Object value = entry.getValue();
 			if (value instanceof List) {
-				List list = (List) value;
+				@SuppressWarnings("unchecked")
+				List<Object> list = (List<Object>) value;
 				if (list.size() == 0)
 					continue;
 				Object component = list.get(0);
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/BundleDescriptionImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/BundleDescriptionImpl.java
index 5f3694c..445d9fe 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/BundleDescriptionImpl.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/BundleDescriptionImpl.java
@@ -51,9 +51,8 @@
 	private volatile int lazyDataOffset = -1;
 	private volatile int lazyDataSize = -1;
 
-	//TODO These could be arrays
-	private ArrayList dependencies;
-	private ArrayList dependents;
+	private List<BundleDescription> dependencies;
+	private List<BundleDescription> dependents;
 
 	private volatile LazyData lazyData;
 	private volatile int equinox_ee = -1;
@@ -481,7 +480,7 @@
 		synchronized (this.monitor) {
 			if (dependencies == null)
 				return;
-			Iterator iter = dependencies.iterator();
+			Iterator<BundleDescription> iter = dependencies.iterator();
 			while (iter.hasNext()) {
 				((BundleDescriptionImpl) iter.next()).removeDependent(this);
 			}
@@ -494,7 +493,7 @@
 			if (newDependencies == null)
 				return;
 			if (!checkDups && dependencies == null)
-				dependencies = new ArrayList(newDependencies.length);
+				dependencies = new ArrayList<BundleDescription>(newDependencies.length);
 			for (int i = 0; i < newDependencies.length; i++) {
 				addDependency((BaseDescriptionImpl) newDependencies[i], checkDups);
 			}
@@ -507,7 +506,7 @@
 			if (bundle == this)
 				return;
 			if (dependencies == null)
-				dependencies = new ArrayList(10);
+				dependencies = new ArrayList<BundleDescription>(10);
 			if (!checkDups || !dependencies.contains(bundle)) {
 				bundle.addDependent(this);
 				dependencies.add(bundle);
@@ -519,14 +518,14 @@
 	 * Gets all the bundle dependencies as a result of import-package or require-bundle.
 	 * Self and fragment bundles are removed.
 	 */
-	List getBundleDependencies() {
+	List<BundleDescription> getBundleDependencies() {
 		synchronized (this.monitor) {
 			if (dependencies == null)
-				return new ArrayList(0);
-			ArrayList required = new ArrayList(dependencies.size());
-			for (Iterator iter = dependencies.iterator(); iter.hasNext();) {
-				Object dep = iter.next();
-				if (dep != this && dep instanceof BundleDescription && ((BundleDescription) dep).getHost() == null)
+				return new ArrayList<BundleDescription>(0);
+			ArrayList<BundleDescription> required = new ArrayList<BundleDescription>(dependencies.size());
+			for (Iterator<BundleDescription> iter = dependencies.iterator(); iter.hasNext();) {
+				BundleDescription dep = iter.next();
+				if (dep != this && dep.getHost() == null)
 					required.add(dep);
 			}
 			return required;
@@ -544,7 +543,7 @@
 	protected void addDependent(BundleDescription dependent) {
 		synchronized (this.monitor) {
 			if (dependents == null)
-				dependents = new ArrayList(10);
+				dependents = new ArrayList<BundleDescription>(10);
 			// no need to check for duplicates here; this is only called in addDepenency which already checks for dups.
 			dependents.add(dependent);
 		}
@@ -562,7 +561,7 @@
 		synchronized (this.monitor) {
 			if (dependents == null)
 				return EMPTY_BUNDLEDESCS;
-			return (BundleDescription[]) dependents.toArray(new BundleDescription[dependents.size()]);
+			return dependents.toArray(new BundleDescription[dependents.size()]);
 		}
 	}
 
@@ -665,7 +664,7 @@
 		}
 	}
 
-	void setDynamicStamps(HashMap dynamicStamps) {
+	void setDynamicStamps(Map<String, Long> dynamicStamps) {
 		synchronized (this.monitor) {
 			checkLazyData();
 			lazyData.dynamicStamps = dynamicStamps;
@@ -678,7 +677,7 @@
 			if (lazyData.dynamicStamps == null) {
 				if (timestamp == null)
 					return;
-				lazyData.dynamicStamps = new HashMap();
+				lazyData.dynamicStamps = new HashMap<String, Long>();
 			}
 			if (timestamp == null)
 				lazyData.dynamicStamps.remove(requestedPackage);
@@ -695,7 +694,7 @@
 		}
 	}
 
-	HashMap getDynamicStamps() {
+	Map<String, Long> getDynamicStamps() {
 		LazyData currentData = loadLazyData();
 		synchronized (this.monitor) {
 			return currentData.dynamicStamps;
@@ -734,11 +733,11 @@
 		ExportPackageDescription[] substitutedExports;
 		String[] executionEnvironments;
 
-		HashMap dynamicStamps;
+		Map<String, Long> dynamicStamps;
 	}
 
 	public Map<String, String> getDeclaredDirectives() {
-		Map<String, String> result = new HashMap(2);
+		Map<String, String> result = new HashMap<String, String>(2);
 		if (!attachFragments()) {
 			result.put(Constants.FRAGMENT_ATTACHMENT_DIRECTIVE, Constants.FRAGMENT_ATTACHMENT_NEVER);
 		} else {
@@ -753,7 +752,7 @@
 	}
 
 	public Map<String, Object> getDeclaredAttributes() {
-		Map<String, Object> result = new HashMap(1);
+		Map<String, Object> result = new HashMap<String, Object>(1);
 		result.put(Capability.BUNDLE_CAPABILITY, getName());
 		result.put(Constants.BUNDLE_VERSION_ATTRIBUTE, getVersion());
 		return Collections.unmodifiableMap(result);
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ComputeNodeOrder.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ComputeNodeOrder.java
index fd91c05..ecc0680 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ComputeNodeOrder.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ComputeNodeOrder.java
@@ -93,7 +93,7 @@
 			 * 
 			 * Element type: <code>Vertex</code>
 			 */
-			public List adjacent = new ArrayList(3);
+			public List<Vertex> adjacent = new ArrayList<Vertex>(3);
 
 			/**
 			 * Creates a new vertex with the given id.
@@ -110,14 +110,14 @@
 		 * 
 		 * Element type: <code>Vertex</code>
 		 */
-		private List vertexList = new ArrayList(100);
+		private List<Vertex> vertexList = new ArrayList<Vertex>(100);
 
 		/**
 		 * Map from id to vertex.
 		 * 
 		 * Key type: <code>Object</code>; value type: <code>Vertex</code>
 		 */
-		private Map vertexMap = new HashMap(100);
+		private Map<Object, Vertex> vertexMap = new HashMap<Object, Vertex>(100);
 
 		/**
 		 * DFS visit time. Non-negative.
@@ -201,8 +201,8 @@
 			if (initialized) {
 				throw new IllegalArgumentException();
 			}
-			Vertex fromVertex = (Vertex) vertexMap.get(fromId);
-			Vertex toVertex = (Vertex) vertexMap.get(toId);
+			Vertex fromVertex = vertexMap.get(fromId);
+			Vertex toVertex = vertexMap.get(toId);
 			// ignore edges when one of the vertices is unknown
 			if (fromVertex == null || toVertex == null)
 				return;
@@ -221,14 +221,14 @@
 		 * (element type: <code>Object</code>)
 		 * @exception IllegalArgumentException if the graph is not frozen
 		 */
-		public List idsByDFSFinishTime(boolean increasing) {
+		public List<Object> idsByDFSFinishTime(boolean increasing) {
 			if (!initialized) {
 				throw new IllegalArgumentException();
 			}
 			int len = vertexList.size();
 			Object[] r = new Object[len];
-			for (Iterator allV = vertexList.iterator(); allV.hasNext();) {
-				Vertex vertex = (Vertex) allV.next();
+			for (Iterator<Vertex> allV = vertexList.iterator(); allV.hasNext();) {
+				Vertex vertex = allV.next();
 				int f = vertex.finishTime;
 				// note that finish times start at 1, not 0
 				if (increasing) {
@@ -264,15 +264,15 @@
 		 * <code>Object[]</code>)
 		 * @exception IllegalArgumentException if the graph is not frozen
 		 */
-		public List nonTrivialComponents() {
+		public List<Object[]> nonTrivialComponents() {
 			if (!initialized) {
 				throw new IllegalArgumentException();
 			}
 			// find the roots of each component
 			// Map<Vertex,List<Object>> components
-			Map components = new HashMap();
-			for (Iterator it = vertexList.iterator(); it.hasNext();) {
-				Vertex vertex = (Vertex) it.next();
+			Map<Vertex, List<Object>> components = new HashMap<Vertex, List<Object>>();
+			for (Iterator<Vertex> it = vertexList.iterator(); it.hasNext();) {
+				Vertex vertex = it.next();
 				if (vertex.predecessor == null) {
 					// this vertex is the root of a component
 					// if component is non-trivial we will hit a child
@@ -282,18 +282,18 @@
 					while (root.predecessor != null) {
 						root = root.predecessor;
 					}
-					List component = (List) components.get(root);
+					List<Object> component = components.get(root);
 					if (component == null) {
-						component = new ArrayList(2);
+						component = new ArrayList<Object>(2);
 						component.add(root.id);
 						components.put(root, component);
 					}
 					component.add(vertex.id);
 				}
 			}
-			List result = new ArrayList(components.size());
-			for (Iterator it = components.values().iterator(); it.hasNext();) {
-				List component = (List) it.next();
+			List<Object[]> result = new ArrayList<Object[]>(components.size());
+			for (Iterator<List<Object>> it = components.values().iterator(); it.hasNext();) {
+				List<Object> component = it.next();
 				if (component.size() > 1) {
 					result.add(component.toArray());
 				}
@@ -369,10 +369,10 @@
 			// all vertex.predecessor initially null;
 			time = 0;
 			// for a stack, append to the end of an array-based list
-			List stack = new ArrayList(Math.max(1, vertexList.size()));
-			Iterator allAdjacent = null;
+			List<Object> stack = new ArrayList<Object>(Math.max(1, vertexList.size()));
+			Iterator<Vertex> allAdjacent = null;
 			Vertex vertex = null;
-			Iterator allV = vertexList.iterator();
+			Iterator<Vertex> allV = vertexList.iterator();
 			state = NEXT_VERTEX;
 			nextStateLoop: while (true) {
 				switch (state) {
@@ -382,7 +382,7 @@
 							// all done
 							break nextStateLoop;
 						}
-						Vertex nextVertex = (Vertex) allV.next();
+						Vertex nextVertex = allV.next();
 						if (nextVertex.color == Vertex.WHITE) {
 							stack.add(NEXT_VERTEX_OBJECT);
 							vertex = nextVertex;
@@ -403,7 +403,7 @@
 						// on entry, "allAdjacent" contains adjacent vertexes to
 						// be visited; "vertex" contains vertex being visited
 						if (allAdjacent.hasNext()) {
-							Vertex adjVertex = (Vertex) allAdjacent.next();
+							Vertex adjVertex = allAdjacent.next();
 							if (adjVertex.color == Vertex.WHITE) {
 								// explore edge from vertex to adjVertex
 								adjVertex.predecessor = vertex;
@@ -430,7 +430,9 @@
 					case AFTER_NEXTED_DFS_VISIT :
 						// on entry, stack contains "vertex" and "allAjacent"
 						vertex = (Vertex) stack.remove(stack.size() - 1);
-						allAdjacent = (Iterator) stack.remove(stack.size() - 1);
+						@SuppressWarnings("unchecked")
+						Iterator<Vertex> unchecked = (Iterator<Vertex>) stack.remove(stack.size() - 1);
+						allAdjacent = unchecked;
 						state = NEXT_ADJACENT;
 						continue nextStateLoop;
 				}
@@ -484,8 +486,8 @@
 		// interchange "to" and "from" to reverse edges from g1
 		final Digraph g2 = new Digraph();
 		// add vertexes
-		List resortedVertexes = g1.idsByDFSFinishTime(false);
-		for (Iterator it = resortedVertexes.iterator(); it.hasNext();)
+		List<Object> resortedVertexes = g1.idsByDFSFinishTime(false);
+		for (Iterator<Object> it = resortedVertexes.iterator(); it.hasNext();)
 			g2.addVertex(it.next());
 		// add edges
 		for (int i = 0; i < references.length; i++)
@@ -494,14 +496,14 @@
 
 		// Step 3: Return the vertexes in increasing order of depth-first finish
 		// time in g2
-		List sortedProjectList = g2.idsByDFSFinishTime(true);
+		List<Object> sortedProjectList = g2.idsByDFSFinishTime(true);
 		Object[] orderedNodes = new Object[sortedProjectList.size()];
 		sortedProjectList.toArray(orderedNodes);
 		Object[][] knots;
 		boolean hasCycles = g2.containsCycles();
 		if (hasCycles) {
-			List knotList = g2.nonTrivialComponents();
-			knots = (Object[][]) knotList.toArray(new Object[knotList.size()][]);
+			List<Object[]> knotList = g2.nonTrivialComponents();
+			knots = knotList.toArray(new Object[knotList.size()][]);
 		} else {
 			knots = new Object[0][];
 		}
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ExportPackageDescriptionImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ExportPackageDescriptionImpl.java
index a4e9a53..334180e 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ExportPackageDescriptionImpl.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ExportPackageDescriptionImpl.java
@@ -23,7 +23,7 @@
 	public static final String EQUINOX_EE = "x-equinox-ee"; //$NON-NLS-1$
 	private static final Integer EQUINOX_EE_DEFAULT = new Integer(-1);
 	private String[] uses;
-	private Map attributes;
+	private Map<String, Object> attributes;
 	private volatile BundleDescription exporter;
 	private String exclude;
 	private String include;
@@ -33,9 +33,9 @@
 	private int equinox_ee = -1;
 	private volatile int tableIndex;
 
-	public Map getDirectives() {
+	public Map<String, Object> getDirectives() {
 		synchronized (this.monitor) {
-			Map result = new HashMap(7);
+			Map<String, Object> result = new HashMap<String, Object>(7);
 			if (uses != null)
 				result.put(Constants.USES_DIRECTIVE, uses);
 			if (exclude != null)
@@ -53,7 +53,7 @@
 	}
 
 	public Map<String, String> getDeclaredDirectives() {
-		Map<String, String> result = new HashMap(6);
+		Map<String, String> result = new HashMap<String, String>(6);
 		synchronized (this.monitor) {
 			if (uses != null)
 				result.put(Constants.USES_DIRECTIVE, toString(uses));
@@ -72,7 +72,7 @@
 	}
 
 	public Map<String, Object> getDeclaredAttributes() {
-		Map<String, Object> result = new HashMap(2);
+		Map<String, Object> result = new HashMap<String, Object>(2);
 		synchronized (this.monitor) {
 			if (attributes != null)
 				result.putAll(attributes);
@@ -139,7 +139,7 @@
 		}
 	}
 
-	public void setDirectives(Map directives) {
+	public void setDirectives(Map<String, ?> directives) {
 		synchronized (this.monitor) {
 			if (directives == null)
 				return;
@@ -153,7 +153,7 @@
 		}
 	}
 
-	public Map getAttributes() {
+	public Map<String, Object> getAttributes() {
 		synchronized (this.monitor) {
 			return attributes;
 		}
@@ -174,9 +174,10 @@
 		return true;
 	}
 
-	protected void setAttributes(Map attributes) {
+	@SuppressWarnings("unchecked")
+	protected void setAttributes(Map<String, ?> attributes) {
 		synchronized (this.monitor) {
-			this.attributes = attributes;
+			this.attributes = (Map<String, Object>) attributes;
 		}
 	}
 
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/GenericDescriptionImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/GenericDescriptionImpl.java
index 0dc1bcc..b53c563 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/GenericDescriptionImpl.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/GenericDescriptionImpl.java
@@ -18,12 +18,12 @@
 import org.osgi.framework.Version;
 
 public class GenericDescriptionImpl extends BaseDescriptionImpl implements GenericDescription {
-	private Dictionary attributes;
+	private Dictionary<String, Object> attributes;
 	private volatile BundleDescription supplier;
 	private volatile String type = GenericDescription.DEFAULT_TYPE;
 	private Map<String, String> directives;
 
-	public Dictionary getAttributes() {
+	public Dictionary<String, Object> getAttributes() {
 		synchronized (this.monitor) {
 			return attributes;
 		}
@@ -33,7 +33,7 @@
 		return supplier;
 	}
 
-	void setAttributes(Dictionary attributes) {
+	void setAttributes(Dictionary<String, Object> attributes) {
 		synchronized (this.monitor) {
 			this.attributes = attributes;
 		}
@@ -52,7 +52,7 @@
 	public String toString() {
 		StringBuffer sb = new StringBuffer();
 		sb.append(Constants.PROVIDE_CAPABILITY).append(": ").append(getType()); //$NON-NLS-1$
-		Map attrs = getDeclaredAttributes();
+		Map<String, Object> attrs = getDeclaredAttributes();
 		sb.append(toString(attrs, false));
 		return sb.toString();
 	}
@@ -86,6 +86,7 @@
 		return version instanceof Version ? (Version) version : super.getVersion();
 	}
 
+	@SuppressWarnings("unchecked")
 	public Map<String, String> getDeclaredDirectives() {
 		synchronized (this.monitor) {
 			if (directives == null)
@@ -96,13 +97,13 @@
 
 	public Map<String, Object> getDeclaredAttributes() {
 		synchronized (this.monitor) {
-			Map<String, Object> result = new HashMap(5);
+			Map<String, Object> result = new HashMap<String, Object>(5);
 			if (attributes != null)
-				for (Enumeration keys = attributes.keys(); keys.hasMoreElements();) {
-					String key = (String) keys.nextElement();
+				for (Enumeration<String> keys = attributes.keys(); keys.hasMoreElements();) {
+					String key = keys.nextElement();
 					Object value = attributes.get(key);
 					if (value instanceof List)
-						value = Collections.unmodifiableList((List) value);
+						value = Collections.unmodifiableList((List<Object>) value);
 					result.put(key, value);
 				}
 			return Collections.unmodifiableMap(result);
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ImportPackageSpecificationImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ImportPackageSpecificationImpl.java
index 55092c8..edf3107 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ImportPackageSpecificationImpl.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ImportPackageSpecificationImpl.java
@@ -20,11 +20,11 @@
 	private String resolution = ImportPackageSpecification.RESOLUTION_STATIC; // the default is static
 	private String symbolicName;
 	private VersionRange bundleVersionRange;
-	private Map attributes;
+	private Map<String, Object> attributes;
 
-	public Map getDirectives() {
+	public Map<String, Object> getDirectives() {
 		synchronized (this.monitor) {
-			Map result = new HashMap(5);
+			Map<String, Object> result = new HashMap<String, Object>(5);
 			if (resolution != null)
 				result.put(Constants.RESOLUTION_DIRECTIVE, resolution);
 			return result;
@@ -47,7 +47,7 @@
 		}
 	}
 
-	public void setDirectives(Map directives) {
+	public void setDirectives(Map<String, ?> directives) {
 		synchronized (this.monitor) {
 			if (directives == null)
 				return;
@@ -73,7 +73,7 @@
 		}
 	}
 
-	public Map getAttributes() {
+	public Map<String, Object> getAttributes() {
 		synchronized (this.monitor) {
 			return attributes;
 		}
@@ -120,13 +120,13 @@
 		if (getVersionRange() != null && !getVersionRange().isIncluded(pkgDes.getVersion()))
 			return false;
 
-		Map importAttrs = getAttributes();
+		Map<String, ?> importAttrs = getAttributes();
 		if (importAttrs != null) {
-			Map exportAttrs = pkgDes.getAttributes();
+			Map<String, ?> exportAttrs = pkgDes.getAttributes();
 			if (exportAttrs == null)
 				return false;
-			for (Iterator i = importAttrs.keySet().iterator(); i.hasNext();) {
-				String importKey = (String) i.next();
+			for (Iterator<String> i = importAttrs.keySet().iterator(); i.hasNext();) {
+				String importKey = i.next();
 				Object importValue = importAttrs.get(importKey);
 				Object exportValue = exportAttrs.get(importKey);
 				if (exportValue == null || !importValue.equals(exportValue))
@@ -172,9 +172,10 @@
 		}
 	}
 
-	protected void setAttributes(Map attributes) {
+	@SuppressWarnings("unchecked")
+	protected void setAttributes(Map<String, ?> attributes) {
 		synchronized (this.monitor) {
-			this.attributes = attributes;
+			this.attributes = (Map<String, Object>) attributes;
 		}
 	}
 
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/NativeCodeDescriptionImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/NativeCodeDescriptionImpl.java
index f31c7d8..e6d90a2 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/NativeCodeDescriptionImpl.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/NativeCodeDescriptionImpl.java
@@ -82,7 +82,7 @@
 		State containingState = getSupplier().getContainingState();
 		if (containingState == null)
 			return 0;
-		Dictionary[] platformProps = containingState.getPlatformProperties();
+		Dictionary<Object, Object>[] platformProps = containingState.getPlatformProperties();
 		Version osversion;
 		try {
 			osversion = Version.parseVersion((String) platformProps[0].get(Constants.FRAMEWORK_OS_VERSION));
@@ -208,10 +208,12 @@
 		this.supplier = supplier;
 	}
 
+	@SuppressWarnings("unchecked")
 	public Map<String, String> getDeclaredDirectives() {
 		return Collections.EMPTY_MAP;
 	}
 
+	@SuppressWarnings("unchecked")
 	public Map<String, Object> getDeclaredAttributes() {
 		return Collections.EMPTY_MAP;
 	}
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/NativeCodeSpecificationImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/NativeCodeSpecificationImpl.java
index b2401f8..9a808e8 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/NativeCodeSpecificationImpl.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/NativeCodeSpecificationImpl.java
@@ -56,12 +56,14 @@
 		State containingState = getBundle().getContainingState();
 		if (containingState == null)
 			return false;
-		Dictionary[] platformProps = containingState.getPlatformProperties();
+		Dictionary<Object, Object>[] platformProps = containingState.getPlatformProperties();
 		NativeCodeDescription nativeSupplier = (NativeCodeDescription) supplier;
 		Filter filter = nativeSupplier.getFilter();
 		boolean match = false;
 		for (int i = 0; i < platformProps.length && !match; i++) {
-			if (filter != null && !filter.matchCase(platformProps[i]))
+			@SuppressWarnings("rawtypes")
+			Dictionary props = platformProps[i];
+			if (filter != null && !filter.matchCase(props))
 				continue;
 			String[] osNames = nativeSupplier.getOSNames();
 			if (osNames.length == 0)
@@ -71,7 +73,7 @@
 				Object aliasedPlatformOS = platformOS == null || !(platformOS instanceof String) ? platformOS : aliasMapper.aliasOSName((String) platformOS);
 				Object[] platformOSes;
 				if (aliasedPlatformOS instanceof Collection)
-					platformOSes = ((Collection) aliasedPlatformOS).toArray();
+					platformOSes = ((Collection<?>) aliasedPlatformOS).toArray();
 				else
 					platformOSes = aliasedPlatformOS == null ? new Object[0] : new Object[] {aliasedPlatformOS};
 				for (int j = 0; j < osNames.length && !match; j++) {
@@ -81,7 +83,7 @@
 							if (platformOSes[k].equals(aliasedName))
 								match = true;
 						} else {
-							for (Iterator iAliases = ((Collection) aliasedName).iterator(); iAliases.hasNext() && !match;)
+							for (Iterator<?> iAliases = ((Collection<?>) aliasedName).iterator(); iAliases.hasNext() && !match;)
 								if (platformOSes[k].equals(iAliases.next()))
 									match = true;
 						}
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ReadOnlyState.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ReadOnlyState.java
index 03639c8..b252ea6 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ReadOnlyState.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/ReadOnlyState.java
@@ -142,15 +142,15 @@
 		throw new UnsupportedOperationException();
 	}
 
-	public boolean setPlatformProperties(Dictionary platformProperties) {
+	public boolean setPlatformProperties(Dictionary<?, ?> platformProperties) {
 		throw new UnsupportedOperationException();
 	}
 
-	public boolean setPlatformProperties(Dictionary platformProperties[]) {
+	public boolean setPlatformProperties(Dictionary<?, ?> platformProperties[]) {
 		throw new UnsupportedOperationException();
 	}
 
-	public Dictionary[] getPlatformProperties() {
+	public Dictionary<Object, Object>[] getPlatformProperties() {
 		return target.getPlatformProperties();
 	}
 
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateBuilder.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateBuilder.java
index 3f5511d..2b762bb 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateBuilder.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateBuilder.java
@@ -40,9 +40,9 @@
 	private static final String MULTIPLE_ATTR = "multiple"; //$NON-NLS-1$
 	private static final String TRUE = "true"; //$NON-NLS-1$
 
-	static BundleDescription createBundleDescription(StateImpl state, Dictionary manifest, String location) throws BundleException {
+	static BundleDescription createBundleDescription(StateImpl state, Dictionary<String, String> manifest, String location) throws BundleException {
 		BundleDescriptionImpl result = new BundleDescriptionImpl();
-		String manifestVersionHeader = (String) manifest.get(Constants.BUNDLE_MANIFESTVERSION);
+		String manifestVersionHeader = manifest.get(Constants.BUNDLE_MANIFESTVERSION);
 		boolean jreBundle = "true".equals(manifest.get(Constants.Eclipse_JREBUNDLE)); //$NON-NLS-1$
 		int manifestVersion = 1;
 		if (manifestVersionHeader != null)
@@ -51,7 +51,7 @@
 			validateHeaders(manifest, jreBundle);
 
 		// retrieve the symbolic-name and the singleton status
-		String symbolicNameHeader = (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME);
+		String symbolicNameHeader = manifest.get(Constants.BUNDLE_SYMBOLICNAME);
 		if (symbolicNameHeader != null) {
 			ManifestElement[] symbolicNameElements = ManifestElement.parseHeader(Constants.BUNDLE_SYMBOLICNAME, symbolicNameHeader);
 			if (symbolicNameElements.length > 0) {
@@ -73,7 +73,7 @@
 			}
 		}
 		// retrieve other headers
-		String version = (String) manifest.get(Constants.BUNDLE_VERSION);
+		String version = manifest.get(Constants.BUNDLE_VERSION);
 		try {
 			result.setVersion((version != null) ? Version.parseVersion(version) : Version.emptyVersion);
 		} catch (IllegalArgumentException ex) {
@@ -85,40 +85,40 @@
 			// must not fail for old R3 style bundles
 		}
 		result.setLocation(location);
-		result.setPlatformFilter((String) manifest.get(Constants.ECLIPSE_PLATFORMFILTER));
-		result.setExecutionEnvironments(ManifestElement.getArrayFromList((String) manifest.get(Constants.BUNDLE_REQUIREDEXECUTIONENVIRONMENT)));
-		ManifestElement[] host = ManifestElement.parseHeader(Constants.FRAGMENT_HOST, (String) manifest.get(Constants.FRAGMENT_HOST));
+		result.setPlatformFilter(manifest.get(Constants.ECLIPSE_PLATFORMFILTER));
+		result.setExecutionEnvironments(ManifestElement.getArrayFromList(manifest.get(Constants.BUNDLE_REQUIREDEXECUTIONENVIRONMENT)));
+		ManifestElement[] host = ManifestElement.parseHeader(Constants.FRAGMENT_HOST, manifest.get(Constants.FRAGMENT_HOST));
 		if (host != null)
 			result.setHost(createHostSpecification(host[0], state));
-		ManifestElement[] exports = ManifestElement.parseHeader(Constants.EXPORT_PACKAGE, (String) manifest.get(Constants.EXPORT_PACKAGE));
-		ManifestElement[] provides = ManifestElement.parseHeader(Constants.PROVIDE_PACKAGE, (String) manifest.get(Constants.PROVIDE_PACKAGE));
+		ManifestElement[] exports = ManifestElement.parseHeader(Constants.EXPORT_PACKAGE, manifest.get(Constants.EXPORT_PACKAGE));
+		ManifestElement[] provides = ManifestElement.parseHeader(Constants.PROVIDE_PACKAGE, manifest.get(Constants.PROVIDE_PACKAGE));
 		boolean strict = state != null && state.inStrictMode();
-		ArrayList providedExports = new ArrayList(provides == null ? 0 : provides.length);
+		List<String> providedExports = new ArrayList<String>(provides == null ? 0 : provides.length);
 		result.setExportPackages(createExportPackages(exports, provides, providedExports, manifestVersion, strict));
-		ManifestElement[] imports = ManifestElement.parseHeader(Constants.IMPORT_PACKAGE, (String) manifest.get(Constants.IMPORT_PACKAGE));
-		ManifestElement[] dynamicImports = ManifestElement.parseHeader(Constants.DYNAMICIMPORT_PACKAGE, (String) manifest.get(Constants.DYNAMICIMPORT_PACKAGE));
+		ManifestElement[] imports = ManifestElement.parseHeader(Constants.IMPORT_PACKAGE, manifest.get(Constants.IMPORT_PACKAGE));
+		ManifestElement[] dynamicImports = ManifestElement.parseHeader(Constants.DYNAMICIMPORT_PACKAGE, manifest.get(Constants.DYNAMICIMPORT_PACKAGE));
 		result.setImportPackages(createImportPackages(result.getExportPackages(), providedExports, imports, dynamicImports, manifestVersion));
-		ManifestElement[] requires = ManifestElement.parseHeader(Constants.REQUIRE_BUNDLE, (String) manifest.get(Constants.REQUIRE_BUNDLE));
+		ManifestElement[] requires = ManifestElement.parseHeader(Constants.REQUIRE_BUNDLE, manifest.get(Constants.REQUIRE_BUNDLE));
 		result.setRequiredBundles(createRequiredBundles(requires));
 		String[][] genericAliases = getGenericAliases(state);
 		ManifestElement[] genericRequires = getGenericRequires(manifest, genericAliases);
-		ManifestElement[] osgiRequires = ManifestElement.parseHeader(Constants.REQUIRE_CAPABILITY, (String) manifest.get(Constants.REQUIRE_CAPABILITY));
+		ManifestElement[] osgiRequires = ManifestElement.parseHeader(Constants.REQUIRE_CAPABILITY, manifest.get(Constants.REQUIRE_CAPABILITY));
 		result.setGenericRequires(createGenericRequires(genericRequires, osgiRequires));
 		ManifestElement[] genericCapabilities = getGenericCapabilities(manifest, genericAliases);
-		ManifestElement[] osgiCapabilities = ManifestElement.parseHeader(Constants.PROVIDE_CAPABILITY, (String) manifest.get(Constants.PROVIDE_CAPABILITY));
+		ManifestElement[] osgiCapabilities = ManifestElement.parseHeader(Constants.PROVIDE_CAPABILITY, manifest.get(Constants.PROVIDE_CAPABILITY));
 		result.setGenericCapabilities(createGenericCapabilities(genericCapabilities, osgiCapabilities));
-		ManifestElement[] nativeCode = ManifestElement.parseHeader(Constants.BUNDLE_NATIVECODE, (String) manifest.get(Constants.BUNDLE_NATIVECODE));
+		ManifestElement[] nativeCode = ManifestElement.parseHeader(Constants.BUNDLE_NATIVECODE, manifest.get(Constants.BUNDLE_NATIVECODE));
 		result.setNativeCodeSpecification(createNativeCode(nativeCode));
 		return result;
 	}
 
-	private static ManifestElement[] getGenericRequires(Dictionary manifest, String[][] genericAliases) throws BundleException {
-		ManifestElement[] genericRequires = ManifestElement.parseHeader(GENERIC_REQUIRE, (String) manifest.get(GENERIC_REQUIRE));
-		ArrayList aliasList = null;
+	private static ManifestElement[] getGenericRequires(Dictionary<String, String> manifest, String[][] genericAliases) throws BundleException {
+		ManifestElement[] genericRequires = ManifestElement.parseHeader(GENERIC_REQUIRE, manifest.get(GENERIC_REQUIRE));
+		List<ManifestElement> aliasList = null;
 		if (genericAliases.length > 0) {
-			aliasList = new ArrayList(genericRequires == null ? 0 : genericRequires.length);
+			aliasList = new ArrayList<ManifestElement>(genericRequires == null ? 0 : genericRequires.length);
 			for (int i = 0; i < genericAliases.length; i++) {
-				ManifestElement[] aliasReqs = ManifestElement.parseHeader(genericAliases[i][1], (String) manifest.get(genericAliases[i][1]));
+				ManifestElement[] aliasReqs = ManifestElement.parseHeader(genericAliases[i][1], manifest.get(genericAliases[i][1]));
 				if (aliasReqs == null)
 					continue;
 				for (int j = 0; j < aliasReqs.length; j++) {
@@ -137,23 +137,23 @@
 		if (genericRequires != null)
 			for (int i = 0; i < genericRequires.length; i++)
 				aliasList.add(genericRequires[i]);
-		return (ManifestElement[]) aliasList.toArray(new ManifestElement[aliasList.size()]);
+		return aliasList.toArray(new ManifestElement[aliasList.size()]);
 	}
 
-	private static ManifestElement[] getGenericCapabilities(Dictionary manifest, String[][] genericAliases) throws BundleException {
-		ManifestElement[] genericCapabilities = ManifestElement.parseHeader(GENERIC_CAPABILITY, (String) manifest.get(GENERIC_CAPABILITY));
-		ArrayList aliasList = null;
+	private static ManifestElement[] getGenericCapabilities(Dictionary<String, String> manifest, String[][] genericAliases) throws BundleException {
+		ManifestElement[] genericCapabilities = ManifestElement.parseHeader(GENERIC_CAPABILITY, manifest.get(GENERIC_CAPABILITY));
+		List<ManifestElement> aliasList = null;
 		if (genericAliases.length > 0) {
-			aliasList = new ArrayList(genericCapabilities == null ? 0 : genericCapabilities.length);
+			aliasList = new ArrayList<ManifestElement>(genericCapabilities == null ? 0 : genericCapabilities.length);
 			for (int i = 0; i < genericAliases.length; i++) {
-				ManifestElement[] aliasCapabilities = ManifestElement.parseHeader(genericAliases[i][0], (String) manifest.get(genericAliases[i][0]));
+				ManifestElement[] aliasCapabilities = ManifestElement.parseHeader(genericAliases[i][0], manifest.get(genericAliases[i][0]));
 				if (aliasCapabilities == null)
 					continue;
 				for (int j = 0; j < aliasCapabilities.length; j++) {
 					StringBuffer strBuf = new StringBuffer();
 					strBuf.append(aliasCapabilities[j].getValue()).append(':').append(genericAliases[i][2]);
-					for (Enumeration keys = aliasCapabilities[j].getKeys(); keys != null && keys.hasMoreElements();) {
-						String key = (String) keys.nextElement();
+					for (Enumeration<String> keys = aliasCapabilities[j].getKeys(); keys != null && keys.hasMoreElements();) {
+						String key = keys.nextElement();
 						strBuf.append("; ").append(key).append("=\"").append(aliasCapabilities[j].getAttribute(key)).append("\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 					}
 					ManifestElement[] withTypes = ManifestElement.parseHeader(genericAliases[i][0], strBuf.toString());
@@ -166,7 +166,7 @@
 		if (genericCapabilities != null)
 			for (int i = 0; i < genericCapabilities.length; i++)
 				aliasList.add(genericCapabilities[i]);
-		return (ManifestElement[]) aliasList.toArray(new ManifestElement[aliasList.size()]);
+		return aliasList.toArray(new ManifestElement[aliasList.size()]);
 	}
 
 	private static String[][] getGenericAliases(StateImpl state) {
@@ -181,13 +181,13 @@
 	}
 
 	private static String getPlatformProperty(StateImpl state, String key) {
-		Dictionary[] platformProps = state == null ? null : state.getPlatformProperties();
+		Dictionary<Object, Object>[] platformProps = state == null ? null : state.getPlatformProperties();
 		return platformProps == null || platformProps.length == 0 ? null : (String) platformProps[0].get(key);
 	}
 
-	private static void validateHeaders(Dictionary manifest, boolean jreBundle) throws BundleException {
+	private static void validateHeaders(Dictionary<String, String> manifest, boolean jreBundle) throws BundleException {
 		for (int i = 0; i < DEFINED_OSGI_VALIDATE_HEADERS.length; i++) {
-			String header = (String) manifest.get(DEFINED_OSGI_VALIDATE_HEADERS[i]);
+			String header = manifest.get(DEFINED_OSGI_VALIDATE_HEADERS[i]);
 			if (header != null) {
 				ManifestElement[] elements = ManifestElement.parseHeader(DEFINED_OSGI_VALIDATE_HEADERS[i], header);
 				checkForDuplicateDirectivesAttributes(DEFINED_OSGI_VALIDATE_HEADERS[i], elements);
@@ -223,13 +223,13 @@
 		return result;
 	}
 
-	private static ImportPackageSpecification[] createImportPackages(ExportPackageDescription[] exported, ArrayList providedExports, ManifestElement[] imported, ManifestElement[] dynamicImported, int manifestVersion) {
-		ArrayList allImports = null;
+	private static ImportPackageSpecification[] createImportPackages(ExportPackageDescription[] exported, List<String> providedExports, ManifestElement[] imported, ManifestElement[] dynamicImported, int manifestVersion) {
+		List<ImportPackageSpecification> allImports = null;
 		if (manifestVersion < 2) {
 			// add implicit imports for each exported package if manifest verions is less than 2.
 			if (exported.length == 0 && imported == null && dynamicImported == null)
 				return null;
-			allImports = new ArrayList(exported.length + (imported == null ? 0 : imported.length));
+			allImports = new ArrayList<ImportPackageSpecification>(exported.length + (imported == null ? 0 : imported.length));
 			for (int i = 0; i < exported.length; i++) {
 				if (providedExports.contains(exported[i].getName()))
 					continue;
@@ -240,7 +240,7 @@
 				allImports.add(result);
 			}
 		} else {
-			allImports = new ArrayList(imported == null ? 0 : imported.length);
+			allImports = new ArrayList<ImportPackageSpecification>(imported == null ? 0 : imported.length);
 		}
 
 		// add dynamics first so they will get overriden by static imports if
@@ -251,17 +251,17 @@
 		if (imported != null)
 			for (int i = 0; i < imported.length; i++)
 				addImportPackages(imported[i], allImports, manifestVersion, false);
-		return (ImportPackageSpecification[]) allImports.toArray(new ImportPackageSpecification[allImports.size()]);
+		return allImports.toArray(new ImportPackageSpecification[allImports.size()]);
 	}
 
-	private static void addImportPackages(ManifestElement importPackage, ArrayList allImports, int manifestVersion, boolean dynamic) {
+	private static void addImportPackages(ManifestElement importPackage, List<ImportPackageSpecification> allImports, int manifestVersion, boolean dynamic) {
 		String[] importNames = importPackage.getValueComponents();
 		for (int i = 0; i < importNames.length; i++) {
 			// do not allow for multiple imports of same package of manifest version < 2
 			if (manifestVersion < 2) {
-				Iterator iter = allImports.iterator();
+				Iterator<ImportPackageSpecification> iter = allImports.iterator();
 				while (iter.hasNext())
-					if (importNames[i].equals(((ImportPackageSpecification) iter.next()).getName()))
+					if (importNames[i].equals(iter.next().getName()))
 						iter.remove();
 			}
 
@@ -294,20 +294,20 @@
 		return result;
 	}
 
-	static ExportPackageDescription[] createExportPackages(ManifestElement[] exported, ManifestElement[] provides, ArrayList providedExports, int manifestVersion, boolean strict) {
+	static ExportPackageDescription[] createExportPackages(ManifestElement[] exported, ManifestElement[] provides, List<String> providedExports, int manifestVersion, boolean strict) {
 		int numExports = (exported == null ? 0 : exported.length) + (provides == null ? 0 : provides.length);
 		if (numExports == 0)
 			return null;
-		ArrayList allExports = new ArrayList(numExports);
+		List<ExportPackageDescription> allExports = new ArrayList<ExportPackageDescription>(numExports);
 		if (exported != null)
 			for (int i = 0; i < exported.length; i++)
 				addExportPackages(exported[i], allExports, manifestVersion, strict);
 		if (provides != null)
 			addProvidePackages(provides, allExports, providedExports);
-		return (ExportPackageDescription[]) allExports.toArray(new ExportPackageDescription[allExports.size()]);
+		return allExports.toArray(new ExportPackageDescription[allExports.size()]);
 	}
 
-	private static void addExportPackages(ManifestElement exportPackage, ArrayList allExports, int manifestVersion, boolean strict) {
+	private static void addExportPackages(ManifestElement exportPackage, List<ExportPackageDescription> allExports, int manifestVersion, boolean strict) {
 		String[] exportNames = exportPackage.getValueComponents();
 		for (int i = 0; i < exportNames.length; i++) {
 			// if we are in strict mode and the package is marked as internal, skip it.
@@ -331,8 +331,8 @@
 		}
 	}
 
-	private static void addProvidePackages(ManifestElement[] provides, ArrayList allExports, ArrayList providedExports) {
-		ExportPackageDescription[] currentExports = (ExportPackageDescription[]) allExports.toArray(new ExportPackageDescription[allExports.size()]);
+	private static void addProvidePackages(ManifestElement[] provides, List<ExportPackageDescription> allExports, List<String> providedExports) {
+		ExportPackageDescription[] currentExports = allExports.toArray(new ExportPackageDescription[allExports.size()]);
 		for (int i = 0; i < provides.length; i++) {
 			boolean duplicate = false;
 			for (int j = 0; j < currentExports.length; j++)
@@ -349,14 +349,14 @@
 		}
 	}
 
-	private static Map getAttributes(ManifestElement element, String[] definedAttrs) {
-		Enumeration keys = element.getKeys();
-		Map arbitraryAttrs = null;
+	private static Map<String, Object> getAttributes(ManifestElement element, String[] definedAttrs) {
+		Enumeration<String> keys = element.getKeys();
+		Map<String, Object> arbitraryAttrs = null;
 		if (keys == null)
 			return null;
 		while (keys.hasMoreElements()) {
 			boolean definedAttr = false;
-			String key = (String) keys.nextElement();
+			String key = keys.nextElement();
 			for (int i = 0; i < definedAttrs.length; i++) {
 				if (definedAttrs[i].equals(key)) {
 					definedAttr = true;
@@ -372,7 +372,7 @@
 			}
 			if (!definedAttr) {
 				if (arbitraryAttrs == null)
-					arbitraryAttrs = new HashMap();
+					arbitraryAttrs = new HashMap<String, Object>();
 				arbitraryAttrs.put(key, convertValue(type, value));
 			}
 		}
@@ -391,8 +391,8 @@
 			return new Long(value);
 		else if (ATTR_TYPE_URI.equalsIgnoreCase(type))
 			try {
-				Class uriClazz = Class.forName("java.net.URI"); //$NON-NLS-1$
-				Constructor constructor = uriClazz.getConstructor(new Class[] {String.class});
+				Class<?> uriClazz = Class.forName("java.net.URI"); //$NON-NLS-1$
+				Constructor<?> constructor = uriClazz.getConstructor(new Class[] {String.class});
 				return constructor.newInstance(new Object[] {value});
 			} catch (ClassNotFoundException e) {
 				// oh well cannot support; just use string
@@ -535,14 +535,14 @@
 					break types; // ignore any namespace that is not effective at resolve time.
 				GenericDescriptionImpl desc = new GenericDescriptionImpl();
 				desc.setType(namespace);
-				Map mapAttrs = getAttributes(element, new String[0]);
-				Dictionary attrs = mapAttrs == null ? new Hashtable() : new Hashtable(mapAttrs);
+				Map<String, Object> mapAttrs = getAttributes(element, new String[0]);
+				Dictionary<String, Object> attrs = mapAttrs == null ? new Hashtable<String, Object>() : new Hashtable<String, Object>(mapAttrs);
 				desc.setAttributes(attrs);
-				Map<String, String> directives = new HashMap();
-				Enumeration keys = element.getDirectiveKeys();
+				Map<String, String> directives = new HashMap<String, String>();
+				Enumeration<String> keys = element.getDirectiveKeys();
 				if (keys != null)
 					for (keys = element.getDirectiveKeys(); keys.hasMoreElements();) {
-						String key = (String) keys.nextElement();
+						String key = keys.nextElement();
 						directives.put(key, element.getDirective(key));
 					}
 				desc.setDirectives(directives);
@@ -555,7 +555,7 @@
 	private static List<GenericDescription> createEquinoxCapabilities(ManifestElement[] equinoxCapabilities) {
 		if (equinoxCapabilities == null)
 			return null;
-		ArrayList<GenericDescription> results = new ArrayList(equinoxCapabilities.length);
+		ArrayList<GenericDescription> results = new ArrayList<GenericDescription>(equinoxCapabilities.length);
 		for (int i = 0; i < equinoxCapabilities.length; i++) {
 			String[] genericNames = equinoxCapabilities[i].getValueComponents();
 			for (int j = 0; j < genericNames.length; j++) {
@@ -566,8 +566,8 @@
 					name = genericNames[j].substring(0, colonIdx);
 					desc.setType(genericNames[j].substring(colonIdx + 1));
 				}
-				Map mapAttrs = getAttributes(equinoxCapabilities[i], new String[] {Constants.VERSION_ATTRIBUTE});
-				Dictionary attrs = mapAttrs == null ? new Hashtable() : new Hashtable(mapAttrs);
+				Map<String, Object> mapAttrs = getAttributes(equinoxCapabilities[i], new String[] {Constants.VERSION_ATTRIBUTE});
+				Dictionary<String, Object> attrs = mapAttrs == null ? new Hashtable<String, Object>() : new Hashtable<String, Object>(mapAttrs);
 				attrs.put(desc.getType(), name);
 				String versionString = equinoxCapabilities[i].getAttribute(Constants.VERSION_ATTRIBUTE);
 				if (versionString != null)
@@ -633,7 +633,7 @@
 		if (elements == null)
 			return;
 		int length = elements.length;
-		Set packages = new HashSet(length);
+		Set<String> packages = new HashSet<String>(length);
 		for (int i = 0; i < length; i++) {
 			// check for duplicate imports
 			String[] packageNames = elements[i].getValueComponents();
@@ -674,10 +674,10 @@
 	private static void checkForDuplicateDirectivesAttributes(String headerKey, ManifestElement[] elements) throws BundleException {
 		// check for duplicate directives
 		for (int i = 0; i < elements.length; i++) {
-			Enumeration directiveKeys = elements[i].getDirectiveKeys();
+			Enumeration<String> directiveKeys = elements[i].getDirectiveKeys();
 			if (directiveKeys != null) {
 				while (directiveKeys.hasMoreElements()) {
-					String key = (String) directiveKeys.nextElement();
+					String key = directiveKeys.nextElement();
 					String[] directives = elements[i].getDirectives(key);
 					if (directives.length > 1) {
 						String message = NLS.bind(Msg.MANIFEST_INVALID_HEADER_EXCEPTION, headerKey, elements[i].toString());
@@ -685,10 +685,10 @@
 					}
 				}
 			}
-			Enumeration attrKeys = elements[i].getKeys();
+			Enumeration<String> attrKeys = elements[i].getKeys();
 			if (attrKeys != null) {
 				while (attrKeys.hasMoreElements()) {
-					String key = (String) attrKeys.nextElement();
+					String key = attrKeys.nextElement();
 					String[] attrs = elements[i].getAttributes(key);
 					if (attrs.length > 1) {
 						String message = NLS.bind(Msg.MANIFEST_INVALID_HEADER_EXCEPTION, headerKey, elements[i].toString());
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateDeltaImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateDeltaImpl.java
index cf06fdd..846b03d 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateDeltaImpl.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateDeltaImpl.java
@@ -22,7 +22,7 @@
 
 	private final State state;
 
-	private final Map changes = new HashMap();
+	private final Map<BundleDescription, BundleDelta> changes = new HashMap<BundleDescription, BundleDelta>();
 
 	public StateDeltaImpl(State state) {
 		this.state = state;
@@ -30,19 +30,19 @@
 
 	public BundleDelta[] getChanges() {
 		synchronized (this.changes) {
-			return (BundleDelta[]) changes.values().toArray(new BundleDelta[changes.size()]);
+			return changes.values().toArray(new BundleDelta[changes.size()]);
 		}
 	}
 
 	public BundleDelta[] getChanges(int mask, boolean exact) {
 		synchronized (this.changes) {
-			List result = new ArrayList();
-			for (Iterator changesIter = changes.values().iterator(); changesIter.hasNext();) {
-				BundleDelta change = (BundleDelta) changesIter.next();
+			List<BundleDelta> result = new ArrayList<BundleDelta>();
+			for (Iterator<BundleDelta> changesIter = changes.values().iterator(); changesIter.hasNext();) {
+				BundleDelta change = changesIter.next();
 				if (mask == change.getType() || (!exact && (change.getType() & mask) != 0))
 					result.add(change);
 			}
-			return (BundleDelta[]) result.toArray(new BundleDelta[result.size()]);
+			return result.toArray(new BundleDelta[result.size()]);
 		}
 	}
 
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateHelperImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateHelperImpl.java
index e4ee07b..36e1a3b 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateHelperImpl.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateHelperImpl.java
@@ -30,16 +30,16 @@
 		if (bundles == null || bundles.length == 0)
 			return new BundleDescription[0];
 
-		Set reachable = new HashSet(bundles.length);
+		Set<BundleDescription> reachable = new HashSet<BundleDescription>(bundles.length);
 		for (int i = 0; i < bundles.length; i++) {
 			if (!bundles[i].isResolved())
 				continue;
 			addDependentBundles(bundles[i], reachable);
 		}
-		return (BundleDescription[]) reachable.toArray(new BundleDescription[reachable.size()]);
+		return reachable.toArray(new BundleDescription[reachable.size()]);
 	}
 
-	private void addDependentBundles(BundleDescription bundle, Set reachable) {
+	private void addDependentBundles(BundleDescription bundle, Set<BundleDescription> reachable) {
 		if (reachable.contains(bundle))
 			return;
 		reachable.add(bundle);
@@ -51,32 +51,32 @@
 	public BundleDescription[] getPrerequisites(BundleDescription[] bundles) {
 		if (bundles == null || bundles.length == 0)
 			return new BundleDescription[0];
-		Set reachable = new HashSet(bundles.length);
+		Set<BundleDescription> reachable = new HashSet<BundleDescription>(bundles.length);
 		for (int i = 0; i < bundles.length; i++)
 			addPrerequisites(bundles[i], reachable);
-		return (BundleDescription[]) reachable.toArray(new BundleDescription[reachable.size()]);
+		return reachable.toArray(new BundleDescription[reachable.size()]);
 	}
 
-	private void addPrerequisites(BundleDescription bundle, Set reachable) {
+	private void addPrerequisites(BundleDescription bundle, Set<BundleDescription> reachable) {
 		if (reachable.contains(bundle))
 			return;
 		reachable.add(bundle);
-		List depList = ((BundleDescriptionImpl) bundle).getBundleDependencies();
-		BundleDescription[] dependencies = (BundleDescription[]) depList.toArray(new BundleDescription[depList.size()]);
+		List<BundleDescription> depList = ((BundleDescriptionImpl) bundle).getBundleDependencies();
+		BundleDescription[] dependencies = depList.toArray(new BundleDescription[depList.size()]);
 		for (int i = 0; i < dependencies.length; i++)
 			addPrerequisites(dependencies[i], reachable);
 	}
 
-	private Map getExportedPackageMap(State state) {
-		Map result = new HashMap(11);
+	private Map<String, Set<ExportPackageDescription>> getExportedPackageMap(State state) {
+		Map<String, Set<ExportPackageDescription>> result = new HashMap<String, Set<ExportPackageDescription>>(11);
 		BundleDescription[] bundles = state.getBundles();
 		for (int i = 0; i < bundles.length; i++) {
 			ExportPackageDescription[] packages = bundles[i].getExportPackages();
 			for (int j = 0; j < packages.length; j++) {
 				ExportPackageDescription description = packages[j];
-				Set exports = (Set) result.get(description.getName());
+				Set<ExportPackageDescription> exports = result.get(description.getName());
 				if (exports == null) {
-					exports = new HashSet(1);
+					exports = new HashSet<ExportPackageDescription>(1);
 					result.put(description.getName(), exports);
 				}
 				exports.add(description);
@@ -85,8 +85,8 @@
 		return result;
 	}
 
-	private Map getGenericsMap(State state, boolean resolved) {
-		Map result = new HashMap(11);
+	private Map<String, Set<GenericDescription>> getGenericsMap(State state, boolean resolved) {
+		Map<String, Set<GenericDescription>> result = new HashMap<String, Set<GenericDescription>>(11);
 		BundleDescription[] bundles = state.getBundles();
 		for (int i = 0; i < bundles.length; i++) {
 			if (resolved && !bundles[i].isResolved())
@@ -94,9 +94,9 @@
 			GenericDescription[] generics = bundles[i].getGenericCapabilities();
 			for (int j = 0; j < generics.length; j++) {
 				GenericDescription description = generics[j];
-				Set genericSet = (Set) result.get(description.getName());
+				Set<GenericDescription> genericSet = result.get(description.getName());
 				if (genericSet == null) {
-					genericSet = new HashSet(1);
+					genericSet = new HashSet<GenericDescription>(1);
 					result.put(description.getName(), genericSet);
 				}
 				genericSet.add(description);
@@ -106,14 +106,14 @@
 	}
 
 	private VersionConstraint[] getUnsatisfiedLeaves(State state, BundleDescription[] bundles) {
-		Map packages = getExportedPackageMap(state);
-		Map generics = getGenericsMap(state, false);
-		HashSet result = new HashSet(11);
-		ArrayList bundleList = new ArrayList(bundles.length);
+		Map<String, Set<ExportPackageDescription>> packages = getExportedPackageMap(state);
+		Map<String, Set<GenericDescription>> generics = getGenericsMap(state, false);
+		Set<VersionConstraint> result = new HashSet<VersionConstraint>(11);
+		List<BundleDescription> bundleList = new ArrayList<BundleDescription>(bundles.length);
 		for (int i = 0; i < bundles.length; i++)
 			bundleList.add(bundles[i]);
 		for (int i = 0; i < bundleList.size(); i++) {
-			BundleDescription description = (BundleDescription) bundleList.get(i);
+			BundleDescription description = bundleList.get(i);
 			VersionConstraint[] constraints = getUnsatisfiedConstraints(description);
 			for (int j = 0; j < constraints.length; j++) {
 				VersionConstraint constraint = constraints[j];
@@ -123,17 +123,17 @@
 					for (int k = 0; k < suppliers.length && satisfied == null; k++)
 						satisfied = constraint.isSatisfiedBy(suppliers[k]) ? suppliers[k] : null;
 				} else if (constraint instanceof ImportPackageSpecification) {
-					Set exports = (Set) packages.get(constraint.getName());
+					Set<ExportPackageDescription> exports = packages.get(constraint.getName());
 					if (exports != null)
-						for (Iterator iter = exports.iterator(); iter.hasNext() && satisfied == null;) {
-							ExportPackageDescription exportDesc = (ExportPackageDescription) iter.next();
+						for (Iterator<ExportPackageDescription> iter = exports.iterator(); iter.hasNext() && satisfied == null;) {
+							ExportPackageDescription exportDesc = iter.next();
 							satisfied = constraint.isSatisfiedBy(exportDesc) ? exportDesc : null;
 						}
 				} else if (constraint instanceof GenericSpecification) {
-					Set genericSet = (Set) generics.get(constraint.getName());
+					Set<GenericDescription> genericSet = generics.get(constraint.getName());
 					if (genericSet != null)
-						for (Iterator iter = genericSet.iterator(); iter.hasNext() && satisfied == null;) {
-							GenericDescription genDesc = (GenericDescription) iter.next();
+						for (Iterator<GenericDescription> iter = genericSet.iterator(); iter.hasNext() && satisfied == null;) {
+							GenericDescription genDesc = iter.next();
 							satisfied = constraint.isSatisfiedBy(genDesc) ? genDesc : null;
 						}
 				}
@@ -143,7 +143,7 @@
 					bundleList.add(satisfied.getSupplier());
 			}
 		}
-		return (VersionConstraint[]) result.toArray(new VersionConstraint[result.size()]);
+		return result.toArray(new VersionConstraint[result.size()]);
 
 	}
 
@@ -162,7 +162,7 @@
 		if (containingState == null)
 			// it is a bug in the client to call this method when not attached to a state
 			throw new IllegalStateException("Does not belong to a state"); //$NON-NLS-1$		
-		List unsatisfied = new ArrayList();
+		List<VersionConstraint> unsatisfied = new ArrayList<VersionConstraint>();
 		HostSpecification host = bundle.getHost();
 		if (host != null)
 			if (!host.isResolved() && !isResolvable(host))
@@ -182,7 +182,7 @@
 		NativeCodeSpecification nativeCode = bundle.getNativeCodeSpecification();
 		if (nativeCode != null && !nativeCode.isResolved())
 			unsatisfied.add(nativeCode);
-		return (VersionConstraint[]) unsatisfied.toArray(new VersionConstraint[unsatisfied.size()]);
+		return unsatisfied.toArray(new VersionConstraint[unsatisfied.size()]);
 	}
 
 	/**
@@ -197,12 +197,12 @@
 	}
 
 	private boolean isResolvable(GenericSpecification constraint) {
-		Map genericCapabilities = getGenericsMap(constraint.getBundle().getContainingState(), true);
-		Set genericSet = (Set) genericCapabilities.get(constraint.getName());
+		Map<String, Set<GenericDescription>> genericCapabilities = getGenericsMap(constraint.getBundle().getContainingState(), true);
+		Set<GenericDescription> genericSet = genericCapabilities.get(constraint.getName());
 		if (genericSet == null)
 			return false;
-		for (Iterator iter = genericSet.iterator(); iter.hasNext();)
-			if (constraint.isSatisfiedBy((GenericDescription) iter.next()))
+		for (Iterator<GenericDescription> iter = genericSet.iterator(); iter.hasNext();)
+			if (constraint.isSatisfiedBy(iter.next()))
 				return true;
 		return false;
 	}
@@ -233,11 +233,11 @@
 	}
 
 	public Object[][] sortBundles(BundleDescription[] toSort) {
-		List references = new ArrayList(toSort.length);
+		List<Object[]> references = new ArrayList<Object[]>(toSort.length);
 		for (int i = 0; i < toSort.length; i++)
 			if (toSort[i].isResolved())
 				buildReferences(toSort[i], references);
-		Object[][] cycles = ComputeNodeOrder.computeNodeOrder(toSort, (Object[][]) references.toArray(new Object[references.size()][]));
+		Object[][] cycles = ComputeNodeOrder.computeNodeOrder(toSort, references.toArray(new Object[references.size()][]));
 		if (cycles.length == 0)
 			return cycles;
 		// fix up host/fragment orders (bug 184127)
@@ -271,7 +271,7 @@
 		}
 	}
 
-	private void buildReferences(BundleDescription description, List references) {
+	private void buildReferences(BundleDescription description, List<Object[]> references) {
 		HostSpecification host = description.getHost();
 		// it is a fragment
 		if (host != null) {
@@ -288,12 +288,12 @@
 		}
 	}
 
-	private void buildReferences(BundleDescription description, List dependencies, List references) {
-		for (Iterator iter = dependencies.iterator(); iter.hasNext();)
-			addReference(description, (BundleDescription) iter.next(), references);
+	private void buildReferences(BundleDescription description, List<BundleDescription> dependencies, List<Object[]> references) {
+		for (Iterator<BundleDescription> iter = dependencies.iterator(); iter.hasNext();)
+			addReference(description, iter.next(), references);
 	}
 
-	private void addReference(BundleDescription description, BundleDescription reference, List references) {
+	private void addReference(BundleDescription description, BundleDescription reference, List<Object[]> references) {
 		// build the reference from the description
 		if (description == reference || reference == null)
 			return;
@@ -318,9 +318,9 @@
 		if (state != null)
 			strict = state.inStrictMode();
 		BundleDescription host = (BundleDescription) (bundle.getHost() == null ? bundle : bundle.getHost().getSupplier());
-		ArrayList orderedPkgList = new ArrayList(); // list of all ExportPackageDescriptions that are visible (ArrayList is used to keep order)
-		Set pkgSet = new HashSet();
-		Set importList = new HashSet(); // list of package names which are directly imported
+		List<ExportPackageDescription> orderedPkgList = new ArrayList<ExportPackageDescription>(); // list of all ExportPackageDescriptions that are visible (ArrayList is used to keep order)
+		Set<ExportPackageDescription> pkgSet = new HashSet<ExportPackageDescription>();
+		Set<String> importList = new HashSet<String>(); // list of package names which are directly imported
 		// get the list of directly imported packages first.
 		ImportsHolder imports = new ImportsHolder(bundle, options);
 		for (int i = 0; i < imports.getSize(); i++) {
@@ -333,9 +333,9 @@
 			}
 			// get the sources of the required bundles of the exporter
 			BundleSpecification[] requires = pkgSupplier.getExporter().getRequiredBundles();
-			Set visited = new HashSet();
+			Set<BundleDescription> visited = new HashSet<BundleDescription>();
 			visited.add(bundle); // always add self to prevent recursing into self
-			Set importNames = new HashSet(1);
+			Set<String> importNames = new HashSet<String>(1);
 			importNames.add(imports.getName(i));
 			for (int j = 0; j < requires.length; j++) {
 				BundleDescription bundleSupplier = (BundleDescription) requires[j].getSupplier();
@@ -347,46 +347,46 @@
 		}
 		// now find all the packages that are visible from required bundles
 		RequiresHolder requires = new RequiresHolder(bundle, options);
-		Set visited = new HashSet(requires.getSize());
+		Set<BundleDescription> visited = new HashSet<BundleDescription>(requires.getSize());
 		visited.add(bundle); // always add self to prevent recursing into self
 		for (int i = 0; i < requires.getSize(); i++) {
 			BundleDescription bundleSupplier = requires.getSupplier(i);
 			if (bundleSupplier != null)
 				getPackages(bundleSupplier, bundle.getSymbolicName(), importList, orderedPkgList, pkgSet, visited, strict, null, options);
 		}
-		return (ExportPackageDescription[]) orderedPkgList.toArray(new ExportPackageDescription[orderedPkgList.size()]);
+		return orderedPkgList.toArray(new ExportPackageDescription[orderedPkgList.size()]);
 	}
 
-	private void getPackages(BundleDescription requiredBundle, String symbolicName, Set importList, ArrayList orderedPkgList, Set pkgSet, Set visited, boolean strict, Set pkgNames, int options) {
+	private void getPackages(BundleDescription requiredBundle, String symbolicName, Set<String> importList, List<ExportPackageDescription> orderedPkgList, Set<ExportPackageDescription> pkgSet, Set<BundleDescription> visited, boolean strict, Set<String> pkgNames, int options) {
 		if (visited.contains(requiredBundle))
 			return; // prevent duplicate entries and infinate loops incase of cycles
 		visited.add(requiredBundle);
 		// add all the exported packages from the required bundle; take x-friends into account.
 		ExportPackageDescription[] substitutedExports = requiredBundle.getSubstitutedExports();
 		ExportPackageDescription[] imports = requiredBundle.getResolvedImports();
-		Set substituteNames = null; // a temporary set used to scope packages we get from getPackages
+		Set<String> substituteNames = null; // a temporary set used to scope packages we get from getPackages
 		for (int i = 0; i < substitutedExports.length; i++) {
 			if ((pkgNames == null || pkgNames.contains(substitutedExports[i].getName()))) {
 				for (int j = 0; j < imports.length; j++) {
 					if (substitutedExports[i].getName().equals(imports[j].getName()) && !pkgSet.contains(imports[j])) {
 						if (substituteNames == null)
-							substituteNames = new HashSet(1);
+							substituteNames = new HashSet<String>(1);
 						else
 							substituteNames.clear();
 						// substituteNames is a set of one package containing the single substitute we are trying to get the source for
 						substituteNames.add(substitutedExports[i].getName());
-						getPackages(imports[j].getSupplier(), symbolicName, importList, orderedPkgList, pkgSet, new HashSet(0), strict, substituteNames, options);
+						getPackages(imports[j].getSupplier(), symbolicName, importList, orderedPkgList, pkgSet, new HashSet<BundleDescription>(0), strict, substituteNames, options);
 					}
 				}
 			}
 		}
-		importList = substitutedExports.length == 0 ? importList : new HashSet(importList);
+		importList = substitutedExports.length == 0 ? importList : new HashSet<String>(importList);
 		for (int i = 0; i < substitutedExports.length; i++)
 			// we add the package name to the import list to prevent required bundles from adding more sources
 			importList.add(substitutedExports[i].getName());
 
 		ExportPackageDescription[] exports = requiredBundle.getSelectedExports();
-		HashSet exportNames = new HashSet(exports.length); // set is used to improve performance of duplicate check.
+		HashSet<String> exportNames = new HashSet<String>(exports.length); // set is used to improve performance of duplicate check.
 		for (int i = 0; i < exports.length; i++)
 			if ((pkgNames == null || pkgNames.contains(exports[i].getName())) && !isSystemExport(exports[i], options) && isFriend(symbolicName, exports[i], strict) && !importList.contains(exports[i].getName()) && !pkgSet.contains(exports[i])) {
 				if (!exportNames.contains(exports[i].getName())) {
@@ -406,7 +406,7 @@
 				getPackages(requiredBundles.getSupplier(i), symbolicName, importList, orderedPkgList, pkgSet, visited, strict, pkgNames, options);
 			} else if (exportNames.size() > 0) {
 				// adding any exports from required bundles which we also export
-				Set tmpVisited = new HashSet();
+				Set<BundleDescription> tmpVisited = new HashSet<BundleDescription>();
 				getPackages(requiredBundles.getSupplier(i), symbolicName, importList, orderedPkgList, pkgSet, tmpVisited, strict, exportNames, options);
 			}
 		}
@@ -497,14 +497,14 @@
 	private final BundleSpecification[] requiredBundles;
 	private final BundleDescription[] resolvedRequires;
 	private final boolean isUsingResolved;
-	private final Map resolvedBundlesExported;
+	private final Map<BundleDescription, Boolean> resolvedBundlesExported;
 
 	// Depending on the options used, either requiredBundles or resolvedRequires is initialize, but not both.
 	RequiresHolder(BundleDescription bundle, int options) {
 		isUsingResolved = (options & StateHelper.VISIBLE_INCLUDE_ALL_HOST_WIRES) != 0;
 		if (isUsingResolved) {
 			requiredBundles = null;
-			resolvedBundlesExported = new HashMap();
+			resolvedBundlesExported = new HashMap<BundleDescription, Boolean>();
 			resolvedRequires = bundle.getResolvedRequires();
 			determineRequiresVisibility(bundle);
 		} else {
@@ -522,7 +522,7 @@
 
 	boolean isExported(int index) {
 		if (isUsingResolved)
-			return ((Boolean) resolvedBundlesExported.get(resolvedRequires[index])).booleanValue();
+			return resolvedBundlesExported.get(resolvedRequires[index]).booleanValue();
 		return requiredBundles[index].isExported();
 	}
 
@@ -538,7 +538,7 @@
 	 */
 	private void determineRequiresVisibility(BundleDescription bundle) {
 		BundleSpecification[] required = bundle.getRequiredBundles();
-		HashSet resolved = new HashSet();
+		Set<BundleDescription> resolved = new HashSet<BundleDescription>();
 
 		for (int i = 0; i < resolvedRequires.length; i++) {
 			resolved.add(resolvedRequires[i]);
@@ -547,7 +547,7 @@
 		// Get the visibility of all directly required bundles
 		for (int i = 0; i < required.length; i++) {
 			if (required[i].getSupplier() != null) {
-				resolvedBundlesExported.put(required[i].getSupplier(), new Boolean(required[i].isExported()));
+				resolvedBundlesExported.put((BundleDescription) required[i].getSupplier(), new Boolean(required[i].isExported()));
 				resolved.remove(required[i].getSupplier());
 			}
 		}
@@ -560,7 +560,7 @@
 				BundleSpecification[] fragmentRequiredBundles = fragments[i].getRequiredBundles();
 				for (int j = 0; j < fragmentRequiredBundles.length; j++) {
 					if (resolved.contains(fragmentRequiredBundles[j].getSupplier())) {
-						resolvedBundlesExported.put(fragmentRequiredBundles[j].getSupplier(), new Boolean(fragmentRequiredBundles[j].isExported()));
+						resolvedBundlesExported.put((BundleDescription) fragmentRequiredBundles[j].getSupplier(), new Boolean(fragmentRequiredBundles[j].isExported()));
 						resolved.remove(fragmentRequiredBundles[j].getSupplier());
 					}
 				}
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateImpl.java
index ef8788d..a05d5d2 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateImpl.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateImpl.java
@@ -42,17 +42,18 @@
 	private volatile boolean resolved = true;
 	private volatile long timeStamp = System.currentTimeMillis();
 	private final KeyedHashSet bundleDescriptions = new KeyedHashSet(false);
-	private final HashMap resolverErrors = new HashMap();
+	private final Map<BundleDescription, List<ResolverError>> resolverErrors = new HashMap<BundleDescription, List<ResolverError>>();
 	private StateObjectFactory factory;
 	private final KeyedHashSet resolvedBundles = new KeyedHashSet();
-	private final HashMap disabledBundles = new HashMap();
+	private final Map<BundleDescription, List<DisabledInfo>> disabledBundles = new HashMap<BundleDescription, List<DisabledInfo>>();
 	private volatile boolean fullyLoaded = false;
 	private boolean dynamicCacheChanged = false;
 	// only used for lazy loading of BundleDescriptions
 	private StateReader reader;
-	private Dictionary[] platformProperties = {new Hashtable(PROPS.length)}; // Dictionary here because of Filter API
+	@SuppressWarnings("unchecked")
+	private Dictionary<Object, Object>[] platformProperties = new Dictionary[] {new Hashtable<String, String>(PROPS.length)}; // Dictionary here because of Filter API
 	private long highestBundleId = -1;
-	private final HashSet platformPropertyKeys = new HashSet(PROPS.length);
+	private final Set<String> platformPropertyKeys = new HashSet<String>(PROPS.length);
 	private ResolverHook hook;
 
 	private static long cumulativeTime;
@@ -107,11 +108,11 @@
 			if (!bundleDescriptions.remove(existing))
 				return false;
 			resolvedBundles.remove(existing);
-			ArrayList infos = (ArrayList) disabledBundles.remove(existing);
+			List<DisabledInfo> infos = disabledBundles.remove(existing);
 			if (infos != null) {
-				ArrayList newInfos = new ArrayList(infos.size());
-				for (Iterator iInfos = infos.iterator(); iInfos.hasNext();) {
-					DisabledInfo info = (DisabledInfo) iInfos.next();
+				List<DisabledInfo> newInfos = new ArrayList<DisabledInfo>(infos.size());
+				for (Iterator<DisabledInfo> iInfos = infos.iterator(); iInfos.hasNext();) {
+					DisabledInfo info = iInfos.next();
 					newInfos.add(new DisabledInfo(info.getPolicyName(), info.getMessage(), newDescription));
 				}
 				disabledBundles.put(newDescription, newInfos);
@@ -209,13 +210,13 @@
 		synchronized (this.monitor) {
 			if (Constants.SYSTEM_BUNDLE_SYMBOLICNAME.equals(symbolicName))
 				symbolicName = getSystemBundle();
-			final List bundles = new ArrayList();
-			for (Iterator iter = bundleDescriptions.iterator(); iter.hasNext();) {
+			final List<BundleDescription> bundles = new ArrayList<BundleDescription>();
+			for (Iterator<KeyedElement> iter = bundleDescriptions.iterator(); iter.hasNext();) {
 				BundleDescription bundle = (BundleDescription) iter.next();
 				if (symbolicName.equals(bundle.getSymbolicName()))
 					bundles.add(bundle);
 			}
-			return (BundleDescription[]) bundles.toArray(new BundleDescription[bundles.size()]);
+			return bundles.toArray(new BundleDescription[bundles.size()]);
 		}
 	}
 
@@ -231,8 +232,8 @@
 			if (result != null)
 				return result;
 			// need to look in removal pending bundles;
-			for (Iterator iter = removalPendings.iterator(); iter.hasNext();) {
-				BundleDescription removedBundle = (BundleDescription) iter.next();
+			for (Iterator<BundleDescription> iter = removalPendings.iterator(); iter.hasNext();) {
+				BundleDescription removedBundle = iter.next();
 				if (removedBundle.getBundleId() == id) // just return the first matching id
 					return removedBundle;
 			}
@@ -457,10 +458,11 @@
 					reResolve = mergeBundles(reResolve, removed);
 				}
 				// use the Headers class to handle ignoring case while matching keys (bug 180817)
-				Headers[] tmpPlatformProperties = new Headers[platformProperties.length];
+				@SuppressWarnings("unchecked")
+				Headers<Object, Object>[] tmpPlatformProperties = new Headers[platformProperties.length];
 				for (int i = 0; i < platformProperties.length; i++) {
-					tmpPlatformProperties[i] = new Headers(platformProperties[i].size());
-					for (Enumeration keys = platformProperties[i].keys(); keys.hasMoreElements();) {
+					tmpPlatformProperties[i] = new Headers<Object, Object>(platformProperties[i].size());
+					for (Enumeration<Object> keys = platformProperties[i].keys(); keys.hasMoreElements();) {
 						Object key = keys.nextElement();
 						tmpPlatformProperties[i].put(key, platformProperties[i].get(key));
 					}
@@ -494,7 +496,7 @@
 		if (reResolve.length == 0)
 			return reResolve; // if reResolve length==0 then we want to prevent pending removal
 		// merge in all removal pending bundles that are not already in the list
-		ArrayList result = new ArrayList(reResolve.length + removed.length);
+		List<BundleDescription> result = new ArrayList<BundleDescription>(reResolve.length + removed.length);
 		for (int i = 0; i < reResolve.length; i++)
 			result.add(reResolve[i]);
 		for (int i = 0; i < removed.length; i++) {
@@ -508,7 +510,7 @@
 			if (!found)
 				result.add(removed[i]);
 		}
-		return (BundleDescription[]) result.toArray(new BundleDescription[result.size()]);
+		return result.toArray(new BundleDescription[result.size()]);
 	}
 
 	private void flush(BundleDescription[] bundles) {
@@ -597,8 +599,8 @@
 
 	public ExportPackageDescription[] getExportedPackages() {
 		fullyLoad();
-		final List allExportedPackages = new ArrayList();
-		for (Iterator iter = resolvedBundles.iterator(); iter.hasNext();) {
+		final List<ExportPackageDescription> allExportedPackages = new ArrayList<ExportPackageDescription>();
+		for (Iterator<KeyedElement> iter = resolvedBundles.iterator(); iter.hasNext();) {
 			BundleDescription bundle = (BundleDescription) iter.next();
 			ExportPackageDescription[] bundlePackages = bundle.getSelectedExports();
 			if (bundlePackages == null)
@@ -606,20 +608,20 @@
 			for (int i = 0; i < bundlePackages.length; i++)
 				allExportedPackages.add(bundlePackages[i]);
 		}
-		for (Iterator iter = removalPendings.iterator(); iter.hasNext();) {
-			BundleDescription bundle = (BundleDescription) iter.next();
+		for (Iterator<BundleDescription> iter = removalPendings.iterator(); iter.hasNext();) {
+			BundleDescription bundle = iter.next();
 			ExportPackageDescription[] bundlePackages = bundle.getSelectedExports();
 			if (bundlePackages == null)
 				continue;
 			for (int i = 0; i < bundlePackages.length; i++)
 				allExportedPackages.add(bundlePackages[i]);
 		}
-		return (ExportPackageDescription[]) allExportedPackages.toArray(new ExportPackageDescription[allExportedPackages.size()]);
+		return allExportedPackages.toArray(new ExportPackageDescription[allExportedPackages.size()]);
 	}
 
 	BundleDescription[] getFragments(final BundleDescription host) {
-		final List fragments = new ArrayList();
-		for (Iterator iter = bundleDescriptions.iterator(); iter.hasNext();) {
+		final List<BundleDescription> fragments = new ArrayList<BundleDescription>();
+		for (Iterator<KeyedElement> iter = bundleDescriptions.iterator(); iter.hasNext();) {
 			BundleDescription bundle = (BundleDescription) iter.next();
 			HostSpecification hostSpec = bundle.getHost();
 
@@ -633,7 +635,7 @@
 						}
 			}
 		}
-		return (BundleDescription[]) fragments.toArray(new BundleDescription[fragments.size()]);
+		return fragments.toArray(new BundleDescription[fragments.size()]);
 	}
 
 	public void setTimeStamp(long newTimeStamp) {
@@ -660,7 +662,7 @@
 
 	public BundleDescription getBundleByLocation(String location) {
 		synchronized (this.monitor) {
-			for (Iterator i = bundleDescriptions.iterator(); i.hasNext();) {
+			for (Iterator<KeyedElement> i = bundleDescriptions.iterator(); i.hasNext();) {
 				BundleDescription current = (BundleDescription) i.next();
 				if (location.equals(current.getLocation()))
 					return current;
@@ -691,24 +693,25 @@
 		resolver.setState(this);
 	}
 
-	public boolean setPlatformProperties(Dictionary platformProperties) {
+	public boolean setPlatformProperties(Dictionary<?, ?> platformProperties) {
 		return setPlatformProperties(new Dictionary[] {platformProperties});
 	}
 
-	public boolean setPlatformProperties(Dictionary[] platformProperties) {
+	public boolean setPlatformProperties(Dictionary<?, ?>[] platformProperties) {
 		return setPlatformProperties(platformProperties, true);
 	}
 
-	synchronized boolean setPlatformProperties(Dictionary[] platformProperties, boolean resetSystemExports) {
+	synchronized boolean setPlatformProperties(Dictionary<?, ?>[] platformProperties, boolean resetSystemExports) {
 		if (platformProperties.length == 0)
 			throw new IllegalArgumentException();
 		// copy the properties for our use internally;
 		// only copy String and String[] values
-		Dictionary[] newPlatformProperties = new Dictionary[platformProperties.length];
+		@SuppressWarnings("unchecked")
+		Dictionary<Object, Object>[] newPlatformProperties = new Dictionary[platformProperties.length];
 		for (int i = 0; i < platformProperties.length; i++) {
-			newPlatformProperties[i] = new Hashtable(platformProperties[i].size());
+			newPlatformProperties[i] = new Hashtable<Object, Object>(platformProperties[i].size());
 			synchronized (platformProperties[i]) {
-				for (Enumeration keys = platformProperties[i].keys(); keys.hasMoreElements();) {
+				for (Enumeration<?> keys = platformProperties[i].keys(); keys.hasMoreElements();) {
 					Object key = keys.nextElement();
 					Object value = platformProperties[i].get(key);
 					newPlatformProperties[i].put(key, value);
@@ -768,16 +771,16 @@
 		for (int idx = 0; idx < systemBundles.length; idx++) {
 			BundleDescriptionImpl systemBundle = (BundleDescriptionImpl) systemBundles[idx];
 			ExportPackageDescription[] exports = systemBundle.getExportPackages();
-			ArrayList newExports = new ArrayList(exports.length);
+			List<ExportPackageDescription> newExports = new ArrayList<ExportPackageDescription>(exports.length);
 			for (int i = 0; i < exports.length; i++)
 				if (((Integer) exports[i].getDirective(ExportPackageDescriptionImpl.EQUINOX_EE)).intValue() < 0)
 					newExports.add(exports[i]);
 			addSystemExports(newExports);
-			systemBundle.setExportPackages((ExportPackageDescription[]) newExports.toArray(new ExportPackageDescription[newExports.size()]));
+			systemBundle.setExportPackages(newExports.toArray(new ExportPackageDescription[newExports.size()]));
 		}
 	}
 
-	private void addSystemExports(ArrayList exports) {
+	private void addSystemExports(List<ExportPackageDescription> exports) {
 		for (int i = 0; i < platformProperties.length; i++)
 			try {
 				addSystemExports(exports, ManifestElement.parseHeader(Constants.EXPORT_PACKAGE, (String) platformProperties[i].get(Constants.FRAMEWORK_SYSTEMPACKAGES)), i);
@@ -787,7 +790,7 @@
 			}
 	}
 
-	private void addSystemExports(ArrayList exports, ManifestElement[] elements, int index) {
+	private void addSystemExports(List<ExportPackageDescription> exports, ManifestElement[] elements, int index) {
 		if (elements == null)
 			return;
 		ExportPackageDescription[] systemExports = StateBuilder.createExportPackages(elements, null, null, 2, false);
@@ -828,6 +831,7 @@
 		StateBuilder.createOSGiCapabilities(elements, capabilities);
 	}
 
+	@SuppressWarnings("rawtypes")
 	public Dictionary[] getPlatformProperties() {
 		return platformProperties;
 	}
@@ -853,7 +857,7 @@
 		return !origObj.equals(newObj);
 	}
 
-	private boolean changedProps(Dictionary origProps, Dictionary newProps, String[] keys) {
+	private boolean changedProps(Dictionary<Object, Object> origProps, Dictionary<Object, Object> newProps, String[] keys) {
 		for (int i = 0; i < keys.length; i++) {
 			Object origProp = origProps.get(keys[i]);
 			Object newProp = newProps.get(keys[i]);
@@ -983,7 +987,7 @@
 
 	public ExportPackageDescription[] getSystemPackages() {
 		synchronized (this.monitor) {
-			ArrayList result = new ArrayList();
+			List<ExportPackageDescription> result = new ArrayList<ExportPackageDescription>();
 			BundleDescription[] systemBundles = getBundles(Constants.SYSTEM_BUNDLE_SYMBOLICNAME);
 			if (systemBundles.length > 0) {
 				BundleDescriptionImpl systemBundle = (BundleDescriptionImpl) systemBundles[0];
@@ -992,7 +996,7 @@
 					if (((Integer) exports[i].getDirective(ExportPackageDescriptionImpl.EQUINOX_EE)).intValue() >= 0)
 						result.add(exports[i]);
 			}
-			return (ExportPackageDescription[]) result.toArray(new ExportPackageDescription[result.size()]);
+			return result.toArray(new ExportPackageDescription[result.size()]);
 		}
 	}
 
@@ -1006,8 +1010,8 @@
 		synchronized (this.monitor) {
 			if (bundle.isResolved())
 				return new ResolverError[0];
-			ArrayList result = (ArrayList) resolverErrors.get(bundle);
-			return result == null ? new ResolverError[0] : (ResolverError[]) result.toArray(new ResolverError[result.size()]);
+			List<ResolverError> result = resolverErrors.get(bundle);
+			return result == null ? new ResolverError[0] : result.toArray(new ResolverError[result.size()]);
 		}
 	}
 
@@ -1015,9 +1019,9 @@
 		synchronized (this.monitor) {
 			if (!resolving)
 				throw new IllegalStateException(); // TODO need error message here!
-			ArrayList errors = (ArrayList) resolverErrors.get(bundle);
+			List<ResolverError> errors = resolverErrors.get(bundle);
 			if (errors == null) {
-				errors = new ArrayList(1);
+				errors = new ArrayList<ResolverError>(1);
 				resolverErrors.put(bundle, errors);
 			}
 			errors.add(new ResolverErrorImpl((BundleDescriptionImpl) bundle, type, data, unsatisfied));
@@ -1058,7 +1062,7 @@
 
 	String[] getPlatformPropertyKeys() {
 		synchronized (platformPropertyKeys) {
-			return (String[]) platformPropertyKeys.toArray(new String[platformPropertyKeys.size()]);
+			return platformPropertyKeys.toArray(new String[platformPropertyKeys.size()]);
 		}
 	}
 
@@ -1074,7 +1078,7 @@
 
 	public BundleDescription[] getDisabledBundles() {
 		synchronized (this.monitor) {
-			return (BundleDescription[]) disabledBundles.keySet().toArray(new BundleDescription[0]);
+			return disabledBundles.keySet().toArray(new BundleDescription[0]);
 		}
 	}
 
@@ -1082,15 +1086,15 @@
 		synchronized (this.monitor) {
 			if (getBundle(disabledInfo.getBundle().getBundleId()) != disabledInfo.getBundle())
 				throw new IllegalArgumentException(NLS.bind(StateMsg.BUNDLE_NOT_IN_STATE, disabledInfo.getBundle()));
-			ArrayList currentInfos = (ArrayList) disabledBundles.get(disabledInfo.getBundle());
+			List<DisabledInfo> currentInfos = disabledBundles.get(disabledInfo.getBundle());
 			if (currentInfos == null) {
-				currentInfos = new ArrayList(1);
+				currentInfos = new ArrayList<DisabledInfo>(1);
 				currentInfos.add(disabledInfo);
 				disabledBundles.put(disabledInfo.getBundle(), currentInfos);
 			} else {
-				Iterator it = currentInfos.iterator();
+				Iterator<DisabledInfo> it = currentInfos.iterator();
 				while (it.hasNext()) {
-					DisabledInfo currentInfo = (DisabledInfo) it.next();
+					DisabledInfo currentInfo = it.next();
 					if (disabledInfo.getPolicyName().equals(currentInfo.getPolicyName())) {
 						currentInfos.remove(currentInfo);
 						break;
@@ -1104,7 +1108,7 @@
 
 	public void removeDisabledInfo(DisabledInfo disabledInfo) {
 		synchronized (this.monitor) {
-			ArrayList currentInfos = (ArrayList) disabledBundles.get(disabledInfo.getBundle());
+			List<DisabledInfo> currentInfos = disabledBundles.get(disabledInfo.getBundle());
 			if ((currentInfos != null) && currentInfos.contains(disabledInfo)) {
 				currentInfos.remove(disabledInfo);
 				if (currentInfos.isEmpty()) {
@@ -1117,12 +1121,12 @@
 
 	public DisabledInfo getDisabledInfo(BundleDescription bundle, String policyName) {
 		synchronized (this.monitor) {
-			ArrayList currentInfos = (ArrayList) disabledBundles.get(bundle);
+			List<DisabledInfo> currentInfos = disabledBundles.get(bundle);
 			if (currentInfos == null)
 				return null;
-			Iterator it = currentInfos.iterator();
+			Iterator<DisabledInfo> it = currentInfos.iterator();
 			while (it.hasNext()) {
-				DisabledInfo currentInfo = (DisabledInfo) it.next();
+				DisabledInfo currentInfo = it.next();
 				if (currentInfo.getPolicyName().equals(policyName)) {
 					return currentInfo;
 				}
@@ -1133,8 +1137,8 @@
 
 	public DisabledInfo[] getDisabledInfos(BundleDescription bundle) {
 		synchronized (this.monitor) {
-			ArrayList currentInfos = (ArrayList) disabledBundles.get(bundle);
-			return currentInfos == null ? EMPTY_DISABLEDINFOS : (DisabledInfo[]) currentInfos.toArray(new DisabledInfo[currentInfos.size()]);
+			List<DisabledInfo> currentInfos = disabledBundles.get(bundle);
+			return currentInfos == null ? EMPTY_DISABLEDINFOS : currentInfos.toArray(new DisabledInfo[currentInfos.size()]);
 		}
 	}
 
@@ -1142,11 +1146,11 @@
 	 * Used by StateWriter to get all the DisabledInfo objects to persist
 	 */
 	DisabledInfo[] getDisabledInfos() {
-		ArrayList results = new ArrayList();
+		List<DisabledInfo> results = new ArrayList<DisabledInfo>();
 		synchronized (this.monitor) {
-			for (Iterator allDisabledInfos = disabledBundles.values().iterator(); allDisabledInfos.hasNext();)
-				results.addAll((Collection) allDisabledInfos.next());
+			for (Iterator<List<DisabledInfo>> allDisabledInfos = disabledBundles.values().iterator(); allDisabledInfos.hasNext();)
+				results.addAll(allDisabledInfos.next());
 		}
-		return (DisabledInfo[]) results.toArray(new DisabledInfo[results.size()]);
+		return results.toArray(new DisabledInfo[results.size()]);
 	}
 }
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateObjectFactoryImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateObjectFactoryImpl.java
index 782be7e..a864a22 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateObjectFactoryImpl.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateObjectFactoryImpl.java
@@ -24,11 +24,11 @@
 	/**
 	 * @deprecated
 	 */
-	public BundleDescription createBundleDescription(Dictionary manifest, String location, long id) throws BundleException {
+	public BundleDescription createBundleDescription(Dictionary<String, String> manifest, String location, long id) throws BundleException {
 		return createBundleDescription(null, manifest, location, id);
 	}
 
-	public BundleDescription createBundleDescription(State state, Dictionary manifest, String location, long id) throws BundleException {
+	public BundleDescription createBundleDescription(State state, Dictionary<String, String> manifest, String location, long id) throws BundleException {
 		BundleDescriptionImpl result = (BundleDescriptionImpl) StateBuilder.createBundleDescription((StateImpl) state, manifest, location);
 		result.setBundleId(id);
 		return result;
@@ -200,7 +200,7 @@
 		return hostSpec;
 	}
 
-	public ImportPackageSpecification createImportPackageSpecification(String packageName, VersionRange versionRange, String bundleSymbolicName, VersionRange bundleVersionRange, Map directives, Map attributes, BundleDescription importer) {
+	public ImportPackageSpecification createImportPackageSpecification(String packageName, VersionRange versionRange, String bundleSymbolicName, VersionRange bundleVersionRange, Map<String, ?> directives, Map<String, ?> attributes, BundleDescription importer) {
 		ImportPackageSpecificationImpl packageSpec = new ImportPackageSpecificationImpl();
 		packageSpec.setName(packageName);
 		packageSpec.setVersionRange(versionRange);
@@ -227,7 +227,7 @@
 		return createExportPackageDescription(original.getName(), original.getVersion(), original.getDirectives(), original.getAttributes(), true, null);
 	}
 
-	public ExportPackageDescription createExportPackageDescription(String packageName, Version version, Map directives, Map attributes, boolean root, BundleDescription exporter) {
+	public ExportPackageDescription createExportPackageDescription(String packageName, Version version, Map<String, ?> directives, Map<String, ?> attributes, boolean root, BundleDescription exporter) {
 		ExportPackageDescriptionImpl exportPackage = new ExportPackageDescriptionImpl();
 		exportPackage.setName(packageName);
 		exportPackage.setVersion(version);
@@ -240,18 +240,18 @@
 	/**
 	 * @deprecated
 	 */
-	public GenericDescription createGenericDescription(String name, String type, Version version, Map attributes) {
+	public GenericDescription createGenericDescription(String name, String type, Version version, Map<String, ?> attributes) {
 		return createGenericDescription(name, type, version, attributes, null, null);
 	}
 
-	public GenericDescription createGenericDescription(String type, Map attributes, Map directives, BundleDescription supplier) {
+	public GenericDescription createGenericDescription(String type, Map<String, ?> attributes, Map<String, String> directives, BundleDescription supplier) {
 		return createGenericDescription(null, type, null, attributes, directives, supplier);
 	}
 
-	private GenericDescription createGenericDescription(String name, String type, Version version, Map attributes, Map directives, BundleDescription supplier) {
+	private GenericDescription createGenericDescription(String name, String type, Version version, Map<String, ?> attributes, Map<String, String> directives, BundleDescription supplier) {
 		GenericDescriptionImpl result = new GenericDescriptionImpl();
 		result.setType(type);
-		Dictionary attrs = attributes == null ? new Hashtable() : new Hashtable(attributes);
+		Dictionary<String, Object> attrs = attributes == null ? new Hashtable<String, Object>() : new Hashtable<String, Object>(attributes);
 		if (version != null) {
 			Object versionObj = attrs.get(Constants.VERSION_ATTRIBUTE);
 			if (!(versionObj instanceof Version) && version != null)
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateReader.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateReader.java
index 2590231..bad9196 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateReader.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateReader.java
@@ -32,13 +32,13 @@
 	public static final String LAZY_FILE = ".lazy"; //$NON-NLS-1$
 	private static final int BUFFER_SIZE_LAZY = 4096;
 	private static final int BUFFER_SIZE_FULLYREAD = 16384;
-	private static final SecureAction secureAction = (SecureAction) AccessController.doPrivileged(SecureAction.createSecureAction());
+	private static final SecureAction secureAction = AccessController.doPrivileged(SecureAction.createSecureAction());
 
 	// objectTable will be a hashmap of objects. The objects will be things
 	// like BundleDescription, ExportPackageDescription, Version etc.. The integer
 	// index value will be used in the cache to allow cross-references in the
 	// cached state.
-	final Map objectTable = Collections.synchronizedMap(new HashMap());
+	final Map<Integer, Object> objectTable = Collections.synchronizedMap(new HashMap<Integer, Object>());
 
 	private volatile File stateFile;
 	private volatile File lazyFile;
@@ -47,7 +47,7 @@
 	private volatile int numBundles;
 	private volatile boolean accessedFlag = false;
 
-	public static final byte STATE_CACHE_VERSION = 33;
+	public static final byte STATE_CACHE_VERSION = 34;
 	public static final byte NULL = 0;
 	public static final byte OBJECT = 1;
 	public static final byte INDEX = 2;
@@ -97,9 +97,9 @@
 			String[] platformPropKeys = (String[]) readPlatformProp(in);
 			state.addPlatformPropertyKeys(platformPropKeys);
 			int numSets = in.readInt();
-			Dictionary[] platformProps = new Dictionary[numSets];
+			Dictionary<?, ?>[] platformProps = new Dictionary[numSets];
 			for (int i = 0; i < numSets; i++) {
-				Hashtable props = new Hashtable(platformPropKeys.length);
+				Hashtable<Object, Object> props = new Hashtable<Object, Object>(platformPropKeys.length);
 				int numProps = in.readInt();
 				for (int j = 0; j < numProps; j++) {
 					Object value = readPlatformProp(in);
@@ -157,9 +157,9 @@
 		String[] platformPropKeys = (String[]) readPlatformProp(in);
 		state.addPlatformPropertyKeys(platformPropKeys);
 		int numSets = in.readInt();
-		Dictionary[] platformProps = new Dictionary[numSets];
+		Dictionary<?, ?>[] platformProps = new Dictionary[numSets];
 		for (int i = 0; i < numSets; i++) {
-			Hashtable props = new Hashtable(platformPropKeys.length);
+			Hashtable<Object, Object> props = new Hashtable<Object, Object>(platformPropKeys.length);
 			int numProps = in.readInt();
 			for (int j = 0; j < numProps; j++) {
 				Object value = readPlatformProp(in);
@@ -324,7 +324,7 @@
 
 		int dynamicPkgCnt = in.readInt();
 		if (dynamicPkgCnt > 0) {
-			HashMap dynamicStamps = new HashMap(dynamicPkgCnt);
+			HashMap<String, Long> dynamicStamps = new HashMap<String, Long>(dynamicPkgCnt);
 			for (int i = 0; i < dynamicPkgCnt; i++) {
 				String pkg = readString(in, false);
 				Long stamp = new Long(in.readLong());
@@ -403,11 +403,11 @@
 		return new DisabledInfo(readString(in, false), readString(in, false), readBundleDescription(in));
 	}
 
-	private Map readMap(DataInputStream in) throws IOException {
+	private Map<String, Object> readMap(DataInputStream in) throws IOException {
 		int count = in.readInt();
 		if (count == 0)
 			return null;
-		HashMap result = new HashMap(count);
+		HashMap<String, Object> result = new HashMap<String, Object>(count);
 		for (int i = 0; i < count; i++) {
 			String key = readString(in, false);
 			Object value = null;
@@ -429,8 +429,8 @@
 			else if (type == 7) {
 				value = readString(in, false);
 				try {
-					Class uriClazz = Class.forName("java.net.URI"); //$NON-NLS-1$
-					Constructor constructor = uriClazz.getConstructor(new Class[] {String.class});
+					Class<?> uriClazz = Class.forName("java.net.URI"); //$NON-NLS-1$
+					Constructor<?> constructor = uriClazz.getConstructor(new Class[] {String.class});
 					value = constructor.newInstance(new Object[] {value});
 				} catch (ClassNotFoundException e) {
 					// oh well cannot support; just use the string
@@ -439,6 +439,32 @@
 				} catch (Exception e) {
 					throw new RuntimeException(e.getMessage(), e);
 				}
+			} else if (type == 8) {
+				int listType = in.readByte();
+				int size = in.readInt();
+				List<Object> list = new ArrayList<Object>(size);
+				for (int j = 0; j < size; j++) {
+					switch (listType) {
+						case 0 :
+							list.add(readString(in, false));
+							break;
+						case 3 :
+							list.add(new Integer(in.readInt()));
+							break;
+						case 4 :
+							list.add(new Long(in.readLong()));
+							break;
+						case 5 :
+							list.add(new Double(in.readDouble()));
+							break;
+						case 6 :
+							list.add(readVersion(in));
+							break;
+						default :
+							throw new IOException("Invalid type: " + listType); //$NON-NLS-1$
+					}
+				}
+				value = list;
 			}
 			result.put(key, value);
 		}
@@ -499,11 +525,11 @@
 		readBaseDescription(result, in);
 		result.setSupplier(readBundleDescription(in));
 		result.setType(readString(in, false));
-		Map mapAttrs = readMap(in);
-		Dictionary attrs = new Hashtable();
+		Map<String, Object> mapAttrs = readMap(in);
+		Dictionary<String, Object> attrs = new Hashtable<String, Object>();
 		if (mapAttrs != null) {
-			for (Iterator keys = mapAttrs.keySet().iterator(); keys.hasNext();) {
-				Object key = keys.next();
+			for (Iterator<String> keys = mapAttrs.keySet().iterator(); keys.hasNext();) {
+				String key = keys.next();
 				attrs.put(key, mapAttrs.get(key));
 			}
 		}
@@ -688,7 +714,7 @@
 		try {
 			in = openLazyFile();
 			// get the set of bundles that must be loaded according to dependencies
-			ArrayList toLoad = new ArrayList();
+			List<BundleDescriptionImpl> toLoad = new ArrayList<BundleDescriptionImpl>();
 			addDependencies(target, toLoad);
 			int skipBytes[] = getSkipBytes(toLoad);
 			// look for the lazy data of the toLoad list
@@ -700,14 +726,14 @@
 		}
 	}
 
-	private void addDependencies(BundleDescriptionImpl target, List toLoad) {
+	private void addDependencies(BundleDescriptionImpl target, List<BundleDescriptionImpl> toLoad) {
 		if (toLoad.contains(target) || target.isFullyLoaded())
 			return;
-		Iterator load = toLoad.iterator();
+		Iterator<BundleDescriptionImpl> load = toLoad.iterator();
 		int i = 0;
 		while (load.hasNext()) {
 			// insert the target into the list sorted by lazy data offsets
-			BundleDescriptionImpl bundle = (BundleDescriptionImpl) load.next();
+			BundleDescriptionImpl bundle = load.next();
 			if (target.getLazyDataOffset() < bundle.getLazyDataOffset())
 				break;
 			i++;
@@ -716,28 +742,28 @@
 			toLoad.add(target);
 		else
 			toLoad.add(i, target);
-		List deps = target.getBundleDependencies();
-		for (Iterator iter = deps.iterator(); iter.hasNext();)
+		List<BundleDescription> deps = target.getBundleDependencies();
+		for (Iterator<BundleDescription> iter = deps.iterator(); iter.hasNext();)
 			addDependencies((BundleDescriptionImpl) iter.next(), toLoad);
 	}
 
-	private int[] getSkipBytes(ArrayList toLoad) {
+	private int[] getSkipBytes(List<BundleDescriptionImpl> toLoad) {
 		int[] skipBytes = new int[toLoad.size()];
 		for (int i = 0; i < skipBytes.length; i++) {
-			BundleDescriptionImpl current = (BundleDescriptionImpl) toLoad.get(i);
+			BundleDescriptionImpl current = toLoad.get(i);
 			if (i == 0) {
 				skipBytes[i] = current.getLazyDataOffset();
 				continue;
 			}
-			BundleDescriptionImpl previous = (BundleDescriptionImpl) toLoad.get(i - 1);
+			BundleDescriptionImpl previous = toLoad.get(i - 1);
 			skipBytes[i] = current.getLazyDataOffset() - previous.getLazyDataOffset() - previous.getLazyDataSize();
 		}
 		return skipBytes;
 	}
 
 	void flushLazyObjectCache() {
-		for (Iterator entries = objectTable.entrySet().iterator(); entries.hasNext();) {
-			Map.Entry entry = (Entry) entries.next();
+		for (Iterator<Entry<Integer, Object>> entries = objectTable.entrySet().iterator(); entries.hasNext();) {
+			Map.Entry<Integer, Object> entry = entries.next();
 			if (entry.getValue() instanceof ExportPackageDescription || entry.getValue() instanceof GenericDescription)
 				entries.remove();
 		}
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateWriter.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateWriter.java
index bb2bb17..6f01d6a 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateWriter.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateWriter.java
@@ -14,7 +14,8 @@
 import java.io.*;
 import java.util.*;
 import org.eclipse.osgi.service.resolver.*;
-import org.osgi.framework.*;
+import org.osgi.framework.Filter;
+import org.osgi.framework.Version;
 
 /**
  * This class is <strong>not</strong> thread safe. Instances must not be
@@ -26,12 +27,12 @@
 	// like BundleDescription, ExportPackageDescription, Version etc.. The integer
 	// index value will be used in the cache to allow cross-references in the
 	// cached state.
-	private final Map objectTable = new HashMap();
+	private final Map<Object, Integer> objectTable = new HashMap<Object, Integer>();
 
-	private final ArrayList forcedWrite = new ArrayList();
+	private final List<BundleDescription> forcedWrite = new ArrayList<BundleDescription>();
 
 	private int addToObjectTable(Object object) {
-		Integer cur = (Integer) objectTable.get(object);
+		Integer cur = objectTable.get(object);
 		if (cur != null)
 			return cur.intValue();
 		objectTable.put(object, new Integer(objectTable.size()));
@@ -67,10 +68,10 @@
 		// write the platform property keys
 		String[] platformPropKeys = state.getPlatformPropertyKeys();
 		writePlatformProp(platformPropKeys, out);
-		Dictionary[] propSet = state.getPlatformProperties();
+		Dictionary<Object, Object>[] propSet = state.getPlatformProperties();
 		out.writeInt(propSet.length);
 		for (int i = 0; i < propSet.length; i++) {
-			Dictionary props = propSet[i];
+			Dictionary<Object, Object> props = propSet[i];
 			out.writeInt(platformPropKeys.length);
 			for (int j = 0; j < platformPropKeys.length; j++)
 				writePlatformProp(props.get(platformPropKeys[j]), out);
@@ -117,10 +118,10 @@
 			String[] platformPropKeys = state.getPlatformPropertyKeys();
 			writePlatformProp(platformPropKeys, outState);
 			// write the platform property values
-			Dictionary[] propSet = state.getPlatformProperties();
+			Dictionary<Object, Object>[] propSet = state.getPlatformProperties();
 			outState.writeInt(propSet.length);
 			for (int i = 0; i < propSet.length; i++) {
-				Dictionary props = propSet[i];
+				Dictionary<Object, Object> props = propSet[i];
 				outState.writeInt(platformPropKeys.length);
 				for (int j = 0; j < platformPropKeys.length; j++)
 					writePlatformProp(props.get(platformPropKeys[j]), outState);
@@ -212,10 +213,10 @@
 		out.writeBoolean(bundle.dynamicFragments());
 		writeHostSpec((HostSpecificationImpl) bundle.getHost(), out, force);
 
-		List dependencies = ((BundleDescriptionImpl) bundle).getBundleDependencies();
+		List<BundleDescription> dependencies = ((BundleDescriptionImpl) bundle).getBundleDependencies();
 		out.writeInt(dependencies.size());
-		for (Iterator iter = dependencies.iterator(); iter.hasNext();)
-			writeBundleDescription((BundleDescription) iter.next(), out, force);
+		for (Iterator<BundleDescription> iter = dependencies.iterator(); iter.hasNext();)
+			writeBundleDescription(iter.next(), out, force);
 		// the rest is lazy loaded data
 	}
 
@@ -284,15 +285,15 @@
 		for (int i = 0; i < ees.length; i++)
 			writeStringOrNull(ees[i], out);
 
-		HashMap dynamicStamps = ((BundleDescriptionImpl) bundle).getDynamicStamps();
+		Map<String, Long> dynamicStamps = ((BundleDescriptionImpl) bundle).getDynamicStamps();
 		if (dynamicStamps == null)
 			out.writeInt(0);
 		else {
 			out.writeInt(dynamicStamps.size());
-			for (Iterator pkgs = dynamicStamps.keySet().iterator(); pkgs.hasNext();) {
-				String pkg = (String) pkgs.next();
+			for (Iterator<String> pkgs = dynamicStamps.keySet().iterator(); pkgs.hasNext();) {
+				String pkg = pkgs.next();
 				writeStringOrNull(pkg, out);
-				out.writeLong(((Long) dynamicStamps.get(pkg)).longValue());
+				out.writeLong(dynamicStamps.get(pkg).longValue());
 			}
 		}
 
@@ -366,15 +367,14 @@
 		writeBaseDescription(description, out);
 		writeBundleDescription(description.getSupplier(), out, false);
 		writeStringOrNull(description.getType() == GenericDescription.DEFAULT_TYPE ? null : description.getType(), out);
-		Dictionary attrs = description.getAttributes();
-		Map mapAttrs = new HashMap(attrs.size());
-		for (Enumeration keys = attrs.keys(); keys.hasMoreElements();) {
-			Object key = keys.nextElement();
-			if (!Constants.VERSION_ATTRIBUTE.equals(key))
-				mapAttrs.put(key, attrs.get(key));
+		Dictionary<String, Object> attrs = description.getAttributes();
+		Map<String, Object> mapAttrs = new HashMap<String, Object>(attrs.size());
+		for (Enumeration<String> keys = attrs.keys(); keys.hasMoreElements();) {
+			String key = keys.nextElement();
+			mapAttrs.put(key, attrs.get(key));
 		}
 		writeMap(out, mapAttrs);
-		Map directives = description.getDeclaredDirectives();
+		Map<String, String> directives = description.getDeclaredDirectives();
 		writeMap(out, directives);
 	}
 
@@ -438,14 +438,14 @@
 			writeStringOrNull(strings[i], out);
 	}
 
-	private void writeMap(DataOutputStream out, Map source) throws IOException {
+	private void writeMap(DataOutputStream out, Map<String, ?> source) throws IOException {
 		if (source == null) {
 			out.writeInt(0);
 		} else {
 			out.writeInt(source.size());
-			Iterator iter = source.keySet().iterator();
+			Iterator<String> iter = source.keySet().iterator();
 			while (iter.hasNext()) {
-				String key = (String) iter.next();
+				String key = iter.next();
 				Object value = source.get(key);
 				writeStringOrNull(key, out);
 				if (value instanceof String) {
@@ -472,11 +472,60 @@
 				} else if ("java.net.URI".equals(value.getClass().getName())) { //$NON-NLS-1$
 					out.writeByte(7);
 					writeStringOrNull(value.toString(), out);
+				} else if (value instanceof List) {
+					writeList(out, (List<?>) value);
 				}
 			}
 		}
 	}
 
+	private void writeList(DataOutputStream out, List<?> list) throws IOException {
+		byte type = getListType(list);
+		if (type == -2)
+			return; // don't understand the list type
+		out.writeByte(8);
+		out.writeByte(type);
+		out.writeInt(list.size());
+		for (Object value : list) {
+			switch (type) {
+				case 0 :
+					writeStringOrNull((String) value, out);
+					break;
+				case 3 :
+					out.writeInt(((Integer) value).intValue());
+					break;
+				case 4 :
+					out.writeLong(((Long) value).longValue());
+					break;
+				case 5 :
+					out.writeDouble(((Double) value).doubleValue());
+					break;
+				case 6 :
+					writeVersion((Version) value, out);
+					break;
+				default :
+					break;
+			}
+		}
+	}
+
+	private byte getListType(List<?> list) {
+		if (list.size() == 0)
+			return -1;
+		Object type = list.get(0);
+		if (type instanceof String)
+			return 0;
+		if (type instanceof Integer)
+			return 3;
+		if (type instanceof Long)
+			return 4;
+		if (type instanceof Double)
+			return 5;
+		if (type instanceof Version)
+			return 6;
+		return -2;
+	}
+
 	private void writeList(DataOutputStream out, String[] list) throws IOException {
 		if (list == null) {
 			out.writeInt(0);
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/UserState.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/UserState.java
index 9fcfdbc..9059279 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/UserState.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/UserState.java
@@ -20,7 +20,7 @@
  */
 public class UserState extends StateImpl {
 	// TODO this is not an accurate way to record updates
-	private final Set updated = Collections.synchronizedSet(new HashSet());
+	private final Set<String> updated = Collections.synchronizedSet(new HashSet<String>());
 
 	public boolean removeBundle(BundleDescription description) {
 		if (description.getLocation() != null)