diff --git a/src/com/android/mail/browse/MessageCursor.java b/src/com/android/mail/browse/MessageCursor.java
index 867a94a..e745bf9 100644
--- a/src/com/android/mail/browse/MessageCursor.java
+++ b/src/com/android/mail/browse/MessageCursor.java
@@ -211,7 +211,7 @@
             sb.append(String.format(
                     "[Message #%d hash=%s uri=%s id=%s serverId=%s from='%s' draftType=%d" +
                     " isSending=%s read=%s starred=%s attUris=%s]\n",
-                    pos, m.getStateHashCode(), m.uri, m.id, m.serverId, m.from, m.draftType,
+                    pos, m.getStateHashCode(), m.uri, m.id, m.serverId, m.getFrom(), m.draftType,
                     m.isSending, m.read, m.starred, attUris));
         }
         return sb.toString();
diff --git a/src/com/android/mail/browse/MessageHeaderView.java b/src/com/android/mail/browse/MessageHeaderView.java
index 15448c9..b842ad4 100644
--- a/src/com/android/mail/browse/MessageHeaderView.java
+++ b/src/com/android/mail/browse/MessageHeaderView.java
@@ -405,7 +405,7 @@
         // 2. the account has no custom froms, fromAddress will be empty, and we
         // can safely fall back and show the account name as sender since it's
         // the only possible fromAddress.
-        String from = mMessage.from;
+        String from = mMessage.getFrom();
         if (TextUtils.isEmpty(from)) {
             from = getAccount().name;
         }
diff --git a/src/com/android/mail/compose/ComposeActivity.java b/src/com/android/mail/compose/ComposeActivity.java
index 5427dea..e25b9f5 100644
--- a/src/com/android/mail/compose/ComposeActivity.java
+++ b/src/com/android/mail/compose/ComposeActivity.java
@@ -58,7 +58,6 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
-import android.view.inputmethod.BaseInputConnection;
 import android.view.inputmethod.EditorInfo;
 import android.widget.ArrayAdapter;
 import android.widget.Button;
