diff --git a/src/org/apache/xalan/lib/ExsltSets.java b/src/org/apache/xalan/lib/ExsltSets.java
index 6fca386..77e8eab 100644
--- a/src/org/apache/xalan/lib/ExsltSets.java
+++ b/src/org/apache/xalan/lib/ExsltSets.java
@@ -20,7 +20,8 @@
  */
 package org.apache.xalan.lib;
 
-import java.util.Hashtable;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.xml.utils.DOMHelper;
 import org.apache.xpath.NodeSet;
@@ -190,7 +191,7 @@
     NodeSet dist = new NodeSet();
     dist.setShouldCacheNodes(true);
 
-    Hashtable stringTable = new Hashtable();
+    Map stringTable = new HashMap();
     
     for (int i = 0; i < nl.getLength(); i++)
     {
diff --git a/src/org/apache/xalan/processor/ProcessorKey.java b/src/org/apache/xalan/processor/ProcessorKey.java
index e8bec0e..602649c 100644
--- a/src/org/apache/xalan/processor/ProcessorKey.java
+++ b/src/org/apache/xalan/processor/ProcessorKey.java
@@ -20,12 +20,12 @@
  */
 package org.apache.xalan.processor;
 
-import java.util.Vector;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.xalan.res.XSLMessages;
 import org.apache.xalan.res.XSLTErrorResources;
 import org.apache.xalan.templates.KeyDeclaration;
-
 import org.xml.sax.Attributes;
 
 /**
@@ -93,7 +93,7 @@
 
     // Keep track of which XSLTAttributeDefs have been processed, so 
     // I can see which default values need to be set.
-    Vector processedDefs = new Vector();
+    List processedDefs = new ArrayList();
     int nAttrs = attributes.getLength();
 
     for (int i = 0; i < nAttrs; i++)
@@ -120,7 +120,7 @@
             XSLMessages.createMessage(
             XSLTErrorResources.ER_INVALID_KEY_CALL, null), null);
 
-        processedDefs.addElement(attrDef);
+        processedDefs.add(attrDef);
         attrDef.setAttrValue(handler, attrUri, attrLocalName,
                              attributes.getQName(i), attributes.getValue(i),
                              target);
diff --git a/src/org/apache/xalan/processor/XSLTElementProcessor.java b/src/org/apache/xalan/processor/XSLTElementProcessor.java
index 2312b81..47516ee 100644
--- a/src/org/apache/xalan/processor/XSLTElementProcessor.java
+++ b/src/org/apache/xalan/processor/XSLTElementProcessor.java
@@ -20,13 +20,16 @@
  */
 package org.apache.xalan.processor;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Vector;
 
+import javax.xml.transform.TransformerException;
+
 import org.apache.xalan.res.XSLMessages;
 import org.apache.xalan.res.XSLTErrorResources;
 import org.apache.xalan.templates.ElemTemplateElement;
 import org.apache.xml.utils.IntStack;
-
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.helpers.AttributesImpl;
@@ -296,10 +299,10 @@
 
     // Keep track of which XSLTAttributeDefs have been processed, so 
     // I can see which default values need to be set.
-    Vector processedDefs = new Vector();
+    List processedDefs = new ArrayList();
 
     // Keep track of XSLTAttributeDefs that were invalid
-    Vector errorDefs = new Vector();    
+    List errorDefs = new ArrayList();    
     int nAttrs = attributes.getLength();
 
     for (int i = 0; i < nAttrs; i++)
@@ -343,9 +346,9 @@
                              
         // Now we only add the element if it passed a validation check
         if (success)
-            processedDefs.addElement(attrDef);
+            processedDefs.add(attrDef);
         else
-            errorDefs.addElement(attrDef);
+            errorDefs.add(attrDef);
       }
     }
 
