diff --git a/dom/src/main/java/org/apache/james/mime4j/dom/Message.java b/dom/src/main/java/org/apache/james/mime4j/dom/Message.java
index 05182f2..17132e4 100644
--- a/dom/src/main/java/org/apache/james/mime4j/dom/Message.java
+++ b/dom/src/main/java/org/apache/james/mime4j/dom/Message.java
@@ -19,11 +19,8 @@
 
 package org.apache.james.mime4j.dom;
 
-import java.util.Collection;
 import java.util.Date;
-import java.util.TimeZone;
 
-import org.apache.james.mime4j.dom.address.Address;
 import org.apache.james.mime4j.dom.address.AddressList;
 import org.apache.james.mime4j.dom.address.Mailbox;
 import org.apache.james.mime4j.dom.address.MailboxList;
@@ -42,17 +39,6 @@
     String getMessageId();
 
     /**
-     * Creates and sets a new <i>Message-ID</i> header field for this message.
-     * A <code>Header</code> is created if this message does not already have
-     * one.
-     *
-     * @param hostname
-     *            host name to be included in the identifier or
-     *            <code>null</code> if no host name should be included.
-     */
-    void createMessageId(String hostname);
-
-    /**
      * Returns the (decoded) value of the <i>Subject</i> header field of this
      * message or <code>null</code> if it is not present.
      *
@@ -61,18 +47,6 @@
     String getSubject();
 
     /**
-     * Sets the <i>Subject</i> header field for this message. The specified
-     * string may contain non-ASCII characters, in which case it gets encoded as
-     * an 'encoded-word' automatically. A <code>Header</code> is created if
-     * this message does not already have one.
-     *
-     * @param subject
-     *            subject to set or <code>null</code> to remove the subject
-     *            header field.
-     */
-    void setSubject(String subject);
-
-    /**
      * Returns the value of the <i>Date</i> header field of this message as
      * <code>Date</code> object or <code>null</code> if it is not present.
      *
@@ -81,30 +55,6 @@
     Date getDate();
 
     /**
-     * Sets the <i>Date</i> header field for this message. This method uses the
-     * default <code>TimeZone</code> of this host to encode the specified
-     * <code>Date</code> object into a string.
-     *
-     * @param date
-     *            date to set or <code>null</code> to remove the date header
-     *            field.
-     */
-    void setDate(Date date);
-
-    /**
-     * Sets the <i>Date</i> header field for this message. The specified
-     * <code>TimeZone</code> is used to encode the specified <code>Date</code>
-     * object into a string.
-     *
-     * @param date
-     *            date to set or <code>null</code> to remove the date header
-     *            field.
-     * @param zone
-     *            a time zone.
-     */
-    void setDate(Date date, TimeZone zone);
-
-    /**
      * Returns the value of the <i>Sender</i> header field of this message as
      * <code>Mailbox</code> object or <code>null</code> if it is not
      * present.
@@ -114,16 +64,6 @@
     Mailbox getSender();
 
     /**
-     * Sets the <i>Sender</i> header field of this message to the specified
-     * mailbox address.
-     *
-     * @param sender
-     *            address to set or <code>null</code> to remove the header
-     *            field.
-     */
-    void setSender(Mailbox sender);
-
-    /**
      * Returns the value of the <i>From</i> header field of this message as
      * <code>MailboxList</code> object or <code>null</code> if it is not
      * present.
@@ -133,36 +73,6 @@
     MailboxList getFrom();
 
     /**
-     * Sets the <i>From</i> header field of this message to the specified
-     * mailbox address.
-     *
-     * @param from
-     *            address to set or <code>null</code> to remove the header
-     *            field.
-     */
-    void setFrom(Mailbox from);
-
-    /**
-     * Sets the <i>From</i> header field of this message to the specified
-     * mailbox addresses.
-     *
-     * @param from
-     *            addresses to set or <code>null</code> or no arguments to
-     *            remove the header field.
-     */
-    void setFrom(Mailbox... from);
-
-    /**
-     * Sets the <i>From</i> header field of this message to the specified
-     * mailbox addresses.
-     *
-     * @param from
-     *            addresses to set or <code>null</code> or an empty collection
-     *            to remove the header field.
-     */
-    void setFrom(Collection<Mailbox> from);
-
-    /**
      * Returns the value of the <i>To</i> header field of this message as
      * <code>AddressList</code> object or <code>null</code> if it is not
      * present.
@@ -172,36 +82,6 @@
     AddressList getTo();
 
     /**
-     * Sets the <i>To</i> header field of this message to the specified
-     * address.
-     *
-     * @param to
-     *            address to set or <code>null</code> to remove the header
-     *            field.
-     */
-    void setTo(Address to);
-
-    /**
-     * Sets the <i>To</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param to
-     *            addresses to set or <code>null</code> or no arguments to
-     *            remove the header field.
-     */
-    void setTo(Address... to);
-
-    /**
-     * Sets the <i>To</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param to
-     *            addresses to set or <code>null</code> or an empty collection
-     *            to remove the header field.
-     */
-    void setTo(Collection<? extends Address> to);
-
-    /**
      * Returns the value of the <i>Cc</i> header field of this message as
      * <code>AddressList</code> object or <code>null</code> if it is not
      * present.
@@ -211,36 +91,6 @@
     AddressList getCc();
 
     /**
-     * Sets the <i>Cc</i> header field of this message to the specified
-     * address.
-     *
-     * @param cc
-     *            address to set or <code>null</code> to remove the header
-     *            field.
-     */
-    void setCc(Address cc);
-
-    /**
-     * Sets the <i>Cc</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param cc
-     *            addresses to set or <code>null</code> or no arguments to
-     *            remove the header field.
-     */
-    void setCc(Address... cc);
-
-    /**
-     * Sets the <i>Cc</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param cc
-     *            addresses to set or <code>null</code> or an empty collection
-     *            to remove the header field.
-     */
-    void setCc(Collection<? extends Address> cc);
-
-    /**
      * Returns the value of the <i>Bcc</i> header field of this message as
      * <code>AddressList</code> object or <code>null</code> if it is not
      * present.
@@ -250,36 +100,6 @@
     AddressList getBcc();
 
     /**
-     * Sets the <i>Bcc</i> header field of this message to the specified
-     * address.
-     *
-     * @param bcc
-     *            address to set or <code>null</code> to remove the header
-     *            field.
-     */
-    void setBcc(Address bcc);
-
-    /**
-     * Sets the <i>Bcc</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param bcc
-     *            addresses to set or <code>null</code> or no arguments to
-     *            remove the header field.
-     */
-    void setBcc(Address... bcc);
-
-    /**
-     * Sets the <i>Bcc</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param bcc
-     *            addresses to set or <code>null</code> or an empty collection
-     *            to remove the header field.
-     */
-    void setBcc(Collection<? extends Address> bcc);
-
-    /**
      * Returns the value of the <i>Reply-To</i> header field of this message as
      * <code>AddressList</code> object or <code>null</code> if it is not
      * present.
@@ -288,34 +108,4 @@
      */
     AddressList getReplyTo();
 
