diff --git a/res/values-sw600dp/dimen.xml b/res/values-sw600dp/dimen.xml
index 61d6cb3..237bfc0 100644
--- a/res/values-sw600dp/dimen.xml
+++ b/res/values-sw600dp/dimen.xml
@@ -43,7 +43,6 @@
     <dimen name="attachment_tile_min_size">180dp</dimen>
     <dimen name="attachment_tile_max_size">254dp</dimen>
     <dimen name="wait_padding">32dp</dimen>
-    <dimen name="folders_left_padding">8dip</dimen>
 
     <dimen name="compose_area_left_padding">80dip</dimen>
     <dimen name="compose_area_right_padding">80dip</dimen>
diff --git a/res/values/dimen.xml b/res/values/dimen.xml
index 1429704..7bbf99f 100644
--- a/res/values/dimen.xml
+++ b/res/values/dimen.xml
@@ -49,7 +49,7 @@
     <dimen name="move_slop">4dip</dimen>
     <dimen name="standard_scaled_dimen">100sp</dimen>
     <dimen name="folder_cell_width">8dip</dimen>
-    <dimen name="folders_left_padding">16dip</dimen>
+    <dimen name="folders_left_padding">4dip</dimen>
     <dimen name="triangle_width">15dip</dimen>
     <dimen name="conversation_page_gutter">16dp</dimen>
     <dimen name="conversation_message_content_margin_side">16dp</dimen>
diff --git a/src/com/android/mail/browse/ConversationItemView.java b/src/com/android/mail/browse/ConversationItemView.java
index 3687606..07392f9 100644
--- a/src/com/android/mail/browse/ConversationItemView.java
+++ b/src/com/android/mail/browse/ConversationItemView.java
@@ -73,6 +73,7 @@
 
 import com.android.mail.ui.DividedImageCanvas;
 import com.android.mail.ui.DividedImageCanvas.InvalidateCallback;
+import com.android.mail.ui.EllipsizedMultilineTextView;
 import com.android.mail.ui.FolderDisplayer;
 import com.android.mail.ui.SwipeableItemView;
 import com.android.mail.ui.SwipeableListView;
@@ -171,7 +172,7 @@
     private String mAccount;
     private ControllableActivity mActivity;
     private int mBackgroundOverride = -1;
-    private TextView mSubjectTextView;
+    private EllipsizedMultilineTextView mSubjectTextView;
     private TextView mSendersTextView;
     private TextView mDateTextView;
     private DividedImageCanvas mContactImagesHolder;
@@ -403,9 +404,10 @@
             sContactPhotoManager = ContactPhotoManager.createContactPhotoManager(context);
         }
 
-        mSubjectTextView = new TextView(mContext);
+        mSubjectTextView = new EllipsizedMultilineTextView(mContext);
         mSubjectTextView.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                 ViewGroup.LayoutParams.WRAP_CONTENT));
+        mSubjectTextView.setMaxLines(2);
         mSendersTextView = new TextView(mContext);
         mSendersTextView.setMaxLines(1);
         mSendersTextView.setEllipsize(TextUtils.TruncateAt.END);
@@ -679,56 +681,57 @@
         }
     }
 