@@ -367,8 +366,8 @@
             showQuotedText = message.appendRefMessageContent;
         } else if (action == EDIT_DRAFT) {
             initFromDraftMessage(message);
-            boolean showBcc = !TextUtils.isEmpty(message.bcc);
-            boolean showCc = showBcc || !TextUtils.isEmpty(message.cc);
+            boolean showBcc = !TextUtils.isEmpty(message.getBcc());
+            boolean showCc = showBcc || !TextUtils.isEmpty(message.getCc());
             mCcBccView.show(false, showCc, showBcc);
             // Update the action to the draft type of the previous draft
             switch (message.draftType) {
@@ -695,10 +694,10 @@
         message.conversationUri = null;
         message.subject = mSubject.getText().toString();
         message.snippet = null;
-        message.to = formatSenders(mTo.getText().toString());
-        message.cc = formatSenders(mCc.getText().toString());
-        message.bcc = formatSenders(mBcc.getText().toString());
-        message.replyTo = null;
+        message.setTo(formatSenders(mTo.getText().toString()));
+        message.setCc(formatSenders(mCc.getText().toString()));
+        message.setBcc(formatSenders(mBcc.getText().toString()));
+        message.setReplyTo(null);
         message.dateReceivedMs = 0;
         String htmlBody = Html.toHtml(new SpannableString(mBodyView.getText().toString()));
         StringBuilder fullBody = new StringBuilder(htmlBody);
@@ -725,9 +724,12 @@
 
     private void updateMessage(Message message, ReplyFromAccount selectedReplyFromAccount,
             int mode) {
-        message.from = selectedReplyFromAccount != null ? selectedReplyFromAccount.address
-                : mAccount != null ? mAccount.name : null;
+        message.setFrom(selectedReplyFromAccount != null ? selectedReplyFromAccount.address
+                : mAccount != null ? mAccount.name : null);
         message.draftType = getDraftType(mode);
+        message.setTo(formatSenders(mTo.getText().toString()));
+        message.setCc(formatSenders(mCc.getText().toString()));
+        message.setBcc(formatSenders(mBcc.getText().toString()));
     }
 
     private String formatSenders(String string) {
@@ -877,7 +879,7 @@
     }
 
     private ReplyFromAccount getReplyFromAccountFromDraft(Account account, Message msg) {
-        String sender = msg.from;
+        String sender = msg.getFrom();
         ReplyFromAccount replyFromAccount = null;
         List<ReplyFromAccount> replyFromAccounts = mFromSpinner.getReplyFromAccounts();
         if (TextUtils.equals(account.name, sender)) {
@@ -1428,7 +1430,7 @@
         // the reply.
         final String accountEmail = Address.getEmailAddress(account).getAddress();
         String[] sentToAddresses = refMessage.getToAddresses();
-        String replytoAddress = refMessage.replyTo;
+        String replytoAddress = refMessage.getReplyTo();
         final Collection<String> toAddresses;
 
         // If this is a reply, the Cc list is empty. If this is a reply-all, the
@@ -1436,13 +1438,13 @@
         // message, excluding the current user's email address and any addresses
         // already on the To list.
         if (action == ComposeActivity.REPLY) {
-            toAddresses = initToRecipients(account, accountEmail, refMessage.from, replytoAddress,
-                    sentToAddresses);
+            toAddresses = initToRecipients(account, accountEmail, refMessage.getFrom(),
+                    replytoAddress, sentToAddresses);
             addToAddresses(toAddresses);
         } else if (action == ComposeActivity.REPLY_ALL) {
             final Set<String> ccAddresses = Sets.newHashSet();
-            toAddresses = initToRecipients(account, accountEmail, refMessage.from, replytoAddress,
-                    sentToAddresses);
+            toAddresses = initToRecipients(account, accountEmail, refMessage.getFrom(),
+                    replytoAddress, sentToAddresses);
             addToAddresses(toAddresses);
             addRecipients(accountEmail, ccAddresses, sentToAddresses);
             addRecipients(accountEmail, ccAddresses, refMessage.getCcAddresses());
@@ -2348,7 +2350,7 @@
         MessageModification.putCcAddresses(values, message.getCcAddresses());
         MessageModification.putBccAddresses(values, message.getBccAddresses());
 
-        MessageModification.putCustomFromAddress(values, message.from);
+        MessageModification.putCustomFromAddress(values, message.getFrom());
 
         MessageModification.putSubject(values, message.subject);
         String htmlBody = Html.toHtml(new SpannableString(body.toString()));
@@ -2611,10 +2613,11 @@
             if (mDraft != null) {
                 // Following desktop behavior, if the user has added a BCC
                 // field to a draft, we show it regardless of compose mode.
-                showBcc = !TextUtils.isEmpty(mDraft.bcc);
+                showBcc = !TextUtils.isEmpty(mDraft.getBcc());
                 // Use the draft to determine what to populate.
                 // If the Bcc field is showing, show the Cc field whether it is populated or not.
-                showCc = showBcc || (!TextUtils.isEmpty(mDraft.cc) && mComposeMode == REPLY_ALL);
+                showCc = showBcc
+                        || (!TextUtils.isEmpty(mDraft.getCc()) && mComposeMode == REPLY_ALL);
             } else if (mRefMessage != null) {
                 showCc = !TextUtils.isEmpty(mCc.getText());
             }
@@ -2984,8 +2987,8 @@
                 if (data != null && data.moveToFirst()) {
                     mRefMessage = new Message(data);
                     // We set these based on EXTRA_TO.
-                    mRefMessage.to = null;
-                    mRefMessage.from = null;
+                    mRefMessage.setTo(null);
+                    mRefMessage.setFrom(null);
                     Intent intent = getIntent();
                     int action = intent.getIntExtra(EXTRA_ACTION, COMPOSE);
                     initFromRefMessage(action, mAccount.name);
diff --git a/src/com/android/mail/compose/QuotedTextView.java b/src/com/android/mail/compose/QuotedTextView.java
index 433cdb6..c8ddc3e 100644
--- a/src/com/android/mail/compose/QuotedTextView.java
+++ b/src/com/android/mail/compose/QuotedTextView.java
@@ -262,7 +262,7 @@
                             resources.getString(R.string.reply_attribution),
                             dateFormat.format(date),
                             Utils.cleanUpString(
-                                    refMessage.from, true)));
+                                    refMessage.getFrom(), true)));
             quotedText.append(HEADER_SEPARATOR);
             quotedText.append(BLOCKQUOTE_BEGIN);
             quotedText.append(htmlText);
@@ -272,12 +272,12 @@
             quotedText.append(sQuoteBegin);
             quotedText
                     .append(String.format(resources.getString(R.string.forward_attribution), Utils
-                            .cleanUpString(refMessage.from,
+                            .cleanUpString(refMessage.getFrom(),
                                     true /* remove empty quotes */), dateFormat.format(date), Utils
                             .cleanUpString(refMessage.subject,
                                     false /* don't remove empty quotes */), Utils.cleanUpString(
-                            refMessage.to, true)));
-            String ccAddresses = refMessage.cc;
+                            refMessage.getTo(), true)));
+            String ccAddresses = refMessage.getCc();
             quotedText.append(String.format(resources.getString(R.string.cc_attribution),
                     Utils.cleanUpString(ccAddresses, true /* remove empty quotes */)));
             quotedText.append(HEADER_SEPARATOR);