-    /**
-     * Sets the <i>Reply-To</i> header field of this message to the specified
-     * address.
-     *
-     * @param replyTo
-     *            address to set or <code>null</code> to remove the header
-     *            field.
-     */
-    void setReplyTo(Address replyTo);
-
-    /**
-     * Sets the <i>Reply-To</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param replyTo
-     *            addresses to set or <code>null</code> or no arguments to
-     *            remove the header field.
-     */
-    void setReplyTo(Address... replyTo);
-
-    /**
-     * Sets the <i>Reply-To</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param replyTo
-     *            addresses to set or <code>null</code> or an empty collection
-     *            to remove the header field.
-     */
-    void setReplyTo(Collection<? extends Address> replyTo);
-
 }
diff --git a/dom/src/main/java/org/apache/james/mime4j/message/AbstractEntity.java b/dom/src/main/java/org/apache/james/mime4j/message/AbstractEntity.java
index 19cfa04..d050059 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/AbstractEntity.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/AbstractEntity.java
@@ -19,18 +19,10 @@
 
 package org.apache.james.mime4j.message;
 
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
 import org.apache.james.mime4j.dom.Body;
 import org.apache.james.mime4j.dom.Disposable;
 import org.apache.james.mime4j.dom.Entity;
 import org.apache.james.mime4j.dom.Header;
-import org.apache.james.mime4j.dom.Message;
-import org.apache.james.mime4j.dom.Multipart;
-import org.apache.james.mime4j.dom.TextBody;
 import org.apache.james.mime4j.dom.field.ContentDispositionField;
 import org.apache.james.mime4j.dom.field.ContentTransferEncodingField;
 import org.apache.james.mime4j.dom.field.ContentTypeField;
@@ -131,145 +123,11 @@
         return body;
     }
 