-    private void createSubject(boolean isUnread, boolean activated) {
-        String subject = filterTag(mHeader.conversation.subject);
+    private void createSubject(final boolean isUnread, boolean activated) {
+        final String subject = filterTag(mHeader.conversation.subject);
         final String snippet = mHeader.conversation.getSnippet();
-        int maxWidth = -1;
+
+        SpannableStringBuilder subjectText = new SpannableStringBuilder(
+                Conversation.getSubjectAndSnippetForDisplay(mContext, subject, snippet));
+        int subjectTextLength = Math.min(subjectText.length(), subject.length());
+             if (!TextUtils.isEmpty(subject)) {
+                 subjectText.setSpan(TextAppearanceSpan.wrap(isUnread ?
+                         sSubjectTextUnreadSpan : sSubjectTextReadSpan), 0, subjectTextLength,
+                         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+             }
+             if (!TextUtils.isEmpty(snippet)) {
+                 final int startOffset = subjectTextLength;
+                 // Start after the end of the subject text; since the subject may be
+                 // "" or null, this could start at the 0th character in the
+                 // subectText string
+                 if (startOffset < subjectText.length()) {
+                     subjectText.setSpan(ForegroundColorSpan.wrap(isUnread ?
+                             sSnippetTextUnreadSpan : sSnippetTextReadSpan), startOffset,
+                             subjectText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+                 }
+             }
+             layoutSubject(subjectText);
+    }
+
+
+    private void layoutSubject(SpannableStringBuilder subjectText) {
+        int secondLineMaxWidth = EllipsizedMultilineTextView.ALL_AVAILABLE;
         if (!ConversationItemViewCoordinates.isWideMode(mMode) && mCoordinates.showFolders
                 && mHeader.folderDisplayer != null
                 && mHeader.folderDisplayer.hasVisibleFolders()) {
-            sPaint.setTextSize(mHeader.unread ? sSubjectTextUnreadSpan.getTextSize()
-                    : sSubjectTextReadSpan.getTextSize());
-            sPaint.setTypeface(mHeader.unread ? Typeface.DEFAULT_BOLD : Typeface.DEFAULT);
-            maxWidth = (mSendersWidth * 2)
-                        - ConversationItemViewCoordinates.getFoldersWidth(mContext, mMode)
-                        - sFoldersLeftPadding;
+            secondLineMaxWidth = mCoordinates.subjectWidth
+                    - Math.min(ConversationItemViewCoordinates.getFoldersWidth(mContext, mMode),
+                            mHeader.folderDisplayer.measureFolders(mMode))
+                    - sFoldersLeftPadding;
         }
-        SpannableStringBuilder subjectText = Conversation.getSubjectAndSnippetForDisplay(mContext,
-                subject, snippet, maxWidth, sPaint);
-        int subjectTextLength = Math.min(subjectText.length(), subject.length());
-        if (!TextUtils.isEmpty(subject)) {
-            subjectText.setSpan(TextAppearanceSpan.wrap(isUnread ?
-                    sSubjectTextUnreadSpan : sSubjectTextReadSpan), 0, subjectTextLength,
-                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-        }
-        if (!TextUtils.isEmpty(snippet)) {
-            final int startOffset = subjectTextLength;
-            // Start after the end of the subject text; since the subject may be
-            // "" or null, this could start at the 0th character in the
-            // subectText string
-            if (startOffset < subjectText.length()) {
-                subjectText.setSpan(ForegroundColorSpan.wrap(isUnread ?
-                        sSnippetTextUnreadSpan : sSnippetTextReadSpan), startOffset,
-                        subjectText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-            }
-        }
-        layoutSubject(subjectText);
-    }
-
-    private void layoutSubject(SpannableStringBuilder subjectText) {
-        TextView subjectLayout = mSubjectTextView;
+        EllipsizedMultilineTextView subjectLayout = mSubjectTextView;
         int subjectWidth = mCoordinates.subjectWidth;
-        int subjectHeight = (int) (subjectLayout.getLineHeight() * 2 + sPaint.descent());
+        int subjectHeight = (int) (subjectLayout.getLineHeight() * 2 + subjectLayout.getPaint()
+                .descent());
         if (isActivated() && showActivatedText()) {
             subjectText.setSpan(sActivatedTextSpan, 0, subjectText.length(),
                     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
         } else {
             subjectText.removeSpan(sActivatedTextSpan);
         }
-        subjectLayout.setText(subjectText, TextView.BufferType.SPANNABLE);
         subjectLayout.measure(MeasureSpec.makeMeasureSpec(subjectWidth, MeasureSpec.EXACTLY),
                 subjectHeight);
         subjectLayout.layout(0, 0, subjectWidth, subjectHeight);
+        subjectLayout.setText(subjectText, secondLineMaxWidth);
     }
 
     /**
diff --git a/src/com/android/mail/providers/Conversation.java b/src/com/android/mail/providers/Conversation.java
index 1554927..27121d8 100644
--- a/src/com/android/mail/providers/Conversation.java
+++ b/src/com/android/mail/providers/Conversation.java
@@ -23,9 +23,7 @@
 import android.os.Parcelable;
 import android.provider.BaseColumns;
 import android.text.SpannableStringBuilder;
-import android.text.TextPaint;
 import android.text.TextUtils;
-import android.text.TextUtils.TruncateAt;
 
 import com.android.mail.R;
 import com.android.mail.providers.UIProvider.ConversationColumns;
@@ -531,27 +529,14 @@
      * @param context
      * @param filteredSubject
      * @param snippet
-     * @param maxChars Supply max characters the returned string can have, or -1
-     *            if there is no limit
      */
-    public static SpannableStringBuilder getSubjectAndSnippetForDisplay(Context context,
-            String filteredSubject, String snippet, int avail, TextPaint paint) {
+    public static String getSubjectAndSnippetForDisplay(Context context,
+            String filteredSubject, String snippet) {
         if (sSubjectAndSnippet == null) {
             sSubjectAndSnippet = context.getString(R.string.subject_and_snippet);
         }
-        String subjectText = (!TextUtils.isEmpty(snippet)) ?
+        return (!TextUtils.isEmpty(snippet)) ?
                 String.format(sSubjectAndSnippet, filteredSubject, snippet)
                 : filteredSubject;
-        SpannableStringBuilder builder = new SpannableStringBuilder();
-        if (avail != -1) {
-            CharSequence ellipsizedText = TextUtils.ellipsize(subjectText, paint, avail,
-                    TruncateAt.END);
-            if (!TextUtils.isEmpty(ellipsizedText)) {
-                builder.append(ellipsizedText, 0, ellipsizedText.length() - 1);
-            }
-        } else {
-            builder.append(subjectText);
-        }
-        return builder;
     }
 }
diff --git a/src/com/android/mail/ui/EllipsizedMultilineTextView.java b/src/com/android/mail/ui/EllipsizedMultilineTextView.java
new file mode 100644
index 0000000..9d2746d
--- /dev/null
+++ b/src/com/android/mail/ui/EllipsizedMultilineTextView.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2013 Google Inc.
+ * Licensed to The Android Open Source Project.
+ *
+ * Licensed 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 com.android.mail.ui;
+
+import android.content.Context;
+import android.text.Layout;
+import android.text.SpannableStringBuilder;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+/**
+ * A special MultiLine TextView that will apply ellipsize logic to only the last
+ * line of text, such that the last line may be shorter than any previous lines.
+ */
+public class EllipsizedMultilineTextView extends TextView {
+
+    public static final int ALL_AVAILABLE = -1;
+    private int mMaxLines;
+    private int mLastWSpec;
+    private int mLastHSpec;
+
+    public EllipsizedMultilineTextView(Context context) {
+        this(context, null);
+    }
+
+    public EllipsizedMultilineTextView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    public void setMaxLines(int maxlines) {
+        super.setMaxLines(maxlines);
+        mMaxLines = maxlines;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+        mLastWSpec = widthMeasureSpec;
+        mLastHSpec = heightMeasureSpec;
+    }
+
+    /**
+     * Ellipsize just the last line of text in this view and set the text to the
+     * new ellipsized value.
+     * @param text Text to set and ellipsize
+     * @param avail available width in pixels for the last line
+     * @param paint Paint that has the proper properties set to measure the text
+     *            for this view
+     */
+    public void setText(final CharSequence text, int avail) {
+        if (text == null || text.length() == 0) {
+            return;
+        }
+
+        setEllipsize(null);
+        setText(text, TextView.BufferType.SPANNABLE);
+
+        if (avail == ALL_AVAILABLE) {
+            return;
+        }
+        Layout layout = getLayout();
+
+        if (layout == null) {
+            measure(mLastWSpec, mLastHSpec);
+            layout = getLayout();
+        }
+
+        if (layout == null) {
+            // Bail
+            return;
+        }
+
+        CharSequence remainder;
+        SpannableStringBuilder builder = new SpannableStringBuilder();
+        int lineCount = layout.getLineCount();
+        if (lineCount <= mMaxLines) {
+            remainder = null;
+        } else {
+            remainder = TextUtils.ellipsize(
+                    text.subSequence(layout.getLineStart(mMaxLines - 1), text.length()),
+                    getPaint(), avail, TextUtils.TruncateAt.END);
+        }
+
+        builder.append(text, 0, layout.getLineStart(mMaxLines - 1));
+        if (!TextUtils.isEmpty(remainder) && remainder.length() > 1) {
+            builder.append(remainder, 0, remainder.length() - 1);
+        }
+        setText(builder, TextView.BufferType.SPANNABLE);
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/mail/widget/WidgetConversationViewBuilder.java b/src/com/android/mail/widget/WidgetConversationViewBuilder.java
index a3e25b7..6c30570 100644
--- a/src/com/android/mail/widget/WidgetConversationViewBuilder.java
+++ b/src/com/android/mail/widget/WidgetConversationViewBuilder.java
@@ -158,8 +158,8 @@
 
         // Add style to subject
         int subjectColor = isUnread ? SUBJECT_TEXT_COLOR_UNREAD : SUBJECT_TEXT_COLOR_READ;
-        SpannableStringBuilder subjectAndSnippet = Conversation.getSubjectAndSnippetForDisplay(
-                mContext, filteredSubject, snippet, -1, null);
+        SpannableStringBuilder subjectAndSnippet = new SpannableStringBuilder(
+                Conversation.getSubjectAndSnippetForDisplay(mContext, filteredSubject, snippet));
         if (isUnread) {
             subjectAndSnippet.setSpan(new StyleSpan(Typeface.BOLD), 0, filteredSubject.length(),
                     Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