diff --git a/src/com/android/mail/providers/Message.java b/src/com/android/mail/providers/Message.java
index 5189d6b..37e60f2 100644
--- a/src/com/android/mail/providers/Message.java
+++ b/src/com/android/mail/providers/Message.java
@@ -74,23 +74,23 @@
     /**
      * @see UIProvider.MessageColumns#FROM
      */
-    public String from;
+    private String mFrom;
     /**
      * @see UIProvider.MessageColumns#TO
      */
-    public String to;
+    private String mTo;
     /**
      * @see UIProvider.MessageColumns#CC
      */
-    public String cc;
+    private String mCc;
     /**
      * @see UIProvider.MessageColumns#BCC
      */
-    public String bcc;
+    private String mBcc;
     /**
      * @see UIProvider.MessageColumns#REPLY_TO
      */
-    public String replyTo;
+    private String mReplyTo;
     /**
      * @see UIProvider.MessageColumns#DATE_RECEIVED_MS
      */
@@ -224,11 +224,11 @@
         dest.writeParcelable(conversationUri, 0);
         dest.writeString(subject);
         dest.writeString(snippet);
-        dest.writeString(from);
-        dest.writeString(to);
-        dest.writeString(cc);
-        dest.writeString(bcc);
-        dest.writeString(replyTo);
+        dest.writeString(mFrom);
+        dest.writeString(mTo);
+        dest.writeString(mCc);
+        dest.writeString(mBcc);
+        dest.writeString(mReplyTo);
         dest.writeLong(dateReceivedMs);
         dest.writeString(bodyHtml);
         dest.writeString(bodyText);
@@ -260,11 +260,11 @@
         conversationUri = in.readParcelable(null);
         subject = in.readString();
         snippet = in.readString();
-        from = in.readString();
-        to = in.readString();
-        cc = in.readString();
-        bcc = in.readString();
-        replyTo = in.readString();
+        mFrom = in.readString();
+        mTo = in.readString();
+        mCc = in.readString();
+        mBcc = in.readString();
+        mReplyTo = in.readString();
         dateReceivedMs = in.readLong();
         bodyHtml = in.readString();
         bodyText = in.readString();