-    /**
-     * Sets the specified message as body of this entity and the content type to
-     * &quot;message/rfc822&quot;. A <code>Header</code> is created if this
-     * entity does not already have one.
-     *
-     * @param message
-     *            the message to set as body.
-     */
-    public void setMessage(Message message) {
-        setBody(message, "message/rfc822", null);
-    }
-
-    /**
-     * Sets the specified multipart as body of this entity. Also sets the
-     * content type accordingly and creates a message boundary string. A
-     * <code>Header</code> is created if this entity does not already have
-     * one.
-     *
-     * @param multipart
-     *            the multipart to set as body.
-     */
-    public void setMultipart(Multipart multipart) {
-        String mimeType = "multipart/" + multipart.getSubType();
-        Map<String, String> parameters = Collections.singletonMap("boundary",
-                newUniqueBoundary());
-
-        setBody(multipart, mimeType, parameters);
-    }
-
-    /**
-     * Sets the specified multipart as body of this entity. Also sets the
-     * content type accordingly and creates a message boundary string. A
-     * <code>Header</code> is created if this entity does not already have
-     * one.
-     *
-     * @param multipart
-     *            the multipart to set as body.
-     * @param parameters
-     *            additional parameters for the Content-Type header field.
-     */
-    public void setMultipart(Multipart multipart, Map<String, String> parameters) {
-        String mimeType = "multipart/" + multipart.getSubType();
-        if (!parameters.containsKey("boundary")) {
-            parameters = new HashMap<String, String>(parameters);
-            parameters.put("boundary", newUniqueBoundary());
-        }
-
-        setBody(multipart, mimeType, parameters);
-    }
-
-    /**
-     * Sets the specified <code>TextBody</code> as body of this entity and the
-     * content type to &quot;text/plain&quot;. A <code>Header</code> is
-     * created if this entity does not already have one.
-     *
-     * @param textBody
-     *            the <code>TextBody</code> to set as body.
-     * @see org.apache.james.mime4j.message.BodyFactory#textBody(java.io.InputStream, String)
-     */
-    public void setText(TextBody textBody) {
-        setText(textBody, "plain");
-    }
-
-    /**
-     * Sets the specified <code>TextBody</code> as body of this entity. Also
-     * sets the content type according to the specified sub-type. A
-     * <code>Header</code> is created if this entity does not already have
-     * one.
-     *
-     * @param textBody
-     *            the <code>TextBody</code> to set as body.
-     * @param subtype
-     *            the text subtype (e.g. &quot;plain&quot;, &quot;html&quot; or
-     *            &quot;xml&quot;).
-     */
-    public void setText(TextBody textBody, String subtype) {
-        String mimeType = "text/" + subtype;
-
-        Map<String, String> parameters = null;
-        String mimeCharset = textBody.getMimeCharset();
-        if (mimeCharset != null && !mimeCharset.equalsIgnoreCase("us-ascii")) {
-            parameters = Collections.singletonMap("charset", mimeCharset);
-        }
-
-        setBody(textBody, mimeType, parameters);
-    }
-
-    /**
-     * Sets the body of this entity and sets the content-type to the specified
-     * value. A <code>Header</code> is created if this entity does not already
-     * have one.
-     *
-     * @param body
-     *            the body.
-     * @param mimeType
-     *            the MIME media type of the specified body
-     *            (&quot;type/subtype&quot;).
-     */
-    public void setBody(Body body, String mimeType) {
-        setBody(body, mimeType, null);
-    }
-
-    /**
-     * Sets the body of this entity and sets the content-type to the specified
-     * value. A <code>Header</code> is created if this entity does not already
-     * have one.
-     *
-     * @param body
-     *            the body.
-     * @param mimeType
-     *            the MIME media type of the specified body
-     *            (&quot;type/subtype&quot;).
-     * @param parameters
-     *            additional parameters for the Content-Type header field.
-     */
-    public void setBody(Body body, String mimeType,
-            Map<String, String> parameters) {
-        setBody(body);
-
-        Header header = obtainHeader();
-        header.setField(newContentType(mimeType, parameters));
-    }
-
-    /**
-     * 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 =
-            getContentTypeField();
-        ContentTypeField parent = getParent() != null
-            ? (ContentTypeField) getParent().getHeader().
-                                                getField(FieldName.CONTENT_TYPE)
-            : null;
-
-        return calcMimeType(child, parent);
+        ContentTypeField childType = getContentTypeField();
+        Entity parent = getParent();
+        ContentTypeField parentType = parent != null ? (ContentTypeField) (parent).getHeader().getField(FieldName.CONTENT_TYPE) : null;
+        return calcMimeType(childType, parentType);
     }
 
     private ContentTypeField getContentTypeField() {
@@ -298,18 +156,6 @@
     }
 
     /**
-     * Sets the transfer encoding of this <code>Entity</code> to the specified
-     * value.
-     *
-     * @param contentTransferEncoding
-     *            transfer encoding to use.
-     */
-    public void setContentTransferEncoding(String contentTransferEncoding) {
-        Header header = obtainHeader();
-        header.setField(newContentTransferEncoding(contentTransferEncoding));
-    }
-
-    /**
      * Return the disposition type of the content disposition of this
      * <code>Entity</code>.
      *
@@ -325,91 +171,6 @@
     }
 
     /**
-     * Sets the content disposition of this <code>Entity</code> to the
-     * specified disposition type. No filename, size or date parameters
-     * are included in the content disposition.
-     *
-     * @param dispositionType
-     *            disposition type value (usually <code>inline</code> or
-     *            <code>attachment</code>).
-     */
-    public void setContentDisposition(String dispositionType) {
-        Header header = obtainHeader();
-        header.setField(newContentDisposition(dispositionType, null, -1, null,
-                null, null));
-    }
-
-    /**
-     * Sets the content disposition of this <code>Entity</code> to the
-     * specified disposition type and filename. No size or date parameters are
-     * included in the content disposition.
-     *
-     * @param dispositionType
-     *            disposition type value (usually <code>inline</code> or
-     *            <code>attachment</code>).
-     * @param filename
-     *            filename parameter value or <code>null</code> if the
-     *            parameter should not be included.
-     */
-    public void setContentDisposition(String dispositionType, String filename) {
-        Header header = obtainHeader();
-        header.setField(newContentDisposition(dispositionType, filename, -1,
-                null, null, null));
-    }
-
-    /**
-     * Sets the content disposition of this <code>Entity</code> to the
-     * specified values. No date parameters are included in the content
-     * disposition.
-     *
-     * @param dispositionType
-     *            disposition type value (usually <code>inline</code> or
-     *            <code>attachment</code>).
-     * @param filename
-     *            filename parameter value or <code>null</code> if the
-     *            parameter should not be included.
-     * @param size
-     *            size parameter value or <code>-1</code> if the parameter
-     *            should not be included.
-     */
-    public void setContentDisposition(String dispositionType, String filename,
-            long size) {
-        Header header = obtainHeader();
-        header.setField(newContentDisposition(dispositionType, filename, size,
-                null, null, null));
-    }
-
-    /**
-     * Sets the content disposition of this <code>Entity</code> to the
-     * specified values.
-     *
-     * @param dispositionType
-     *            disposition type value (usually <code>inline</code> or
-     *            <code>attachment</code>).
-     * @param filename
-     *            filename parameter value or <code>null</code> if the
-     *            parameter should not be included.
-     * @param size
-     *            size parameter value or <code>-1</code> if the parameter
-     *            should not be included.
-     * @param creationDate
-     *            creation-date parameter value or <code>null</code> if the
-     *            parameter should not be included.
-     * @param modificationDate
-     *            modification-date parameter value or <code>null</code> if
-     *            the parameter should not be included.
-     * @param readDate
-     *            read-date parameter value or <code>null</code> if the
-     *            parameter should not be included.
-     */
-    public void setContentDisposition(String dispositionType, String filename,
-            long size, Date creationDate, Date modificationDate, Date readDate) {
-        Header header = obtainHeader();
-        header.setField(newContentDisposition(dispositionType, filename, size,
-                creationDate, modificationDate, readDate));
-    }
-
-    /**
      * Returns the filename parameter of the content disposition of this
      * <code>Entity</code>.
      *
@@ -425,51 +186,6 @@
     }
 
     /**
-     * Sets the filename parameter of the content disposition of this
-     * <code>Entity</code> to the specified value. If this entity does not
-     * have a content disposition header field a new one with disposition type
-     * <code>attachment</code> is created.
-     *
-     * @param filename
-     *            filename parameter value or <code>null</code> if the
-     *            parameter should be removed.
-     */
-    public void setFilename(String filename) {
-        Header header = obtainHeader();
-        ContentDispositionField field = (ContentDispositionField) header
-                .getField(FieldName.CONTENT_DISPOSITION);
-        if (field == null) {
-            if (filename != null) {
-                header.setField(newContentDisposition(
-                        ContentDispositionField.DISPOSITION_TYPE_ATTACHMENT,
-                        filename, -1, null, null, null));
-            }
-        } else {
-            String dispositionType = field.getDispositionType();
-            Map<String, String> parameters = new HashMap<String, String>(field
-                    .getParameters());
-            if (filename == null) {
-                parameters.remove(ContentDispositionField.PARAM_FILENAME);
-            } else {
-                parameters
-                        .put(ContentDispositionField.PARAM_FILENAME, filename);
-            }
-            header.setField(newContentDisposition(dispositionType, parameters));
-        }
-    }
-
-    /**
-     * 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
@@ -531,21 +247,6 @@
         return (F) header.getField(fieldName);
     }
 
-    protected abstract String newUniqueBoundary();
-
-    protected abstract ContentDispositionField newContentDisposition(
-            String dispositionType, String filename, long size,
-            Date creationDate, Date modificationDate, Date readDate);
-
-    protected abstract ContentDispositionField newContentDisposition(
-            String dispositionType, Map<String, String> parameters);
-
-    protected abstract ContentTypeField newContentType(String mimeType,
-            Map<String, String> parameters);
-
-    protected abstract ContentTransferEncodingField newContentTransferEncoding(
-            String contentTransferEncoding);
-
     protected abstract String calcMimeType(ContentTypeField child, ContentTypeField parent);
 
     protected abstract String calcTransferEncoding(ContentTransferEncodingField f);
diff --git a/dom/src/main/java/org/apache/james/mime4j/message/AbstractMessage.java b/dom/src/main/java/org/apache/james/mime4j/message/AbstractMessage.java
index f043a06..170dd9f 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/AbstractMessage.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/AbstractMessage.java
@@ -19,15 +19,9 @@
 
 package org.apache.james.mime4j.message;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
 import java.util.Date;
-import java.util.TimeZone;
 
-import org.apache.james.mime4j.dom.Header;
 import org.apache.james.mime4j.dom.Message;
-import org.apache.james.mime4j.dom.address.Address;
 import org.apache.james.mime4j.dom.address.AddressList;
 import org.apache.james.mime4j.dom.address.Mailbox;
 import org.apache.james.mime4j.dom.address.MailboxList;
@@ -36,7 +30,6 @@
 import org.apache.james.mime4j.dom.field.FieldName;
 import org.apache.james.mime4j.dom.field.MailboxField;
 import org.apache.james.mime4j.dom.field.MailboxListField;
-import org.apache.james.mime4j.dom.field.ParsedField;
 import org.apache.james.mime4j.dom.field.UnstructuredField;
 import org.apache.james.mime4j.stream.Field;
 
@@ -60,23 +53,6 @@
     }
 
     /**
-     * Creates and sets a new <i>Message-ID</i> header field for this message.
-     * A <code>Header</code> is created if this message does not already have
-     * one.
-     *
-     * @param hostname
-     *            host name to be included in the identifier or
-     *            <code>null</code> if no host name should be included.
-     */
-    public void createMessageId(String hostname) {
-        Header header = obtainHeader();
-
-        header.setField(newMessageId(hostname));
-    }
-
-    protected abstract ParsedField newMessageId(String hostname);
-
-    /**
      * Returns the (decoded) value of the <i>Subject</i> header field of this
      * message or <code>null</code> if it is not present.
      *
@@ -91,26 +67,6 @@
     }
 
     /**
-     * Sets the <i>Subject</i> header field for this message. The specified
-     * string may contain non-ASCII characters, in which case it gets encoded as
-     * an 'encoded-word' automatically. A <code>Header</code> is created if
-     * this message does not already have one.
-     *
-     * @param subject
-     *            subject to set or <code>null</code> to remove the subject
-     *            header field.
-     */
-    public void setSubject(String subject) {
-        Header header = obtainHeader();
-
-        if (subject == null) {
-            header.removeFields(FieldName.SUBJECT);
-        } else {
-            header.setField(newSubject(subject));
-        }
-    }
-
-    /**
      * Returns the value of the <i>Date</i> header field of this message as
      * <code>Date</code> object or <code>null</code> if it is not present.
      *
@@ -125,40 +81,6 @@
     }
 
     /**
-     * Sets the <i>Date</i> header field for this message. This method uses the
-     * default <code>TimeZone</code> of this host to encode the specified
-     * <code>Date</code> object into a string.
-     *
-     * @param date
-     *            date to set or <code>null</code> to remove the date header
-     *            field.
-     */
-    public void setDate(Date date) {
-        setDate(date, null);
-    }
-
-    /**
-     * Sets the <i>Date</i> header field for this message. The specified
-     * <code>TimeZone</code> is used to encode the specified <code>Date</code>
-     * object into a string.
-     *
-     * @param date
-     *            date to set or <code>null</code> to remove the date header
-     *            field.
-     * @param zone
-     *            a time zone.
-     */
-    public void setDate(Date date, TimeZone zone) {
-        Header header = obtainHeader();
-
-        if (date == null) {
-            header.removeFields(FieldName.DATE);
-        } else {
-            header.setField(newDate(date, zone));
-        }
-    }
-
-    /**
      * Returns the value of the <i>Sender</i> header field of this message as
      * <code>Mailbox</code> object or <code>null</code> if it is not
      * present.
@@ -170,18 +92,6 @@
     }
 
     /**
-     * Sets the <i>Sender</i> header field of this message to the specified
-     * mailbox address.
-     *
-     * @param sender
-     *            address to set or <code>null</code> to remove the header
-     *            field.
-     */
-    public void setSender(Mailbox sender) {
-        setMailbox(FieldName.SENDER, sender);
-    }
-
-    /**
      * Returns the value of the <i>From</i> header field of this message as
      * <code>MailboxList</code> object or <code>null</code> if it is not
      * present.
@@ -193,42 +103,6 @@
     }
 
     /**
-     * Sets the <i>From</i> header field of this message to the specified
-     * mailbox address.
-     *
-     * @param from
-     *            address to set or <code>null</code> to remove the header
-     *            field.
-     */
-    public void setFrom(Mailbox from) {
-        setMailboxList(FieldName.FROM, from);
-    }
-
-    /**
-     * Sets the <i>From</i> header field of this message to the specified
-     * mailbox addresses.
-     *
-     * @param from
-     *            addresses to set or <code>null</code> or no arguments to
-     *            remove the header field.
-     */
-    public void setFrom(Mailbox... from) {
-        setMailboxList(FieldName.FROM, from);
-    }
-
-    /**
-     * Sets the <i>From</i> header field of this message to the specified
-     * mailbox addresses.
-     *
-     * @param from
-     *            addresses to set or <code>null</code> or an empty collection
-     *            to remove the header field.
-     */
-    public void setFrom(Collection<Mailbox> from) {
-        setMailboxList(FieldName.FROM, from);
-    }
-
-    /**
      * Returns the value of the <i>To</i> header field of this message as
      * <code>AddressList</code> object or <code>null</code> if it is not
      * present.
@@ -240,42 +114,6 @@
     }
 
     /**
-     * Sets the <i>To</i> header field of this message to the specified
-     * address.
-     *
-     * @param to
-     *            address to set or <code>null</code> to remove the header
-     *            field.
-     */
-    public void setTo(Address to) {
-        setAddressList(FieldName.TO, to);
-    }
-
-    /**
-     * Sets the <i>To</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param to
-     *            addresses to set or <code>null</code> or no arguments to
-     *            remove the header field.
-     */
-    public void setTo(Address... to) {
-        setAddressList(FieldName.TO, to);
-    }
-
-    /**
-     * Sets the <i>To</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param to
-     *            addresses to set or <code>null</code> or an empty collection
-     *            to remove the header field.
-     */
-    public void setTo(Collection<? extends Address> to) {
-        setAddressList(FieldName.TO, to);
-    }
-
-    /**
      * Returns the value of the <i>Cc</i> header field of this message as
      * <code>AddressList</code> object or <code>null</code> if it is not
      * present.
@@ -287,42 +125,6 @@
     }
 
     /**
-     * Sets the <i>Cc</i> header field of this message to the specified
-     * address.
-     *
-     * @param cc
-     *            address to set or <code>null</code> to remove the header
-     *            field.
-     */
-    public void setCc(Address cc) {
-        setAddressList(FieldName.CC, cc);
-    }
-
-    /**
-     * Sets the <i>Cc</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param cc
-     *            addresses to set or <code>null</code> or no arguments to
-     *            remove the header field.
-     */
-    public void setCc(Address... cc) {
-        setAddressList(FieldName.CC, cc);
-    }
-
-    /**
-     * Sets the <i>Cc</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param cc
-     *            addresses to set or <code>null</code> or an empty collection
-     *            to remove the header field.
-     */
-    public void setCc(Collection<? extends Address> cc) {
-        setAddressList(FieldName.CC, cc);
-    }
-
-    /**
      * Returns the value of the <i>Bcc</i> header field of this message as
      * <code>AddressList</code> object or <code>null</code> if it is not
      * present.
@@ -334,42 +136,6 @@
     }
 
     /**
-     * Sets the <i>Bcc</i> header field of this message to the specified
-     * address.
-     *
-     * @param bcc
-     *            address to set or <code>null</code> to remove the header
-     *            field.
-     */
-    public void setBcc(Address bcc) {
-        setAddressList(FieldName.BCC, bcc);
-    }
-
-    /**
-     * Sets the <i>Bcc</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param bcc
-     *            addresses to set or <code>null</code> or no arguments to
-     *            remove the header field.
-     */
-    public void setBcc(Address... bcc) {
-        setAddressList(FieldName.BCC, bcc);
-    }
-
-    /**
-     * Sets the <i>Bcc</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param bcc
-     *            addresses to set or <code>null</code> or an empty collection
-     *            to remove the header field.
-     */
-    public void setBcc(Collection<? extends Address> bcc) {
-        setAddressList(FieldName.BCC, bcc);
-    }
-
-    /**
      * Returns the value of the <i>Reply-To</i> header field of this message as
      * <code>AddressList</code> object or <code>null</code> if it is not
      * present.
@@ -380,42 +146,6 @@
         return getAddressList(FieldName.REPLY_TO);
     }
 
-    /**
-     * Sets the <i>Reply-To</i> header field of this message to the specified
-     * address.
-     *
-     * @param replyTo
-     *            address to set or <code>null</code> to remove the header
-     *            field.
-     */
-    public void setReplyTo(Address replyTo) {
-        setAddressList(FieldName.REPLY_TO, replyTo);
-    }
-
-    /**
-     * Sets the <i>Reply-To</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param replyTo
-     *            addresses to set or <code>null</code> or no arguments to
-     *            remove the header field.
-     */
-    public void setReplyTo(Address... replyTo) {
-        setAddressList(FieldName.REPLY_TO, replyTo);
-    }
-
-    /**
-     * Sets the <i>Reply-To</i> header field of this message to the specified
-     * addresses.
-     *
-     * @param replyTo
-     *            addresses to set or <code>null</code> or an empty collection
-     *            to remove the header field.
-     */
-    public void setReplyTo(Collection<? extends Address> replyTo) {
-        setAddressList(FieldName.REPLY_TO, replyTo);
-    }
-
     private Mailbox getMailbox(String fieldName) {
         MailboxField field = obtainField(fieldName);
         if (field == null)
@@ -424,16 +154,6 @@
         return field.getMailbox();
     }
 