diff --git a/src/org/apache/xalan/xsltc/compiler/Choose.java b/src/org/apache/xalan/xsltc/compiler/Choose.java
index cad0b6d..95d3e24 100644
--- a/src/org/apache/xalan/xsltc/compiler/Choose.java
+++ b/src/org/apache/xalan/xsltc/compiler/Choose.java
@@ -21,7 +21,10 @@
 
 package org.apache.xalan.xsltc.compiler;
 
+import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Vector;
 
 import org.apache.bcel.generic.BranchHandle;
@@ -58,7 +61,7 @@
      * <xsl:when> elements and default to the <xsl:otherwise> if present.
      */
     public void translate(ClassGenerator classGen, MethodGenerator methodGen) {
-	final Vector whenElements = new Vector();
+	final List whenElements = new ArrayList();
 	Otherwise otherwise = null;
 	Enumeration elements = elements();
 
@@ -71,7 +74,7 @@
 	    Object element = elements.nextElement();
 	    // Add a When child element
 	    if (element instanceof When) {
-		whenElements.addElement(element);
+		whenElements.add(element);
 	    }
 	    // Add an Otherwise child element
 	    else if (element instanceof Otherwise) {
@@ -105,12 +108,12 @@
 	// next element will hold a handle to the beginning of next
 	// When/Otherwise if test on current When fails
 	BranchHandle nextElement = null;
-	Vector exitHandles = new Vector();
+	List exitHandles = new ArrayList();
 	InstructionHandle exit = null;
 
-	Enumeration whens = whenElements.elements();
-	while (whens.hasMoreElements()) {
-	    final When when = (When)whens.nextElement();
+	Iterator whens = whenElements.iterator();
+	while (whens.hasNext()) {
+	    final When when = (When)whens.next();
 	    final Expression test = when.getTest();
 
 	    InstructionHandle truec = il.getEnd();
@@ -139,8 +142,8 @@
 	    if (!when.ignore()) when.translateContents(classGen, methodGen);
 
 	    // goto exit after executing the body of when
-	    exitHandles.addElement(il.append(new GOTO(null)));
-	    if (whens.hasMoreElements() || otherwise != null) {
+	    exitHandles.add(il.append(new GOTO(null)));
+	    if (whens.hasNext() || otherwise != null) {
 		nextElement = il.append(new GOTO(null));
 		test.backPatchFalseList(nextElement);
 	    }
@@ -157,9 +160,9 @@
 	}
 
 	// now that end is known set targets of exit gotos
-	Enumeration exitGotos = exitHandles.elements();
-	while (exitGotos.hasMoreElements()) {
-	    BranchHandle gotoExit = (BranchHandle)exitGotos.nextElement();
+	Iterator exitGotos = exitHandles.iterator();
+	while (exitGotos.hasNext()) {
+	    BranchHandle gotoExit = (BranchHandle)exitGotos.next();
 	    gotoExit.setTarget(exit);
 	}
     }
diff --git a/src/org/apache/xalan/xsltc/trax/DOM2SAX.java b/src/org/apache/xalan/xsltc/trax/DOM2SAX.java
index d66c683..3e01598 100644
--- a/src/org/apache/xalan/xsltc/trax/DOM2SAX.java
+++ b/src/org/apache/xalan/xsltc/trax/DOM2SAX.java
@@ -23,13 +23,14 @@
 package org.apache.xalan.xsltc.trax;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Stack;
-import java.util.Vector;
 
+import org.apache.xalan.xsltc.dom.SAXImpl;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
-
 import org.xml.sax.ContentHandler;
 import org.xml.sax.DTDHandler;
 import org.xml.sax.EntityResolver;
@@ -42,7 +43,6 @@
 import org.xml.sax.XMLReader;
 import org.xml.sax.ext.LexicalHandler;
 import org.xml.sax.helpers.AttributesImpl;
-import org.apache.xalan.xsltc.dom.SAXImpl;
 
 /**
  * @author G. Todd Miller 
@@ -217,7 +217,7 @@
 
 	case Node.ELEMENT_NODE:
 	    String prefix;
-	    Vector pushedPrefixes = new Vector();
+	    List pushedPrefixes = new ArrayList();
 	    final AttributesImpl attrs = new AttributesImpl();
 	    final NamedNodeMap map = node.getAttributes();
 	    final int length = map.getLength();
@@ -233,7 +233,7 @@
 		    final int colon = qnameAttr.lastIndexOf(':');
 		    prefix = (colon > 0) ? qnameAttr.substring(colon + 1) : EMPTYSTRING;
 		    if (startPrefixMapping(prefix, uriAttr)) {
-			pushedPrefixes.addElement(prefix);
+			pushedPrefixes.add(prefix);
 		    }
 		}
 	    }
@@ -253,7 +253,7 @@
 			final int colon = qnameAttr.lastIndexOf(':');
 			prefix = (colon > 0) ? qnameAttr.substring(0, colon) : EMPTYSTRING;
 			if (startPrefixMapping(prefix, uriAttr)) {
-			    pushedPrefixes.addElement(prefix);
+			    pushedPrefixes.add(prefix);
 			}
 		    }
 
@@ -273,7 +273,7 @@
 		final int colon = qname.lastIndexOf(':');
 		prefix = (colon > 0) ? qname.substring(0, colon) : EMPTYSTRING;
 		if (startPrefixMapping(prefix, uri)) {
-		    pushedPrefixes.addElement(prefix);
+		    pushedPrefixes.add(prefix);
 		}
 	    }
 
@@ -298,7 +298,7 @@
 	    // Generate endPrefixMapping() for all pushed prefixes
 	    final int nPushedPrefixes = pushedPrefixes.size();
 	    for (int i = 0; i < nPushedPrefixes; i++) {
-		endPrefixMapping((String) pushedPrefixes.elementAt(i));
+		endPrefixMapping((String) pushedPrefixes.get(i));
 	    }
 	    break;
 
diff --git a/src/org/apache/xalan/xsltc/trax/TransformerFactoryImpl.java b/src/org/apache/xalan/xsltc/trax/TransformerFactoryImpl.java
index 72a9009..868dfef 100644
--- a/src/org/apache/xalan/xsltc/trax/TransformerFactoryImpl.java
+++ b/src/org/apache/xalan/xsltc/trax/TransformerFactoryImpl.java
@@ -29,18 +29,18 @@
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Properties;
 import java.util.Vector;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
 import javax.xml.XMLConstants;
-import javax.xml.parsers.SAXParserFactory;
 import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.ParserConfigurationException;
-
+import javax.xml.parsers.SAXParserFactory;
 import javax.xml.transform.ErrorListener;
 import javax.xml.transform.Source;
 import javax.xml.transform.Templates;
@@ -58,15 +58,12 @@
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.transform.stream.StreamSource;
 
-import org.apache.xml.utils.StylesheetPIHandler;
-import org.apache.xml.utils.StopParseException;
-
 import org.apache.xalan.xsltc.compiler.SourceLoader;
 import org.apache.xalan.xsltc.compiler.XSLTC;
 import org.apache.xalan.xsltc.compiler.util.ErrorMsg;
 import org.apache.xalan.xsltc.dom.XSLTCDTMManager;
-
-
+import org.apache.xml.utils.StopParseException;
+import org.apache.xml.utils.StylesheetPIHandler;
 import org.xml.sax.InputSource;
 import org.xml.sax.XMLFilter;
 import org.xml.sax.XMLReader;
@@ -1139,7 +1136,7 @@
     	}
     	
     	// Load the translet into a bytecode array.
-    	Vector bytecodes = new Vector();
+    	List bytecodes = new ArrayList();
     	int fileLength = (int)transletFile.length();
     	if (fileLength > 0) {
     	    FileInputStream input = null;
@@ -1159,7 +1156,7 @@
     	    	return null;
     	    }
     	  
-    	    bytecodes.addElement(bytes);
+    	    bytecodes.add(bytes);
     	}
     	else
     	    return null;
@@ -1204,7 +1201,7 @@
     	      	    continue;
     	    	}
     	    
-    	    	bytecodes.addElement(bytes);   	    
+    	    	bytecodes.add(bytes);   	    
     	    }
     	}
     	
@@ -1213,7 +1210,7 @@
     	if ( count > 0) {
     	    final byte[][] result = new byte[count][1];
     	    for (int i = 0; i < count; i++) {
-    	    	result[i] = (byte[])bytecodes.elementAt(i);
+    	    	result[i] = (byte[])bytecodes.get(i);
     	    }
     	  
     	    return result;
@@ -1274,7 +1271,7 @@
       	String transletAuxPrefix = transletPath + "$";
       	String transletFullName = transletPath + ".class";
       
-      	Vector bytecodes = new Vector();      
+      	List bytecodes = new ArrayList();      
       
       	// Iterate through all entries in the jar file to find the 
       	// translet and auxiliary classes.
@@ -1294,7 +1291,7 @@
               	    byte[] bytes = new byte[size];
               	    readFromInputStream(bytes, input, size);
               	    input.close();
-              	    bytecodes.addElement(bytes);
+              	    bytecodes.add(bytes);
             	}
             	catch (IOException e) {
               	    return null;
@@ -1307,7 +1304,7 @@
     	if (count > 0) {
     	    final byte[][] result = new byte[count][1];
     	    for (int i = 0; i < count; i++) {
-    	    	result[i] = (byte[])bytecodes.elementAt(i);
+    	    	result[i] = (byte[])bytecodes.get(i);
     	    }
     	  
     	    return result;
diff --git a/src/org/apache/xml/serializer/Encodings.java b/src/org/apache/xml/serializer/Encodings.java
index f3db4b9..6b051f1 100644
--- a/src/org/apache/xml/serializer/Encodings.java
+++ b/src/org/apache/xml/serializer/Encodings.java
@@ -25,11 +25,12 @@
 import java.io.OutputStreamWriter;
 import java.io.UnsupportedEncodingException;
 import java.io.Writer;
+import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Properties;
 import java.util.StringTokenizer;
-import java.util.Vector;
 
 
 /**
@@ -313,7 +314,7 @@
 
             int totalEntries = props.size();
 
-            Vector encodingInfo_list = new Vector();
+            List encodingInfo_list = new ArrayList();
             Enumeration keys = props.keys();
             for (int i = 0; i < totalEntries; ++i)
             {
diff --git a/src/org/apache/xml/utils/Hashtree2Node.java b/src/org/apache/xml/utils/Hashtree2Node.java
index fc9de53..49e3fd3 100644
--- a/src/org/apache/xml/utils/Hashtree2Node.java
+++ b/src/org/apache/xml/utils/Hashtree2Node.java
@@ -21,9 +21,11 @@
 
 package org.apache.xml.utils;
 
+import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.Hashtable;
-import java.util.Vector;
+import java.util.Iterator;
+import java.util.List;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -84,7 +86,7 @@
             container.appendChild(hashNode);
 
             Enumeration keys = hash.keys();
-            Vector v = new Vector();
+            List v = new ArrayList();
 
             while (keys.hasMoreElements())
             {
@@ -97,8 +99,8 @@
                     // Ensure a pre-order traversal; add this hashes 
                     //  items before recursing to child hashes
                     // Save name and hash in two steps
-                    v.addElement(keyStr);
-                    v.addElement((Hashtable) item);
+                    v.add(keyStr);
+                    v.add((Hashtable) item);
                 }
                 else
                 {
@@ -121,12 +123,12 @@
             }
 
             // Now go back and do the saved hashes
-            keys = v.elements();
-            while (keys.hasMoreElements())
+            Iterator it = v.iterator();
+            while (it.hasNext())
             {
                 // Retrieve name and hash in two steps
-                String n = (String) keys.nextElement();
-                Hashtable h = (Hashtable) keys.nextElement();
+                String n = (String) it.next();
+                Hashtable h = (Hashtable) it.next();
 
                 appendHashToNode(h, n, hashNode, factory);
             }