@@ -322,11 +322,11 @@
             conversationUri = !TextUtils.isEmpty(convUriStr) ? Uri.parse(convUriStr) : null;
             subject = cursor.getString(UIProvider.MESSAGE_SUBJECT_COLUMN);
             snippet = cursor.getString(UIProvider.MESSAGE_SNIPPET_COLUMN);
-            from = cursor.getString(UIProvider.MESSAGE_FROM_COLUMN);
-            to = cursor.getString(UIProvider.MESSAGE_TO_COLUMN);
-            cc = cursor.getString(UIProvider.MESSAGE_CC_COLUMN);
-            bcc = cursor.getString(UIProvider.MESSAGE_BCC_COLUMN);
-            replyTo = cursor.getString(UIProvider.MESSAGE_REPLY_TO_COLUMN);
+            mFrom = cursor.getString(UIProvider.MESSAGE_FROM_COLUMN);
+            mTo = cursor.getString(UIProvider.MESSAGE_TO_COLUMN);
+            mCc = cursor.getString(UIProvider.MESSAGE_CC_COLUMN);
+            mBcc = cursor.getString(UIProvider.MESSAGE_BCC_COLUMN);
+            mReplyTo = cursor.getString(UIProvider.MESSAGE_REPLY_TO_COLUMN);
             dateReceivedMs = cursor.getLong(UIProvider.MESSAGE_DATE_RECEIVED_MS_COLUMN);
             bodyHtml = cursor.getString(UIProvider.MESSAGE_BODY_HTML_COLUMN);
             bodyText = cursor.getString(UIProvider.MESSAGE_BODY_TEXT_COLUMN);
@@ -379,37 +379,82 @@
                 UIProvider.MessageFlags.CALENDAR_INVITE;
     }
 
+    public String getFrom() {
+        return mFrom;
+    }
+
+    public synchronized void setFrom(final String from) {
+        mFrom = from;
+        mFromAddresses = null;
+    }
+
+    public String getTo() {
+        return mTo;
+    }
+
+    public synchronized void setTo(final String to) {
+        mTo = to;
+        mToAddresses = null;
+    }
+
+    public String getCc() {
+        return mCc;
+    }
+
+    public synchronized void setCc(final String cc) {
+        mCc = cc;
+        mCcAddresses = null;
+    }
+
+    public String getBcc() {
+        return mBcc;
+    }
+
+    public synchronized void setBcc(final String bcc) {
+        mBcc = bcc;
+        mBccAddresses = null;
+    }
+
+    public String getReplyTo() {
+        return mReplyTo;
+    }
+
+    public synchronized void setReplyTo(final String replyTo) {
+        mReplyTo = replyTo;
+        mReplyToAddresses = null;
+    }
+
     public synchronized String[] getFromAddresses() {
         if (mFromAddresses == null) {
-            mFromAddresses = tokenizeAddresses(from);
+            mFromAddresses = tokenizeAddresses(mFrom);
         }
         return mFromAddresses;
     }
 
     public synchronized String[] getToAddresses() {
         if (mToAddresses == null) {
-            mToAddresses = tokenizeAddresses(to);
+            mToAddresses = tokenizeAddresses(mTo);
         }
         return mToAddresses;
     }
 
     public synchronized String[] getCcAddresses() {
         if (mCcAddresses == null) {
-            mCcAddresses = tokenizeAddresses(cc);
+            mCcAddresses = tokenizeAddresses(mCc);
         }
         return mCcAddresses;
     }
 
     public synchronized String[] getBccAddresses() {
         if (mBccAddresses == null) {
-            mBccAddresses = tokenizeAddresses(bcc);
+            mBccAddresses = tokenizeAddresses(mBcc);
         }
         return mBccAddresses;
     }
 
     public synchronized String[] getReplyToAddresses() {
         if (mReplyToAddresses == null) {
-            mReplyToAddresses = tokenizeAddresses(replyTo);
+            mReplyToAddresses = tokenizeAddresses(mReplyTo);
         }
         return mReplyToAddresses;
     }