-    private void setMailbox(String fieldName, Mailbox mailbox) {
-        Header header = obtainHeader();
-
-        if (mailbox == null) {
-            header.removeFields(fieldName);
-        } else {
-            header.setField(newMailbox(fieldName, mailbox));
-        }
-    }
-
     private MailboxList getMailboxList(String fieldName) {
         MailboxListField field = obtainField(fieldName);
         if (field == null)
@@ -442,26 +162,6 @@
         return field.getMailboxList();
     }
 
-    private void setMailboxList(String fieldName, Mailbox mailbox) {
-        setMailboxList(fieldName, mailbox == null ? null : Collections
-                .singleton(mailbox));
-    }
-
-    private void setMailboxList(String fieldName, Mailbox... mailboxes) {
-        setMailboxList(fieldName, mailboxes == null ? null : Arrays
-                .asList(mailboxes));
-    }
-
-    private void setMailboxList(String fieldName, Collection<Mailbox> mailboxes) {
-        Header header = obtainHeader();
-
-        if (mailboxes == null || mailboxes.isEmpty()) {
-            header.removeFields(fieldName);
-        } else {
-            header.setField(newMailboxList(fieldName, mailboxes));
-        }
-    }
-
     private AddressList getAddressList(String fieldName) {
         AddressListField field = obtainField(fieldName);
         if (field == null)
@@ -470,35 +170,4 @@
         return field.getAddressList();
     }
 
