diff --git a/src/com/android/mail/browse/ConversationItemView.java b/src/com/android/mail/browse/ConversationItemView.java
index 7984950..786af85 100644
--- a/src/com/android/mail/browse/ConversationItemView.java
+++ b/src/com/android/mail/browse/ConversationItemView.java
@@ -585,7 +585,7 @@
         if (mHeader.conversation.conversationInfo != null) {
             Context context = getContext();
             mHeader.messageInfoString = SendersView
-                    .createMessageInfo(context, mHeader.conversation);
+                    .createMessageInfo(context, mHeader.conversation, true);
             int maxChars = ConversationItemViewCoordinates.getSendersLength(context,
                     ConversationItemViewCoordinates.getMode(context, mActivity.getViewMode()),
                     mHeader.conversation.hasAttachments);
@@ -594,11 +594,12 @@
             mHeader.styledSenders = new ArrayList<SpannableString>();
             SendersView.format(context, mHeader.conversation.conversationInfo,
                     mHeader.messageInfoString.toString(), maxChars, mHeader.styledSenders,
-                    mHeader.displayableSenderNames, mHeader.displayableSenderEmails, mAccount);
+                    mHeader.displayableSenderNames, mHeader.displayableSenderEmails, mAccount,
+                    true);
             // If we have displayable sendres, load their thumbnails
             loadSenderImages();
         } else {
-            SendersView.formatSenders(mHeader, getContext());
+            SendersView.formatSenders(mHeader, getContext(), true);
         }
 
         SpannableString spannableDate = new SpannableString(DateUtils.getRelativeTimeSpanString(
diff --git a/src/com/android/mail/browse/SendersView.java b/src/com/android/mail/browse/SendersView.java
index b6870a9..4f43326 100644
--- a/src/com/android/mail/browse/SendersView.java
+++ b/src/com/android/mail/browse/SendersView.java
@@ -95,13 +95,14 @@
         return isUnread ? Typeface.DEFAULT_BOLD : Typeface.DEFAULT;
     }
 
-    private static void getSenderResources(Context context) {
-        if (sConfigurationChangedReceiver == null) {
+    private static synchronized void getSenderResources(
+            Context context, final boolean resourceCachingRequired) {
+        if (sConfigurationChangedReceiver == null && resourceCachingRequired) {
             sConfigurationChangedReceiver = new BroadcastReceiver() {
                 @Override
                 public void onReceive(Context context, Intent intent) {
                     sDraftSingularString = null;
-                    getSenderResources(context);
+                    getSenderResources(context, true);
                 }
             };
             context.registerReceiver(sConfigurationChangedReceiver, new IntentFilter(
@@ -127,87 +128,108 @@
         }
     }
 
-    public static SpannableStringBuilder createMessageInfo(Context context, Conversation conv) {
-        ConversationInfo conversationInfo = conv.conversationInfo;
-        int sendingStatus = conv.sendingState;
+    public static SpannableStringBuilder createMessageInfo(Context context, Conversation conv,
+            final boolean resourceCachingRequired) {
         SpannableStringBuilder messageInfo = new SpannableStringBuilder();
-        boolean hasSenders = false;
-        // This covers the case where the sender is "me" and this is a draft
-        // message, which means this will only run once most of the time.
-        for (MessageInfo m : conversationInfo.messageInfos) {
-            if (!TextUtils.isEmpty(m.sender)) {
-                hasSenders = true;
-                break;
+
+        try {
+            ConversationInfo conversationInfo = conv.conversationInfo;
+            int sendingStatus = conv.sendingState;
+            boolean hasSenders = false;
+            // This covers the case where the sender is "me" and this is a draft
+            // message, which means this will only run once most of the time.
+            for (MessageInfo m : conversationInfo.messageInfos) {
+                if (!TextUtils.isEmpty(m.sender)) {
+                    hasSenders = true;
+                    break;
+                }
+            }
+            getSenderResources(context, resourceCachingRequired);
+            if (conversationInfo != null) {
+                int count = conversationInfo.messageCount;
+                int draftCount = conversationInfo.draftCount;
+                boolean showSending = sendingStatus == UIProvider.ConversationSendingState.SENDING;
+                if (count > 1) {
+                    messageInfo.append(count + "");
+                }
+                messageInfo.setSpan(CharacterStyle.wrap(
+                        conv.read ? sMessageInfoReadStyleSpan : sMessageInfoUnreadStyleSpan),
+                        0, messageInfo.length(), 0);
+                if (draftCount > 0) {
+                    // If we are showing a message count or any draft text and there
+                    // is at least 1 sender, prepend the sending state text with a
+                    // comma.
+                    if (hasSenders || count > 1) {
+                        messageInfo.append(sSendersSplitToken);
+                    }
+                    SpannableStringBuilder draftString = new SpannableStringBuilder();
+                    if (draftCount == 1) {
+                        draftString.append(sDraftSingularString);
+                    } else {
+                        draftString.append(sDraftPluralString
+                                + String.format(sDraftCountFormatString, draftCount));
+                    }
+                    draftString.setSpan(CharacterStyle.wrap(sDraftsStyleSpan), 0,
+                            draftString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+                    messageInfo.append(draftString);
+                }
+                if (showSending) {
+                    // If we are showing a message count or any draft text, prepend
+                    // the sending state text with a comma.
+                    if (count > 1 || draftCount > 0) {
+                        messageInfo.append(sSendersSplitToken);
+                    }
+                    SpannableStringBuilder sending = new SpannableStringBuilder();
+                    sending.append(sSendingString);
+                    sending.setSpan(sSendingStyleSpan, 0, sending.length(), 0);
+                    messageInfo.append(sending);
+                }
+                // Prepend a space if we are showing other message info text.
+                if (count > 1 || (draftCount > 0 && hasSenders) || showSending) {
+                    messageInfo = new SpannableStringBuilder(sMessageCountSpacerString)
+                            .append(messageInfo);
+                }
+            }
+        } finally {
+            if (!resourceCachingRequired) {
+                clearResourceCache();
             }
         }
-        getSenderResources(context);
-        if (conversationInfo != null) {
-            int count = conversationInfo.messageCount;
-            int draftCount = conversationInfo.draftCount;
-            boolean showSending = sendingStatus == UIProvider.ConversationSendingState.SENDING;
-            if (count > 1) {
-                messageInfo.append(count + "");
-            }
-            messageInfo.setSpan(CharacterStyle.wrap(
-                    conv.read ? sMessageInfoReadStyleSpan : sMessageInfoUnreadStyleSpan),
-                    0, messageInfo.length(), 0);
-            if (draftCount > 0) {
-                // If we are showing a message count or any draft text and there
-                // is at least 1 sender, prepend the sending state text with a
-                // comma.
-                if (hasSenders || count > 1) {
-                    messageInfo.append(sSendersSplitToken);
-                }
-                SpannableStringBuilder draftString = new SpannableStringBuilder();
-                if (draftCount == 1) {
-                    draftString.append(sDraftSingularString);
-                } else {
-                    draftString.append(sDraftPluralString
-                            + String.format(sDraftCountFormatString, draftCount));
-                }
-                draftString.setSpan(CharacterStyle.wrap(sDraftsStyleSpan), 0, draftString.length(),
-                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-                messageInfo.append(draftString);
-            }
-            if (showSending) {
-                // If we are showing a message count or any draft text, prepend
-                // the sending state text with a comma.
-                if (count > 1 || draftCount > 0) {
-                    messageInfo.append(sSendersSplitToken);
-                }
-                SpannableStringBuilder sending = new SpannableStringBuilder();
-                sending.append(sSendingString);
-                sending.setSpan(sSendingStyleSpan, 0, sending.length(), 0);
-                messageInfo.append(sending);
-            }
-            // Prepend a space if we are showing other message info text.
-            if (count > 1 || (draftCount > 0 && hasSenders) || showSending) {
-                messageInfo = new SpannableStringBuilder(sMessageCountSpacerString)
-                        .append(messageInfo);
-            }
-        }
+
         return messageInfo;
     }
 
     public static void format(Context context, ConversationInfo conversationInfo,
             String messageInfo, int maxChars, ArrayList<SpannableString> styledSenders,
             ArrayList<String> displayableSenderNames, ArrayList<String> displayableSenderEmails,
-            String account) {
-        getSenderResources(context);
-        format(context, conversationInfo, messageInfo, maxChars, styledSenders,
-                displayableSenderNames, displayableSenderEmails, account,
-                sUnreadStyleSpan, sReadStyleSpan);
+            String account, final boolean resourceCachingRequired) {
+        try {
+            getSenderResources(context, resourceCachingRequired);
+            format(context, conversationInfo, messageInfo, maxChars, styledSenders,
+                    displayableSenderNames, displayableSenderEmails, account,
+                    sUnreadStyleSpan, sReadStyleSpan, resourceCachingRequired);
+        } finally {
+            if (!resourceCachingRequired) {
+                clearResourceCache();
+            }
+        }
     }
 
     public static void format(Context context, ConversationInfo conversationInfo,
             String messageInfo, int maxChars, ArrayList<SpannableString> styledSenders,
             ArrayList<String> displayableSenderNames, ArrayList<String> displayableSenderEmails,
             String account, final TextAppearanceSpan notificationUnreadStyleSpan,
-            final CharacterStyle notificationReadStyleSpan) {
-        getSenderResources(context);
-        handlePriority(context, maxChars, messageInfo, conversationInfo, styledSenders,
-                displayableSenderNames, displayableSenderEmails, account,
-                notificationUnreadStyleSpan, notificationReadStyleSpan);
+            final CharacterStyle notificationReadStyleSpan, final boolean resourceCachingRequired) {
+        try {
+            getSenderResources(context, resourceCachingRequired);
+            handlePriority(context, maxChars, messageInfo, conversationInfo, styledSenders,
+                    displayableSenderNames, displayableSenderEmails, account,
+                    notificationUnreadStyleSpan, notificationReadStyleSpan);
+        } finally {
+            if (!resourceCachingRequired) {
+                clearResourceCache();
+            }
+        }
     }
 
     public static void handlePriority(Context context, int maxChars, String messageInfoString,
@@ -363,25 +385,32 @@
     }
 
     private static void formatDefault(ConversationItemViewModel header, String sendersString,
-            Context context, final CharacterStyle readStyleSpan) {
-        getSenderResources(context);
-        // Clear any existing sender fragments; we must re-make all of them.
-        header.senderFragments.clear();
-        String[] senders = TextUtils.split(sendersString, Address.ADDRESS_DELIMETER);
-        String[] namesOnly = new String[senders.length];
-        Rfc822Token[] senderTokens;
-        String display;
-        for (int i = 0; i < senders.length; i++) {
-            senderTokens = Rfc822Tokenizer.tokenize(senders[i]);
-            if (senderTokens != null && senderTokens.length > 0) {
-                display = senderTokens[0].getName();
-                if (TextUtils.isEmpty(display)) {
-                    display = senderTokens[0].getAddress();
+            Context context, final CharacterStyle readStyleSpan,
+            final boolean resourceCachingRequired) {
+        try {
+            getSenderResources(context, resourceCachingRequired);
+            // Clear any existing sender fragments; we must re-make all of them.
+            header.senderFragments.clear();
+            String[] senders = TextUtils.split(sendersString, Address.ADDRESS_DELIMETER);
+            String[] namesOnly = new String[senders.length];
+            Rfc822Token[] senderTokens;
+            String display;
+            for (int i = 0; i < senders.length; i++) {
+                senderTokens = Rfc822Tokenizer.tokenize(senders[i]);
+                if (senderTokens != null && senderTokens.length > 0) {
+                    display = senderTokens[0].getName();
+                    if (TextUtils.isEmpty(display)) {
+                        display = senderTokens[0].getAddress();
+                    }
+                    namesOnly[i] = display;
                 }
-                namesOnly[i] = display;
+            }
+            generateSenderFragments(header, namesOnly, readStyleSpan);
+        } finally {
+            if (!resourceCachingRequired) {
+                clearResourceCache();
             }
         }
-        generateSenderFragments(header, namesOnly, readStyleSpan);
     }
 
     private static void generateSenderFragments(ConversationItemViewModel header, String[] names,
@@ -391,13 +420,31 @@
                 true);
     }
 
-    public static void formatSenders(ConversationItemViewModel header, Context context) {
-        getSenderResources(context);
-        formatSenders(header, context, sReadStyleSpan);
+    public static void formatSenders(ConversationItemViewModel header, Context context,
+            final boolean resourceCachingRequired) {
+        try {
+            getSenderResources(context, resourceCachingRequired);
+            formatSenders(header, context, sReadStyleSpan, resourceCachingRequired);
+        } finally {
+            if (!resourceCachingRequired) {
+                clearResourceCache();
+            }
+        }
     }
 
     public static void formatSenders(ConversationItemViewModel header, Context context,
-            final CharacterStyle readStyleSpan) {
-        formatDefault(header, header.conversation.senders, context, readStyleSpan);
+            final CharacterStyle readStyleSpan, final boolean resourceCachingRequired) {
+        try {
+            formatDefault(header, header.conversation.senders, context, readStyleSpan,
+                    resourceCachingRequired);
+        } finally {
+            if (!resourceCachingRequired) {
+                clearResourceCache();
+            }
+        }
+    }
+
+    private static void clearResourceCache() {
+        sDraftSingularString = null;
     }
 }
diff --git a/src/com/android/mail/providers/MailAppProvider.java b/src/com/android/mail/providers/MailAppProvider.java
index 587170d..798c446 100644
--- a/src/com/android/mail/providers/MailAppProvider.java
+++ b/src/com/android/mail/providers/MailAppProvider.java
@@ -295,8 +295,8 @@
                     case UIProvider.ACCOUNT_SETTINGS_REPLY_BEHAVIOR_COLUMN:
                         builder.add(Integer.valueOf(account.settings.replyBehavior));
                         break;
-                    case UIProvider.ACCOUNT_SETTINGS_HIDE_CHECKBOXES_COLUMN:
-                        builder.add(Integer.valueOf(account.settings.hideCheckboxes ? 1 : 0));
+                    case UIProvider.ACCOUNT_SETTINGS_SHOW_CHECKBOXES_COLUMN:
+                        builder.add(Integer.valueOf(account.settings.showCheckboxes ? 1 : 0));
                         break;
                     case UIProvider.ACCOUNT_SETTINGS_CONFIRM_DELETE_COLUMN:
                         builder.add(Integer.valueOf(account.settings.confirmDelete ? 1 : 0));
diff --git a/src/com/android/mail/providers/Settings.java b/src/com/android/mail/providers/Settings.java
index b77a19d..d37bab1 100644
--- a/src/com/android/mail/providers/Settings.java
+++ b/src/com/android/mail/providers/Settings.java
@@ -66,7 +66,7 @@
     public final int messageTextSize;
     public final int snapHeaders;
     public final int replyBehavior;
-    public final boolean hideCheckboxes;
+    public final boolean showCheckboxes;
     public final boolean confirmDelete;
     public final boolean confirmArchive;
     public final boolean confirmSend;
@@ -101,7 +101,7 @@
         messageTextSize = MessageTextSize.NORMAL;
         snapHeaders = SnapHeaderValue.ALWAYS;
         replyBehavior = DefaultReplyBehavior.REPLY;
-        hideCheckboxes = false;
+        showCheckboxes = false;
         confirmDelete = false;
         confirmArchive = false;
         confirmSend = false;
@@ -122,7 +122,7 @@
         messageTextSize = inParcel.readInt();
         snapHeaders = inParcel.readInt();
         replyBehavior = inParcel.readInt();
-        hideCheckboxes = inParcel.readInt() != 0;
+        showCheckboxes = inParcel.readInt() != 0;
         confirmDelete = inParcel.readInt() != 0;
         confirmArchive = inParcel.readInt() != 0;
         confirmSend = inParcel.readInt() != 0;
@@ -143,7 +143,7 @@
         messageTextSize = cursor.getInt(UIProvider.ACCOUNT_SETTINGS_MESSAGE_TEXT_SIZE_COLUMN);
         snapHeaders = cursor.getInt(UIProvider.ACCOUNT_SETTINGS_SNAP_HEADERS_COLUMN);
         replyBehavior = cursor.getInt(UIProvider.ACCOUNT_SETTINGS_REPLY_BEHAVIOR_COLUMN);
-        hideCheckboxes = cursor.getInt(UIProvider.ACCOUNT_SETTINGS_HIDE_CHECKBOXES_COLUMN) != 0;
+        showCheckboxes = cursor.getInt(UIProvider.ACCOUNT_SETTINGS_SHOW_CHECKBOXES_COLUMN) != 0;
         confirmDelete = cursor.getInt(UIProvider.ACCOUNT_SETTINGS_CONFIRM_DELETE_COLUMN) != 0;
         confirmArchive = cursor.getInt(UIProvider.ACCOUNT_SETTINGS_CONFIRM_ARCHIVE_COLUMN) != 0;
         confirmSend = cursor.getInt(UIProvider.ACCOUNT_SETTINGS_CONFIRM_SEND_COLUMN) != 0;
@@ -173,8 +173,8 @@
                 sDefault.snapHeaders);
         replyBehavior = json.optInt(AccountColumns.SettingsColumns.REPLY_BEHAVIOR,
                 sDefault.replyBehavior);
-        hideCheckboxes = json.optBoolean(AccountColumns.SettingsColumns.HIDE_CHECKBOXES,
-                sDefault.hideCheckboxes);
+        showCheckboxes = json.optBoolean(AccountColumns.SettingsColumns.SHOW_CHECKBOXES,
+                sDefault.showCheckboxes);
         confirmDelete = json.optBoolean(AccountColumns.SettingsColumns.CONFIRM_DELETE,
                 sDefault.confirmDelete);
         confirmArchive = json.optBoolean(AccountColumns.SettingsColumns.CONFIRM_ARCHIVE,
@@ -228,7 +228,7 @@
             json.put(AccountColumns.SettingsColumns.MESSAGE_TEXT_SIZE, messageTextSize);
             json.put(AccountColumns.SettingsColumns.SNAP_HEADERS, snapHeaders);
             json.put(AccountColumns.SettingsColumns.REPLY_BEHAVIOR, replyBehavior);
-            json.put(AccountColumns.SettingsColumns.HIDE_CHECKBOXES, hideCheckboxes);
+            json.put(AccountColumns.SettingsColumns.SHOW_CHECKBOXES, showCheckboxes);
             json.put(AccountColumns.SettingsColumns.CONFIRM_DELETE, confirmDelete);
             json.put(AccountColumns.SettingsColumns.CONFIRM_ARCHIVE, confirmArchive);
             json.put(AccountColumns.SettingsColumns.CONFIRM_SEND, confirmSend);
@@ -298,7 +298,7 @@
         dest.writeInt(messageTextSize);
         dest.writeInt(snapHeaders);
         dest.writeInt(replyBehavior);
-        dest.writeInt(hideCheckboxes ? 1 : 0);
+        dest.writeInt(showCheckboxes ? 1 : 0);
         dest.writeInt(confirmDelete ? 1 : 0);
         dest.writeInt(confirmArchive? 1 : 0);
         dest.writeInt(confirmSend? 1 : 0);
@@ -391,7 +391,7 @@
                 && messageTextSize == that.messageTextSize
                 && snapHeaders == that.snapHeaders
                 && replyBehavior == that.replyBehavior
-                && hideCheckboxes == that.hideCheckboxes
+                && showCheckboxes == that.showCheckboxes
                 && confirmDelete == that.confirmDelete
                 && confirmArchive == that.confirmArchive
                 && confirmSend == that.confirmSend
@@ -420,7 +420,7 @@
     private final int calculateHashCode() {
         return super.hashCode()
                 ^ Objects.hashCode(signature, mAutoAdvance, mTransientAutoAdvance, messageTextSize,
-                        snapHeaders, replyBehavior, hideCheckboxes, confirmDelete, confirmArchive,
+                        snapHeaders, replyBehavior, showCheckboxes, confirmDelete, confirmArchive,
                         confirmSend, defaultInbox, forceReplyFromDefault, maxAttachmentSize, swipe,
                         priorityArrowsEnabled, setupIntentUri, conversationViewMode,
                         veiledAddressPattern);
diff --git a/src/com/android/mail/providers/UIProvider.java b/src/com/android/mail/providers/UIProvider.java
index 48af7d6..76772b0 100644
--- a/src/com/android/mail/providers/UIProvider.java
+++ b/src/com/android/mail/providers/UIProvider.java
@@ -151,7 +151,7 @@
             .put(AccountColumns.SettingsColumns.MESSAGE_TEXT_SIZE, Integer.class)
             .put(AccountColumns.SettingsColumns.SNAP_HEADERS, Integer.class)
             .put(AccountColumns.SettingsColumns.REPLY_BEHAVIOR, Integer.class)
-            .put(AccountColumns.SettingsColumns.HIDE_CHECKBOXES, Integer.class)
+            .put(AccountColumns.SettingsColumns.SHOW_CHECKBOXES, Integer.class)
             .put(AccountColumns.SettingsColumns.CONFIRM_DELETE, Integer.class)
             .put(AccountColumns.SettingsColumns.CONFIRM_ARCHIVE, Integer.class)
             .put(AccountColumns.SettingsColumns.CONFIRM_SEND, Integer.class)
@@ -203,7 +203,7 @@
     public static final int ACCOUNT_SETTINGS_MESSAGE_TEXT_SIZE_COLUMN = 28;
     public static final int ACCOUNT_SETTINGS_SNAP_HEADERS_COLUMN = 29;
     public static final int ACCOUNT_SETTINGS_REPLY_BEHAVIOR_COLUMN = 30;
-    public static final int ACCOUNT_SETTINGS_HIDE_CHECKBOXES_COLUMN = 31;
+    public static final int ACCOUNT_SETTINGS_SHOW_CHECKBOXES_COLUMN = 31;
     public static final int ACCOUNT_SETTINGS_CONFIRM_DELETE_COLUMN = 32;
     public static final int ACCOUNT_SETTINGS_CONFIRM_ARCHIVE_COLUMN = 33;
     public static final int ACCOUNT_SETTINGS_CONFIRM_SEND_COLUMN = 34;
@@ -528,9 +528,9 @@
 
             /**
              * Integer column containing the user's specified checkbox preference. A
-             * non zero value means to hide checkboxes.
+             * non zero value means to show checkboxes.
              */
-            public static final String HIDE_CHECKBOXES = "hide_checkboxes";
+            public static final String SHOW_CHECKBOXES = "show_checkboxes";
 
             /**
              * Integer column containing the user's specified confirm delete preference value.
@@ -638,8 +638,8 @@
             .put(AccountColumns.SettingsColumns.SNAP_HEADERS,ACCOUNT_SETTINGS_SNAP_HEADERS_COLUMN)
             .put(AccountColumns.SettingsColumns.REPLY_BEHAVIOR,
                     ACCOUNT_SETTINGS_REPLY_BEHAVIOR_COLUMN)
-            .put(AccountColumns.SettingsColumns.HIDE_CHECKBOXES,
-                    ACCOUNT_SETTINGS_HIDE_CHECKBOXES_COLUMN)
+            .put(AccountColumns.SettingsColumns.SHOW_CHECKBOXES,
+                    ACCOUNT_SETTINGS_SHOW_CHECKBOXES_COLUMN)
             .put(AccountColumns.SettingsColumns.CONFIRM_DELETE,
                     ACCOUNT_SETTINGS_CONFIRM_DELETE_COLUMN)
             .put(AccountColumns.SettingsColumns.CONFIRM_ARCHIVE,
diff --git a/src/com/android/mail/ui/AnimatedAdapter.java b/src/com/android/mail/ui/AnimatedAdapter.java
index d456783..e320ac3 100644
--- a/src/com/android/mail/ui/AnimatedAdapter.java
+++ b/src/com/android/mail/ui/AnimatedAdapter.java
@@ -211,7 +211,7 @@
             view = new SwipeableConversationItemView(context, mAccount.name);
         }
         view.bind(conv, mActivity, mBatchConversations, mFolder,
-                mAccount != null ? mAccount.settings.hideCheckboxes : false, mSwipeEnabled,
+                mAccount != null ? !mAccount.settings.showCheckboxes : false, mSwipeEnabled,
                 mPriorityMarkersEnabled, this);
         return view;
     }
@@ -541,7 +541,7 @@
             return;
         }
         ((SwipeableConversationItemView) view).bind(cursor, mActivity, mBatchConversations, mFolder,
-                mAccount != null ? mAccount.settings.hideCheckboxes : false,
+                mAccount != null ? !mAccount.settings.showCheckboxes : false,
                         mSwipeEnabled, mPriorityMarkersEnabled, this);
     }
 
@@ -551,7 +551,7 @@
                 position, null, parent);
         view.reset();
         view.bind(conversation, mActivity, mBatchConversations, mFolder,
-                mAccount != null ? mAccount.settings.hideCheckboxes : false, mSwipeEnabled,
+                mAccount != null ? !mAccount.settings.showCheckboxes : false, mSwipeEnabled,
                 mPriorityMarkersEnabled, this);
         mAnimatingViews.put(conversation.id, view);
         return view;
@@ -797,4 +797,4 @@
             item.cancelFadeOutText();
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/com/android/mail/ui/ConversationListFragment.java b/src/com/android/mail/ui/ConversationListFragment.java
index fa9f595..ec4c428 100644
--- a/src/com/android/mail/ui/ConversationListFragment.java
+++ b/src/com/android/mail/ui/ConversationListFragment.java
@@ -435,7 +435,7 @@
         if (!(view instanceof ToggleableItem)) {
             return;
         }
-        if (mAccount.settings.hideCheckboxes && !mSelectedSet.isEmpty()) {
+        if (!mAccount.settings.showCheckboxes && !mSelectedSet.isEmpty()) {
             ToggleableItem v = (ToggleableItem) view;
             v.toggleCheckMarkOrBeginDrag();
         } else {
diff --git a/src/com/android/mail/utils/LogUtils.java b/src/com/android/mail/utils/LogUtils.java
index 9ec466b..6176ec8 100644
--- a/src/com/android/mail/utils/LogUtils.java
+++ b/src/com/android/mail/utils/LogUtils.java
@@ -60,7 +60,7 @@
      * Used to enable/disable logging that we don't want included in
      * production releases.
      */
-    private static final int MAX_ENABLED_LOG_LEVEL = VERBOSE;
+    private static final int MAX_ENABLED_LOG_LEVEL = DEBUG;
 
     private static Boolean sDebugLoggingEnabledForTests = null;
 
diff --git a/src/com/android/mail/widget/WidgetService.java b/src/com/android/mail/widget/WidgetService.java
index fd31bf1..f588022 100644
--- a/src/com/android/mail/widget/WidgetService.java
+++ b/src/com/android/mail/widget/WidgetService.java
@@ -363,7 +363,7 @@
                 if (conversation.conversationInfo != null) {
                     ArrayList<SpannableString> senders = new ArrayList<SpannableString>();
                     SendersView.format(mContext, conversation.conversationInfo, "",
-                            MAX_SENDERS_LENGTH, senders, null, null, mAccount.name);
+                            MAX_SENDERS_LENGTH, senders, null, null, mAccount.name, true);
                     senderBuilder = ellipsizeStyledSenders(conversation.conversationInfo,
                             MAX_SENDERS_LENGTH, senders);
                 } else {
diff --git a/tests/src/com/android/mail/browse/SendersFormattingTests.java b/tests/src/com/android/mail/browse/SendersFormattingTests.java
index 2aa625f..2020c05 100644
--- a/tests/src/com/android/mail/browse/SendersFormattingTests.java
+++ b/tests/src/com/android/mail/browse/SendersFormattingTests.java
@@ -43,8 +43,8 @@
         conv.addMessage(info);
         ArrayList<SpannableString> strings = new ArrayList<SpannableString>();
         ArrayList<String> emailDisplays = null;
-        SendersView
-                .format(getContext(), conv, "", 100, strings, emailDisplays, emailDisplays, null);
+        SendersView.format(getContext(), conv, "", 100, strings, emailDisplays, emailDisplays,
+                null, false);
         assertEquals(1, strings.size());
         assertEquals(strings.get(0).toString(), "me");
 
@@ -52,8 +52,8 @@
         MessageInfo info2 = new MessageInfo(read, starred, "", -1, null);
         strings.clear();
         conv2.addMessage(info2);
-        SendersView
-                .format(getContext(), conv, "", 100, strings, emailDisplays, emailDisplays, null);
+        SendersView.format(getContext(), conv, "", 100, strings, emailDisplays, emailDisplays,
+                null, false);
         assertEquals(1, strings.size());
         assertEquals(strings.get(0).toString(), "me");
 
@@ -63,8 +63,8 @@
         MessageInfo info4 = new MessageInfo(read, starred, "", -1, null);
         conv3.addMessage(info4);
         strings.clear();
-        SendersView
-                .format(getContext(), conv, "", 100, strings, emailDisplays, emailDisplays, null);
+        SendersView.format(getContext(), conv, "", 100, strings, emailDisplays, emailDisplays,
+                null, false);
         assertEquals(1, strings.size());
         assertEquals(strings.get(0).toString(), "me");
     }
@@ -80,8 +80,8 @@
         conv.addMessage(info);
         MessageInfo info2 = new MessageInfo(read, starred, sender, -1, null);
         conv.addMessage(info2);
-        SendersView
-                .format(getContext(), conv, "", 100, strings, emailDisplays, emailDisplays, null);
+        SendersView.format(getContext(), conv, "", 100, strings, emailDisplays, emailDisplays,
+                null, false);
         // We actually don't remove the item, we just set it to null, so count
         // just the non-null items.
         int count = 0;
