http://git-wip-us.apache.org/repos/asf/james-mime4j/blob/5c583037/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
----------------------------------------------------------------------
diff --git 
a/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java 
b/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
index 138331a..50a554b 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
@@ -19,978 +19,498 @@
 
 package org.apache.james.mime4j.message;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.TimeZone;
-
-import org.apache.james.mime4j.MimeException;
-import org.apache.james.mime4j.MimeIOException;
 import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.dom.BinaryBody;
 import org.apache.james.mime4j.dom.Body;
 import org.apache.james.mime4j.dom.FieldParser;
-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.SingleBody;
 import org.apache.james.mime4j.dom.TextBody;
 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;
-import org.apache.james.mime4j.dom.field.AddressListField;
-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.ParseException;
-import org.apache.james.mime4j.dom.field.UnstructuredField;
-import org.apache.james.mime4j.field.DefaultFieldParser;
-import org.apache.james.mime4j.field.Fields;
-import org.apache.james.mime4j.field.LenientFieldParser;
-import org.apache.james.mime4j.field.address.DefaultAddressParser;
-import org.apache.james.mime4j.io.InputStreams;
-import org.apache.james.mime4j.parser.MimeStreamParser;
+import org.apache.james.mime4j.dom.field.ParsedField;
 import org.apache.james.mime4j.stream.BodyDescriptorBuilder;
 import org.apache.james.mime4j.stream.Field;
 import org.apache.james.mime4j.stream.MimeConfig;
 import org.apache.james.mime4j.stream.NameValuePair;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.TimeZone;
+
 /**
- * {@link org.apache.james.mime4j.dom.Message} builder.
+ * Deprecated: please use {@link org.apache.james.mime4j.dom.Message.Builder 
Message.Builder} instead
+ * This builder will create message that do not respect the
+ * <code>Message.getDate()</code> contract regarding the return
+ * value when the message do not have a Date header
+ * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
  */