-    private void setAddressList(String fieldName, Address address) {
-        setAddressList(fieldName, address == null ? null : Collections
-                .singleton(address));
-    }
-
-    private void setAddressList(String fieldName, Address... addresses) {
-        setAddressList(fieldName, addresses == null ? null : Arrays
-                .asList(addresses));
-    }
-
-    private void setAddressList(String fieldName, Collection<? extends Address> addresses) {
-        Header header = obtainHeader();
-
-        if (addresses == null || addresses.isEmpty()) {
-            header.removeFields(fieldName);
-        } else {
-            header.setField(newAddressList(fieldName, addresses));
-        }
-    }
-
-    protected abstract AddressListField newAddressList(String fieldName, Collection<? extends Address> addresses);
-
-    protected abstract UnstructuredField newSubject(String subject);
-
-    protected abstract DateTimeField newDate(Date date, TimeZone zone);
-
-    protected abstract MailboxField newMailbox(String fieldName, Mailbox mailbox);
-
-    protected abstract MailboxListField newMailboxList(String fieldName, Collection<Mailbox> mailboxes);
-
-
 }
diff --git a/dom/src/main/java/org/apache/james/mime4j/message/BodyPart.java b/dom/src/main/java/org/apache/james/mime4j/message/BodyPart.java
index 9f6ec2a..f1f945a 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/BodyPart.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/BodyPart.java
@@ -19,16 +19,10 @@
 
 package org.apache.james.mime4j.message;
 
