Index: src/test/java/org/apache/james/mime4j/field/ContentTypeFieldTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/field/ContentTypeFieldTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/field/ContentTypeFieldTest.java	(working copy)
@@ -33,6 +33,7 @@
  */
 public class ContentTypeFieldTest extends TestCase {
 
+    @Override
     public void setUp() {
         BasicConfigurator.resetConfiguration();
         BasicConfigurator.configure();
Index: src/test/java/org/apache/james/mime4j/field/structured/StructuredFieldParserTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/field/structured/StructuredFieldParserTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/field/structured/StructuredFieldParserTest.java	(working copy)
@@ -24,10 +24,12 @@
 
 public class StructuredFieldParserTest extends TestCase {
 
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
Index: src/test/java/org/apache/james/mime4j/field/address/AddressTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/field/address/AddressTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/field/address/AddressTest.java	(working copy)
@@ -31,6 +31,7 @@
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 
 import junit.framework.TestCase;
 
@@ -190,7 +191,7 @@
     
     public void testAddressList() throws ParseException {
         AddressList addlist = AddressList.parse("foo@example.com, bar@example.com, third@example.com");
-        ArrayList al = new ArrayList();
+        List<Address> al = new ArrayList<Address>();
         al.add(addlist.get(0));
 
         // shared arraylist
@@ -229,6 +230,7 @@
             System.setOut(outPs);
             System.setErr(errPs);
             Thread t = new Thread() {
+                @Override
                 public void run() {
                     try {
                         AddressList.main(null);
@@ -292,7 +294,7 @@
     }
     
     public void testDomainList() {
-        ArrayList al = new ArrayList();
+        List<String> al = new ArrayList<String>();
         al.add("example.com");
 
         // shared arraylist
@@ -330,7 +332,7 @@
     }
 
     public void testMailboxList() {
-        ArrayList al = new ArrayList();
+        List<Mailbox> al = new ArrayList<Mailbox>();
         al.add(new Mailbox("local","example.com"));
 
         // shared arraylist
@@ -349,10 +351,10 @@
     }
     
     public void testGroupSerialization() {
-        ArrayList al = new ArrayList();
+        List<Mailbox> al = new ArrayList<Mailbox>();
         al.add(new Mailbox("test", "example.com"));
         al.add(new NamedMailbox("Foo!", "foo", "example.com"));
-        DomainList dl = new DomainList(new ArrayList(Arrays.asList(new String[] {"foo.example.com"})), true);
+        DomainList dl = new DomainList(new ArrayList<String>(Arrays.asList(new String[] {"foo.example.com"})), true);
         NamedMailbox namedMailbox = new NamedMailbox("Foo Bar", dl, "foo2", "example.com");
         assertSame(dl, namedMailbox.getRoute());
         al.add(namedMailbox);
Index: src/test/java/org/apache/james/mime4j/field/mimeversion/MimeVersionParserTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/field/mimeversion/MimeVersionParserTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/field/mimeversion/MimeVersionParserTest.java	(working copy)
@@ -25,10 +25,12 @@
 
 public class MimeVersionParserTest extends TestCase {
 
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
Index: src/test/java/org/apache/james/mime4j/message/MessageCompleteMailTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/message/MessageCompleteMailTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/message/MessageCompleteMailTest.java	(working copy)
@@ -26,10 +26,12 @@
 
 public class MessageCompleteMailTest extends TestCase {
 
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
Index: src/test/java/org/apache/james/mime4j/message/MessageParserTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/message/MessageParserTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/message/MessageParserTest.java	(working copy)
@@ -34,7 +34,6 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
-import java.util.Iterator;
 import java.util.List;
 
 import junit.framework.Test;
@@ -60,6 +59,7 @@
         this.file = file;
     }
 
+    @Override
     public void setUp() {
         BasicConfigurator.resetConfiguration();
         BasicConfigurator.configure();
@@ -90,6 +90,7 @@
         }
     }
     
+    @Override
     protected void runTest() throws IOException {
         File f = file;
         String fileName = file.getAbsolutePath();
@@ -139,7 +140,7 @@
     private String getStructure(Entity e, String prefix, String id) 
             throws IOException {
         
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         
         if (e instanceof Message) {
             sb.append("<message>\r\n");
@@ -148,8 +149,8 @@
         }            
         
         sb.append("<header>\r\n");
-        for (Iterator it = e.getHeader().getFields().iterator(); it.hasNext();) {
-            sb.append("<field>\r\n" + escape(((Field) it.next()).getRaw()) 
+        for (Field field : e.getHeader().getFields()) {
+            sb.append("<field>\r\n" + escape(field.getRaw()) 
                     + "</field>\r\n");
         }
         sb.append("</header>\r\n");
@@ -158,15 +159,15 @@
             sb.append("<multipart>\r\n");
             
             Multipart multipart =(Multipart) e.getBody(); 
-            List parts =multipart.getBodyParts();
+            List<BodyPart> parts = multipart.getBodyParts();
 
             sb.append("<preamble>\r\n");
             sb.append(escape(multipart.getPreamble()));
             sb.append("</preamble>\r\n");
             
             int i = 1;
-            for (Iterator it = parts.iterator(); it.hasNext();) {
-                sb.append(getStructure((Entity) it.next(), prefix, id + "_" + (i++)));
+            for (BodyPart bodyPart : parts) {
+                sb.append(getStructure(bodyPart, prefix, id + "_" + (i++)));
             }
 
             sb.append("<epilogue>\r\n");
Index: src/test/java/org/apache/james/mime4j/message/MessageWriteToTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/message/MessageWriteToTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/message/MessageWriteToTest.java	(working copy)
@@ -22,16 +22,17 @@
 import java.io.ByteArrayOutputStream;
 
 import org.apache.james.mime4j.ExampleMail;
-import org.apache.james.mime4j.util.MessageUtils;
 
 import junit.framework.TestCase;
 
 public class MessageWriteToTest extends TestCase {
 
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
@@ -40,7 +41,7 @@
         Message message = createMessage(ExampleMail.RFC822_SIMPLE_BYTES);
         assertFalse("Not multipart", message.isMultipart());
         ByteArrayOutputStream out = new ByteArrayOutputStream();
-        message.writeTo(out, MessageUtils.STRICT_IGNORE);
+        message.writeTo(out, Mode.STRICT_IGNORE);
         assertEquals(out.toByteArray(), ExampleMail.RFC822_SIMPLE_BYTES);
     }
     
@@ -48,7 +49,7 @@
         Message message = createMessage(ExampleMail.RFC822_SIMPLE_BYTES);
         assertFalse("Not multipart", message.isMultipart());
         ByteArrayOutputStream out = new ByteArrayOutputStream();
-        message.writeTo(out, MessageUtils.STRICT_ERROR);
+        message.writeTo(out, Mode.STRICT_ERROR);
         assertEquals(out.toByteArray(), ExampleMail.RFC822_SIMPLE_BYTES);
     }
     
@@ -56,12 +57,12 @@
         Message message = createMessage(ExampleMail.RFC822_SIMPLE_BYTES);
         assertFalse("Not multipart", message.isMultipart());
         ByteArrayOutputStream out = new ByteArrayOutputStream();
-        message.writeTo(out, MessageUtils.LENIENT);
+        message.writeTo(out, Mode.LENIENT);
         assertEquals(out.toByteArray(), ExampleMail.RFC822_SIMPLE_BYTES);
     }
     
     private void assertEquals(byte[] expected, byte[] actual) {
-        StringBuffer buffer = new StringBuffer(expected.length);
+        StringBuilder buffer = new StringBuilder(expected.length);
         assertEquals(expected.length, actual.length);
         for (int i = 0; i < actual.length; i++) {
             buffer.append((char)actual[i]);
@@ -73,7 +74,7 @@
         Message message = createMessage(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_BYTES);
         assertTrue("Is multipart", message.isMultipart());
         ByteArrayOutputStream out = new ByteArrayOutputStream();
-        message.writeTo(out, MessageUtils.LENIENT);
+        message.writeTo(out, Mode.LENIENT);
         assertEquals(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_BYTES, out.toByteArray());
     }
     
@@ -81,7 +82,7 @@
         Message message = createMessage(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_BYTES);
         assertTrue("Is multipart", message.isMultipart());
         ByteArrayOutputStream out = new ByteArrayOutputStream();
-        message.writeTo(out, MessageUtils.STRICT_ERROR);
+        message.writeTo(out, Mode.STRICT_ERROR);
         assertEquals(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_BYTES, out.toByteArray());
     }
     
@@ -89,7 +90,7 @@
         Message message = createMessage(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_BYTES);
         assertTrue("Is multipart", message.isMultipart());
         ByteArrayOutputStream out = new ByteArrayOutputStream();
-        message.writeTo(out, MessageUtils.STRICT_IGNORE);
+        message.writeTo(out, Mode.STRICT_IGNORE);
         assertEquals(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_BYTES, out.toByteArray());
     }
     
Index: src/test/java/org/apache/james/mime4j/message/MessageTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/message/MessageTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/message/MessageTest.java	(working copy)
@@ -33,7 +33,6 @@
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.field.Field;
-import org.apache.james.mime4j.util.MessageUtils;
 
 /**
  * 
@@ -48,6 +47,7 @@
     private Header headerMultipartMixed = null;
     private Header headerMultipartDigest = null;
 
+    @Override
     public void setUp() throws Exception {
         headerTextPlain = new Header();
         headerMessageRFC822 = new Header();
@@ -132,7 +132,7 @@
         Message m = new Message(new ByteArrayInputStream(inputByte));
         ByteArrayOutputStream out = new ByteArrayOutputStream();
 
-        m.writeTo(out, MessageUtils.LENIENT);
+        m.writeTo(out, Mode.LENIENT);
 
         InputStream output = new ByteArrayInputStream(out.toByteArray());
 
@@ -158,8 +158,8 @@
                 .getBody(), headerValue);
 
         ByteArrayOutputStream out = new ByteArrayOutputStream();
-        m.writeTo(out, MessageUtils.LENIENT);
-        List lines = IOUtils.readLines((new BufferedReader(
+        m.writeTo(out, Mode.LENIENT);
+        List<?> lines = IOUtils.readLines((new BufferedReader(
                 new InputStreamReader(new ByteArrayInputStream(out
                         .toByteArray())))));
 
@@ -195,9 +195,9 @@
     }
 
     private byte[] getRawMessageAsByteArray() {
-        StringBuffer header = new StringBuffer();
-        StringBuffer body = new StringBuffer();
-        StringBuffer complete = new StringBuffer();
+        StringBuilder header = new StringBuilder();
+        StringBuilder body = new StringBuilder();
+        StringBuilder complete = new StringBuilder();
 
         header.append("Date: Wed, 21 Feb 2007 11:09:27 +0100\r\n");
         header.append("From: Test <test@test>\r\n");
@@ -217,11 +217,12 @@
 
         public boolean disposed = false;
 
-        public void writeTo(OutputStream out, int mode) throws IOException,
+        public void writeTo(OutputStream out, Mode mode) throws IOException,
                 MimeException {
             out.write("dummy".getBytes("US-ASCII"));
         }
 
+        @Override
         public void dispose() {
             disposed = true;
         }
Index: src/test/java/org/apache/james/mime4j/message/MultipartFormTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/message/MultipartFormTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/message/MultipartFormTest.java	(working copy)
@@ -27,7 +27,6 @@
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mime4j.field.Field;
-import org.apache.james.mime4j.util.MessageUtils;
 
 import junit.framework.TestCase;
 
@@ -69,7 +68,7 @@
         multipart.addBodyPart(p3);
         
         ByteArrayOutputStream out = new ByteArrayOutputStream();
-        multipart.writeTo(out, MessageUtils.LENIENT);
+        multipart.writeTo(out, Mode.LENIENT);
         out.close();
         
         String expected = "\r\n" + 
@@ -115,7 +114,7 @@
             return new StringReader(this.text);
         }
 
-        public void writeTo(final OutputStream out, int mode) throws IOException {
+        public void writeTo(final OutputStream out, Mode mode) throws IOException {
             if (out == null) {
                 throw new IllegalArgumentException("Output stream may not be null");
             }
Index: src/test/java/org/apache/james/mime4j/message/HeaderTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/message/HeaderTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/message/HeaderTest.java	(working copy)
@@ -50,10 +50,10 @@
     };
         
     private static String constructString(int [] unicodeChars) {
-        StringBuffer buffer = new StringBuffer();
+        StringBuilder buffer = new StringBuilder();
         if (unicodeChars != null) {
-            for (int i = 0; i < unicodeChars.length; i++) {
-                buffer.append((char)unicodeChars[i]); 
+            for (int unicodeChar : unicodeChars) {
+                buffer.append((char) unicodeChar); 
             }
         }
         return buffer.toString();
@@ -70,7 +70,7 @@
         
         ByteArrayOutputStream buffer = new ByteArrayOutputStream();
         
-        header.writeTo(buffer, MessageUtils.STRICT_IGNORE);
+        header.writeTo(buffer, Mode.STRICT_IGNORE);
         String s = buffer.toString(MessageUtils.ASCII.name());
         
         assertEquals("Hello: Gr?ezi_z?m?\r\n\r\n", s);
@@ -78,7 +78,7 @@
         buffer.reset();
         
         try {
-            header.writeTo(buffer, MessageUtils.STRICT_ERROR);
+            header.writeTo(buffer, Mode.STRICT_ERROR);
             fail("MimeException should have been thrown");
         } catch (MimeException expected) {
         }
@@ -97,7 +97,7 @@
         
         ByteArrayOutputStream buffer = new ByteArrayOutputStream();
         
-        header.writeTo(buffer, MessageUtils.LENIENT);
+        header.writeTo(buffer, Mode.LENIENT);
         String s = buffer.toString(MessageUtils.ISO_8859_1.name());
         
         assertEquals("Hello: " + hello + "\r\n" +
@@ -120,7 +120,7 @@
         assertEquals(0, header.getFields("received").size());
         assertEquals(1, header.getFields("Content-Type").size());
 
-        assertEquals("Content-type", ((Field) header.getFields().get(0)).getName());
+        assertEquals("Content-type", header.getFields().get(0).getName());
     }
 
     public void testRemoveNonExistantField() throws Exception {
@@ -148,9 +148,9 @@
         assertEquals(3, header.getFields().size());
         assertEquals(1, header.getFields("received").size());
 
-        assertEquals("From", ((Field) header.getFields().get(0)).getName());
-        assertEquals("received", ((Field) header.getFields().get(1)).getName());
-        assertEquals("Content-type", ((Field) header.getFields().get(2)).getName());
+        assertEquals("From", header.getFields().get(0).getName());
+        assertEquals("received", header.getFields().get(1).getName());
+        assertEquals("Content-type", header.getFields().get(2).getName());
     }
 
     public void testSetNonExistantField() throws Exception {
@@ -164,7 +164,7 @@
         assertEquals(4, header.getFields().size());
         assertEquals(1, header.getFields("message-id").size());
 
-        assertEquals("Message-ID", ((Field) header.getFields().get(3)).getName());
+        assertEquals("Message-ID", header.getFields().get(3).getName());
     }
     
 }
Index: src/test/java/org/apache/james/mime4j/message/ExampleMessagesRoundtripTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/message/ExampleMessagesRoundtripTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/message/ExampleMessagesRoundtripTest.java	(working copy)
@@ -20,9 +20,7 @@
 package org.apache.james.mime4j.message;
 
 import org.apache.james.mime4j.decoder.CodecUtil;
-import org.apache.james.mime4j.message.Message;
 import org.apache.james.mime4j.parser.MimeEntityConfig;
-import org.apache.james.mime4j.util.MessageUtils;
 import org.apache.log4j.BasicConfigurator;
 
 import java.io.ByteArrayOutputStream;
@@ -54,17 +52,19 @@
         this.file = testFile;
     }
 
+    @Override
     public void setUp() {
         BasicConfigurator.resetConfiguration();
         BasicConfigurator.configure();
     }
    
+    @Override
     protected void runTest() throws Throwable {
         MimeEntityConfig config = new MimeEntityConfig();
         config.setMaxLineLen(-1);
         Message inputMessage = new Message(new FileInputStream(file), config);
         ByteArrayOutputStream out = new ByteArrayOutputStream();
-        inputMessage.writeTo(out, MessageUtils.LENIENT);
+        inputMessage.writeTo(out, Mode.LENIENT);
         
         String msgoutFile = file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf('.')) + ".out";
         String msgoutFileMime4j = file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf('.')) + ".mime4j.out";
@@ -76,12 +76,12 @@
             
             Message roundtripMessage = new Message(new FileInputStream(msgoutFile), config);
             ByteArrayOutputStream outRoundtrip = new ByteArrayOutputStream();
-            roundtripMessage.writeTo(outRoundtrip, MessageUtils.LENIENT);
+            roundtripMessage.writeTo(outRoundtrip, Mode.LENIENT);
             assertEquals("Failed LENIENT roundtrip", new String(out.toByteArray()), new String(outRoundtrip.toByteArray()));
 
             roundtripMessage = new Message(new FileInputStream(msgoutFile), config);
             outRoundtrip = new ByteArrayOutputStream();
-            roundtripMessage.writeTo(outRoundtrip, MessageUtils.STRICT_ERROR);
+            roundtripMessage.writeTo(outRoundtrip, Mode.STRICT_ERROR);
             assertEquals("Failed STRICT roundtrip", new String(out.toByteArray()), new String(outRoundtrip.toByteArray()));
 
         } catch (FileNotFoundException e) {
@@ -109,9 +109,7 @@
             File dir = TESTS_FOLDER;
             File[] files = dir.listFiles();
             
-            for (int i = 0; i < files.length; i++) {
-                File f = files[i];
-                
+            for (File f : files) {
                 if (f.getName().toLowerCase().endsWith(".msg")) {
                     addTest(new ExampleMessagesRoundtripTest(f.getName().substring(0, f.getName().length()-4), f));
                 }
Index: src/test/java/org/apache/james/mime4j/decoder/Base64InputStreamTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/decoder/Base64InputStreamTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/decoder/Base64InputStreamTest.java	(working copy)
@@ -38,6 +38,7 @@
  */
 public class Base64InputStreamTest extends TestCase {
 
+    @Override
     public void setUp() {
         BasicConfigurator.resetConfiguration();
         BasicConfigurator.configure();
Index: src/test/java/org/apache/james/mime4j/decoder/QuotedPrintableEncodeTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/decoder/QuotedPrintableEncodeTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/decoder/QuotedPrintableEncodeTest.java	(working copy)
@@ -34,10 +34,12 @@
 
     private static final Charset US_ASCII = Charset.forName("US-ASCII");
     
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
Index: src/test/java/org/apache/james/mime4j/decoder/DecoderUtilTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/decoder/DecoderUtilTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/decoder/DecoderUtilTest.java	(working copy)
@@ -34,6 +34,7 @@
  */
 public class DecoderUtilTest extends TestCase {
 
+    @Override
     public void setUp() {
         BasicConfigurator.resetConfiguration();
         BasicConfigurator.configure();
Index: src/test/java/org/apache/james/mime4j/decoder/QuotedPrintableTextEncodeTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/decoder/QuotedPrintableTextEncodeTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/decoder/QuotedPrintableTextEncodeTest.java	(working copy)
@@ -34,10 +34,12 @@
 
     private static final Charset US_ASCII = Charset.forName("US-ASCII");
     
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
@@ -110,7 +112,7 @@
     }
     
     public void testCRLFShouldResetLineCount() throws Exception {
-        StringBuffer buffer = new StringBuffer(4096);
+        StringBuilder buffer = new StringBuilder(4096);
         for (int i=0;i<1000;i++) {
             buffer.append("Hugo\r\n");
         }
Index: src/test/java/org/apache/james/mime4j/decoder/CodecUtilTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/decoder/CodecUtilTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/decoder/CodecUtilTest.java	(working copy)
@@ -30,10 +30,12 @@
 
 public class CodecUtilTest extends TestCase {
 
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
@@ -47,7 +49,7 @@
     }
     
     public void testEncodeQuotedPrintableLargeInput() throws Exception {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         for (int i = 0; i < 1024 * 5; i++) {
             sb.append((char) ('0' + (i % 10)));
         }
@@ -70,7 +72,7 @@
     }
     
     public void testBase64OutputStream() throws Exception {
-        StringBuffer sb = new StringBuffer(2048);
+        StringBuilder sb = new StringBuilder(2048);
         for (int i = 0; i < 128; i++) {
             sb.append("0123456789ABCDEF");
         }
@@ -98,7 +100,7 @@
      */
     /* Currently commented because we don't want failing tests.
     public void testBase64Encoder() throws Exception {
-        StringBuffer sb = new StringBuffer(2048);
+        StringBuilder sb = new StringBuilder(2048);
         for (int i = 0; i < 128; i++) {
             sb.append("0123456789ABCDEF");
         }
@@ -153,7 +155,7 @@
     */
     
     private void assertEquals(byte[] expected, byte[] actual) {
-        StringBuffer buffer = new StringBuffer(expected.length);
+        StringBuilder buffer = new StringBuilder(expected.length);
         assertEquals(expected.length, actual.length);
         for (int i = 0; i < actual.length; i++) {
             buffer.append((char)actual[i]);
Index: src/test/java/org/apache/james/mime4j/decoder/QuotedPrintableInputStreamTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/decoder/QuotedPrintableInputStreamTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/decoder/QuotedPrintableInputStreamTest.java	(working copy)
@@ -38,6 +38,7 @@
  */
 public class QuotedPrintableInputStreamTest extends TestCase {
 
+    @Override
     public void setUp() {
         BasicConfigurator.resetConfiguration();
         BasicConfigurator.configure();
Index: src/test/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptorTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptorTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptorTest.java	(working copy)
@@ -57,7 +57,7 @@
         teststrs[0] = "Hello\r\n";
         teststrs[1] = "This string should be much longer than the size of the input buffer " +
                 "which is only 16 bytes for this test\r\n";
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         for (int i = 0; i < 15; i++) {
             sb.append("123456789 ");
         }
@@ -68,8 +68,8 @@
 
         ByteArrayOutputStream outstream = new ByteArrayOutputStream();
         
-        for (int i = 0; i < teststrs.length; i++) {
-            outstream.write(teststrs[i].getBytes("US-ASCII"));
+        for (String teststr : teststrs) {
+            outstream.write(teststr.getBytes("US-ASCII"));
         }
         byte[] raw = outstream.toByteArray();
         
@@ -77,11 +77,11 @@
                 new ByteArrayInputStream(raw)); 
         
         ByteArrayBuffer linebuf = new ByteArrayBuffer(8); 
-        for (int i = 0; i < teststrs.length; i++) {
+        for (String teststr : teststrs) {
             linebuf.clear();
             instream.readLine(linebuf);
             String s = new String(linebuf.toByteArray(), "US-ASCII");
-            assertEquals(teststrs[i], s);
+            assertEquals(teststr, s);
         }
         assertEquals(-1, instream.readLine(linebuf));
         assertEquals(-1, instream.readLine(linebuf));
Index: src/test/java/org/apache/james/mime4j/io/MimeBoundaryInputStreamTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/io/MimeBoundaryInputStreamTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/io/MimeBoundaryInputStreamTest.java	(working copy)
@@ -164,7 +164,7 @@
     }
     
     private String readByOneByte(InputStream is) throws IOException {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         int b = 0;
         while ((b = is.read()) != -1) {
             sb.append((char) b);
@@ -173,7 +173,7 @@
     }
 
     private String read(InputStream is, int bufsize) throws IOException {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         int l;
         byte[] tmp = new byte[bufsize];
         while ((l = is.read(tmp)) != -1) {
@@ -247,7 +247,7 @@
         teststrs[0] = "Hello\r\n";
         teststrs[1] = "This string should be much longer than the size of the input buffer " +
                 "which is only 20 bytes for this test\r\n";
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         for (int i = 0; i < 15; i++) {
             sb.append("123456789 ");
         }
@@ -260,8 +260,8 @@
         
         ByteArrayOutputStream outstream = new ByteArrayOutputStream();
         
-        for (int i = 0; i < teststrs.length; i++) {
-            outstream.write(teststrs[i].getBytes("US-ASCII"));
+        for (String teststr : teststrs) {
+            outstream.write(teststr.getBytes("US-ASCII"));
         }
         outstream.write(term.getBytes("US-ASCII"));
         byte[] raw = outstream.toByteArray();
@@ -270,11 +270,11 @@
         LineReaderInputStream instream = new MimeBoundaryInputStream(inbuffer, "1234"); 
         
         ByteArrayBuffer linebuf = new ByteArrayBuffer(8); 
-        for (int i = 0; i < teststrs.length; i++) {
+        for (String teststr : teststrs) {
             linebuf.clear();
             instream.readLine(linebuf);
             String s = new String(linebuf.toByteArray(), "US-ASCII");
-            assertEquals(teststrs[i], s);
+            assertEquals(teststr, s);
         }
         assertEquals(-1, instream.readLine(linebuf));
         assertEquals(-1, instream.readLine(linebuf));
Index: src/test/java/org/apache/james/mime4j/io/BufferedLineReaderInputStreamTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/io/BufferedLineReaderInputStreamTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/io/BufferedLineReaderInputStreamTest.java	(working copy)
@@ -56,7 +56,7 @@
         teststrs[0] = "Hello\r\n";
         teststrs[1] = "This string should be much longer than the size of the input buffer " +
                 "which is only 16 bytes for this test\r\n";
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         for (int i = 0; i < 15; i++) {
             sb.append("123456789 ");
         }
@@ -67,19 +67,19 @@
 
         ByteArrayOutputStream outstream = new ByteArrayOutputStream();
         
-        for (int i = 0; i < teststrs.length; i++) {
-            outstream.write(teststrs[i].getBytes("US-ASCII"));
+        for (String teststr : teststrs) {
+            outstream.write(teststr.getBytes("US-ASCII"));
         }
         byte[] raw = outstream.toByteArray();
         
         BufferedLineReaderInputStream instream = new BufferedLineReaderInputStream(new ByteArrayInputStream(raw), 16); 
         
         ByteArrayBuffer linebuf = new ByteArrayBuffer(8); 
-        for (int i = 0; i < teststrs.length; i++) {
+        for (String teststr : teststrs) {
             linebuf.clear();
             instream.readLine(linebuf);
             String s = new String(linebuf.toByteArray(), "US-ASCII");
-            assertEquals(teststrs[i], s);
+            assertEquals(teststr, s);
         }
         assertEquals(-1, instream.readLine(linebuf));
         assertEquals(-1, instream.readLine(linebuf));
Index: src/test/java/org/apache/james/mime4j/parser/MimeStreamParserTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/parser/MimeStreamParserTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/parser/MimeStreamParserTest.java	(working copy)
@@ -39,6 +39,7 @@
  */
 public class MimeStreamParserTest extends TestCase {
 
+    @Override
     public void setUp() {
         BasicConfigurator.resetConfiguration();
         BasicConfigurator.configure();
@@ -67,8 +68,8 @@
                            new EOLConvertingInputStream(
                                  new RandomAccessFileInputStream(file, pos, file.length()));
                        
-                       StringBuffer sb1 = new StringBuffer();
-                       StringBuffer sb2 = new StringBuffer();
+                       StringBuilder sb1 = new StringBuilder();
+                       StringBuilder sb2 = new StringBuilder();
                        int b = 0;
                        while ((b = expected.read()) != -1) {
                            sb1.append((char) (b & 0xff));
@@ -88,7 +89,7 @@
     }*/
     
     public void testBoundaryInEpilogue() throws Exception {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append("From: foo@bar.com\r\n");
         sb.append("To: someone@else.com\r\n");
         sb.append("Content-type: multipart/something; boundary=myboundary\r\n");
@@ -103,7 +104,7 @@
         sb.append("\r\n");
         sb.append("--myboundary--\r\n");
         
-        StringBuffer epilogue = new StringBuffer();
+        StringBuilder epilogue = new StringBuilder();
         epilogue.append("Content-type: text/plain\r\n");
         epilogue.append("\r\n");
         epilogue.append("This is actually the epilogue but it looks like a second body.\r\n");
@@ -116,10 +117,11 @@
         
         ByteArrayInputStream bais = new ByteArrayInputStream(sb.toString().getBytes("US-ASCII"));
         
-        final StringBuffer actual = new StringBuffer();
+        final StringBuilder actual = new StringBuilder();
         
         MimeStreamParser parser = new MimeStreamParser();
         parser.setContentHandler(new AbstractContentHandler() {
+            @Override
             public void epilogue(InputStream is) throws IOException {
                 int b;
                 while ((b = is.read()) != -1) {
@@ -133,17 +135,18 @@
     }
     
     public void testParseOneLineFields() throws Exception {
-        StringBuffer sb = new StringBuffer();
-        final LinkedList expected = new LinkedList();
+        StringBuilder sb = new StringBuilder();
+        final LinkedList<String> expected = new LinkedList<String>();
         expected.add("From: foo@abr.com");
-        sb.append(expected.getLast().toString() + "\r\n");
+        sb.append(expected.getLast() + "\r\n");
         expected.add("Subject: A subject");
-        sb.append(expected.getLast().toString() + "\r\n");
+        sb.append(expected.getLast() + "\r\n");
         
         MimeStreamParser parser = new MimeStreamParser();
         parser.setContentHandler(new AbstractContentHandler() {
+            @Override
             public void field(String fieldData) {
-                assertEquals((String) expected.removeFirst(), fieldData);
+                assertEquals(expected.removeFirst(), fieldData);
             }
         });
         
@@ -157,16 +160,17 @@
          * Test added because \r:s not followed by \n:s in the header would
          * cause an infinite loop. 
          */
-        StringBuffer sb = new StringBuffer();
-        final LinkedList expected = new LinkedList();
+        StringBuilder sb = new StringBuilder();
+        final LinkedList<String> expected = new LinkedList<String>();
         expected.add("The-field: This field\r\rcontains CR:s\r\r"
                         + "not\r\n\tfollowed by LF");
-        sb.append(expected.getLast().toString() + "\r\n");
+        sb.append(expected.getLast() + "\r\n");
         
         MimeStreamParser parser = new MimeStreamParser();
         parser.setContentHandler(new AbstractContentHandler() {
+            @Override
             public void field(String fieldData) {
-                assertEquals((String) expected.removeFirst(), fieldData);
+                assertEquals(expected.removeFirst(), fieldData);
             }
         });
         
@@ -176,20 +180,21 @@
     }
     
     public void testParseMultiLineFields() throws Exception {
-        StringBuffer sb = new StringBuffer();
-        final LinkedList expected = new LinkedList();
+        StringBuilder sb = new StringBuilder();
+        final LinkedList<String> expected = new LinkedList<String>();
         expected.add("Received: by netmbx.netmbx.de (/\\==/\\ Smail3.1.28.1)\r\n"
                    + "\tfrom mail.cs.tu-berlin.de with smtp\r\n"
                    + "\tid &lt;m0uWPrO-0004wpC&gt;;"
                         + " Wed, 19 Jun 96 18:12 MES");
-        sb.append(expected.getLast().toString() + "\r\n");
+        sb.append(expected.getLast() + "\r\n");
         expected.add("Subject: A folded subject\r\n Line 2\r\n\tLine 3");
-        sb.append(expected.getLast().toString() + "\r\n");
+        sb.append(expected.getLast() + "\r\n");
         
         MimeStreamParser parser = new MimeStreamParser();
         parser.setContentHandler(new AbstractContentHandler() {
+            @Override
             public void field(String fieldData) {
-                assertEquals((String) expected.removeFirst(), fieldData);
+                assertEquals(expected.removeFirst(), fieldData);
             }
         });
         
@@ -201,6 +206,7 @@
     public void testStop() throws Exception {
         final MimeStreamParser parser = new MimeStreamParser();
         TestHandler handler = new TestHandler() {
+            @Override
             public void endHeader() {
                 super.endHeader();
                 parser.stop();
@@ -236,19 +242,20 @@
      * Tests that invalid fields are ignored.
      */
     public void testInvalidFields() throws Exception {
-        StringBuffer sb = new StringBuffer();
-        final LinkedList expected = new LinkedList();
+        StringBuilder sb = new StringBuilder();
+        final LinkedList<String> expected = new LinkedList<String>();
         sb.append("From - foo@abr.com\r\n");
         expected.add("From: some@one.com");
-        sb.append(expected.getLast().toString() + "\r\n");
+        sb.append(expected.getLast() + "\r\n");
         expected.add("Subject: A subject");
-        sb.append(expected.getLast().toString() + "\r\n");
+        sb.append(expected.getLast() + "\r\n");
         sb.append("A line which should be ignored\r\n");
         
         MimeStreamParser parser = new MimeStreamParser();
         parser.setContentHandler(new AbstractContentHandler() {
+            @Override
             public void field(String fieldData) {
-                assertEquals((String) expected.removeFirst(), fieldData);
+                assertEquals(expected.removeFirst(), fieldData);
             }
         });
         
@@ -261,7 +268,7 @@
      * Tests that empty streams still generate the expected series of events.
      */
     public void testEmptyStream() throws Exception {
-        final LinkedList expected = new LinkedList();
+        final LinkedList<String> expected = new LinkedList<String>();
         expected.add("startMessage");
         expected.add("startHeader");
         expected.add("endHeader");
@@ -270,44 +277,54 @@
         
         MimeStreamParser parser = new MimeStreamParser();
         parser.setContentHandler(new AbstractContentHandler() {
+            @Override
             public void body(BodyDescriptor bd, InputStream is) {
-                assertEquals((String) expected.removeFirst(), "body");
+                assertEquals(expected.removeFirst(), "body");
             }
             
+            @Override
             public void endMultipart() {
                 fail("endMultipart shouldn't be called for empty stream");
             }
 
+            @Override
             public void endBodyPart() {
                 fail("endBodyPart shouldn't be called for empty stream");
             }
 
+            @Override
             public void endHeader() {
-                assertEquals((String) expected.removeFirst(), "endHeader");
+                assertEquals(expected.removeFirst(), "endHeader");
             }
 
+            @Override
             public void endMessage() {
-                assertEquals((String) expected.removeFirst(), "endMessage");
+                assertEquals(expected.removeFirst(), "endMessage");
             }
 
+            @Override
             public void field(String fieldData) {
                 fail("field shouldn't be called for empty stream");
             }
 
+            @Override
             public void startMultipart(BodyDescriptor bd) {
                 fail("startMultipart shouldn't be called for empty stream");
             }
 
+            @Override
             public void startBodyPart() {
                 fail("startBodyPart shouldn't be called for empty stream");
             }
 
+            @Override
             public void startHeader() {
-                assertEquals((String) expected.removeFirst(), "startHeader");
+                assertEquals(expected.removeFirst(), "startHeader");
             }
 
+            @Override
             public void startMessage() {
-                assertEquals((String) expected.removeFirst(), "startMessage");
+                assertEquals(expected.removeFirst(), "startMessage");
             }
         });
         
@@ -320,17 +337,19 @@
      * Tests parsing of empty headers.
      */
     public void testEmpyHeader() throws Exception {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append("\r\n");
         sb.append("The body is right here\r\n");
         
-        final StringBuffer body = new StringBuffer();
+        final StringBuilder body = new StringBuilder();
         
         MimeStreamParser parser = new MimeStreamParser();
         parser.setContentHandler(new AbstractContentHandler() {
+            @Override
             public void field(String fieldData) {
                 fail("No fields should be reported");
             }
+            @Override
             public void body(BodyDescriptor bd, InputStream is) throws IOException {
                 int b;
                 while ((b = is.read()) != -1) {
@@ -348,18 +367,20 @@
      * Tests parsing of empty body.
      */
     public void testEmptyBody() throws Exception {
-        StringBuffer sb = new StringBuffer();
-        final LinkedList expected = new LinkedList();
+        StringBuilder sb = new StringBuilder();
+        final LinkedList<String> expected = new LinkedList<String>();
         expected.add("From: some@one.com");
-        sb.append(expected.getLast().toString() + "\r\n");
+        sb.append(expected.getLast() + "\r\n");
         expected.add("Subject: A subject");
-        sb.append(expected.getLast().toString() + "\r\n\r\n");
+        sb.append(expected.getLast() + "\r\n\r\n");
         
         MimeStreamParser parser = new MimeStreamParser();
         parser.setContentHandler(new AbstractContentHandler() {
+            @Override
             public void field(String fieldData) {
-                assertEquals((String) expected.removeFirst(), fieldData);
+                assertEquals(expected.removeFirst(), fieldData);
             }
+            @Override
             public void body(BodyDescriptor bd, InputStream is) throws IOException {
                 assertEquals(-1, is.read());
             }
@@ -374,17 +395,18 @@
      * Tests that invalid fields are ignored.
      */
     public void testPrematureEOFAfterFields() throws Exception {
-        StringBuffer sb = new StringBuffer();
-        final LinkedList expected = new LinkedList();
+        StringBuilder sb = new StringBuilder();
+        final LinkedList<String> expected = new LinkedList<String>();
         expected.add("From: some@one.com");
-        sb.append(expected.getLast().toString() + "\r\n");
+        sb.append(expected.getLast() + "\r\n");
         expected.add("Subject: A subject");
-        sb.append(expected.getLast().toString());
+        sb.append(expected.getLast());
         
         MimeStreamParser parser = new MimeStreamParser();
         parser.setContentHandler(new AbstractContentHandler() {
+            @Override
             public void field(String fieldData) {
-                assertEquals((String) expected.removeFirst(), fieldData);
+                assertEquals(expected.removeFirst(), fieldData);
             }
         });
         
@@ -392,17 +414,18 @@
         
         assertEquals(0, expected.size());
         
-        sb = new StringBuffer();
+        sb = new StringBuilder();
         expected.clear();
         expected.add("From: some@one.com");
-        sb.append(expected.getLast().toString() + "\r\n");
+        sb.append(expected.getLast() + "\r\n");
         expected.add("Subject: A subject");
-        sb.append(expected.getLast().toString() + "\r\n");
+        sb.append(expected.getLast() + "\r\n");
         
         parser = new MimeStreamParser();
         parser.setContentHandler(new AbstractContentHandler() {
+            @Override
             public void field(String fieldData) {
-                assertEquals((String) expected.removeFirst(), fieldData);
+                assertEquals(expected.removeFirst(), fieldData);
             }
         });
         
Index: src/test/java/org/apache/james/mime4j/parser/MimeStreamTokenMessageRfc822Test.java
===================================================================
--- src/test/java/org/apache/james/mime4j/parser/MimeStreamTokenMessageRfc822Test.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/parser/MimeStreamTokenMessageRfc822Test.java	(working copy)
@@ -30,12 +30,14 @@
 
     MimeTokenStream stream;
     
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
         stream = new MimeTokenStream();
         stream.parse(new ByteArrayInputStream(ExampleMail.MIME_RFC822_SIMPLE_BYTES));
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
Index: src/test/java/org/apache/james/mime4j/parser/MimeTokenStreamBodyDescriptorTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/parser/MimeTokenStreamBodyDescriptorTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/parser/MimeTokenStreamBodyDescriptorTest.java	(working copy)
@@ -30,12 +30,14 @@
 
     MimeTokenStream parser;
     
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
         parser = new MimeTokenStream();
         parser.parse(new ByteArrayInputStream(ExampleMail.MIME_MULTIPART_ALTERNATIVE_BYTES));
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
Index: src/test/java/org/apache/james/mime4j/parser/MimeStreamParserExampleMessagesTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/parser/MimeStreamParserExampleMessagesTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/parser/MimeStreamParserExampleMessagesTest.java	(working copy)
@@ -51,11 +51,13 @@
         this.file = testFile;
     }
 
+    @Override
     public void setUp() {
         BasicConfigurator.resetConfiguration();
         BasicConfigurator.configure();
     }
    
+    @Override
     protected void runTest() throws Throwable {
         MimeStreamParser parser = null;
         TestHandler handler = null;
@@ -98,9 +100,7 @@
             File dir = TESTS_FOLDER;
             File[] files = dir.listFiles();
             
-            for (int i = 0; i < files.length; i++) {
-                File f = files[i];
-                
+            for (File f : files) {
                 if (f.getName().toLowerCase().endsWith(".msg")) {
                     addTest(new MimeStreamParserExampleMessagesTest(f.getName().substring(0, f.getName().length()-4), f));
                 }
Index: src/test/java/org/apache/james/mime4j/parser/MimeTokenStreamTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/parser/MimeTokenStreamTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/parser/MimeTokenStreamTest.java	(working copy)
@@ -31,6 +31,7 @@
 
     MimeTokenStream stream;
     
+    @Override
     public void setUp() throws Exception {
         stream = new MimeTokenStream();
     }
Index: src/test/java/org/apache/james/mime4j/parser/MultipartTokensTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/parser/MultipartTokensTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/parser/MultipartTokensTest.java	(working copy)
@@ -93,11 +93,13 @@
     
     MimeTokenStream parser;
     
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
         parser = new MimeTokenStream();
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
Index: src/test/java/org/apache/james/mime4j/parser/MimeTokenEmbeddedMessageTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/parser/MimeTokenEmbeddedMessageTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/parser/MimeTokenEmbeddedMessageTest.java	(working copy)
@@ -31,6 +31,7 @@
     
     MimeTokenStream stream;
     
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
         stream = new MimeTokenStream();
@@ -38,6 +39,7 @@
         stream.parse(in);
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
Index: src/test/java/org/apache/james/mime4j/parser/MimeTokenStreamReaderTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/parser/MimeTokenStreamReaderTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/parser/MimeTokenStreamReaderTest.java	(working copy)
@@ -34,11 +34,13 @@
     
     MimeTokenStream parser;
     
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
         parser = new MimeTokenStream();
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
Index: src/test/java/org/apache/james/mime4j/parser/MultipartStreamTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/parser/MultipartStreamTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/parser/MultipartStreamTest.java	(working copy)
@@ -69,11 +69,13 @@
     
     MimeTokenStream parser;
     
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
         parser = new MimeTokenStream();
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
Index: src/test/java/org/apache/james/mime4j/parser/TestHandler.java
===================================================================
--- src/test/java/org/apache/james/mime4j/parser/TestHandler.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/parser/TestHandler.java	(working copy)
@@ -29,7 +29,7 @@
  * Helper class to run comparison of parsed results
  */
 class TestHandler implements ContentHandler {
-    StringBuffer sb = new StringBuffer();
+    StringBuilder sb = new StringBuilder();
 
     private String escape(char c) {
         if (c == '&') {
Index: src/test/java/org/apache/james/mime4j/parser/MimeTokenNoRecurseTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/parser/MimeTokenNoRecurseTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/parser/MimeTokenNoRecurseTest.java	(working copy)
@@ -65,6 +65,7 @@
     
     MimeTokenStream stream;
     
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
         stream = new MimeTokenStream();
@@ -73,6 +74,7 @@
         stream.parse(in);
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
Index: src/test/java/org/apache/james/mime4j/util/StringArrayMapTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/util/StringArrayMapTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/util/StringArrayMapTest.java	(working copy)
@@ -47,19 +47,19 @@
      * Test for {@link StringArrayMap#getMap()}.
      */
     public void testGetMap() {
-        final Map map = getSampleMap().getMap();
-        final List keys = new ArrayList(map.keySet());
+        final Map<String, String[]> map = getSampleMap().getMap();
+        final List<String> keys = new ArrayList<String>(map.keySet());
         assertEquals(keys.size(), 3);
         Collections.sort(keys);
         assertEquals("foo", keys.get(0));
         assertEquals("xs", keys.get(1));
         assertEquals("xyz", keys.get(2));
-        final String[] foo = (String[]) map.get("foo");
+        final String[] foo = map.get("foo");
         assertEquals("bAr", foo[0]);
-        final String[] xs = (String[]) map.get("xs");
+        final String[] xs = map.get("xs");
         assertEquals("1", xs[0]);
         assertEquals("2", xs[1]);
-        final String[] xyz = (String[]) map.get("xyz");
+        final String[] xyz = map.get("xyz");
         assertEquals(3, xyz.length);
         assertEquals("a", xyz[0]);
         assertEquals("B", xyz[1]);
@@ -82,7 +82,7 @@
      * Test case for {@link StringArrayMap#getNames()}.
      */
     public void testGetNames() {
-        final Enumeration names = getSampleMap().getNames();
+        final Enumeration<String> names = getSampleMap().getNames();
         assertEquals(new String[]{"foo", "xs", "xyz"}, names);
     }
 
@@ -129,8 +129,8 @@
         assertNull(map.getValues("xz"));
     }
 
-    private void assertEquals(String[] pArray, Enumeration pEnum) {
-        final List list = new ArrayList();
+    private void assertEquals(String[] pArray, Enumeration<String> pEnum) {
+        final List<String> list = new ArrayList<String>();
         while (pEnum.hasMoreElements()) {
             list.add(pEnum.nextElement());
         }
Index: src/test/java/org/apache/james/mime4j/util/MessageUtilsTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/util/MessageUtilsTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/util/MessageUtilsTest.java	(working copy)
@@ -35,10 +35,10 @@
     };
         
     private static String constructString(int [] unicodeChars) {
-        StringBuffer buffer = new StringBuffer();
+        StringBuilder buffer = new StringBuilder();
         if (unicodeChars != null) {
-            for (int i = 0; i < unicodeChars.length; i++) {
-                buffer.append((char)unicodeChars[i]); 
+            for (int unicodeChar : unicodeChars) {
+                buffer.append((char) unicodeChar); 
             }
         }
         return buffer.toString();
Index: src/test/java/org/apache/james/mime4j/util/TestByteArrayBuffer.java
===================================================================
--- src/test/java/org/apache/james/mime4j/util/TestByteArrayBuffer.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/util/TestByteArrayBuffer.java	(working copy)
@@ -133,8 +133,8 @@
         assertEquals(4, buffer.capacity()); 
         
         byte[] tmp = new byte[] { 1, 127, -1, -128, 1, -2};
-        for (int i = 0; i < tmp.length; i++) {
-            buffer.append(tmp[i]);
+        for (byte b : tmp) {
+            buffer.append(b);
         }
         assertEquals(8, buffer.capacity()); 
         assertEquals(6, buffer.length());
Index: src/test/java/org/apache/james/mime4j/ExampleMail.java
===================================================================
--- src/test/java/org/apache/james/mime4j/ExampleMail.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/ExampleMail.java	(working copy)
@@ -654,14 +654,12 @@
     
     public static final byte[] join(byte[][] byteArrays) {
         int length = 0;
-        for (int i = 0; i < byteArrays.length; i++) {
-            byte[] bytes = byteArrays[i];
+        for (byte[] bytes : byteArrays) {
             length += bytes.length;
         }
         byte[] results = new byte[length];
         int count = 0;
-        for (int i = 0; i < byteArrays.length; i++) {
-            byte[] bytes = byteArrays[i];
+        for (byte[] bytes : byteArrays) {
             System.arraycopy(bytes, 0, results, count, bytes.length);
             count += bytes.length;
         }
@@ -669,7 +667,7 @@
     }
     
     public static String breakLines(String original) {
-        StringBuffer buffer = new StringBuffer(original);
+        StringBuilder buffer = new StringBuilder(original);
         int count = 76;
         while(count < buffer.length()) {
             if (buffer.charAt(count) == '=') {
Index: src/test/java/org/apache/james/mime4j/descriptor/BaseTestForBodyDescriptors.java
===================================================================
--- src/test/java/org/apache/james/mime4j/descriptor/BaseTestForBodyDescriptors.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/descriptor/BaseTestForBodyDescriptors.java	(working copy)
@@ -40,25 +40,25 @@
         bd.addField("Content-Type ", "text/plain; charset=ISO-8859-1; "
                 + "boundary=foo; param1=value1; param2=value2; param3=value3");
         assertEquals(3, bd.getContentTypeParameters().size());
-        assertEquals("value1", (String) bd.getContentTypeParameters().get("param1"));
-        assertEquals("value2", (String) bd.getContentTypeParameters().get("param2"));
-        assertEquals("value3", (String) bd.getContentTypeParameters().get("param3"));
+        assertEquals("value1", bd.getContentTypeParameters().get("param1"));
+        assertEquals("value2", bd.getContentTypeParameters().get("param2"));
+        assertEquals("value3", bd.getContentTypeParameters().get("param3"));
         
         bd = newBodyDescriptor();
         bd.addField("Content-Type ", "text/plain; param1=value1; param2=value2;"
                      + " param3=value3");
         assertEquals(3, bd.getContentTypeParameters().size());
-        assertEquals("value1", (String) bd.getContentTypeParameters().get("param1"));
-        assertEquals("value2", (String) bd.getContentTypeParameters().get("param2"));
-        assertEquals("value3", (String) bd.getContentTypeParameters().get("param3"));
+        assertEquals("value1", bd.getContentTypeParameters().get("param1"));
+        assertEquals("value2", bd.getContentTypeParameters().get("param2"));
+        assertEquals("value3", bd.getContentTypeParameters().get("param3"));
         
         bd = newBodyDescriptor();
         bd.addField("Content-Type ", "text/plain; "
                 + "param1= \" value with\tspaces \" ; "
                 + "param2=\"\\\"value4 with escaped \\\" \\\"\";");
         assertEquals(2, bd.getContentTypeParameters().size());
-        assertEquals(" value with\tspaces ", (String) bd.getContentTypeParameters().get("param1"));
-        assertEquals("\"value4 with escaped \" \"", (String) bd.getContentTypeParameters().get("param2"));
+        assertEquals(" value with\tspaces ", bd.getContentTypeParameters().get("param1"));
+        assertEquals("\"value4 with escaped \" \"", bd.getContentTypeParameters().get("param2"));
         
         /*
          * Make sure escaped characters (except ") are still escaped.
@@ -67,7 +67,7 @@
         bd = newBodyDescriptor();
         bd.addField("Content-Type ", "text/plain; param=\"\\n\\\\\\\"\"");
         assertEquals(1, bd.getContentTypeParameters().size());
-        assertEquals("\\n\\\"", (String) bd.getContentTypeParameters().get("param"));
+        assertEquals("\\n\\\"", bd.getContentTypeParameters().get("param"));
     }
     
     public void testAddField() {
Index: src/test/java/org/apache/james/mime4j/descriptor/DefaultBodyDescriptorTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/descriptor/DefaultBodyDescriptorTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/descriptor/DefaultBodyDescriptorTest.java	(working copy)
@@ -21,10 +21,12 @@
 import org.apache.james.mime4j.descriptor.DefaultBodyDescriptor;
 
 public class DefaultBodyDescriptorTest extends BaseTestForBodyDescriptors {
+    @Override
     protected MutableBodyDescriptor newBodyDescriptor() {
         return new DefaultBodyDescriptor();
     }
 
+    @Override
     protected MutableBodyDescriptor newBodyDescriptor(BodyDescriptor parent) {
         return new DefaultBodyDescriptor(parent);
     }
Index: src/test/java/org/apache/james/mime4j/descriptor/MaximalBodyDescriptorTest.java
===================================================================
--- src/test/java/org/apache/james/mime4j/descriptor/MaximalBodyDescriptorTest.java	(revision 713501)
+++ src/test/java/org/apache/james/mime4j/descriptor/MaximalBodyDescriptorTest.java	(working copy)
@@ -33,11 +33,13 @@
 
     MimeTokenStream parser;
     
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
         parser = MimeTokenStream.createMaximalDescriptorStream();
     }
 
+    @Override
     protected void tearDown() throws Exception {
         super.tearDown();
     }
@@ -179,10 +181,12 @@
         return (MaximalBodyDescriptor) descriptor;
     }
 
+    @Override
     protected MutableBodyDescriptor newBodyDescriptor() {
         return new MaximalBodyDescriptor();
     }
 
+    @Override
     protected MutableBodyDescriptor newBodyDescriptor(BodyDescriptor parent) {
         return new MaximalBodyDescriptor(parent);
     }
Index: src/main/java/org/apache/james/mime4j/field/ContentTypeField.java
===================================================================
--- src/main/java/org/apache/james/mime4j/field/ContentTypeField.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/field/ContentTypeField.java	(working copy)
@@ -20,9 +20,9 @@
 package org.apache.james.mime4j.field;
 
 import java.io.StringReader;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.logging.Log;
@@ -64,10 +64,10 @@
     public static final String PARAM_CHARSET = "charset";
     
     private String mimeType = "";
-    private Map parameters = null;
+    private Map<String, String> parameters = null;
     private ParseException parseException;
 
-    protected ContentTypeField(String name, String body, String raw, String mimeType, Map parameters, ParseException parseException) {
+    protected ContentTypeField(String name, String body, String raw, String mimeType, Map<String, String> parameters, ParseException parseException) {
         super(name, body, raw);
         this.mimeType = mimeType;
         this.parameters = parameters;
@@ -127,7 +127,7 @@
      */
     public String getParameter(String name) {
         return parameters != null 
-                    ? (String) parameters.get(name.toLowerCase())
+                    ? parameters.get(name.toLowerCase())
                     : null;
     }
     
@@ -136,10 +136,10 @@
      * 
      * @return the parameters.
      */
-    public Map getParameters() {
+    public Map<String, String> getParameters() {
         return parameters != null 
-                    ? Collections.unmodifiableMap(parameters)
-                    : Collections.EMPTY_MAP;
+                    ? Collections.<String, String> unmodifiableMap(parameters)
+                    : Collections.<String, String> emptyMap();
     }
     
     /**
@@ -205,7 +205,7 @@
         public Field parse(final String name, final String body, final String raw) {
             ParseException parseException = null;
             String mimeType = "";
-            Map parameters = null;
+            Map<String, String> parameters = null;
 
             ContentTypeParser parser = new ContentTypeParser(new StringReader(body));
             try {
@@ -231,15 +231,17 @@
                 if (type != null && subType != null) {
                     mimeType = (type + "/" + parser.getSubType()).toLowerCase();
 
-                    ArrayList paramNames = parser.getParamNames();
-                    ArrayList paramValues = parser.getParamValues();
+                    @SuppressWarnings("unchecked")
+                    List<String> paramNames = parser.getParamNames();
+                    @SuppressWarnings("unchecked")
+                    List<String> paramValues = parser.getParamValues();
 
                     if (paramNames != null && paramValues != null) {
                         for (int i = 0; i < paramNames.size() && i < paramValues.size(); i++) {
                             if (parameters == null)
-                                parameters = new HashMap((int)(paramNames.size() * 1.3 + 1));
-                            String paramName = ((String)paramNames.get(i)).toLowerCase();
-                            String paramValue = ((String)paramValues.get(i));
+                                parameters = new HashMap<String, String>((int)(paramNames.size() * 1.3 + 1));
+                            String paramName = paramNames.get(i).toLowerCase();
+                            String paramValue = paramValues.get(i);
                             parameters.put(paramName, paramValue);
                         }
                     }
Index: src/main/java/org/apache/james/mime4j/field/Field.java
===================================================================
--- src/main/java/org/apache/james/mime4j/field/Field.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/field/Field.java	(working copy)
@@ -188,6 +188,7 @@
     /**
      * @see #getRaw()
      */
+    @Override
     public String toString() {
         return raw;
     }
Index: src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.java
===================================================================
--- src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.java	(working copy)
@@ -20,7 +20,7 @@
 
 public class DelegatingFieldParser implements FieldParser {
     
-    private Map parsers = new HashMap();
+    private Map<String, FieldParser> parsers = new HashMap<String, FieldParser>();
     private FieldParser defaultParser = new UnstructuredField.Parser();
     
     /**
@@ -33,7 +33,7 @@
     }
     
     public FieldParser getParser(final String name) {
-        final FieldParser field = (FieldParser) parsers.get(name.toLowerCase());
+        final FieldParser field = parsers.get(name.toLowerCase());
         if(field==null) {
             return defaultParser;
         }
Index: src/main/java/org/apache/james/mime4j/field/address/NamedMailbox.java
===================================================================
--- src/main/java/org/apache/james/mime4j/field/address/NamedMailbox.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/field/address/NamedMailbox.java	(working copy)
@@ -64,6 +64,7 @@
 	 * 
 	 * @see Mailbox#getAddressString(boolean) 
 	 */
+	@Override
 	public String getAddressString(boolean includeRoute) {
 		return (name == null ? "" : name + " ") + super.getAddressString(includeRoute);
 	}
Index: src/main/java/org/apache/james/mime4j/field/address/AddressList.java
===================================================================
--- src/main/java/org/apache/james/mime4j/field/address/AddressList.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/field/address/AddressList.java	(working copy)
@@ -24,6 +24,7 @@
 
 import java.io.StringReader;
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  * An immutable, random-access list of Address objects.
@@ -32,17 +33,17 @@
  */
 public class AddressList {
 	
-	private ArrayList addresses;
+	private List<? extends Address> addresses;
 
 	/**
-	 * @param addresses An ArrayList that contains only Address objects. 
+	 * @param addresses A List that contains only Address objects. 
 	 * @param dontCopy true iff it is not possible for the addresses ArrayList to be modified by someone else.
 	 */
-	public AddressList(ArrayList addresses, boolean dontCopy) {
+	public AddressList(List<? extends Address> addresses, boolean dontCopy) {
 		if (addresses != null)
-			this.addresses = (dontCopy ? addresses : (ArrayList) addresses.clone());
+			this.addresses = dontCopy ? addresses : new ArrayList<Address>(addresses);
 		else
-			this.addresses = new ArrayList(0);
+			this.addresses = new ArrayList<Address>(0);
 	}
 
 	/**
@@ -58,7 +59,7 @@
 	public Address get(int index) {
 		if (0 > index || size() <= index)
 			throw new IndexOutOfBoundsException();
-		return (Address) addresses.get(index);
+		return addresses.get(index);
 	}
 
 	/**
@@ -69,19 +70,21 @@
 	public MailboxList flatten() {
 		// in the common case, all addresses are mailboxes
 		boolean groupDetected = false;
-		for (int i = 0; i < size(); i++) {
-			if (!(get(i) instanceof Mailbox)) {
+		for (Address addr : addresses) {
+			if (!(addr instanceof Mailbox)) {
 				groupDetected = true;
 				break;
 			}
 		}
 		
-		if (!groupDetected)
-			return new MailboxList(addresses, true);
+		if (!groupDetected) {
+			@SuppressWarnings("unchecked")
+			final List<Mailbox> mailboxes = (List<Mailbox>) addresses; 
+			return new MailboxList(mailboxes, true);
+		}
 		
-		ArrayList results = new ArrayList();
-		for (int i = 0; i < size(); i++) {
-			Address addr = get(i);
+		List<Mailbox> results = new ArrayList<Mailbox>();
+		for (Address addr : addresses) {
 			addr.addMailboxesTo(results);
 		}
 		
@@ -95,8 +98,7 @@
 	 * stdout, for debugging purposes.
 	 */
 	public void print() {
-		for (int i = 0; i < size(); i++) {
-			Address addr = get(i);
+		for (Address addr : addresses) {
 			System.out.println(addr.toString());
 		}
 	}
Index: src/main/java/org/apache/james/mime4j/field/address/DomainList.java
===================================================================
--- src/main/java/org/apache/james/mime4j/field/address/DomainList.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/field/address/DomainList.java	(working copy)
@@ -20,6 +20,7 @@
 package org.apache.james.mime4j.field.address;
 
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  * An immutable, random-access list of Strings (that 
@@ -28,17 +29,17 @@
  * 
  */
 public class DomainList {
-	private ArrayList domains;
+	private List<String> domains;
 	
 	/**
-	 * @param domains An ArrayList that contains only String objects. 
+	 * @param domains A List that contains only String objects. 
 	 * @param dontCopy true iff it is not possible for the domains ArrayList to be modified by someone else.
 	 */
-	public DomainList(ArrayList domains, boolean dontCopy) {
+	public DomainList(List<String> domains, boolean dontCopy) {
 		if (domains != null)
-			this.domains = (dontCopy ? domains : (ArrayList) domains.clone());
+			this.domains = dontCopy ? domains :  new ArrayList<String>(domains);
 		else
-			this.domains = new ArrayList(0);
+			this.domains = new ArrayList<String>(0);
 	}
 	
 	/**
@@ -56,7 +57,7 @@
 	public String get(int index) {
 		if (0 > index || size() <= index)
 			throw new IndexOutOfBoundsException();
-		return (String) domains.get(index);
+		return domains.get(index);
 	}
 
 	/**
@@ -64,7 +65,7 @@
 	 * string (not including the trailing ':'). 
 	 */
 	public String toRouteString() {
-		StringBuffer out = new StringBuffer();
+		StringBuilder out = new StringBuilder();
 		for (int i = 0; i < domains.size(); i++) {
 			out.append("@");
 			out.append(get(i));
Index: src/main/java/org/apache/james/mime4j/field/address/Address.java
===================================================================
--- src/main/java/org/apache/james/mime4j/field/address/Address.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/field/address/Address.java	(working copy)
@@ -19,7 +19,7 @@
 
 package org.apache.james.mime4j.field.address;
 
-import java.util.ArrayList;
+import java.util.List;
 
 /**
  * The abstract base for classes that represent RFC2822 addresses.
@@ -33,20 +33,20 @@
 
 	/**
 	 * Adds any mailboxes represented by this address
-	 * into the given ArrayList. Note that this method
+	 * into the given List. Note that this method
 	 * has default (package) access, so a doAddMailboxesTo
 	 * method is needed to allow the behavior to be
 	 * overridden by subclasses.
 	 */
-	final void addMailboxesTo(ArrayList results) {
+	final void addMailboxesTo(List<Mailbox> results) {
 		doAddMailboxesTo(results);
 	}
 	
 	/**
 	 * Adds any mailboxes represented by this address
-	 * into the given ArrayList. Must be overridden by
+	 * into the given List. Must be overridden by
 	 * concrete subclasses.
 	 */
-	protected abstract void doAddMailboxesTo(ArrayList results);
+	protected abstract void doAddMailboxesTo(List<Mailbox> results);
 
 }
Index: src/main/java/org/apache/james/mime4j/field/address/Builder.java
===================================================================
--- src/main/java/org/apache/james/mime4j/field/address/Builder.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/field/address/Builder.java	(working copy)
@@ -37,6 +37,7 @@
 
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 
 /**
  * Transforms the JJTree-generated abstract syntax tree
@@ -55,7 +56,7 @@
 	
 	
 	public AddressList buildAddressList(ASTaddress_list node) {
-		ArrayList list = new ArrayList();
+		List<Address> list = new ArrayList<Address>();
 		for (int i = 0; i < node.jjtGetNumChildren(); i++) {
 			ASTaddress childNode = (ASTaddress) node.jjtGetChild(i);
 			Address address = buildAddress(childNode);
@@ -66,7 +67,7 @@
 
 	private Address buildAddress(ASTaddress node) {
 		ChildNodeIterator it = new ChildNodeIterator(node);
-		Node n = it.nextNode();
+		Node n = it.next();
 		if (n instanceof ASTaddr_spec) {
 			return buildAddrSpec((ASTaddr_spec)n);
 		}
@@ -75,7 +76,7 @@
 		}
 		else if (n instanceof ASTphrase) {
 			String name = buildString((ASTphrase)n, false);
-			Node n2 = it.nextNode();
+			Node n2 = it.next();
 			if (n2 instanceof ASTgroup_body) {
 				return new Group(name, buildGroupBody((ASTgroup_body)n2));
 			}
@@ -95,10 +96,10 @@
 	
 	
 	private MailboxList buildGroupBody(ASTgroup_body node) {
-		ArrayList results = new ArrayList();
+		List<Mailbox> results = new ArrayList<Mailbox>();
 		ChildNodeIterator it = new ChildNodeIterator(node);
 		while (it.hasNext()) {
-			Node n = it.nextNode();
+			Node n = it.next();
 			if (n instanceof ASTmailbox)
 				results.add(buildMailbox((ASTmailbox)n));
 			else
@@ -109,7 +110,7 @@
 
 	private Mailbox buildMailbox(ASTmailbox node) {
 		ChildNodeIterator it = new ChildNodeIterator(node);
-		Node n = it.nextNode();
+		Node n = it.next();
 		if (n instanceof ASTaddr_spec) {
 			return buildAddrSpec((ASTaddr_spec)n);
 		}
@@ -126,7 +127,7 @@
 
 	private NamedMailbox buildNameAddr(ASTname_addr node) {
 		ChildNodeIterator it = new ChildNodeIterator(node);
-		Node n = it.nextNode();
+		Node n = it.next();
 		String name;
 		if (n instanceof ASTphrase) {
 			name = buildString((ASTphrase)n, false);
@@ -135,7 +136,7 @@
 			throw new IllegalStateException();
 		}
 		
-		n = it.nextNode();
+		n = it.next();
 		if (n instanceof ASTangle_addr) {
             name = DecoderUtil.decodeEncodedWords(name);
 			return new NamedMailbox(name, buildAngleAddr((ASTangle_addr) n));
@@ -148,10 +149,10 @@
 	private Mailbox buildAngleAddr(ASTangle_addr node) {
 		ChildNodeIterator it = new ChildNodeIterator(node);
 		DomainList route = null;
-		Node n = it.nextNode();
+		Node n = it.next();
 		if (n instanceof ASTroute) {
 			route = buildRoute((ASTroute)n);
-			n = it.nextNode();
+			n = it.next();
 		}
 		else if (n instanceof ASTaddr_spec)
 			; // do nothing
@@ -165,10 +166,10 @@
 	}
 
 	private DomainList buildRoute(ASTroute node) {
-		ArrayList results = new ArrayList(node.jjtGetNumChildren());
+		List<String> results = new ArrayList<String>(node.jjtGetNumChildren());
 		ChildNodeIterator it = new ChildNodeIterator(node);
 		while (it.hasNext()) {
-			Node n = it.nextNode();
+			Node n = it.next();
 			if (n instanceof ASTdomain)
 				results.add(buildString((ASTdomain)n, true));
 			else
@@ -182,8 +183,8 @@
 	}
 	private Mailbox buildAddrSpec(DomainList route, ASTaddr_spec node) {
 		ChildNodeIterator it = new ChildNodeIterator(node);
-		String localPart = buildString((ASTlocal_part)it.nextNode(), true);
-		String domain = buildString((ASTdomain)it.nextNode(), true);
+		String localPart = buildString((ASTlocal_part)it.next(), true);
+		String domain = buildString((ASTdomain)it.next(), true);
 		return new Mailbox(route, localPart, domain);		
 	}
 
@@ -191,7 +192,7 @@
 	private String buildString(SimpleNode node, boolean stripSpaces) {
 		Token head = node.firstToken;
 		Token tail = node.lastToken;
-		StringBuffer out = new StringBuffer();
+		StringBuilder out = new StringBuilder();
 		
 		while (head != tail) {
 			out.append(head.image);
@@ -204,14 +205,14 @@
 		return out.toString();
 	}
 
-	private void addSpecials(StringBuffer out, Token specialToken) {
+	private void addSpecials(StringBuilder out, Token specialToken) {
 		if (specialToken != null) {
 			addSpecials(out, specialToken.specialToken);
 			out.append(specialToken.image);
 		}
 	}
 
-	private static class ChildNodeIterator implements Iterator {
+	private static class ChildNodeIterator implements Iterator<Node> {
 
 		private SimpleNode simpleNode;
 		private int index;
@@ -231,11 +232,7 @@
 			return index < len;
 		}
 
-		public Object next() {
-			return nextNode();
-		}
-		
-		public Node nextNode() {
+		public Node next() {
 			return simpleNode.jjtGetChild(index++);
 		}
 		
Index: src/main/java/org/apache/james/mime4j/field/address/MailboxList.java
===================================================================
--- src/main/java/org/apache/james/mime4j/field/address/MailboxList.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/field/address/MailboxList.java	(working copy)
@@ -20,6 +20,7 @@
 package org.apache.james.mime4j.field.address;
 
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  * An immutable, random-access list of Mailbox objects.
@@ -28,17 +29,17 @@
  */
 public class MailboxList {
 
-	private ArrayList mailboxes;
+	private List<Mailbox> mailboxes;
 	
 	/**
-	 * @param mailboxes An ArrayList that contains only Mailbox objects. 
+	 * @param mailboxes A List that contains only Mailbox objects. 
 	 * @param dontCopy true iff it is not possible for the mailboxes ArrayList to be modified by someone else.
 	 */
-	public MailboxList(ArrayList mailboxes, boolean dontCopy) {
+	public MailboxList(List<Mailbox> mailboxes, boolean dontCopy) {
 		if (mailboxes != null)
-			this.mailboxes = (dontCopy ? mailboxes : (ArrayList) mailboxes.clone());
+			this.mailboxes = dontCopy ? mailboxes : new ArrayList<Mailbox>(mailboxes);
 		else
-			this.mailboxes = new ArrayList(0);
+			this.mailboxes = new ArrayList<Mailbox>(0);
 	}
 	
 	/**
@@ -54,7 +55,7 @@
 	public Mailbox get(int index) {
 		if (0 > index || size() <= index)
 			throw new IndexOutOfBoundsException();
-		return (Mailbox) mailboxes.get(index);
+		return mailboxes.get(index);
 	}
 	
 	/**
Index: src/main/java/org/apache/james/mime4j/field/address/Mailbox.java
===================================================================
--- src/main/java/org/apache/james/mime4j/field/address/Mailbox.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/field/address/Mailbox.java	(working copy)
@@ -19,7 +19,7 @@
 
 package org.apache.james.mime4j.field.address;
 
-import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Represents a single e-mail address. 
@@ -109,10 +109,12 @@
 			+ domain + ">";  
 	}
 	
-	protected final void doAddMailboxesTo(ArrayList results) {
+	@Override
+	protected final void doAddMailboxesTo(List<Mailbox> results) {
 		results.add(this);
 	}
 	
+	@Override
 	public String toString() {
 		return getAddressString();
 	}
Index: src/main/java/org/apache/james/mime4j/field/address/Group.java
===================================================================
--- src/main/java/org/apache/james/mime4j/field/address/Group.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/field/address/Group.java	(working copy)
@@ -19,7 +19,7 @@
 
 package org.apache.james.mime4j.field.address;
 
-import java.util.ArrayList;
+import java.util.List;
 
 /**
  * A named group of zero or more mailboxes.  
@@ -53,8 +53,9 @@
 		return mailboxList;
 	}
 	
+	@Override
 	public String toString() {
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		buf.append(name);
 		buf.append(":");
 		for (int i = 0; i < mailboxList.size(); i++) {
@@ -66,7 +67,8 @@
 		return buf.toString();
 	}
 
-	protected void doAddMailboxesTo(ArrayList results) {
+	@Override
+	protected void doAddMailboxesTo(List<Mailbox> results) {
 		for (int i = 0; i < mailboxList.size(); i++)
 			results.add(mailboxList.get(i));
 	}
Index: src/main/java/org/apache/james/mime4j/field/datetime/DateTime.java
===================================================================
--- src/main/java/org/apache/james/mime4j/field/datetime/DateTime.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/field/datetime/DateTime.java	(working copy)
@@ -110,10 +110,12 @@
         System.out.println(toString());
     }
 
+    @Override
     public String toString() {
         return getYear() + " " + getMonth() + " " + getDay() + "; " + getHour() + " " + getMinute() + " " + getSecond() + " " + getTimeZone();
     }
 
+    @Override
     public int hashCode() {
         final int PRIME = 31;
         int result = 1;
@@ -128,6 +130,7 @@
         return result;
     }
 
+    @Override
     public boolean equals(Object obj) {
         if (this == obj)
             return true;
Index: src/main/java/org/apache/james/mime4j/message/Entity.java
===================================================================
--- src/main/java/org/apache/james/mime4j/message/Entity.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/message/Entity.java	(working copy)
@@ -24,7 +24,6 @@
 import org.apache.james.mime4j.field.ContentTransferEncodingField;
 import org.apache.james.mime4j.field.ContentTypeField;
 import org.apache.james.mime4j.field.Field;
-import org.apache.james.mime4j.util.MessageUtils;
 import org.apache.james.mime4j.util.MimeUtil;
 
 import java.io.IOException;
@@ -168,11 +167,10 @@
      * Write the content to the given outputstream
      * 
      * @param out the outputstream to write to
-     * @param mode compatibility mode:
-     *   {@link MessageUtils#LENIENT}, {@link MessageUtils#STRICT_ERROR}, {@link MessageUtils#STRICT_IGNORE}  
+     * @param mode compatibility mode  
      * @throws IOException 
      */
-    public void writeTo(OutputStream out, int mode) throws IOException, MimeException {
+    public void writeTo(OutputStream out, Mode mode) throws IOException, MimeException {
         getHeader().writeTo(out, mode);
         
         out.flush();
Index: src/main/java/org/apache/james/mime4j/message/Multipart.java
===================================================================
--- src/main/java/org/apache/james/mime4j/message/Multipart.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/message/Multipart.java	(working copy)
@@ -25,7 +25,6 @@
 import java.io.OutputStreamWriter;
 import java.nio.charset.Charset;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -48,7 +47,7 @@
 public class Multipart implements Body {
     private String preamble = "";
     private String epilogue = "";
-    private List bodyParts = new LinkedList();
+    private List<BodyPart> bodyParts = new LinkedList<BodyPart>();
     private Entity parent = null;
     private String subType;
 
@@ -93,8 +92,8 @@
      */
     public void setParent(Entity parent) {
         this.parent = parent;
-        for (Iterator it = bodyParts.iterator(); it.hasNext();) {
-            ((BodyPart) it.next()).setParent(parent);
+        for (BodyPart bodyPart : bodyParts) {
+            bodyPart.setParent(parent);
         }
     }
 
@@ -121,7 +120,7 @@
      * 
      * @return the list of <code>BodyPart</code> objects.
      */
-    public List getBodyParts() {
+    public List<BodyPart> getBodyParts() {
         return Collections.unmodifiableList(bodyParts);
     }
     
@@ -130,10 +129,10 @@
      * 
      * @param bodyParts the new list of <code>BodyPart</code> objects.
      */
-    public void setBodyParts(List bodyParts) {
+    public void setBodyParts(List<BodyPart> bodyParts) {
         this.bodyParts = bodyParts;
-        for (Iterator it = bodyParts.iterator(); it.hasNext();) {
-            ((BodyPart) it.next()).setParent(parent);
+        for (BodyPart bodyPart : bodyParts) {
+            bodyPart.setParent(parent);
         }
     }
     
@@ -174,7 +173,7 @@
      * @throws IOException if case of an I/O error
      * @throws MimeException if case of a MIME protocol violation
      */
-    public void writeTo(final OutputStream out, int mode) throws IOException, MimeException {
+    public void writeTo(final OutputStream out, Mode mode) throws IOException, MimeException {
         Entity e = getParent();
         
         ContentTypeField cField = (ContentTypeField) e.getHeader().getField(
@@ -185,7 +184,7 @@
         String boundary = cField.getBoundary();
 
         Charset charset = null;
-        if (mode == MessageUtils.LENIENT) {
+        if (mode == Mode.LENIENT) {
             if (cField != null && cField.getCharset() != null) {
                 charset = CharsetUtil.getCharset(cField.getCharset());
             } else {
@@ -198,7 +197,7 @@
         BufferedWriter writer = new BufferedWriter(
                 new OutputStreamWriter(out, charset), 8192);
         
-        List bodyParts = getBodyParts();
+        List<BodyPart> bodyParts = getBodyParts();
 
         writer.write(getPreamble());
         writer.write(MessageUtils.CRLF);
@@ -208,7 +207,7 @@
             writer.write(boundary);
             writer.write(MessageUtils.CRLF);
             writer.flush();
-            final BodyPart bodyPart = (BodyPart) bodyParts.get(i);
+            final BodyPart bodyPart = bodyParts.get(i);
             bodyPart.writeTo(out, mode);
             writer.write(MessageUtils.CRLF);
         }
@@ -229,8 +228,8 @@
      * @see org.apache.james.mime4j.message.Disposable#dispose()
      */
     public void dispose() {
-        for (Iterator it = bodyParts.iterator(); it.hasNext();) {
-            ((BodyPart) it.next()).dispose();
+        for (BodyPart bodyPart : bodyParts) {
+            bodyPart.dispose();
         }
     }
 
Index: src/main/java/org/apache/james/mime4j/message/SimpleContentHandler.java
===================================================================
--- src/main/java/org/apache/james/mime4j/message/SimpleContentHandler.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/message/SimpleContentHandler.java	(working copy)
@@ -66,6 +66,7 @@
     /**
      * @see org.apache.james.mime4j.parser.AbstractContentHandler#startHeader()
      */
+    @Override
     public final void startHeader() {
         currHeader = new Header();
     }
@@ -73,6 +74,7 @@
     /**
      * @see org.apache.james.mime4j.parser.AbstractContentHandler#field(java.lang.String)
      */
+    @Override
     public final void field(String fieldData) throws MimeException {
         currHeader.addField(Field.parse(fieldData));
     }
@@ -80,6 +82,7 @@
     /**
      * @see org.apache.james.mime4j.parser.AbstractContentHandler#endHeader()
      */
+    @Override
     public final void endHeader() {
         Header tmp = currHeader;
         currHeader = null;
@@ -89,6 +92,7 @@
     /**
      * @see org.apache.james.mime4j.parser.AbstractContentHandler#body(org.apache.james.mime4j.descriptor.BodyDescriptor, java.io.InputStream)
      */
+    @Override
     public final void body(BodyDescriptor bd, InputStream is) throws IOException {
         if (MimeUtil.isBase64Encoding(bd.getTransferEncoding())) {
             bodyDecoded(bd, new Base64InputStream(is));
Index: src/main/java/org/apache/james/mime4j/message/Mode.java
===================================================================
--- src/main/java/org/apache/james/mime4j/message/Mode.java	(revision 0)
+++ src/main/java/org/apache/james/mime4j/message/Mode.java	(revision 0)
@@ -0,0 +1,34 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.message;
+
+public class Mode {
+
+    // because of a problem with the retrotranslator maven plugin this class
+    // uses the old typesafe enum pattern instead of a native Java 5 enum
+
+    public static final Mode STRICT_IGNORE = new Mode();
+    public static final Mode STRICT_ERROR = new Mode();
+    public static final Mode LENIENT = new Mode();
+
+    private Mode() {
+    }
+
+}
Index: src/main/java/org/apache/james/mime4j/message/storage/SimpleTempStorage.java
===================================================================
--- src/main/java/org/apache/james/mime4j/message/storage/SimpleTempStorage.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/message/storage/SimpleTempStorage.java	(working copy)
@@ -115,6 +115,7 @@
     /**
      * @see org.apache.james.mime4j.message.storage.TempStorage#getRootTempPath()
      */
+    @Override
     public TempPath getRootTempPath() {
         return rootPath;
     }
@@ -188,7 +189,7 @@
     private static class SimpleTempFile implements TempFile {
         private File file = null;
 
-        private static final Set filesToDelete = new HashSet();
+        private static final Set<File> filesToDelete = new HashSet<File>();
 
         private SimpleTempFile(File file) {
             this.file = file;
@@ -234,9 +235,9 @@
                     file = null;
                 }
 
-                for (Iterator iterator = filesToDelete.iterator(); iterator
+                for (Iterator<File> iterator = filesToDelete.iterator(); iterator
                         .hasNext();) {
-                    File file = (File) iterator.next();
+                    File file = iterator.next();
                     if (file.delete())
                         iterator.remove();
                 }
Index: src/main/java/org/apache/james/mime4j/message/TempFileTextBody.java
===================================================================
--- src/main/java/org/apache/james/mime4j/message/TempFileTextBody.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/message/TempFileTextBody.java	(working copy)
@@ -101,9 +101,9 @@
     
     
     /**
-     * @see org.apache.james.mime4j.message.Body#writeTo(java.io.OutputStream, int)
+     * @see org.apache.james.mime4j.message.Body#writeTo(java.io.OutputStream, Mode)
      */
-    public void writeTo(OutputStream out, int mode) throws IOException {
+    public void writeTo(OutputStream out, Mode mode) throws IOException {
         final InputStream inputStream = tempFile.getInputStream();
         CodecUtil.copy(inputStream, out);
     }
@@ -113,6 +113,7 @@
      * 
      * @see org.apache.james.mime4j.message.Disposable#dispose()
      */
+    @Override
     public void dispose() {
         if (tempFile != null) {
             tempFile.delete();
Index: src/main/java/org/apache/james/mime4j/message/TempFileBinaryBody.java
===================================================================
--- src/main/java/org/apache/james/mime4j/message/TempFileBinaryBody.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/message/TempFileBinaryBody.java	(working copy)
@@ -63,9 +63,9 @@
     }
     
     /**
-     * @see org.apache.james.mime4j.message.Body#writeTo(java.io.OutputStream, int)
+     * @see org.apache.james.mime4j.message.Body#writeTo(java.io.OutputStream, Mode)
      */
-    public void writeTo(OutputStream out, int mode) throws IOException {
+    public void writeTo(OutputStream out, Mode mode) throws IOException {
         final InputStream inputStream = getInputStream();
         CodecUtil.copy(inputStream,out);
     }
@@ -75,6 +75,7 @@
      * 
      * @see org.apache.james.mime4j.message.Disposable#dispose()
      */
+    @Override
     public void dispose() {
         if (tempFile != null) {
             tempFile.delete();
Index: src/main/java/org/apache/james/mime4j/message/Header.java
===================================================================
--- src/main/java/org/apache/james/mime4j/message/Header.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/message/Header.java	(working copy)
@@ -50,8 +50,8 @@
  * @version $Id: Header.java,v 1.3 2004/10/04 15:36:44 ntherning Exp $
  */
 public class Header {
-    private List fields = new LinkedList();
-    private Map/*<String, List<Field>>*/ fieldMap = new HashMap();
+    private List<Field> fields = new LinkedList<Field>();
+    private Map<String, List<Field>> fieldMap = new HashMap<String, List<Field>>();
     
     /**
      * Creates a new empty <code>Header</code>.
@@ -71,9 +71,11 @@
             throws IOException, MimeIOException {
         final MimeStreamParser parser = new MimeStreamParser();
         parser.setContentHandler(new AbstractContentHandler() {
+            @Override
             public void endHeader() {
                 parser.stop();
             }
+            @Override
             public void field(String fieldData) throws MimeException {
                 addField(Field.parse(fieldData));
             }
@@ -91,9 +93,9 @@
      * @param field the field to add.
      */
     public void addField(Field field) {
-        List values = (List) fieldMap.get(field.getName().toLowerCase());
+        List<Field> values = fieldMap.get(field.getName().toLowerCase());
         if (values == null) {
-            values = new LinkedList();
+            values = new LinkedList<Field>();
             fieldMap.put(field.getName().toLowerCase(), values);
         }
         values.add(field);
@@ -106,7 +108,7 @@
      * 
      * @return the list of <code>Field</code> objects.
      */
-    public List getFields() {
+    public List<Field> getFields() {
         return Collections.unmodifiableList(fields);
     }
 
@@ -118,9 +120,9 @@
      * @return the field or <code>null</code> if none found.
      */
     public Field getField(String name) {
-        List l = (List) fieldMap.get(name.toLowerCase());
+        List<Field> l = fieldMap.get(name.toLowerCase());
         if (l != null && !l.isEmpty()) {
-            return (Field) l.get(0);
+            return l.get(0);
         }
         return null;
     }
@@ -131,12 +133,12 @@
      * @param name the field name (e.g. From, Subject).
      * @return the list of fields.
      */
-    public List getFields(final String name) {
+    public List<Field> getFields(final String name) {
         final String lowerCaseName = name.toLowerCase();
-        final List l = (List) fieldMap.get(lowerCaseName);
-        final List results;
+        final List<Field> l = fieldMap.get(lowerCaseName);
+        final List<Field> results;
         if (l == null || l.isEmpty()) {
-            results = Collections.EMPTY_LIST;
+            results = Collections.emptyList();
         } else {
             results = Collections.unmodifiableList(l);
         }
@@ -152,12 +154,12 @@
      */
     public int removeFields(String name) {
         final String lowerCaseName = name.toLowerCase();
-        List removed = (List) fieldMap.remove(lowerCaseName);
+        List<Field> removed = fieldMap.remove(lowerCaseName);
         if (removed == null || removed.isEmpty())
             return 0;
 
-        for (Iterator iterator = fields.iterator(); iterator.hasNext();) {
-            Field field = (Field) iterator.next();
+        for (Iterator<Field> iterator = fields.iterator(); iterator.hasNext();) {
+            Field field = iterator.next();
             if (field.getName().equalsIgnoreCase(name))
                 iterator.remove();
         }
@@ -179,7 +181,7 @@
      */
     public void setField(Field field) {
         final String lowerCaseName = field.getName().toLowerCase();
-        List l = (List) fieldMap.get(lowerCaseName);
+        List<Field> l = fieldMap.get(lowerCaseName);
         if (l == null || l.isEmpty()) {
             addField(field);
             return;
@@ -190,8 +192,8 @@
 
         int firstOccurrence = -1;
         int index = 0;
-        for (Iterator iterator = fields.iterator(); iterator.hasNext(); index++) {
-            Field f = (Field) iterator.next();
+        for (Iterator<Field> iterator = fields.iterator(); iterator.hasNext(); index++) {
+            Field f = iterator.next();
             if (f.getName().equalsIgnoreCase(field.getName())) {
                 iterator.remove();
 
@@ -209,10 +211,11 @@
      * 
      * @return headers
      */
+    @Override
     public String toString() {
         CharArrayBuffer str = new CharArrayBuffer(128);
-        for (Iterator it = fields.iterator(); it.hasNext();) {
-            str.append(it.next().toString());
+        for (Field field : fields) {
+            str.append(field.toString());
             str.append("\r\n");
         }
         return str.toString();
@@ -242,9 +245,9 @@
      * @throws IOException if case of an I/O error
      * @throws MimeException if case of a MIME protocol violation
      */
-    public void writeTo(final OutputStream out, int mode) throws IOException, MimeException {
+    public void writeTo(final OutputStream out, Mode mode) throws IOException, MimeException {
         Charset charset = null;
-        if (mode == MessageUtils.LENIENT) {
+        if (mode == Mode.LENIENT) {
             final ContentTypeField contentTypeField = ((ContentTypeField) getField(Field.CONTENT_TYPE));
             if (contentTypeField == null) {
                 charset = MessageUtils.DEFAULT_CHARSET;
@@ -261,10 +264,9 @@
         }
         BufferedWriter writer = new BufferedWriter(
                 new OutputStreamWriter(out, charset), 8192);
-        for (Iterator it = fields.iterator(); it.hasNext();) {
-            Field field = (Field) it.next();
+        for (Field field : fields) {
             String fs = field.toString();
-            if (mode == MessageUtils.STRICT_ERROR && !MessageUtils.isASCII(fs)) {
+            if (mode == Mode.STRICT_ERROR && !MessageUtils.isASCII(fs)) {
                 throw new MimeException("Header '" + fs + "' violates RFC 822");
             }
             writer.write(fs);
Index: src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
===================================================================
--- src/main/java/org/apache/james/mime4j/message/MessageBuilder.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/message/MessageBuilder.java	(working copy)
@@ -35,13 +35,13 @@
 public class MessageBuilder implements ContentHandler {
 
     private final Entity entity;
-    private Stack stack = new Stack();
+    private Stack<Object> stack = new Stack<Object>();
     
     public MessageBuilder(Entity entity) {
         this.entity = entity;
     }
     
-    private void expect(Class c) {
+    private void expect(Class<?> c) {
         if (!c.isInstance(stack.peek())) {
             throw new IllegalStateException("Internal stack error: "
                     + "Expected '" + c.getName() + "' found '"
Index: src/main/java/org/apache/james/mime4j/message/Body.java
===================================================================
--- src/main/java/org/apache/james/mime4j/message/Body.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/message/Body.java	(working copy)
@@ -23,7 +23,6 @@
 import java.io.OutputStream;
 
 import org.apache.james.mime4j.MimeException;
-import org.apache.james.mime4j.util.MessageUtils;
 
 /**
  * Encapsulates the body of an entity (see RFC 2045).
@@ -51,9 +50,8 @@
      * Writes this body to the given stream in MIME message format.
      * 
      * @param out the stream to write to.
-     * @param mode compatibility mode:
-     *   {@link MessageUtils#LENIENT}, {@link MessageUtils#STRICT_ERROR}, {@link MessageUtils#STRICT_IGNORE}  
+     * @param mode compatibility mode  
      * @throws IOException on I/O errors.
      */
-    void writeTo(OutputStream out, int mode) throws IOException, MimeException;
+    void writeTo(OutputStream out, Mode mode) throws IOException, MimeException;
 }
Index: src/main/java/org/apache/james/mime4j/decoder/QuotedPrintableOutputStream.java
===================================================================
--- src/main/java/org/apache/james/mime4j/decoder/QuotedPrintableOutputStream.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/decoder/QuotedPrintableOutputStream.java	(working copy)
@@ -38,6 +38,7 @@
         encoder.initEncoding(out);
     }
 
+    @Override
     public void close() throws IOException {
     	if (closed) return;
 
@@ -49,14 +50,17 @@
     	}
     }
 
+    @Override
     public void flush() throws IOException {
         encoder.flushOutput();
     }
 
+    @Override
     public void write(int b) throws IOException {
         this.write(new byte[] { (byte) b }, 0, 1);
     }
 
+    @Override
     public void write(byte[] b, int off, int len) throws IOException {
         if (closed) {
             throw new IOException("QuotedPrintableOutputStream has been closed");
Index: src/main/java/org/apache/james/mime4j/decoder/Base64InputStream.java
===================================================================
--- src/main/java/org/apache/james/mime4j/decoder/Base64InputStream.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/decoder/Base64InputStream.java	(working copy)
@@ -49,10 +49,12 @@
      * 
      * @throws IOException on I/O errors.
      */
+    @Override
     public void close() throws IOException {
         closed = true;
     }
     
+    @Override
     public int read() throws IOException {
         if (closed) {
             throw new IOException("Base64InputStream has been closed");
Index: src/main/java/org/apache/james/mime4j/decoder/Base64OutputStream.java
===================================================================
--- src/main/java/org/apache/james/mime4j/decoder/Base64OutputStream.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/decoder/Base64OutputStream.java	(working copy)
@@ -254,8 +254,8 @@
      * @return <code>true</code> if any byte is a valid character in the Base64 alphabet; false herwise
      */
     private static boolean containsBase64Byte(byte[] arrayOctet) {
-        for (int i = 0; i < arrayOctet.length; i++) {
-            if (isBase64(arrayOctet[i])) {
+        for (byte octet : arrayOctet) {
+            if (isBase64(octet)) {
                 return true;
             }
         }
@@ -269,6 +269,7 @@
     /**
      * Writes the specified <code>byte</code> to this output stream.
      */
+    @Override
     public void write(int i) throws IOException {
         singleByte[0] = (byte) i;
         write(singleByte, 0, 1);
@@ -288,6 +289,7 @@
      * @throws NullPointerException if the byte array parameter is null
      * @throws IndexOutOfBoundsException if offset, len or buffer size are invalid
      */
+    @Override
     public void write(byte b[], int offset, int len) throws IOException {
         if (closed) {
         	throw new IOException("Base64OutputStream has been closed");
@@ -375,6 +377,7 @@
      *
      * @throws IOException if an I/O error occurs.
      */
+    @Override
     public void flush() throws IOException {
         flushBuffer();
         out.flush();
@@ -384,6 +387,7 @@
      * Terminates the BASE64 coded content and flushes the internal buffers. This method does
      * NOT close the underlying output stream.
      */
+    @Override
     public void close() throws IOException {
         if (closed) {
             return;
Index: src/main/java/org/apache/james/mime4j/decoder/UnboundedFifoByteBuffer.java
===================================================================
--- src/main/java/org/apache/james/mime4j/decoder/UnboundedFifoByteBuffer.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/decoder/UnboundedFifoByteBuffer.java	(working copy)
@@ -216,8 +216,8 @@
      *
      * @return an iterator over this buffer's elements
      */
-    public Iterator iterator() {
-        return new Iterator() {
+    public Iterator<Byte> iterator() {
+        return new Iterator<Byte>() {
 
             private int index = head;
             private int lastReturnedIndex = -1;
@@ -227,7 +227,7 @@
 
             }
 
-            public Object next() {
+            public Byte next() {
                 if (!hasNext()) {
                     throw new NoSuchElementException();
                 }
Index: src/main/java/org/apache/james/mime4j/decoder/ByteQueue.java
===================================================================
--- src/main/java/org/apache/james/mime4j/decoder/ByteQueue.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/decoder/ByteQueue.java	(working copy)
@@ -54,7 +54,7 @@
             buf = new UnboundedFifoByteBuffer();
     }
 
-    public Iterator iterator() {
+    public Iterator<Byte> iterator() {
         return buf.iterator();
     }
 
Index: src/main/java/org/apache/james/mime4j/decoder/QuotedPrintableInputStream.java
===================================================================
--- src/main/java/org/apache/james/mime4j/decoder/QuotedPrintableInputStream.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/decoder/QuotedPrintableInputStream.java	(working copy)
@@ -51,10 +51,12 @@
      * 
      * @throws IOException on I/O errors.
      */
+    @Override
     public void close() throws IOException {
         this.closed = true;
     }
 
+    @Override
     public int read() throws IOException {
         if (closed) {
             throw new IOException("QuotedPrintableInputStream has been closed");
Index: src/main/java/org/apache/james/mime4j/io/RootInputStream.java
===================================================================
--- src/main/java/org/apache/james/mime4j/io/RootInputStream.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/io/RootInputStream.java	(working copy)
@@ -67,6 +67,7 @@
     /**
      * @see java.io.InputStream#read()
      */
+    @Override
     public int read() throws IOException {
         if (truncated) {
             return -1;
@@ -84,6 +85,7 @@
      * 
      * @see java.io.InputStream#read(byte[], int, int)
      */
+    @Override
     public int read(byte[] b, int off, int len) throws IOException {
         if (truncated) {
             return -1;
Index: src/main/java/org/apache/james/mime4j/io/PositionInputStream.java
===================================================================
--- src/main/java/org/apache/james/mime4j/io/PositionInputStream.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/io/PositionInputStream.java	(working copy)
@@ -37,10 +37,12 @@
         return position;
     }
 
+    @Override
     public int available() throws IOException {
         return in.available();
     }
 
+    @Override
     public int read() throws IOException {
         int b = in.read();
         if (b != -1)
@@ -48,24 +50,29 @@
         return b;
     }
 
+    @Override
     public void close() throws IOException {
         in.close();
     }
 
+    @Override
     public void reset() throws IOException {
         in.reset();
         position = markedPosition;
     }
 
+    @Override
     public boolean markSupported() {
         return in.markSupported();
     }
 
+    @Override
     public void mark(int readlimit) {
         in.mark(readlimit);
         markedPosition = position;
     }
 
+    @Override
     public long skip(long n) throws IOException {
         final long c = in.skip(n);
         if (c > 0) 
@@ -73,6 +80,7 @@
         return c;
     }
 
+    @Override
     public int read(byte b[], int off, int len) throws IOException {
         final int c = in.read(b, off, len);
         if (c > 0) 
Index: src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.java
===================================================================
--- src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.java	(working copy)
@@ -56,6 +56,7 @@
         this(is, -1);
     }
     
+    @Override
     public int read() throws IOException {
         int i = in.read();
         this.eof = i == -1;
@@ -63,6 +64,7 @@
         return i;
     }
 
+    @Override
     public int read(byte[] b, int off, int len) throws IOException {
         int i = in.read(b, off, len);
         this.eof = i == -1;
@@ -70,6 +72,7 @@
         return i;
     }
     
+    @Override
     public int readLine(final ByteArrayBuffer dst) throws IOException {
         int i;
         if (this.bis != null) {
@@ -110,6 +113,7 @@
         return this.used;
     }
     
+    @Override
     public String toString() {
         return "[LineReaderInputStreamAdaptor: " + bis + "]";
     }
Index: src/main/java/org/apache/james/mime4j/io/LimitedInputStream.java
===================================================================
--- src/main/java/org/apache/james/mime4j/io/LimitedInputStream.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/io/LimitedInputStream.java	(working copy)
@@ -40,17 +40,20 @@
         }
     }
     
+    @Override
     public int read() throws IOException {
         enforceLimit();
         return super.read();
     }
 
+    @Override
     public int read(byte b[], int off, int len) throws IOException {
         enforceLimit();
         len = Math.min(len, getBytesLeft());
         return super.read(b, off, len);
     }
 
+    @Override
     public long skip(long n) throws IOException {
         enforceLimit();
         n = Math.min(n, getBytesLeft());
Index: src/main/java/org/apache/james/mime4j/io/MimeBoundaryInputStream.java
===================================================================
--- src/main/java/org/apache/james/mime4j/io/MimeBoundaryInputStream.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/io/MimeBoundaryInputStream.java	(working copy)
@@ -82,12 +82,14 @@
      * 
      * @throws IOException on I/O errors.
      */
+    @Override
     public void close() throws IOException {
     }
 
     /**
      * @see java.io.InputStream#markSupported()
      */
+    @Override
     public boolean markSupported() {
         return false;
     }
@@ -95,6 +97,7 @@
     /**
      * @see java.io.InputStream#read()
      */
+    @Override
     public int read() throws IOException {
         if (completed) {
             return -1;
@@ -114,6 +117,7 @@
         }
     }
     
+    @Override
     public int read(byte[] b, int off, int len) throws IOException {
         if (completed) {
             return -1;
@@ -130,6 +134,7 @@
         return buffer.read(b, off, chunk);
     }
 
+    @Override
     public int readLine(final ByteArrayBuffer dst) throws IOException {
         if (dst == null) {
             throw new IllegalArgumentException("Destination buffer may not be null");
@@ -284,10 +289,11 @@
         return eof && !buffer.hasBufferedData();
     }
 
+    @Override
     public String toString() {
-        final StringBuffer buffer = new StringBuffer("MimeBoundaryInputStream, boundary ");
-        for (int i = 0; i < boundary.length; i++) {
-            buffer.append((char) boundary[i]);
+        final StringBuilder buffer = new StringBuilder("MimeBoundaryInputStream, boundary ");
+        for (byte b : boundary) {
+            buffer.append((char) b);
         }
         return buffer.toString();
     }
Index: src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.java
===================================================================
--- src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.java	(working copy)
@@ -101,6 +101,7 @@
         return this.bufpos < this.buflen;
     }
 
+    @Override
     public int read() throws IOException {
         int noRead = 0;
         while (!hasBufferedData()) {
@@ -112,6 +113,7 @@
         return this.buffer[this.bufpos++] & 0xff;
     }
     
+    @Override
     public int read(final byte[] b, int off, int len) throws IOException {
         if (b == null) {
             return 0;
@@ -132,6 +134,7 @@
         return chunk;
     }
     
+    @Override
     public int read(final byte[] b) throws IOException {
         if (b == null) {
             return 0;
@@ -139,11 +142,13 @@
         return read(b, 0, b.length);
     }
     
+    @Override
     public boolean markSupported() {
         return false;
     }
 
     
+    @Override
     public int readLine(final ByteArrayBuffer dst) throws IOException {
         if (dst == null) {
             throw new IllegalArgumentException("Buffer may not be null");
@@ -300,8 +305,9 @@
         this.buflen = 0;
     }
     
+    @Override
     public String toString() {
-        StringBuffer buffer = new StringBuffer();
+        StringBuilder buffer = new StringBuilder();
         buffer.append("[pos: ");
         buffer.append(this.bufpos);
         buffer.append("]");
Index: src/main/java/org/apache/james/mime4j/io/EOLConvertingInputStream.java
===================================================================
--- src/main/java/org/apache/james/mime4j/io/EOLConvertingInputStream.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/io/EOLConvertingInputStream.java	(working copy)
@@ -73,6 +73,7 @@
      * 
      * @throws IOException on I/O errors.
      */
+    @Override
     public void close() throws IOException {
         in.close();
     }
@@ -80,6 +81,7 @@
     /**
      * @see java.io.InputStream#read()
      */
+    @Override
     public int read() throws IOException {
         int b = in.read();
         
Index: src/main/java/org/apache/james/mime4j/parser/AbstractEntity.java
===================================================================
--- src/main/java/org/apache/james/mime4j/parser/AbstractEntity.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/parser/AbstractEntity.java	(working copy)
@@ -341,6 +341,7 @@
         }
     }
 
+    @Override
     public String toString() {
         return getClass().getName() + " [" + stateToString(state)
         + "][" + body.getMimeType() + "][" + body.getBoundary() + "]";
Index: src/main/java/org/apache/james/mime4j/parser/MimeStreamParser.java
===================================================================
--- src/main/java/org/apache/james/mime4j/parser/MimeStreamParser.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/parser/MimeStreamParser.java	(working copy)
@@ -52,12 +52,7 @@
         super();
         MimeEntityConfig localConfig;
         if (config != null) {
-            try {
-                localConfig = (MimeEntityConfig) config.clone();
-            } catch (CloneNotSupportedException ex) {
-                // should never happen
-                localConfig = new MimeEntityConfig();
-            }
+            localConfig = config.clone();
         } else {
             localConfig = new MimeEntityConfig();
         }
Index: src/main/java/org/apache/james/mime4j/parser/Event.java
===================================================================
--- src/main/java/org/apache/james/mime4j/parser/Event.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/parser/Event.java	(working copy)
@@ -46,10 +46,12 @@
         this.code = code;
     }
     
+    @Override
     public int hashCode() {
         return code.hashCode();
     }
 
+    @Override
     public boolean equals(Object obj) {
         if (obj == null) return false;
         if (this == obj) return true;
@@ -61,6 +63,7 @@
         }
     }
     
+    @Override
     public String toString() {
         return code;
     }
Index: src/main/java/org/apache/james/mime4j/parser/MimeEntity.java
===================================================================
--- src/main/java/org/apache/james/mime4j/parser/MimeEntity.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/parser/MimeEntity.java	(working copy)
@@ -97,10 +97,12 @@
         body.addField("Content-Type", contentType);
     }
     
+    @Override
     protected int getLineNumber() {
         return rootStream.getLineNumber();
     }
     
+    @Override
     protected LineReaderInputStream getDataStream() {
         return dataStream;
     }
Index: src/main/java/org/apache/james/mime4j/parser/MimeTokenStream.java
===================================================================
--- src/main/java/org/apache/james/mime4j/parser/MimeTokenStream.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/parser/MimeTokenStream.java	(working copy)
@@ -101,7 +101,7 @@
     }
     
     private final MimeEntityConfig config;
-    private final LinkedList entities = new LinkedList();
+    private final LinkedList<EntityStateMachine> entities = new LinkedList<EntityStateMachine>();
     
     private int state = T_END_OF_STREAM;
     private EntityStateMachine currentStateMachine;
@@ -381,7 +381,7 @@
             if (entities.isEmpty()) {
                 currentStateMachine = null;
             } else {
-                currentStateMachine = (EntityStateMachine) entities.getLast();
+                currentStateMachine = entities.getLast();
                 currentStateMachine.setRecursionMode(recursionMode);
             }
         }
Index: src/main/java/org/apache/james/mime4j/parser/MimeEntityConfig.java
===================================================================
--- src/main/java/org/apache/james/mime4j/parser/MimeEntityConfig.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/parser/MimeEntityConfig.java	(working copy)
@@ -34,7 +34,6 @@
     private long maxContentLen;
     
     public MimeEntityConfig() {
-        super();
         this.maximalBodyDescriptor = false;
         this.strictParsing = false;
         this.maxLineLen = 1000;
@@ -139,10 +138,17 @@
         return maxContentLen;
     }
 
-    public Object clone() throws CloneNotSupportedException {
-        return super.clone();
+    @Override
+    public MimeEntityConfig clone() {
+        try {
+            return (MimeEntityConfig) super.clone();
+        } catch (CloneNotSupportedException e) {
+            // this shouldn't happen, since we are Cloneable
+            throw new InternalError();
+        }
     }
     
+    @Override
     public String toString() {
         CharArrayBuffer buffer = new CharArrayBuffer(128);
         buffer.append("[max body descriptor: ");
Index: src/main/java/org/apache/james/mime4j/util/StringArrayMap.java
===================================================================
--- src/main/java/org/apache/james/mime4j/util/StringArrayMap.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/util/StringArrayMap.java	(working copy)
@@ -22,7 +22,6 @@
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
@@ -35,7 +34,7 @@
  */
 public class StringArrayMap implements Serializable {
     private static final long serialVersionUID = -5833051164281786907L;
-    private final Map map = new HashMap();
+    private final Map<String, Object> map = new HashMap<String, Object>();
 
     /**
      * <p>Converts the given object into a string. The object may be either of:
@@ -56,7 +55,7 @@
             return ((String[]) pValue)[0];
         }
         if (pValue instanceof List) {
-            return (String) ((List) pValue).get(0);
+            return (String) ((List<?>) pValue).get(0);
         }
         throw new IllegalStateException("Invalid parameter class: " + pValue.getClass().getName());
     }
@@ -80,8 +79,8 @@
             return (String[]) pValue;
         }
         if (pValue instanceof List) {
-            final List l = (List) pValue;
-            return (String[]) l.toArray(new String[l.size()]);
+            final List<?> l = (List<?>) pValue;
+            return l.toArray(new String[l.size()]);
         }
         throw new IllegalStateException("Invalid parameter class: " + pValue.getClass().getName());
     }
@@ -94,17 +93,17 @@
      *   <li>an array of strings, which is being converted into a string enumeration</li>
      * </ul>
      */
-    public static Enumeration asStringEnum(final Object pValue) {
+    public static Enumeration<String> asStringEnum(final Object pValue) {
         if (pValue == null) {
             return null;
         }
         if (pValue instanceof String) {
-            return new Enumeration(){
+            return new Enumeration<String>(){
                 private Object value = pValue;
                 public boolean hasMoreElements() {
                     return value != null;
                 }
-                public Object nextElement() {
+                public String nextElement() {
                     if (value == null) {
                         throw new NoSuchElementException();
                     }
@@ -116,12 +115,12 @@
         }
         if (pValue instanceof String[]) {
             final String[] values = (String[]) pValue;
-            return new Enumeration() {
+            return new Enumeration<String>() {
                 private int offset;
                 public boolean hasMoreElements() {
                     return offset < values.length;
                 }
-                public Object nextElement() {
+                public String nextElement() {
                     if (offset >= values.length) {
                         throw new NoSuchElementException();
                     }
@@ -130,7 +129,9 @@
             };
         }
         if (pValue instanceof List) {
-            return Collections.enumeration((List) pValue);
+            @SuppressWarnings("unchecked")
+            final List<String> stringList = (List<String>) pValue; 
+            return Collections.enumeration(stringList);
         }
         throw new IllegalStateException("Invalid parameter class: " + pValue.getClass().getName());
     }
@@ -139,34 +140,36 @@
      * Converts the given map into a string array map: The map values
      * are string arrays.
      */
-    public static Map asMap(final Map pMap) {
-        for (Iterator iter = pMap.entrySet().iterator();  iter.hasNext();  ) {
-            final Map.Entry entry = (Map.Entry) iter.next();
+    public static Map<String, String[]> asMap(final Map<String, Object> pMap) {
+        Map<String, String[]> result = new HashMap<String, String[]>(pMap.size());
+        for (Map.Entry<String, Object> entry : pMap.entrySet()) {
             final String[] value = asStringArray(entry.getValue());
-            entry.setValue(value);
+            result.put(entry.getKey(), value);
         }
-        return Collections.unmodifiableMap(pMap);
+        return Collections.unmodifiableMap(result);
     }
 
     /**
      * Adds a value to the given map.
      */
-    protected void addMapValue(Map pMap, String pName, String pValue) {
+    protected void addMapValue(Map<String, Object> pMap, String pName, String pValue) {
         Object o = pMap.get(pName);
         if (o == null) {
             o = pValue;
         } else if (o instanceof String) {
-            final List list = new ArrayList();
+            final List<Object> list = new ArrayList<Object>();
             list.add(o);
             list.add(pValue);
             o = list;
         } else if (o instanceof List) {
-            ((List) o).add(pValue);
+            @SuppressWarnings("unchecked")
+            final List<String> stringList = (List<String>) o; 
+            stringList.add(pValue);
         } else if (o instanceof String[]) {
-            final List list = new ArrayList();
+            final List<String> list = new ArrayList<String>();
             final String[] arr = (String[]) o;
-            for (int i = 0;  i < arr.length;  i++) {
-                list.add(arr[i]);
+            for (String str : arr) {
+                list.add(str);
             }
             list.add(pValue);
             o = list;
@@ -200,7 +203,7 @@
     /**
      * Returns the requested values as an enumeration.
      */
-    public Enumeration getValueEnum(String pName) {
+    public Enumeration<String> getValueEnum(String pName) {
         return asStringEnum(map.get(convertName(pName)));
     }
 
@@ -208,7 +211,7 @@
      * Returns the set of registered names as an enumeration.
      * @see #getNameArray()
      */
-    public Enumeration getNames() {
+    public Enumeration<String> getNames() {
         return Collections.enumeration(map.keySet());
     }
 
@@ -217,7 +220,7 @@
      * are the lower cased parameter/header names. The map values are
      * string arrays.
      */
-    public Map getMap() {
+    public Map<String, String[]> getMap() {
         return asMap(map);
     }
 
@@ -233,7 +236,7 @@
      * @see #getNames()
      */
     public String[] getNameArray() {
-        final Collection c = map.keySet();
-        return (String[]) c.toArray(new String[c.size()]);
+        final Collection<String> c = map.keySet();
+        return c.toArray(new String[c.size()]);
     }
 }
Index: src/main/java/org/apache/james/mime4j/util/MessageUtils.java
===================================================================
--- src/main/java/org/apache/james/mime4j/util/MessageUtils.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/util/MessageUtils.java	(working copy)
@@ -28,10 +28,6 @@
  * @version $Id:$
  */
 public final class MessageUtils {
- 
-    public static final int STRICT_IGNORE     = 1;
-    public static final int STRICT_ERROR      = 2;
-    public static final int LENIENT           = 3;
     
     public static final Charset ASCII = CharsetUtil.getCharset("US-ASCII");
 
Index: src/main/java/org/apache/james/mime4j/util/MimeUtil.java
===================================================================
--- src/main/java/org/apache/james/mime4j/util/MimeUtil.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/util/MimeUtil.java	(working copy)
@@ -166,7 +166,7 @@
      * @param pValue The field value to parse.
      * @return The result map; use the key "" to retrieve the first value.
      */
-    public static Map getHeaderParams(String pValue) {
+    public static Map<String, String> getHeaderParams(String pValue) {
         pValue = pValue.trim();
         
         /*
@@ -182,7 +182,7 @@
         }
         pValue = sb.toString();
         
-        Map result = new HashMap();
+        Map<String, String> result = new HashMap<String, String>();
 
         // split main value and parameters
         String main;
@@ -211,9 +211,7 @@
 
             byte state = READY_FOR_NAME;
             boolean escaped = false;
-            for (int i = 0; i < chars.length; i++) {
-                char c = chars[i];
-
+            for (char c : chars) {
                 switch (state) {
                     case ERROR:
                         if (c == ';')
@@ -355,7 +353,7 @@
      * @return a new unique message boundary string.
      */
     public static String createUniqueBoundary() {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append("-=Part.");
         sb.append(Integer.toHexString(nextCounterValue()));
         sb.append('.');
@@ -381,7 +379,7 @@
      * @return a new unique message identifier.
      */
     public static String createUniqueMessageId(String hostName) {
-        StringBuffer sb = new StringBuffer("<Mime4j.");
+        StringBuilder sb = new StringBuilder("<Mime4j.");
         sb.append(Integer.toHexString(nextCounterValue()));
         sb.append('.');
         sb.append(Long.toHexString(random.nextLong()));
Index: src/main/java/org/apache/james/mime4j/util/CharArrayBuffer.java
===================================================================
--- src/main/java/org/apache/james/mime4j/util/CharArrayBuffer.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/util/CharArrayBuffer.java	(working copy)
@@ -239,6 +239,7 @@
         return new String(this.buffer, beginIndex, endIndex - beginIndex);
     }
     
+    @Override
     public String toString() {
         return new String(this.buffer, 0, this.len);
     }
Index: src/main/java/org/apache/james/mime4j/util/CharsetUtil.java
===================================================================
--- src/main/java/org/apache/james/mime4j/util/CharsetUtil.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/util/CharsetUtil.java	(working copy)
@@ -23,6 +23,8 @@
 import java.nio.charset.IllegalCharsetNameException;
 import java.nio.charset.UnsupportedCharsetException;
 import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedSet;
 import java.util.TreeSet;
 
 import org.apache.commons.logging.Log;
@@ -791,7 +793,7 @@
 public class CharsetUtil {
     private static Log log = LogFactory.getLog(CharsetUtil.class);
     
-    private static class Charset implements Comparable {
+    private static class Charset implements Comparable<Charset> {
         private String canonical = null;
         private String mime = null;
         private String[] aliases = null;
@@ -802,8 +804,7 @@
             this.aliases = aliases;
         }
 
-        public int compareTo(Object o) {
-            Charset c = (Charset) o;
+        public int compareTo(Charset c) {
             return this.canonical.compareTo(c.canonical);
         }
     }
@@ -1001,49 +1002,48 @@
      * Contains the canonical names of character sets which can be used to 
      * decode bytes into Java chars.
      */
-    private static TreeSet decodingSupported = null;
+    private static SortedSet<String> decodingSupported = null;
     
     /**
      * Contains the canonical names of character sets which can be used to 
      * encode Java chars into bytes.
      */
-    private static TreeSet encodingSupported = null;
+    private static SortedSet<String> encodingSupported = null;
     
     /**
      * Maps character set names to Charset objects. All possible names of
      * a charset will be mapped to the Charset.
      */
-    private static HashMap charsetMap = null;
+    private static Map<String, Charset> charsetMap = null;
     
     static {
-        decodingSupported = new TreeSet();
-        encodingSupported = new TreeSet();
+        decodingSupported = new TreeSet<String>();
+        encodingSupported = new TreeSet<String>();
         byte[] dummy = new byte[] {'d', 'u', 'm', 'm', 'y'};
-        for (int i = 0; i < JAVA_CHARSETS.length; i++) {
+        for (Charset c : JAVA_CHARSETS) {
             try {
-                new String(dummy, JAVA_CHARSETS[i].canonical);
-                decodingSupported.add(JAVA_CHARSETS[i].canonical.toLowerCase());
+                new String(dummy, c.canonical);
+                decodingSupported.add(c.canonical.toLowerCase());
             } catch (UnsupportedOperationException e) {
             } catch (UnsupportedEncodingException e) {
             }
             try {
-                "dummy".getBytes(JAVA_CHARSETS[i].canonical);
-                encodingSupported.add(JAVA_CHARSETS[i].canonical.toLowerCase());
+                "dummy".getBytes(c.canonical);
+                encodingSupported.add(c.canonical.toLowerCase());
             } catch (UnsupportedOperationException e) {
             } catch (UnsupportedEncodingException e) {
             }
         }
         
-        charsetMap = new HashMap();
-        for (int i = 0; i < JAVA_CHARSETS.length; i++) {
-            Charset c = JAVA_CHARSETS[i];
+        charsetMap = new HashMap<String, Charset>();
+        for (Charset c : JAVA_CHARSETS) {
             charsetMap.put(c.canonical.toLowerCase(), c);
             if (c.mime != null) {
                 charsetMap.put(c.mime.toLowerCase(), c);
             }
             if (c.aliases != null) {
-                for (int j = 0; j < c.aliases.length; j++) {
-                    charsetMap.put(c.aliases[j].toLowerCase(), c);
+                for (String str : c.aliases) {
+                    charsetMap.put(str.toLowerCase(), c);
                 }
             }
         }
@@ -1094,7 +1094,7 @@
      * @return the MIME preferred name or <code>null</code> if not known.
      */
     public static String toMimeCharset(String charsetName) {
-        Charset c = (Charset) charsetMap.get(charsetName.toLowerCase());
+        Charset c = charsetMap.get(charsetName.toLowerCase());
         if (c != null) {
             return c.mime;
         }
@@ -1113,7 +1113,7 @@
      * @return the canonical Java name or <code>null</code> if not known.
      */
     public static String toJavaCharset(String charsetName) {
-        Charset c = (Charset) charsetMap.get(charsetName.toLowerCase());
+        Charset c = charsetMap.get(charsetName.toLowerCase());
         if (c != null) {
             return c.canonical;
         }
@@ -1148,7 +1148,7 @@
     private static String dumpHtmlTable() {
         LinkedList l = new LinkedList(Arrays.asList(JAVA_CHARSETS));
         Collections.sort(l);
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append(" * <table>\n");
         sb.append(" *     <tr>\n");
         sb.append(" *         <td>Canonical (Java) name</td>\n");
Index: src/main/java/org/apache/james/mime4j/util/ByteArrayBuffer.java
===================================================================
--- src/main/java/org/apache/james/mime4j/util/ByteArrayBuffer.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/util/ByteArrayBuffer.java	(working copy)
@@ -134,6 +134,7 @@
         return this.len == this.buffer.length; 
     }
 
+    @Override
     public String toString() {
         return new String(toByteArray());
     }
Index: src/main/java/org/apache/james/mime4j/descriptor/DefaultBodyDescriptor.java
===================================================================
--- src/main/java/org/apache/james/mime4j/descriptor/DefaultBodyDescriptor.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/descriptor/DefaultBodyDescriptor.java	(working copy)
@@ -57,7 +57,7 @@
     private String boundary = null;
     private String charset = US_ASCII;
     private String transferEncoding = "7bit";
-    private Map parameters = new HashMap();
+    private Map<String, String> parameters = new HashMap<String, String>();
     private boolean contentTypeSet;
     private boolean contentTransferEncSet;
     private long contentLength = -1;
@@ -120,9 +120,9 @@
     private void parseContentType(String value) {
         contentTypeSet = true;
         
-        Map params = MimeUtil.getHeaderParams(value);
+        Map<String, String> params = MimeUtil.getHeaderParams(value);
         
-        String main = (String) params.get("");
+        String main = params.get("");
         String type = null;
         String subtype = null;
         if (main != null) {
@@ -144,7 +144,7 @@
                 subtype = null;
             }
         }
-        String b = (String) params.get("boundary");
+        String b = params.get("boundary");
         
         if (main != null 
                 && ((main.startsWith("multipart/") && b != null) 
@@ -159,7 +159,7 @@
             boundary = b;
         }
         
-        String c = (String) params.get("charset");
+        String c = params.get("charset");
         charset = null;
         if (c != null) {
             c = c.trim();
@@ -212,7 +212,7 @@
      * 
      * @return parameters
      */
-    public Map getContentTypeParameters() {
+    public Map<String, String> getContentTypeParameters() {
         return parameters;
     }
     
@@ -225,6 +225,7 @@
         return transferEncoding;
     }
     
+    @Override
     public String toString() {
         return mimeType;
     }
Index: src/main/java/org/apache/james/mime4j/descriptor/MaximalBodyDescriptor.java
===================================================================
--- src/main/java/org/apache/james/mime4j/descriptor/MaximalBodyDescriptor.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/descriptor/MaximalBodyDescriptor.java	(working copy)
@@ -51,7 +51,7 @@
     private String contentDescription;
     private boolean isContentDescriptionSet;
     private String contentDispositionType;
-    private Map contentDispositionParameters;
+    private Map<String, String> contentDispositionParameters;
     private DateTime contentDispositionModificationDate;
     private MimeException contentDispositionModificationDateParseException;
     private DateTime contentDispositionCreationDate;
@@ -61,7 +61,7 @@
     private long contentDispositionSize;
     private MimeException contentDispositionSizeParseException;
     private boolean isContentDispositionSet;
-    private List contentLanguage;
+    private List<String> contentLanguage;
     private MimeException contentLanguageParseException;
     private boolean isContentLanguageSet;
     private MimeException contentLocationParseException;
@@ -84,7 +84,7 @@
         this.contentDescription = null;
         this.isContentDescriptionSet = false;
         this.contentDispositionType = null;
-        this.contentDispositionParameters = Collections.EMPTY_MAP;
+        this.contentDispositionParameters = Collections.emptyMap();
         this.contentDispositionModificationDate = null;
         this.contentDispositionModificationDateParseException = null;
         this.contentDispositionCreationDate = null;
@@ -104,6 +104,7 @@
         this.isContentMD5Set = false;
     }
     
+    @Override
     public void addField(String name, String value) {
         name = name.trim().toLowerCase();
         if (MimeUtil.MIME_HEADER_MIME_VERSION.equals(name) && !isMimeVersionSet) {
@@ -151,7 +152,9 @@
         if (value != null) {
             try {
                 final ContentLanguageParser parser = new ContentLanguageParser(new StringReader(value));
-                contentLanguage = parser.parse();
+                @SuppressWarnings("unchecked")
+                final List<String> stringList = (List<String>) parser.parse();
+                contentLanguage = stringList;
             } catch (MimeException e) {
                 contentLanguageParseException = e;
             }
@@ -161,10 +164,10 @@
     private void parseContentDisposition(final String value) {
         isContentDispositionSet = true;
         contentDispositionParameters = MimeUtil.getHeaderParams(value);
-        contentDispositionType = (String) contentDispositionParameters.get("");
+        contentDispositionType = contentDispositionParameters.get("");
         
         final String contentDispositionModificationDate 
-            = (String) contentDispositionParameters.get(MimeUtil.PARAM_MODIFICATION_DATE);
+            = contentDispositionParameters.get(MimeUtil.PARAM_MODIFICATION_DATE);
         if (contentDispositionModificationDate != null) {
             try {
                 this.contentDispositionModificationDate = parseDate(contentDispositionModificationDate);
@@ -174,7 +177,7 @@
         }
         
         final String contentDispositionCreationDate 
-            = (String) contentDispositionParameters.get(MimeUtil.PARAM_CREATION_DATE);
+            = contentDispositionParameters.get(MimeUtil.PARAM_CREATION_DATE);
         if (contentDispositionCreationDate != null) {
             try {
                 this.contentDispositionCreationDate = parseDate(contentDispositionCreationDate);
@@ -184,7 +187,7 @@
         }
         
         final String contentDispositionReadDate 
-            = (String) contentDispositionParameters.get(MimeUtil.PARAM_READ_DATE);
+            = contentDispositionParameters.get(MimeUtil.PARAM_READ_DATE);
         if (contentDispositionReadDate != null) {
             try {
                 this.contentDispositionReadDate = parseDate(contentDispositionReadDate);
@@ -193,7 +196,7 @@
             }         
         }
         
-        final String size = (String) contentDispositionParameters.get(MimeUtil.PARAM_SIZE);
+        final String size = contentDispositionParameters.get(MimeUtil.PARAM_SIZE);
         if (size != null) {
             try {
                 contentDispositionSize = Long.parseLong(size);
@@ -293,7 +296,7 @@
     /**
      * @see org.apache.james.mime4j.descriptor.RFC2183ContentDispositionDescriptor#getContentDispositionParameters()
      */
-    public Map getContentDispositionParameters() {
+    public Map<String, String> getContentDispositionParameters() {
         return contentDispositionParameters;
     }
     
@@ -301,7 +304,7 @@
      * @see org.apache.james.mime4j.descriptor.RFC2183ContentDispositionDescriptor#getContentDispositionFilename()
      */
     public String getContentDispositionFilename() {
-        return (String) contentDispositionParameters.get(MimeUtil.PARAM_FILENAME);
+        return contentDispositionParameters.get(MimeUtil.PARAM_FILENAME);
     }
     
     /**
@@ -363,7 +366,7 @@
     /**
      * @see org.apache.james.mime4j.descriptor.RFC3066ContentLanguageDescriptor#getContentLanguage()
      */
-    public List getContentLanguage() {
+    public List<String> getContentLanguage() {
         return contentLanguage;
     }
 
Index: src/main/java/org/apache/james/mime4j/descriptor/RFC2183ContentDispositionDescriptor.java
===================================================================
--- src/main/java/org/apache/james/mime4j/descriptor/RFC2183ContentDispositionDescriptor.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/descriptor/RFC2183ContentDispositionDescriptor.java	(working copy)
@@ -44,7 +44,7 @@
      * @return parameter value strings indexed by parameter name strings,
      * not null
      */
-    public abstract Map getContentDispositionParameters();
+    public abstract Map<String, String> getContentDispositionParameters();
 
     /**
      * Gets the <code>filename</code> parameter value of the <code>content-disposition</code> field.
Index: src/main/java/org/apache/james/mime4j/descriptor/RFC3066ContentLanguageDescriptor.java
===================================================================
--- src/main/java/org/apache/james/mime4j/descriptor/RFC3066ContentLanguageDescriptor.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/descriptor/RFC3066ContentLanguageDescriptor.java	(working copy)
@@ -35,7 +35,7 @@
      * @return list of language tag Strings,
      * or null if no header exists
      */
-    public abstract List getContentLanguage();
+    public abstract List<String> getContentLanguage();
 
     /**
      * Gets any exception thrown during the parsing of {@link #getContentLanguage()}
Index: src/main/java/org/apache/james/mime4j/descriptor/ContentDescriptor.java
===================================================================
--- src/main/java/org/apache/james/mime4j/descriptor/ContentDescriptor.java	(revision 713501)
+++ src/main/java/org/apache/james/mime4j/descriptor/ContentDescriptor.java	(working copy)
@@ -78,7 +78,7 @@
     /**
      * Returns the map of parameters of the content-type header.
      */
-    Map getContentTypeParameters();
+    Map<String, String> getContentTypeParameters();
 
     /**
      * Returns the body descriptors content-length.
Index: pom.xml
===================================================================
--- pom.xml	(revision 713501)
+++ pom.xml	(working copy)
@@ -89,8 +89,8 @@
         <artifactId>maven-compiler-plugin</artifactId>
         <version>2.0.2</version>
         <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
+          <source>1.5</source>
+          <target>1.5</target>
           <encoding>iso8859-1</encoding>
         </configuration>
       </plugin>      
@@ -205,6 +205,21 @@
           </execution>
         </executions>
       </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>retrotranslator-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>translate-project</goal>
+            </goals>
+            <configuration>
+              <classifier>jdk14</classifier>
+              <attach>true</attach>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
     </plugins>
   </build>
   <repositories>
Index: examples/src/java/org/apache/james/mime4j/samples/tree/MessageTree.java
===================================================================
--- examples/src/java/org/apache/james/mime4j/samples/tree/MessageTree.java	(revision 713501)
+++ examples/src/java/org/apache/james/mime4j/samples/tree/MessageTree.java	(working copy)
@@ -27,7 +27,6 @@
 import java.io.InputStream;
 import java.io.Reader;
 import java.util.Date;
-import java.util.Iterator;
 import java.util.Map;
 
 import javax.swing.JFrame;
@@ -146,8 +145,7 @@
         DefaultMutableTreeNode node = new DefaultMutableTreeNode(
                 new ObjectWrapper("Header", header));
 
-        for (Iterator it = header.getFields().iterator(); it.hasNext();) {
-            Field field = (Field) it.next();
+        for (Field field : header.getFields()) {
             String name = field.getName();
             
             node.add(new DefaultMutableTreeNode(new ObjectWrapper(name, field)));
@@ -169,8 +167,7 @@
 
         node.add(new DefaultMutableTreeNode(
                        new ObjectWrapper("Preamble", multipart.getPreamble())));
-        for (Iterator it = multipart.getBodyParts().iterator(); it.hasNext();) {
-            BodyPart part = (BodyPart) it.next();
+        for (BodyPart part : multipart.getBodyParts()) {
             node.add(createNode(part));
         }
         node.add(new DefaultMutableTreeNode(
@@ -262,7 +259,7 @@
                  * A text body. Display its contents.
                  */
                 TextBody body = (TextBody) o;
-                StringBuffer sb = new StringBuffer();
+                StringBuilder sb = new StringBuilder();
                 try {
                     Reader r = body.getReader();
                     int c;
@@ -298,11 +295,10 @@
                  * Content-Type field.
                  */
                 ContentTypeField field = (ContentTypeField) o;
-                StringBuffer sb = new StringBuffer();
+                StringBuilder sb = new StringBuilder();
                 sb.append("MIME type: " + field.getMimeType() + "\n");
-                Map params = field.getParameters();
-                for (Iterator it = params.keySet().iterator(); it.hasNext();) {
-                    String name = (String) it.next();
+                Map<String, String> params = field.getParameters();
+                for (String name : params.keySet()) {
                     sb.append(name + " = " + params.get(name) + "\n");
                 }
                 textView.setText(sb.toString());
@@ -313,7 +309,7 @@
                  */
                 AddressListField field = (AddressListField) o;
                 MailboxList list = field.getAddressList().flatten();
-                StringBuffer sb = new StringBuffer();
+                StringBuilder sb = new StringBuilder();
                 for (int i = 0; i < list.size(); i++) {
                     Mailbox mb = list.get(i);
                     sb.append(mb.getAddressString() + "\n");