diff --git a/src/com/android/mail/ui/ConversationViewFragment.java b/src/com/android/mail/ui/ConversationViewFragment.java
index d5626ee..6fb683f 100644
--- a/src/com/android/mail/ui/ConversationViewFragment.java
+++ b/src/com/android/mail/ui/ConversationViewFragment.java
@@ -1162,7 +1162,7 @@
             if (!mViewState.contains(m)) {
                 LogUtils.i(LOG_TAG, "conversation diff: found new msg: %s", m.uri);
 
-                final Address from = getAddress(m.from);
+                final Address from = getAddress(m.getFrom());
                 // distinguish ours from theirs
                 // new messages from the account owner should not trigger a
                 // notification
@@ -1173,7 +1173,7 @@
                 }
 
                 info.count++;
-                info.senderAddress = m.from;
+                info.senderAddress = m.getFrom();
             }
         }
         return info;
@@ -1194,7 +1194,7 @@
             final ConversationMessage newMsg = newCursor.getMessage();
             final ConversationMessage oldMsg = oldCursor.getMessage();
 
-            if (!TextUtils.equals(newMsg.from, oldMsg.from) ||
+            if (!TextUtils.equals(newMsg.getFrom(), oldMsg.getFrom()) ||
                     newMsg.isSending != oldMsg.isSending) {
                 mAdapter.updateItemsForMessage(newMsg, changedOverlayPositions);
                 LogUtils.i(LOG_TAG, "msg #%d (%d): detected from/sending change. isSending=%s",
diff --git a/tests/src/com/android/mail/compose/ComposeActivityTest.java b/tests/src/com/android/mail/compose/ComposeActivityTest.java
index 52dd982..232dfd5 100644
--- a/tests/src/com/android/mail/compose/ComposeActivityTest.java
+++ b/tests/src/com/android/mail/compose/ComposeActivityTest.java
@@ -96,7 +96,7 @@
         final Message refMessage = getRefMessage();
         final ComposeActivity activity = mActivity;
         final Account account = mAccount;
-        final String refMessageFromAccount = refMessage.from;
+        final String refMessageFromAccount = refMessage.getFrom();
 
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
@@ -116,10 +116,10 @@
     public void testReplyWithReplyTo() {
         setAccount("account1@mockuiprovider.com");
         final Message refMessage = getRefMessage();
-        refMessage.replyTo = "replytofromaccount1@mock.com";
+        refMessage.setReplyTo("replytofromaccount1@mock.com");
         final ComposeActivity activity = mActivity;
         final Account account = mAccount;
-        final String refReplyToAccount = refMessage.replyTo;
+        final String refReplyToAccount = refMessage.getReplyTo();
 
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
@@ -145,11 +145,11 @@
         setAccount("account2@mockuiprovider.com");
         final Message refMessage = getRefMessage();
         final String customFrom = "CUSTOMaccounta@mockuiprovider.com";
-        refMessage.from = "account2@mockuiprovider.com";
-        refMessage.to = "someotheraccount@mockuiprovider.com, "
+        refMessage.setFrom("account2@mockuiprovider.com");
+        refMessage.setTo("someotheraccount@mockuiprovider.com, "
                 + "someotheraccount2@mockuiprovider.com, someotheraccount3@mockuiprovider.com, "
-                + customFrom;
-        refMessage.replyTo = customFrom;
+                + customFrom);
+        refMessage.setReplyTo(customFrom);
         final ComposeActivity activity = mActivity;
         final Account account = mAccount;
         mActivity.mFromSpinner = new FromAddressSpinner(mActivity);
@@ -185,8 +185,8 @@
         final Message refMessage = getRefMessage();
         final ComposeActivity activity = mActivity;
         final Account account = mAccount;
-        final String[] refMessageTo = TextUtils.split(refMessage.to, ",");
-        final String refMessageFromAccount = refMessage.from;
+        final String[] refMessageTo = TextUtils.split(refMessage.getTo(), ",");
+        final String refMessageFromAccount = refMessage.getFrom();
 
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
@@ -206,11 +206,11 @@
     public void testReplyAllWithReplyTo() {
         setAccount("account1@mockuiprovider.com");
         final Message refMessage = getRefMessage();
-        refMessage.replyTo = "replytofromaccount1@mock.com";
+        refMessage.setReplyTo("replytofromaccount1@mock.com");
         final ComposeActivity activity = mActivity;
         final Account account = mAccount;
-        final String[] refMessageTo = TextUtils.split(refMessage.to, ",");
-        final String refReplyToAccount = refMessage.replyTo;
+        final String[] refMessageTo = TextUtils.split(refMessage.getTo(), ",");
+        final String refReplyToAccount = refMessage.getReplyTo();
 
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
@@ -254,9 +254,9 @@
         final Message refMessage = getRefMessageWithCc(0, false);
         final ComposeActivity activity = mActivity;
         final Account account = mAccount;
-        final String[] refMessageTo = TextUtils.split(refMessage.to, ",");
-        final String[] refMessageCc = TextUtils.split(refMessage.cc, ",");
-        final String refMessageFromAccount = refMessage.from;
+        final String[] refMessageTo = TextUtils.split(refMessage.getTo(), ",");
+        final String[] refMessageCc = TextUtils.split(refMessage.getCc(), ",");
+        final String refMessageFromAccount = refMessage.getFrom();
 
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
@@ -326,8 +326,8 @@
     public void testRecipientsRefMessageReplyToSelf() {
         setAccount("account0@mockuiprovider.com");
         final Message refMessage = getRefMessage();
-        refMessage.from = "account0@mockuiprovider.com";
-        refMessage.to = "someotheraccount@mockuiprovider.com";
+        refMessage.setFrom("account0@mockuiprovider.com");
+        refMessage.setTo("someotheraccount@mockuiprovider.com");
         final ComposeActivity activity = mActivity;
         final Account account = mAccount;
 
@@ -338,7 +338,7 @@
                 String[] cc = activity.getCcAddresses();
                 String[] bcc = activity.getBccAddresses();
                 assertEquals(to.length, 1);
-                assertTrue(to[0].contains(refMessage.to));
+                assertTrue(to[0].contains(refMessage.getTo()));
                 assertEquals(cc.length, 0);
                 assertEquals(bcc.length, 0);
             }
@@ -352,13 +352,13 @@
     public void testRecipientsRefMessageReplyToCustomFrom() {
         setAccount("account1@mockuiprovider.com");
         final Message refMessage = getRefMessage();
-        refMessage.from = "CUSTOMaccount1@mockuiprovider.com";
-        refMessage.to = "someotheraccount@mockuiprovider.com";
+        refMessage.setFrom("CUSTOMaccount1@mockuiprovider.com");
+        refMessage.setTo("someotheraccount@mockuiprovider.com");
         final ComposeActivity activity = mActivity;
         final Account account = mAccount;
         mActivity.mFromSpinner = new FromAddressSpinner(mActivity);
-        ReplyFromAccount a = new ReplyFromAccount(mAccount, mAccount.uri, refMessage.from,
-                refMessage.from, refMessage.from, true, true);
+        ReplyFromAccount a = new ReplyFromAccount(mAccount, mAccount.uri, refMessage.getFrom(),
+                refMessage.getFrom(), refMessage.getFrom(), true, true);
         JSONArray array = new JSONArray();
         array.put(a.serialize());
         mAccount.accountFromAddresses = array.toString();
@@ -375,7 +375,7 @@
                 String[] cc = activity.getCcAddresses();
                 String[] bcc = activity.getBccAddresses();
                 assertEquals(to.length, 1);
-                assertTrue(to[0].contains(refMessage.to));
+                assertTrue(to[0].contains(refMessage.getTo()));
                 assertEquals(cc.length, 0);
                 assertEquals(bcc.length, 0);
             }
@@ -390,10 +390,10 @@
         setAccount("account1@mockuiprovider.com");
         final Message refMessage = getRefMessage();
         final String customFrom = "CUSTOMaccount1@mockuiprovider.com";
-        refMessage.from = "senderaccount@mockuiprovider.com";
-        refMessage.to = "someotheraccount@mockuiprovider.com, "
+        refMessage.setFrom("senderaccount@mockuiprovider.com");
+        refMessage.setTo("someotheraccount@mockuiprovider.com, "
                 + "someotheraccount2@mockuiprovider.com, someotheraccount3@mockuiprovider.com, "
-                + customFrom;
+                + customFrom);
         final ComposeActivity activity = mActivity;
         final Account account = mAccount;
         mActivity.mFromSpinner = new FromAddressSpinner(mActivity);
@@ -432,10 +432,10 @@
         setAccount("account1@mockuiprovider.com");
         final Message refMessage = getRefMessage();
         final String customFrom = "CUSTOMaccount1@mockuiprovider.com";
-        refMessage.from = "account1@mockuiprovider.com";
-        refMessage.to = "someotheraccount@mockuiprovider.com, "
+        refMessage.setFrom("account1@mockuiprovider.com");
+        refMessage.setTo("someotheraccount@mockuiprovider.com, "
                 + "someotheraccount2@mockuiprovider.com, someotheraccount3@mockuiprovider.com, "
-                + customFrom;
+                + customFrom);
         final ComposeActivity activity = mActivity;
         final Account account = mAccount;
         mActivity.mFromSpinner = new FromAddressSpinner(mActivity);
@@ -490,9 +490,9 @@
     public void testChangeModes0() {
         setAccount("account0@mockuiprovider.com");
         final Message refMessage = getRefMessage();
-        refMessage.from = "fromaccount@mockuiprovider.com";
-        refMessage.to = "account0@mockuiprovider.com";
-        refMessage.cc = "ccaccount@mockuiprovider.com";
+        refMessage.setFrom("fromaccount@mockuiprovider.com");
+        refMessage.setTo("account0@mockuiprovider.com");
+        refMessage.setCc("ccaccount@mockuiprovider.com");
         final ComposeActivity activity = mActivity;
         final Account account = mAccount;
         mActivity.runOnUiThread(new Runnable() {
@@ -503,14 +503,14 @@
                 String[] cc = activity.getCcAddresses();
                 String[] bcc = activity.getBccAddresses();
                 assertEquals(to.length, 1);
-                assertTrue(to[0].contains(refMessage.from));
+                assertTrue(to[0].contains(refMessage.getFrom()));
                 assertEquals(cc.length, 0);
                 assertEquals(bcc.length, 0);
                 activity.onNavigationItemSelected(1, ComposeActivity.REPLY_ALL);
                 assertEquals(activity.getToAddresses().length, 1);
-                assertTrue(activity.getToAddresses()[0].contains(refMessage.from));
+                assertTrue(activity.getToAddresses()[0].contains(refMessage.getFrom()));
                 assertEquals(activity.getCcAddresses().length, 1);
-                assertTrue(activity.getCcAddresses()[0].contains(refMessage.cc));
+                assertTrue(activity.getCcAddresses()[0].contains(refMessage.getCc()));
                 assertEquals(activity.getBccAddresses().length, 0);
                 activity.onNavigationItemSelected(2, ComposeActivity.FORWARD);
                 assertEquals(activity.getToAddresses().length, 0);
@@ -524,9 +524,9 @@
     public void testChangeModes1() {
         setAccount("account0@mockuiprovider.com");
         final Message refMessage = getRefMessage();
-        refMessage.from = "fromaccount@mockuiprovider.com";
-        refMessage.to = "account0@mockuiprovider.com, toaccount0@mockuiprovider.com";
-        refMessage.cc = "ccaccount@mockuiprovider.com";
+        refMessage.setFrom("fromaccount@mockuiprovider.com");
+        refMessage.setTo("account0@mockuiprovider.com, toaccount0@mockuiprovider.com");
+        refMessage.setCc("ccaccount@mockuiprovider.com");
         final ComposeActivity activity = mActivity;
         final Account account = mAccount;
         mActivity.runOnUiThread(new Runnable() {
@@ -537,15 +537,15 @@
                 String[] cc = activity.getCcAddresses();
                 String[] bcc = activity.getBccAddresses();
                 assertEquals(to.length, 1);
-                assertTrue(to[0].contains(refMessage.from));
+                assertTrue(to[0].contains(refMessage.getFrom()));
                 assertEquals(cc.length, 0);
                 assertEquals(bcc.length, 0);
                 activity.onNavigationItemSelected(1, ComposeActivity.REPLY_ALL);
                 assertEquals(activity.getToAddresses().length, 1);
-                assertTrue(activity.getToAddresses()[0].contains(refMessage.from));
+                assertTrue(activity.getToAddresses()[0].contains(refMessage.getFrom()));
                 assertEquals(activity.getCcAddresses().length, 2);
-                assertTrue(activity.getCcAddresses()[0].contains(refMessage.cc)
-                        || activity.getCcAddresses()[1].contains(refMessage.cc));
+                assertTrue(activity.getCcAddresses()[0].contains(refMessage.getCc())
+                        || activity.getCcAddresses()[1].contains(refMessage.getCc()));
                 assertTrue(activity.getCcAddresses()[0].contains("toaccount0@mockuiprovider.com")
                         || activity.getCcAddresses()[1]
                                 .contains("toaccount0@mockuiprovider.com"));
@@ -562,9 +562,9 @@
     public void testChangeModes2() {
         setAccount("account0@mockuiprovider.com");
         final Message refMessage = getRefMessage();
-        refMessage.from = "fromaccount@mockuiprovider.com";
-        refMessage.to = "account0@mockuiprovider.com, toaccount0@mockuiprovider.com";
-        refMessage.cc = "ccaccount@mockuiprovider.com, ccaccount2@mockuiprovider.com";
+        refMessage.setFrom("fromaccount@mockuiprovider.com");
+        refMessage.setTo("account0@mockuiprovider.com, toaccount0@mockuiprovider.com");
+        refMessage.setCc("ccaccount@mockuiprovider.com, ccaccount2@mockuiprovider.com");
         final ComposeActivity activity = mActivity;
         final Account account = mAccount;
         mActivity.runOnUiThread(new Runnable() {
@@ -575,12 +575,12 @@
                 String[] cc = activity.getCcAddresses();
                 String[] bcc = activity.getBccAddresses();
                 assertEquals(to.length, 1);
-                assertTrue(to[0].contains(refMessage.from));
+                assertTrue(to[0].contains(refMessage.getFrom()));
                 assertEquals(cc.length, 0);
                 assertEquals(bcc.length, 0);
                 activity.onNavigationItemSelected(1, ComposeActivity.REPLY_ALL);
                 assertEquals(activity.getToAddresses().length, 1);
-                assertTrue(activity.getToAddresses()[0].contains(refMessage.from));
+                assertTrue(activity.getToAddresses()[0].contains(refMessage.getFrom()));
                 assertEquals(activity.getCcAddresses().length, 3);
                 assertTrue(activity.getCcAddresses()[0].contains("ccaccount@mockuiprovider.com")
                         || activity.getCcAddresses()[1].contains("ccaccount@mockuiprovider.com")