-import java.util.Date;
-import java.util.Map;
-
-import org.apache.james.mime4j.dom.field.ContentDispositionField;
 import org.apache.james.mime4j.dom.field.ContentTransferEncodingField;
 import org.apache.james.mime4j.dom.field.ContentTypeField;
 import org.apache.james.mime4j.field.ContentTransferEncodingFieldImpl;
 import org.apache.james.mime4j.field.ContentTypeFieldImpl;
-import org.apache.james.mime4j.field.Fields;
-import org.apache.james.mime4j.util.MimeUtil;
 
 /**
  * A MIME body part (as defined in RFC 2045).
@@ -42,37 +36,6 @@
     }
 
     @Override
-    protected String newUniqueBoundary() {
-        return MimeUtil.createUniqueBoundary();
-    }
-
-    @Override
-    protected ContentDispositionField newContentDisposition(
-            String dispositionType, String filename, long size,
-            Date creationDate, Date modificationDate, Date readDate) {
-        return Fields.contentDisposition(dispositionType, filename, size,
-                creationDate, modificationDate, readDate);
-    }
-
-    @Override
-    protected ContentDispositionField newContentDisposition(
-            String dispositionType, Map<String, String> parameters) {
-        return Fields.contentDisposition(dispositionType, parameters);
-    }
-
-    @Override
-    protected ContentTypeField newContentType(String mimeType,
-            Map<String, String> parameters) {
-        return Fields.contentType(mimeType, parameters);
-    }
-
-    @Override
-    protected ContentTransferEncodingField newContentTransferEncoding(
-            String contentTransferEncoding) {
-        return Fields.contentTransferEncoding(contentTransferEncoding);
-    }
-
-    @Override
     protected String calcTransferEncoding(ContentTransferEncodingField f) {
         return ContentTransferEncodingFieldImpl.getEncoding(f);
     }
diff --git a/dom/src/main/java/org/apache/james/mime4j/message/MessageImpl.java b/dom/src/main/java/org/apache/james/mime4j/message/MessageImpl.java
index e23abe5..cab7678 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/MessageImpl.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/MessageImpl.java
@@ -19,31 +19,16 @@
 
 package org.apache.james.mime4j.message;
 
-import java.util.Collection;
-import java.util.Date;
-import java.util.Map;
-import java.util.TimeZone;
-
 import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.dom.Header;
 import org.apache.james.mime4j.dom.Message;
-import org.apache.james.mime4j.dom.address.Address;
-import org.apache.james.mime4j.dom.address.Mailbox;
-import org.apache.james.mime4j.dom.field.AddressListField;
-import org.apache.james.mime4j.dom.field.ContentDispositionField;
 import org.apache.james.mime4j.dom.field.ContentTransferEncodingField;
 import org.apache.james.mime4j.dom.field.ContentTypeField;
-import org.apache.james.mime4j.dom.field.DateTimeField;
 import org.apache.james.mime4j.dom.field.FieldName;
-import org.apache.james.mime4j.dom.field.MailboxField;
-import org.apache.james.mime4j.dom.field.MailboxListField;
-import org.apache.james.mime4j.dom.field.UnstructuredField;
 import org.apache.james.mime4j.field.ContentTransferEncodingFieldImpl;
 import org.apache.james.mime4j.field.ContentTypeFieldImpl;
-import org.apache.james.mime4j.field.Fields;
 import org.apache.james.mime4j.field.MimeVersionFieldLenientImpl;
 import org.apache.james.mime4j.stream.RawField;
-import org.apache.james.mime4j.util.MimeUtil;
 
 /**
  * Default implementation of {@link Message}.
@@ -61,69 +46,6 @@
     }
 
     @Override
-    protected String newUniqueBoundary() {
-        return MimeUtil.createUniqueBoundary();
-    }
-
-    @Override
-    protected UnstructuredField newMessageId(String hostname) {
-        return Fields.generateMessageId(hostname);
-    }
-
-    @Override
-    protected DateTimeField newDate(Date date, TimeZone zone) {
-        return Fields.date(FieldName.DATE, date, zone);
-    }
-
-    @Override
-    protected MailboxField newMailbox(String fieldName, Mailbox mailbox) {
-        return Fields.mailbox(fieldName, mailbox);
-    }
-
-    @Override
-    protected MailboxListField newMailboxList(String fieldName,
-            Collection<Mailbox> mailboxes) {
-        return Fields.mailboxList(fieldName, mailboxes);
-    }
-
-    @Override
-    protected AddressListField newAddressList(String fieldName,
-            Collection<? extends Address> addresses) {
-        return Fields.addressList(fieldName, addresses);
-    }
-
-    @Override
-    protected UnstructuredField newSubject(String subject) {
-        return Fields.subject(subject);
-    }
-
-    @Override
-    protected ContentDispositionField newContentDisposition(
-            String dispositionType, String filename, long size,
-            Date creationDate, Date modificationDate, Date readDate) {
-        return Fields.contentDisposition(dispositionType, filename, size,
-                creationDate, modificationDate, readDate);
-    }
-
-    @Override
-    protected ContentDispositionField newContentDisposition(
-            String dispositionType, Map<String, String> parameters) {
-        return Fields.contentDisposition(dispositionType, parameters);
-    }
-
-    @Override
-    protected ContentTypeField newContentType(String mimeType,
-            Map<String, String> parameters) {
-        return Fields.contentType(mimeType, parameters);
-    }
-
-    @Override
-    protected ContentTransferEncodingField newContentTransferEncoding(
-            String contentTransferEncoding) {
-        return Fields.contentTransferEncoding(contentTransferEncoding);
-    }
-
-    @Override
     protected String calcTransferEncoding(ContentTransferEncodingField f) {
         return ContentTransferEncodingFieldImpl.getEncoding(f);
     }
diff --git a/dom/src/test/java/org/apache/james/mime4j/dom/EntityTest.java b/dom/src/test/java/org/apache/james/mime4j/dom/EntityTest.java
index 70260d6..7900963 100644
--- a/dom/src/test/java/org/apache/james/mime4j/dom/EntityTest.java
+++ b/dom/src/test/java/org/apache/james/mime4j/dom/EntityTest.java
@@ -83,26 +83,6 @@
     }
 
     @Test
-    public void testSetContentDispositionType() throws Exception {
-        BodyPart entity = new BodyPart();
-
-        entity.setContentDisposition("attachment");
-
-        Assert.assertEquals("attachment", entity.getHeader().getField(
-                "Content-Disposition").getBody());
-    }
-
-    @Test
-    public void testSetContentDispositionTypeFilename() throws Exception {
-        BodyPart entity = new BodyPart();
-
-        entity.setContentDisposition("attachment", "some file.dat");
-
-        Assert.assertEquals("attachment; filename=\"some file.dat\"", entity
-                .getHeader().getField("Content-Disposition").getBody());
-    }
-
-    @Test
     public void testGetFilename() throws Exception {
         BodyPart entity = new BodyPart();
 
@@ -116,19 +96,4 @@
         Assert.assertEquals("some file.dat", entity.getFilename());
     }
 
-    @Test
-    public void testSetFilename() throws Exception {
-        BodyPart entity = new BodyPart();
-
-        entity.setFilename("file name.ext");
-
-        Assert.assertEquals("attachment; filename=\"file name.ext\"", entity
-                .getHeader().getField("Content-Disposition").getBody());
-
-        entity.setFilename(null);
-
-        Assert.assertEquals("attachment", entity.getHeader().getField(
-                "Content-Disposition").getBody());
-    }
-
 }
diff --git a/dom/src/test/java/org/apache/james/mime4j/dom/MessageTest.java b/dom/src/test/java/org/apache/james/mime4j/dom/MessageTest.java
index 857d722..d495a95 100644
--- a/dom/src/test/java/org/apache/james/mime4j/dom/MessageTest.java
+++ b/dom/src/test/java/org/apache/james/mime4j/dom/MessageTest.java
@@ -1,31 +1,38 @@
 /****************************************************************
- * 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.                                           *
- ****************************************************************/
+* 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.dom;
 