-public class MessageBuilder extends AbstractEntityBuilder {
-
-    private MimeConfig config;
-    private DecodeMonitor monitor;
-    private BodyDescriptorBuilder bodyDescBuilder;
-    private FieldParser<?> fieldParser;
-    private BodyFactory bodyFactory;
-    private boolean flatMode;
-    private boolean rawContent;
-    private final boolean ensureDateNotNull;
-
-    /**
-     * Deprecated: please use {@link #of() of} instead
-     * Building a builder using this method will result in a buggy builder 
which
-     * will create message that do not respect the 
<code>Message.getDate()</code> contract regarding
-     * the return value when the message do not have a Date header
-     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
-     */
-    @Deprecated
-    public MessageBuilder() {
-        this(true);
-    }
+@Deprecated
+@SuppressWarnings("deprecation")
+public class MessageBuilder {
+    private final Message.Builder builder;
 
-    private MessageBuilder(boolean ensureDateNotNull) {
-        this.ensureDateNotNull = ensureDateNotNull;
+    public MessageBuilder() {
+        this(Message.Builder.of());
     }
 
-    public static MessageBuilder of() {
-        return new MessageBuilder(false);
+    private MessageBuilder(Message.Builder builder) {
+        this.builder = builder;
     }
 
-    /**
-     * Deprecated: please use {@link #of() of} instead
-     * Building a builder using this method will result in a buggy builder 
which
-     * will create message that do not respect the 
<code>Message.getDate()</code> contract regarding
-     * the return value when the message do not have a Date header
-     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
-     */
-    @Deprecated
     public static MessageBuilder create() {
-        return new MessageBuilder(true);
+        return new MessageBuilder();
     }
 
-    public static MessageBuilder of(Message other) {
-        return new MessageBuilder(false).copy(other);
-    }
-
-    /**
-     * Deprecated: please use {@link #of(Message) of} instead
-     * Building a builder using this method will result in a buggy builder 
which
-     * will create message that do not respect the 
<code>Message.getDate()</code> contract regarding
-     * the return value when the message do not have a Date header
-     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
-     */
-    @Deprecated
     public static MessageBuilder createCopy(Message other) {
-        return new MessageBuilder().copy(other);
+        return new MessageBuilder(Message.Builder.of(other));
     }
 
-    public static MessageBuilder of(final InputStream is) throws IOException {
-        return new MessageBuilder(false).parse(is);
+    public static MessageBuilder read(InputStream is) throws IOException {
+        return new MessageBuilder(Message.Builder.of(is));
     }
 
-    /**
-     * Deprecated: please use {@link #of(InputStream) of} instead
-     * Building a builder using this method will result in a buggy builder 
which
-     * will create message that do not respect the 
<code>Message.getDate()</code> contract regarding
-     * the return value when the message do not have a Date header
-     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
-     */
-    @Deprecated
-    public static MessageBuilder read(final InputStream is) throws IOException 
{
-        return new MessageBuilder().parse(is);
-    }
 
-    /**
-     * Sets MIME configuration.
-     *
-     * @param config the configuration.
-     */
-    public MessageBuilder use(MimeConfig config) {
-        this.config = config;
-        return this;
-    }
+    public MessageBuilder enableFlatMode() {
+        builder.enableFlatMode();
 
-    /**
-     * Sets {@link org.apache.james.mime4j.codec.DecodeMonitor} that will be
-     * used to handle malformed data when executing {@link 
#parse(java.io.InputStream)}.
-     *
-     * @param monitor the decoder monitor.
-     */
-    public MessageBuilder use(DecodeMonitor monitor) {
-        this.monitor = monitor;
         return this;
     }
 
-    /**
-     * Sets {@link org.apache.james.mime4j.stream.BodyDescriptorBuilder} that 
will be
-     * used to generate body descriptors when executing {@link 
#parse(java.io.InputStream)}.
-     *
-     * @param bodyDescBuilder the body descriptor builder.
-     */
-    public MessageBuilder use(BodyDescriptorBuilder bodyDescBuilder) {
-        this.bodyDescBuilder = bodyDescBuilder;
+    public MessageBuilder disableFlatMode() {
+        builder.disableFlatMode();
+
         return this;
     }
 
-    /**
-     * Sets {@link org.apache.james.mime4j.dom.FieldParser} that will be
-     * used to generate parse message fields when executing {@link 
#parse(java.io.InputStream)}.
-     *
-     * @param fieldParser the field parser.
-     */
-    public MessageBuilder use(FieldParser<?> fieldParser) {
-        this.fieldParser = fieldParser;
+    public MessageBuilder enableContentDecoding() {
+        builder.enableContentDecoding();
+
         return this;
     }
 
-    /**
-     * Sets {@link org.apache.james.mime4j.message.BodyFactory} that will be
-     * used to generate message body.
-     *
-     * @param bodyFactory the body factory.
-     */
-    public MessageBuilder use(BodyFactory bodyFactory) {
-        this.bodyFactory = bodyFactory;
+    public MessageBuilder disableContentDecoding() {
+        builder.disableContentDecoding();
+
         return this;
     }
 
-    /**
-     * Enables flat parsing mode for {@link #parse(java.io.InputStream)} 
operation.
-     */
-    public MessageBuilder enableFlatMode() {
-        this.flatMode = true;
+    public MessageBuilder setField(Field field) {
+        builder.setField(field);
+
         return this;
     }
 
-    /**
-     * Disables flat parsing mode for {@link #parse(java.io.InputStream)} 
operation.
-     */
-    public MessageBuilder disableFlatMode() {
-        this.flatMode = false;
+    public MessageBuilder addField(Field field) {
+        builder.addField(field);
+
         return this;
     }
 
-    /**
-     * Enables automatic content decoding for {@link 
#parse(java.io.InputStream)} operation.
-     */
-    public MessageBuilder enableContentDecoding() {
-        this.rawContent = false;
-        return this;
+    public Field getField(String name) {
+        return builder.getField(name);
     }
 
-    /**
-     * Enables disable content decoding for {@link 
#parse(java.io.InputStream)} operation.
-     */
-    public MessageBuilder disableContentDecoding() {
-        this.rawContent = true;
-        return this;
+    public <F extends Field> F getField(final String name, final Class<F> 
clazz) {
+        return builder.getField(name, clazz);
     }
 
-    @Override
-    public MessageBuilder setField(Field field) {
-        super.setField(field);
-        return this;
+    public List<Field> getFields() {
+        return builder.getFields();
     }
 
-    @Override
-    public MessageBuilder addField(Field field) {
-        super.addField(field);
-        return this;
+    public <F extends Field> List<F> getFields(final String name, final 
Class<F> clazz) {
+        return builder.getFields(name, clazz);
     }
 
-    @Override
     public MessageBuilder removeFields(String name) {
-        super.removeFields(name);
+        builder.removeFields(name);
+
         return this;
     }
 
-    @Override
     public MessageBuilder clearFields() {
-        super.clearFields();
+        builder.clearFields();
+
         return this;
     }
 
-    @Override
-    public MessageBuilder setContentTransferEncoding(String 
contentTransferEncoding) {
-        super.setContentTransferEncoding(contentTransferEncoding);
-        return this;
+    public boolean containsField(String name) {
+        return builder.containsField(name);
+    }
+
+    public String getMimeType() {
+        return builder.getMimeType();
+    }
+
+    public String getCharset() {
+        return builder.getCharset();
+    }
+
+    public String getContentTransferEncoding() {
+        return builder.getContentTransferEncoding();
     }
 
-    @Override
     public MessageBuilder setContentType(String mimeType, NameValuePair... 
parameters) {
-        super.setContentType(mimeType, parameters);
+        builder.setContentType(mimeType, parameters);
+
+        return this;
+    }
+
+    public MessageBuilder setContentTransferEncoding(String 
contentTransferEncoding) {
+        builder.setContentTransferEncoding(contentTransferEncoding);
+
         return this;
     }
 
-    @Override
+    public String getDispositionType() {
+        return builder.getDispositionType();
+    }
+
     public MessageBuilder setContentDisposition(String dispositionType) {
-        super.setContentDisposition(dispositionType);
+        builder.setContentDisposition(dispositionType);
+
         return this;
     }
 
-    @Override
     public MessageBuilder setContentDisposition(String dispositionType, String 
filename) {
-        super.setContentDisposition(dispositionType, filename);
+        builder.setContentDisposition(dispositionType, filename);
+
         return this;
     }
 
-    @Override
     public MessageBuilder setContentDisposition(String dispositionType, String 
filename, long size) {
-        super.setContentDisposition(dispositionType, filename, size);
+        builder.setContentDisposition(dispositionType, filename, size);
+
+        return this;
+    }
+
+    public MessageBuilder setContentDisposition(String dispositionType, String 
filename, long size, Date creationDate, Date modificationDate, Date readDate) {
+        builder.setContentDisposition(dispositionType, filename, size, 
creationDate, modificationDate, readDate);
+
         return this;
     }
 
-    @Override
-    public MessageBuilder setContentDisposition(String dispositionType, String 
filename, long size,
-                                                Date creationDate, Date 
modificationDate, Date readDate) {
-        super.setContentDisposition(dispositionType, filename, size, 
creationDate, modificationDate, readDate);
+    public Body getBody() {
+        return builder.getBody();
+    }
+
+    public MessageBuilder setBody(Multipart multipart) {
+        builder.setBody(multipart);
+
+        return this;
+    }
+
+    public MessageBuilder setBody(Message message) {
+        builder.setBody(message);
+
         return this;
     }
 
-    @Override
     public MessageBuilder setBody(Body body) {
-        super.setBody(body);
+        builder.setBody(body);
+
         return this;
     }
 
-    @Override
     public MessageBuilder setBody(TextBody textBody) {
-        super.setBody(textBody);
+        builder.setBody(textBody);
+
         return this;
     }
 
-    @Override
     public MessageBuilder setBody(BinaryBody binaryBody) {
-        super.setBody(binaryBody);
+        builder.setBody(binaryBody);
+
         return this;
     }
 
-    @Override
-    public MessageBuilder setBody(Multipart multipart) {
-        super.setBody(multipart);
+    public MessageBuilder setBody(String text, Charset charset) throws 
IOException {
+        builder.setBody(text, charset);
+
         return this;
     }
 
-    @Override
-    public MessageBuilder setBody(Message message) {
-        super.setBody(message);
+    public MessageBuilder setBody(String text, String subtype, Charset 
charset) throws IOException {
+        builder.setBody(text, subtype, charset);
+
         return this;
     }
 
-    /**
-     * Sets text of this message with the charset.
-     *
-     * @param text
-     *            the text.
-     * @param charset
-     *            the charset of the text.
-     */
-    public MessageBuilder setBody(String text, Charset charset) throws 
IOException {
-        return setBody(text, null, charset);
-    }
-
-    /**
-     * Sets text of this message with the given MIME subtype and charset.
-     *
-     * @param text
-     *            the text.
-     * @param charset
-     *            the charset of the text.
-     * @param subtype
-     *            the text subtype (e.g. &quot;plain&quot;, &quot;html&quot; or
-     *            &quot;xml&quot;).
-     */
-    public MessageBuilder setBody(String text, String subtype, Charset 
charset) throws IOException {
-        String mimeType = "text/" + (subtype != null ? subtype : "plain");
-        if (charset != null) {
-            setField(Fields.contentType(mimeType, new NameValuePair("charset", 
charset.name())));
-        } else {
-            setField(Fields.contentType(mimeType));
-        }
-        Body textBody;
-        if (bodyFactory != null) {
-            textBody = bodyFactory.textBody(
-                    InputStreams.create(text, charset),
-                    charset != null ? charset.name() : null);
-        } else {
-            textBody = BasicBodyFactory.INSTANCE.textBody(text, charset);
-        }
-        return setBody(textBody);
-    }
-
-    /**
-     * Sets binary content of this message with the given MIME type.
-     *
-     * @param bin
-     *            the body.
-     * @param mimeType
-     *            the MIME media type of the specified body
-     *            (&quot;type/subtype&quot;).
-     */
     public MessageBuilder setBody(byte[] bin, String mimeType) throws 
IOException {
-        setField(Fields.contentType(mimeType != null ? mimeType : 
"application/octet-stream"));
-        Body binBody;
-        if (bodyFactory != null) {
-            binBody = bodyFactory.binaryBody(InputStreams.create(bin));
-        } else {
-            binBody = BasicBodyFactory.INSTANCE.binaryBody(bin);
-        }
-        return setBody(binBody);
+        builder.setBody(bin, mimeType);
+
+        return this;
+    }
+
+
+    public String getFilename() {
+        return builder.getFilename();
+    }
+
+    public long getSize() {
+        return builder.getSize();
+    }
+
+    public Date getCreationDate() {
+        return builder.getCreationDate();
+    }
+
+    public Date getModificationDate() {
+        return builder.getModificationDate();
+    }
+
+    public Date getReadDate() {
+        return getReadDate();
     }
 
-    /**
-     * Returns the value of the <i>Message-ID</i> header field of this message
-     * or <code>null</code> if it is not present.
-     *
-     * @return the identifier of this message.
-     */
     public String getMessageId() {
-        Field field = obtainField(FieldName.MESSAGE_ID);
-        return field != null ? field.getBody() : null;
+        return builder.getMessageId();
     }
 
-    /**
-     * Generates and sets message ID for this message.
-     *
-     * @param hostname
-     *            host name to be included in the identifier or
-     *            <code>null</code> if no host name should be included.
-     */
-    public MessageBuilder generateMessageId(String hostname) {
-        if (hostname == null) {
-            removeFields(FieldName.MESSAGE_ID);
-        } else {
-            setField(Fields.generateMessageId(hostname));
-        }
+    public MessageBuilder setMessageId(String messageId) {
+        builder.setMessageId(messageId);
+
         return this;
     }
 
-    /**
-     * Sets message ID for this message.
-     *
-     * @param messageId
-     *            the message ID.
-     */
-    public MessageBuilder setMessageId(String messageId) {
-        if (messageId == null) {
-            removeFields(FieldName.MESSAGE_ID);
-        } else {
-            setField(Fields.messageId(messageId));
-        }
+    public MessageBuilder generateMessageId(String hostname) {
+        builder.generateMessageId(hostname);
+
         return this;
     }
 
-    /**
-     * Returns the (decoded) value of the <i>Subject</i> header field of this
-     * message or <code>null</code> if it is not present.
-     *
-     * @return the subject of this message.
-     */
     public String getSubject() {
-        UnstructuredField field = obtainField(FieldName.SUBJECT);
-        return field != null ? field.getValue() : null;
-    }
-
-    /**
-     * Sets <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.
-     *
-     * @param subject
-     *            subject to set or <code>null</code> to remove the subject
-     *            header field.
-     */
+        return builder.getSubject();
+    }
+
     public MessageBuilder setSubject(String subject) {
-        if (subject == null) {
-            removeFields(FieldName.SUBJECT);
-        } else {
-            setField(Fields.subject(subject));
-        }
+        builder.setSubject(subject);
+
         return this;
     }
 
-    /**
-     * 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.
-     *
-     * @return the date of this message.
-     */
     public Date getDate() {
-        DateTimeField field = obtainField(FieldName.DATE);
-        return field != null ? field.getDate() : null;
-    }
-
-    /**
-     * Sets <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.
-     */
+        return builder.getDate();
+    }
+
     public MessageBuilder setDate(Date date) {
-        return setDate(date, null);
-    }
-
-    /**
-     * Sets <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.
-     */
+        builder.setDate(date);
+
+        return this;
+    }
+
     public MessageBuilder setDate(Date date, TimeZone zone) {
-        if (date == null) {
-            removeFields(FieldName.DATE);
-        } else {
-            setField(Fields.date(FieldName.DATE, date, zone));
-        }
+        builder.setDate(date, zone);
+
         return this;
     }
 
-    /**
-     * 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.
-     *
-     * @return the sender of this message.
-     */
     public Mailbox getSender() {
-        return getMailbox(FieldName.SENDER);
+        return builder.getSender();
     }
 
-    /**
-     * Sets <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 MessageBuilder setSender(Mailbox sender) {
-        return setMailbox(FieldName.SENDER, sender);
+        builder.setSender(sender);
+
+        return this;
     }
 
-    /**
-     * Sets <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 MessageBuilder setSender(String sender) throws ParseException {
-        return setMailbox(FieldName.SENDER, sender);
+        builder.setSender(sender);
+
+        return this;
     }
 
-    /**
-     * 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.
-     *
-     * @return value of the from field of this message.
-     */
     public MailboxList getFrom() {
-        return getMailboxList(FieldName.FROM);
+        return builder.getFrom();
+    }
+
+    public MessageBuilder setFrom(String... from) throws ParseException {
+        builder.setFrom(from);
+
+        return this;
+    }
+
+    public MessageBuilder setFrom(Collection<Mailbox> from) {
+        builder.setFrom(from);
+
+        return this;
     }
 
-    /**
-     * Sets <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 MessageBuilder setFrom(Mailbox from) {
-        return setMailboxList(FieldName.FROM, from);
+        builder.setFrom(from);
+
+        return this;
     }
 
-    /**
-     * Sets <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 MessageBuilder setFrom(String from) throws ParseException {
-        return setMailboxList(FieldName.FROM, from);
+        builder.setFrom(from);
+
+        return this;
     }
 
-    /**
-     * Sets <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 MessageBuilder setFrom(Mailbox... from) {
-        return setMailboxList(FieldName.FROM, from);
+        builder.setFrom(from);
+
+        return this;
     }
 
-    /**
-     * Sets <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 MessageBuilder setFrom(String... from) throws ParseException {
-        return setMailboxList(FieldName.FROM, from);
+    public AddressList getTo() {
+        return builder.getTo();
     }
 
-    /**
-     * Sets <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 MessageBuilder setFrom(Collection<Mailbox> from) {
-        return setMailboxList(FieldName.FROM, from);
+    public MessageBuilder setTo(String... to) throws ParseException {
+        builder.setTo(to);
+
+        return this;
     }
 
-    /**
-     * 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.
-     *
-     * @return value of the to field of this message.
-     */
-    public AddressList getTo() {
-        return getAddressList(FieldName.TO);
+    public MessageBuilder setTo(Collection<? extends Address> to) {
+        builder.setTo(to);
+
+        return this;
     }
 
-    /**
-     * Sets <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 MessageBuilder setTo(Address to) {
-        return setAddressList(FieldName.TO, to);
+        builder.setTo(to);
+
+        return this;
     }
 
-    /**
-     * Sets <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 MessageBuilder setTo(String to) throws ParseException {
-        return setAddressList(FieldName.TO, to);
-    }
+        builder.setTo(to);
 
-    /**
-     * Sets <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 MessageBuilder setTo(Address... to) {
-        return setAddressList(FieldName.TO, to);
+        return this;
     }
 
-    /**
-     * Sets <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 MessageBuilder setTo(String... to) throws ParseException {
-        return setAddressList(FieldName.TO, to);
-    }
+    public MessageBuilder setTo(Address... to) {
+        builder.setTo(to);
 
-    /**
-     * Sets <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 MessageBuilder setTo(Collection<? extends Address> to) {
-        return setAddressList(FieldName.TO, to);
+        return this;
     }
 
-    /**
-     * 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.
-     *
-     * @return value of the cc field of this message.
-     */
     public AddressList getCc() {
-        return getAddressList(FieldName.CC);
+        return builder.getCc();
     }
 
-    /**
-     * Sets <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 MessageBuilder setCc(Address cc) {
-        return setAddressList(FieldName.CC, cc);
-    }
-
-    /**
-     * Sets <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 MessageBuilder setCc(Address... cc) {
-        return setAddressList(FieldName.CC, cc);
+        builder.setCc(cc);
+
+        return this;
     }
 
-    /**
-     * Sets <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 MessageBuilder setCc(Collection<? extends Address> cc) {
-        return setAddressList(FieldName.CC, cc);
-    }
+        builder.setCc(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.
-     *
-     * @return value of the bcc field of this message.
-     */
-    public AddressList getBcc() {
-        return getAddressList(FieldName.BCC);
+        return this;
     }
 
-    /**
-     * Sets <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 MessageBuilder setBcc(Address bcc) {
-        return setAddressList(FieldName.BCC, bcc);
-    }
+    public MessageBuilder setCc(Address cc) {
+        builder.setCc(cc);
 
-    /**
-     * Sets <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 MessageBuilder setBcc(Address... bcc) {
-        return setAddressList(FieldName.BCC, bcc);
+        return this;
     }
 
-    /**
-     * Sets <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 MessageBuilder setBcc(Collection<? extends Address> bcc) {
-        return setAddressList(FieldName.BCC, bcc);
+    public AddressList getBcc() {
+        return builder.getBcc();
     }
 
-    /**
-     * 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.
-     *
-     * @return value of the reply to field of this message.
-     */
-    public AddressList getReplyTo() {
-        return getAddressList(FieldName.REPLY_TO);
-    }
+    public MessageBuilder setBcc(Address... bcc) {
+        builder.setBcc(bcc);
 
-    /**
-     * Sets <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 MessageBuilder setReplyTo(Address replyTo) {
-        return setAddressList(FieldName.REPLY_TO, replyTo);
+        return this;
     }
 
-    /**
-     * Sets <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 MessageBuilder setReplyTo(Address... replyTo) {
-        return setAddressList(FieldName.REPLY_TO, replyTo);
-    }
+    public MessageBuilder setBcc(Collection<? extends Address> bcc) {
+        builder.setBcc(bcc);
 
-    /**
-     * Sets <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 MessageBuilder setReplyTo(Collection<? extends Address> replyTo) {
-        return setAddressList(FieldName.REPLY_TO, replyTo);
+        return this;
     }
 
-    private Mailbox getMailbox(String fieldName) {
-        MailboxField field = obtainField(fieldName);
-        return field != null ? field.getMailbox() : null;
-    }
+    public MessageBuilder setBcc(Address bcc) {
+        builder.setBcc(bcc);
 
-    private MessageBuilder setMailbox(String fieldName, Mailbox mailbox) {
-        if (mailbox == null) {
-            removeFields(fieldName);
-        } else {
-            setField(Fields.mailbox(fieldName, mailbox));
-        }
         return this;
     }
 
-    private MessageBuilder setMailbox(String fieldName, String mailbox) throws 
ParseException {
-        if (mailbox == null) {
-            removeFields(fieldName);
-        } else {
-            setField(Fields.mailbox(fieldName, 
DefaultAddressParser.DEFAULT.parseMailbox(mailbox)));
-        }
+    public MessageBuilder copy(Message other) {
+        builder.copy(other);
+
         return this;
     }
 
-    private MailboxList getMailboxList(String fieldName) {
-        MailboxListField field = obtainField(fieldName);
-        return field != null ? field.getMailboxList() : null;
-    }
+    public MessageBuilder parse(InputStream is) throws IOException {
+        builder.parse(is);
 
-    private MessageBuilder setMailboxList(String fieldName, Mailbox mailbox) {
-        return setMailboxList(fieldName, mailbox == null ? null : 
Collections.singleton(mailbox));
+        return this;
     }
 
-    private MessageBuilder setMailboxList(String fieldName, String mailbox) 
throws ParseException {
-        return setMailboxList(fieldName, mailbox == null ? null : 
DefaultAddressParser.DEFAULT.parseMailbox(mailbox));
+    public AddressList getReplyTo() {
+        return builder.getReplyTo();
     }
 
-    private MessageBuilder setMailboxList(String fieldName, Mailbox... 
mailboxes) {
-        return setMailboxList(fieldName, mailboxes == null ? null : 
Arrays.asList(mailboxes));
-    }
+    public MessageBuilder setReplyTo(Address... replyTo) {
+        builder.setReplyTo(replyTo);
 
-    private List<Mailbox> parseMailboxes(String... mailboxes) throws 
ParseException {
-        if (mailboxes == null || mailboxes.length == 0) {
-            return null;
-        } else {
-            List<Mailbox> list = new ArrayList<Mailbox>();
-            for (String mailbox: mailboxes) {
-                list.add(DefaultAddressParser.DEFAULT.parseMailbox(mailbox));
-            }
-            return list;
-        }
+        return this;
     }
 
-    private MessageBuilder setMailboxList(String fieldName, String... 
mailboxes) throws ParseException {
-        return setMailboxList(fieldName, parseMailboxes(mailboxes));
-    }
+    public MessageBuilder setReplyTo(Collection<? extends Address> replyTo) {
+        builder.setReplyTo(replyTo);
 
-    private MessageBuilder setMailboxList(String fieldName, 
Collection<Mailbox> mailboxes) {
-        if (mailboxes == null || mailboxes.isEmpty()) {
-            removeFields(fieldName);
-        } else {
-            setField(Fields.mailboxList(fieldName, mailboxes));
-        }
         return this;
     }
 
-    private AddressList getAddressList(String fieldName) {
-        AddressListField field = obtainField(fieldName);
-        return field != null? field.getAddressList() : null;
-    }
+    public MessageBuilder setReplyTo(Address replyTo) {
+        builder.setReplyTo(replyTo);
 
-    private MessageBuilder setAddressList(String fieldName, Address address) {
-        return setAddressList(fieldName, address == null ? null : 
Collections.singleton(address));
+        return this;
     }
 
-    private MessageBuilder setAddressList(String fieldName, String address) 
throws ParseException {
-        return setAddressList(fieldName, address == null ? null : 
DefaultAddressParser.DEFAULT.parseMailbox(address));
-    }
+    public MessageBuilder use(MimeConfig config) {
+        builder.use(config);
 
-    private MessageBuilder setAddressList(String fieldName, Address... 
addresses) {
-        return setAddressList(fieldName, addresses == null ? null : 
Arrays.asList(addresses));
+        return this;
     }
 
-    private List<Address> parseAddresses(String... addresses) throws 
ParseException {
-        if (addresses == null || addresses.length == 0) {
-            return null;
-        } else {
-            List<Address> list = new ArrayList<Address>();
-            for (String address: addresses) {
-                list.add(DefaultAddressParser.DEFAULT.parseAddress(address));
-            }
-            return list;
-        }
-    }
+    public MessageBuilder use(DecodeMonitor monitor) {
+        builder.use(monitor);
 
-    private MessageBuilder setAddressList(String fieldName, String... 
addresses) throws ParseException {
-        return setAddressList(fieldName, parseAddresses(addresses));
+        return this;
     }
 
-    private MessageBuilder setAddressList(String fieldName, Collection<? 
extends Address> addresses) {
-        if (addresses == null || addresses.isEmpty()) {
-            removeFields(fieldName);
-        } else {
-            setField(Fields.addressList(fieldName, addresses));
-        }
+    public MessageBuilder use(BodyDescriptorBuilder bodyDescBuilder) {
+        builder.use(bodyDescBuilder);
+
         return this;
     }
 
-    public MessageBuilder copy(Message other) {
-        if (other == null) {
-            return this;
-        }
-        clearFields();
-        final Header otherHeader = other.getHeader();
-        if (otherHeader != null) {
-            final List<Field> otherFields = otherHeader.getFields();
-            for (Field field: otherFields) {
-                addField(field);
-            }
-        }
-        Body body = null;
-        Body otherBody = other.getBody();
-        if (otherBody instanceof Message) {
-            body = MessageBuilder.createCopy((Message) otherBody).build();
-        } else if (otherBody instanceof Multipart) {
-            body = MultipartBuilder.createCopy((Multipart) otherBody).build();
-        } else if (otherBody instanceof SingleBody) {
-            body = ((SingleBody) otherBody).copy();
-        }
-        setBody(body);
+    public MessageBuilder use(FieldParser<?> fieldParser) {
+        builder.use(fieldParser);
+
         return this;
     }
 
-    public MessageBuilder parse(final InputStream is) throws IOException {
-        MimeConfig currentConfig = config != null ? config : 
MimeConfig.DEFAULT;
-        boolean strict = currentConfig.isStrictParsing();
-        DecodeMonitor currentMonitor = monitor != null ? monitor : strict ? 
DecodeMonitor.STRICT : DecodeMonitor.SILENT;
-        BodyDescriptorBuilder currentBodyDescBuilder = bodyDescBuilder != null 
? bodyDescBuilder :
-                new DefaultBodyDescriptorBuilder(null, fieldParser != null ? 
fieldParser :
-                        strict ? DefaultFieldParser.getParser() : 
LenientFieldParser.getParser(), currentMonitor);
-        BodyFactory currentBodyFactory = bodyFactory != null ? bodyFactory : 
new BasicBodyFactory(!strict);
-        MimeStreamParser parser = new MimeStreamParser(currentConfig, 
currentMonitor, currentBodyDescBuilder);
+    public MessageBuilder use(BodyFactory bodyFactory) {
+        builder.use(bodyFactory);
 
-        Message message = new MessageImpl();
-        parser.setContentHandler(new ParserStreamContentHandler(message, 
currentBodyFactory));
-        parser.setContentDecoding(!rawContent);
-        if (flatMode) {
-            parser.setFlat();
-        }
-        try {
-            parser.parse(is);
-        } catch (MimeException e) {
-            throw new MimeIOException(e);
-        }
-        clearFields();
-        final List<Field> fields = message.getHeader().getFields();
-        for (Field field: fields) {
-            addField(field);
-        }
-        setBody(message.getBody());
         return this;
     }
 
     public Message build() {
-        MessageImpl message = new MessageImpl();
-        HeaderImpl header = new HeaderImpl();
-        message.setHeader(header);
-        if (!containsField(FieldName.MIME_VERSION)) {
-            header.setField(Fields.version("1.0"));
+        if (getDate() == null) {
+            setDate(new Date());
         }
-        for (Field field : getFields()) {
-            header.addField(field);
-        }
-        if (ensureDateNotNull && !containsField(FieldName.DATE)) {
-            header.setField(Fields.date(new Date()));
-        }
-
-        message.setBody(getBody());
 
-        return message;
+        return builder.build();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-mime4j/blob/5c583037/dom/src/main/java/org/apache/james/mime4j/message/ParserStreamContentHandler.java
----------------------------------------------------------------------
diff --git 
a/dom/src/main/java/org/apache/james/mime4j/message/ParserStreamContentHandler.java
 
b/dom/src/main/java/org/apache/james/mime4j/message/ParserStreamContentHandler.java
deleted file mode 100644
index 5dc3ccd..0000000
--- 
a/dom/src/main/java/org/apache/james/mime4j/message/ParserStreamContentHandler.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/****************************************************************
- * 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.dom.Body;
-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.parser.ContentHandler;
-import org.apache.james.mime4j.stream.BodyDescriptor;
-import org.apache.james.mime4j.stream.Field;
-import org.apache.james.mime4j.util.ByteArrayBuffer;
-import org.apache.james.mime4j.util.ByteSequence;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Stack;
-
-/**
- * A <code>ContentHandler</code> for building an <code>Entity</code> to be
- * used in conjunction with a {@link 
org.apache.james.mime4j.parser.MimeStreamParser}.
- */
-class ParserStreamContentHandler implements ContentHandler {
-
-    private final Entity entity;
-    private final MessageImplFactory messageImplFactory;
-    private final BodyFactory bodyFactory;
-    private final Stack<Object> stack;
-
-    ParserStreamContentHandler(
-            final Entity entity,
-            final BodyFactory bodyFactory) {
-        this.entity = entity;
-        this.messageImplFactory = new DefaultMessageImplFactory();
-        this.bodyFactory = bodyFactory;
-        this.stack = new Stack<Object>();
-    }
-
-    ParserStreamContentHandler(
-            final Entity entity,
-            final MessageImplFactory messageImplFactory,
-            final BodyFactory bodyFactory) {
-        this.entity = entity;
-        this.messageImplFactory = messageImplFactory;
-        this.bodyFactory = bodyFactory;
-        this.stack = new Stack<Object>();
-    }
-
-    private void expect(Class<?> c) {
-        if (!c.isInstance(stack.peek())) {
-            throw new IllegalStateException("Internal stack error: "
-                    + "Expected '" + c.getName() + "' found '"
-                    + stack.peek().getClass().getName() + "'");
-        }
-    }
-
-    public void startMessage() throws MimeException {
-        if (stack.isEmpty()) {
-            stack.push(this.entity);
-        } else {
-            expect(Entity.class);
-            Message m = messageImplFactory.messageImpl();
-            ((Entity) stack.peek()).setBody(m);
-            stack.push(m);
-        }
-    }
-
-    public void endMessage() throws MimeException {
-        expect(Message.class);
-        stack.pop();
-    }
-
-    public void startHeader() throws MimeException {
-        stack.push(new HeaderImpl());
-    }
-
-    public void field(Field field) throws MimeException {
-        expect(Header.class);
-        ((Header) stack.peek()).addField(field);
-    }
-
-    public void endHeader() throws MimeException {
-        expect(Header.class);
-        Header h = (Header) stack.pop();
-        expect(Entity.class);
-        ((Entity) stack.peek()).setHeader(h);
-    }
-
-    public void startMultipart(final BodyDescriptor bd) throws MimeException {
-        expect(Entity.class);
-
-        final Entity e = (Entity) stack.peek();
-        final String subType = bd.getSubType();
-        final Multipart multiPart = new MultipartImpl(subType);
-        e.setBody(multiPart);
-        stack.push(multiPart);
-    }
-
-    public void body(BodyDescriptor bd, final InputStream is) throws 
MimeException, IOException {
-        expect(Entity.class);
-
-        final Body body;
-        if (bd.getMimeType().startsWith("text/")) {
-            body = bodyFactory.textBody(is, bd.getCharset());
-        } else {
-            body = bodyFactory.binaryBody(is);
-        }
-
-        Entity entity = ((Entity) stack.peek());
-        entity.setBody(body);
-    }
-
-    public void endMultipart() throws MimeException {
-        stack.pop();
-    }
-
-    public void startBodyPart() throws MimeException {
-        expect(Multipart.class);
-
-        BodyPart bodyPart = new BodyPart();
-        ((Multipart) stack.peek()).addBodyPart(bodyPart);
-        stack.push(bodyPart);
-    }
-
-    public void endBodyPart() throws MimeException {
-        expect(BodyPart.class);
-        stack.pop();
-    }
-
-    public void epilogue(InputStream is) throws MimeException, IOException {
-        expect(MultipartImpl.class);
-        ByteSequence bytes = loadStream(is);
-        ((MultipartImpl) stack.peek()).setEpilogueRaw(bytes);
-    }
-
-    public void preamble(InputStream is) throws MimeException, IOException {
-        expect(MultipartImpl.class);
-        ByteSequence bytes = loadStream(is);
-        ((MultipartImpl) stack.peek()).setPreambleRaw(bytes);
-    }
-
-    /**
-     * Unsupported.
-     *
-     * @param is the raw contents of the entity.
-     * @throws UnsupportedOperationException
-     */
-    public void raw(InputStream is) throws MimeException, IOException {
-        throw new UnsupportedOperationException("Not supported");
-    }
-
-    private static ByteSequence loadStream(InputStream in) throws IOException {
-        ByteArrayBuffer bab = new ByteArrayBuffer(64);
-
-        int b;
-        while ((b = in.read()) != -1) {
-            bab.append(b);
-        }
-
-        return bab;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-mime4j/blob/5c583037/dom/src/test/java/org/apache/james/mime4j/dom/MessageTest.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..ce4de42
--- /dev/null
+++ b/dom/src/test/java/org/apache/james/mime4j/dom/MessageTest.java
@@ -0,0 +1,435 @@
+/****************************************************************
+ * 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.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.TimeZone;
+
+import org.apache.james.mime4j.Charsets;
+import org.apache.james.mime4j.dom.address.AddressList;
+import org.apache.james.mime4j.dom.address.Group;
+import org.apache.james.mime4j.dom.address.Mailbox;
+import org.apache.james.mime4j.dom.address.MailboxList;
+import org.apache.james.mime4j.dom.field.ContentTypeField;
+import org.apache.james.mime4j.dom.field.FieldName;
+import org.apache.james.mime4j.field.DefaultFieldParser;
+import org.apache.james.mime4j.field.Fields;
+import org.apache.james.mime4j.field.address.DefaultAddressParser;
+import org.apache.james.mime4j.message.BasicBodyFactory;
+import org.apache.james.mime4j.message.BodyFactory;
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class MessageTest {
+
+    @Test
+    public void testSetCustomBody() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+
+        BodyFactory bodyFactory = Mockito.spy(new BasicBodyFactory());
+        builder.use(bodyFactory);
+
+        builder.setBody("stuff", "stuff", Charsets.UTF_8);
+
+        Assert.assertTrue(builder.getBody() instanceof TextBody);
+        ContentTypeField ct1 = builder.getField("Content-Type", 
ContentTypeField.class);
+        Assert.assertEquals("text/stuff", ct1.getMimeType());
+        Assert.assertEquals("UTF-8", ct1.getCharset());
+
+        Mockito.verify(bodyFactory, 
Mockito.times(1)).textBody(Mockito.<InputStream>any(), Mockito.eq("UTF-8"));
+
+        builder.setBody("stuff", "other-stuff", Charsets.US_ASCII);
+
+        Assert.assertTrue(builder.getBody() instanceof TextBody);
+        ContentTypeField ct2 = builder.getField("Content-Type", 
ContentTypeField.class);
+        Assert.assertEquals("text/other-stuff", ct2.getMimeType());
+        Assert.assertEquals("US-ASCII", ct2.getCharset());
+
+        Mockito.verify(bodyFactory, 
Mockito.times(1)).textBody(Mockito.<InputStream>any(), Mockito.eq("US-ASCII"));
+
+        builder.setBody("stuff", null);
+
+        Assert.assertTrue(builder.getBody() instanceof TextBody);
+        ContentTypeField ct3 = builder.getField("Content-Type", 
ContentTypeField.class);
+        Assert.assertEquals("text/plain", ct3.getMimeType());
+        Assert.assertEquals(null, ct3.getCharset());
+
+        Mockito.verify(bodyFactory, 
Mockito.times(1)).textBody(Mockito.<InputStream>any(), 
Mockito.isNull(String.class));
+
+        builder.setBody(new byte[] {1,2,3}, null);
+
+        Assert.assertTrue(builder.getBody() instanceof BinaryBody);
+        ContentTypeField ct4 = builder.getField("Content-Type", 
ContentTypeField.class);
+        Assert.assertEquals("application/octet-stream", ct4.getMimeType());
+        Assert.assertEquals(null, ct4.getCharset());
+
+        Mockito.verify(bodyFactory, 
Mockito.times(1)).binaryBody(Mockito.<InputStream>any());
+    }
+
+    @Test
+    public void testSetMessageId() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+
+        String id = "<msg17@localhost>";
+        builder.setMessageId(id);
+        Assert.assertEquals(id, builder.getMessageId());
+    }
+
+    @Test
+    public void testCreateMessageId() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+        builder.generateMessageId("hostname");
+
+        String id = builder.getMessageId();
+        Assert.assertNotNull(id);
+        Assert.assertTrue(id.startsWith("<Mime4j."));
+        Assert.assertTrue(id.endsWith("@hostname>"));
+    }
+
+    @Test
+    public void testGetSubject() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+        Assert.assertNull(builder.getSubject());
+
+        String subject = "testing 1 2";
+        builder.setSubject(subject);
+        Assert.assertEquals(subject, builder.getSubject());
+
+        builder.setField(DefaultFieldParser.parse("Subject: 
=?windows-1252?Q?99_=80?="));
+        Assert.assertEquals("99 \u20ac", builder.getSubject());
+    }
+
+    @Test
+    public void testSetSubject() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+
+        builder.setSubject("Semmelbr\366sel");
+        Assert.assertEquals("Semmelbr\366sel", builder.getSubject());
+        Assert.assertEquals("=?ISO-8859-1?Q?Semmelbr=F6sel?=", 
builder.getField(
+                "Subject").getBody());
+
+        builder.setSubject(null);
+        Assert.assertNull(builder.getField("Subject"));
+    }
+
+    @Test
+    public void testGetDate() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+        Assert.assertNull(builder.getDate());
+
+        builder.setField(DefaultFieldParser.parse("Date: Thu, 1 Jan 1970 
05:30:00 +0530"));
+
+        Assert.assertEquals(new Date(0), builder.getDate());
+    }
+
+    @Test
+    public void testSetDate() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+
+        builder.setDate(new Date(86400000), TimeZone.getTimeZone("GMT"));
+        Assert.assertEquals(new Date(86400000), builder.getDate());
+        Assert.assertEquals("Fri, 2 Jan 1970 00:00:00 +0000", builder.getField(
+                "Date").getBody());
+
+        builder.setDate(null);
+        Assert.assertNull(builder.getField("Date"));
+    }
+
+    @Test
+    public void testGetSender() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+        Assert.assertNull(builder.getSender());
+
+        builder.setField(DefaultFieldParser.parse("Sender: 
[email protected]"));
+
+        Assert.assertEquals("[email protected]", 
builder.getSender().getAddress());
+    }
+
+    @Test
+    public void testSetSender() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+
+        builder.setSender("[email protected]");
+        Assert.assertEquals("[email protected]", 
builder.getField("Sender").getBody());
+
+        builder.setSender((String) null);
+        Assert.assertNull(builder.getField("Sender"));
+    }
+
+    @Test
+    public void testGetFrom() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+        Assert.assertNull(builder.getFrom());
+
+        builder.setField(DefaultFieldParser.parse("From: 
[email protected]"));
+
+        Assert.assertEquals("[email protected]", 
builder.getFrom().get(0).getAddress());
+    }
+
+    @Test
+    public void testSetFrom() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+
+        Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
+        Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
+
+        builder.setFrom(mailbox1);
+        Assert.assertEquals("[email protected]", builder.getField("From")
+                .getBody());
+
+        builder.setFrom(mailbox1, mailbox2);
+        Assert.assertEquals("[email protected], [email protected]",
+                builder.getField("From").getBody());
+
+        builder.setFrom(Arrays.asList(mailbox1, mailbox2));
+        Assert.assertEquals("[email protected], [email protected]",
+                builder.getField("From").getBody());
+
+        builder.setFrom((Mailbox) null);
+        Assert.assertNull(builder.getField("From"));
+    }
+
+    @Test
+    public void testGetTo() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+        Assert.assertNull(builder.getTo());
+
+        builder.setField(DefaultFieldParser.parse("To: [email protected]"));
+
+        Assert.assertEquals("[email protected]", ((Mailbox) 
builder.getTo().get(0))
+                .getAddress());
+    }
+
+    @Test
+    public void testSetTo() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+
+        Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
+        Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
+        Group group = new Group("Does", mailbox1, mailbox2);
+        Mailbox mailbox3 = DefaultAddressParser.DEFAULT.parseMailbox("Mary 
Smith <[email protected]>");
+
+        builder.setTo(group);
+        Assert.assertEquals("Does: [email protected], 
[email protected];",
+                builder.getField("To").getBody());
+
+        builder.setTo(group, mailbox3);
+        Assert.assertEquals("Does: [email protected], 
[email protected];, "
+                + "Mary Smith <[email protected]>", builder.getField("To")
+                .getBody());
+
+        builder.setTo(Arrays.asList(group, mailbox3));
+        Assert.assertEquals("Does: [email protected], 
[email protected];, "
+                + "Mary Smith <[email protected]>", builder.getField("To")
+                .getBody());
+
+        builder.setTo((Mailbox) null);
+        Assert.assertNull(builder.getField("To"));
+    }
+
+    @Test
+    public void testGetCc() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+        Assert.assertNull(builder.getCc());
+
+        builder.setField(DefaultFieldParser.parse("Cc: [email protected]"));
+
+        Assert.assertEquals("[email protected]", ((Mailbox) 
builder.getCc().get(0))
+                .getAddress());
+    }
+
+    @Test
+    public void testSetCc() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+
+        Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
+        Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
+        Group group = new Group("Does", mailbox1, mailbox2);
+        Mailbox mailbox3 = DefaultAddressParser.DEFAULT.parseMailbox("Mary 
Smith <[email protected]>");
+
+        builder.setCc(group);
+        Assert.assertEquals("Does: [email protected], 
[email protected];",
+                builder.getField("Cc").getBody());
+
+        builder.setCc(group, mailbox3);
+        Assert.assertEquals("Does: [email protected], 
[email protected];, "
+                + "Mary Smith <[email protected]>", builder.getField("Cc")
+                .getBody());
+
+        builder.setCc(Arrays.asList(group, mailbox3));
+        Assert.assertEquals("Does: [email protected], 
[email protected];, "
+                + "Mary Smith <[email protected]>", builder.getField("Cc")
+                .getBody());
+
+        builder.setCc((Mailbox) null);
+        Assert.assertNull(builder.getField("Cc"));
+    }
+
+    @Test
+    public void testGetBcc() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+        Assert.assertNull(builder.getBcc());
+
+        builder.setField(DefaultFieldParser.parse("Bcc: 
[email protected]"));
+
+        Assert.assertEquals("[email protected]", ((Mailbox) 
builder.getBcc().get(0))
+                .getAddress());
+    }
+
+    @Test
+    public void testSetBcc() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+
+        Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
+        Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
+        Group group = new Group("Does", mailbox1, mailbox2);
+        Mailbox mailbox3 = DefaultAddressParser.DEFAULT.parseMailbox("Mary 
Smith <[email protected]>");
+
+        builder.setBcc(group);
+        Assert.assertEquals("Does: [email protected], 
[email protected];",
+                builder.getField("Bcc").getBody());
+
+        builder.setBcc(group, mailbox3);
+        Assert.assertEquals("Does: [email protected], 
[email protected];, "
+                + "Mary Smith <[email protected]>", builder
+                .getField("Bcc").getBody());
+
+        builder.setBcc(Arrays.asList(group, mailbox3));
+        Assert.assertEquals("Does: [email protected], 
[email protected];, "
+                + "Mary Smith <[email protected]>", builder
+                .getField("Bcc").getBody());
+
+        builder.setBcc((Mailbox) null);
+        Assert.assertNull(builder.getField("Bcc"));
+    }
+
+    @Test
+    public void testGetReplyTo() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+        Assert.assertNull(builder.getReplyTo());
+
+        builder.setField(DefaultFieldParser.parse("Reply-To: 
[email protected]"));
+
+        Assert.assertEquals("[email protected]", ((Mailbox) 
builder.getReplyTo().get(0))
+                .getAddress());
+    }
+
+    @Test
+    public void testSetReplyTo() throws Exception {
+        Message.Builder builder = Message.Builder.of();
+
+        Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
+        Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
+        Group group = new Group("Does", mailbox1, mailbox2);
+        Mailbox mailbox3 = DefaultAddressParser.DEFAULT.parseMailbox("Mary 
Smith <[email protected]>");
+
+        builder.setReplyTo(group);
+        Assert.assertEquals("Does: [email protected], 
[email protected];",
+                builder.getField("Reply-To").getBody());
+
+        builder.setReplyTo(group, mailbox3);
+        Assert.assertEquals("Does: [email protected], 
[email protected];, "
+                + "Mary Smith <[email protected]>", builder.getField(
+                "Reply-To").getBody());
+
+        builder.setReplyTo(Arrays.asList(group, mailbox3));
+        Assert.assertEquals("Does: [email protected], 
[email protected];, "
+                + "Mary Smith <[email protected]>", builder.getField(
+                "Reply-To").getBody());
+
+        builder.setReplyTo((Mailbox) null);
+        Assert.assertNull(builder.getField("Reply-To"));
+    }
+
+    @Test
+    public void testBuildWithDefaults() throws Exception {
+        Message message = Message.Builder.of()
+                .generateMessageId("hostname")
+                .setSubject("testing ...")
+                .setFrom("batman@localhost", "superman@localhost")
+                .setTo("\"Big momma\" <big_momma@localhost>")
+                .setBody("Yo, big momma!", Charsets.UTF_8)
+                .build();
+
+        Assert.assertEquals("text/plain", message.getMimeType());
+        Assert.assertNotNull(message.getMessageId());
+        Assert.assertNull(message.getDate());
+        Assert.assertEquals("1.0", 
message.getHeader().getField(FieldName.MIME_VERSION).getBody());
+        Assert.assertEquals("testing ...", message.getSubject());
+        Assert.assertEquals(new MailboxList(
+                new Mailbox("", "batman", "localhost"),
+                new Mailbox("", "superman", "localhost")), message.getFrom());
+        Assert.assertEquals(new AddressList(
+                new Mailbox("Big momma", "big_momma", "localhost")), 
message.getTo());
+        Assert.assertEquals("text/plain", message.getMimeType());
+        Assert.assertEquals("UTF-8", message.getCharset());
+    }
+
+    @Test
+    public void testBuildWithNoDefaults() throws Exception {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
+        Date date = dateFormat.parse("2014-08-01 12:00");
+
+        Message message = Message.Builder.of()
+                .setMessageId("blah@hostname")
+                .setDate(date)
+                .addField(Fields.version("1.0.1"))
+                .setSubject("testing ...")
+                .setFrom("batman@localhost", "superman@localhost")
+                .setTo("\"Big momma\" <big_momma@localhost>")
+                .setBody("Yo, big momma!", Charsets.UTF_8)
+                .build();
+
+        Assert.assertEquals("text/plain", message.getMimeType());
+        Assert.assertEquals("blah@hostname", message.getMessageId());
+        Assert.assertEquals(date, message.getDate());
+        Assert.assertEquals("1.0.1", 
message.getHeader().getField(FieldName.MIME_VERSION).getBody());
+        Assert.assertEquals("testing ...", message.getSubject());
+        Assert.assertEquals(new MailboxList(
+                new Mailbox("", "batman", "localhost"),
+                new Mailbox("", "superman", "localhost")), message.getFrom());
+        Assert.assertEquals(new AddressList(
+                new Mailbox("Big momma", "big_momma", "localhost")), 
message.getTo());
+        Assert.assertEquals("text/plain", message.getMimeType());
+        Assert.assertEquals("UTF-8", message.getCharset());
+    }
+
+    @Test
+    public void testOfOnBuilder() throws Exception {
+        Message original = Message.Builder.of()
+                .generateMessageId("hostname")
+                .setSubject("testing ...")
+                .setFrom("batman@localhost", "superman@localhost")
+                .setTo("\"Big momma\" <big_momma@localhost>")
+                .setBody("Yo, big momma!", Charsets.UTF_8)
+                .build();
+
+        Message.Builder builder = Message.Builder.of(original);
+        Assert.assertEquals(original.getHeader().getFields(), 
builder.getFields());
+        Assert.assertNotSame(original.getBody(), builder.getBody());
+        Assert.assertSame(original.getBody().getClass(), 
builder.getBody().getClass());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-mime4j/blob/5c583037/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java
----------------------------------------------------------------------
diff --git 
a/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java
 
b/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java
index 76cbcbe..e033d2b 100644
--- 
a/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java
+++ 
b/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java
@@ -33,6 +33,7 @@ import 
org.apache.james.mime4j.dom.field.ContentTransferEncodingField;
 import org.apache.james.mime4j.dom.field.ContentTypeField;
 import org.apache.james.mime4j.dom.field.ParsedField;
 import org.apache.james.mime4j.field.DefaultFieldParser;
+import org.apache.james.mime4j.internal.AbstractEntityBuilder;
 import org.apache.james.mime4j.stream.Field;
 import org.apache.james.mime4j.stream.NameValuePair;
 import org.junit.Assert;

http://git-wip-us.apache.org/repos/asf/james-mime4j/blob/5c583037/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java
----------------------------------------------------------------------
diff --git 
a/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java 
b/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java
index 1820a5f..d92ad36 100644
--- a/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java
+++ b/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java
@@ -19,7 +19,6 @@
 
 package org.apache.james.mime4j.message;
 
-import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
@@ -43,11 +42,12 @@ import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
 
+@SuppressWarnings("deprecation")
 public class MessageBuilderTest {
 
     @Test
     public void testSetCustomBody() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
 
         BodyFactory bodyFactory = Mockito.spy(new BasicBodyFactory());
         builder.use(bodyFactory);
@@ -91,7 +91,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetMessageId() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
 
         String id = "<msg17@localhost>";
         builder.setMessageId(id);
@@ -100,7 +100,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testCreateMessageId() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
         builder.generateMessageId("hostname");
 
         String id = builder.getMessageId();
@@ -111,7 +111,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetSubject() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
         Assert.assertNull(builder.getSubject());
 
         String subject = "testing 1 2";
@@ -124,7 +124,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetSubject() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
 
         builder.setSubject("Semmelbr\366sel");
         Assert.assertEquals("Semmelbr\366sel", builder.getSubject());
@@ -137,7 +137,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetDate() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
         Assert.assertNull(builder.getDate());
 
         builder.setField(DefaultFieldParser.parse("Date: Thu, 1 Jan 1970 
05:30:00 +0530"));
@@ -147,7 +147,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetDate() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
 
         builder.setDate(new Date(86400000), TimeZone.getTimeZone("GMT"));
         Assert.assertEquals(new Date(86400000), builder.getDate());
@@ -160,7 +160,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetSender() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
         Assert.assertNull(builder.getSender());
 
         builder.setField(DefaultFieldParser.parse("Sender: 
[email protected]"));
@@ -170,7 +170,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetSender() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
 
         builder.setSender("[email protected]");
         Assert.assertEquals("[email protected]", 
builder.getField("Sender").getBody());
@@ -181,7 +181,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetFrom() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
         Assert.assertNull(builder.getFrom());
 
         builder.setField(DefaultFieldParser.parse("From: 
[email protected]"));
@@ -191,7 +191,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetFrom() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
 
         Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
         Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
@@ -214,7 +214,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetTo() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
         Assert.assertNull(builder.getTo());
 
         builder.setField(DefaultFieldParser.parse("To: [email protected]"));
@@ -225,7 +225,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetTo() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
 
         Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
         Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
@@ -252,7 +252,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetCc() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
         Assert.assertNull(builder.getCc());
 
         builder.setField(DefaultFieldParser.parse("Cc: [email protected]"));
@@ -263,7 +263,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetCc() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
 
         Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
         Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
@@ -290,7 +290,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetBcc() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
         Assert.assertNull(builder.getBcc());
 
         builder.setField(DefaultFieldParser.parse("Bcc: 
[email protected]"));
@@ -301,7 +301,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetBcc() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
 
         Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
         Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
@@ -328,7 +328,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetReplyTo() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
         Assert.assertNull(builder.getReplyTo());
 
         builder.setField(DefaultFieldParser.parse("Reply-To: 
[email protected]"));
@@ -339,7 +339,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetReplyTo() throws Exception {
-        MessageBuilder builder = MessageBuilder.of();
+        MessageBuilder builder = MessageBuilder.create();
 
         Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
         Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
@@ -366,7 +366,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testBuildWithDefaults() throws Exception {
-        Message message = MessageBuilder.of()
+        Message message = MessageBuilder.create()
                 .generateMessageId("hostname")
                 .setSubject("testing ...")
                 .setFrom("batman@localhost", "superman@localhost")
@@ -376,7 +376,7 @@ public class MessageBuilderTest {
 
         Assert.assertEquals("text/plain", message.getMimeType());
         Assert.assertNotNull(message.getMessageId());
-        Assert.assertNull(message.getDate());
+        Assert.assertNotNull(message.getDate());
         Assert.assertEquals("1.0", 
message.getHeader().getField(FieldName.MIME_VERSION).getBody());
         Assert.assertEquals("testing ...", message.getSubject());
         Assert.assertEquals(new MailboxList(
@@ -388,116 +388,13 @@ public class MessageBuilderTest {
         Assert.assertEquals("UTF-8", message.getCharset());
     }
 
-    /**
-     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
-     */
-    @Test
-    public void testThatDeprecatedCreateNeverReturnNullDate() throws Exception 
{
-        @SuppressWarnings("deprecation") MessageBuilder builder = 
MessageBuilder.create();
-
-        Message message = builder.generateMessageId("hostname")
-            .setSubject("testing ...")
-            .setFrom("batman@localhost", "superman@localhost")
-            .setTo("\"Big momma\" <big_momma@localhost>")
-            .setBody("Yo, big momma!", Charsets.UTF_8)
-            .build();
-
-        Assert.assertNotNull(message.getDate());
-    }
-
-    /**
-     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
-     */
-    @Test
-    public void testThatDeprecatedConstructorNeverReturnNullDate() throws 
Exception {
-        @SuppressWarnings("deprecation") MessageBuilder builder = new 
MessageBuilder();
-
-        Message message = builder.generateMessageId("hostname")
-            .setSubject("testing ...")
-            .setFrom("batman@localhost", "superman@localhost")
-            .setTo("\"Big momma\" <big_momma@localhost>")
-            .setBody("Yo, big momma!", Charsets.UTF_8)
-            .build();
-
-        Assert.assertNotNull(message.getDate());
-    }
-
-    /**
-     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
-     */
-    @Test
-    public void testThatDeprecatedCreateCopyNeverReturnNullDate() throws 
Exception {
-        Message messageWithoutDate = 
MessageBuilder.of().generateMessageId("hostname")
-            .setSubject("testing ...")
-            .setFrom("batman@localhost", "superman@localhost")
-            .setTo("\"Big momma\" <big_momma@localhost>")
-            .setBody("Yo, big momma!", Charsets.UTF_8)
-            .build();
-
-        @SuppressWarnings("deprecation") MessageBuilder builder = 
MessageBuilder.createCopy(messageWithoutDate);
-
-        Message testee = builder.build();
-
-        Assert.assertNotNull(testee.getDate());
-    }
-
-
-    @Test
-    public void testThatOfMesageReturnNullDateWhenNoDateHeader() throws 
Exception {
-        Message messageWithoutDate = 
MessageBuilder.of().generateMessageId("hostname")
-            .setSubject("testing ...")
-            .setFrom("batman@localhost", "superman@localhost")
-            .setTo("\"Big momma\" <big_momma@localhost>")
-            .setBody("Yo, big momma!", Charsets.UTF_8)
-            .build();
-
-        MessageBuilder builder = MessageBuilder.of(messageWithoutDate);
-
-        Message testee = builder.build();
-
-        Assert.assertNull(testee.getDate());
-    }
-
-    /**
-     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
-     */
-    @Test
-    public void testThatDeprecatedReadNeverReturnNullDate() throws Exception {
-        String messageSource = "To: me ME <[email protected]>\n" +
-            "From: you YOU <[email protected]>\n" +
-            "Subject: message\n" +
-            "MIME-Version: 1.0\n" +
-            "\n" +
-            "This is a message";
-
-        @SuppressWarnings("deprecation") MessageBuilder builder = 
MessageBuilder.read(new ByteArrayInputStream(messageSource.getBytes()));
-        Message testee = builder.build();
-
-        Assert.assertNotNull(testee.getDate());
-    }
-
-    @Test
-    public void testThatOfInputStreamReturnNullDateWhenNoDateHeader() throws 
Exception {
-        String messageSource = "To: me ME <[email protected]>\n" +
-            "From: you YOU <[email protected]>\n" +
-            "Subject: message\n" +
-            "MIME-Version: 1.0\n" +
-            "\n" +
-            "This is a message";
-
-        @SuppressWarnings("deprecation") MessageBuilder builder = 
MessageBuilder.of(new ByteArrayInputStream(messageSource.getBytes()));
-        Message testee = builder.build();
-
-        Assert.assertNull(testee.getDate());
-    }
-
     @Test
     public void testBuildWithNoDefaults() throws Exception {
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
         dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
         Date date = dateFormat.parse("2014-08-01 12:00");
 
-        Message message = MessageBuilder.of()
+        Message message = MessageBuilder.create()
                 .setMessageId("blah@hostname")
                 .setDate(date)
                 .addField(Fields.version("1.0.1"))
@@ -522,8 +419,8 @@ public class MessageBuilderTest {
     }
 
     @Test
-    public void testOfWithAMessage() throws Exception {
-        Message original = MessageBuilder.of()
+    public void testCopy() throws Exception {
+        Message original = MessageBuilder.create()
                 .generateMessageId("hostname")
                 .setSubject("testing ...")
                 .setFrom("batman@localhost", "superman@localhost")
@@ -531,7 +428,7 @@ public class MessageBuilderTest {
                 .setBody("Yo, big momma!", Charsets.UTF_8)
                 .build();
 
-        MessageBuilder builder = MessageBuilder.of(original);
+        MessageBuilder builder = MessageBuilder.createCopy(original);
         Assert.assertEquals(original.getHeader().getFields(), 
builder.getFields());
         Assert.assertNotSame(original.getBody(), builder.getBody());
         Assert.assertSame(original.getBody().getClass(), 
builder.getBody().getClass());


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to