diff --git a/pom.xml b/pom.xml
index cae62a6..c3abd6b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,7 +30,7 @@
   <groupId>org.apache.james</groupId>
   <artifactId>apache-mime4j</artifactId>
   <name>Apache JAMES Mime4j</name>
-  <version>0.5-SNAPSHOT</version>
+  <version>0.5</version>
   <description>Java stream based MIME message parser</description>
   <url>http://james.apache.org/mime4j</url>
   <issueManagement>
@@ -44,9 +44,9 @@
     </site>
   </distributionManagement>
   <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/james/mime4j/trunk</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/james/mime4j/trunk</developerConnection>
-    <url>http://svn.apache.org/viewvc/james/mime4j/trunk/</url>
+    <connection>scm:svn:http://svn.apache.org/repos/asf/james/mime4j/tags/apache-mime4j-0.5</connection>
+    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/james/mime4j/tags/apache-mime4j-0.5</developerConnection>
+    <url>http://svn.apache.org/viewvc/james/mime4j/tags/apache-mime4j-0.5</url>
   </scm>
   <build>
     <plugins>
diff --git a/src/main/java/org/apache/james/mime4j/decoder/LineBreakingOutputStream.java b/src/main/java/org/apache/james/mime4j/decoder/LineBreakingOutputStream.java
index 2d5c06f..62ef8f7 100644
--- a/src/main/java/org/apache/james/mime4j/decoder/LineBreakingOutputStream.java
+++ b/src/main/java/org/apache/james/mime4j/decoder/LineBreakingOutputStream.java
@@ -29,6 +29,8 @@
  * Default to 76 bytes lines.
  * Please note that this does not check for existing newlines and
  * simply adds CRLF every 76 bytes. 