+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.util.Date;
+import java.util.List;
+
 import org.apache.commons.io.IOUtils;
-import org.apache.james.mime4j.dom.address.Group;
 import org.apache.james.mime4j.dom.address.Mailbox;
 import org.apache.james.mime4j.dom.field.FieldName;
 import org.apache.james.mime4j.dom.field.MimeVersionField;
 import org.apache.james.mime4j.field.DefaultFieldParser;
-import org.apache.james.mime4j.field.address.AddressBuilder;
 import org.apache.james.mime4j.message.BodyPart;
 import org.apache.james.mime4j.message.DefaultMessageBuilder;
 import org.apache.james.mime4j.message.DefaultMessageWriter;
@@ -36,17 +43,6 @@
 import org.junit.Before;
 import org.junit.Test;
 
-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.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.TimeZone;
-
 public class MessageTest {
     private Header headerTextPlain = null;
     private Header headerMessageRFC822 = null;
@@ -203,17 +199,6 @@
     }
 
     @Test
-    public void testCreateMessageId() throws Exception {
-        MessageImpl m = new MessageImpl();
-        m.createMessageId("hostname");
-
-        String id = m.getMessageId();
-        Assert.assertNotNull(id);
-        Assert.assertTrue(id.startsWith("<Mime4j."));
-        Assert.assertTrue(id.endsWith("@hostname>"));
-    }
-
-    @Test
     public void testGetSubject() throws Exception {
         MessageImpl m = new MessageImpl();
         Assert.assertNull(m.getSubject());
@@ -229,19 +214,6 @@
     }
 
     @Test
-    public void testSetSubject() throws Exception {
-        MessageImpl m = new MessageImpl();
-
-        m.setSubject("Semmelbr\366sel");
-        Assert.assertEquals("Semmelbr\366sel", m.getSubject());
-        Assert.assertEquals("=?ISO-8859-1?Q?Semmelbr=F6sel?=", m.getHeader().getField(
-                "Subject").getBody());
-
-        m.setSubject(null);
-        Assert.assertNull(m.getHeader().getField("Subject"));
-    }
-
-    @Test
     public void testGetDate() throws Exception {
         MessageImpl m = new MessageImpl();
         Assert.assertNull(m.getDate());
@@ -254,19 +226,6 @@
     }
 
     @Test
-    public void testSetDate() throws Exception {
-        MessageImpl m = new MessageImpl();
-
-        m.setDate(new Date(86400000), TimeZone.getTimeZone("GMT"));
-        Assert.assertEquals(new Date(86400000), m.getDate());
-        Assert.assertEquals("Fri, 2 Jan 1970 00:00:00 +0000", m.getHeader().getField(
-                "Date").getBody());
-
-        m.setDate(null);
-        Assert.assertNull(m.getHeader().getField("Date"));
-    }
-
-    @Test
     public void testGetSender() throws Exception {
         MessageImpl m = new MessageImpl();
         Assert.assertNull(m.getSender());
@@ -279,18 +238,6 @@
     }
 
     @Test
-    public void testSetSender() throws Exception {
-        MessageImpl m = new MessageImpl();
-
-        m.setSender(AddressBuilder.DEFAULT.parseMailbox("john.doe@example.net"));
-        Assert.assertEquals("john.doe@example.net", m.getHeader().getField("Sender")
-                .getBody());
-
-        m.setSender(null);
-        Assert.assertNull(m.getHeader().getField("Sender"));
-    }
-
-    @Test
     public void testGetFrom() throws Exception {
         MessageImpl m = new MessageImpl();
         Assert.assertNull(m.getFrom());
@@ -303,29 +250,6 @@
     }
 
     @Test
-    public void testSetFrom() throws Exception {
-        MessageImpl m = new MessageImpl();
-
-        Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("john.doe@example.net");
-        Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.net");
-
-        m.setFrom(mailbox1);
-        Assert.assertEquals("john.doe@example.net", m.getHeader().getField("From")
-                .getBody());
-
-        m.setFrom(mailbox1, mailbox2);
-        Assert.assertEquals("john.doe@example.net, jane.doe@example.net", m
-                .getHeader().getField("From").getBody());
-
-        m.setFrom(Arrays.asList(mailbox1, mailbox2));
-        Assert.assertEquals("john.doe@example.net, jane.doe@example.net", m
-                .getHeader().getField("From").getBody());
-
-        m.setFrom((Mailbox) null);
-        Assert.assertNull(m.getHeader().getField("From"));
-    }
-
-    @Test
     public void testGetTo() throws Exception {
         MessageImpl m = new MessageImpl();
         Assert.assertNull(m.getTo());
@@ -339,33 +263,6 @@
     }
 
     @Test
-    public void testSetTo() throws Exception {
-        MessageImpl m = new MessageImpl();
-
-        Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("john.doe@example.net");
-        Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.net");
-        Group group = new Group("Does", mailbox1, mailbox2);
-        Mailbox mailbox3 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith <mary@example.net>");
-
-        m.setTo(group);
-        Assert.assertEquals("Does: john.doe@example.net, jane.doe@example.net;", m
-                .getHeader().getField("To").getBody());
-
-        m.setTo(group, mailbox3);
-        Assert.assertEquals("Does: john.doe@example.net, jane.doe@example.net;, "
-                + "Mary Smith <mary@example.net>", m.getHeader().getField("To")
-                .getBody());
-
-        m.setTo(Arrays.asList(group, mailbox3));
-        Assert.assertEquals("Does: john.doe@example.net, jane.doe@example.net;, "
-                + "Mary Smith <mary@example.net>", m.getHeader().getField("To")
-                .getBody());
-
-        m.setTo((Mailbox) null);
-        Assert.assertNull(m.getHeader().getField("To"));
-    }
-
-    @Test
     public void testGetCc() throws Exception {
         MessageImpl m = new MessageImpl();
         Assert.assertNull(m.getCc());
@@ -379,33 +276,6 @@
     }
 
     @Test
-    public void testSetCc() throws Exception {
-        MessageImpl m = new MessageImpl();
-
-        Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("john.doe@example.net");
-        Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.net");
-        Group group = new Group("Does", mailbox1, mailbox2);
-        Mailbox mailbox3 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith <mary@example.net>");
-
-        m.setCc(group);
-        Assert.assertEquals("Does: john.doe@example.net, jane.doe@example.net;", m
-                .getHeader().getField("Cc").getBody());
-
-        m.setCc(group, mailbox3);
-        Assert.assertEquals("Does: john.doe@example.net, jane.doe@example.net;, "
-                + "Mary Smith <mary@example.net>", m.getHeader().getField("Cc")
-                .getBody());
-
-        m.setCc(Arrays.asList(group, mailbox3));
-        Assert.assertEquals("Does: john.doe@example.net, jane.doe@example.net;, "
-                + "Mary Smith <mary@example.net>", m.getHeader().getField("Cc")
-                .getBody());
-
-        m.setCc((Mailbox) null);
-        Assert.assertNull(m.getHeader().getField("Cc"));
-    }
-
-    @Test
     public void testGetBcc() throws Exception {
         MessageImpl m = new MessageImpl();
         Assert.assertNull(m.getBcc());
@@ -419,33 +289,6 @@
     }
 
     @Test
-    public void testSetBcc() throws Exception {
-        MessageImpl m = new MessageImpl();
-
-        Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("john.doe@example.net");
-        Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.net");
-        Group group = new Group("Does", mailbox1, mailbox2);
-        Mailbox mailbox3 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith <mary@example.net>");
-
-        m.setBcc(group);
-        Assert.assertEquals("Does: john.doe@example.net, jane.doe@example.net;", m
-                .getHeader().getField("Bcc").getBody());
-
-        m.setBcc(group, mailbox3);
-        Assert.assertEquals("Does: john.doe@example.net, jane.doe@example.net;, "
-                + "Mary Smith <mary@example.net>", m.getHeader()
-                .getField("Bcc").getBody());
-
-        m.setBcc(Arrays.asList(group, mailbox3));
-        Assert.assertEquals("Does: john.doe@example.net, jane.doe@example.net;, "
-                + "Mary Smith <mary@example.net>", m.getHeader()
-                .getField("Bcc").getBody());
-
-        m.setBcc((Mailbox) null);
-        Assert.assertNull(m.getHeader().getField("Bcc"));
-    }
-
-    @Test
     public void testGetReplyTo() throws Exception {
         MessageImpl m = new MessageImpl();
         Assert.assertNull(m.getReplyTo());
@@ -459,33 +302,6 @@
     }
 
     @Test
-    public void testSetReplyTo() throws Exception {
-        MessageImpl m = new MessageImpl();
-
-        Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("john.doe@example.net");
-        Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.net");
-        Group group = new Group("Does", mailbox1, mailbox2);
-        Mailbox mailbox3 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith <mary@example.net>");
-
-        m.setReplyTo(group);
-        Assert.assertEquals("Does: john.doe@example.net, jane.doe@example.net;", m
-                .getHeader().getField("Reply-To").getBody());
-
-        m.setReplyTo(group, mailbox3);
-        Assert.assertEquals("Does: john.doe@example.net, jane.doe@example.net;, "
-                + "Mary Smith <mary@example.net>", m.getHeader().getField(
-                "Reply-To").getBody());
-
-        m.setReplyTo(Arrays.asList(group, mailbox3));
-        Assert.assertEquals("Does: john.doe@example.net, jane.doe@example.net;, "
-                + "Mary Smith <mary@example.net>", m.getHeader().getField(
-                "Reply-To").getBody());
-
-        m.setReplyTo((Mailbox) null);
-        Assert.assertNull(m.getHeader().getField("Reply-To"));
-    }
-
-    @Test
     public void testDisposeGetsPropagatedToBody() throws Exception {
         DummyBody body1 = new DummyBody();
         BodyPart part1 = new BodyPart();