+ * 
+ * @deprecated This class will be removed in 0.6 release
  */
 public class LineBreakingOutputStream extends FilterOutputStream {
 
diff --git a/src/main/java/org/apache/james/mime4j/io/CloseShieldInputStream.java b/src/main/java/org/apache/james/mime4j/io/CloseShieldInputStream.java
index 1892518..e7ad170 100644
--- a/src/main/java/org/apache/james/mime4j/io/CloseShieldInputStream.java
+++ b/src/main/java/org/apache/james/mime4j/io/CloseShieldInputStream.java
@@ -26,6 +26,8 @@
 /**
  * InputStream that shields its underlying input stream from
  * being closed.
+ * 
+ * @deprecated This class will be removed in 0.6 release
  */
 public class CloseShieldInputStream extends FilterInputStream {
 
diff --git a/src/main/java/org/apache/james/mime4j/io/PartialInputStream.java b/src/main/java/org/apache/james/mime4j/io/PartialInputStream.java
index fe6bc60..93b07d1 100644
--- a/src/main/java/org/apache/james/mime4j/io/PartialInputStream.java
+++ b/src/main/java/org/apache/james/mime4j/io/PartialInputStream.java
@@ -23,6 +23,9 @@
 import java.io.InputStream;
 import java.io.IOException;
 
+/**
+ * @deprecated This class will be removed in 0.6 release
+ */
 public class PartialInputStream extends PositionInputStream {
     private final long limit;
 
diff --git a/src/main/java/org/apache/james/mime4j/message/AbstractBody.java b/src/main/java/org/apache/james/mime4j/message/AbstractBody.java
index 1dd39bc..4512483 100644
--- a/src/main/java/org/apache/james/mime4j/message/AbstractBody.java
+++ b/src/main/java/org/apache/james/mime4j/message/AbstractBody.java
@@ -1,80 +1,59 @@
-/****************************************************************
- * 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;
-
-
-/**
- * Abstract <code>Body</code> implementation providing the parent
- * functionality required by bodies.
- *
- * 
- * @version $Id: AbstractBody.java,v 1.2 2004/10/02 12:41:11 ntherning Exp $
- */
-public abstract class AbstractBody implements Body {
-    private Entity parent = null;
-    protected boolean disposed = false;
-    
-    /**
-     * @see org.apache.james.mime4j.message.Body#getParent()
-     */
-    public Entity getParent() {
-        return parent;
-    }
-    
-    /**
-     * @see org.apache.james.mime4j.message.Body#setParent(org.apache.james.mime4j.message.Entity)
-     */
-    public void setParent(Entity parent) {
-        if (disposed)
-            throw new IllegalStateException("AbstractBody has been disposed");
-
-        this.parent = parent;
-    }
-
-    /**
-     * Subclasses should override this method if they have allocated resources
-     * that need to be freed explicitly (e.g. cannot be simply reclaimed by the
-     * garbage collector). Subclasses that override this method should invoke
-     * super.dispose().
-     * 
-     * The default implementation marks this AbstractBody as disposed.
-     * 
-     * @see org.apache.james.mime4j.message.Disposable#dispose()
-     */
-    public void dispose() {
-        if (disposed)
-            return;
-
-        disposed = true;
-
-        parent = null;
-    }
-
-    /**
-     * Ensures that the <code>dispose</code> method of this abstract body is
-     * called when there are no more references to it.
-     *
-     * Leave them out ATM (https://issues.apache.org/jira/browse/MIME4J-72?focusedCommentId=12636007#action_12636007)
-    protected void finalize() throws Throwable {
-        dispose();
-    }
-     */
-
-}
+/****************************************************************
+ * 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;
+
+
+/**
+ * Abstract <code>Body</code> implementation providing the parent
+ * functionality required by bodies.
+ *
+ * 
+ * @version $Id: AbstractBody.java,v 1.2 2004/10/02 12:41:11 ntherning Exp $
+ */
+public abstract class AbstractBody implements Body {
+    private Entity parent = null;
+    
+    /**
+     * @see org.apache.james.mime4j.message.Body#getParent()
+     */
+    public Entity getParent() {
+        return parent;
+    }
+    
+    /**
+     * @see org.apache.james.mime4j.message.Body#setParent(org.apache.james.mime4j.message.Entity)
+     */
+    public void setParent(Entity parent) {
+        this.parent = parent;
+    }
+
+    /**
+     * Subclasses should override this method if they have allocated resources
+     * that need to be freed explicitly (e.g. cannot be simply reclaimed by the
+     * garbage collector).
+     * 
+     * The default implementation of this method does nothing.
+     * 
+     * @see org.apache.james.mime4j.message.Disposable#dispose()
+     */
+    public void dispose() {
+    }
+
+}
diff --git a/src/main/java/org/apache/james/mime4j/message/Disposable.java b/src/main/java/org/apache/james/mime4j/message/Disposable.java
index b580af1..00b2262 100644
--- a/src/main/java/org/apache/james/mime4j/message/Disposable.java
+++ b/src/main/java/org/apache/james/mime4j/message/Disposable.java
@@ -27,5 +27,10 @@
  * holding (such as open files). 
  */
 public interface Disposable {
+    /**
+     * Free any resources this object is holding and prepares this object
+     * for garbage collection. Once an object has been disposed it can no
+     * longer be used.
+     */
     void dispose();
 }
diff --git a/src/main/java/org/apache/james/mime4j/message/Entity.java b/src/main/java/org/apache/james/mime4j/message/Entity.java
index bda38f7..2a71b0f 100644
--- a/src/main/java/org/apache/james/mime4j/message/Entity.java
+++ b/src/main/java/org/apache/james/mime4j/message/Entity.java
@@ -1,246 +1,213 @@
-/****************************************************************
- * 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;
-
-import org.apache.james.mime4j.MimeException;
-import org.apache.james.mime4j.decoder.CodecUtil;
-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;
-import java.io.OutputStream;
-
-/**
- * MIME entity. An entity has a header and a body (see RFC 2045).
- *
- * 
- * @version $Id: Entity.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $
- */
-public abstract class Entity implements Disposable {
-    private Header header = null;
-    private Body body = null;
-    private Entity parent = null;
-    private boolean disposed = false;
-
-    /**
-     * Gets the parent entity of this entity.
-     * Returns <code>null</code> if this is the root entity.
-     * 
-     * @return the parent or <code>null</code>.
-     */
-    public Entity getParent() {
-        return parent;
-    }
-    
-    /**
-     * Sets the parent entity of this entity.
-     * 
-     * @param parent the parent entity or <code>null</code> if
-     *        this will be the root entity.
-     */
-    public void setParent(Entity parent) {
-        if (disposed)
-            throw new IllegalStateException("Entity has been disposed");
-
-        this.parent = parent;
-    }
-    
-    /**
-     * Gets the entity header.
-     * 
-     * @return the header.
-     */
-    public Header getHeader() {
-        return header;
-    }
-    
-    /**
-     * Sets the entity header.
-     * 
-     * @param header the header.
-     */
-    public void setHeader(Header header) {
-        if (disposed)
-            throw new IllegalStateException("Entity has been disposed");
-
-        this.header = header;
-    }
-    
-    /**
-     * Gets the body of this entity.
-     * 
-     * @return the body,
-     */
-    public Body getBody() {
-        return body;
-    }
-
-    /**
-     * Sets the body of this entity.
-     * 
-     * @param body the body.
-     */
-    public void setBody(Body body) {
-        if (disposed)
-            throw new IllegalStateException("Entity has been disposed");
-
-        this.body = body;
-        body.setParent(this);
-    }
-    
-    /**
-     * Determines the MIME type of this <code>Entity</code>. The MIME type
-     * is derived by looking at the parent's Content-Type field if no
-     * Content-Type field is set for this <code>Entity</code>.
-     * 
-     * @return the MIME type.
-     */
-    public String getMimeType() {
-        ContentTypeField child = 
-            (ContentTypeField) getHeader().getField(Field.CONTENT_TYPE);
-        ContentTypeField parent = getParent() != null 
-            ? (ContentTypeField) getParent().getHeader().
-                                                getField(Field.CONTENT_TYPE)
-            : null;
-        
-        return ContentTypeField.getMimeType(child, parent);
-    }
-    
-    /**
-     * Determines the MIME character set encoding of this <code>Entity</code>.
-     * 
-     * @return the MIME character set encoding.
-     */
-    public String getCharset() {
-        return ContentTypeField.getCharset( 
-            (ContentTypeField) getHeader().getField(Field.CONTENT_TYPE));
-    }
-    
-    /**
-     * Determines the transfer encoding of this <code>Entity</code>.
-     * 
-     * @return the transfer encoding.
-     */
-    public String getContentTransferEncoding() {
-        ContentTransferEncodingField f = (ContentTransferEncodingField) 
-                        getHeader().getField(Field.CONTENT_TRANSFER_ENCODING);
-        
-        return ContentTransferEncodingField.getEncoding(f);
-    }
-    
-    /**
-     * Determines if the MIME type of this <code>Entity</code> matches the
-     * given one. MIME types are case-insensitive.
-     * 
-     * @param type the MIME type to match against.
-     * @return <code>true</code> on match, <code>false</code> otherwise.
-     */
-    public boolean isMimeType(String type) {
-        return getMimeType().equalsIgnoreCase(type);
-    }
-    
-    /**
-     * Determines if the MIME type of this <code>Entity</code> is
-     * <code>multipart/*</code>. Since multipart-entities must have
-     * a boundary parameter in the <code>Content-Type</code> field this
-     * method returns <code>false</code> if no boundary exists.
-     * 
-     * @return <code>true</code> on match, <code>false</code> otherwise.
-     */
-    public boolean isMultipart() {
-        ContentTypeField f = 
-            (ContentTypeField) getHeader().getField(Field.CONTENT_TYPE);
-        return f != null && f.getBoundary() != null 
-            && getMimeType().startsWith(ContentTypeField.TYPE_MULTIPART_PREFIX);
-    }
-    
-    /**
-     * 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}  
-     * @throws IOException 
-     */
-    public void writeTo(OutputStream out, int mode) throws IOException, MimeException {
-        if (disposed)
-            throw new IllegalStateException("Entity has been disposed");
-
-        getHeader().writeTo(out, mode);
-        
-        out.flush();
-        
-        final Body body = getBody();
-
-        OutputStream encOut;
-        if (MimeUtil.ENC_BASE64.equals(getContentTransferEncoding())) {
-            encOut = CodecUtil.wrapBase64(out);
-        } else if (MimeUtil.ENC_QUOTED_PRINTABLE.equals(getContentTransferEncoding())) {
-            encOut = CodecUtil.wrapQuotedPrintable(out, (body instanceof BinaryBody));
-        } else {
-            encOut = out;
-        }
-        body.writeTo(encOut, mode);
-        encOut.flush();
-        // the Base64 output streams requires closing of the stream but
-        // we don't want it to close the inner stream so we override the behaviour
-        // for the wrapping stream writer.
-        if (encOut != out) encOut.close();
-    }
-
-    /**
-     * Disposes the body of this entity. Note that the dispose call does not get
-     * forwarded to the parent entity of this Entity.
-     * 
-     * Subclasses that need to free resources should override this method and
-     * invoke super.dispose().
-     * 
-     * @see org.apache.james.mime4j.message.Disposable#dispose()
-     */
-    public void dispose() {
-        if (disposed)
-            return;
-
-        try {
-            if (body != null)
-                body.dispose();
-        } finally {
-            disposed = true;
-
-            header = null;
-            body = null;
-            parent = null;
-        }
-    }
-
-    /**
-     * Ensures that the <code>dispose</code> method of this entity is called
-     * when there are no more references to it.
-     *
-     * Leave them out ATM (https://issues.apache.org/jira/browse/MIME4J-72?focusedCommentId=12636007#action_12636007)
-    protected void finalize() throws Throwable {
-        dispose();
-    }
-     */
-
-}
+/****************************************************************
+ * 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;
+
+import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.decoder.CodecUtil;
+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;
+import java.io.OutputStream;
+
+/**
+ * MIME entity. An entity has a header and a body (see RFC 2045).
+ *
+ * 
+ * @version $Id: Entity.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $
+ */
+public abstract class Entity implements Disposable {
+    private Header header = null;
+    private Body body = null;
+    private Entity parent = null;
+
+    /**
+     * Gets the parent entity of this entity.
+     * Returns <code>null</code> if this is the root entity.
+     * 
+     * @return the parent or <code>null</code>.
+     */
+    public Entity getParent() {
+        return parent;
+    }
+    
+    /**
+     * Sets the parent entity of this entity.
+     * 
+     * @param parent the parent entity or <code>null</code> if
+     *        this will be the root entity.
+     */
+    public void setParent(Entity parent) {
+        this.parent = parent;
+    }
+    
+    /**
+     * Gets the entity header.
+     * 
+     * @return the header.
+     */
+    public Header getHeader() {
+        return header;
+    }
+    
+    /**
+     * Sets the entity header.
+     * 
+     * @param header the header.
+     */
+    public void setHeader(Header header) {
+        this.header = header;
+    }
+    
+    /**
+     * Gets the body of this entity.
+     * 
+     * @return the body,
+     */
+    public Body getBody() {
+        return body;
+    }
+
+    /**
+     * Sets the body of this entity.
+     * 
+     * @param body the body.
+     */
+    public void setBody(Body body) {
+        this.body = body;
+        body.setParent(this);
+    }
+    
+    /**
+     * Determines the MIME type of this <code>Entity</code>. The MIME type
+     * is derived by looking at the parent's Content-Type field if no
+     * Content-Type field is set for this <code>Entity</code>.
+     * 
+     * @return the MIME type.
+     */
+    public String getMimeType() {
+        ContentTypeField child = 
+            (ContentTypeField) getHeader().getField(Field.CONTENT_TYPE);
+        ContentTypeField parent = getParent() != null 
+            ? (ContentTypeField) getParent().getHeader().
+                                                getField(Field.CONTENT_TYPE)
+            : null;
+        
+        return ContentTypeField.getMimeType(child, parent);
+    }
+    
+    /**
+     * Determines the MIME character set encoding of this <code>Entity</code>.
+     * 
+     * @return the MIME character set encoding.
+     */
+    public String getCharset() {
+        return ContentTypeField.getCharset( 
+            (ContentTypeField) getHeader().getField(Field.CONTENT_TYPE));
+    }
+    
+    /**
+     * Determines the transfer encoding of this <code>Entity</code>.
+     * 
+     * @return the transfer encoding.
+     */
+    public String getContentTransferEncoding() {
+        ContentTransferEncodingField f = (ContentTransferEncodingField) 
+                        getHeader().getField(Field.CONTENT_TRANSFER_ENCODING);
+        
+        return ContentTransferEncodingField.getEncoding(f);
+    }
+    
+    /**
+     * Determines if the MIME type of this <code>Entity</code> matches the
+     * given one. MIME types are case-insensitive.
+     * 
+     * @param type the MIME type to match against.
+     * @return <code>true</code> on match, <code>false</code> otherwise.
+     */
+    public boolean isMimeType(String type) {
+        return getMimeType().equalsIgnoreCase(type);
+    }
+    
+    /**
+     * Determines if the MIME type of this <code>Entity</code> is
+     * <code>multipart/*</code>. Since multipart-entities must have
+     * a boundary parameter in the <code>Content-Type</code> field this
+     * method returns <code>false</code> if no boundary exists.
+     * 
+     * @return <code>true</code> on match, <code>false</code> otherwise.
+     */
+    public boolean isMultipart() {
+        ContentTypeField f = 
+            (ContentTypeField) getHeader().getField(Field.CONTENT_TYPE);
+        return f != null && f.getBoundary() != null 
+            && getMimeType().startsWith(ContentTypeField.TYPE_MULTIPART_PREFIX);
+    }
+    
+    /**
+     * 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}  
+     * @throws IOException 
+     */
+    public void writeTo(OutputStream out, int mode) throws IOException, MimeException {
+        getHeader().writeTo(out, mode);
+        
+        out.flush();
+        
+        final Body body = getBody();
+
+        OutputStream encOut;
+        if (MimeUtil.ENC_BASE64.equals(getContentTransferEncoding())) {
+            encOut = CodecUtil.wrapBase64(out);
+        } else if (MimeUtil.ENC_QUOTED_PRINTABLE.equals(getContentTransferEncoding())) {
+            encOut = CodecUtil.wrapQuotedPrintable(out, (body instanceof BinaryBody));
+        } else {
+            encOut = out;
+        }
+        body.writeTo(encOut, mode);
+        encOut.flush();
+        // the Base64 output streams requires closing of the stream but
+        // we don't want it to close the inner stream so we override the behaviour
+        // for the wrapping stream writer.
+        if (encOut != out) encOut.close();
+    }
+
+    /**
+     * Disposes the body of this entity. Note that the dispose call does not get
+     * forwarded to the parent entity of this Entity.
+     * 
+     * Subclasses that need to free resources should override this method and
+     * invoke super.dispose().
+     * 
+     * @see org.apache.james.mime4j.message.Disposable#dispose()
+     */
+    public void dispose() {
+        if (body != null) {
+            body.dispose();
+        }
+    }
+
+}
diff --git a/src/main/java/org/apache/james/mime4j/message/Multipart.java b/src/main/java/org/apache/james/mime4j/message/Multipart.java
index 4a7d2ef..3a1150f 100644
--- a/src/main/java/org/apache/james/mime4j/message/Multipart.java
+++ b/src/main/java/org/apache/james/mime4j/message/Multipart.java
@@ -1,281 +1,237 @@
-/****************************************************************
- * 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;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.OutputStream;
-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;
-
-import org.apache.james.mime4j.MimeException;
-import org.apache.james.mime4j.field.ContentTypeField;
-import org.apache.james.mime4j.field.Field;
-import org.apache.james.mime4j.util.CharsetUtil;
-import org.apache.james.mime4j.util.MessageUtils;
-
-/**
- * Represents a MIME multipart body (see RFC 2045).A multipart body has a 
- * ordered list of body parts. The multipart body also has a preamble and
- * epilogue. The preamble consists of whatever characters appear before the 
- * first body part while the epilogue consists of whatever characters come
- * after the last body part.
- *
- * 
- * @version $Id: Multipart.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $
- */
-public class Multipart implements Body {
-    private String preamble = "";
-    private String epilogue = "";
-    private List bodyParts = new LinkedList();
-    private Entity parent = null;
-    private String subType;
-    private boolean disposed = false;
-
-    /**
-     * Creates a new empty <code>Multipart</code> instance.
-     */
-    public Multipart(String subType) {
-        this.subType = subType;
-    }
-
-    /**
-     * Gets the multipart sub-type. E.g. <code>alternative</code> (the default)
-     * or <code>parallel</code>. See RFC 2045 for common sub-types and their
-     * meaning.
-     * 
-     * @return the multipart sub-type.
-     */
-    public String getSubType() {
-        return subType;
-    }
-    
-    /**
-     * Sets the multipart sub-type. E.g. <code>alternative</code>
-     * or <code>parallel</code>. See RFC 2045 for common sub-types and their
-     * meaning.
-     * 
-     * @param subType the sub-type.
-     */
-    public void setSubType(String subType) {
-        if (disposed)
-            throw new IllegalStateException("Multipart has been disposed");
-
-        this.subType = subType;
-    }
-    
-    /**
-     * @see org.apache.james.mime4j.message.Body#getParent()
-     */
-    public Entity getParent() {
-        return parent;
-    }
-    
-    /**
-     * @see org.apache.james.mime4j.message.Body#setParent(org.apache.james.mime4j.message.Entity)
-     */
-    public void setParent(Entity parent) {
-        if (disposed)
-            throw new IllegalStateException("Multipart has been disposed");
-
-        this.parent = parent;
-        for (Iterator it = bodyParts.iterator(); it.hasNext();) {
-            ((BodyPart) it.next()).setParent(parent);
-        }
-    }
-
-    /**
-     * Gets the epilogue.
-     * 
-     * @return the epilogue.
-     */
-    public String getEpilogue() {
-        return epilogue;
-    }
-    
-    /**
-     * Sets the epilogue.
-     * 
-     * @param epilogue the epilogue.
-     */
-    public void setEpilogue(String epilogue) {
-        if (disposed)
-            throw new IllegalStateException("Multipart has been disposed");
-
-        this.epilogue = epilogue;
-    }
-    
-    /**
-     * Gets the list of body parts. The list is immutable.
-     * 
-     * @return the list of <code>BodyPart</code> objects.
-     */
-    public List getBodyParts() {
-        return Collections.unmodifiableList(bodyParts);
-    }
-    
-    /**
-     * Sets the list of body parts.
-     * 
-     * @param bodyParts the new list of <code>BodyPart</code> objects.
-     */
-    public void setBodyParts(List bodyParts) {
-        if (disposed)
-            throw new IllegalStateException("Multipart has been disposed");
-
-        this.bodyParts = bodyParts;
-        for (Iterator it = bodyParts.iterator(); it.hasNext();) {
-            ((BodyPart) it.next()).setParent(parent);
-        }
-    }
-    
-    /**
-     * Adds a body part to the end of the list of body parts.
-     * 
-     * @param bodyPart the body part.
-     */
-    public void addBodyPart(BodyPart bodyPart) {
-        if (disposed)
-            throw new IllegalStateException("Multipart has been disposed");
-
-        bodyParts.add(bodyPart);
-        bodyPart.setParent(parent);
-    }
-    
-    /**
-     * Gets the preamble.
-     * 
-     * @return the preamble.
-     */
-    public String getPreamble() {
-        return preamble;
-    }
-    
-    /**
-     * Sets the preamble.
-     * 
-     * @param preamble the preamble.
-     */
-    public void setPreamble(String preamble) {
-        if (disposed)
-            throw new IllegalStateException("Multipart has been disposed");
-
-        this.preamble = preamble;
-    }
-
-    /**
-     * Write the Multipart to the given OutputStream. 
-     * 
-     * @param out the OutputStream to write to
-     * @param mode compatibility mode
-     * 
-     * @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 {
-        if (disposed)
-            throw new IllegalStateException("Multipart has been disposed");
-
-        Entity e = getParent();
-        
-        ContentTypeField cField = (ContentTypeField) e.getHeader().getField(
-                Field.CONTENT_TYPE);
-        if (cField == null || cField.getBoundary() == null) {
-            throw new MimeException("Multipart boundary not specified");
-        }
-        String boundary = cField.getBoundary();
-
-        Charset charset = null;
-        if (mode == MessageUtils.LENIENT) {
-            if (cField != null && cField.getCharset() != null) {
-                charset = CharsetUtil.getCharset(cField.getCharset());
-            } else {
-                charset = MessageUtils.ISO_8859_1;
-            }
-        } else {
-            charset = MessageUtils.DEFAULT_CHARSET;
-        }
-        
-        BufferedWriter writer = new BufferedWriter(
-                new OutputStreamWriter(out, charset), 8192);
-        
-        List bodyParts = getBodyParts();
-
-        writer.write(getPreamble());
-        writer.write(MessageUtils.CRLF);
-
-        for (int i = 0; i < bodyParts.size(); i++) {
-            writer.write("--");
-            writer.write(boundary);
-            writer.write(MessageUtils.CRLF);
-            writer.flush();
-            final BodyPart bodyPart = (BodyPart) bodyParts.get(i);
-            bodyPart.writeTo(out, mode);
-            writer.write(MessageUtils.CRLF);
-        }
-
-        writer.write("--");
-        writer.write(boundary);
-        writer.write("--");
-        writer.write(MessageUtils.CRLF);
-        final String epilogue = getEpilogue();
-        writer.write(epilogue);
-        writer.flush();
-    }
-
-    /**
-     * Disposes the BodyParts of this Multipart. Note that the dispose call does
-     * not get forwarded to the parent entity of this Multipart.
-     * 
-     * @see org.apache.james.mime4j.message.Disposable#dispose()
-     */
-    public void dispose() {
-        if (disposed)
-            return;
-
-        try {
-            for (Iterator it = bodyParts.iterator(); it.hasNext();) {
-                ((BodyPart) it.next()).dispose();
-            }
-        } finally {
-            disposed = true;
-
-            preamble = null;
-            epilogue = null;
-            bodyParts = null;
-            parent = null;
-            subType = null;
-        }
-    }
-
-    /**
-     * Ensures that the <code>dispose</code> method of this multipart is
-     * called when there are no more references to it.
-     *
-     * Leave them out ATM (https://issues.apache.org/jira/browse/MIME4J-72?focusedCommentId=12636007#action_12636007)
-    protected void finalize() throws Throwable {
-        dispose();
-    }
-     */
-}
+/****************************************************************
+ * 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;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+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;
+
+import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.field.ContentTypeField;
+import org.apache.james.mime4j.field.Field;
+import org.apache.james.mime4j.util.CharsetUtil;
+import org.apache.james.mime4j.util.MessageUtils;
+
+/**
+ * Represents a MIME multipart body (see RFC 2045).A multipart body has a 
+ * ordered list of body parts. The multipart body also has a preamble and
+ * epilogue. The preamble consists of whatever characters appear before the 
+ * first body part while the epilogue consists of whatever characters come
+ * after the last body part.
+ *
+ * 
+ * @version $Id: Multipart.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $
+ */
+public class Multipart implements Body {
+    private String preamble = "";
+    private String epilogue = "";
+    private List bodyParts = new LinkedList();
+    private Entity parent = null;
+    private String subType;
+
+    /**
+     * Creates a new empty <code>Multipart</code> instance.
+     */
+    public Multipart(String subType) {
+        this.subType = subType;
+    }
+
+    /**
+     * Gets the multipart sub-type. E.g. <code>alternative</code> (the default)
+     * or <code>parallel</code>. See RFC 2045 for common sub-types and their
+     * meaning.
+     * 
+     * @return the multipart sub-type.
+     */
+    public String getSubType() {
+        return subType;
+    }
+    
+    /**
+     * Sets the multipart sub-type. E.g. <code>alternative</code>
+     * or <code>parallel</code>. See RFC 2045 for common sub-types and their
+     * meaning.
+     * 
+     * @param subType the sub-type.
+     */
+    public void setSubType(String subType) {
+        this.subType = subType;
+    }
+    
+    /**
+     * @see org.apache.james.mime4j.message.Body#getParent()
+     */
+    public Entity getParent() {
+        return parent;
+    }
+    
+    /**
+     * @see org.apache.james.mime4j.message.Body#setParent(org.apache.james.mime4j.message.Entity)
+     */
+    public void setParent(Entity parent) {
+        this.parent = parent;
+        for (Iterator it = bodyParts.iterator(); it.hasNext();) {
+            ((BodyPart) it.next()).setParent(parent);
+        }
+    }
+
+    /**
+     * Gets the epilogue.
+     * 
+     * @return the epilogue.
+     */
+    public String getEpilogue() {
+        return epilogue;
+    }
+    
+    /**
+     * Sets the epilogue.
+     * 
+     * @param epilogue the epilogue.
+     */
+    public void setEpilogue(String epilogue) {
+        this.epilogue = epilogue;
+    }
+    
+    /**
+     * Gets the list of body parts. The list is immutable.
+     * 
+     * @return the list of <code>BodyPart</code> objects.
+     */
+    public List getBodyParts() {
+        return Collections.unmodifiableList(bodyParts);
+    }
+    
+    /**
+     * Sets the list of body parts.
+     * 
+     * @param bodyParts the new list of <code>BodyPart</code> objects.
+     */
+    public void setBodyParts(List bodyParts) {
+        this.bodyParts = bodyParts;
+        for (Iterator it = bodyParts.iterator(); it.hasNext();) {
+            ((BodyPart) it.next()).setParent(parent);
+        }
+    }
+    
+    /**
+     * Adds a body part to the end of the list of body parts.
+     * 
+     * @param bodyPart the body part.
+     */
+    public void addBodyPart(BodyPart bodyPart) {
+        bodyParts.add(bodyPart);
+        bodyPart.setParent(parent);
+    }
+    
+    /**
+     * Gets the preamble.
+     * 
+     * @return the preamble.
+     */
+    public String getPreamble() {
+        return preamble;
+    }
+    
+    /**
+     * Sets the preamble.
+     * 
+     * @param preamble the preamble.
+     */
+    public void setPreamble(String preamble) {
+        this.preamble = preamble;
+    }
+
+    /**
+     * Write the Multipart to the given OutputStream. 
+     * 
+     * @param out the OutputStream to write to
+     * @param mode compatibility mode
+     * 
+     * @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 {
+        Entity e = getParent();
+        
+        ContentTypeField cField = (ContentTypeField) e.getHeader().getField(
+                Field.CONTENT_TYPE);
+        if (cField == null || cField.getBoundary() == null) {
+            throw new MimeException("Multipart boundary not specified");
+        }
+        String boundary = cField.getBoundary();
+
+        Charset charset = null;
+        if (mode == MessageUtils.LENIENT) {
+            if (cField != null && cField.getCharset() != null) {
+                charset = CharsetUtil.getCharset(cField.getCharset());
+            } else {
+                charset = MessageUtils.ISO_8859_1;
+            }
+        } else {
+            charset = MessageUtils.DEFAULT_CHARSET;
+        }
+        
+        BufferedWriter writer = new BufferedWriter(
+                new OutputStreamWriter(out, charset), 8192);
+        
+        List bodyParts = getBodyParts();
+
+        writer.write(getPreamble());
+        writer.write(MessageUtils.CRLF);
+
+        for (int i = 0; i < bodyParts.size(); i++) {
+            writer.write("--");
+            writer.write(boundary);
+            writer.write(MessageUtils.CRLF);
+            writer.flush();
+            final BodyPart bodyPart = (BodyPart) bodyParts.get(i);
+            bodyPart.writeTo(out, mode);
+            writer.write(MessageUtils.CRLF);
+        }
+
+        writer.write("--");
+        writer.write(boundary);
+        writer.write("--");
+        writer.write(MessageUtils.CRLF);
+        final String epilogue = getEpilogue();
+        writer.write(epilogue);
+        writer.flush();
+    }
+
+    /**
+     * Disposes the BodyParts of this Multipart. Note that the dispose call does
+     * not get forwarded to the parent entity of this Multipart.
+     * 
+     * @see org.apache.james.mime4j.message.Disposable#dispose()
+     */
+    public void dispose() {
+        for (Iterator it = bodyParts.iterator(); it.hasNext();) {
+            ((BodyPart) it.next()).dispose();
+        }
+    }
+
+}
diff --git a/src/main/java/org/apache/james/mime4j/message/TempFileBinaryBody.java b/src/main/java/org/apache/james/mime4j/message/TempFileBinaryBody.java
index c99a552..22febec 100644
--- a/src/main/java/org/apache/james/mime4j/message/TempFileBinaryBody.java
+++ b/src/main/java/org/apache/james/mime4j/message/TempFileBinaryBody.java
@@ -1,90 +1,85 @@
-/****************************************************************
- * 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;
-
-import org.apache.james.mime4j.decoder.CodecUtil;
-import org.apache.james.mime4j.message.storage.TempFile;
-import org.apache.james.mime4j.message.storage.TempPath;
-import org.apache.james.mime4j.message.storage.TempStorage;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-
-/**
- * Binary body backed by a {@link org.apache.james.mime4j.message.storage.TempFile}.
- *
- * 
- * @version $Id: TempFileBinaryBody.java,v 1.2 2004/10/02 12:41:11 ntherning Exp $
- */
-class TempFileBinaryBody extends AbstractBody implements BinaryBody {
-    
-    private TempFile tempFile = null;
-
-    /**
-     * Use the given InputStream to build the TemporyFileBinaryBody
-     * 
-     * @param is the InputStream to use as source
-     * @throws IOException
-     */
-    public TempFileBinaryBody(final InputStream is) throws IOException {
-        
-        TempPath tempPath = TempStorage.getInstance().getRootTempPath();
-        tempFile = tempPath.createTempFile("attachment", ".bin");
-        
-        OutputStream out = tempFile.getOutputStream();
-        CodecUtil.copy(is, out);
-        out.close();
-    }
-    
-    /**
-     * @see org.apache.james.mime4j.message.BinaryBody#getInputStream()
-     */
-    public InputStream getInputStream() throws IOException {
-        return tempFile.getInputStream();
-    }
-    
-    /**
-     * @see org.apache.james.mime4j.message.Body#writeTo(java.io.OutputStream, int)
-     */
-    public void writeTo(OutputStream out, int mode) throws IOException {
-        if (disposed)
-            throw new IllegalStateException("TempFileBinaryBody has been disposed");
-
-        final InputStream inputStream = getInputStream();
-        CodecUtil.copy(inputStream,out);
-    }
-
-    /**
-     * Deletes the temporary file that stores the content of this binary body.
-     * 
-     * @see org.apache.james.mime4j.message.Disposable#dispose()
-     */
-    public void dispose() {
-        try {
-            tempFile.delete();
-        } finally {
-            tempFile = null;
-
-            super.dispose();
-        }
-    }
-}
+/****************************************************************
+ * 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;
+
+import org.apache.james.mime4j.decoder.CodecUtil;
+import org.apache.james.mime4j.message.storage.TempFile;
+import org.apache.james.mime4j.message.storage.TempPath;
+import org.apache.james.mime4j.message.storage.TempStorage;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+
+/**
+ * Binary body backed by a {@link org.apache.james.mime4j.message.storage.TempFile}.
+ *
+ * 
+ * @version $Id: TempFileBinaryBody.java,v 1.2 2004/10/02 12:41:11 ntherning Exp $
+ */
+class TempFileBinaryBody extends AbstractBody implements BinaryBody {
+    
+    private TempFile tempFile = null;
+
+    /**
+     * Use the given InputStream to build the TemporyFileBinaryBody
+     * 
+     * @param is the InputStream to use as source
+     * @throws IOException
+     */
+    public TempFileBinaryBody(final InputStream is) throws IOException {
+        
+        TempPath tempPath = TempStorage.getInstance().getRootTempPath();
+        tempFile = tempPath.createTempFile("attachment", ".bin");
+        
+        OutputStream out = tempFile.getOutputStream();
+        CodecUtil.copy(is, out);
+        out.close();
+    }
+    
+    /**
+     * @see org.apache.james.mime4j.message.BinaryBody#getInputStream()
+     */
+    public InputStream getInputStream() throws IOException {
+        return tempFile.getInputStream();
+    }
+    
+    /**
+     * @see org.apache.james.mime4j.message.Body#writeTo(java.io.OutputStream, int)
+     */
+    public void writeTo(OutputStream out, int mode) throws IOException {
+        final InputStream inputStream = getInputStream();
+        CodecUtil.copy(inputStream,out);
+    }
+
+    /**
+     * Deletes the temporary file that stores the content of this binary body.
+     * 
+     * @see org.apache.james.mime4j.message.Disposable#dispose()
+     */
+    public void dispose() {
+        if (tempFile != null) {
+            tempFile.delete();
+            tempFile = null;
+        }
+    }
+
+}
diff --git a/src/main/java/org/apache/james/mime4j/message/TempFileTextBody.java b/src/main/java/org/apache/james/mime4j/message/TempFileTextBody.java
index a4917de..1ac3d96 100644
--- a/src/main/java/org/apache/james/mime4j/message/TempFileTextBody.java
+++ b/src/main/java/org/apache/james/mime4j/message/TempFileTextBody.java
@@ -1,129 +1,123 @@
-/****************************************************************
- * 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;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.james.mime4j.decoder.CodecUtil;
-import org.apache.james.mime4j.message.storage.TempFile;
-import org.apache.james.mime4j.message.storage.TempPath;
-import org.apache.james.mime4j.message.storage.TempStorage;
-import org.apache.james.mime4j.util.CharsetUtil;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-
-
-/**
- * Text body backed by a {@link org.apache.james.mime4j.message.storage.TempFile}.
- *
- * 
- * @version $Id: TempFileTextBody.java,v 1.3 2004/10/25 07:26:46 ntherning Exp $
- */
-class TempFileTextBody extends AbstractBody implements TextBody {
-    private static Log log = LogFactory.getLog(TempFileTextBody.class);
-    
-    private String mimeCharset = null;
-    private TempFile tempFile = null;
-
-    public TempFileTextBody(final InputStream is, final String mimeCharset) throws IOException {
-        
-        this.mimeCharset = mimeCharset;
-        TempPath tempPath = TempStorage.getInstance().getRootTempPath();
-        tempFile = tempPath.createTempFile("attachment", ".txt");
-        
-        OutputStream out = tempFile.getOutputStream();
-        CodecUtil.copy(is, out);
-        out.close();
-    }
-    
-    /**
-     * @see org.apache.james.mime4j.message.TextBody#getReader()
-     */
-    public Reader getReader() throws UnsupportedEncodingException, IOException {
-        String javaCharset = null;
-        if (mimeCharset != null) {
-            javaCharset = CharsetUtil.toJavaCharset(mimeCharset);
-        }
-        
-        if (javaCharset == null) {
-            javaCharset = "ISO-8859-1";
-            
-            if (log.isWarnEnabled()) {
-                if (mimeCharset == null) {
-                    log.warn("No MIME charset specified. Using " + javaCharset
-                            + " instead.");
-                } else {
-                    log.warn("MIME charset '" + mimeCharset + "' has no "
-                            + "corresponding Java charset. Using " + javaCharset
-                            + " instead.");
-                }
-            }
-        }
-        /*
-            if (log.isWarnEnabled()) {
-                if (mimeCharset == null) {
-                    log.warn("No MIME charset specified. Using the "
-                           + "platform's default charset.");
-                } else {
-                    log.warn("MIME charset '" + mimeCharset + "' has no "
-                            + "corresponding Java charset. Using the "
-                            + "platform's default charset.");
-                }
-            }
-            
-            return new InputStreamReader(tempFile.getInputStream());
-        }*/
-        
-        return new InputStreamReader(tempFile.getInputStream(), javaCharset);
-    }
-    
-    
-    /**
-     * @see org.apache.james.mime4j.message.Body#writeTo(java.io.OutputStream, int)
-     */
-    public void writeTo(OutputStream out, int mode) throws IOException {
-        if (disposed)
-            throw new IllegalStateException("TempFileTextBody has been disposed");
-
-        final InputStream inputStream = tempFile.getInputStream();
-        CodecUtil.copy(inputStream, out);
-    }
-
-    /**
-     * Deletes the temporary file that stores the content of this text body.
-     * 
-     * @see org.apache.james.mime4j.message.Disposable#dispose()
-     */
-    public void dispose() {
-        try {
-            tempFile.delete();
-        } finally {
-            mimeCharset = null;
-            tempFile = null;
-
-            super.dispose();
-        }
-    }
-}
+/****************************************************************
+ * 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;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.james.mime4j.decoder.CodecUtil;
+import org.apache.james.mime4j.message.storage.TempFile;
+import org.apache.james.mime4j.message.storage.TempPath;
+import org.apache.james.mime4j.message.storage.TempStorage;
+import org.apache.james.mime4j.util.CharsetUtil;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+
+
+/**
+ * Text body backed by a {@link org.apache.james.mime4j.message.storage.TempFile}.
+ *
+ * 
+ * @version $Id: TempFileTextBody.java,v 1.3 2004/10/25 07:26:46 ntherning Exp $
+ */
+class TempFileTextBody extends AbstractBody implements TextBody {
+    private static Log log = LogFactory.getLog(TempFileTextBody.class);
+    
+    private String mimeCharset = null;
+    private TempFile tempFile = null;
+
+    public TempFileTextBody(final InputStream is, final String mimeCharset) throws IOException {
+        
+        this.mimeCharset = mimeCharset;
+        TempPath tempPath = TempStorage.getInstance().getRootTempPath();
+        tempFile = tempPath.createTempFile("attachment", ".txt");
+        
+        OutputStream out = tempFile.getOutputStream();
+        CodecUtil.copy(is, out);
+        out.close();
+    }
+    
+    /**
+     * @see org.apache.james.mime4j.message.TextBody#getReader()
+     */
+    public Reader getReader() throws UnsupportedEncodingException, IOException {
+        String javaCharset = null;
+        if (mimeCharset != null) {
+            javaCharset = CharsetUtil.toJavaCharset(mimeCharset);
+        }
+        
+        if (javaCharset == null) {
+            javaCharset = "ISO-8859-1";
+            
+            if (log.isWarnEnabled()) {
+                if (mimeCharset == null) {
+                    log.warn("No MIME charset specified. Using " + javaCharset
+                            + " instead.");
+                } else {
+                    log.warn("MIME charset '" + mimeCharset + "' has no "
+                            + "corresponding Java charset. Using " + javaCharset
+                            + " instead.");
+                }
+            }
+        }
+        /*
+            if (log.isWarnEnabled()) {
+                if (mimeCharset == null) {
+                    log.warn("No MIME charset specified. Using the "
+                           + "platform's default charset.");
+                } else {
+                    log.warn("MIME charset '" + mimeCharset + "' has no "
+                            + "corresponding Java charset. Using the "
+                            + "platform's default charset.");
+                }
+            }
+            
+            return new InputStreamReader(tempFile.getInputStream());
+        }*/
+        
+        return new InputStreamReader(tempFile.getInputStream(), javaCharset);
+    }
+    
+    
+    /**
+     * @see org.apache.james.mime4j.message.Body#writeTo(java.io.OutputStream, int)
+     */
+    public void writeTo(OutputStream out, int mode) throws IOException {
+        final InputStream inputStream = tempFile.getInputStream();
+        CodecUtil.copy(inputStream, out);
+    }
+
+    /**
+     * Deletes the temporary file that stores the content of this text body.
+     * 
+     * @see org.apache.james.mime4j.message.Disposable#dispose()
+     */
+    public void dispose() {
+        if (tempFile != null) {
+            tempFile.delete();
+            tempFile = null;
+        }
+    }
+
+}
diff --git a/src/test/java/org/apache/james/mime4j/message/MessageTest.java b/src/test/java/org/apache/james/mime4j/message/MessageTest.java
index eb46c59..47d1c99 100644
--- a/src/test/java/org/apache/james/mime4j/message/MessageTest.java
+++ b/src/test/java/org/apache/james/mime4j/message/MessageTest.java
@@ -1,244 +1,231 @@
-/****************************************************************
- * 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;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-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;
-
-/**
- * 
- *
- * 
- * @version $Id: MessageTest.java,v 1.4 2004/10/02 12:41:11 ntherning Exp $
- */
-public class MessageTest extends TestCase {
-    private Header headerTextPlain = null;
-    private Header headerMessageRFC822 = null;
-    private Header headerEmpty = null;
-    private Header headerMultipartMixed = null;
-    private Header headerMultipartDigest = null;
-
-    public void setUp() throws Exception {
-        headerTextPlain = new Header();
-        headerMessageRFC822 = new Header();
-        headerEmpty = new Header();
-        headerMultipartMixed = new Header();
-        headerMultipartDigest = new Header();
-        
-        headerTextPlain.addField(
-                Field.parse("Content-Type: text/plain"));
-        headerMessageRFC822.addField(
-                Field.parse("Content-Type: message/RFC822"));
-        headerMultipartMixed.addField(
-                Field.parse("Content-Type: multipart/mixed; boundary=foo"));
-        headerMultipartDigest.addField(
-                Field.parse("Content-Type: multipart/digest; boundary=foo"));
-    }
-    
-    public void testGetParts() {
-    }
-
-    public void testGetMimeType() {
-        Message parent = null;
-        Message child = null;
-        
-        parent = new Message();
-        child = new Message();
-        child.setParent(parent);
-        parent.setHeader(headerMultipartDigest);
-        child.setHeader(headerEmpty);
-        assertEquals("multipart/digest, empty", "message/rfc822", 
-                child.getMimeType());
-        child.setHeader(headerTextPlain);
-        assertEquals("multipart/digest, text/plain", "text/plain", 
-                child.getMimeType());
-        child.setHeader(headerMessageRFC822);
-        assertEquals("multipart/digest, message/rfc822", "message/rfc822", 
-                child.getMimeType());
-        
-        parent = new Message();
-        child = new Message();
-        child.setParent(parent);
-        parent.setHeader(headerMultipartMixed);
-        child.setHeader(headerEmpty);
-        assertEquals("multipart/mixed, empty", "text/plain", 
-                child.getMimeType());
-        child.setHeader(headerTextPlain);
-        assertEquals("multipart/mixed, text/plain", "text/plain", 
-                child.getMimeType());
-        child.setHeader(headerMessageRFC822);
-        assertEquals("multipart/mixed, message/rfc822", "message/rfc822", 
-                child.getMimeType());
-        
-        child = new Message();
-        child.setHeader(headerEmpty);
-        assertEquals("null, empty", "text/plain", child.getMimeType());
-        child.setHeader(headerTextPlain);
-        assertEquals("null, text/plain", "text/plain", child.getMimeType());
-        child.setHeader(headerMessageRFC822);
-        assertEquals("null, message/rfc822", "message/rfc822", 
-                child.getMimeType());
-    }
-
-    public void testIsMultipart() {
-        Message m = new Message();
-        
-        m.setHeader(headerEmpty);
-        assertTrue("empty", !m.isMultipart());
-        
-        m.setHeader(headerTextPlain);
-        assertTrue("text/plain", !m.isMultipart());
-        
-        m.setHeader(headerMultipartDigest);
-        assertTrue("multipart/digest", m.isMultipart());
-        
-        m.setHeader(headerMultipartMixed);
-        assertTrue("multipart/mixed", m.isMultipart());
-    }
-    
-    public void testWriteTo() throws Exception {
-        byte[] inputByte = getRawMessageAsByteArray();
-
-        Message m = new Message(new ByteArrayInputStream(inputByte));
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-
-        m.writeTo(out, MessageUtils.LENIENT);
-
-        InputStream output = new ByteArrayInputStream(out.toByteArray());
-
-        int b = -1;
-        int i = 0;
-        while ((b = output.read()) != -1) {
-            assertEquals("same byte", b, inputByte[i]);
-            i++;
-        }
-    }
-
-    public void testAddHeaderWriteTo() throws Exception {
-        String headerName = "testheader";
-        String headerValue = "testvalue";
-        String testheader = headerName + ": " + headerValue;
-
-        byte[] inputByte = getRawMessageAsByteArray();
-
-        Message m = new Message(new ByteArrayInputStream(inputByte));
-        m.getHeader().addField(Field.parse(testheader));
-
-        assertEquals("header added", m.getHeader().getField(headerName)
-                .getBody(), headerValue);
-
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        m.writeTo(out, MessageUtils.LENIENT);
-        List lines = IOUtils.readLines((new BufferedReader(
-                new InputStreamReader(new ByteArrayInputStream(out
-                        .toByteArray())))));
-
-        assertTrue("header added", lines.contains(testheader));
-    }
-
-    public void testDisposeGetsPropagatedToBody() throws Exception {
-        DummyBody body1 = new DummyBody();
-        BodyPart part1 = new BodyPart();
-        part1.setHeader(headerEmpty);
-        part1.setBody(body1);
-
-        DummyBody body2 = new DummyBody();
-        BodyPart part2 = new BodyPart();
-        part2.setHeader(headerEmpty);
-        part2.setBody(body2);
-
-        Multipart mp = new Multipart("mixed");
-        mp.addBodyPart(part1);
-        mp.addBodyPart(part2);
-
-        Message m = new Message();
-        m.setHeader(headerMultipartMixed);
-        m.setBody(mp);
-
-        assertFalse(body1.disposed);
-        assertFalse(body2.disposed);
-
-        m.dispose();
-
-        assertTrue(body1.disposed);
-        assertTrue(body2.disposed);
-    }
-
-    public void testDisposedMessageThrowsException()
-            throws Exception {
-        byte[] inputByte = getRawMessageAsByteArray();
-        Message m = new Message(new ByteArrayInputStream(inputByte));
-        m.dispose();
-
-        try {
-            m.writeTo(new ByteArrayOutputStream(), MessageUtils.LENIENT);
-            fail();
-        } catch (IllegalStateException expected) {
-        }
-    }
-
-    private byte[] getRawMessageAsByteArray() {
-        StringBuffer header = new StringBuffer();
-        StringBuffer body = new StringBuffer();
-        StringBuffer complete = new StringBuffer();
-
-        header.append("Date: Wed, 21 Feb 2007 11:09:27 +0100\r\n");
-        header.append("From: Test <test@test>\r\n");
-        header.append("To: Norman Maurer <nm@byteaction.de>\r\n");
-        header.append("Subject: Testmail\r\n");
-        header
-                .append("Content-Type: text/plain; charset=ISO-8859-15; format=flowed\r\n");
-        header.append("Content-Transfer-Encoding: 8bit\r\n\r\n");
-        body.append("testbody\r\n");
-        complete.append(header);
-        complete.append(body);
-
-        return complete.toString().getBytes();
-    }
-
-    private static final class DummyBody extends AbstractBody {
-
-        public boolean disposed = false;
-
-        public void writeTo(OutputStream out, int mode) throws IOException,
-                MimeException {
-            out.write("dummy".getBytes("US-ASCII"));
-        }
-
-        public void dispose() {
-            disposed = true;
-        }
-
-    }
-
-}
+/****************************************************************
+ * 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;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+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;
+
+/**
+ * 
+ *
+ * 
+ * @version $Id: MessageTest.java,v 1.4 2004/10/02 12:41:11 ntherning Exp $
+ */
+public class MessageTest extends TestCase {
+    private Header headerTextPlain = null;
+    private Header headerMessageRFC822 = null;
+    private Header headerEmpty = null;
+    private Header headerMultipartMixed = null;
+    private Header headerMultipartDigest = null;
+
+    public void setUp() throws Exception {
+        headerTextPlain = new Header();
+        headerMessageRFC822 = new Header();
+        headerEmpty = new Header();
+        headerMultipartMixed = new Header();
+        headerMultipartDigest = new Header();
+        
+        headerTextPlain.addField(
+                Field.parse("Content-Type: text/plain"));
+        headerMessageRFC822.addField(
+                Field.parse("Content-Type: message/RFC822"));
+        headerMultipartMixed.addField(
+                Field.parse("Content-Type: multipart/mixed; boundary=foo"));
+        headerMultipartDigest.addField(
+                Field.parse("Content-Type: multipart/digest; boundary=foo"));
+    }
+    
+    public void testGetParts() {
+    }
+
+    public void testGetMimeType() {
+        Message parent = null;
+        Message child = null;
+        
+        parent = new Message();
+        child = new Message();
+        child.setParent(parent);
+        parent.setHeader(headerMultipartDigest);
+        child.setHeader(headerEmpty);
+        assertEquals("multipart/digest, empty", "message/rfc822", 
+                child.getMimeType());
+        child.setHeader(headerTextPlain);
+        assertEquals("multipart/digest, text/plain", "text/plain", 
+                child.getMimeType());
+        child.setHeader(headerMessageRFC822);
+        assertEquals("multipart/digest, message/rfc822", "message/rfc822", 
+                child.getMimeType());
+        
+        parent = new Message();
+        child = new Message();
+        child.setParent(parent);
+        parent.setHeader(headerMultipartMixed);
+        child.setHeader(headerEmpty);
+        assertEquals("multipart/mixed, empty", "text/plain", 
+                child.getMimeType());
+        child.setHeader(headerTextPlain);
+        assertEquals("multipart/mixed, text/plain", "text/plain", 
+                child.getMimeType());
+        child.setHeader(headerMessageRFC822);
+        assertEquals("multipart/mixed, message/rfc822", "message/rfc822", 
+                child.getMimeType());
+        
+        child = new Message();
+        child.setHeader(headerEmpty);
+        assertEquals("null, empty", "text/plain", child.getMimeType());
+        child.setHeader(headerTextPlain);
+        assertEquals("null, text/plain", "text/plain", child.getMimeType());
+        child.setHeader(headerMessageRFC822);
+        assertEquals("null, message/rfc822", "message/rfc822", 
+                child.getMimeType());
+    }
+
+    public void testIsMultipart() {
+        Message m = new Message();
+        
+        m.setHeader(headerEmpty);
+        assertTrue("empty", !m.isMultipart());
+        
+        m.setHeader(headerTextPlain);
+        assertTrue("text/plain", !m.isMultipart());
+        
+        m.setHeader(headerMultipartDigest);
+        assertTrue("multipart/digest", m.isMultipart());
+        
+        m.setHeader(headerMultipartMixed);
+        assertTrue("multipart/mixed", m.isMultipart());
+    }
+    
+    public void testWriteTo() throws Exception {
+        byte[] inputByte = getRawMessageAsByteArray();
+
+        Message m = new Message(new ByteArrayInputStream(inputByte));
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+        m.writeTo(out, MessageUtils.LENIENT);
+
+        InputStream output = new ByteArrayInputStream(out.toByteArray());
+
+        int b = -1;
+        int i = 0;
+        while ((b = output.read()) != -1) {
+            assertEquals("same byte", b, inputByte[i]);
+            i++;
+        }
+    }
+
+    public void testAddHeaderWriteTo() throws Exception {
+        String headerName = "testheader";
+        String headerValue = "testvalue";
+        String testheader = headerName + ": " + headerValue;
+
+        byte[] inputByte = getRawMessageAsByteArray();
+
+        Message m = new Message(new ByteArrayInputStream(inputByte));
+        m.getHeader().addField(Field.parse(testheader));
+
+        assertEquals("header added", m.getHeader().getField(headerName)
+                .getBody(), headerValue);
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        m.writeTo(out, MessageUtils.LENIENT);
+        List lines = IOUtils.readLines((new BufferedReader(
+                new InputStreamReader(new ByteArrayInputStream(out
+                        .toByteArray())))));
+
+        assertTrue("header added", lines.contains(testheader));
+    }
+
+    public void testDisposeGetsPropagatedToBody() throws Exception {
+        DummyBody body1 = new DummyBody();
+        BodyPart part1 = new BodyPart();
+        part1.setHeader(headerEmpty);
+        part1.setBody(body1);
+
+        DummyBody body2 = new DummyBody();
+        BodyPart part2 = new BodyPart();
+        part2.setHeader(headerEmpty);
+        part2.setBody(body2);
+
+        Multipart mp = new Multipart("mixed");
+        mp.addBodyPart(part1);
+        mp.addBodyPart(part2);
+
+        Message m = new Message();
+        m.setHeader(headerMultipartMixed);
+        m.setBody(mp);
+
+        assertFalse(body1.disposed);
+        assertFalse(body2.disposed);
+
+        m.dispose();
+
+        assertTrue(body1.disposed);
+        assertTrue(body2.disposed);
+    }
+
+    private byte[] getRawMessageAsByteArray() {
+        StringBuffer header = new StringBuffer();
+        StringBuffer body = new StringBuffer();
+        StringBuffer complete = new StringBuffer();
+
+        header.append("Date: Wed, 21 Feb 2007 11:09:27 +0100\r\n");
+        header.append("From: Test <test@test>\r\n");
+        header.append("To: Norman Maurer <nm@byteaction.de>\r\n");
+        header.append("Subject: Testmail\r\n");
+        header
+                .append("Content-Type: text/plain; charset=ISO-8859-15; format=flowed\r\n");
+        header.append("Content-Transfer-Encoding: 8bit\r\n\r\n");
+        body.append("testbody\r\n");
+        complete.append(header);
+        complete.append(body);
+
+        return complete.toString().getBytes();
+    }
+
+    private static final class DummyBody extends AbstractBody {
+
+        public boolean disposed = false;
+
+        public void writeTo(OutputStream out, int mode) throws IOException,
+                MimeException {
+            out.write("dummy".getBytes("US-ASCII"));
+        }
+
+        public void dispose() {
+            disposed = true;
+        }
+
+    }
+
+}
